summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorMicah Lee <micah@micahflee.com>2020-10-12 22:40:55 -0700
committerMicah Lee <micah@micahflee.com>2020-10-12 22:40:55 -0700
commitf4abcf1be9122a28005dc3e0949bf5952192e982 (patch)
tree0c6fdb71401ac294403fe87730ef6a73b0d7498a /desktop
parentb81a55f546ffaf00586e43cdc279b967da096e4f (diff)
downloadonionshare-f4abcf1be9122a28005dc3e0949bf5952192e982.tar.gz
onionshare-f4abcf1be9122a28005dc3e0949bf5952192e982.zip
Add onionshare CLI to cli folder, move GUI to desktop folder, and start refactoring it to work with briefcase
Diffstat (limited to 'desktop')
-rw-r--r--desktop/BUILD.md437
-rw-r--r--desktop/CHANGELOG.md233
-rw-r--r--desktop/LICENSE679
-rw-r--r--desktop/MANIFEST.in13
-rw-r--r--desktop/apparmor/abstractions/onionshare29
-rw-r--r--desktop/apparmor/local/usr.bin.onionshare2
-rw-r--r--desktop/apparmor/local/usr.bin.onionshare-gui2
-rw-r--r--desktop/apparmor/usr.bin.onionshare10
-rw-r--r--desktop/apparmor/usr.bin.onionshare-gui28
-rwxr-xr-xdesktop/dev_scripts/onionshare30
-rwxr-xr-xdesktop/dev_scripts/onionshare-gui30
-rw-r--r--desktop/docs/Makefile20
-rw-r--r--desktop/docs/README.md38
-rwxr-xr-xdesktop/docs/build.sh34
-rw-r--r--desktop/docs/gettext/.doctrees/advanced.doctreebin0 -> 29050 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/develop.doctreebin0 -> 41566 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/environment.picklebin0 -> 38898 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/features.doctreebin0 -> 43702 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/help.doctreebin0 -> 8171 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/index.doctreebin0 -> 3439 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/install.doctreebin0 -> 20103 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/security.doctreebin0 -> 15257 bytes
-rw-r--r--desktop/docs/gettext/.doctrees/tor.doctreebin0 -> 28661 bytes
-rw-r--r--desktop/docs/gettext/advanced.pot153
-rw-r--r--desktop/docs/gettext/develop.pot177
-rw-r--r--desktop/docs/gettext/features.pot226
-rw-r--r--desktop/docs/gettext/help.pot57
-rw-r--r--desktop/docs/gettext/index.pot25
-rw-r--r--desktop/docs/gettext/install.pot101
-rw-r--r--desktop/docs/gettext/security.pot61
-rw-r--r--desktop/docs/gettext/sphinx.pot25
-rw-r--r--desktop/docs/gettext/tor.pot137
-rw-r--r--desktop/docs/make.bat35
-rw-r--r--desktop/docs/poetry.lock464
-rw-r--r--desktop/docs/pyproject.toml17
-rw-r--r--desktop/docs/source/_static/apple-logo.pngbin0 -> 6620 bytes
-rw-r--r--desktop/docs/source/_static/custom.css21
-rw-r--r--desktop/docs/source/_static/favicon.icobin0 -> 4286 bytes
-rw-r--r--desktop/docs/source/_static/linux-logo.pngbin0 -> 10237 bytes
-rw-r--r--desktop/docs/source/_static/logo.pngbin0 -> 18375 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/advanced-save-tabs.pngbin0 -> 18667 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/advanced-schedule-start-timer.pngbin0 -> 47799 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/advanced-schedule-stop-timer.pngbin0 -> 114019 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/chat-sharing.pngbin0 -> 60339 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/chat-torbrowser.pngbin0 -> 48464 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/chat.pngbin0 -> 54235 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/receive-sharing.pngbin0 -> 84635 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/receive-torbrowser.pngbin0 -> 56883 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/receive.pngbin0 -> 84892 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/settings.pngbin0 -> 55802 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/share-files.pngbin0 -> 48917 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/share-sharing.pngbin0 -> 48161 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/share-torbrowser.pngbin0 -> 42133 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/share.pngbin0 -> 43822 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/tabs.pngbin0 -> 61545 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/website-files.pngbin0 -> 66994 bytes
-rw-r--r--desktop/docs/source/_static/screenshots/website.pngbin0 -> 46330 bytes
-rw-r--r--desktop/docs/source/_static/windows-logo.pngbin0 -> 5187 bytes
-rw-r--r--desktop/docs/source/_templates/versions.html25
-rw-r--r--desktop/docs/source/advanced.rst148
-rw-r--r--desktop/docs/source/conf.py34
-rw-r--r--desktop/docs/source/develop.rst200
-rw-r--r--desktop/docs/source/features.rst144
-rw-r--r--desktop/docs/source/help.rst24
-rw-r--r--desktop/docs/source/index.rst17
-rw-r--r--desktop/docs/source/install.rst66
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/ar/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/ca/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/da/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/de/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/el/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/en/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/advanced.po304
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/develop.po325
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/features.po399
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/help.po75
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/index.po30
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/install.po144
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/security.po116
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/es/LC_MESSAGES/tor.po291
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/fa/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/advanced.po228
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/develop.po257
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/features.po226
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/help.po57
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/index.po25
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/install.po101
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/security.po61
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/sphinx.po25
-rw-r--r--desktop/docs/source/locale/fr/LC_MESSAGES/tor.po217
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/ga/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/is/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/it/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/ja/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/advanced.po228
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/develop.po257
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/features.po226
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/help.po57
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/index.po25
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/install.po101
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/security.po61
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/sphinx.po25
-rw-r--r--desktop/docs/source/locale/nb_NO/LC_MESSAGES/tor.po235
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/nl/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/pl/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/pt_BR/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/pt_PT/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/ro/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/ru/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/sr@latin/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/sv/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/te/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/tr/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/advanced.po298
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/develop.po328
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/features.po389
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/help.po73
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/index.po31
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/install.po144
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/security.po118
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/sphinx.po28
-rw-r--r--desktop/docs/source/locale/uk/LC_MESSAGES/tor.po292
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/zh_CN/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/advanced.po227
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/develop.po256
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/features.po382
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/help.po72
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/index.po29
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/install.po143
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/security.po114
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/sphinx.po27
-rw-r--r--desktop/docs/source/locale/zh_TW/LC_MESSAGES/tor.po216
-rw-r--r--desktop/docs/source/security.rst24
-rw-r--r--desktop/docs/source/tor.rst93
-rw-r--r--desktop/git-hooks/README.md3
-rwxr-xr-xdesktop/git-hooks/pre-push4
-rwxr-xr-xdesktop/install/build_deb.sh25
-rw-r--r--desktop/install/build_exe.bat17
-rwxr-xr-xdesktop/install/build_osx.sh57
-rwxr-xr-xdesktop/install/build_rpm.sh17
-rwxr-xr-xdesktop/install/build_source.sh81
-rwxr-xr-xdesktop/install/check_lacked_trans.py155
-rw-r--r--desktop/install/get-tor-osx.py126
-rw-r--r--desktop/install/get-tor-windows.py104
-rw-r--r--desktop/install/licenses/license-jquery.txt20
-rw-r--r--desktop/install/licenses/license-obfs4.txt55
-rw-r--r--desktop/install/licenses/license-onionshare.txt676
-rw-r--r--desktop/install/licenses/license-tor.txt381
-rw-r--r--desktop/install/licenses/readme.txt1
-rw-r--r--desktop/install/macos_sandbox/child.plist10
-rw-r--r--desktop/install/macos_sandbox/parent.plist43
-rw-r--r--desktop/install/onionshare.icnsbin0 -> 34168 bytes
-rw-r--r--desktop/install/onionshare.icobin0 -> 15086 bytes
-rw-r--r--desktop/install/onionshare.nsi111
-rw-r--r--desktop/install/onionshare80.xpm257
-rw-r--r--desktop/install/org.onionshare.OnionShare.appdata.xml29
-rw-r--r--desktop/install/org.onionshare.OnionShare.desktop18
-rw-r--r--desktop/install/org.onionshare.OnionShare.pngbin0 -> 24613 bytes
-rw-r--r--desktop/install/org.onionshare.OnionShare.svg2154
-rwxr-xr-xdesktop/install/ppa_release.sh18
-rw-r--r--desktop/install/pyinstaller.spec116
-rwxr-xr-xdesktop/install/scripts/onionshare23
-rwxr-xr-xdesktop/install/scripts/onionshare-gui23
-rw-r--r--desktop/install/scripts/onionshare-nautilus.py105
-rw-r--r--desktop/install/scripts/onionshare-pyinstaller47
-rw-r--r--desktop/onionshare/__init__.py514
-rw-r--r--desktop/onionshare/common.py336
-rw-r--r--desktop/onionshare/mode_settings.py146
-rw-r--r--desktop/onionshare/onion.py775
-rw-r--r--desktop/onionshare/onionshare.py111
-rw-r--r--desktop/onionshare/settings.py199
-rw-r--r--desktop/onionshare/strings.py61
-rw-r--r--desktop/onionshare/web/__init__.py21
-rw-r--r--desktop/onionshare/web/chat_mode.py159
-rw-r--r--desktop/onionshare/web/receive_mode.py492
-rw-r--r--desktop/onionshare/web/send_base_mode.py323
-rw-r--r--desktop/onionshare/web/share_mode.py412
-rw-r--r--desktop/onionshare/web/web.py426
-rw-r--r--desktop/onionshare/web/website_mode.py124
-rw-r--r--desktop/onionshare_gui/__init__.py192
-rw-r--r--desktop/onionshare_gui/gui_common.py329
-rw-r--r--desktop/onionshare_gui/main_window.py289
-rw-r--r--desktop/onionshare_gui/settings_dialog.py1056
-rw-r--r--desktop/onionshare_gui/tab/__init__.py21
-rw-r--r--desktop/onionshare_gui/tab/mode/__init__.py494
-rw-r--r--desktop/onionshare_gui/tab/mode/chat_mode/__init__.py153
-rw-r--r--desktop/onionshare_gui/tab/mode/file_selection.py496
-rw-r--r--desktop/onionshare_gui/tab/mode/history.py807
-rw-r--r--desktop/onionshare_gui/tab/mode/mode_settings_widget.py296
-rw-r--r--desktop/onionshare_gui/tab/mode/receive_mode/__init__.py323
-rw-r--r--desktop/onionshare_gui/tab/mode/share_mode/__init__.py470
-rw-r--r--desktop/onionshare_gui/tab/mode/share_mode/threads.py65
-rw-r--r--desktop/onionshare_gui/tab/mode/website_mode/__init__.py330
-rw-r--r--desktop/onionshare_gui/tab/server_status.py466
-rw-r--r--desktop/onionshare_gui/tab/tab.py661
-rw-r--r--desktop/onionshare_gui/tab_widget.py267
-rw-r--r--desktop/onionshare_gui/threads.py253
-rw-r--r--desktop/onionshare_gui/tor_connection_dialog.py168
-rw-r--r--desktop/onionshare_gui/update_checker.py234
-rw-r--r--desktop/onionshare_gui/widgets.py156
-rw-r--r--desktop/pyproject.toml51
-rw-r--r--desktop/screenshots/appdata-onionshare-receive-client.pngbin0 -> 361337 bytes
-rw-r--r--desktop/screenshots/appdata-onionshare-receive-server.pngbin0 -> 340924 bytes
-rw-r--r--desktop/screenshots/appdata-onionshare-share-client.pngbin0 -> 372511 bytes
-rw-r--r--desktop/screenshots/appdata-onionshare-share-server.pngbin0 -> 526914 bytes
-rw-r--r--desktop/screenshots/onionshare-receive-client.pngbin0 -> 589481 bytes
-rw-r--r--desktop/screenshots/onionshare-receive-server.pngbin0 -> 569260 bytes
-rw-r--r--desktop/screenshots/onionshare-share-client.pngbin0 -> 43404 bytes
-rw-r--r--desktop/screenshots/onionshare-share-server.pngbin0 -> 57758 bytes
-rw-r--r--desktop/screenshots/onionshare-website-server.pngbin0 -> 148709 bytes
-rw-r--r--desktop/setup.cfg2
-rw-r--r--desktop/setup.py98
-rw-r--r--desktop/share/images/close_tab.pngbin0 -> 688 bytes
-rw-r--r--desktop/share/images/file_delete.pngbin0 -> 182 bytes
-rw-r--r--desktop/share/images/history_completed.pngbin0 -> 646 bytes
-rw-r--r--desktop/share/images/history_completed_none.pngbin0 -> 437 bytes
-rw-r--r--desktop/share/images/history_in_progress.pngbin0 -> 638 bytes
-rw-r--r--desktop/share/images/history_in_progress_none.pngbin0 -> 412 bytes
-rw-r--r--desktop/share/images/history_requests.pngbin0 -> 738 bytes
-rw-r--r--desktop/share/images/history_requests_none.pngbin0 -> 754 bytes
-rw-r--r--desktop/share/images/info.pngbin0 -> 435 bytes
-rw-r--r--desktop/share/images/logo.pngbin0 -> 3824 bytes
-rw-r--r--desktop/share/images/logo_grayscale.pngbin0 -> 2258 bytes
-rw-r--r--desktop/share/images/logo_text.pngbin0 -> 3798 bytes
-rw-r--r--desktop/share/images/logo_transparent.pngbin0 -> 3740 bytes
-rw-r--r--desktop/share/images/mode_chat.pngbin0 -> 27306 bytes
-rw-r--r--desktop/share/images/mode_chat.svg81
-rw-r--r--desktop/share/images/mode_new_tab_chat.pngbin0 -> 5213 bytes
-rw-r--r--desktop/share/images/mode_new_tab_receive.pngbin0 -> 6470 bytes
-rw-r--r--desktop/share/images/mode_new_tab_share.pngbin0 -> 4485 bytes
-rw-r--r--desktop/share/images/mode_new_tab_website.pngbin0 -> 3860 bytes
-rw-r--r--desktop/share/images/mode_receive.pngbin0 -> 37288 bytes
-rw-r--r--desktop/share/images/mode_receive.svg74
-rw-r--r--desktop/share/images/mode_share.pngbin0 -> 9472 bytes
-rw-r--r--desktop/share/images/mode_share.svg63
-rw-r--r--desktop/share/images/mode_website.pngbin0 -> 8126 bytes
-rw-r--r--desktop/share/images/mode_website.svg35
-rw-r--r--desktop/share/images/open_folder.pngbin0 -> 221 bytes
-rw-r--r--desktop/share/images/persistent_enabled.pngbin0 -> 3398 bytes
-rw-r--r--desktop/share/images/receive_icon_toggle.pngbin0 -> 380 bytes
-rw-r--r--desktop/share/images/receive_icon_toggle_selected.pngbin0 -> 468 bytes
-rw-r--r--desktop/share/images/receive_icon_transparent.pngbin0 -> 2138 bytes
-rw-r--r--desktop/share/images/server_started.pngbin0 -> 347 bytes
-rw-r--r--desktop/share/images/server_stopped.pngbin0 -> 342 bytes
-rw-r--r--desktop/share/images/server_working.pngbin0 -> 349 bytes
-rw-r--r--desktop/share/images/settings.pngbin0 -> 1157 bytes
-rw-r--r--desktop/share/images/share_icon_toggle.pngbin0 -> 389 bytes
-rw-r--r--desktop/share/images/share_icon_toggle_selected.pngbin0 -> 473 bytes
-rw-r--r--desktop/share/images/share_icon_transparent.pngbin0 -> 2096 bytes
-rw-r--r--desktop/share/locale/af.json183
-rw-r--r--desktop/share/locale/am.json185
-rw-r--r--desktop/share/locale/ar.json237
-rw-r--r--desktop/share/locale/bg.json185
-rw-r--r--desktop/share/locale/bn.json267
-rw-r--r--desktop/share/locale/ca.json276
-rw-r--r--desktop/share/locale/cs.json112
-rw-r--r--desktop/share/locale/da.json291
-rw-r--r--desktop/share/locale/de.json287
-rw-r--r--desktop/share/locale/el.json238
-rw-r--r--desktop/share/locale/en.json191
-rw-r--r--desktop/share/locale/eo.json63
-rw-r--r--desktop/share/locale/es.json299
-rw-r--r--desktop/share/locale/fa.json239
-rw-r--r--desktop/share/locale/fi.json236
-rw-r--r--desktop/share/locale/fr.json294
-rw-r--r--desktop/share/locale/ga.json227
-rw-r--r--desktop/share/locale/gu.json188
-rw-r--r--desktop/share/locale/he.json191
-rw-r--r--desktop/share/locale/hi.json190
-rw-r--r--desktop/share/locale/hr.json232
-rw-r--r--desktop/share/locale/hu.json196
-rw-r--r--desktop/share/locale/id.json192
-rw-r--r--desktop/share/locale/is.json287
-rw-r--r--desktop/share/locale/it.json237
-rw-r--r--desktop/share/locale/ja.json237
-rw-r--r--desktop/share/locale/ka.json187
-rw-r--r--desktop/share/locale/km.json175
-rw-r--r--desktop/share/locale/ko.json185
-rw-r--r--desktop/share/locale/lg.json185
-rw-r--r--desktop/share/locale/lt.json208
-rw-r--r--desktop/share/locale/mk.json185
-rw-r--r--desktop/share/locale/ms.json184
-rw-r--r--desktop/share/locale/nb_NO.json295
-rw-r--r--desktop/share/locale/nl.json259
-rw-r--r--desktop/share/locale/pa.json185
-rw-r--r--desktop/share/locale/pl.json237
-rw-r--r--desktop/share/locale/pt_BR.json268
-rw-r--r--desktop/share/locale/pt_PT.json254
-rw-r--r--desktop/share/locale/ro.json236
-rw-r--r--desktop/share/locale/ru.json237
-rw-r--r--desktop/share/locale/sl.json193
-rw-r--r--desktop/share/locale/sn.json188
-rw-r--r--desktop/share/locale/sr_Latn.json183
-rw-r--r--desktop/share/locale/sv.json275
-rw-r--r--desktop/share/locale/sw.json175
-rw-r--r--desktop/share/locale/te.json175
-rw-r--r--desktop/share/locale/tr.json257
-rw-r--r--desktop/share/locale/uk.json232
-rw-r--r--desktop/share/locale/wo.json185
-rw-r--r--desktop/share/locale/yo.json185
-rw-r--r--desktop/share/locale/zh_Hans.json273
-rw-r--r--desktop/share/locale/zh_Hant.json253
-rw-r--r--desktop/share/static/css/style.css393
-rw-r--r--desktop/share/static/img/ajax.gifbin0 -> 847 bytes
-rw-r--r--desktop/share/static/img/favicon.icobin0 -> 4286 bytes
-rw-r--r--desktop/share/static/img/logo.pngbin0 -> 3824 bytes
-rw-r--r--desktop/share/static/img/logo_large.pngbin0 -> 9663 bytes
-rw-r--r--desktop/share/static/img/web_file.pngbin0 -> 251 bytes
-rw-r--r--desktop/share/static/img/web_folder.pngbin0 -> 338 bytes
-rw-r--r--desktop/share/static/js/chat.js165
-rw-r--r--desktop/share/static/js/jquery-3.5.1.min.js2
-rw-r--r--desktop/share/static/js/receive.js130
-rw-r--r--desktop/share/static/js/send.js75
-rw-r--r--desktop/share/static/js/socket.io.min.js3
-rw-r--r--desktop/share/templates/401.html21
-rw-r--r--desktop/share/templates/403.html21
-rw-r--r--desktop/share/templates/404.html21
-rw-r--r--desktop/share/templates/405.html21
-rw-r--r--desktop/share/templates/chat.html46
-rw-r--r--desktop/share/templates/denied.html15
-rw-r--r--desktop/share/templates/listing.html55
-rw-r--r--desktop/share/templates/receive.html46
-rw-r--r--desktop/share/templates/send.html69
-rw-r--r--desktop/share/templates/thankyou.html27
-rw-r--r--desktop/share/torrc_template8
-rw-r--r--desktop/share/torrc_template-meek_lite_amazon2
-rw-r--r--desktop/share/torrc_template-meek_lite_azure2
-rw-r--r--desktop/share/torrc_template-obfs427
-rw-r--r--desktop/share/version.txt1
-rw-r--r--desktop/share/wordlist.txt7776
-rw-r--r--desktop/src/onionshare/__init__.py0
-rw-r--r--desktop/src/onionshare/resources/__init__.py0
-rw-r--r--desktop/src/onionshare/resources/onionshare.icnsbin0 -> 34168 bytes
-rw-r--r--desktop/src/onionshare/resources/onionshare.icobin0 -> 15086 bytes
-rw-r--r--desktop/src/onionshare/resources/onionshare.pngbin0 -> 24613 bytes
-rw-r--r--desktop/stdeb.cfg6
-rw-r--r--desktop/tests/__init__.py0
-rw-r--r--desktop/tests/conftest.py209
-rw-r--r--desktop/tests/gui_base_test.py467
-rw-r--r--desktop/tests/pytest.ini4
-rw-r--r--desktop/tests/run.bat9
-rwxr-xr-xdesktop/tests/run.sh26
-rw-r--r--desktop/tests/test_cli.py56
-rw-r--r--desktop/tests/test_cli_common.py275
-rw-r--r--desktop/tests/test_cli_settings.py149
-rw-r--r--desktop/tests/test_cli_strings.py46
-rw-r--r--desktop/tests/test_cli_web.py233
-rw-r--r--desktop/tests/test_gui_receive.py252
-rw-r--r--desktop/tests/test_gui_share.py629
-rw-r--r--desktop/tests/test_gui_tabs.py236
-rw-r--r--desktop/tests/test_gui_website.py107
528 files changed, 83350 insertions, 0 deletions
diff --git a/desktop/BUILD.md b/desktop/BUILD.md
new file mode 100644
index 00000000..b261f540
--- /dev/null
+++ b/desktop/BUILD.md
@@ -0,0 +1,437 @@
+# Index
+* [Building OnionShare](#building-onionshare)
+ * [Linux](#linux)
+ * [Use newest software](#use-newest-software)
+ * [Use package managers](#use-package-managers)
+ * [macOS](#macos)
+ * [Windows](#windows)
+ * [Setting up your dev environment](#setting-up-your-dev-environment)
+ * [To make a .exe](#to-make-a-exe)
+ * [To build the installer](#to-build-the-installer)
+* [Running tests](#running-tests)
+* [Documentation]
+* [Making releases](#making-releases)
+ * [Changelog, version, and signed git tag](#changelog-version-and-signed-git-tag)
+ * [Linux release](#linux-release)
+ * [macOS release](#macos-release)
+ * [Windows release](#windows-release)
+ * [Source package](#source-package)
+ * [Publishing the release](#publishing-the-release)
+
+# Building OnionShare
+
+Start by getting the source code:
+
+```sh
+git clone https://github.com/micahflee/onionshare.git
+cd onionshare
+```
+
+## Linux
+
+OnionShare uses [Briefcase](https://briefcase.readthedocs.io/en/latest/).
+
+Install Briefcase dependencies from your package repositories by following [these instructions](https://docs.beeware.org/en/latest/tutorial/tutorial-0.html#install-dependencies).
+
+Now create and/or activate a virtual environment.
+
+```
+python3 -m venv venv
+. venv/bin/activate
+```
+
+While your virtual environment is active, install briefcase from pip.
+
+```
+pip install briefcase
+```
+
+
+
+### Use newest software
+
+The recommended way to develop OnionShare is to use the latest versions of all dependencies.
+
+First, install `tor` and `obfs4proxy` from either the [official Debian repository](https://support.torproject.org/apt/tor-deb-repo/), or from your package manager.
+
+Then download Qt 5.14.0 for Linux:
+
+```sh
+cd ~/Downloads
+wget https://download.qt.io/official_releases/qt/5.14/5.14.0/qt-opensource-linux-x64-5.14.0.run
+```
+
+If you'd like to check to make sure you have the exact installer I have, here is the sha256 checksum:
+
+```sh
+sha256sum qt-opensource-linux-x64-5.14.0.run
+4379f147c6793ec7e7349d2f9ee7d53b8ab6ea4e4edf8ee0574a75586a6a6e0e qt-opensource-linux-x64-5.14.0.run
+```
+
+Then make it executable and install Qt:
+
+```sh
+chmod +x qt-opensource-linux-x64-5.14.0.run
+./qt-opensource-linux-x64-5.14.0.run
+```
+
+You have to create a Qt account and login to install Qt. Choose the default installation folder in your home directory. The only component you need is `Qt 5.14.0` > `Desktop gcc 64-bit`.
+
+Install [poetry](https://python-poetry.org/docs/) from your package manager, or by doing `pip install --user poetry`. Then install dependencies:
+
+```sh
+poetry install
+```
+
+You can run the CLI and the GUI versions of OnionShare like this:
+
+```sh
+poetry run ./dev_scripts/onionshare
+poetry run ./dev_scripts/onionshare-gui
+```
+
+### Use package managers
+
+Alternatively, you can install dependencies from package managers.
+
+Install the needed dependencies:
+
+**For Debian-like distros:**
+
+```
+apt install -y python3-flask python3-stem python3-pyqt5 python3-crypto python3-socks python3-nautilus tor obfs4proxy python3-pytest python3-pytestqt build-essential fakeroot python3-all python3-stdeb dh-python python3-flask-httpauth python3-distutils python3-psutil python3-socketio python3-flask-socketio python3-qrcode
+```
+
+**For Fedora-like distros:**
+
+```
+dnf install -y python3-flask python3-flask-httpauth python3-stem python3-qt5 python3-crypto python3-pysocks nautilus-python tor obfs4 python3-pytest rpm-build python3-psutil python3-socketio python3-flask-socketio python3-qrcode
+```
+
+After that you can try both the CLI and the GUI version of OnionShare:
+
+```sh
+./dev_scripts/onionshare
+./dev_scripts/onionshare-gui
+```
+
+You can also build OnionShare packages to install:
+
+Create a .deb on Debian-like distros: `./install/build_deb.sh`
+
+Create a .rpm on Fedora-like distros: `./install/build_rpm.sh`
+
+For openSUSE: There are instructions for building [in the wiki](https://github.com/micahflee/onionshare/wiki/Linux-Distribution-Support#opensuse-leap-150).
+
+For ArchLinux: There is a PKBUILD available [here](https://www.archlinux.org/packages/community/any/onionshare/) that can be used to install OnionShare.
+
+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.
+
+## 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.)
+
+Download and install Python 3.7.4 from https://www.python.org/downloads/release/python-374/. I downloaded `python-3.7.4-macosx10.9.pkg`.
+
+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.14.0 for macOS from https://www.qt.io/offline-installers. I downloaded `qt-opensource-mac-x64-5.14.0.dmg`. In the installer, you can skip making an account, and all you need is `Qt` > `Qt 5.14.0` > `macOS`.
+
+If you don't have it already, install poetry (`pip3 install --user poetry`). Then install dependencies:
+
+```sh
+poetry install
+```
+
+#### You can run both the CLI and GUI versions of OnionShare without building an bundle
+
+```sh
+poetry run ./dev_scripts/onionshare
+poetry run ./dev_scripts/onionshare-gui
+```
+
+#### To build the app bundle
+
+```sh
+install/build_osx.sh
+```
+
+Now you should have `dist/OnionShare.app`.
+
+#### To codesign and build a DMG for distribution
+
+If you want to build for distribution, you'll need a codesigning certificate, and you'll also need to have [create-dmg](https://github.com/sindresorhus/create-dmg) installed:
+
+```sh
+npm install --global create-dmg
+brew install graphicsmagick imagemagick
+```
+
+And then run:
+
+```sh
+install/build_osx.sh --release
+```
+
+Now you should have `dist/OnionShare $VERSION.dmg`.
+
+## Windows
+
+### Setting up your dev environment
+
+These instructions include adding folders to the path in Windows. To do this, go to Start and type "advanced system settings", and open "View advanced system settings" in the Control Panel. Click Environment Variables. Under "System variables" double-click on Path. From there you can add and remove folders that are available in the PATH.
+
+Download Python 3.7.4, 32-bit (x86) from https://www.python.org/downloads/release/python-374/. I downloaded `python-3.7.4.exe`. When installing it, make sure to check the "Add Python 3.7 to PATH" checkbox on the first page of the installer.
+
+Install the Qt 5.14.0 from https://www.qt.io/offline-installers. I downloaded `qt-opensource-windows-x86-5.14.0.exe`. In the installer, you can skip making an account, and all you need `Qt` > `Qt 5.14.0` > `MSVC 2017 32-bit`.
+
+Install [poetry](https://python-poetry.org/). Open PowerShell, and run:
+
+```
+(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python
+```
+
+Then open a Command Prompt and cd to the `onionshare` folder, and install the poetry dependencies:
+
+```
+poetry install
+```
+
+After that you can try both the CLI and the GUI version of OnionShare:
+
+```
+poetry run python dev_scripts\onionshare
+poetry run python dev_scripts\onionshare-gui
+```
+
+#### If you want to build a .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://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk). Note that you may not need this if you already have Visual Studio.
+
+Add the following directories (you might want to make sure these are exact on your computer) to the path:
+
+* `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:\Program Files (x86)\7-Zip`
+
+And also for PyQt5, but replace `onionshare-i_zmdpLh-py3.7` with the name of your poetry virtual environment. You can find that by running `poetry env list`.
+
+* `C:\Users\user\AppData\Local\pypoetry\Cache\virtualenvs\onionshare-i_zmdpLh-py3.7\Lib\site-packages\PyQt5\Qt\bin`
+
+#### If you want the .exe to not get falsely flagged as malicious by anti-virus software
+
+OnionShare uses PyInstaller to turn the python source code into Windows executable `.exe` file. Apparently, malware developers also use PyInstaller, and some anti-virus vendors have included snippets of PyInstaller code in their virus definitions. To avoid this, you have to compile the Windows PyInstaller bootloader yourself instead of using the pre-compiled one that comes with PyInstaller.
+
+(If you don't care about this, you can install PyInstaller with `pip install PyInstaller==4.0`.)
+
+Here's how to compile the PyInstaller bootloader:
+
+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__1285639570.1568593053.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:
+
+```
+cd "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build"
+vcvars32.bat
+```
+
+Change to a folder where you keep source code, and clone the PyInstaller git repo and checkout the `v4.0` tag:
+
+```
+git clone https://github.com/pyinstaller/pyinstaller.git
+cd pyinstaller
+git checkout v4.0
+```
+
+The next step is to compile the bootloader. We should do this all in dangerzone's poetry shell:
+
+```
+cd onionshare
+poetry shell
+cd ..\pyinstaller
+```
+
+And compile the bootloader, following [these instructions](https://pythonhosted.org/PyInstaller/bootloader-building.html). To compile, run this:
+
+```
+cd bootloader
+python waf distclean all --target-arch=32bit --msvc_targets=x86
+```
+
+Finally, install the PyInstaller module into your poetry environment:
+
+```
+cd ..
+python setup.py install
+exit
+```
+
+Now the next time you use PyInstaller to build OnionShare, the `.exe` file should not be flagged as malicious by anti-virus.
+
+#### If you want to build the installer
+
+* Go to http://nsis.sourceforge.net/Download and download the latest NSIS. I downloaded `nsis-3.06.1-setup.exe`.
+* Add `C:\Program Files (x86)\NSIS` to the path.
+
+#### If you want to sign binaries with Authenticode
+
+* You'll need a code signing certificate. I got an open source code signing certificate from [Certum](https://www.certum.eu/certum/cert,offer_en_open_source_cs.xml).
+* Once you get a code signing key and certificate and covert it to a pfx file, import it into your certificate store.
+
+### To make a .exe:
+
+* Open a command prompt, cd into the onionshare directory, and type: `pyinstaller install\pyinstaller.spec`. `onionshare-gui.exe` and all of their supporting files will get created inside the `dist` folder.
+
+### To build the installer:
+
+Note that you must have a codesigning certificate installed in order to use the `install\build_exe.bat` script, because it codesigns `onionshare-gui.exe`, `uninstall.exe`, and `onionshare-setup.exe`.
+
+Open a command prompt, cd to the onionshare directory, and type: `install\build_exe.bat`
+
+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`.
+
+# Running tests
+
+## Tests in macOS and Linux
+
+OnionShare includes PyTest unit tests. To run tests, you can run `pytest` against the `tests/` directory.
+
+```sh
+poetry run ./tests/run.sh
+```
+
+You can run GUI tests like this:
+
+```sh
+poetry run ./tests/run.sh --rungui
+```
+
+If you're using Linux, you can also choose to wrap the tests in `xvfb-run` so that a ton of OnionShare windows don't pop up on your desktop (you may need to install the `xorg-x11-server-Xvfb` package), like this:
+
+```sh
+xvfb-run poetry run ./tests/run.sh --rungui
+```
+
+## Tests in Windows
+
+You can run this Windows batch script to run all of the CLI and GUI tests.
+
+```
+poetry run tests\run.bat
+```
+
+# Documentation
+
+To edit and build the documentation, see the [docs readme](/docs/README.md).
+
+# 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, docs, and signed git tag
+
+Before making a release, you must update the version in these places:
+
+* `share/version.txt` should have the correct version
+* `pyproject.toml` should have the correct version
+* `docs/source/conf.py` should have the correct version
+* `install/org.onionshare.OnionShare.appdata.xml` should have the correct version
+* `install/onionshare.nsi` should have the correct version, for the Windows installer
+
+In addition to that, you must:
+
+* `install/org.onionshare.OnionShare.appdata.xml` should have the correct release date, and links to correct screenshots
+* `CHANGELOG.md` should be updated to include a list of all major changes since the last release
+* Update all of the documentation to cover new features, including taking new screenshots if necessary
+* 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
+
+- Build machine should be running macOS 10.13.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 `poetry install && poetry run ./install/build_osx.sh --release`; this will make a codesigned installer package called `dist/OnionShare $VERSION.dmg`
+- Notarize it: `xcrun altool --notarize-app --primary-bundle-id "com.micahflee.onionshare" -u "micah@micahflee.com" -p "$APPLEIDPW" --file "OnionShare $VERSION.dmg"`
+- Wait for it to get approved, check status with: `xcrun altool --notarization-history 0 -u "micah@micahflee.com" -p "$APPLEIDPW"`
+- After it's approved, staple the ticket: `xcrun stapler staple "OnionShare $VERSION.dmg"`
+- PGP-sign the final, notarized and stapled, `gpg -a --detach-sign "OnionShare $VERSION.dmg"`
+
+This process ends up with two final files:
+
+```
+OnionShare $VERSION.dmg
+OnionShare $VERSION.dmg.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/
+- Copy the six release files into the OnionShare team Keybase filesystem
+- 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
+- Make a PR to [homebrew-cask](https://github.com/homebrew/homebrew-cask) to update the macOS version
diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md
new file mode 100644
index 00000000..272f8efc
--- /dev/null
+++ b/desktop/CHANGELOG.md
@@ -0,0 +1,233 @@
+# OnionShare Changelog
+
+## 2.3
+
+* Major new feature: Multiple tabs, including better support for persistent services, faster Tor connections
+* New feature: Chat anonymously mode
+* New feature: All new design
+* New feature: Ability to display QR codes of OnionShare addresses
+* New feature: Web apps have responsive design and look better on mobile
+* New feature: Flatpak packaging for Linux
+* Several bug fixes
+
+## 2.2
+
+* New feature: Website mode, which allows publishing a static HTML website as an onion service
+* Allow individual files to be viewed or downloaded in Share mode, including the ability to browse into subdirectories and use breadcrumbs to navigate back
+* Show a counter when individual files or pages are viewed
+* Better History items including colors and status codes to differentiate between successful and failed requests
+* Swap out the random /slug suffix for HTTP basic authentication (when in non-public mode)
+* Hide the Tor connection settings if the ONIONSHARE_HIDE_TOR_SETTINGS environment variable is set (Tails compatibility)
+* Remove the NoScript XSS warning in Receive Mode now that the NoScript/Tor Browser bug is fixed. The ajax upload method still exists when javascript is enabled.
+* Better support for DragonFly BSD
+* Updated various dependencies, including Flask, Werkzeug, urllib3, requests, and PyQt5
+* Updated Tor to 0.4.1.5
+* Other minor bug fixes
+* New translations:
+ * Arabic (العربية)
+ * Dutch (Nederlands)
+ * Persian (فارسی)
+ * Romanian (Română)
+ * Serbian latin (Srpska (latinica))
+* Removed translations with fewer than 90% of strings translated:
+ * Finnish (Suomi)
+
+## 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 fixing third-party security issues in urllib3, Jinja2, and jQuery
+* Updated 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 with fewer than 90% of strings translated:
+ * Bengali (বাংলা)
+ * Persian (فارسی)
+
+## 2.0
+
+* New feature: Receiver mode allows you to receive files with OnionShare, instead of only sending files
+* New feature: Support for next generation onion services
+* New feature: macOS sandbox is enabled
+* New feature: Public mode feature, for public uses of OnionShare, which when enabled turns off slugs in the URL and removes the limit on how many 404 requests can be made
+* New feature: If you're sharing a single file, don't zip it up
+* New feature: Full support for meek_lite (Azure) bridges
+* New feature: Allow selecting your language from a dropdown
+* New translations: Bengali (বাংলা), Catalan (Català), Danish (Dansk), French (Français), Greek (Ελληνικά), Italian (Italiano), Japanese (日本語), Persian (فارسی), Portuguese Brazil (Português Brasil), Russian (Русский), Spanish (Español), Swedish (Svenska)
+* Several bugfixes
+* Invisible to users, this version includes some major refactoring of the codebase, and a robust set of unit tests which makes OnionShare easier to maintain going forward
+
+## 1.3.2
+
+* Bugfix: In debug mode, stop saving flask debug log in /tmp, where all users can access it
+
+## 1.3.1
+
+* Updated Tor to 0.2.3.10
+* Windows and Mac binaries are now distributed with licenses for Tor and obfs4
+
+## 1.3
+
+* Major UI redesign, introducing many UX improvements
+* Client-side web interfact redesigned
+* New feature: Support for meek_lite pluggable transports (Amazon and Azure) - not yet ready for Windows or macOS, sorry
+* New feature: Support for custom obfs4 and meek_lite bridges (again, meek_lite not available on Windows/macOS yet)
+* New feature: Ability to cancel share before it starts
+* Bugfix: The UpdateChecker no longer blocks the UI when checking
+* Bugfix: Simultaneous downloads (broken in 1.2)
+* Updated Tor to 0.2.3.9
+* Improved support for BSD
+* Updated French and Danish translations
+* Minor build script and build documentation fixes
+* Flake8 tests added
+
+## 1.2
+
+* New feature: Support for Tor bridges, including obfs4proxy
+* New feature: Ability to use a persistent URL
+* New feature: Auto-stop timer, to stop OnionShare at a specified time
+* New feature: Get notification when Tor connection dies
+* Updated versions of Python, Qt, Tor, and other dependencies that are bundled
+* Added ability to supply a custom settings file as a command line arg
+* Added support for FreeBSD
+* Fixed small user interface issues
+* Fixed minor bugs
+* New Dutch translations
+
+## 1.1
+
+* OnionShare connects to Tor itself now, so opening Tor Browser in the background isn't required
+* In Windows and macOS, OnionShare alerts users about updates
+* Removed the menu bar, and adding a "Settings" button
+* Added desktop notifications, and a system tray icon
+* Ability to add multiple files and folders with a single "Add" button
+* Ability to delete multiple files and folders at once with the "Delete" button
+* Hardened some response headers sent from the web server
+* Minor clarity improvements to the contents of the share's web page
+* Alert the user rather than share an empty archive if a file was unreadable
+* Prettier progress bars
+
+## 1.0
+
+* Fixed long-standing macOS X bug that caused OnionShare to crash on older Macs (!)
+* Added settings dialog to configure connecting to Tor, including support for system Tor
+* Added support for stealth onion services (advanced option)
+* Added support for Whonix
+* Improved AppArmor profiles
+* Added progress bar for zipping up files
+* Improved the look of download progress bars
+* Allows developers to launch OnionShare from source tree, without building a package
+* Deleted legacy code, and made OnionShare purely use ephemeral Tor onion services
+* Switched to EFF's diceware wordlist for slugs
+
+## 0.9.2 (Linux only)
+
+* Looks for `TOR_CONTROL_PORT` environment variable, to help Tails integration
+* Change how OnionShare checks to see if it's installed system-wide, to help Subgraph OS integration
+
+## 0.9.1
+
+* Added Nautilus extension, so you can right-click on a file and choose "Share via OnionShare", thanks to Subgraph developers
+* Switch to using the term "onion service" rather than "hidden service"
+* Fix CVE-2016-5026, minor security issue related to use of /tmp directory
+* Switch from PyInstaller to cx_Freeze for Windows and OSX packaging
+* Support CLI in Windows and OSX
+
+## 0.9
+
+* Slugs are now shorter and human-readable, with rate limiting to prevent URL guessing
+* Uses a new slug each time the server restarts
+* "Stop sharing automatically" enforces only one download
+* Users get asked if they're sure they want to close OnionShare while server is running
+* Added estimated time remaining progress indicator
+* Fixed frozen window while waiting for hidden service to start
+* Displays version number in both GUI and CLI
+* Closing window causes downloads to stop immediately
+* Web server listens in ports 17600-17650, for future Tails support
+* Updated translations
+* Ported from Python 2 to Python 3 and from Qt4 to Qt5
+* Ported from py2app and py2exe to PyInstaller
+
+## 0.8.1
+
+* Fixed crash in Windows 7
+* Fixed crash related to non-ephemeral hidden services in Linux
+* Fixed minor bugs
+
+## 0.8
+
+* Add support for ephemeral hidden services
+* Stopped leaking sender's locale on download page
+* Add support for Tor Messenger as provider of Tor service
+* Minor bugfixes, code cleanup, and refactoring
+
+## 0.7.1
+
+* Fixed critical bug in OS X binaries that caused crashes on some computers
+* Added Security Design document
+* Minor bugfix with Windows code signing timestamp server
+* Linux version uses HS dir that is allowed by Tor Browser Launcher's AppArmor profiles
+
+## 0.7
+
+* Added code signing for Mac OS X
+* Does not disable existing hidden services
+* Uses allowZip64 to allow compressing files >5gb
+* Sets HS dir to be in /var/lib/tor in Tails, to obey AppArmor rules
+* Misc. minor code cleanup
+
+## 0.6
+
+* Brand new drag-and-drop GUI with ability to start and stop server
+* Much cleaner code split into several files
+* Support for sharing multiple files and folders at once, and automatically compresses files before sharing
+* Redesigned receiver HTML interface
+* Waits for hidden service to be available before displaying URL
+* Cleans up hidden service directory on exit
+* Continuous integration with Travis
+* Support for multiple downloads at once
+* Fixed unicode-related filename and display bugs
+* Warns that large files could take hours to send
+* New translations
+* Several misc. bugfixes
+* Added code signing for Windows with Authenticode
+
+## 0.5
+
+* Removed webkit GUI altogether, and refactored GUI with native Qt widget
+* In Tails, launches separate process as root for Tor control port and firewall stuff, everything else runs as amnesia
+* Fixed itsdangerous dependency bug in Debian Wheezy and Tails
+* Guesses content type of file, responds in HTTP header
+
+## 0.4
+
+* Fixed critical XSS bug that could deanonymize user: https://micahflee.com/2014/07/security-advisory-upgrade-to-onionshare-0-4-immediately/
+* Added CSP headers in GUI to prevent any future XSS bugs from working
+* Hash urandom data before using it, to avoid leaking state of entropy
+* Constant time compare the slug to avoid timing attacks
+* Cleaned up Tails firewall code
+
+## 0.3
+
+* Built a simple, featureful cross-platform GUI
+* Graphical installers for Windows and OSX
+* Packaged for Linux in .deb, .rpm, with desktop launcher
+* Installable in Tails 1.1+, with simple "install" script
+* Automatically copies URL to clipboard
+* Automatically closes when download is done by default
+* Shows download progress
+* Limited suite of tests
+* If a localized string doesn't exist, falls back to English
+* New translations: Dutch, Portuguese, German, Russian, and updated translations: Norwegian Bokmål, Spanish, French, Italian
diff --git a/desktop/LICENSE b/desktop/LICENSE
new file mode 100644
index 00000000..5a3a9871
--- /dev/null
+++ b/desktop/LICENSE
@@ -0,0 +1,679 @@
+(Note: Third-party licenses can be found under install/licenses/.)
+
+OnionShare
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/desktop/MANIFEST.in b/desktop/MANIFEST.in
new file mode 100644
index 00000000..7dd8a881
--- /dev/null
+++ b/desktop/MANIFEST.in
@@ -0,0 +1,13 @@
+include LICENSE
+include README.md
+include BUILD.md
+include share/*
+include share/images/*
+include share/locale/*
+include share/templates/*
+include share/static/*
+include install/org.onionshare.OnionShare.desktop
+include install/org.onionshare.OnionShare.appdata.xml
+include install/org.onionshare.OnionShare.svg
+include install/scripts/onionshare-nautilus.py
+include tests/*.py
diff --git a/desktop/apparmor/abstractions/onionshare b/desktop/apparmor/abstractions/onionshare
new file mode 100644
index 00000000..fa94e68d
--- /dev/null
+++ b/desktop/apparmor/abstractions/onionshare
@@ -0,0 +1,29 @@
+#include <abstractions/base>
+#include <abstractions/nameservice>
+#include <abstractions/private-files-strict>
+#include <abstractions/python>
+
+# Why are these not in abstractions/python?
+/usr/lib{,32,64}/python{2,3}.[0-9]/__pycache__/ rw,
+/usr/lib{,32,64}/python{2,3}.[0-9]/__pycache__/* rw,
+/usr/lib{,32,64}/python{2,3}.[0-9]/**/__pycache__/ rw,
+/usr/lib{,32,64}/python{2,3}.[0-9]/**/__pycache__/* rw,
+/usr/lib{,32,64}/python{2,3}/**/__pycache__/ rw,
+/usr/lib{,32,64}/python{2,3}/**/__pycache__/* rw,
+
+/bin/dash rix,
+/proc/*/mounts r,
+/proc/*/fd/ r,
+/sbin/ldconfig rix,
+/sbin/ldconfig.real rix,
+/bin/uname rix,
+/etc/mime.types r,
+/usr/share/onionshare/ r,
+/usr/share/onionshare/** r,
+/tmp/ rw,
+/tmp/** rw,
+
+# Allow read on almost anything in @{HOME}. Lenient, but
+# private-files-strict is in effect.
+owner @{HOME}/ r,
+owner @{HOME}/[^.]** r,
diff --git a/desktop/apparmor/local/usr.bin.onionshare b/desktop/apparmor/local/usr.bin.onionshare
new file mode 100644
index 00000000..6453771d
--- /dev/null
+++ b/desktop/apparmor/local/usr.bin.onionshare
@@ -0,0 +1,2 @@
+# Site-specific additions and overrides for usr.bin.onionshare.
+# For more details, please see /etc/apparmor.d/local/README.
diff --git a/desktop/apparmor/local/usr.bin.onionshare-gui b/desktop/apparmor/local/usr.bin.onionshare-gui
new file mode 100644
index 00000000..fa5ba3f0
--- /dev/null
+++ b/desktop/apparmor/local/usr.bin.onionshare-gui
@@ -0,0 +1,2 @@
+# Site-specific additions and overrides for usr.bin.onionshare-gui.
+# For more details, please see /etc/apparmor.d/local/README.
diff --git a/desktop/apparmor/usr.bin.onionshare b/desktop/apparmor/usr.bin.onionshare
new file mode 100644
index 00000000..1c14ccc1
--- /dev/null
+++ b/desktop/apparmor/usr.bin.onionshare
@@ -0,0 +1,10 @@
+#include <tunables/global>
+
+/usr/bin/onionshare {
+ #include <abstractions/onionshare>
+
+ /usr/bin/ r,
+ /usr/bin/onionshare r,
+
+ #include <local/usr.bin.onionshare>
+}
diff --git a/desktop/apparmor/usr.bin.onionshare-gui b/desktop/apparmor/usr.bin.onionshare-gui
new file mode 100644
index 00000000..746dadc1
--- /dev/null
+++ b/desktop/apparmor/usr.bin.onionshare-gui
@@ -0,0 +1,28 @@
+#include <tunables/global>
+
+/usr/bin/onionshare-gui {
+ #include <abstractions/gnome>
+ #include <abstractions/ibus>
+ #include <abstractions/onionshare>
+
+ /usr/bin/ r,
+ /usr/bin/onionshare-gui r,
+ /proc/*/cmdline r,
+
+ # The freedesktop.org abstraction doesn't allow `k`
+ /usr/share/icons/*/index.theme k,
+
+ # Why do these still emit audit journal entries?
+ owner @{HOME}/.config/ibus/bus/ rw,
+ owner @{HOME}/.config/ibus/bus/* rw,
+ deny @{HOME}/.ICEauthority r,
+
+ deny /etc/machine-id r,
+ deny /var/lib/dbus/machine-id.* rw,
+
+ # Accessibility support
+ owner /{,var/}run/user/*/at-spi2-*/ rw,
+ owner /{,var/}run/user/*/at-spi2-*/** rw,
+
+ #include <local/usr.bin.onionshare-gui>
+}
diff --git a/desktop/dev_scripts/onionshare b/desktop/dev_scripts/onionshare
new file mode 100755
index 00000000..33e59203
--- /dev/null
+++ b/desktop/dev_scripts/onionshare
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+# Load onionshare module and resources from the source code tree
+import os, sys
+
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+sys.onionshare_dev_mode = True
+
+import onionshare
+
+onionshare.main()
diff --git a/desktop/dev_scripts/onionshare-gui b/desktop/dev_scripts/onionshare-gui
new file mode 100755
index 00000000..6585be02
--- /dev/null
+++ b/desktop/dev_scripts/onionshare-gui
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+# Load onionshare module and resources from the source code tree
+import os, sys
+
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+sys.onionshare_dev_mode = True
+
+import onionshare_gui
+
+onionshare_gui.main()
diff --git a/desktop/docs/Makefile b/desktop/docs/Makefile
new file mode 100644
index 00000000..d0c3cbf1
--- /dev/null
+++ b/desktop/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/desktop/docs/README.md b/desktop/docs/README.md
new file mode 100644
index 00000000..fe026802
--- /dev/null
+++ b/desktop/docs/README.md
@@ -0,0 +1,38 @@
+# OnionShare Documentation
+
+All these commands must be run from the `docs` folder.
+
+You must have the python dependencies installed to build the docs:
+
+```sh
+poetry install
+```
+
+To build HTML docs:
+
+```sh
+poetry run make html
+```
+
+Then open `docs/build/html/index.html` in a browser to see it.
+
+To update all of the translations and build all the html, run:
+
+```sh
+poetry run ./build.sh
+```
+
+You will end up with the documentation in all supported locales in `docs/localized_html`.
+
+Here's how preparing translations works:
+
+```sh
+# Generate .po files in build/gettext
+make gettext
+
+# Create a new blank German locale in source/locale, based on .po files
+sphinx-intl update -p build/gettext -l de
+
+# Build German translated document
+make -e SPHINXOPTS="-D language='de'" html
+```
diff --git a/desktop/docs/build.sh b/desktop/docs/build.sh
new file mode 100755
index 00000000..f120fab7
--- /dev/null
+++ b/desktop/docs/build.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+VERSION=`cat ../share/version.txt`
+
+# Supported locales
+LOCALES="ar ca da de el en es fa fr ga it is ja nb_NO nl pl pt_BR pt_PT ro ru sr@latin sv te tr uk zh_CN zh_TW"
+
+# Generate English .po files
+make gettext
+rm -rf gettext > /dev/null
+cp -r build/gettext gettext
+
+# Update all .po files for all locales
+for LOCALE in $LOCALES; do
+ sphinx-intl update -p build/gettext -l $LOCALE
+done
+
+# Build all locales
+rm -rf build/html build/docs > /dev/null
+mkdir -p build/docs/$VERSION
+
+make html
+mv build/html build/docs/$VERSION/en
+
+for LOCALE in $LOCALES; do
+ make -e SPHINXOPTS="-D language='$LOCALE'" html
+ mv build/html build/docs/$VERSION/$LOCALE
+done
+
+# Redirect to English by default
+echo '<html><head><meta http-equiv="refresh" content="0; url=en/" /><script>document.location="en/"</script></head></html>' > build/docs/$VERSION/index.html
+
+# Redirect to latest version
+echo '<html><head><meta http-equiv="refresh" content="0; url='$VERSION'/en/" /><script>document.location="'$VERSION'/en/"</script></head></html>' > build/docs/index.html
diff --git a/desktop/docs/gettext/.doctrees/advanced.doctree b/desktop/docs/gettext/.doctrees/advanced.doctree
new file mode 100644
index 00000000..3a21850b
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/advanced.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/develop.doctree b/desktop/docs/gettext/.doctrees/develop.doctree
new file mode 100644
index 00000000..9985cf37
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/develop.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/environment.pickle b/desktop/docs/gettext/.doctrees/environment.pickle
new file mode 100644
index 00000000..d7ebd020
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/environment.pickle
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/features.doctree b/desktop/docs/gettext/.doctrees/features.doctree
new file mode 100644
index 00000000..ec327d02
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/features.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/help.doctree b/desktop/docs/gettext/.doctrees/help.doctree
new file mode 100644
index 00000000..7fe3c6d9
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/help.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/index.doctree b/desktop/docs/gettext/.doctrees/index.doctree
new file mode 100644
index 00000000..c716ae3f
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/index.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/install.doctree b/desktop/docs/gettext/.doctrees/install.doctree
new file mode 100644
index 00000000..43677bc4
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/install.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/security.doctree b/desktop/docs/gettext/.doctrees/security.doctree
new file mode 100644
index 00000000..62107b01
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/security.doctree
Binary files differ
diff --git a/desktop/docs/gettext/.doctrees/tor.doctree b/desktop/docs/gettext/.doctrees/tor.doctree
new file mode 100644
index 00000000..737471c7
--- /dev/null
+++ b/desktop/docs/gettext/.doctrees/tor.doctree
Binary files differ
diff --git a/desktop/docs/gettext/advanced.pot b/desktop/docs/gettext/advanced.pot
new file mode 100644
index 00000000..15b92627
--- /dev/null
+++ b/desktop/docs/gettext/advanced.pot
@@ -0,0 +1,153 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid "By default, everything in OnionShare is temporary. As soon as you close an OnionShare tab its address no longer exists and can't be used again. But sometimes you might want an OnionShare service to be persistent. For example, this would be useful if you want to host a website that can keep the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid "To make any tab persistent, check the \"Save this tab, and automatically open it when I open OnionShare\" box before starting the server. When a tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid "When you quit OnionShare and then open it again, your saved tabs will start out open. You'll have to manually start each service, but when you do they will start with the same OnionShare address, and with the same password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid "If you save a tab, a copy of that tab's onion service secret key will be stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid "By default, all OnionShare services are protected with the username `onionshare` and a randomly-generated password. If someone makes 20 wrong guesses of the password, your onion service is automatically stopped to prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid "But sometimes you might want your OnionShare service to be accessible to the public. For example, if you want to set up an OnionShare receive service so the public can securely and anonymously send you files. In this case, it's better to disable the password altogether. If you don't do this, someone can force your server to stop just by making 20 wrong guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid "To disable the password for any tab, just check the \"Don't use a password\" box before starting the server. Then the server will be public and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid "OnionShare supports scheduling exactly when a service should start and stop. Before starting server, click \"Show advanced settings\" in its tab and then check the boxes next to either \"Start onion service at scheduled time\", \"Stop onion service at scheduled time\", or both, and set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid "If you scheduled a service to start in the future, when you click the start button you will see a timer counting down until it will start. If you scheduled it to stop in the future, after it's started you will see a timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid "**Scheduling an OnionShare service to automatically start can be used as a dead man's switch**, where your service will be made public at a given time in the future if anything happens to you. If nothing happens to you, you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid "**Scheduling an OnionShare service to automatically stop can be useful to limit exposure**, like if you want to share secret documents while making sure they're not available on the internet for more than a few days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid "In addition to its graphical interface, OnionShare has a command line interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid "If you installed OnionShare using the Flatpak package, unfortunately the command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid "If you installed OnionShare using an operating system package, you can just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid "If you really want to use it anyway, you can set up a Windows development environment (see :ref:`starting_development`) and then run this in a command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid "OnionShare uses v3 Tor onion services by default. These are modern onion addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid "But it still has support for v2 onion addresses, the old type of onion addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid "OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid "To use legacy addresses, before starting a server click \"Show advanced settings\" in its tab and check the \"Use a legacy address (v2 onion service, not recommended)\" box. In legacy mode you can optionally enable Tor client authentication. Once you start a server in legacy mode you cannot remove legacy mode in that tab. Instead you must start a separate service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid "Tor Project plans to `completely deprecate v2 onion services <https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, 2021, and legacy onion services will soon be removed from OnionShare as well."
+msgstr ""
diff --git a/desktop/docs/gettext/develop.pot b/desktop/docs/gettext/develop.pot
new file mode 100644
index 00000000..cd1bfc11
--- /dev/null
+++ b/desktop/docs/gettext/develop.pot
@@ -0,0 +1,177 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid "OnionShare has an open Keybase team that we use to discuss the project, including asking questions, sharing ideas and designs, and making plans for future development. (It's also an easy way to send end-to-end encrypted direct messages to others in the OnionShare community, like OnionShare addresses.) To use Keybase, you need to download the `Keybase app <https://keybase.io/download>`_, make an account, and `join this team <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid "OnionShare also has a `mailing list <https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid "OnionShare source code is in this git repository: https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid "If you'd like to contribute code to OnionShare, it helps to join the Keybase team and ask questions about what you're thinking of working on. You should also review all of the `open issues <https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid "When you're ready to contribute code, open a pull request in the GitHub repository and one of the project maintainers will review it and possible ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid "OnionShare is developed in Python. To get started, you should clone the git repository at https://github.com/micahflee/onionshare/ and then consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid "When developing, it's convenient to run OnionShare from a terminal and add the ``--verbose`` (or ``-v``) flag to the command. This will print a lot of helpful messages to the terminal such as when certain objects are initialized, when events occur (like buttons clicked, settings saved or reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid "You can add your own debug messages by running the ``Common.log`` method from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid "This can be useful when learning the chain of events that occur when using the application or the value of certain variables before and after they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid "Tor is slow, and it's often convenient to skip starting onion services altogether during development. You can do this with the ``--local-only`` flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid "In this case, you load the URL ``http://onionshare:eject-snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid "If you want to obtain debug output from the ``onionshare-gui.exe`` in Windows, you will need to edit ``install\\pyinstaller.spec`` and change ``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid "Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to comment out the ``signtool`` commands in the ``build_exe.bat`` and the ``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid "After this, you can run ``onionshare-gui.exe -v`` from a command prompt to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid "Most of the OnionShare is translatable. You can help make it easier to use and more familiar and welcoming for people around the globe. The Localization Lab has some `documentation about translating OnionShare <https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid "OnionShare uses Weblate to keep track of translations. You can view the OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid "To help translate, make a Hosted Weblate account and start contributing to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid "Sometimes the original English strings could be improved, making them easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid "If you have suggestions for a better English string, please open a GitHub issue rather than commenting in Weblate. This ensures the upstream developers will definitely see the suggestion, and can potentially modify the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid "Here is the current translation status. If you want start a translation in a language not to be found here, please write us to the mailing list: onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid "Duplicate the line that begins with ``Comment=``. Add the language code to the new line so it becomes ``Comment[lang]=`` (lang should be your language). You can see what language codes are used for translation by looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
diff --git a/desktop/docs/gettext/features.pot b/desktop/docs/gettext/features.pot
new file mode 100644
index 00000000..4fef3fe5
--- /dev/null
+++ b/desktop/docs/gettext/features.pot
@@ -0,0 +1,226 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid "OnionShare works by starting web servers locally on your own computer and making them accessible to other people as `Tor <https://www.torproject.org/>`_ `onion services <https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid "By default, OnionShare web addresses are protected with a random password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid "You're responsible for securely sharing that URL using a communication channel of your choice like in an encrypted chat message, or using something less secure like a Twitter or Facebook message, depending on your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid "The people who you send the URL to must then copy and paste it into `Tor Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid "With OnionShare, *your own computer is the web server*. If you run OnionShare on your laptop to send someone files, and then suspend your laptop before the files have been downloaded, the service will not be available until your laptop is unsuspended and connected to the internet again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid "Because your own computer is the web server, *no third party can access anything that happens in OnionShare*, not even the developers of OnionShare. It's completely private. And because OnionShare is based on Tor onion services too, it also protects your anonymity. See the :doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid "You can use OnionShare to securely and anonymously send files and folders to people. Just open a share tab, drag in the files and folders you wish to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27
+#: ../../source/features.rst:91
+msgid "After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid "By default, as soon as someone finishes downloading your files, OnionShare will automatically stop the server, completely removing the website from the internet. If you want to allow multiple people to download these files, uncheck the \"Stop sharing after files have been sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid "Also, if you uncheck this box, people will be able to download individual files that you share rather than a single compressed version of all of the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid "When you're ready to share, click the \"Start sharing\" button. You can always click \"Stop sharing\", or quit OnionShare, to immediate take the website down. You can also click the up arrow icon in the top-right corner to show the history and progress of people downloading files from you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid "Now that you have a website that's sharing files, copy the address and send it to the person you want to receive the files. If the files need to stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid "That person then must load the address in Tor Browser. After logging in with the random password that's included in the web address, they will be able to download the files directly from your computer by clicking the \"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid "You can use OnionShare to let people anonymously upload files directly to your computer, essentially turning it into an anonymous dropbox. Open a receive tab, choose where you want files to get downloaded and other settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid "This will start the OnionShare service. Anyone that loads this address in Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid "You can also click the down arrow icon in the top-right corner to show the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid "When someone uploads files to your receive service, by default they get saved to a folder called ``OnionShare`` in your home folder on your computer, and they get automatically organized into separate subfolders based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid "Setting up an OnionShare receiving service is useful for journalists and others that need to securely accept documents from anonymous sources. When used in this way, OnionShare is sort of like a lightweight, simpler, not quite as secure version of `SecureDrop <https://securedrop.org/>`_, the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid "Just like with malicious email attachments, it's possible that someone could try to hack your computer by uploading a malicious file to your OnionShare service. OnionShare does not add any safety mechanisms to protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid "If you receive an Office document or a PDF through OnionShare, you can convert these documents into PDFs that you know are safe to open using `Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself when opening untrusted documents by opening them in `Tails <https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid "If you want to host your own anonymous dropbox using OnionShare, it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid "If you intend on advertising the OnionShare address on your website or social media profiles, then you should save the tab (see :ref:`save_tabs`) and run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid "You can use OnionShare to host a static HTML website with just a click. Just open a website tab, drag in the files and folders that make up the static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid "If you add an ``index.html`` file, when someone loads your website it will render this page. You should also include any other HTML files, CSS files, JavaScript files, and images that make up the website. (Note that OnionShare only supports hosting *static* websites. It can't host websites that execute code or use databases. So you can't, for example, use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid "If you don't have an ``index.html`` file, then it will show a directory listing instead, and people who load it can look through the files and download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid "By default OnionShare will help secure your website by setting a strict `Content Security Police <https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid "If you want to load content from third-party websites, like assets or JavaScript libraries from CDNs, then you must check the \"Disable Content Security Policy header (allows your website to use third-party resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid "If you want to host a long-term website using OnionShare (that isn't just to quickly show someone something), it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis. You should also save the tab (see :ref:`save_tabs`) so that you can resume the website with the same address if you close OnionShare and re-open it later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid "If your website is intended to be viewed by the public, you should run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid "You can use OnionShare to set up a completely anonymous, secure chat room that doesn't log anything or leave any traces. Just open a chat tab and click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid "After you start the server, copy the OnionShare address and send it to the people who will join this anonymous chat room. If it's important to limit exactly who can join, you should use an encrypted messaging app to send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid "People can join the chat room by loading its OnionShare address in Tor Browser. The chat room requires JavasScript, so everyone who wants to participate must set their security level to Standard or Safer instead of Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid "When someone joins the chat room they get assigned a random name. They can change their name by typing a new name in the box in the left panel and pressing enter. No chat history will get displayed at all, even if others were already chatting in the room, because the chat history isn't saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid "In an OnionShare chat room, everyone is anonymous. Anyone can change their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid "However, if you create an OnionShare chat room and securely send the address only to a small group of trusted friends using encrypted messages, then you can be reasonably confident that the people who join the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid "If you need to already be using an encrypted messaging app, what's the point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid "If you send a message to a Signal group, for example, a copy of your message ends up on each device (the phones and computers, if they set up Signal Desktop) of each member of the group. Even if disappearing messages is enabled, it's hard to confirm that all copies of the messages were actually deleted from all devices, and from any other places (like notifications databases) they may have been saved to. OnionShare chat rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid "OnionShare chat rooms can also be useful for anonymous people wanting to chat securely with someone without needing to create any accounts. For example, a source can send an OnionShare address to a journalist using a disposable email address, and then wait for the journalist to join the chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid "Because OnionShare relies on Tor onion services, connections between Tor Browser and OnionShare are all end-to-end encrypted (E2EE). When someone posts a message to an OnionShare chat room, they send it to the server through the E2EE onion connection, which then sends it to all other members of the chat room using WebSockets, through their E2EE onion connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid "OnionShare doesn't implement any chat encryption on its own. It relies on the Tor onion service's encryption instead."
+msgstr ""
diff --git a/desktop/docs/gettext/help.pot b/desktop/docs/gettext/help.pot
new file mode 100644
index 00000000..0996bae3
--- /dev/null
+++ b/desktop/docs/gettext/help.pot
@@ -0,0 +1,57 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid "This website is full of instructions on how to use OnionShare. Look through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid "If you can't find a solution in this website, please check the `GitHub issues <https://github.com/micahflee/onionshare/issues>`_. It's possible that someone else has encountered the same problem and has either raised it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid "If you can't find a solution to your problem, or you wish to ask a question or suggest a new feature, please `submit an issue <https://github.com/micahflee/onionshare/issues/new>`_. This requires `creating an GitHub account <https://help.github.com/articles/signing-up-for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid "See :ref:`collaborating` for instructions on how to join our Keybase team that we use to discuss the project."
+msgstr ""
diff --git a/desktop/docs/gettext/index.pot b/desktop/docs/gettext/index.pot
new file mode 100644
index 00000000..edd6e67d
--- /dev/null
+++ b/desktop/docs/gettext/index.pot
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid "OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network."
+msgstr ""
diff --git a/desktop/docs/gettext/install.pot b/desktop/docs/gettext/install.pot
new file mode 100644
index 00000000..58bedab2
--- /dev/null
+++ b/desktop/docs/gettext/install.pot
@@ -0,0 +1,101 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid "You can download OnionShare for Windows and macOS from the `OnionShare website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid "There are various ways to install OnionShare for Linux, but the recommended way is to use the Flatpak package. Flatpak ensures that you'll always use the most latest dependencies and run OnionShare inside of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid "Make sure you have ``flatpak`` installed and the Flathub repository added by following `these instructions <https://flatpak.org/setup/>`_ for your Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid "Then install OnionShare from Flathub by following `the instructions here <https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid "You can verify that the Windows, macOS, or source package you download is legitimate and hasn't been tampered with by verifying its PGP signature. For Windows and macOS, this step is optional and provides defense in depth: the installers also include their operating system-specific signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid "Windows, macOS, and source packaged are signed by Micah Lee, the core developer, using his PGP public key with fingerprint ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid "In order to verify signatures, you must have GnuPG installed. For macOS you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid "You can find the signatures (``.asc`` files), as well as Windows, macOS, and source packages, at https://onionshare.org/dist/ in the folders named for each version of OnionShare. You can also find them on the `GitHub Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid "Once you have imported Micah's public key into your GnuPG keychain, downloaded the binary, and downloaded the ``.asc`` signature, you can verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid "If you don't see 'Good signature from', then there might be a problem with the integrity of the file (malicious or otherwise), and you perhaps should not install the package. (The WARNING shown above, is not a problem with the package: it only means you have not defined any level of 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid "If you want to learn more about verifying PGP signatures, guides for `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and the `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html.en>`_ may be helpful."
+msgstr ""
diff --git a/desktop/docs/gettext/security.pot b/desktop/docs/gettext/security.pot
new file mode 100644
index 00000000..2bf3fb0a
--- /dev/null
+++ b/desktop/docs/gettext/security.pot
@@ -0,0 +1,61 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid "First read :ref:`how_it_works` to understand the basics of how OnionShare works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid "**Third parties don't have access to anything that happens in OnionShare.** When you use OnionShare, you host services directly on your computer. For example, when you share files with OnionShare, you don't upload these files to any server, and when you start an OnionShare chat room, your computer is the chat room server itself. Traditional ways of sharing files or setting up websites and chat rooms require trusting a service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid "**Network eavesdroppers can't spy on anything that happens in OnionShare in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on what happens in an OnionShare service. If the eavesdropper is positioned on the OnionShare user's end, the Tor Browser user's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect Tor Browser with OnionShare's onion service, the traffic will be encrypted using the onion service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid "**Anonymity of OnionShare users are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the OnionShare user anonymously communicates the OnionShare address with the Tor Browser users, the Tor Browser users and eavesdroppers can't learn the identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid "**If an attacker learns about the onion service, they still can't access anything.** There have been attacks against the Tor network that can enumerate onion services. Even if someone discovers the .onion address of an OnionShare onion service, they can't access it without also knowing the service's random password (unless, of course, the OnionShare users chooses to disable the password and make it public). The password is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible password. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid "**Communicating the OnionShare address might not be secure.** The OnionShare user is responsible for securely communicating the OnionShare address with people. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're using OnionShare. If the attacker loads the address in Tor Browser before the legitimate recipient gets to it, they can access the service. If this risk fits the user's threat model, they must find a more secure way to communicate the address, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid "**Communicating the OnionShare address might not be anonymous.** While OnionShare and Tor Browser allow for anonymity, if the user wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare address. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the address. This isn't necessary in cases where there's no need to protect anonymity, such as co-workers who know each other sharing work documents."
+msgstr ""
diff --git a/desktop/docs/gettext/sphinx.pot b/desktop/docs/gettext/sphinx.pot
new file mode 100644
index 00000000..05bdc208
--- /dev/null
+++ b/desktop/docs/gettext/sphinx.pot
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
diff --git a/desktop/docs/gettext/tor.pot b/desktop/docs/gettext/tor.pot
new file mode 100644
index 00000000..5f7adb04
--- /dev/null
+++ b/desktop/docs/gettext/tor.pot
@@ -0,0 +1,137 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid "There are several options for how OnionShare should connect to Tor. You can change them in Settings, which you can get to by clicking the gear icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid "This is the default way that OnionShare connects to Tor, and it's also the simplest and most reliable way. For this reason, it's recommended for most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid "When you open OnionShare, it will launch a Tor process in the background that's configured specifically for OnionShare to use. This Tor process won't interfere with other Tor processes on your computer, so you're free to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid "You can configure OnionShare to connect to the Tor that comes with Tor Browser. First, `download Tor Browser <https://www.torproject.org>`_ here if you don't already have it. With this setting selected, you need to keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid "This is fairly advanced. You'll need to know how edit plaintext files and do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid "Download the Tor Windows Expert Bundle, which you can get `from here <https://www.torproject.org/download/tor/>`_. Extract the zip file and copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename the folder to ``tor-win32``, so that inside that folder is the ``Data`` and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid "Make up a control port password. I'm going to use ``comprised stumble rummage work avenging construct volatile`` as my password. Now open a command prompt as an administrator, and use ``tor.exe --hash-password`` to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid "The hashed password output is displayed after some warnings (which you can ignore). In my case, it was ``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid "Now create a new text file at ``C:\\Program Files (x86)\\tor-win32\\torrc`` and put this in it, replacing the ``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid "In your administrator command prompt, install tor as a service using the appropriate ``torrc`` file you just created (see `here <https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid "Open OnionShare. Click the Settings icon. Under \"How should OnionShare connect to Tor?\" choose \"Connect using control port\", and set the control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor authentication options\" choose \"Password\" and set the password to your password, in my case ``comprised stumble rummage work avenging construct volatile``. Click the \"Test Settings\" button. If all goes well, you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid "First, install `Homebrew <http://brew.sh/>`_ if you don't already have it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid "Open OnionShare. Click the Settings icon. Under \"How should OnionShare connect to Tor?\" choose \"Connect using socket file\", and set the socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor authentication options\" choose \"No authentication, or cookie authentication\". Click the \"Test Settings\" button. If all goes well, you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid "First, install the tor package. If you're using Debian, Ubuntu, or a similar Linux distro, I recommend you use Tor Project's `official repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid "Next, add your user to the group that runs the Tor process (in the case of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid "Add your user to the ``debian-tor`` group by running this command (replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid "Reboot your computer. After it boots up again, open OnionShare. Click the Settings icon. Under \"How should OnionShare connect to Tor?\" choose \"Connect using socket file\", and set the socket file to be ``/var/run/tor/control``. Under \"Tor authentication options\" choose \"No authentication, or cookie authentication\". Click the \"Test Settings\" button. If all goes well, you should see successfully connect to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid "If your access to the internet is censored, you can configure OnionShare to connect to the Tor network using `Tor bridges <https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid "You can use the built-in obfs4 pluggable transports, the built-in meek_lite (Azure) pluggable transports, or custom bridges, which you can obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
diff --git a/desktop/docs/make.bat b/desktop/docs/make.bat
new file mode 100644
index 00000000..6247f7e2
--- /dev/null
+++ b/desktop/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/desktop/docs/poetry.lock b/desktop/docs/poetry.lock
new file mode 100644
index 00000000..2593b9d4
--- /dev/null
+++ b/desktop/docs/poetry.lock
@@ -0,0 +1,464 @@
+[[package]]
+category = "main"
+description = "A configurable sidebar-enabled Sphinx theme"
+name = "alabaster"
+optional = false
+python-versions = "*"
+version = "0.7.12"
+
+[[package]]
+category = "main"
+description = "Internationalization utilities"
+name = "babel"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.8.0"
+
+[package.dependencies]
+pytz = ">=2015.7"
+
+[[package]]
+category = "main"
+description = "Python package for providing Mozilla's CA Bundle."
+name = "certifi"
+optional = false
+python-versions = "*"
+version = "2020.6.20"
+
+[[package]]
+category = "main"
+description = "Universal encoding detector for Python 2 and 3"
+name = "chardet"
+optional = false
+python-versions = "*"
+version = "3.0.4"
+
+[[package]]
+category = "main"
+description = "Composable command line interface toolkit"
+name = "click"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "7.1.2"
+
+[[package]]
+category = "main"
+description = "Cross-platform colored terminal text."
+marker = "sys_platform == \"win32\""
+name = "colorama"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "0.4.3"
+
+[[package]]
+category = "main"
+description = "Docutils -- Python Documentation Utilities"
+name = "docutils"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "0.16"
+
+[[package]]
+category = "main"
+description = "Internationalized Domain Names in Applications (IDNA)"
+name = "idna"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.10"
+
+[[package]]
+category = "main"
+description = "Getting image size from png/jpeg/jpeg2000/gif file"
+name = "imagesize"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.2.0"
+
+[[package]]
+category = "main"
+description = "A very fast and expressive template engine."
+name = "jinja2"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "2.11.2"
+
+[package.dependencies]
+MarkupSafe = ">=0.23"
+
+[package.extras]
+i18n = ["Babel (>=0.8)"]
+
+[[package]]
+category = "main"
+description = "Safely add untrusted strings to HTML/XML markup."
+name = "markupsafe"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "1.1.1"
+
+[[package]]
+category = "main"
+description = "Core utilities for Python packages"
+name = "packaging"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "20.4"
+
+[package.dependencies]
+pyparsing = ">=2.0.2"
+six = "*"
+
+[[package]]
+category = "main"
+description = "Pygments is a syntax highlighting package written in Python."
+name = "pygments"
+optional = false
+python-versions = ">=3.5"
+version = "2.7.1"
+
+[[package]]
+category = "main"
+description = "Python parsing module"
+name = "pyparsing"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "2.4.7"
+
+[[package]]
+category = "main"
+description = "World timezone definitions, modern and historical"
+name = "pytz"
+optional = false
+python-versions = "*"
+version = "2020.1"
+
+[[package]]
+category = "main"
+description = "Python HTTP for Humans."
+name = "requests"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "2.24.0"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+chardet = ">=3.0.2,<4"
+idna = ">=2.5,<3"
+urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
+
+[package.extras]
+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
+
+[[package]]
+category = "main"
+description = "Python 2 and 3 compatibility utilities"
+name = "six"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "1.15.0"
+
+[[package]]
+category = "main"
+description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms."
+name = "snowballstemmer"
+optional = false
+python-versions = "*"
+version = "2.0.0"
+
+[[package]]
+category = "main"
+description = "Python documentation generator"
+name = "sphinx"
+optional = false
+python-versions = ">=3.5"
+version = "3.2.1"
+
+[package.dependencies]
+Jinja2 = ">=2.3"
+Pygments = ">=2.0"
+alabaster = ">=0.7,<0.8"
+babel = ">=1.3"
+colorama = ">=0.3.5"
+docutils = ">=0.12"
+imagesize = "*"
+packaging = "*"
+requests = ">=2.5.0"
+setuptools = "*"
+snowballstemmer = ">=1.1"
+sphinxcontrib-applehelp = "*"
+sphinxcontrib-devhelp = "*"
+sphinxcontrib-htmlhelp = "*"
+sphinxcontrib-jsmath = "*"
+sphinxcontrib-qthelp = "*"
+sphinxcontrib-serializinghtml = "*"
+
+[package.extras]
+docs = ["sphinxcontrib-websupport"]
+lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"]
+test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"]
+
+[[package]]
+category = "main"
+description = "Sphinx utility that make it easy to translate and to apply translation."
+name = "sphinx-intl"
+optional = false
+python-versions = ">=3.5"
+version = "2.0.1"
+
+[package.dependencies]
+babel = "*"
+click = "*"
+setuptools = "*"
+sphinx = "*"
+
+[package.extras]
+test = ["pytest", "mock"]
+transifex = ["transifex_client (>=0.11)"]
+
+[[package]]
+category = "main"
+description = "Read the Docs theme for Sphinx"
+name = "sphinx-rtd-theme"
+optional = false
+python-versions = "*"
+version = "0.5.0"
+
+[package.dependencies]
+sphinx = "*"
+
+[package.extras]
+dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"]
+
+[[package]]
+category = "main"
+description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
+name = "sphinxcontrib-applehelp"
+optional = false
+python-versions = ">=3.5"
+version = "1.0.2"
+
+[package.extras]
+lint = ["flake8", "mypy", "docutils-stubs"]
+test = ["pytest"]
+
+[[package]]
+category = "main"
+description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
+name = "sphinxcontrib-devhelp"
+optional = false
+python-versions = ">=3.5"
+version = "1.0.2"
+
+[package.extras]
+lint = ["flake8", "mypy", "docutils-stubs"]
+test = ["pytest"]
+
+[[package]]
+category = "main"
+description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+name = "sphinxcontrib-htmlhelp"
+optional = false
+python-versions = ">=3.5"
+version = "1.0.3"
+
+[package.extras]
+lint = ["flake8", "mypy", "docutils-stubs"]
+test = ["pytest", "html5lib"]
+
+[[package]]
+category = "main"
+description = "A sphinx extension which renders display math in HTML via JavaScript"
+name = "sphinxcontrib-jsmath"
+optional = false
+python-versions = ">=3.5"
+version = "1.0.1"
+
+[package.extras]
+test = ["pytest", "flake8", "mypy"]
+
+[[package]]
+category = "main"
+description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
+name = "sphinxcontrib-qthelp"
+optional = false
+python-versions = ">=3.5"
+version = "1.0.3"
+
+[package.extras]
+lint = ["flake8", "mypy", "docutils-stubs"]
+test = ["pytest"]
+
+[[package]]
+category = "main"
+description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
+name = "sphinxcontrib-serializinghtml"
+optional = false
+python-versions = ">=3.5"
+version = "1.1.4"
+
+[package.extras]
+lint = ["flake8", "mypy", "docutils-stubs"]
+test = ["pytest"]
+
+[[package]]
+category = "main"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+name = "urllib3"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+version = "1.25.10"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
+
+[metadata]
+content-hash = "7ebd064a3d4ab4b070421d125fc0104f9fe02661335c39e042b477f7b7a9ac9e"
+python-versions = "~3.6"
+
+[metadata.files]
+alabaster = [
+ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"},
+ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
+]
+babel = [
+ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
+ {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"},
+]
+certifi = [
+ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
+ {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
+]
+chardet = [
+ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
+ {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
+]
+click = [
+ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
+ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
+]
+colorama = [
+ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
+ {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
+]
+docutils = [
+ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
+ {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
+]
+idna = [
+ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
+ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
+]
+imagesize = [
+ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"},
+ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
+]
+jinja2 = [
+ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"},
+ {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"},
+]
+markupsafe = [
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
+ {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
+]
+packaging = [
+ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
+ {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"},
+]
+pygments = [
+ {file = "Pygments-2.7.1-py3-none-any.whl", hash = "sha256:307543fe65c0947b126e83dd5a61bd8acbd84abec11f43caebaf5534cbc17998"},
+ {file = "Pygments-2.7.1.tar.gz", hash = "sha256:926c3f319eda178d1bd90851e4317e6d8cdb5e292a3386aac9bd75eca29cf9c7"},
+]
+pyparsing = [
+ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
+ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
+]
+pytz = [
+ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"},
+ {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"},
+]
+requests = [
+ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
+ {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
+]
+six = [
+ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
+ {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
+]
+snowballstemmer = [
+ {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"},
+ {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"},
+]
+sphinx = [
+ {file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"},
+ {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"},
+]
+sphinx-intl = [
+ {file = "sphinx-intl-2.0.1.tar.gz", hash = "sha256:b25a6ec169347909e8d983eefe2d8adecb3edc2f27760db79b965c69950638b4"},
+ {file = "sphinx_intl-2.0.1-py3.8.egg", hash = "sha256:2ff97cba0e4e43249e339a3c29dd2f5b63c25ce794050aabca320ad95f5c5b55"},
+]
+sphinx-rtd-theme = [
+ {file = "sphinx_rtd_theme-0.5.0-py2.py3-none-any.whl", hash = "sha256:373413d0f82425aaa28fb288009bf0d0964711d347763af2f1b65cafcb028c82"},
+ {file = "sphinx_rtd_theme-0.5.0.tar.gz", hash = "sha256:22c795ba2832a169ca301cd0a083f7a434e09c538c70beb42782c073651b707d"},
+]
+sphinxcontrib-applehelp = [
+ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
+ {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"},
+]
+sphinxcontrib-devhelp = [
+ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"},
+ {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
+]
+sphinxcontrib-htmlhelp = [
+ {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"},
+ {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"},
+]
+sphinxcontrib-jsmath = [
+ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
+ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
+]
+sphinxcontrib-qthelp = [
+ {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"},
+ {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
+]
+sphinxcontrib-serializinghtml = [
+ {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"},
+ {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"},
+]
+urllib3 = [
+ {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"},
+ {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"},
+]
diff --git a/desktop/docs/pyproject.toml b/desktop/docs/pyproject.toml
new file mode 100644
index 00000000..9cc7bcc2
--- /dev/null
+++ b/desktop/docs/pyproject.toml
@@ -0,0 +1,17 @@
+[tool.poetry]
+name = "onionshare-docs"
+version = "0.1.0"
+description = ""
+authors = ["Micah Lee <micah@micahflee.com>"]
+
+[tool.poetry.dependencies]
+python = "~3.6"
+sphinx = "^3.2.1"
+sphinx-rtd-theme = "^0.5.0"
+sphinx-intl = "^2.0.1"
+
+[tool.poetry.dev-dependencies]
+
+[build-system]
+requires = ["poetry>=0.12"]
+build-backend = "poetry.masonry.api"
diff --git a/desktop/docs/source/_static/apple-logo.png b/desktop/docs/source/_static/apple-logo.png
new file mode 100644
index 00000000..c2cadc12
--- /dev/null
+++ b/desktop/docs/source/_static/apple-logo.png
Binary files differ
diff --git a/desktop/docs/source/_static/custom.css b/desktop/docs/source/_static/custom.css
new file mode 100644
index 00000000..18f242b3
--- /dev/null
+++ b/desktop/docs/source/_static/custom.css
@@ -0,0 +1,21 @@
+.wy-nav-top {
+ background-color: #4e0d4e;
+}
+
+.wy-side-nav-search {
+ background-color: #5f0f5f;
+}
+
+.wy-nav-content a:link,
+.wy-nav-content a:visited {
+ color: #2980b9;
+}
+
+.wy-nav-content a:active,
+.wy-nav-content a:hover {
+ color: #3091d1;
+}
+
+.wy-nav-content div[role=navigation] {
+ display: none;
+} \ No newline at end of file
diff --git a/desktop/docs/source/_static/favicon.ico b/desktop/docs/source/_static/favicon.ico
new file mode 100644
index 00000000..63e65d8b
--- /dev/null
+++ b/desktop/docs/source/_static/favicon.ico
Binary files differ
diff --git a/desktop/docs/source/_static/linux-logo.png b/desktop/docs/source/_static/linux-logo.png
new file mode 100644
index 00000000..0cfca2e8
--- /dev/null
+++ b/desktop/docs/source/_static/linux-logo.png
Binary files differ
diff --git a/desktop/docs/source/_static/logo.png b/desktop/docs/source/_static/logo.png
new file mode 100644
index 00000000..1479eed0
--- /dev/null
+++ b/desktop/docs/source/_static/logo.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/advanced-save-tabs.png b/desktop/docs/source/_static/screenshots/advanced-save-tabs.png
new file mode 100644
index 00000000..18788167
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/advanced-save-tabs.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/advanced-schedule-start-timer.png b/desktop/docs/source/_static/screenshots/advanced-schedule-start-timer.png
new file mode 100644
index 00000000..e633fb37
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/advanced-schedule-start-timer.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/advanced-schedule-stop-timer.png b/desktop/docs/source/_static/screenshots/advanced-schedule-stop-timer.png
new file mode 100644
index 00000000..4938f00b
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/advanced-schedule-stop-timer.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/chat-sharing.png b/desktop/docs/source/_static/screenshots/chat-sharing.png
new file mode 100644
index 00000000..b4e8406f
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/chat-sharing.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/chat-torbrowser.png b/desktop/docs/source/_static/screenshots/chat-torbrowser.png
new file mode 100644
index 00000000..79e0fd5f
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/chat-torbrowser.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/chat.png b/desktop/docs/source/_static/screenshots/chat.png
new file mode 100644
index 00000000..aad601a1
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/chat.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/receive-sharing.png b/desktop/docs/source/_static/screenshots/receive-sharing.png
new file mode 100644
index 00000000..5ab44ecd
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/receive-sharing.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/receive-torbrowser.png b/desktop/docs/source/_static/screenshots/receive-torbrowser.png
new file mode 100644
index 00000000..0ad381d5
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/receive-torbrowser.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/receive.png b/desktop/docs/source/_static/screenshots/receive.png
new file mode 100644
index 00000000..799c7879
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/receive.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/settings.png b/desktop/docs/source/_static/screenshots/settings.png
new file mode 100644
index 00000000..6b705496
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/settings.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/share-files.png b/desktop/docs/source/_static/screenshots/share-files.png
new file mode 100644
index 00000000..d0d5f280
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/share-files.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/share-sharing.png b/desktop/docs/source/_static/screenshots/share-sharing.png
new file mode 100644
index 00000000..6f3f41ae
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/share-sharing.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/share-torbrowser.png b/desktop/docs/source/_static/screenshots/share-torbrowser.png
new file mode 100644
index 00000000..ac0f4983
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/share-torbrowser.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/share.png b/desktop/docs/source/_static/screenshots/share.png
new file mode 100644
index 00000000..f03c68ba
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/share.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/tabs.png b/desktop/docs/source/_static/screenshots/tabs.png
new file mode 100644
index 00000000..8b96ace2
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/tabs.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/website-files.png b/desktop/docs/source/_static/screenshots/website-files.png
new file mode 100644
index 00000000..4bd293b2
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/website-files.png
Binary files differ
diff --git a/desktop/docs/source/_static/screenshots/website.png b/desktop/docs/source/_static/screenshots/website.png
new file mode 100644
index 00000000..d745cf6a
--- /dev/null
+++ b/desktop/docs/source/_static/screenshots/website.png
Binary files differ
diff --git a/desktop/docs/source/_static/windows-logo.png b/desktop/docs/source/_static/windows-logo.png
new file mode 100644
index 00000000..c9389bac
--- /dev/null
+++ b/desktop/docs/source/_static/windows-logo.png
Binary files differ
diff --git a/desktop/docs/source/_templates/versions.html b/desktop/docs/source/_templates/versions.html
new file mode 100644
index 00000000..761e2add
--- /dev/null
+++ b/desktop/docs/source/_templates/versions.html
@@ -0,0 +1,25 @@
+<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
+ <span class="rst-current-version" data-toggle="rst-current-version">
+ <span class="fa fa-book">OnionShare</span>
+ v: {{ current_version }}
+ <span class="fa fa-caret-down"></span>
+ </span>
+ <div class="rst-other-versions">
+ {%- if versions %}
+ <dl>
+ <dt>{{ _('Versions') }}</dt>
+ {%- for name in versions %}
+ <dd><a href="../../{{ name }}">{{ name }}</a></dd>
+ {%- endfor %}
+ </dl>
+ {%- endif %}
+ {%- if langs %}
+ <dl>
+ <dt>{{ _('Languages') }}</dt>
+ {%- for name, code in langs %}
+ <dd><a href="../{{ code }}/">{{ name }}</a></dd>
+ {%- endfor %}
+ </dl>
+ {%- endif %}
+ </div>
+</div> \ No newline at end of file
diff --git a/desktop/docs/source/advanced.rst b/desktop/docs/source/advanced.rst
new file mode 100644
index 00000000..c4375bea
--- /dev/null
+++ b/desktop/docs/source/advanced.rst
@@ -0,0 +1,148 @@
+Advanced usage
+==============
+
+.. _save_tabs:
+
+Save tabs
+---------
+
+By default, everything in OnionShare is temporary. As soon as you close an OnionShare tab its address no longer exists and can't be used again. But sometimes you might want an OnionShare service to be persistent. For example, this would be useful if you want to host a website that can keep the same URL even if you reboot your computer.
+
+To make any tab persistent, check the "Save this tab, and automatically open it when I open OnionShare" box before starting the server. When a tab is saved a purple pin icon appears to the left of its server status.
+
+.. image:: _static/screenshots/advanced-save-tabs.png
+
+When you quit OnionShare and then open it again, your saved tabs will start out open. You'll have to manually start each service, but when you do they will start with the same OnionShare address, and with the same password.
+
+If you save a tab, a copy of that tab's onion service secret key will be stored on your computer with your OnionShare settings.
+
+.. _disable_passwords:
+
+Disable passwords
+-----------------
+
+By default, all OnionShare services are protected with the username `onionshare` and a randomly-generated password. If someone makes 20 wrong guesses of the password, your onion service is automatically stopped to prevent a brute force attack against the OnionShare service.
+
+But sometimes you might want your OnionShare service to be accessible to the public. For example, if you want to set up an OnionShare receive service so the public can securely and anonymously send you files. In this case, it's better to disable the password altogether. If you don't do this, someone can force your server to stop just by making 20 wrong guesses of your password, even if they know the correct password.
+
+To disable the password for any tab, just check the "Don't use a password" box before starting the server. Then the server will be public and won't have a password.
+
+Scheduled times
+---------------
+
+OnionShare supports scheduling exactly when a service should start and stop. Before starting server, click "Show advanced settings" in its tab and then check the boxes next to either "Start onion service at scheduled time", "Stop onion service at scheduled time", or both, and set the desired dates and times.
+
+If you scheduled a service to start in the future, when you click the start button you will see a timer counting down until it will start. If you scheduled it to stop in the future, after it's started you will see a timer counting down to when it will stop automatically.
+
+**Scheduling an OnionShare service to automatically start can be used as a dead man's switch**, where your service will be made public at a given time in the future if anything happens to you. If nothing happens to you, you can cancel the service before it's scheduled to start.
+
+.. image:: _static/screenshots/advanced-schedule-start-timer.png
+
+**Scheduling an OnionShare service to automatically stop can be useful to limit exposure**, like if you want to share secret documents while making sure they're not available on the internet for more than a few days.
+
+.. image:: _static/screenshots/advanced-schedule-stop-timer.png
+
+Command line interface
+----------------------
+
+In addition to its graphical interface, OnionShare has a command line interface.
+
+Linux
+^^^^^
+
+If you installed OnionShare using the Flatpak package, unfortunately the command line interface isn't supported.
+
+If you installed OnionShare using an operating system package, you can just run ``onionshare`` from the terminal.
+
+macOS
+^^^^^
+
+Make a symbolic link to the OnionShare command line binary like this::
+
+ ln -s /Applications/OnionShare.app/Contents/MacOS/onionshare /usr/local/bin
+
+Now you can run ``onionshare`` from the terminal.
+
+Windows
+^^^^^^^
+
+The command line interface isn't supported in Windows.
+
+If you really want to use it anyway, you can set up a Windows development environment (see :ref:`starting_development`) and then run this in a command prompt::
+
+ poetry run python dev_scripts\onionshare
+
+Usage
+^^^^^
+
+You can see command line documentation by running ``onionshare --help``::
+
+ $ onionshare --help
+ OnionShare 2.3 | https://onionshare.org/
+
+ @@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ___ _
+ @@@@@@ @@@@@@@@@@@@@ / _ \ (_)
+ @@@@ @ @@@@@@@@@@@ | | | |_ __ _ ___ _ __
+ @@@@@@@@ @@@@@@@@@@ | | | | '_ \| |/ _ \| '_ \
+ @@@@@@@@@@@@ @@@@@@@@@@ \ \_/ / | | | | (_) | | | |
+ @@@@@@@@@@@@@@@@ @@@@@@@@@ \___/|_| |_|_|\___/|_| |_|
+ @@@@@@@@@ @@@@@@@@@@@@@@@@ _____ _
+ @@@@@@@@@@ @@@@@@@@@@@@ / ___| |
+ @@@@@@@@@@ @@@@@@@@ \ `--.| |__ __ _ _ __ ___
+ @@@@@@@@@@@ @ @@@@ `--. \ '_ \ / _` | '__/ _ \
+ @@@@@@@@@@@@@ @@@@@@ /\__/ / | | | (_| | | | __/
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \____/|_| |_|\__,_|_| \___|
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@
+
+ usage: onionshare [-h] [--receive] [--website] [--chat] [--local-only] [--connect-timeout SECONDS] [--config FILENAME] [--persistent FILENAME] [--public]
+ [--auto-start-timer SECONDS] [--auto-stop-timer SECONDS] [--legacy] [--client-auth] [--autostop-sharing] [--data-dir data_dir] [--disable_csp] [-v]
+ [filename [filename ...]]
+
+ positional arguments:
+ filename List of files or folders to share
+
+ optional arguments:
+ -h, --help show this help message and exit
+ --receive Receive files
+ --website Publish website
+ --chat Start chat server
+ --local-only Don't use Tor (only for development)
+ --connect-timeout SECONDS
+ Give up connecting to Tor after a given amount of seconds (default: 120)
+ --config FILENAME Filename of custom global settings
+ --persistent FILENAME Filename of persistent session
+ --public Don't use a password
+ --auto-start-timer SECONDS
+ Start onion service at scheduled time (N seconds from now)
+ --auto-stop-timer SECONDS
+ Stop onion service at schedule time (N seconds from now)
+ --legacy Use legacy address (v2 onion service, not recommended)
+ --client-auth Use client authorization (requires --legacy)
+ --autostop-sharing Share files: Stop sharing after files have been sent
+ --data-dir data_dir Receive files: Save files received to this directory
+ --disable_csp Publish website: Disable Content Security Policy header (allows your website to use third-party resources)
+ -v, --verbose Log OnionShare errors to stdout, and web errors to disk
+
+Legacy addresses
+----------------
+
+OnionShare uses v3 Tor onion services by default. These are modern onion addresses that have 56 characters, for example::
+
+ uf3wmtpbstcupvrrsetrtct7qcmnqvdcsxqzxthxbx2y7tidatxye7id.onion
+
+But it still has support for v2 onion addresses, the old type of onion addresses that have 16 characters, for example::
+
+ lc7j6u55vhrh45eq.onion
+
+OnionShare calls v2 onion addresses "legacy addresses". v3 onion addresses are more secure, and using legacy addresses is not recommended.
+
+To use legacy addresses, before starting a server click "Show advanced settings" in its tab and check the "Use a legacy address (v2 onion service, not recommended)" box. In legacy mode you can optionally enable Tor client authentication. Once you start a server in legacy mode you cannot remove legacy mode in that tab. Instead you must start a separate service in a separate tab.
+
+Tor Project plans to `completely deprecate v2 onion services <https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, 2021, and legacy onion services will soon be removed from OnionShare as well.
diff --git a/desktop/docs/source/conf.py b/desktop/docs/source/conf.py
new file mode 100644
index 00000000..a8d0393e
--- /dev/null
+++ b/desktop/docs/source/conf.py
@@ -0,0 +1,34 @@
+import sphinx_rtd_theme
+import sphinx_intl
+
+
+project = "OnionShare"
+author = copyright = "Micah Lee, et al."
+version = release = "2.3"
+
+extensions = ["sphinx_rtd_theme"]
+templates_path = ["_templates"]
+exclude_patterns = []
+
+languages = [
+ ("Español", "es"),
+ ("English", "en"),
+ ("Українська", "uk"),
+]
+
+versions = ["2.3"]
+
+html_theme = "sphinx_rtd_theme"
+html_logo = "_static/logo.png"
+html_favicon = "_static/favicon.ico"
+html_theme_options = {}
+html_context = {"langs": languages, "versions": versions, "current_version": release}
+html_static_path = ["_static"]
+html_css_files = ["custom.css"]
+html_show_sourcelink = False
+html_show_sphinx = False
+
+# sphinx-intl
+language = "en"
+locale_dirs = ["locale/"]
+gettext_compact = False
diff --git a/desktop/docs/source/develop.rst b/desktop/docs/source/develop.rst
new file mode 100644
index 00000000..2c36f48b
--- /dev/null
+++ b/desktop/docs/source/develop.rst
@@ -0,0 +1,200 @@
+Developing OnionShare
+=====================
+
+.. _collaborating:
+
+Collaborating
+-------------
+
+OnionShare has an open Keybase team that we use to discuss the project, including asking questions, sharing ideas and designs, and making plans for future development. (It's also an easy way to send end-to-end encrypted direct messages to others in the OnionShare community, like OnionShare addresses.) To use Keybase, you need to download the `Keybase app <https://keybase.io/download>`_, make an account, and `join this team <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, click "Join a Team", and type "onionshare".
+
+OnionShare also has a `mailing list <https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers and and designers to discuss the project.
+
+Contributing code
+-----------------
+
+OnionShare source code is in this git repository: https://github.com/micahflee/onionshare
+
+If you'd like to contribute code to OnionShare, it helps to join the Keybase team and ask questions about what you're thinking of working on. You should also review all of the `open issues <https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if there are any that you'd like to develop.
+
+When you're ready to contribute code, open a pull request in the GitHub repository and one of the project maintainers will review it and possible ask questions, request changes, reject it, or merge it into the project.
+
+.. _starting_development:
+
+Starting development
+--------------------
+
+OnionShare is developed in Python. To get started, you should clone the git repository at https://github.com/micahflee/onionshare/ and then consult the ``BUILD.md`` file.
+
+That file contains the technical instructions and commands necessary:
+
+* Install dependencies for your platform
+* Run OnionShare from the source tree, without building a package
+* Building packages
+* Making a release of OnionShare
+
+Debugging tips
+--------------
+
+Verbose mode
+^^^^^^^^^^^^
+
+When developing, it's convenient to run OnionShare from a terminal and add the ``--verbose`` (or ``-v``) flag to the command. This will print a lot of helpful messages to the terminal such as when certain objects are initialized, when events occur (like buttons clicked, settings saved or reloaded), and other debug information. For example::
+
+ $ poetry run ./dev_scripts/onionshare -v test.txt
+ OnionShare 2.3 | https://onionshare.org/
+
+ @@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ___ _
+ @@@@@@ @@@@@@@@@@@@@ / _ \ (_)
+ @@@@ @ @@@@@@@@@@@ | | | |_ __ _ ___ _ __
+ @@@@@@@@ @@@@@@@@@@ | | | | '_ \| |/ _ \| '_ \
+ @@@@@@@@@@@@ @@@@@@@@@@ \ \_/ / | | | | (_) | | | |
+ @@@@@@@@@@@@@@@@ @@@@@@@@@ \___/|_| |_|_|\___/|_| |_|
+ @@@@@@@@@ @@@@@@@@@@@@@@@@ _____ _
+ @@@@@@@@@@ @@@@@@@@@@@@ / ___| |
+ @@@@@@@@@@ @@@@@@@@ \ `--.| |__ __ _ _ __ ___
+ @@@@@@@@@@@ @ @@@@ `--. \ '_ \ / _` | '__/ _ \
+ @@@@@@@@@@@@@ @@@@@@ /\__/ / | | | (_| | | | __/
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \____/|_| |_|\__,_|_| \___|
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@
+
+ [Aug 23 2020 22:37:06] Settings.__init__
+ [Aug 23 2020 22:37:06] Settings.load
+ [Aug 23 2020 22:37:06] Settings.load: Trying to load /home/user/.config/onionshare/onionshare.json
+ [Aug 23 2020 22:37:06] ModeSettings.load: creating /home/user/.config/onionshare/persistent/opacity-joining-sappiness.json
+ [Aug 23 2020 22:37:06] ModeSettings.set: updating opacity-joining-sappiness: general.public = False
+ [Aug 23 2020 22:37:06] ModeSettings.set: updating opacity-joining-sappiness: general.autostart_timer = 0
+ [Aug 23 2020 22:37:06] ModeSettings.set: updating opacity-joining-sappiness: general.autostop_timer = 0
+ [Aug 23 2020 22:37:06] ModeSettings.set: updating opacity-joining-sappiness: general.legacy = False
+ [Aug 23 2020 22:37:06] ModeSettings.set: updating opacity-joining-sappiness: general.client_auth = False
+ [Aug 23 2020 22:37:06] ModeSettings.set: updating opacity-joining-sappiness: share.autostop_sharing = True
+ [Aug 23 2020 22:37:06] Web.__init__: is_gui=False, mode=share
+ [Aug 23 2020 22:37:06] Web.generate_static_url_path: new static_url_path is /static_4kanwd4mt5mcqmpsbptviv3tbq
+ [Aug 23 2020 22:37:06] ShareModeWeb.init
+ [Aug 23 2020 22:37:06] Onion.__init__
+ [Aug 23 2020 22:37:06] Onion.connect
+ [Aug 23 2020 22:37:06] Settings.__init__
+ [Aug 23 2020 22:37:06] Settings.load
+ [Aug 23 2020 22:37:06] Settings.load: Trying to load /home/user/.config/onionshare/onionshare.json
+ [Aug 23 2020 22:37:06] Onion.connect: tor_data_directory_name=/home/user/.config/onionshare/tmp/tmpig895mfl
+ Connecting to the Tor network: 100% - Done
+ [Aug 23 2020 22:37:14] Onion.connect: Connected to tor 0.4.3.6
+ [Aug 23 2020 22:37:14] Settings.load
+ [Aug 23 2020 22:37:14] Settings.load: Trying to load /home/user/.config/onionshare/onionshare.json
+ [Aug 23 2020 22:37:14] Web.generate_password: saved_password=None
+ [Aug 23 2020 22:37:14] Web.generate_password: built random password: "barrel-unseated"
+ [Aug 23 2020 22:37:14] OnionShare.__init__
+ [Aug 23 2020 22:37:14] OnionShare.start_onion_service
+ [Aug 23 2020 22:37:14] Onion.start_onion_service: port=17605
+ [Aug 23 2020 22:37:14] Onion.start_onion_service: key_type=NEW, key_content=ED25519-V3
+ [Aug 23 2020 22:37:16] ModeSettings.set: updating opacity-joining-sappiness: general.service_id = ttxidvsv4pqzrarvtlojk435vver6wgifrw4pucyzgj2hb3qu6pf6fqd
+ [Aug 23 2020 22:37:16] ModeSettings.set: updating opacity-joining-sappiness: onion.private_key = IGzO65Mi9grG7HlLD9ky82O/vWvu3WVByTqCLpZgV0iV2XaSDAqWazNHKkkP18/7jyZZyXwbLo4qOCiYLudlRA==
+ Compressing files.
+ [Aug 23 2020 22:37:16] ShareModeWeb.init
+ [Aug 23 2020 22:37:16] ShareModeWeb.set_file_info_custom
+ [Aug 23 2020 22:37:16] ShareModeWeb.build_zipfile_list
+ [Aug 23 2020 22:37:16] Web.start: port=17605
+ * Running on http://127.0.0.1:17605/ (Press CTRL+C to quit)
+
+ Give this address to the recipient:
+ http://onionshare:barrel-unseated@ttxidvsv4pqzrarvtlojk435vver6wgifrw4pucyzgj2hb3qu6pf6fqd.onion
+
+ Press Ctrl+C to stop the server
+
+You can add your own debug messages by running the ``Common.log`` method from ``onionshare/common.py``. For example::
+
+ common.log('OnionShareGui', 'start_server', 'I ran here')
+
+This can be useful when learning the chain of events that occur when using the application or the value of certain variables before and after they are manipulated.
+
+Local only
+^^^^^^^^^^
+
+Tor is slow, and it's often convenient to skip starting onion services altogether during development. You can do this with the ``--local-only`` flag. For example::
+
+ $ poetry run ./dev_scripts/onionshare --local-only --receive
+ OnionShare 2.3 | https://onionshare.org/
+
+ @@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ___ _
+ @@@@@@ @@@@@@@@@@@@@ / _ \ (_)
+ @@@@ @ @@@@@@@@@@@ | | | |_ __ _ ___ _ __
+ @@@@@@@@ @@@@@@@@@@ | | | | '_ \| |/ _ \| '_ \
+ @@@@@@@@@@@@ @@@@@@@@@@ \ \_/ / | | | | (_) | | | |
+ @@@@@@@@@@@@@@@@ @@@@@@@@@ \___/|_| |_|_|\___/|_| |_|
+ @@@@@@@@@ @@@@@@@@@@@@@@@@ _____ _
+ @@@@@@@@@@ @@@@@@@@@@@@ / ___| |
+ @@@@@@@@@@ @@@@@@@@ \ `--.| |__ __ _ _ __ ___
+ @@@@@@@@@@@ @ @@@@ `--. \ '_ \ / _` | '__/ _ \
+ @@@@@@@@@@@@@ @@@@@@ /\__/ / | | | (_| | | | __/
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \____/|_| |_|\__,_|_| \___|
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@@@@@@@@@@@
+ @@@@@@@@@
+
+ * Running on http://127.0.0.1:17614/ (Press CTRL+C to quit)
+
+ Files sent to you appear in this folder: /home/user/OnionShare
+
+ 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.
+
+ Give this address to the sender:
+ http://onionshare:eject-snack@127.0.0.1:17614
+
+ Press Ctrl+C to stop the server
+
+In this case, you load the URL ``http://onionshare:eject-snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of using Tor Browser.
+
+Debugging in Windows
+^^^^^^^^^^^^^^^^^^^^
+
+If you want to obtain debug output from the ``onionshare-gui.exe`` in Windows, you will need to edit ``install\pyinstaller.spec`` and change ``console=False`` to ``console=True``.
+
+Then rebuild the EXE with ``install\build_exe.bat`` (you may need to comment out the ``signtool`` commands in the ``build_exe.bat`` and the ``onionshare.nsi`` files, as per the ``BUILD.md`` instructions).
+
+After this, you can run ``onionshare-gui.exe -v`` from a command prompt to see the debug output.
+
+Contributing translations
+-------------------------
+
+Most of the OnionShare is translatable. You can help make it easier to use and more familiar and welcoming for people around the globe. The Localization Lab has some `documentation about translating OnionShare <https://wiki.localizationlab.org/index.php/OnionShare>`_.
+
+OnionShare uses Weblate to keep track of translations. You can view the OnionShare project here: https://hosted.weblate.org/projects/onionshare/
+
+To help translate, make a Hosted Weblate account and start contributing to that project.
+
+Suggestions for original English strings
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Sometimes the original English strings could be improved, making them easier to translate into other languages.
+
+If you have suggestions for a better English string, please open a GitHub issue rather than commenting in Weblate. This ensures the upstream developers will definitely see the suggestion, and can potentially modify the string via the usual code review processes.
+
+Status of translations
+^^^^^^^^^^^^^^^^^^^^^^
+Here is the current translation status. If you want start a translation in a language not to be found here, please write us to the mailing list: onionshare-dev@lists.riseup.net
+
+.. image:: https://hosted.weblate.org/widgets/onionshare/-/translations/multi-auto.svg
+
+Translate the .desktop file
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can also translate the ``install/onionshare.desktop`` file.
+
+Duplicate the line that begins with ``Comment=``. Add the language code to the new line so it becomes ``Comment[lang]=`` (lang should be your language). You can see what language codes are used for translation by looking at the ``share/locale/*.json`` filenames::
+
+ Comment=Original string
+ Comment[da]=Danish translation of the original string
+
+Do the same for other untranslated lines. \ No newline at end of file
diff --git a/desktop/docs/source/features.rst b/desktop/docs/source/features.rst
new file mode 100644
index 00000000..07ff7d21
--- /dev/null
+++ b/desktop/docs/source/features.rst
@@ -0,0 +1,144 @@
+.. _how_it_works:
+
+How OnionShare works
+====================
+
+OnionShare works by starting web servers locally on your own computer and making them accessible to other people as `Tor <https://www.torproject.org/>`_ `onion services <https://community.torproject.org/onion-services/>`_.
+
+By default, OnionShare web addresses are protected with a random password. A typical OnionShare address might look something like this::
+
+ http://onionshare:constrict-purity@by4im3ir5nsvygprmjq74xwplrkdgt44qmeapxawwikxacmr3dqzyjad.onion
+
+You're responsible for securely sharing that URL using a communication channel of your choice like in an encrypted chat message, or using something less secure like a Twitter or Facebook message, depending on your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_.
+
+The people who you send the URL to must then copy and paste it into `Tor Browser <https://www.torproject.org/>`_ to access the OnionShare service.
+
+With OnionShare, *your own computer is the web server*. If you run OnionShare on your laptop to send someone files, and then suspend your laptop before the files have been downloaded, the service will not be available until your laptop is unsuspended and connected to the internet again. OnionShare works best when working with people in real-time.
+
+Because your own computer is the web server, *no third party can access anything that happens in OnionShare*, not even the developers of OnionShare. It's completely private. And because OnionShare is based on Tor onion services too, it also protects your anonymity. See the :doc:`security design </security>` for more information.
+
+Share Files
+-----------
+
+You can use OnionShare to securely and anonymously send files and folders to people. Just open a share tab, drag in the files and folders you wish to share, and click "Start sharing".
+
+.. image:: _static/screenshots/share.png
+
+After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing.
+
+.. image:: _static/screenshots/share-files.png
+
+By default, as soon as someone finishes downloading your files, OnionShare will automatically stop the server, completely removing the website from the internet. If you want to allow multiple people to download these files, uncheck the "Stop sharing after files have been sent (uncheck to allow downloading individual files)" box.
+
+Also, if you uncheck this box, people will be able to download individual files that you share rather than a single compressed version of all of the files.
+
+When you're ready to share, click the "Start sharing" button. You can always click "Stop sharing", or quit OnionShare, to immediate take the website down. You can also click the up arrow icon in the top-right corner to show the history and progress of people downloading files from you.
+
+.. image:: _static/screenshots/share-sharing.png
+
+Now that you have a website that's sharing files, copy the address and send it to the person you want to receive the files. If the files need to stay secure, you should use an encrypted messaging app.
+
+That person then must load the address in Tor Browser. After logging in with the random password that's included in the web address, they will be able to download the files directly from your computer by clicking the "Download Files" link in the corner.
+
+.. image:: _static/screenshots/share-torbrowser.png
+
+Receive Files
+-------------
+
+You can use OnionShare to let people anonymously upload files directly to your computer, essentially turning it into an anonymous dropbox. Open a receive tab, choose where you want files to get downloaded and other settings, and then click "Start Receive Mode".
+
+.. image:: _static/screenshots/receive.png
+
+This will start the OnionShare service. Anyone that loads this address in Tor Browser will be able to upload files to your computer.
+
+.. image:: _static/screenshots/receive-sharing.png
+
+You can also click the down arrow icon in the top-right corner to show the history and progress of people sending files to you.
+
+Here is what it looks like for someone sending you files.
+
+.. image:: _static/screenshots/receive-torbrowser.png
+
+When someone uploads files to your receive service, by default they get saved to a folder called ``OnionShare`` in your home folder on your computer, and they get automatically organized into separate subfolders based on the time that the files get uploaded.
+
+Setting up an OnionShare receiving service is useful for journalists and others that need to securely accept documents from anonymous sources. When used in this way, OnionShare is sort of like a lightweight, simpler, not quite as secure version of `SecureDrop <https://securedrop.org/>`_, the whistleblower submission system.
+
+Use at your own risk
+^^^^^^^^^^^^^^^^^^^^
+
+Just like with malicious email attachments, it's possible that someone could try to hack your computer by uploading a malicious file to your OnionShare service. OnionShare does not add any safety mechanisms to protect your system from malicious files, so use at your own risk.
+
+If you receive an Office document or a PDF through OnionShare, you can convert these documents into PDFs that you know are safe to open using `Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself when opening untrusted documents by opening them in `Tails <https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ disposable VM.
+
+Tips for running a receive service
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you want to host your own anonymous dropbox using OnionShare, it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis.
+
+If you intend on advertising the OnionShare address on your website or social media profiles, then you should save the tab (see :ref:`save_tabs`) and run it as a public service (see :ref:`disable_passwords`).
+
+Host a Website
+--------------
+
+You can use OnionShare to host a static HTML website with just a click. Just open a website tab, drag in the files and folders that make up the static website, and click when you're ready click "Start sharing".
+
+.. image:: _static/screenshots/website.png
+
+If you add an ``index.html`` file, when someone loads your website it will render this page. You should also include any other HTML files, CSS files, JavaScript files, and images that make up the website. (Note that OnionShare only supports hosting *static* websites. It can't host websites that execute code or use databases. So you can't, for example, use WordPress.)
+
+If you don't have an ``index.html`` file, then it will show a directory listing instead, and people who load it can look through the files and download them.
+
+After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing.
+
+.. image:: _static/screenshots/website-files.png
+
+Content Security Policy
+^^^^^^^^^^^^^^^^^^^^^^^
+
+By default OnionShare will help secure your website by setting a strict `Content Security Police <https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However this will prevent third-party content from loading inside the web page.
+
+If you want to load content from third-party websites, like assets or JavaScript libraries from CDNs, then you must check the "Disable Content Security Policy header (allows your website to use third-party resources)" box before starting the service.
+
+Tips for running a website service
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you want to host a long-term website using OnionShare (that isn't just to quickly show someone something), it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis. You should also save the tab (see :ref:`save_tabs`) so that you can resume the website with the same address if you close OnionShare and re-open it later.
+
+If your website is intended to be viewed by the public, you should run it as a public service (see :ref:`disable_passwords`).
+
+Chat Anonymously
+----------------
+
+You can use OnionShare to set up a completely anonymous, secure chat room that doesn't log anything or leave any traces. Just open a chat tab and click "Start chat server".
+
+.. image:: _static/screenshots/chat.png
+
+After you start the server, copy the OnionShare address and send it to the people who will join this anonymous chat room. If it's important to limit exactly who can join, you should use an encrypted messaging app to send the OnionShare address.
+
+.. image:: _static/screenshots/chat-sharing.png
+
+People can join the chat room by loading its OnionShare address in Tor Browser. The chat room requires JavasScript, so everyone who wants to participate must set their security level to Standard or Safer instead of Safest.
+
+When someone joins the chat room they get assigned a random name. They can change their name by typing a new name in the box in the left panel and pressing enter. No chat history will get displayed at all, even if others were already chatting in the room, because the chat history isn't saved anywhere.
+
+.. image:: _static/screenshots/chat-torbrowser.png
+
+In an OnionShare chat room, everyone is anonymous. Anyone can change their name to anything, and there is no way to confirm anyone's identity.
+
+However, if you create an OnionShare chat room and securely send the address only to a small group of trusted friends using encrypted messages, then you can be reasonably confident that the people who join the chat room are your friends.
+
+How is this useful?
+^^^^^^^^^^^^^^^^^^^
+
+If you need to already be using an encrypted messaging app, what's the point of an OnionShare chat room to begin with? It leaves less traces.
+
+If you send a message to a Signal group, for example, a copy of your message ends up on each device (the phones and computers, if they set up Signal Desktop) of each member of the group. Even if disappearing messages is enabled, it's hard to confirm that all copies of the messages were actually deleted from all devices, and from any other places (like notifications databases) they may have been saved to. OnionShare chat rooms don't store any messages anywhere, so this isn't a problem.
+
+OnionShare chat rooms can also be useful for anonymous people wanting to chat securely with someone without needing to create any accounts. For example, a source can send an OnionShare address to a journalist using a disposable email address, and then wait for the journalist to join the chat room, all without compromosing their anonymity.
+
+How does the encryption work?
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Because OnionShare relies on Tor onion services, connections between Tor Browser and OnionShare are all end-to-end encrypted (E2EE). When someone posts a message to an OnionShare chat room, they send it to the server through the E2EE onion connection, which then sends it to all other members of the chat room using WebSockets, through their E2EE onion connections.
+
+OnionShare doesn't implement any chat encryption on its own. It relies on the Tor onion service's encryption instead. \ No newline at end of file
diff --git a/desktop/docs/source/help.rst b/desktop/docs/source/help.rst
new file mode 100644
index 00000000..3c138d6a
--- /dev/null
+++ b/desktop/docs/source/help.rst
@@ -0,0 +1,24 @@
+Getting Help
+============
+
+If you need help with OnionShare, please follow the instructions below.
+
+Read this website
+-----------------
+
+This website is full of instructions on how to use OnionShare. Look through all of the sections first to see if it answers your questions.
+
+Check the GitHub issues
+-----------------------
+
+If you can't find a solution in this website, please check the `GitHub issues <https://github.com/micahflee/onionshare/issues>`_. It's possible that someone else has encountered the same problem and has either raised it with the developers, or maybe even posted a solution.
+
+Submit an issue yourself
+------------------------
+
+If you can't find a solution to your problem, or you wish to ask a question or suggest a new feature, please `submit an issue <https://github.com/micahflee/onionshare/issues/new>`_. This requires `creating an GitHub account <https://help.github.com/articles/signing-up-for-a-new-github-account/>`_.
+
+Join our Keybase team
+---------------------
+
+See :ref:`collaborating` for instructions on how to join our Keybase team that we use to discuss the project. \ No newline at end of file
diff --git a/desktop/docs/source/index.rst b/desktop/docs/source/index.rst
new file mode 100644
index 00000000..55d874e3
--- /dev/null
+++ b/desktop/docs/source/index.rst
@@ -0,0 +1,17 @@
+OnionShare's documentation
+==========================
+
+.. image:: _static/screenshots/tabs.png
+
+OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network.
+
+.. toctree::
+ :maxdepth: 2
+
+ install
+ features
+ advanced
+ tor
+ help
+ security
+ develop
diff --git a/desktop/docs/source/install.rst b/desktop/docs/source/install.rst
new file mode 100644
index 00000000..a8383e35
--- /dev/null
+++ b/desktop/docs/source/install.rst
@@ -0,0 +1,66 @@
+Installation
+============
+
+Install on Windows or macOS
+---------------------------
+
+You can download OnionShare for Windows and macOS from the `OnionShare website <https://onionshare.org/>`_.
+
+For added security, see :ref:`verifying_sigs`.
+
+.. _linux:
+
+Install in Linux with Flatpak
+-----------------------------
+
+There are various ways to install OnionShare for Linux, but the recommended way is to use the Flatpak package. Flatpak ensures that you'll always use the most latest dependencies and run OnionShare inside of a sandbox.
+
+Make sure you have ``flatpak`` installed and the Flathub repository added by following `these instructions <https://flatpak.org/setup/>`_ for your Linux distribution.
+
+Then install OnionShare from Flathub by following `the instructions here <https://flathub.org/apps/details/org.onionshare.OnionShare>`_.
+
+.. _verifying_sigs:
+
+Verifying PGP signatures
+------------------------
+
+You can verify that the Windows, macOS, or source package you download is legitimate and hasn't been tampered with by verifying its PGP signature. For Windows and macOS, this step is optional and provides defense in depth: the installers also include their operating system-specific signatures, and you can just rely on those alone if you'd like.
+
+Signing key
+^^^^^^^^^^^
+
+Windows, macOS, and source packaged are signed by Micah Lee, the core developer, using his PGP public key with fingerprint ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_.
+
+In order to verify signatures, you must have GnuPG installed. For macOS you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows you probably want `Gpg4win <https://www.gpg4win.org/>`_.
+
+Signatures
+^^^^^^^^^^
+
+You can find the signatures (``.asc`` files), as well as Windows, macOS, and source packages, at https://onionshare.org/dist/ in the folders named for each version of OnionShare. You can also find them on the `GitHub Releases page <https://github.com/micahflee/onionshare/releases>`_.
+
+Verifying
+^^^^^^^^^
+
+Once you have imported Micah's public key into your GnuPG keychain, downloaded the binary, and downloaded the ``.asc`` signature, you can verify the binary for macOS in terminal like this::
+
+ gpg --verify OnionShare-2.2.pkg.asc OnionShare-2.2.pkg
+
+Or for Windows in a command prompt like this::
+
+ gpg.exe --verify onionshare-2.2-setup.exe.asc onionshare-2.2-setup.exe
+
+An expected output might look like this::
+
+ gpg: Signature made Tue 19 Feb 2019 09:25:28 AM AEDT using RSA key ID CD994F73
+ gpg: Good signature from "Micah Lee <micah@micahflee.com>"
+ gpg: aka "Micah Lee <micah@firstlook.org>"
+ gpg: aka "Micah Lee <micah@freedom.press>"
+ gpg: aka "Micah Lee <micah.lee@firstlook.org>"
+ gpg: aka "Micah Lee <micah.lee@theintercept.com>"
+ gpg: WARNING: This key is not certified with a trusted signature!
+ gpg: There is no indication that the signature belongs to the owner.
+ Primary key fingerprint: 927F 419D 7EC8 2C2F 149C 1BD1 403C 2657 CD99 4F73
+
+If you don't see 'Good signature from', then there might be a problem with the integrity of the file (malicious or otherwise), and you perhaps should not install the package. (The WARNING shown above, is not a problem with the package: it only means you have not defined any level of 'trust' regarding Micah's PGP key itself.)
+
+If you want to learn more about verifying PGP signatures, guides for `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and the `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html.en>`_ may be helpful. \ No newline at end of file
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/ar/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/develop.po b/desktop/docs/source/locale/ar/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/features.po b/desktop/docs/source/locale/ar/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/help.po b/desktop/docs/source/locale/ar/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/index.po b/desktop/docs/source/locale/ar/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/install.po b/desktop/docs/source/locale/ar/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/security.po b/desktop/docs/source/locale/ar/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/ar/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ar/LC_MESSAGES/tor.po b/desktop/docs/source/locale/ar/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/ar/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/ca/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/develop.po b/desktop/docs/source/locale/ca/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/features.po b/desktop/docs/source/locale/ca/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/help.po b/desktop/docs/source/locale/ca/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/index.po b/desktop/docs/source/locale/ca/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/install.po b/desktop/docs/source/locale/ca/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/security.po b/desktop/docs/source/locale/ca/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/ca/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ca/LC_MESSAGES/tor.po b/desktop/docs/source/locale/ca/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/ca/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/da/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/develop.po b/desktop/docs/source/locale/da/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/features.po b/desktop/docs/source/locale/da/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/help.po b/desktop/docs/source/locale/da/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/index.po b/desktop/docs/source/locale/da/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/install.po b/desktop/docs/source/locale/da/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/security.po b/desktop/docs/source/locale/da/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/da/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/da/LC_MESSAGES/tor.po b/desktop/docs/source/locale/da/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/da/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/de/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/develop.po b/desktop/docs/source/locale/de/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/features.po b/desktop/docs/source/locale/de/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/help.po b/desktop/docs/source/locale/de/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/index.po b/desktop/docs/source/locale/de/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/install.po b/desktop/docs/source/locale/de/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/security.po b/desktop/docs/source/locale/de/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/de/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/de/LC_MESSAGES/tor.po b/desktop/docs/source/locale/de/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/de/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/el/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/develop.po b/desktop/docs/source/locale/el/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/features.po b/desktop/docs/source/locale/el/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/help.po b/desktop/docs/source/locale/el/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/index.po b/desktop/docs/source/locale/el/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/install.po b/desktop/docs/source/locale/el/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/security.po b/desktop/docs/source/locale/el/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/el/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/el/LC_MESSAGES/tor.po b/desktop/docs/source/locale/el/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/el/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/en/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/develop.po b/desktop/docs/source/locale/en/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/features.po b/desktop/docs/source/locale/en/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/help.po b/desktop/docs/source/locale/en/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/index.po b/desktop/docs/source/locale/en/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/install.po b/desktop/docs/source/locale/en/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/security.po b/desktop/docs/source/locale/en/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/en/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/en/LC_MESSAGES/tor.po b/desktop/docs/source/locale/en/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/en/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/es/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..ed59fb86
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/advanced.po
@@ -0,0 +1,304 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: 2020-09-22 13:39+0000\n"
+"Last-Translator: Zuhualime Akoochimoya <zakooch@protonmail.ch>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr "Uso avanzado"
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr "Guardar pestañas"
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+"Por defecto, todo es temporario en OnionShare. Cuando cierras una pestaña"
+" OnionShare su dirección no existe más, y no se puede usar de nuevo. Pero"
+" a veces podrías querer que un servicio OnionShare sea persistente. Por "
+"ejemplo, esto sería útil si quieres alojar un sitio web que tenga la "
+"misma URL cuando reinicies tu computadora."
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+"Para hacer una pestaña persistente, marca la casilla \"Guardar esta "
+"pestaña, y abrirla automáticamente cuando abra OnionShare\" antes de "
+"iniciar el servidor. Cuando se guarda una pestaña, un ícono púrpura de un"
+" pin aparece a la izquierda de su estado de servidor."
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+"Cuando sales de OnionShare y lo vuelves a abrir, tus pestañas guardadas "
+"se iniciarán abiertas. Tendrás que arrancar cada servicio manualmente, "
+"pero cuando lo hagas, se iniciarán con la misma dirección OnionShare, y "
+"con la misma contraseña."
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+"Si guardas una pestaña, una copia de la clave secreta del servicio onion "
+"de la misma se almacenará en tu computadora con tus ajustes de "
+"OnionShare."
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr "Deshabilitar contraseñas"
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+"Por defecto, todos los servicios OnionShare están protegidos con el "
+"nombre de usuario `onionshare` y una contraseña generada aleatoriamente. "
+"Si alguien intenta adivinar 20 veces la contraseña, y es incorrecta, tu "
+"servicio onion se detiene automáticamente para prevenir un ataque de "
+"fuerza bruta al servicio OnionShare."
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+"Pero a veces podrías querer que tu servicio OnionShare sea accesible al "
+"público. Por ejemplo, si quieres establecer un servicio OnionShare de "
+"recepción con el fin de que el público pueda enviarte archivos segura y "
+"anónimamente. En este caso, es mejor deshabilitar del todo la contraseña."
+" Si no haces esto, alguien puede forzar la detención de tu servidor "
+"haciendo solo 20 suposiciones incorrectas de tu contraseña, aún si conoce"
+" la correcta."
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+"Para deshabilitar la contraseña para cualquier pestaña, solo marca la "
+"casilla \"No usar una contraseña\" antes de iniciar el servidor. Entonces"
+" será público y no tendrá contraseña."
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr "Tiempos programados"
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+"OnionShare soporta la programación exacta de cuándo un servicio debiera "
+"arrancar y detenerse. Antes de iniciar el servidor, haz clic en \"Mostrar"
+" ajustes avanzados\" en su pestaña, y luego marca las casillas próximas a"
+" \"Iniciar el servicio onion en el tiempo programado\", \"Detener el "
+"servicio onion en el tiempo programado\", o ambas, y establece las fechas"
+" y horas deseadas."
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+"Si programaste un servicio para arrancar en el futuro, cuando hagas clic "
+"en el botón de inicio verás un temporizador contando regresivamente hasta"
+" el arranque. Si lo hiciste para detenerse en el futuro, luego que sea "
+"arrancado verás un temporizador contando regresivamente hasta el momento "
+"en que se detendrá automáticamente."
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+"**Programar un servicio OnionShare para iniciarse automáticamente puede "
+"ser usado como pulsador de hombre muerto**, en donde tu servicio se hará "
+"público en un momento dado en el futuro si te pasa algo. Si no te pasa "
+"nada, puedes cancelarlo antes de su inicio programado."
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+"**Programar un servicio OnionShare para detenerse automáticamente puede "
+"ser útil para limitar la exposición**, como cuando quieres compartir "
+"documentos secretos mientras te aseguras que no estarán disponibles en "
+"Internet por más de unos pocos días."
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr "Interfaz de línea de comando"
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr "Además de su interfaz gráfico, OnionShare tiene una de línea de comando."
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr "Linux"
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+"Lamentablemente, si instalaste OnionShare usando el paquete Flatpak la "
+"interfaz de línea de comando no está soportada."
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+"Si instalaste OnionShare usando un paquete del sistema operativo, puedes "
+"ejecutar ``onionshare`` desde una terminal."
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr "macOS"
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+"Haz un vínculo simbólico al ejecutable OnionShare de línea de comando de "
+"esta manera::"
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr "Ahora puedes ejecutar ``onionshare`` desde una terminal."
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr "Windows"
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr "La interfaz de línea de comando no está soportada en Windows."
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+"Si quieres usarla igualmente, puedes establecer un entorno Windows de "
+"desarrollo (mira :ref:`starting_development`), y luego ejecutar esto en "
+"una ventana de línea de comando::"
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr "Uso"
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+"Puedes ver la documentación de línea de comando ejecutando ``onionshare "
+"--help``::"
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr "Direcciones antiguas"
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+"OnionShare usa servicios onion Tor v3 por defecto. Estas son direcciones "
+"onion modernas que tienen 56 caracteres, por ejemplo::"
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+"Pero aún tiene soporte para direcciones onion v2, el viejo tipo de "
+"direcciones onion que tienen 16 caracteres, por ejemplo::"
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+"OnionShare llama a las direcciones onion v2 \"direcciones antiguas\". Las"
+" direcciones onion v3 son más seguras, y usar direcciones antiguas no "
+"está recomendado."
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+"Para usar direcciones antiguas, antes de iniciar un servidor haz clic en "
+"\"Mostrar ajustes avanzados\" en su pestaña, y marca la casilla \"Usar "
+"una dirección antigua (servicio onion v2, no recomendado)\". En el modo "
+"antiguo, puedes habilitar opcionalmente la autenticación de cliente Tor. "
+"Una vez que inicias un servidor en modo antiguo no puedes cambiarlo en "
+"esa pestaña. Para cambiarlo debes arrancar un servicio separado en una "
+"pestaña separada."
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+"El Tor Project planea `descontinuar completamente los servicios onion v2 "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ el 15 de octubre "
+"de 2021, y los servicios onion antiguos pronto se removerán de OnionShare"
+" también."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/develop.po b/desktop/docs/source/locale/es/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..779264dc
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/develop.po
@@ -0,0 +1,325 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: 2020-09-18 06:51+0000\n"
+"Last-Translator: Zuhualime Akoochimoya <zakooch@protonmail.ch>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr "Desarrollando OnionShare"
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr "Colaborando"
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+"OnionShare tiene un equipo Keybase abierto que usamos para discutir el "
+"proyecto, incluyendo hacer preguntas, compartir ideas y diseños, y hacer "
+"planes para desarrollo futuro. (También es una manera fácil de enviar "
+"mensajes directos cifrados de extremo a extremo a otros en la comunidad "
+"OnionShare, como direcciones OnionShare). Para usar Keybase, necesitas "
+"descargar la `aplicación Keybase <https://keybase.io/download>`_, crear "
+"una cuenta, y `unirte a este equipo "
+"<https://keybase.io/team/onionshare>`_. Dentro de la aplicación, vé hacia"
+" Equipos, haz clic en \"Unirte a un Equipo\", y tipea \"onionshare\"."
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+"OnionShare también tiene una `lista de correo "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ para "
+"desarrolladores y diseñafores para discutir el proyecto."
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr "Contribuyendo código"
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+"El código fuente de OnionShare está en este repositorio git: "
+"https://github.com/micahflee/onionshare"
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+"Si quisieras contribuir código a OnionShare, ayuda unirse al equipo "
+"Keybase y hacer preguntas acerca de en qué estás pensando trabajar. "
+"También debieras revisar todos las `cuestiones abiertas "
+"<https://github.com/micahflee/onionshare/issues>`_ en GitHub para ver si "
+"hay alguna a la cual te gustaría desarrollar."
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+"Cuando estés listo para contribuir código, abre una solicitud de tiraje "
+"en el repositorio GitHub, y uno de los mantenedores del proyecto la "
+"revisará, y posiblemente haga preguntas, solicite cambios, la rechace o "
+"la incorpore dentro del proyecto."
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr "Iniciando el desarrollo"
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+"OnionShare está desarrollado en Python. Para empezar, debieras clonar el "
+"repositorio git en https://github.com/micahflee/onionshare/, y consultar "
+"luego al archivo ``BUILD.md``."
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr "Ese archivo contiene las instrucciones técnicas y los comandos necesarios:"
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr "Instala las dependencias para tu plataforma"
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr "Ejecuta OnionShare desde el árbol fuente, sin construir un paquete"
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr "Construyendo paquetes"
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr "Haciendo un lanzamiento de OnionShare"
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr "Consejos para depuración"
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr "Modo detallado"
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+"Durante el desarrollo, es conveniente ejecutar OnionShare desde un "
+"terminal y agregar el modificador ``--verbose`` (o ``-v``) al comando. "
+"Esto imprimirá un montón de mensajes útiles al terminal, tales como "
+"cuándo son inicializados ciertos objetos, cuándo ocurren eventos (como "
+"botones cliqueados, ajustes guardados o recargados), y otra información "
+"de depuración. Por ejemplo:"
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+"Puedes agregar tus propios mensajes de depuración ejecutando el método "
+"``Common.log`` desde ``onionshare/common.py``. Por ejemplo:"
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+"Esto puede ser útil para conocer la cadena de eventos que ocurre cuando "
+"usas la aplicación o el valor de ciertas variables antes y después de que"
+" sean manipuladas."
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr "Solo local"
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+"Tor es lento, y a menudo es conveniente saltear el inicio de servicios "
+"onion sin excepción durante el desarrollo. Puedes hacer esto con el "
+"modoficador ``--local-only``. Por ejemplo:"
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+"En este caso, cargas el URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` en un navegador web normal como Firefox, en vez "
+"de usar al Navegador Tor."
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr "Depurando en Windows"
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+"Si quieres obtener la salida de depuración del ``onionshare-gui.exe`` en "
+"Windows, nececitarás editar ``install\\pyinstaller.spec`` y cambiar "
+"``console=False`` a ``console=True``."
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+"Luego, recompilar el EXE con ``install\\build_exe.bat`` (podrías "
+"necesitar comentar los comandos ``signtool`` en los archivos "
+"``build_exe.bat`` y ``onionshare.nsi``, según las instrucciones en "
+"``BUILD.md``)."
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+"Después de esto, puedes ejecutar ``onionshare-gui.exe -v`` desde una "
+"ventana de línea de comando para ver la salida de depuración."
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr "Contribuyendo traducciones"
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+"La mayor parte de OnionShare es traducible. Puedes ayudar a hacerlo más "
+"fácil de usar y más familiar y acogedor para las personas alrededor del "
+"globo. Localization Lab tiene alguna `documentación acerca de traducir "
+"OnionShare <https://wiki.localizationlab.org/index.php/OnionShare>`_."
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+"OnionShare usa Weblate para llevar un registro de las traducciones. "
+"Puedes ver el proyecto OnionShare aquí: "
+"https://hosted.weblate.org/projects/onionshare/"
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+"Para ayudar a traducir, crea una cuenta Hosted Weblate y empieza a "
+"contribuir a ese proyecto."
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr "Sugerencias para cadenas de caracteres en el original en Inglés"
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+"A veces las cadenas de caracteres en el original en Inglés podrían ser "
+"mejoradas, haciéndolas más fáciles de traducir a otros lenguajes."
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+"Si tienes sugerencias para una mejor cadena de caracteres en Inglés, por "
+"favor abre una cuestión en GitHub en vez de comentar en Weblate. Esto "
+"asegura que los desarrolladores en el nivel superior definitivamente "
+"verán la sugerencia, y pueden modificarla potencialmente a través de los "
+"procesos usuales de revisión de código."
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr "Estado de las traducciones"
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+"Aquí está el estado actual de las traducciones. Si quieres empezar una "
+"traducción en un lenguaje que no se encuentra aquí, por favor escríbenos "
+"a la lista de correo: onionshare-dev@lists.riseup.net"
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr "Traduce el archivo .desktop"
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr "También puedes traducir el archivo ``install/onionshare.desktop``."
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+"Duplica la línea que empieza con ``Comment=``. Agrega el código de "
+"lenguaje a la nueva línea, que entonces se transforma en "
+"``Comment[lang]=`` (lang debiera ser tu lenguaje). Puedes ver qué códigos"
+" de lenguaje son usados para traducción mirando a los nombres de archivos"
+" en ``share/locale/*.json``:"
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr "Haz lo mismo para otras líneas no traducidas."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/features.po b/desktop/docs/source/locale/es/LC_MESSAGES/features.po
new file mode 100644
index 00000000..4e2ff5b0
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/features.po
@@ -0,0 +1,399 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-17 05:25+0000\n"
+"Last-Translator: Zuhualime Akoochimoya <zakooch@protonmail.ch>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr "Cómo funciona OnionShare"
+
+#: ../../source/features.rst:6
+msgid "OnionShare works by starting web servers locally on your own computer and making them accessible to other people as `Tor <https://www.torproject.org/>`_ `onion services <https://community.torproject.org/onion-services/>`_."
+msgstr ""
+"OnionShare funciona iniciando servidores web localmente en tu propia "
+"computadora, y haciéndolos accesibles a otras peesonas como `servicios onion "
+"<https://community.torproject.org/onion-services/>`_`Tor <https://www."
+"torproject.org/>`_ ."
+
+#: ../../source/features.rst:8
+msgid "By default, OnionShare web addresses are protected with a random password. A typical OnionShare address might look something like this::"
+msgstr ""
+"Por defecto, las direcciones web OnionShare están protegidas con una "
+"contraseña aleatoria. Una dirección OnionShare típica podría parecerse a "
+"algo como esto:"
+
+#: ../../source/features.rst:12
+msgid "You're responsible for securely sharing that URL using a communication channel of your choice like in an encrypted chat message, or using something less secure like a Twitter or Facebook message, depending on your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+"Tu eres responsable por compartir en forma segura ese URL, usando un canal "
+"de comunicación de tu elección, como un mensaje cifrado en una charla, o "
+"usando algo menos seguro, como un mensaje de Twitter o Facebook, dependiendo "
+"de tu `modelo de amenaza <https://ssd.eff.org/en/module/your-security-"
+"plan>`_."
+
+#: ../../source/features.rst:14
+msgid "The people who you send the URL to must then copy and paste it into `Tor Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+"Luego , las personas a quienes les envías el URL deben copiarlo y pegarlo "
+"dentro del `Navegador Tor <https://www.torproject.org/>`_ para acceder al "
+"servicio OnionShare."
+
+#: ../../source/features.rst:16
+msgid "With OnionShare, *your own computer is the web server*. If you run OnionShare on your laptop to send someone files, and then suspend your laptop before the files have been downloaded, the service will not be available until your laptop is unsuspended and connected to the internet again. OnionShare works best when working with people in real-time."
+msgstr ""
+"Con OnionShare, *tu propia computadora es el servidor web*. Si ejecutas "
+"OnionShare en tu portátil para enviarle archivos a alguien, y luego la "
+"suspendes antes de que los archivos hayan sido descargados, el servicio no "
+"estará disponible hasta que finalice la suspensión en tu portátil y se "
+"conecte de nuevo a Internet. OnionShare funciona mejor cuando trabaja con "
+"personas en tiempo real."
+
+#: ../../source/features.rst:18
+msgid "Because your own computer is the web server, *no third party can access anything that happens in OnionShare*, not even the developers of OnionShare. It's completely private. And because OnionShare is based on Tor onion services too, it also protects your anonymity. See the :doc:`security design </security>` for more information."
+msgstr ""
+"Como tu propia computadora es el servidor web, *ningún tercero puede acceder "
+"a nada de lo que pasa en OnionShare*, ni siquiera sus desarrolladores. Es "
+"completamente privado. Y como OnionShare también está basado en los "
+"servicios onion de Tor, también protege tu anonimato. Mira el :doc:`diseño "
+"de seguridad </security>` para más información."
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr "Comparte archivos"
+
+#: ../../source/features.rst:23
+msgid "You can use OnionShare to securely and anonymously send files and folders to people. Just open a share tab, drag in the files and folders you wish to share, and click \"Start sharing\"."
+msgstr ""
+"Puedes usar OnionShare para enviar archivos y carpetas a las personas en "
+"forma segura y anónima. Solo abre una pestaña de compartición, arrastra "
+"hacia ella los archivos y carpetas que deseas compartir, y haz clic en "
+"\"Iniciar compartición\"."
+
+#: ../../source/features.rst:27
+#: ../../source/features.rst:91
+msgid "After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing."
+msgstr ""
+"Después que agregas archivos, verás algunas configuraciones. Asegúrate de "
+"elegir primero los ajustes en los que estás interesado antes de empezar a "
+"compartir."
+
+#: ../../source/features.rst:31
+msgid "By default, as soon as someone finishes downloading your files, OnionShare will automatically stop the server, completely removing the website from the internet. If you want to allow multiple people to download these files, uncheck the \"Stop sharing after files have been sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+"Por defecto, tan pronto como alguien termine de descargar tus archivos, "
+"OnionShare detendrá automáticamente al servidor, removiendo completamente al "
+"sitio web de Internet. Si quieres permitir que múltiples personas descarguen "
+"estos archivos, desmarca la casilla \"Detener la compartición luego que los "
+"archivos hayan sido enviados (desmarca para permitir la descarga de archivos "
+"individuales)\"."
+
+#: ../../source/features.rst:33
+msgid "Also, if you uncheck this box, people will be able to download individual files that you share rather than a single compressed version of all of the files."
+msgstr ""
+"Además, si desmarcas esta casilla, las personas serán capaces de descargar "
+"los archivos individuales que compartas, en vez de una única versión "
+"comprimida de todos ellos."
+
+#: ../../source/features.rst:35
+msgid "When you're ready to share, click the \"Start sharing\" button. You can always click \"Stop sharing\", or quit OnionShare, to immediate take the website down. You can also click the up arrow icon in the top-right corner to show the history and progress of people downloading files from you."
+msgstr ""
+"Cuando estés listo para compartir, haz clic en el botón \"Iniciar "
+"compartición\". Siempre puedes hacer clic en \"Detener compartición\", o "
+"salir de OnionShare, para hacer caer al sitio web inmediatamente. También "
+"puedes hacer clic en el ícono de flecha hacia arriba en la esquina superior "
+"derecha para mostrar el historial y el progreso de las personas que están "
+"descargando archivos."
+
+#: ../../source/features.rst:39
+msgid "Now that you have a website that's sharing files, copy the address and send it to the person you want to receive the files. If the files need to stay secure, you should use an encrypted messaging app."
+msgstr ""
+"Ahora que tienes un sitio web que está compartiendo archivos, copia la "
+"dirección y envíasela a la persona que quieres que los reciba. Si estos "
+"necesitan permanecer seguros, deberías usar una aplicación de mensajería "
+"cifrada."
+
+#: ../../source/features.rst:41
+msgid "That person then must load the address in Tor Browser. After logging in with the random password that's included in the web address, they will be able to download the files directly from your computer by clicking the \"Download Files\" link in the corner."
+msgstr ""
+"Esa persona debe cargar luego la dirección en el Navegador Tor. Después de "
+"iniciar sesión con la contraseña aleatoria incluída en la dirección web, "
+"serán capaces de descargar los archivos directamente desde tu computadora "
+"haciendo clic en el vínculo \"Descargar Archivos\" en la esquina."
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr "Recibir Archivos"
+
+#: ../../source/features.rst:48
+msgid "You can use OnionShare to let people anonymously upload files directly to your computer, essentially turning it into an anonymous dropbox. Open a receive tab, choose where you want files to get downloaded and other settings, and then click \"Start Receive Mode\"."
+msgstr ""
+"Puedes usar OnionShare para permitir a las personas la subida anónima de "
+"archivos directamente a tu computadora, convirtiéndola esencialmente en un "
+"buzón anónimo. Abre una pestaña de recepción, elige dónde quieres que los "
+"archivos sean descargados y otros ajustes, y luego haz clic en \"Iniciar "
+"Modo de Recepción\"."
+
+#: ../../source/features.rst:52
+msgid "This will start the OnionShare service. Anyone that loads this address in Tor Browser will be able to upload files to your computer."
+msgstr ""
+"Esto iniciará al servicio OnionShare. Cualquiera que cargue esta dirección "
+"en el Navegador Tor será capaz de subir archivos a tu computadora."
+
+#: ../../source/features.rst:56
+msgid "You can also click the down arrow icon in the top-right corner to show the history and progress of people sending files to you."
+msgstr ""
+"También puedes hacer clic en el ícono de flecha hacia abajo en la esquina "
+"superior derecha para mostrar el historial y el progreso de las personas "
+"enviándote archivos."
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr "He aquí como luce cuando alguien está enviándote archivos."
+
+#: ../../source/features.rst:62
+msgid "When someone uploads files to your receive service, by default they get saved to a folder called ``OnionShare`` in your home folder on your computer, and they get automatically organized into separate subfolders based on the time that the files get uploaded."
+msgstr ""
+"Cuando alguien sube archivos al servicio de recepción en tu computadora, son "
+"guardados por defecto en una subcarpeta de tu carpeta personal llamada "
+"``OnionShare``, y son organizados automáticamente en subcarpetas separadas "
+"basándose en la hora en la que los archivos son subidos."
+
+#: ../../source/features.rst:64
+msgid "Setting up an OnionShare receiving service is useful for journalists and others that need to securely accept documents from anonymous sources. When used in this way, OnionShare is sort of like a lightweight, simpler, not quite as secure version of `SecureDrop <https://securedrop.org/>`_, the whistleblower submission system."
+msgstr ""
+"Establecer un servicio de recepción OnionShare es útil para periodistas y "
+"otros que necesiten aceptar documentos en forma segura desde fuentes "
+"anónimas. Cuando es usado de esta manera, OnionShare es una especie de "
+"versión liviana, más simple y no tan segura de `SecureDrop "
+"<https://securedrop.org/>`_, el sistema de envíos para informantes."
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr "Úsalo a tu propio riesgo"
+
+#: ../../source/features.rst:69
+msgid "Just like with malicious email attachments, it's possible that someone could try to hack your computer by uploading a malicious file to your OnionShare service. OnionShare does not add any safety mechanisms to protect your system from malicious files, so use at your own risk."
+msgstr ""
+"De la misma manera que con adjuntos maliciosos en correos electrónicos, es "
+"posible que alguien pudiera intentar hackear tu computadora subiendo un "
+"archivo malicioso a tu servicio. OnionShare no añade ningún mecanismo de "
+"seguridad para proteger a tu sistema de archivos maliciosos, por lo que su "
+"uso es a tu propio riesgo."
+
+#: ../../source/features.rst:71
+msgid "If you receive an Office document or a PDF through OnionShare, you can convert these documents into PDFs that you know are safe to open using `Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself when opening untrusted documents by opening them in `Tails <https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ disposable VM."
+msgstr ""
+"Si recibes un documento de Office o un PDF a través de OnionShare, puedes "
+"convertirlos en PDFs que sabes que serán seguros para abrir usando `"
+"Dangerzone <https://dangerzone.rocks/>`_. También puedes protegerte al abrir "
+"documentos en los que no confías haciéndolo en `Tails <https://tails.boum."
+"org/>`_ o en una Máquina Virtual descartable `Qubes <https://qubes-os.org/"
+">`_."
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr "Consejos para correr un servicio de recepción"
+
+#: ../../source/features.rst:76
+msgid "If you want to host your own anonymous dropbox using OnionShare, it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis."
+msgstr ""
+"Si quieres alojar tu propio buzón anónimo usando OnionShare, es recomendado "
+"que lo hagas en una computadora dedicada y separada, que siempre esté "
+"encendida y conectada a Internet, y no en la que usas regularmente."
+
+#: ../../source/features.rst:78
+msgid "If you intend on advertising the OnionShare address on your website or social media profiles, then you should save the tab (see :ref:`save_tabs`) and run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+"Si tu intención es publicitar la dirección OnionShare en tu sitio web o tus "
+"perfiles de redes sociales, entonces deberías guardar la pestaña (mira "
+":ref:`save_tabs`) y correrla como servicio público (mira "
+":ref:`disable_passwords`)."
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr "Aloja un Sitio Web"
+
+#: ../../source/features.rst:83
+msgid "You can use OnionShare to host a static HTML website with just a click. Just open a website tab, drag in the files and folders that make up the static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+"Puedes usar OnionShare para alojar un sitio web con HTML estático solo con "
+"un clic. Abre una pestaña de sitio web, arrastra los archivos y carpetas que "
+"constituyen el sitio web estático, y haz clic cuando estés listo en \"Iniciar"
+" compartición\"."
+
+#: ../../source/features.rst:87
+msgid "If you add an ``index.html`` file, when someone loads your website it will render this page. You should also include any other HTML files, CSS files, JavaScript files, and images that make up the website. (Note that OnionShare only supports hosting *static* websites. It can't host websites that execute code or use databases. So you can't, for example, use WordPress.)"
+msgstr ""
+"Si añades un archivo ``index.html``, cuando alguien cargue tu sitio web "
+"representará gráficamente a esta página. También deberías incluir cualquier "
+"otro archivo HTML, CSS, JavaScript o imágenes que constituyan al sitio web. ("
+"Ten en cuenta que OnionShare solamente soporta el alojamiento de sitios web "
+"*estáticos*. No puede alojar sitios web que ejecuten código o usen bases de "
+"datos. Por lo que no puedes, por ejemplo, usar WordPress.)"
+
+#: ../../source/features.rst:89
+msgid "If you don't have an ``index.html`` file, then it will show a directory listing instead, and people who load it can look through the files and download them."
+msgstr ""
+"Si no tienes un archivo ``index.html``, entonces mostrará un listado de "
+"directorio, y las personas que lo carguen podrán mirar a través de los "
+"archivos y descargarlos."
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr "Política de Seguridad de Contenido"
+
+#: ../../source/features.rst:98
+msgid "By default OnionShare will help secure your website by setting a strict `Content Security Police <https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However this will prevent third-party content from loading inside the web page."
+msgstr ""
+"Por defecto, OnionShare te ayudará a asegurar tu sitio web estableciendo un "
+"estricto encabezado de `Política de Seguridad de Contenido <https://en."
+"wikipedia.org/wiki/Content_Security_Policy>`_. Sin embargo, esto evitará que "
+"el contenido de terceros sea cargado dentro de la página web."
+
+#: ../../source/features.rst:100
+msgid "If you want to load content from third-party websites, like assets or JavaScript libraries from CDNs, then you must check the \"Disable Content Security Policy header (allows your website to use third-party resources)\" box before starting the service."
+msgstr ""
+"Si quieres cargar contenido desde sitios web de terceros, como recursoss o "
+"bibliotecas JavaScript desde CDNs, entonces debes marcar la casilla "
+"\"Deshabilitar el encabezado de Política de Seguridad de Contenido (permite "
+"a tu sitio web usar recursos de terceros)\" antes de iniciar el servicio."
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr "Consejos para correr un servicio de sitio web"
+
+#: ../../source/features.rst:105
+msgid "If you want to host a long-term website using OnionShare (that isn't just to quickly show someone something), it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis. You should also save the tab (see :ref:`save_tabs`) so that you can resume the website with the same address if you close OnionShare and re-open it later."
+msgstr ""
+"Si quieres alojar un sitio web a largo plazo usando OnionShare (que no sea "
+"solo para mostrarle algo a alguien rápidamente), es recomendado que lo hagas "
+"en una computadora separada y dedicada, que siempre esté encendida y "
+"conectada a Internet, y no en la que usas regularmente. También deberías "
+"guardar la pestaña (mira :ref:`save_tabs`) con el fin de que puedas reanudar "
+"al sitio web con la misma dirección, si cierras OnionShare y lo vuelves a "
+"iniciar más tarde."
+
+#: ../../source/features.rst:107
+msgid "If your website is intended to be viewed by the public, you should run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+"Si planeas que tu sitio web sea visto por el público, deberías ejecutarlo "
+"como servicio público (see :ref:`disable_passwords`)."
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr "Chat Anónimo"
+
+#: ../../source/features.rst:112
+msgid "You can use OnionShare to set up a completely anonymous, secure chat room that doesn't log anything or leave any traces. Just open a chat tab and click \"Start chat server\"."
+msgstr ""
+"Puedes usar OnionShare para establecer un cuarto de chat completamente "
+"anónimo y seguro, que no registra nada o deja rastro alguno. Solo abre una "
+"pestaña de chat y haz clic en \"Iniciar servidor de chat\"."
+
+#: ../../source/features.rst:116
+msgid "After you start the server, copy the OnionShare address and send it to the people who will join this anonymous chat room. If it's important to limit exactly who can join, you should use an encrypted messaging app to send the OnionShare address."
+msgstr ""
+"Después que inicies al servidor, copia la dirección OnionShare y envíala a "
+"las personas que se unirán a este cuarto anónimo de chat. Si es importante "
+"limitar exactamente quién puede unirse, deberías usar una aplicación cifrada "
+"de mensajería para enviar la dirección OnionShare."
+
+#: ../../source/features.rst:120
+msgid "People can join the chat room by loading its OnionShare address in Tor Browser. The chat room requires JavasScript, so everyone who wants to participate must set their security level to Standard or Safer instead of Safest."
+msgstr ""
+"Las personas pueden unirse al cuarto de chat cargando su dirección "
+"OnionShare en el Navegador Tor. El cuarto de chat requiere JavasScript, por "
+"lo que todo aquel que quiera participar debe ajustar su nivel de seguridad a "
+"'Estándar' o 'Más Seguro' en vez de a 'El Más Seguro'."
+
+#: ../../source/features.rst:122
+msgid "When someone joins the chat room they get assigned a random name. They can change their name by typing a new name in the box in the left panel and pressing enter. No chat history will get displayed at all, even if others were already chatting in the room, because the chat history isn't saved anywhere."
+msgstr ""
+"Cuando alguien se une al cuarto de chat, se le asigna un nombre aleatorio. "
+"Puede cambiarlo tipeando un nombre nuevo en la casilla en el panel izquierdo "
+"y presionando Intro. Ningún historial de chat será mostrado en absoluto, aún "
+"si otros ya estaban chateando en el cuarto, porque ese historial no es "
+"guardado en ningún lado."
+
+#: ../../source/features.rst:126
+msgid "In an OnionShare chat room, everyone is anonymous. Anyone can change their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+"En un cuarto de chat OnionShare, todos son anónimos. Cualquiera puede "
+"cambiar su nombre a cualquier cosa, y no hay manera de confirmar la "
+"identidad de nadie."
+
+#: ../../source/features.rst:128
+msgid "However, if you create an OnionShare chat room and securely send the address only to a small group of trusted friends using encrypted messages, then you can be reasonably confident that the people who join the chat room are your friends."
+msgstr ""
+"Sin embargo, si creas un cuarto de chat OnionShare, y envías la dirección en "
+"forma segura solamente a un grupo pequeño de amigos confiables usando "
+"mensajes cifrados, entonces puedes estar razonablemente seguro que las "
+"personas que se unan a él son tus amigos."
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr "¿Cómo es que esto es útil?"
+
+#: ../../source/features.rst:133
+msgid "If you need to already be using an encrypted messaging app, what's the point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+"Si para empezar ya necesitas estar usando una aplicación de mensajería "
+"cifrada, ¿cuál es el punto de un cuarto de chat OnionShare? Deja menos "
+"rastros."
+
+#: ../../source/features.rst:135
+msgid "If you send a message to a Signal group, for example, a copy of your message ends up on each device (the phones and computers, if they set up Signal Desktop) of each member of the group. Even if disappearing messages is enabled, it's hard to confirm that all copies of the messages were actually deleted from all devices, and from any other places (like notifications databases) they may have been saved to. OnionShare chat rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+"Si envías un mensaje a un grupo de Signal, por ejemplo, una copia del mismo "
+"termina en cada dispositivo (los teléfonos y computadoras, si configuran "
+"Signal Desktop) de cada miembro del grupo. Aún si están habilitados los "
+"mensajes evanescentes, es difícil confirmar que todas las copias de los "
+"mismos fueron realmente borradas de todos los dispositivos, y de cualquier "
+"otro lugar (como bases de datos de notificaciones) en que pudieran haber "
+"sido guardadas. Los cuartos de chat OnionShare no almacenan ningún mensaje "
+"en ningún lado, por lo que esto no es un problema."
+
+#: ../../source/features.rst:137
+msgid "OnionShare chat rooms can also be useful for anonymous people wanting to chat securely with someone without needing to create any accounts. For example, a source can send an OnionShare address to a journalist using a disposable email address, and then wait for the journalist to join the chat room, all without compromosing their anonymity."
+msgstr ""
+"Los cuartos de chat OnionShare también pueden ser útiles para personas "
+"anónimas que quieran charlar en forma segura con alguien sin necesitar crear "
+"alguna cuenta. Por ejemplo, una fuente puede enviar una dirección OnionShare "
+"a un periodista usando una dirección de correo electrónico descartable, y "
+"luego esperar a que el periodista se una al cuarto de chat, todo eso sin "
+"comprometer su anonimato."
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr "¿Cómo funciona el cifrado?"
+
+#: ../../source/features.rst:142
+msgid "Because OnionShare relies on Tor onion services, connections between Tor Browser and OnionShare are all end-to-end encrypted (E2EE). When someone posts a message to an OnionShare chat room, they send it to the server through the E2EE onion connection, which then sends it to all other members of the chat room using WebSockets, through their E2EE onion connections."
+msgstr ""
+"Como OnionShare cuenta con los servicios onion de Tor, todas las conexiones "
+"entre el Navegador Tor y OnionShare son cifradas de extremo a extremo (E2EE)"
+". Cuando alguien publica un mensaje a un cuarto de chat OnionShare, lo envía "
+"al servidor a través de la conexión onion E2EE, la cual lo envía luego a "
+"todos los otros miembros del cuarto de chat usando WebSockets, a través de "
+"sus conexiones onion E2EE."
+
+#: ../../source/features.rst:144
+msgid "OnionShare doesn't implement any chat encryption on its own. It relies on the Tor onion service's encryption instead."
+msgstr ""
+"OnionShare no implementa ningún cifrado de chat por sí mismo. En vez, cuenta "
+"con el cifrado del servicio onion de Tor."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/help.po b/desktop/docs/source/locale/es/LC_MESSAGES/help.po
new file mode 100644
index 00000000..dad96235
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/help.po
@@ -0,0 +1,75 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-14 21:36+0000\n"
+"Last-Translator: Zuhualime Akoochimoya <zakooch@protonmail.ch>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr "Obteniendo Ayuda"
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+"Si necesitas ayuda con OnionShare, por favor sigue las instrucciones de "
+"abajo."
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr "Lee este sitio web"
+
+#: ../../source/help.rst:9
+msgid "This website is full of instructions on how to use OnionShare. Look through all of the sections first to see if it answers your questions."
+msgstr ""
+"Este sitio web está lleno de instrucciones sobre cómo usar OnionShare. Mira "
+"primero a través de todas las secciones para ver si responde a tus preguntas."
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr "Comprueba las cuestiones con GitHub"
+
+#: ../../source/help.rst:14
+msgid "If you can't find a solution in this website, please check the `GitHub issues <https://github.com/micahflee/onionshare/issues>`_. It's possible that someone else has encountered the same problem and has either raised it with the developers, or maybe even posted a solution."
+msgstr ""
+"Si no puedes encontrar una solución en este sitio web, por favor comprueba "
+"las `cuestiones con GitHub <https://github.com/micahflee/onionshare/issues>`"
+"_. Es posible que alguien más se haya encontrado con el mismo problema y lo "
+"haya elevado a los desarrolladores, o incluso también que haya publicado una "
+"solución."
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr "Envía una cuestión"
+
+#: ../../source/help.rst:19
+msgid "If you can't find a solution to your problem, or you wish to ask a question or suggest a new feature, please `submit an issue <https://github.com/micahflee/onionshare/issues/new>`_. This requires `creating an GitHub account <https://help.github.com/articles/signing-up-for-a-new-github-account/>`_."
+msgstr ""
+"Si no puedes encontrar una solución a tu problema, o deseas hacer una "
+"pregunta o sugerir una característica nueva, por favor `envía una cusestión "
+"<https://github.com/micahflee/onionshare/issues/new>`_. Esto requiere `crear "
+"una cuenta en GitHub <https://help.github.com/articles/"
+"signing-up-for-a-new-github-account/>`_."
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr "Únete a nuestro equipo Keybase"
+
+#: ../../source/help.rst:24
+msgid "See :ref:`collaborating` for instructions on how to join our Keybase team that we use to discuss the project."
+msgstr ""
+"Mira :ref:`collaborating` por instrucciones acerca de cómo unirse a nuestro "
+"equipo Keybase, al cual usamos para discutir el proyecto."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/index.po b/desktop/docs/source/locale/es/LC_MESSAGES/index.po
new file mode 100644
index 00000000..dc691b19
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/index.po
@@ -0,0 +1,30 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: 2020-09-14 21:36+0000\n"
+"Last-Translator: emma peel <emma.peel@riseup.net>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr "Documentación de OnionShare"
+
+#: ../../source/index.rst:6
+msgid "OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+"OnionShare es una herramienta de código abierto que te permite compartir "
+"archivos de forma segura y anónima, alojar sitios web y charlar con amigos "
+"usando la red Tor."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/install.po b/desktop/docs/source/locale/es/LC_MESSAGES/install.po
new file mode 100644
index 00000000..41624bdf
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/install.po
@@ -0,0 +1,144 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-14 21:36+0000\n"
+"Last-Translator: Zuhualime Akoochimoya <zakooch@protonmail.ch>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr "Instalación"
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr "Instalar en Windows o macOS"
+
+#: ../../source/install.rst:7
+msgid "You can download OnionShare for Windows and macOS from the `OnionShare website <https://onionshare.org/>`_."
+msgstr ""
+"Puedes descargar OnionShare para Windows o macOS desde la página web de `"
+"OnionShare <https://onionshare.org/>`_."
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr "Para mayor seguridad, lee :ref:`verifying_sigs`."
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr "Instalar en Linux con Flatpak"
+
+#: ../../source/install.rst:16
+msgid "There are various ways to install OnionShare for Linux, but the recommended way is to use the Flatpak package. Flatpak ensures that you'll always use the most latest dependencies and run OnionShare inside of a sandbox."
+msgstr ""
+"Hay varias formas de instalar OnionShare en Linux, pero recomendamos "
+"utilizar el paquete Flatpak. Flatpak garantiza que las dependencias serán "
+"siempre las más recientes y ejecutará OnionShare dentro de un contenedor "
+"aislado."
+
+#: ../../source/install.rst:18
+msgid "Make sure you have ``flatpak`` installed and the Flathub repository added by following `these instructions <https://flatpak.org/setup/>`_ for your Linux distribution."
+msgstr ""
+"Instala ``flatpak`` y añade el repositorio Flathub siguiendo `estas "
+"instrucciones <https://flatpak.org/setup/>`_ para tu distribución Linux."
+
+#: ../../source/install.rst:20
+msgid "Then install OnionShare from Flathub by following `the instructions here <https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+"Luego instala OnionShare desde Flathub siguiendo `estas instrucciones "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr "Verificar firmas PGP"
+
+#: ../../source/install.rst:27
+msgid "You can verify that the Windows, macOS, or source package you download is legitimate and hasn't been tampered with by verifying its PGP signature. For Windows and macOS, this step is optional and provides defense in depth: the installers also include their operating system-specific signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+"Puedes asegurate de que el paquete con el código fuente, el de Windows o el "
+"de macOS que descargaste es correcto y no ha sido manipulado verificando su "
+"firma PGP. Para Windows y macOS este paso es opcional, y provee defensa en "
+"profundidad: los instaladores también incluyen sus firmas específicas del "
+"sistema operativo, y puedes confiar solo en ellas si así lo deseas."
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr "Clave de firma"
+
+#: ../../source/install.rst:32
+msgid "Windows, macOS, and source packaged are signed by Micah Lee, the core developer, using his PGP public key with fingerprint ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+"Los paquetes para Windows, macOS, y el código fuente están firmados por "
+"Micah Lee, el desarrollador principal, usando su clave PGP pública con "
+"huella digital ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. Puedes "
+"descargar la clave de Micah `desde el servidor de claves keys.openpgp.org "
+"<https://keys.openpgp.org/vks/v1/by-fingerprint/"
+"927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+
+#: ../../source/install.rst:34
+msgid "In order to verify signatures, you must have GnuPG installed. For macOS you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+"Con el fin de verificar firmas, debes tener GnuPG instalado. Para macOS "
+"probablemente quieras `GPGTools <https://gpgtools.org/>`_, y para Windows, `"
+"Gpg4win <https://www.gpg4win.org/>`_."
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr "Firmas"
+
+#: ../../source/install.rst:39
+msgid "You can find the signatures (``.asc`` files), as well as Windows, macOS, and source packages, at https://onionshare.org/dist/ in the folders named for each version of OnionShare. You can also find them on the `GitHub Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+"Puedes encontrar las firmas (archivos ``.asc``), como así también los "
+"paquetes para Windows, macOS y el código fuente, en https://onionshare.org/"
+"dist/ en las carpetas nombradas por cada versión de OnionShare. También "
+"puedes encontrarlas en la `página de Lanzamientos de GitHub <https://github."
+"com/micahflee/onionshare/releases>`_."
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr "Verificando"
+
+#: ../../source/install.rst:44
+msgid "Once you have imported Micah's public key into your GnuPG keychain, downloaded the binary, and downloaded the ``.asc`` signature, you can verify the binary for macOS in terminal like this::"
+msgstr ""
+"Una vez que hayas importado la clave pública de Micah dentro de tu llavero "
+"GnuPG, descargado el ejecutable y la firma ``.asc``, puedes verificar el "
+"ejecutable para macOS en un terminal como sigue:"
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr "O para Windows en una línea de comando como sigue:"
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr "Una salida esperada puede lucir como esta:"
+
+#: ../../source/install.rst:64
+msgid "If you don't see 'Good signature from', then there might be a problem with the integrity of the file (malicious or otherwise), and you perhaps should not install the package. (The WARNING shown above, is not a problem with the package: it only means you have not defined any level of 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+"Si no ves 'Good signature from', entonces podría haber un problema con la "
+"integridad del archivo (malicioso u otra causa), y tal vez no debieras "
+"instalar el paquete. (La ADVERTENCIA mostrada arriba no es un problema con "
+"el paquete: solamente significa que no has definido ningún nivel de "
+"'confianza' con respecto a la clave PGP de Micah en sí misma.)"
+
+#: ../../source/install.rst:66
+msgid "If you want to learn more about verifying PGP signatures, guides for `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and the `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html.en>`_ may be helpful."
+msgstr ""
+"Si quieres aprender más acerca de la verificación de firmas PGP, las guías "
+"para `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ y "
+"el `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures."
+"html.en>`_ podrían ser útiles."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/security.po b/desktop/docs/source/locale/es/LC_MESSAGES/security.po
new file mode 100644
index 00000000..6fad2771
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/security.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-14 21:36+0000\n"
+"Last-Translator: emma peel <emma.peel@riseup.net>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr "Diseño de seguridad"
+
+#: ../../source/security.rst:4
+msgid "First read :ref:`how_it_works` to understand the basics of how OnionShare works."
+msgstr ""
+"Primero lee :ref:`how_it_works` para entender las bases de cómo funciona "
+"OnionShare."
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+"Como cualquier software, OnionShare podría contener errores o "
+"vulnerabilidades."
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr "Contra qué te protege OnionShare"
+
+#: ../../source/security.rst:11
+msgid "**Third parties don't have access to anything that happens in OnionShare.** When you use OnionShare, you host services directly on your computer. For example, when you share files with OnionShare, you don't upload these files to any server, and when you start an OnionShare chat room, your computer is the chat room server itself. Traditional ways of sharing files or setting up websites and chat rooms require trusting a service with access to your data."
+msgstr ""
+"**Ningún tercero tiene acceso a lo que pasa en OnionShare.** Cuando usas "
+"OnionShare, alojas servicios directamente en tu computadora. Por ejemplo, "
+"cuando compartes archivos con OnionShare, no los subes a ningún servidor, y "
+"cuando inicias un cuarto de chat OnionShare, tu computadora es el servidor. "
+"Las maneras tradicionales de compartir archivos o configurar sitios web y "
+"cuartos de chat requieren confiar en un servicio con acceso a tus datos."
+
+#: ../../source/security.rst:13
+msgid "**Network eavesdroppers can't spy on anything that happens in OnionShare in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on what happens in an OnionShare service. If the eavesdropper is positioned on the OnionShare user's end, the Tor Browser user's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect Tor Browser with OnionShare's onion service, the traffic will be encrypted using the onion service key."
+msgstr ""
+"**Quienes estén observando la red no pueden espiar nada de lo que pasa en "
+"tránsito en OnionShare.** Debido a que las conexiones entre los servicios "
+"onion de Tor y el Navegador Tor están cifradas de extremo a extremo, ningún "
+"atacante puede espiar qué es lo que pasa en un servicio OnionShare. Si el "
+"espía está posicionado en el extremo del usuario de OnionShare, el extremo "
+"del usuario del Navegador Tor, o es un nodo Tor malicioso, solamente verá "
+"tráfico Tor. Si el espía es un nodo de encuentro malicioso usado para "
+"conectar al Navegador Tor con el servicio onion de OnionShare, el tráfico "
+"estará cifrado usando la clave del servicio onion."
+
+#: ../../source/security.rst:15
+msgid "**Anonymity of OnionShare users are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the OnionShare user anonymously communicates the OnionShare address with the Tor Browser users, the Tor Browser users and eavesdroppers can't learn the identity of the OnionShare user."
+msgstr ""
+"**El anonimato de los usuarios de OnionShare está protegido por Tor.** "
+"OnionShare y el Navegador Tor protegen el anonimato de los usuarios. En la "
+"medida en que el usuario de OnionShare comunique anónimamente la dirección "
+"OnionShare con los usuarios del Navegador Tor, ni éstos ni los espías pueden "
+"saber la identidad del usuario de OnionShare."
+
+#: ../../source/security.rst:17
+msgid "**If an attacker learns about the onion service, they still can't access anything.** There have been attacks against the Tor network that can enumerate onion services. Even if someone discovers the .onion address of an OnionShare onion service, they can't access it without also knowing the service's random password (unless, of course, the OnionShare users chooses to disable the password and make it public). The password is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible password. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the password."
+msgstr ""
+"**Si un atacante encuentra el servicio onion, aún así no puede acceder a "
+"nada.** Ha habido ataques en contra de la red Tor que pueden enumerar "
+"servicios onion. Aún si alguien descubre la dirección .onion de un servicio "
+"onion de OnionShare, no puede accederla sin conocer también la contraseña "
+"aleatoria del servicio (a menos, por supuesto, que el usuario de OnionShare "
+"elija deshabilitarla y hacerla pública). La contraseña es generada eligiendo "
+"dos palabras aleatorias de una lista de 6800, lo cual significa que hay 6800^"
+"2, o cerca de 46 millones de contraseñas posibles. Pero pueden hacer "
+"solamente 20 intentos fallidos antes de que OnionShare pare el servidor, "
+"evitando ataques de fuerza bruta para conseguir la contraseña."
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr "Contra qué no te protege OnionShare"
+
+#: ../../source/security.rst:22
+msgid "**Communicating the OnionShare address might not be secure.** The OnionShare user is responsible for securely communicating the OnionShare address with people. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're using OnionShare. If the attacker loads the address in Tor Browser before the legitimate recipient gets to it, they can access the service. If this risk fits the user's threat model, they must find a more secure way to communicate the address, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+"**Comunicar la dirección de OnionShare podría no ser seguro.** El usuario de "
+"OnionShare es responsable de comunicar en forma segura la dirección de "
+"OnionShare con las personas. Si lo hace de forma insegura (tal como a través "
+"de un mensaje de correo electrónico, mientras que éste está siendo "
+"monitoreado por un atacante), el espía sabrá que está usando OnionShare. Si "
+"el atacante carga la dirección en el Navegador Tor antes que el receptor "
+"legítimo lo haga, puede acceder al servicio. Si este riesgo es posible "
+"dentro del modelo de amenaza del usuario, debes encontrar una manera más "
+"segura de comunicar la dirección, tal como en un correo electrónico, charla "
+"o llamadas cifradas de voz. Esto no es necesario en casos donde OnionShare "
+"está siendo usado para algo que no es secreto."
+
+#: ../../source/security.rst:24
+msgid "**Communicating the OnionShare address might not be anonymous.** While OnionShare and Tor Browser allow for anonymity, if the user wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare address. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the address. This isn't necessary in cases where there's no need to protect anonymity, such as co-workers who know each other sharing work documents."
+msgstr ""
+"**Comunicar la dirección de OnionShare podría no ser anónimo.** Mientras que "
+"OnionShare y el Navegador Tor permiten el anonimato, si el usuario desea "
+"permanecer anónimo, debe tomar pasos extra para asegurarlo cuando comunica "
+"la dirección de OnionShare. Por ejemplo, podría necesitar usar Tor para "
+"crear un nuevo correo electrónico o cuenta de charla anónimos, y accederla "
+"solamente sobre Tor para compartir la dirección. Esto no es necesario en "
+"casos donde no haya necesidad de proteger el anonimato, tales como con "
+"colegas que se conocen entre sí, y comparten documentos de trabajo."
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/es/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..1b6e29d0
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-14 21:36+0000\n"
+"Last-Translator: emma peel <emma.peel@riseup.net>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr "Versiones"
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr "Idiomas"
diff --git a/desktop/docs/source/locale/es/LC_MESSAGES/tor.po b/desktop/docs/source/locale/es/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..65c4b704
--- /dev/null
+++ b/desktop/docs/source/locale/es/LC_MESSAGES/tor.po
@@ -0,0 +1,291 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: 2020-09-20 02:39+0000\n"
+"Last-Translator: emma peel <emma.peel@riseup.net>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr "Conectar a Tor"
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+"Hay varias opciones para conectar OnionShare a Tor. Puedes cambiarlas en "
+"Ajustes, accesibles haciendo clic en el ícono del engranaje abajo a la "
+"derecha de la ventana."
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr "Usar la versión de Tor incluida con OnionShare"
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+"Esta es la manera predeterminada en la que OnionShare se conecta a Tor, y "
+"también es la más simple y confiable. Por esta razón se recomienda para la "
+"mayoría de los usuarios."
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+"Cuando abres OnionShare se inicia un proceso Tor en segundo plano que está "
+"configurado específicamente para su uso. Este proceso Tor no interferirá con "
+"otros procesos Tor en tu computadora, por lo que eres libre de correr al "
+"Navegador Tor o usar un Tor de sistema en segundo plano."
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr "Intentar configuración automática con el Navegador Tor"
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+"Puedes configurar OnionShare para conectar al Tor que viene con el Navegador "
+"Tor. Primero, `descarga el Navegador Tor <https://www.torproject.org>`_ aquí "
+"si aún no lo tienes. Con este ajuste seleccionado, necesitas mantener el "
+"Navegador Tor abierto en segundo plano mientras estás usando OnionShare."
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr "Usar un Tor de sistema en Windows"
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+"Esto es bastante avanzado. Necesitarás saber cómo editar archivos de "
+"texto y hacer cosas como administrador."
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+"Descarga el Paquete Experto de Tor para Windows, que puedes obtener `de aquí "
+"<https://www.torproject.org/download/tor/>`_. Extrae el archivo zip, copia "
+"la carpeta extraída a ``C:\\Program Files (x86)\\``, y renómbrala a ``tor-"
+"win32``; dentro de esa carpeta están las subcarpetas ``Data`` y ``Tor``."
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+"Inventa una contraseña para el puerto de control. Voy a usar ``comprised "
+"stumble rummage work avenging construct volatile`` como la mía. Ahora "
+"abre una ventana para línea de comando como administrador, y usa "
+"``tor.exe --hash-password`` para generar un hash de tu contraseña. Por "
+"ejemplo:"
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+"La salida del hash de la contraseña se ve después de algunas advertencias ("
+"que puedes ignorar). En mi caso, fue "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+"Ahora crea un nuevo archivo de texto en ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` y escríbelo en él, reemplazando el ``HashedControlPassword`` "
+"con el que acabas de generar:"
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+"En tu ventana de línea de comando como administrador, instala tor como "
+"servicio usando el archivo ``torrc`` apropiado que acabas de crear (mira `"
+"aquí <https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ para más "
+"información sobre cómo hacerlo). De esta manera::"
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr "¡Ahora estás ejecutando un Tor de sistema en Windows!"
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+"Abre OnionShare. Haz clic en el ícono Ajustes. Debajo de \"¿Cómo debiera "
+"conectarse a Tor OnionShare?\" elije \"Conectar usando el puerto de control\""
+", y establece el equipo del puerto de control a ``127.0.0.1``, y el puerto a "
+"``9051``. Bajo \"Opciones de autenticación de Tor\" elije \"Contraseña\" y "
+"escribe la tuya, en mi caso ``comprised stumble rummage work avenging "
+"construct volatile``. Haz clic en el botón \"Probar Ajustes\". Si todo va "
+"bien, debieras ver que se conectó exitosamente a tor."
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr "Usar un Tor de sistema en macOS"
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+"Primero, instala `Homebrew <http://brew.sh/>`_ si es que todavía no lo "
+"tienes. Luego, instala Tor::"
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr "Ahora configura Tor para permitir conexiones desde OnionShare::"
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr "E inicia el servicio Tor de sistema::"
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+"Abre OnionShare. Haz clic en el ícono Ajustes. Bajo \"¿Cómo debiera "
+"conectarse a Tor OnionShare?\" elije \"Conectar usando un archivo "
+"socket\", y establécelo a ``/usr/local/var/run/tor/control.socket``. Bajo"
+" \"Opciones de autenticación de Tor\" elije \"Sin autenticación, o "
+"autenticación por cookies\". Haz clic en el botón \"Probar Ajustes\". Si "
+"todo va bien, debieras ver que se conectó exitosamente a tor."
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr "Usando un Tor de sistema en Linux"
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+"Primero, instala el paquete tor. Si estás usando Debian, Ubuntu o una "
+"distribución de Linux similar, te recomiendo que uses el `repositorio "
+"oficial <https://2019.www.torproject.org/docs/debian.html.en>`_ del Tor "
+"Project. Por ejemplo, en Ubuntu 20.04::"
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+"Luego, agrega tu usuario al grupo que corre el proceso Tor (en el caso de"
+" Debian y Ubuntu, ``debian-tor``) y configura OnionShare para conectarse "
+"al archivo socket de control de tu Tor de sistema."
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+"Agrega tu usuario al grupo ``debian-tor`` ejecutando este comando (reemplaza "
+"``username`` con tu nombre de usuario real)::"
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+"Reinicia tu computadora. Luego de que vuelva a arrancar, abre OnionShare."
+" Haz clic en el ícono Ajustes. Bajo \"¿Cómo debiera conectarse a Tor "
+"OnionShare?\" elije \"Conectar usando un archivo socket\", y establécelo "
+"a ``/var/run/tor/control``. Bajo \"Opciones de autenticación de Tor\" "
+"elije \"Sin autenticación, o autenticación por cookies\". Haz clic en el "
+"botón \"Probar Ajustes\". Si todo va bien, debieras ver que se conectó "
+"exitosamente a Tor."
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr "Usar puentes Tor"
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+"Si ru acceso a Internet está censurado, puedes configurar OnionShare para"
+" conectarse a la red Tor usando `puentes Tor "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. Si OnionShare "
+"se conecta exitosamente a Tor, no necesitas usar un puente."
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr "Para configurar puentes, abre los ajustes de OnionShare."
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+"Puedes usar los transportes conectables obfs4 o meek_lite (Azure) "
+"incorporados, o puentes personalizados, los cuales puedes obtener de la "
+"`BridgeDB <https://bridges.torproject.org/>`_ de Tor. Si necesitas usar "
+"un puente, debieras intentar primero con los obfs4 incorporados."
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr "Usando un Tor de sistema en macOS"
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/fa/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/develop.po b/desktop/docs/source/locale/fa/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/features.po b/desktop/docs/source/locale/fa/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/help.po b/desktop/docs/source/locale/fa/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/index.po b/desktop/docs/source/locale/fa/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/install.po b/desktop/docs/source/locale/fa/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/security.po b/desktop/docs/source/locale/fa/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/fa/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/fa/LC_MESSAGES/tor.po b/desktop/docs/source/locale/fa/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/fa/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/fr/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..3dd70b07
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/advanced.po
@@ -0,0 +1,228 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language: fr\n"
+"Language-Team: none\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/develop.po b/desktop/docs/source/locale/fr/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..9ce95cc9
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/develop.po
@@ -0,0 +1,257 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language: fr\n"
+"Language-Team: none\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/features.po b/desktop/docs/source/locale/fr/LC_MESSAGES/features.po
new file mode 100644
index 00000000..ae1dae49
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/features.po
@@ -0,0 +1,226 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid "OnionShare works by starting web servers locally on your own computer and making them accessible to other people as `Tor <https://www.torproject.org/>`_ `onion services <https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid "By default, OnionShare web addresses are protected with a random password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid "You're responsible for securely sharing that URL using a communication channel of your choice like in an encrypted chat message, or using something less secure like a Twitter or Facebook message, depending on your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid "The people who you send the URL to must then copy and paste it into `Tor Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid "With OnionShare, *your own computer is the web server*. If you run OnionShare on your laptop to send someone files, and then suspend your laptop before the files have been downloaded, the service will not be available until your laptop is unsuspended and connected to the internet again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid "Because your own computer is the web server, *no third party can access anything that happens in OnionShare*, not even the developers of OnionShare. It's completely private. And because OnionShare is based on Tor onion services too, it also protects your anonymity. See the :doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid "You can use OnionShare to securely and anonymously send files and folders to people. Just open a share tab, drag in the files and folders you wish to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27
+#: ../../source/features.rst:91
+msgid "After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid "By default, as soon as someone finishes downloading your files, OnionShare will automatically stop the server, completely removing the website from the internet. If you want to allow multiple people to download these files, uncheck the \"Stop sharing after files have been sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid "Also, if you uncheck this box, people will be able to download individual files that you share rather than a single compressed version of all of the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid "When you're ready to share, click the \"Start sharing\" button. You can always click \"Stop sharing\", or quit OnionShare, to immediate take the website down. You can also click the up arrow icon in the top-right corner to show the history and progress of people downloading files from you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid "Now that you have a website that's sharing files, copy the address and send it to the person you want to receive the files. If the files need to stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid "That person then must load the address in Tor Browser. After logging in with the random password that's included in the web address, they will be able to download the files directly from your computer by clicking the \"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid "You can use OnionShare to let people anonymously upload files directly to your computer, essentially turning it into an anonymous dropbox. Open a receive tab, choose where you want files to get downloaded and other settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid "This will start the OnionShare service. Anyone that loads this address in Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid "You can also click the down arrow icon in the top-right corner to show the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid "When someone uploads files to your receive service, by default they get saved to a folder called ``OnionShare`` in your home folder on your computer, and they get automatically organized into separate subfolders based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid "Setting up an OnionShare receiving service is useful for journalists and others that need to securely accept documents from anonymous sources. When used in this way, OnionShare is sort of like a lightweight, simpler, not quite as secure version of `SecureDrop <https://securedrop.org/>`_, the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid "Just like with malicious email attachments, it's possible that someone could try to hack your computer by uploading a malicious file to your OnionShare service. OnionShare does not add any safety mechanisms to protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid "If you receive an Office document or a PDF through OnionShare, you can convert these documents into PDFs that you know are safe to open using `Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself when opening untrusted documents by opening them in `Tails <https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid "If you want to host your own anonymous dropbox using OnionShare, it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid "If you intend on advertising the OnionShare address on your website or social media profiles, then you should save the tab (see :ref:`save_tabs`) and run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid "You can use OnionShare to host a static HTML website with just a click. Just open a website tab, drag in the files and folders that make up the static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid "If you add an ``index.html`` file, when someone loads your website it will render this page. You should also include any other HTML files, CSS files, JavaScript files, and images that make up the website. (Note that OnionShare only supports hosting *static* websites. It can't host websites that execute code or use databases. So you can't, for example, use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid "If you don't have an ``index.html`` file, then it will show a directory listing instead, and people who load it can look through the files and download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid "By default OnionShare will help secure your website by setting a strict `Content Security Police <https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid "If you want to load content from third-party websites, like assets or JavaScript libraries from CDNs, then you must check the \"Disable Content Security Policy header (allows your website to use third-party resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid "If you want to host a long-term website using OnionShare (that isn't just to quickly show someone something), it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis. You should also save the tab (see :ref:`save_tabs`) so that you can resume the website with the same address if you close OnionShare and re-open it later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid "If your website is intended to be viewed by the public, you should run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid "You can use OnionShare to set up a completely anonymous, secure chat room that doesn't log anything or leave any traces. Just open a chat tab and click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid "After you start the server, copy the OnionShare address and send it to the people who will join this anonymous chat room. If it's important to limit exactly who can join, you should use an encrypted messaging app to send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid "People can join the chat room by loading its OnionShare address in Tor Browser. The chat room requires JavasScript, so everyone who wants to participate must set their security level to Standard or Safer instead of Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid "When someone joins the chat room they get assigned a random name. They can change their name by typing a new name in the box in the left panel and pressing enter. No chat history will get displayed at all, even if others were already chatting in the room, because the chat history isn't saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid "In an OnionShare chat room, everyone is anonymous. Anyone can change their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid "However, if you create an OnionShare chat room and securely send the address only to a small group of trusted friends using encrypted messages, then you can be reasonably confident that the people who join the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid "If you need to already be using an encrypted messaging app, what's the point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid "If you send a message to a Signal group, for example, a copy of your message ends up on each device (the phones and computers, if they set up Signal Desktop) of each member of the group. Even if disappearing messages is enabled, it's hard to confirm that all copies of the messages were actually deleted from all devices, and from any other places (like notifications databases) they may have been saved to. OnionShare chat rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid "OnionShare chat rooms can also be useful for anonymous people wanting to chat securely with someone without needing to create any accounts. For example, a source can send an OnionShare address to a journalist using a disposable email address, and then wait for the journalist to join the chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid "Because OnionShare relies on Tor onion services, connections between Tor Browser and OnionShare are all end-to-end encrypted (E2EE). When someone posts a message to an OnionShare chat room, they send it to the server through the E2EE onion connection, which then sends it to all other members of the chat room using WebSockets, through their E2EE onion connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid "OnionShare doesn't implement any chat encryption on its own. It relies on the Tor onion service's encryption instead."
+msgstr ""
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/help.po b/desktop/docs/source/locale/fr/LC_MESSAGES/help.po
new file mode 100644
index 00000000..35a6d1d3
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/help.po
@@ -0,0 +1,57 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid "This website is full of instructions on how to use OnionShare. Look through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid "If you can't find a solution in this website, please check the `GitHub issues <https://github.com/micahflee/onionshare/issues>`_. It's possible that someone else has encountered the same problem and has either raised it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid "If you can't find a solution to your problem, or you wish to ask a question or suggest a new feature, please `submit an issue <https://github.com/micahflee/onionshare/issues/new>`_. This requires `creating an GitHub account <https://help.github.com/articles/signing-up-for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid "See :ref:`collaborating` for instructions on how to join our Keybase team that we use to discuss the project."
+msgstr ""
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/index.po b/desktop/docs/source/locale/fr/LC_MESSAGES/index.po
new file mode 100644
index 00000000..7e229643
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/index.po
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid "OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network."
+msgstr ""
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/install.po b/desktop/docs/source/locale/fr/LC_MESSAGES/install.po
new file mode 100644
index 00000000..0d7d00a6
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/install.po
@@ -0,0 +1,101 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid "You can download OnionShare for Windows and macOS from the `OnionShare website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid "There are various ways to install OnionShare for Linux, but the recommended way is to use the Flatpak package. Flatpak ensures that you'll always use the most latest dependencies and run OnionShare inside of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid "Make sure you have ``flatpak`` installed and the Flathub repository added by following `these instructions <https://flatpak.org/setup/>`_ for your Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid "Then install OnionShare from Flathub by following `the instructions here <https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid "You can verify that the Windows, macOS, or source package you download is legitimate and hasn't been tampered with by verifying its PGP signature. For Windows and macOS, this step is optional and provides defense in depth: the installers also include their operating system-specific signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid "Windows, macOS, and source packaged are signed by Micah Lee, the core developer, using his PGP public key with fingerprint ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid "In order to verify signatures, you must have GnuPG installed. For macOS you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid "You can find the signatures (``.asc`` files), as well as Windows, macOS, and source packages, at https://onionshare.org/dist/ in the folders named for each version of OnionShare. You can also find them on the `GitHub Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid "Once you have imported Micah's public key into your GnuPG keychain, downloaded the binary, and downloaded the ``.asc`` signature, you can verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid "If you don't see 'Good signature from', then there might be a problem with the integrity of the file (malicious or otherwise), and you perhaps should not install the package. (The WARNING shown above, is not a problem with the package: it only means you have not defined any level of 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid "If you want to learn more about verifying PGP signatures, guides for `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and the `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html.en>`_ may be helpful."
+msgstr ""
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/security.po b/desktop/docs/source/locale/fr/LC_MESSAGES/security.po
new file mode 100644
index 00000000..3fc4ecd6
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/security.po
@@ -0,0 +1,61 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid "First read :ref:`how_it_works` to understand the basics of how OnionShare works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid "**Third parties don't have access to anything that happens in OnionShare.** When you use OnionShare, you host services directly on your computer. For example, when you share files with OnionShare, you don't upload these files to any server, and when you start an OnionShare chat room, your computer is the chat room server itself. Traditional ways of sharing files or setting up websites and chat rooms require trusting a service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid "**Network eavesdroppers can't spy on anything that happens in OnionShare in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on what happens in an OnionShare service. If the eavesdropper is positioned on the OnionShare user's end, the Tor Browser user's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect Tor Browser with OnionShare's onion service, the traffic will be encrypted using the onion service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid "**Anonymity of OnionShare users are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the OnionShare user anonymously communicates the OnionShare address with the Tor Browser users, the Tor Browser users and eavesdroppers can't learn the identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid "**If an attacker learns about the onion service, they still can't access anything.** There have been attacks against the Tor network that can enumerate onion services. Even if someone discovers the .onion address of an OnionShare onion service, they can't access it without also knowing the service's random password (unless, of course, the OnionShare users chooses to disable the password and make it public). The password is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible password. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid "**Communicating the OnionShare address might not be secure.** The OnionShare user is responsible for securely communicating the OnionShare address with people. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're using OnionShare. If the attacker loads the address in Tor Browser before the legitimate recipient gets to it, they can access the service. If this risk fits the user's threat model, they must find a more secure way to communicate the address, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid "**Communicating the OnionShare address might not be anonymous.** While OnionShare and Tor Browser allow for anonymity, if the user wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare address. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the address. This isn't necessary in cases where there's no need to protect anonymity, such as co-workers who know each other sharing work documents."
+msgstr ""
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/fr/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..32df696b
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/sphinx.po
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
diff --git a/desktop/docs/source/locale/fr/LC_MESSAGES/tor.po b/desktop/docs/source/locale/fr/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..f16b041c
--- /dev/null
+++ b/desktop/docs/source/locale/fr/LC_MESSAGES/tor.po
@@ -0,0 +1,217 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language: fr\n"
+"Language-Team: none\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/ga/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/develop.po b/desktop/docs/source/locale/ga/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/features.po b/desktop/docs/source/locale/ga/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/help.po b/desktop/docs/source/locale/ga/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/index.po b/desktop/docs/source/locale/ga/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/install.po b/desktop/docs/source/locale/ga/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/security.po b/desktop/docs/source/locale/ga/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/ga/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ga/LC_MESSAGES/tor.po b/desktop/docs/source/locale/ga/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/ga/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/is/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/develop.po b/desktop/docs/source/locale/is/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/features.po b/desktop/docs/source/locale/is/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/help.po b/desktop/docs/source/locale/is/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/index.po b/desktop/docs/source/locale/is/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/install.po b/desktop/docs/source/locale/is/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/security.po b/desktop/docs/source/locale/is/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/is/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/is/LC_MESSAGES/tor.po b/desktop/docs/source/locale/is/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/is/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/it/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/develop.po b/desktop/docs/source/locale/it/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/features.po b/desktop/docs/source/locale/it/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/help.po b/desktop/docs/source/locale/it/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/index.po b/desktop/docs/source/locale/it/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/install.po b/desktop/docs/source/locale/it/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/security.po b/desktop/docs/source/locale/it/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/it/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/it/LC_MESSAGES/tor.po b/desktop/docs/source/locale/it/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/it/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/ja/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/develop.po b/desktop/docs/source/locale/ja/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/features.po b/desktop/docs/source/locale/ja/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/help.po b/desktop/docs/source/locale/ja/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/index.po b/desktop/docs/source/locale/ja/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/install.po b/desktop/docs/source/locale/ja/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/security.po b/desktop/docs/source/locale/ja/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/ja/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ja/LC_MESSAGES/tor.po b/desktop/docs/source/locale/ja/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/ja/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..17c39735
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/advanced.po
@@ -0,0 +1,228 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language: nb_NO\n"
+"Language-Team: none\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/develop.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..d1799dfc
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/develop.po
@@ -0,0 +1,257 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language: nb_NO\n"
+"Language-Team: none\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/features.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/features.po
new file mode 100644
index 00000000..e97263f1
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/features.po
@@ -0,0 +1,226 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid "OnionShare works by starting web servers locally on your own computer and making them accessible to other people as `Tor <https://www.torproject.org/>`_ `onion services <https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid "By default, OnionShare web addresses are protected with a random password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid "You're responsible for securely sharing that URL using a communication channel of your choice like in an encrypted chat message, or using something less secure like a Twitter or Facebook message, depending on your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid "The people who you send the URL to must then copy and paste it into `Tor Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid "With OnionShare, *your own computer is the web server*. If you run OnionShare on your laptop to send someone files, and then suspend your laptop before the files have been downloaded, the service will not be available until your laptop is unsuspended and connected to the internet again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid "Because your own computer is the web server, *no third party can access anything that happens in OnionShare*, not even the developers of OnionShare. It's completely private. And because OnionShare is based on Tor onion services too, it also protects your anonymity. See the :doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid "You can use OnionShare to securely and anonymously send files and folders to people. Just open a share tab, drag in the files and folders you wish to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27
+#: ../../source/features.rst:91
+msgid "After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid "By default, as soon as someone finishes downloading your files, OnionShare will automatically stop the server, completely removing the website from the internet. If you want to allow multiple people to download these files, uncheck the \"Stop sharing after files have been sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid "Also, if you uncheck this box, people will be able to download individual files that you share rather than a single compressed version of all of the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid "When you're ready to share, click the \"Start sharing\" button. You can always click \"Stop sharing\", or quit OnionShare, to immediate take the website down. You can also click the up arrow icon in the top-right corner to show the history and progress of people downloading files from you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid "Now that you have a website that's sharing files, copy the address and send it to the person you want to receive the files. If the files need to stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid "That person then must load the address in Tor Browser. After logging in with the random password that's included in the web address, they will be able to download the files directly from your computer by clicking the \"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid "You can use OnionShare to let people anonymously upload files directly to your computer, essentially turning it into an anonymous dropbox. Open a receive tab, choose where you want files to get downloaded and other settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid "This will start the OnionShare service. Anyone that loads this address in Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid "You can also click the down arrow icon in the top-right corner to show the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid "When someone uploads files to your receive service, by default they get saved to a folder called ``OnionShare`` in your home folder on your computer, and they get automatically organized into separate subfolders based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid "Setting up an OnionShare receiving service is useful for journalists and others that need to securely accept documents from anonymous sources. When used in this way, OnionShare is sort of like a lightweight, simpler, not quite as secure version of `SecureDrop <https://securedrop.org/>`_, the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid "Just like with malicious email attachments, it's possible that someone could try to hack your computer by uploading a malicious file to your OnionShare service. OnionShare does not add any safety mechanisms to protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid "If you receive an Office document or a PDF through OnionShare, you can convert these documents into PDFs that you know are safe to open using `Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself when opening untrusted documents by opening them in `Tails <https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid "If you want to host your own anonymous dropbox using OnionShare, it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid "If you intend on advertising the OnionShare address on your website or social media profiles, then you should save the tab (see :ref:`save_tabs`) and run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid "You can use OnionShare to host a static HTML website with just a click. Just open a website tab, drag in the files and folders that make up the static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid "If you add an ``index.html`` file, when someone loads your website it will render this page. You should also include any other HTML files, CSS files, JavaScript files, and images that make up the website. (Note that OnionShare only supports hosting *static* websites. It can't host websites that execute code or use databases. So you can't, for example, use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid "If you don't have an ``index.html`` file, then it will show a directory listing instead, and people who load it can look through the files and download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid "By default OnionShare will help secure your website by setting a strict `Content Security Police <https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid "If you want to load content from third-party websites, like assets or JavaScript libraries from CDNs, then you must check the \"Disable Content Security Policy header (allows your website to use third-party resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid "If you want to host a long-term website using OnionShare (that isn't just to quickly show someone something), it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis. You should also save the tab (see :ref:`save_tabs`) so that you can resume the website with the same address if you close OnionShare and re-open it later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid "If your website is intended to be viewed by the public, you should run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid "You can use OnionShare to set up a completely anonymous, secure chat room that doesn't log anything or leave any traces. Just open a chat tab and click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid "After you start the server, copy the OnionShare address and send it to the people who will join this anonymous chat room. If it's important to limit exactly who can join, you should use an encrypted messaging app to send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid "People can join the chat room by loading its OnionShare address in Tor Browser. The chat room requires JavasScript, so everyone who wants to participate must set their security level to Standard or Safer instead of Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid "When someone joins the chat room they get assigned a random name. They can change their name by typing a new name in the box in the left panel and pressing enter. No chat history will get displayed at all, even if others were already chatting in the room, because the chat history isn't saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid "In an OnionShare chat room, everyone is anonymous. Anyone can change their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid "However, if you create an OnionShare chat room and securely send the address only to a small group of trusted friends using encrypted messages, then you can be reasonably confident that the people who join the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid "If you need to already be using an encrypted messaging app, what's the point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid "If you send a message to a Signal group, for example, a copy of your message ends up on each device (the phones and computers, if they set up Signal Desktop) of each member of the group. Even if disappearing messages is enabled, it's hard to confirm that all copies of the messages were actually deleted from all devices, and from any other places (like notifications databases) they may have been saved to. OnionShare chat rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid "OnionShare chat rooms can also be useful for anonymous people wanting to chat securely with someone without needing to create any accounts. For example, a source can send an OnionShare address to a journalist using a disposable email address, and then wait for the journalist to join the chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid "Because OnionShare relies on Tor onion services, connections between Tor Browser and OnionShare are all end-to-end encrypted (E2EE). When someone posts a message to an OnionShare chat room, they send it to the server through the E2EE onion connection, which then sends it to all other members of the chat room using WebSockets, through their E2EE onion connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid "OnionShare doesn't implement any chat encryption on its own. It relies on the Tor onion service's encryption instead."
+msgstr ""
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/help.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/help.po
new file mode 100644
index 00000000..6499d5ec
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/help.po
@@ -0,0 +1,57 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid "This website is full of instructions on how to use OnionShare. Look through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid "If you can't find a solution in this website, please check the `GitHub issues <https://github.com/micahflee/onionshare/issues>`_. It's possible that someone else has encountered the same problem and has either raised it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid "If you can't find a solution to your problem, or you wish to ask a question or suggest a new feature, please `submit an issue <https://github.com/micahflee/onionshare/issues/new>`_. This requires `creating an GitHub account <https://help.github.com/articles/signing-up-for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid "See :ref:`collaborating` for instructions on how to join our Keybase team that we use to discuss the project."
+msgstr ""
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/index.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/index.po
new file mode 100644
index 00000000..9dfa67f6
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/index.po
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid "OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network."
+msgstr ""
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/install.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/install.po
new file mode 100644
index 00000000..ddc85512
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/install.po
@@ -0,0 +1,101 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid "You can download OnionShare for Windows and macOS from the `OnionShare website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid "There are various ways to install OnionShare for Linux, but the recommended way is to use the Flatpak package. Flatpak ensures that you'll always use the most latest dependencies and run OnionShare inside of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid "Make sure you have ``flatpak`` installed and the Flathub repository added by following `these instructions <https://flatpak.org/setup/>`_ for your Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid "Then install OnionShare from Flathub by following `the instructions here <https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid "You can verify that the Windows, macOS, or source package you download is legitimate and hasn't been tampered with by verifying its PGP signature. For Windows and macOS, this step is optional and provides defense in depth: the installers also include their operating system-specific signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid "Windows, macOS, and source packaged are signed by Micah Lee, the core developer, using his PGP public key with fingerprint ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid "In order to verify signatures, you must have GnuPG installed. For macOS you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid "You can find the signatures (``.asc`` files), as well as Windows, macOS, and source packages, at https://onionshare.org/dist/ in the folders named for each version of OnionShare. You can also find them on the `GitHub Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid "Once you have imported Micah's public key into your GnuPG keychain, downloaded the binary, and downloaded the ``.asc`` signature, you can verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid "If you don't see 'Good signature from', then there might be a problem with the integrity of the file (malicious or otherwise), and you perhaps should not install the package. (The WARNING shown above, is not a problem with the package: it only means you have not defined any level of 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid "If you want to learn more about verifying PGP signatures, guides for `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and the `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html.en>`_ may be helpful."
+msgstr ""
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/security.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/security.po
new file mode 100644
index 00000000..f8e68082
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/security.po
@@ -0,0 +1,61 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid "First read :ref:`how_it_works` to understand the basics of how OnionShare works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid "**Third parties don't have access to anything that happens in OnionShare.** When you use OnionShare, you host services directly on your computer. For example, when you share files with OnionShare, you don't upload these files to any server, and when you start an OnionShare chat room, your computer is the chat room server itself. Traditional ways of sharing files or setting up websites and chat rooms require trusting a service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid "**Network eavesdroppers can't spy on anything that happens in OnionShare in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on what happens in an OnionShare service. If the eavesdropper is positioned on the OnionShare user's end, the Tor Browser user's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect Tor Browser with OnionShare's onion service, the traffic will be encrypted using the onion service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid "**Anonymity of OnionShare users are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the OnionShare user anonymously communicates the OnionShare address with the Tor Browser users, the Tor Browser users and eavesdroppers can't learn the identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid "**If an attacker learns about the onion service, they still can't access anything.** There have been attacks against the Tor network that can enumerate onion services. Even if someone discovers the .onion address of an OnionShare onion service, they can't access it without also knowing the service's random password (unless, of course, the OnionShare users chooses to disable the password and make it public). The password is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible password. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid "**Communicating the OnionShare address might not be secure.** The OnionShare user is responsible for securely communicating the OnionShare address with people. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're using OnionShare. If the attacker loads the address in Tor Browser before the legitimate recipient gets to it, they can access the service. If this risk fits the user's threat model, they must find a more secure way to communicate the address, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid "**Communicating the OnionShare address might not be anonymous.** While OnionShare and Tor Browser allow for anonymity, if the user wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare address. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the address. This isn't necessary in cases where there's no need to protect anonymity, such as co-workers who know each other sharing work documents."
+msgstr ""
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..cf3d2f1c
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/sphinx.po
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nb_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
diff --git a/desktop/docs/source/locale/nb_NO/LC_MESSAGES/tor.po b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..642f6a64
--- /dev/null
+++ b/desktop/docs/source/locale/nb_NO/LC_MESSAGES/tor.po
@@ -0,0 +1,235 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: 2020-09-14 21:36+0000\n"
+"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
+"Language: nb_NO\n"
+"Language-Team: none\n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr "Tilkobling til Tor"
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+"Det er flere måter å få OnionShare til å koble til Tor-nettverket. Du kan"
+" endre dem i «Innstillinger», som du kommer til ved å trykke på "
+"tannhjulsikonet nederst til høyre i vinduet."
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr "Bruk Tor som det kommer innebygd i OnionShare"
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+"Dette er den forvalgte måten OnionShare kobler til Tor, og det er også "
+"den enkleste og mest pålitelige måten. Derfor er det også anbefalt for de"
+" fleste brukerne."
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+"Når du åpner OnionShare, vil det starte en Tor-prosess i bakgrunnen som "
+"er satt opp spesifikt for bruk med OnionShare. Denne Tor-prosessen har "
+"ikke innvirkning på andre Tor-prosesser på datamaskinen din, så du kan "
+"kjøre en Tor-nettleser eller bruke systemets Tor i bakgrunnen."
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr "Forsøk automatisk oppsett med Tor-nettleseren"
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+"Du kan sette opp OnionShare til å koble til Tor som den kommer levert med"
+" Tor-nettleseren. Først `last ned Tor-nettleseren "
+"<https://www.torproject.org/download/languages/>`_ hvis du ikke har den "
+"allerede. Med denne innstillingen må du ha Tor-nettleseren åpen i "
+"bakgrunnen mens du bruker OnionShare."
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr "Bruk av systemets Tor i Windows"
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+"Dette er ganske avansert. Du må vite hvordan du redigerer filer i "
+"klartekst og gjøre ting som administrator."
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+#, fuzzy
+msgid "Using a system Tor in macOS"
+msgstr "Bruk av systemets Tor i Windows"
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr "Bruk av systemets Tor på Linux"
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr "Bruk av Tor-broer"
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr "For å sette opp broer, åpne OnionShare-innstillingene."
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr "Bruk av systemets Tor på macOS"
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/nl/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/develop.po b/desktop/docs/source/locale/nl/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/features.po b/desktop/docs/source/locale/nl/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/help.po b/desktop/docs/source/locale/nl/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/index.po b/desktop/docs/source/locale/nl/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/install.po b/desktop/docs/source/locale/nl/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/security.po b/desktop/docs/source/locale/nl/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/nl/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/nl/LC_MESSAGES/tor.po b/desktop/docs/source/locale/nl/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/nl/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/pl/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/develop.po b/desktop/docs/source/locale/pl/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/features.po b/desktop/docs/source/locale/pl/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/help.po b/desktop/docs/source/locale/pl/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/index.po b/desktop/docs/source/locale/pl/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/install.po b/desktop/docs/source/locale/pl/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/security.po b/desktop/docs/source/locale/pl/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/pl/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pl/LC_MESSAGES/tor.po b/desktop/docs/source/locale/pl/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/pl/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/develop.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/features.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/help.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/index.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/install.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/security.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_BR/LC_MESSAGES/tor.po b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/pt_BR/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/develop.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/features.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/help.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/index.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/install.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/security.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/pt_PT/LC_MESSAGES/tor.po b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/pt_PT/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/ro/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/develop.po b/desktop/docs/source/locale/ro/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/features.po b/desktop/docs/source/locale/ro/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/help.po b/desktop/docs/source/locale/ro/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/index.po b/desktop/docs/source/locale/ro/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/install.po b/desktop/docs/source/locale/ro/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/security.po b/desktop/docs/source/locale/ro/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/ro/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ro/LC_MESSAGES/tor.po b/desktop/docs/source/locale/ro/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/ro/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/ru/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/develop.po b/desktop/docs/source/locale/ru/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/features.po b/desktop/docs/source/locale/ru/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/help.po b/desktop/docs/source/locale/ru/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/index.po b/desktop/docs/source/locale/ru/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/install.po b/desktop/docs/source/locale/ru/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/security.po b/desktop/docs/source/locale/ru/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/ru/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/ru/LC_MESSAGES/tor.po b/desktop/docs/source/locale/ru/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/ru/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/develop.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/features.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/help.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/index.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/install.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/security.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sr@latin/LC_MESSAGES/tor.po b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/sr@latin/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/sv/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/develop.po b/desktop/docs/source/locale/sv/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/features.po b/desktop/docs/source/locale/sv/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/help.po b/desktop/docs/source/locale/sv/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/index.po b/desktop/docs/source/locale/sv/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/install.po b/desktop/docs/source/locale/sv/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/security.po b/desktop/docs/source/locale/sv/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/sv/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/sv/LC_MESSAGES/tor.po b/desktop/docs/source/locale/sv/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/sv/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/te/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/develop.po b/desktop/docs/source/locale/te/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/features.po b/desktop/docs/source/locale/te/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/help.po b/desktop/docs/source/locale/te/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/index.po b/desktop/docs/source/locale/te/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/install.po b/desktop/docs/source/locale/te/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/security.po b/desktop/docs/source/locale/te/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/te/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/te/LC_MESSAGES/tor.po b/desktop/docs/source/locale/te/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/te/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/tr/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/develop.po b/desktop/docs/source/locale/tr/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/features.po b/desktop/docs/source/locale/tr/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/help.po b/desktop/docs/source/locale/tr/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/index.po b/desktop/docs/source/locale/tr/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/install.po b/desktop/docs/source/locale/tr/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/security.po b/desktop/docs/source/locale/tr/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/tr/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/tr/LC_MESSAGES/tor.po b/desktop/docs/source/locale/tr/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/tr/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/uk/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..2aa4cb0f
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/advanced.po
@@ -0,0 +1,298 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: 2020-09-20 23:40+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr "Розширене використання"
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr "Збереження вкладок"
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+"Типово, все в OnionShare є тимчасовим. Тільки-но ви закриєте вкладку "
+"OnionShare, її адреса більше не існує і не може бути використана знову. "
+"Але іноді вам може знадобитися служба OnionShare, яка буде постійною. "
+"Наприклад, це буде корисно, якщо ви хочете розмістити вебсайт, який може "
+"зберегти ту саму URL-адресу, навіть якщо ви перезавантажите комп’ютер."
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+"Щоб зробити будь-яку вкладку постійною, позначте \"Зберегти цю вкладку та"
+" автоматично відкривати її, коли я відкриваю OnionShare\" перед запуском "
+"сервера. Коли вкладку збережено, ліворуч від стану сервера з’являється "
+"фіолетова піктограма у вигляді шпильки."
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+"Коли ви вийдете з OnionShare, а потім знову відкриєте його, збережені "
+"вкладки почнуть відкриватися. Вам доведеться власноруч запускати кожну "
+"службу, але коли ви це зробите, вони запустяться з тієї ж адреси "
+"OnionShare і з тим же паролем."
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+"Якщо ви збережете вкладку, копія таємного ключа служби onion цієї вкладки"
+" зберігатиметься на вашому комп’ютері з налаштуваннями OnionShare."
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr "Вимкнення паролів"
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+"Типово усі служби OnionShare захищено іменем користувача `onionshare` та "
+"випадково сформованим паролем. Якщо хтось зробить 20 неправильних спроб "
+"введення пароля, вашу службу onion буди зупинено автоматично, щоб "
+"запобігти грубому нападу на службу OnionShare."
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+"Але іноді вам може знадобитися, щоб ваша служба OnionShare була "
+"загальнодоступною. Наприклад, якщо ви хочете налаштувати службу отримання"
+" OnionShare, щоб інші могли безпечно та анонімно надсилати вам файли. У "
+"цьому випадку краще взагалі вимкнути пароль. Якщо ви цього не зробите, "
+"хтось може змусити ваш сервер зупинитися, просто зробивши 20 неправильних"
+" спроб введення паролю, навіть якщо вони знають правильний пароль."
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+"Щоб вимкнути пароль для будь-якої вкладки, просто позначте \"Не "
+"використовувати пароль\" перед запуском сервера. Тоді сервер буде "
+"загальнодоступним і не матиме пароля."
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr "Запланований час"
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+"OnionShare підтримує планування, коли саме служба повинна запускатися та "
+"зупинятися. Перш ніж запускати сервер, натисніть \"Показати розширені "
+"налаштування\" на його вкладці, а потім позначте \"Запускати службу onion"
+" у запланований час\", \"Зупинити службу onion у запланований час\" або "
+"обидва і встановіть бажані дати та час."
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+"Якщо ви запланували запуск послуги в майбутньому, після натискання кнопки"
+" запуску ви побачите таймер зі зворотним відліком до моменту запуску. "
+"Якщо ви запланували його зупинку в майбутньому, після його запуску ви "
+"побачите таймер з відліком часу, коли його буде автоматично зупинено."
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+"**Планування служби OnionShare для автоматичного запуску може "
+"використовуватися як кнопка мерця**, де вашу службу буде оприлюднено в "
+"певний час у майбутньому, якщо з вами щось станеться. Якщо з вами нічого "
+"не відбувається, ви можете вимкнути службу до запланованого запуску."
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+"**Планування автоматичної зупинки служби OnionShare може бути корисним "
+"для обмеження надсилання**, наприклад, якщо ви хочете поділитися таємними"
+" документами й буди певними, що вони не доступні в Інтернеті впродовж "
+"більше кількох днів."
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr "Інтерфейс командного рядка"
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr "Окрім графічного інтерфейсу, OnionShare має інтерфейс командного рядка."
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr "Linux"
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+"Якщо встановити OnionShare за допомогою пакунку Flatpak, на жаль, "
+"інтерфейс командного рядка не підтримуватиметься."
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+"Якщо ви встановили OnionShare за допомогою пакунка операційної системи, "
+"ви можете просто запустити ``onionshare`` з термінала."
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr "macOS"
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+"Зробіть символічне посилання на двійковий OnionShare у командному рядку "
+"подібно до цього ::"
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr "Тепер ви можете запустити ``onionshare`` з термінала."
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr "Windows"
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr "Інтерфейс командного рядка не підтримується в Windows."
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+"Якщо ви все ж хочете ним скористатися, ви можете налаштувати середовище "
+"розробки Windows (подробиці :ref:`starting_development`), а потім "
+"запустити його в командному рядку::"
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr "Користування"
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+"Ви можете переглянути документацію командного рядка, запустивши "
+"``onionshare --help``::"
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr "Застарілі адреси"
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+"Типово, OnionShare використовує служби onion Tor v3. Це сучасні адреси "
+"onion, що мають 56 символів, наприклад::"
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+"Але він все ще підтримує адреси onion v2, старий тип адрес onion, які "
+"мають 16 символів, наприклад::"
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+"OnionShare називає адреси onion v2 \"застарілими адресами\". Адреси onion"
+" v3 безпечніші, а вживання старих адрес не рекомендовано."
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+"Щоб вживати застарілі адреси, перед запуском сервера натисніть \"Показати"
+" розширені налаштування\" на його вкладці та позначте \"Користуватися "
+"застарілою адресою (служба onion v2, не рекомендовано)\". У застарілому "
+"режимі ви можете додатково ввімкнути автентифікацію клієнта Tor. Після "
+"запуску сервера у застарілому режимі ви не зможете вилучити застарілий "
+"режим у цій вкладці. Натомість ви повинні запустити окрему службу в "
+"окремій вкладці."
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+"Проєкт Tor планує `повністю припинити роботу службами onion v2 "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ 15 жовтня 2021 "
+"р., а застарілі служби onion також скоро буде вилучено з OnionShare."
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/develop.po b/desktop/docs/source/locale/uk/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..c60595af
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/develop.po
@@ -0,0 +1,328 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: 2020-09-20 02:39+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr "Розробка OnionShare"
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr "Співпраця"
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+"OnionShare має відкриту команду Keybase, яку ми використовуємо для "
+"обговорення проєкту, включно з питаннями, обміном ідеями та дизайном, "
+"плануванням подальшого розвитку. (Це також простий спосіб надсилати захищені "
+"наскрізним шифруванням прямі повідомлення іншим у спільноті OnionShare, як-"
+"от адреси OnionShare.) Щоб використовувати Keybase, потрібно завантажити "
+"програму `Keybase app <https://keybase.io/download>`_, створіть обліковий "
+"запис та `приєднайтеся до цієї команди <https://keybase.io/team/onionshare>`"
+"_. У програмі перейдіть до Команди, натисніть \"Приєднатися до команди\" та "
+"введіть \"onionshare\"."
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+"OnionShare також має `список розсилки <https://lists.riseup.net/www/"
+"subscribe/onionshare-dev>` _ для розробників та дизайнерів для обговорення "
+"проєкту."
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr "Внесок до кодової бази"
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+"Джерельний код OnionShare знаходиться у цьому сховищі git: https://github."
+"com/micahflee/onionshare"
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+"Якщо ви хочете допомогти кодом OnionShare, приєднайтеся до команди Keybase і "
+"поставте питання про те, над чим ви думаєте працювати. Ви також повинні "
+"переглянути всі `відкриті запити <https://github.com/micahflee/onionshare/"
+"issues>`_ на GitHub, щоб побачити, чи є такі, які ви хотіли б розробляти."
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+"Коли ви будете готові внести код, відкрийте запит надсилання до сховища "
+"GitHub і один із супровідників проєкту перегляне його та, можливо, поставить "
+"питання, попросить змінити щось, відхилить його або об’єднає з проєктом."
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr "Початок розробки"
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+"OnionShare розроблено на Python. Спочатку клонуйте сховище git за адресою "
+"https://github.com/micahflee/onionshare/, а потім перегляньте настанови у "
+"файлі ``BUILD.md``."
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr "Цей файл містить необхідні технічні настанови та команди:"
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr "Встановіть залежності для вашої платформи"
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr "Запустіть OnionShare з джерельного коду без створення пакунка"
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr "Створення пакунків"
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr "Випуск версії OnionShare"
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr "Поради щодо зневадження"
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr "Детальний режим"
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+"Під час розробки зручно запускати OnionShare з термінала та додати до "
+"команди прапор ``--verbose`` (або ``-v``). До термінала виводитиметься "
+"багато корисних повідомлень, наприклад, про ініціалізацію певних об'єктів, "
+"про події (наприклад, натискання кнопок, збереження або перезавантаження "
+"параметрів) та інші подробиці для зневаджування. Наприклад::"
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+"Ви можете додати власні повідомлення про зневадження, запустивши метод "
+"``Common.log`` з ``onionshare/common.py``. Наприклад::"
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+"Це може бути корисно для вивчення ланцюжка подій, що відбуваються під час "
+"користування програмою, або значень певних змінних до та після того, як ними "
+"маніпулюють."
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr "Лише локальні"
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+"Tor повільний і часто під час розробки зручно взагалі знехтувати початковими "
+"службами onion. Ви можете зробити це за допомогою прапора ``--local-only``. "
+"Наприклад::"
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+"У цьому випадку ви завантажуєте URL-адресу ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` у звичайному переглядачі, як-от Firefox, замість "
+"користування Tor Browser."
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr "Зневадження на Windows"
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+"Якщо ви хочете отримати вихідні дані зневадження з ``onionshare-gui.exe`` у "
+"Windows, вам потрібно змінити ``install\\pyinstaller.spec`` й змінити "
+"``console=False`` на ``console=True``."
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+"Потім перезберіть EXE за допомогою ``install\\build_exe.bat`` (можливо, вам "
+"доведеться закоментувати команди ``signtool`` у файлах ``build_exe.bat`` та "
+"``onionshare.nsi``, відповідно до настанов ``BUILD.md``)."
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+"Після цього ви можете запустити ``onionshare-gui.exe -v`` з командного "
+"рядка, щоб побачити подробиці зневадження."
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr "Допомога з перекладами"
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+"Більшість програм OnionShare можна перекласти. Ви можете допомогти зробити "
+"його простішим у користуванні та звичнішим і приємнішим для людей по всьому "
+"світу. Лабораторія локалізації має `документацію щодо перекладу OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+"OnionShare використовує Weblate для відстеження перекладів. Ви можете "
+"переглянути проєкт OnionShare тут: https://hosted.weblate.org/projects/"
+"onionshare/"
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+"Щоб допомогти перекласти, створіть обліковий запис на Hosted Weblate і "
+"почніть допомагати цьому проєкту."
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr "Пропозиції для джерельних рядків англійською"
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+"Іноді джерельні англійські рядки можна вдосконалити, щоб спростити їхній "
+"переклад іншими мовами."
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+"Якщо маєте пропозиції щодо поліпшення англійського рядка, відкрийте "
+"пропозицію на GitHub, а не коментуйте на Weblate. Це гарантує, що "
+"розробники, що працюють над проєктом, напевно побачать пропозицію та зможуть "
+"потенційно змінити рядок за допомогою звичайних процесів перегляду коду."
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr "Стан перекладів"
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+"Ось поточний стан перекладу. Якщо ви хочете розпочати переклад мовою, якої "
+"тут немає, будь ласка, напишіть нам до списку розсилки: onionshare-dev@lists."
+"riseup.net"
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr "Перекладіть файл .desktop"
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr "Ви також можете перекласти файл ``install/onionshare.desktop``."
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+"Дублюйте рядок, який починається на ``Comment=``. Додайте код мови до нового "
+"рядка, щоб він став ``Comment[lang]=`` (lang повинен бути вашою мовою). Ви "
+"можете побачити, які мовні коди використовуються для перекладу, переглянувши "
+"назви файлів ::"
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr "Зробіть те ж саме для інших неперекладених рядків."
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/features.po b/desktop/docs/source/locale/uk/LC_MESSAGES/features.po
new file mode 100644
index 00000000..7db18a70
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/features.po
@@ -0,0 +1,389 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-20 02:39+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr "Як працює OnionShare"
+
+#: ../../source/features.rst:6
+msgid "OnionShare works by starting web servers locally on your own computer and making them accessible to other people as `Tor <https://www.torproject.org/>`_ `onion services <https://community.torproject.org/onion-services/>`_."
+msgstr ""
+"OnionShare працює, запускаючи вебсервери локально на вашому комп’ютері та "
+"роблячи їх доступними для інших людей як `Tor <https://www.torproject.org/>`"
+"_ `onion служби <https://community.torproject.org/onion-services/>`_."
+
+#: ../../source/features.rst:8
+msgid "By default, OnionShare web addresses are protected with a random password. A typical OnionShare address might look something like this::"
+msgstr ""
+"Типово, вебадреси OnionShare захищено випадковим паролем. Типова адреса "
+"OnionShare може виглядати приблизно так::"
+
+#: ../../source/features.rst:12
+msgid "You're responsible for securely sharing that URL using a communication channel of your choice like in an encrypted chat message, or using something less secure like a Twitter or Facebook message, depending on your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+"Ви несете відповідальність за безпечний доступ до цієї URL-адреси за "
+"допомогою вибраного вами каналу зв'язку, як-от у зашифрованому повідомленні "
+"чату, або за використання менш захищеного повідомлення, наприклад "
+"повідомлення Twitter або Facebook, залежно від вашої `моделі загрози "
+"<https://ssd.eff.org/en/module/your-security-plan>`_."
+
+#: ../../source/features.rst:14
+msgid "The people who you send the URL to must then copy and paste it into `Tor Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+"Люди, яким ви надсилаєте URL-адресу, повинні копіювати та вставити її до `"
+"Tor Browser <https://www.torproject.org/>`_, щоб отримати доступ до служби "
+"OnionShare."
+
+#: ../../source/features.rst:16
+msgid "With OnionShare, *your own computer is the web server*. If you run OnionShare on your laptop to send someone files, and then suspend your laptop before the files have been downloaded, the service will not be available until your laptop is unsuspended and connected to the internet again. OnionShare works best when working with people in real-time."
+msgstr ""
+"За допомогою OnionShare *ваш власний комп'ютер є вебсервером*. Якщо ви "
+"запустили OnionShare на своєму ноутбуці, щоб надіслати комусь файли, а потім "
+"призупинили роботу ноутбука до того, як файли буде завантажено, служба буде "
+"недоступна, доки ваш ноутбук не буде увімкнено та знову під’єднано до "
+"Інтернету. OnionShare найкраще працює для роботи з людьми в режимі реального "
+"часу."
+
+#: ../../source/features.rst:18
+msgid "Because your own computer is the web server, *no third party can access anything that happens in OnionShare*, not even the developers of OnionShare. It's completely private. And because OnionShare is based on Tor onion services too, it also protects your anonymity. See the :doc:`security design </security>` for more information."
+msgstr ""
+"Оскільки ваш власний комп'ютер є вебсервером, *ніхто сторонній не може "
+"отримати доступ до будь-чого, що відбувається в OnionShare*, навіть "
+"розробники OnionShare. Це цілковито приватно. Оскільки OnionShare теж "
+"базується на onion службах Tor, вашу анонімність також захищено. Докладніше "
+"про це :doc:`security design </security>`."
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr "Надсилання файлів"
+
+#: ../../source/features.rst:23
+msgid "You can use OnionShare to securely and anonymously send files and folders to people. Just open a share tab, drag in the files and folders you wish to share, and click \"Start sharing\"."
+msgstr ""
+"Ви можете використовувати OnionShare, щоб безпечно та анонімно надсилати "
+"файли та теки людям. Просто відкрийте вкладку спільного доступу, перетягніть "
+"файли та теки, якими хочете поділитися і натисніть \"Почати ділитися\"."
+
+#: ../../source/features.rst:27
+#: ../../source/features.rst:91
+msgid "After you add files, you'll see some settings. Make sure you choose the setting you're interested in first before you start sharing."
+msgstr ""
+"Після додавання файлів з'являться параметри. Перш ніж почати ділитися, обов’"
+"язково виберіть параметр, який вам потрібен."
+
+#: ../../source/features.rst:31
+msgid "By default, as soon as someone finishes downloading your files, OnionShare will automatically stop the server, completely removing the website from the internet. If you want to allow multiple people to download these files, uncheck the \"Stop sharing after files have been sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+"Типово, як тільки хтось закінчує завантажувати ваші файли, OnionShare "
+"автоматично зупиняє сервер, повністю вилучивши вебсайт з Інтернету. Якщо ви "
+"хочете дозволити кільком людям завантажувати ці файли, приберіть позначку "
+"біля пункту \"Закрити доступ, коли файли надіслано (приберіть позначку, щоб "
+"дозволити завантаження окремих файлів)\"."
+
+#: ../../source/features.rst:33
+msgid "Also, if you uncheck this box, people will be able to download individual files that you share rather than a single compressed version of all of the files."
+msgstr ""
+"Крім того, якщо прибрати цю позначку, користувачі зможуть завантажувати "
+"окремі файли, якими ви ділитесь, а не одну стиснуту версію всіх файлів."
+
+#: ../../source/features.rst:35
+msgid "When you're ready to share, click the \"Start sharing\" button. You can always click \"Stop sharing\", or quit OnionShare, to immediate take the website down. You can also click the up arrow icon in the top-right corner to show the history and progress of people downloading files from you."
+msgstr ""
+"Коли ви будете готові поділитися, натисніть кнопку \"Почати ділитися\". Ви "
+"завжди можете натиснути \"Зупинити надсилання\" або вийти з OnionShare, щоб "
+"негайно вимкнути вебсайт. Ви також можете натиснути піктограму зі стрілкою "
+"вгору у верхньому правому куті, щоб побачити історію та поступ надсилання "
+"файлів."
+
+#: ../../source/features.rst:39
+msgid "Now that you have a website that's sharing files, copy the address and send it to the person you want to receive the files. If the files need to stay secure, you should use an encrypted messaging app."
+msgstr ""
+"Тепер, коли у вас є вебсайт, з якого надсилаються файли, копіюйте адресу та "
+"надішліть її особі, якій ви хочете надіслати файли. Якщо файли повинні "
+"залишатися в безпеці, вам варто скористатися програмою зашифрованих "
+"повідомлень."
+
+#: ../../source/features.rst:41
+msgid "That person then must load the address in Tor Browser. After logging in with the random password that's included in the web address, they will be able to download the files directly from your computer by clicking the \"Download Files\" link in the corner."
+msgstr ""
+"Потім ця особа повинна завантажити адресу в Tor Browser. Після входу за "
+"випадковим паролем, який міститься у вебадресі, вони зможуть завантажити "
+"файли безпосередньо з вашого комп’ютера, натиснувши посилання \"Завантажити "
+"файли\" в кутку."
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr "Отримання файлів"
+
+#: ../../source/features.rst:48
+msgid "You can use OnionShare to let people anonymously upload files directly to your computer, essentially turning it into an anonymous dropbox. Open a receive tab, choose where you want files to get downloaded and other settings, and then click \"Start Receive Mode\"."
+msgstr ""
+"Ви можете використовувати OnionShare, щоб дозволити людям анонімно "
+"завантажувати файли безпосередньо на ваш комп’ютер, по суті, перетворивши "
+"його на анонімну скриньку. Відкрийте вкладку отримання, виберіть, куди "
+"потрібно завантажувати файли, та інші параметри, а потім натисніть "
+"\"Запустити режим отримання\"."
+
+#: ../../source/features.rst:52
+msgid "This will start the OnionShare service. Anyone that loads this address in Tor Browser will be able to upload files to your computer."
+msgstr ""
+"Запуститься служба OnionShare. Той, хто завантажить цю адресу в Tor Browser, "
+"зможе завантажувати файли на ваш комп’ютер."
+
+#: ../../source/features.rst:56
+msgid "You can also click the down arrow icon in the top-right corner to show the history and progress of people sending files to you."
+msgstr ""
+"Також можна клацнути піктограму зі стрілкою вниз у верхньому правому куті, "
+"щоб побачити історію і перебіг надсилання файлів."
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr "Ось як це виглядає для когось, хто надсилає вам файли."
+
+#: ../../source/features.rst:62
+msgid "When someone uploads files to your receive service, by default they get saved to a folder called ``OnionShare`` in your home folder on your computer, and they get automatically organized into separate subfolders based on the time that the files get uploaded."
+msgstr ""
+"Коли хтось завантажує файли до вашої службу отримання, типово вони "
+"зберігаються у теці з назвою ``OnionShare`` у вашій домашній теці на вашому "
+"комп'ютері та автоматично впорядковуються до окремих підтек залежно від часу "
+"завантаження файлів."
+
+#: ../../source/features.rst:64
+msgid "Setting up an OnionShare receiving service is useful for journalists and others that need to securely accept documents from anonymous sources. When used in this way, OnionShare is sort of like a lightweight, simpler, not quite as secure version of `SecureDrop <https://securedrop.org/>`_, the whistleblower submission system."
+msgstr ""
+"Налаштування служби приймання OnionShare корисно для журналістів та інших "
+"осіб, яким потрібно безпечно приймати документи від анонімних джерел. "
+"Використовуючи таким чином, OnionShare як легку, простішу, не настільки "
+"безпечну версію `SecureDrop <https://securedrop.org/>`_, системи подання "
+"таємних повідомлень викривачів."
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr "Використовуйте на власний ризик"
+
+#: ../../source/features.rst:69
+msgid "Just like with malicious email attachments, it's possible that someone could try to hack your computer by uploading a malicious file to your OnionShare service. OnionShare does not add any safety mechanisms to protect your system from malicious files, so use at your own risk."
+msgstr ""
+"Як і у випадку зі шкідливими вкладеннями електронної пошти, можливо, хтось "
+"може спробує зламати ваш комп’ютер, завантаживши шкідливий файл до вашої "
+"служби OnionShare. OnionShare не додає жодних механізмів безпеки, щоб "
+"захистити вашу систему від шкідливих файлів, тому використовуйте її на свій "
+"страх і ризик."
+
+#: ../../source/features.rst:71
+msgid "If you receive an Office document or a PDF through OnionShare, you can convert these documents into PDFs that you know are safe to open using `Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself when opening untrusted documents by opening them in `Tails <https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ disposable VM."
+msgstr ""
+"Якщо ви отримали документ Office або PDF-файл за допомогою OnionShare, ці "
+"документи можна перетворити на PDF-файли, які можна безпечно відкрити за "
+"допомогою `Dangerzone <https://dangerzone.rocks/>`_. Ви також можете "
+"захистити себе під час відкриття ненадійних документів, відкривши їх в "
+"одноразових віртуальних машинах `Tails <https://tails.boum.org/>`_ або в `"
+"Qubes <https://qubes-os.org/>`_."
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr "Поради щодо запуску служби отримання"
+
+#: ../../source/features.rst:76
+msgid "If you want to host your own anonymous dropbox using OnionShare, it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis."
+msgstr ""
+"Якщо ви хочете розмістити свою власну анонімну скриньку за допомогою "
+"OnionShare, рекомендовано робити це на окремому виділеному комп’ютері, який "
+"завжди ввімкнено та під'єднано до Інтернету, а не на тому, яким ви "
+"користуєтеся регулярно."
+
+#: ../../source/features.rst:78
+msgid "If you intend on advertising the OnionShare address on your website or social media profiles, then you should save the tab (see :ref:`save_tabs`) and run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+"Якщо ви маєте намір рекламувати адресу OnionShare на своєму вебсайті або в "
+"профілях соціальних мереж, вам слід зберегти вкладку (докладніше "
+":ref:`save_tabs`) і запустити її як загальнодоступну службу (докладніше "
+":ref:`disable_passwords`)."
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr "Розміщення вебсайту"
+
+#: ../../source/features.rst:83
+msgid "You can use OnionShare to host a static HTML website with just a click. Just open a website tab, drag in the files and folders that make up the static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+"Ви можете використовувати OnionShare для розміщення статичного вебсайту HTML "
+"лише одним натисканням миші. Просто відкрийте вкладку вебсайту, перетягніть "
+"файли та теки, що складають статичний вебсайт і натисніть кнопку \"Почати "
+"ділитися\", коли будете готові."
+
+#: ../../source/features.rst:87
+msgid "If you add an ``index.html`` file, when someone loads your website it will render this page. You should also include any other HTML files, CSS files, JavaScript files, and images that make up the website. (Note that OnionShare only supports hosting *static* websites. It can't host websites that execute code or use databases. So you can't, for example, use WordPress.)"
+msgstr ""
+"Якщо ви додасте файл ``index.html``, коли хтось завантажить ваш вебсайт, він "
+"покаже цю сторінку. Слід також включити будь-які інші файли HTML, файли CSS, "
+"файли JavaScript та зображення, що складають вебсайт. (Зверніть увагу, що "
+"OnionShare підтримує розміщення лише *статичних* вебсайтів. Він не може "
+"розміщувати вебсайти, які виконують код або використовують бази даних. Тож "
+"ви не можете, наприклад, використовувати WordPress.)"
+
+#: ../../source/features.rst:89
+msgid "If you don't have an ``index.html`` file, then it will show a directory listing instead, and people who load it can look through the files and download them."
+msgstr ""
+"Якщо у вас немає файлу ``index.html`` замість нього буде показано список "
+"каталогів, а люди, які завантажують його, зможуть оглядати файли та "
+"завантажувати їх."
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr "Політика безпеки вмісту"
+
+#: ../../source/features.rst:98
+msgid "By default OnionShare will help secure your website by setting a strict `Content Security Police <https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However this will prevent third-party content from loading inside the web page."
+msgstr ""
+"Типово OnionShare допоможе захистити ваш вебсайт, встановивши надійний "
+"заголовок `Content Security Police <https://en.wikipedia.org/wiki/"
+"Content_Security_Policy>`_. Однак, це запобігає завантаженню сторонніх "
+"матеріалів на вебсторінку."
+
+#: ../../source/features.rst:100
+msgid "If you want to load content from third-party websites, like assets or JavaScript libraries from CDNs, then you must check the \"Disable Content Security Policy header (allows your website to use third-party resources)\" box before starting the service."
+msgstr ""
+"Якщо ви хочете завантажити вміст зі сторонніх вебсайтів, як-от активи або "
+"бібліотеки JavaScript із CDN, то перед запуском служби потрібно встановити "
+"позначку \"Не надсилати заголовок політики безпеки вмісту (дозволяє вебсайту "
+"застосовувати сторонні ресурси)\"."
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr "Поради щодо запуску служби розміщення вебсайту"
+
+#: ../../source/features.rst:105
+msgid "If you want to host a long-term website using OnionShare (that isn't just to quickly show someone something), it's recommended that you do it on a separate, dedicated computer that's always powered on and connected to the internet, and not on the one you use on a regular basis. You should also save the tab (see :ref:`save_tabs`) so that you can resume the website with the same address if you close OnionShare and re-open it later."
+msgstr ""
+"Якщо ви хочете розмістити довгостроковий вебсайт за допомогою OnionShare (це "
+"не просто для того, щоб швидко комусь щось показати), рекомендовано робити "
+"це на окремому виділеному комп’ютері, який завжди ввімкнено та під'єднано до "
+"Інтернету, а не на той, яким ви користуєтеся регулярно. Вам також слід "
+"зберегти вкладку (подробиці :ref:`save_tabs`), щоб ви могли відновити "
+"вебсайт з тією ж адресою, якщо закриєте OnionShare і знову відкриєте його "
+"пізніше."
+
+#: ../../source/features.rst:107
+msgid "If your website is intended to be viewed by the public, you should run it as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+"Якщо ваш вебсайт призначено для загального перегляду, вам слід запустити "
+"його як загальнодоступну службу (подробиці :ref:`disable_passwords`)."
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr "Спілкуйтеся таємно"
+
+#: ../../source/features.rst:112
+msgid "You can use OnionShare to set up a completely anonymous, secure chat room that doesn't log anything or leave any traces. Just open a chat tab and click \"Start chat server\"."
+msgstr ""
+"Ви можете застосовувати OnionShare для створення цілковито анонімної, "
+"захищеної кімнати чату, яка нічого не реєструє та не залишає слідів. Просто "
+"відкрийте вкладку чату та натисніть \"Запустити сервер чату\"."
+
+#: ../../source/features.rst:116
+msgid "After you start the server, copy the OnionShare address and send it to the people who will join this anonymous chat room. If it's important to limit exactly who can join, you should use an encrypted messaging app to send the OnionShare address."
+msgstr ""
+"Після запуску сервера копіюйте адресу OnionShare і надішліть її людям, які "
+"приєднаються до цієї анонімної кімнати чату. Якщо важливо обмежити коло, хто "
+"може приєднатися, ви повинні використовувати зашифровані програми обміну "
+"повідомленнями для надсилання адреси OnionShare."
+
+#: ../../source/features.rst:120
+msgid "People can join the chat room by loading its OnionShare address in Tor Browser. The chat room requires JavasScript, so everyone who wants to participate must set their security level to Standard or Safer instead of Safest."
+msgstr ""
+"Люди можуть приєднатися до чату, завантаживши його адресу OnionShare у Tor "
+"Browser. Для чату потрібен JavasScript, тому всі, хто хоче взяти участь, "
+"повинні встановити рівень безпеки на Стандартний або Безпечніший замість "
+"Найбезпечніший."
+
+#: ../../source/features.rst:122
+msgid "When someone joins the chat room they get assigned a random name. They can change their name by typing a new name in the box in the left panel and pressing enter. No chat history will get displayed at all, even if others were already chatting in the room, because the chat history isn't saved anywhere."
+msgstr ""
+"Коли хтось приєднується до чату, йому присвоюється випадкове ім'я. Вони "
+"можуть змінити своє ім’я, ввівши нове ім’я у полі на лівій панелі та "
+"натиснувши клавішу Enter. Попередні повідомлення взагалі не з'являться, "
+"навіть якщо інші вже спілкувалися в чаті, оскільки історія чату ніде не "
+"зберігається."
+
+#: ../../source/features.rst:126
+msgid "In an OnionShare chat room, everyone is anonymous. Anyone can change their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+"У чаті OnionShare всі анонімні. Будь-хто може змінити своє ім'я на яке "
+"завгодно і жодного способу підтвердження особи не існує."
+
+#: ../../source/features.rst:128
+msgid "However, if you create an OnionShare chat room and securely send the address only to a small group of trusted friends using encrypted messages, then you can be reasonably confident that the people who join the chat room are your friends."
+msgstr ""
+"Однак, якщо ви створюєте чат OnionShare і безпечно надсилаєте адресу лише "
+"невеликій групі надійних друзів за допомогою зашифрованих повідомлень, то ви "
+"можете бути обґрунтовано впевнені, що люди, які приєднуються до чату, є "
+"вашими друзями."
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr "Чим це корисно?"
+
+#: ../../source/features.rst:133
+msgid "If you need to already be using an encrypted messaging app, what's the point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+"Якщо вам вже потрібно використовувати програму обміну зашифрованим "
+"повідомленнями, то який сенс спілкування в OnionShare? Він залишає менше "
+"слідів."
+
+#: ../../source/features.rst:135
+msgid "If you send a message to a Signal group, for example, a copy of your message ends up on each device (the phones and computers, if they set up Signal Desktop) of each member of the group. Even if disappearing messages is enabled, it's hard to confirm that all copies of the messages were actually deleted from all devices, and from any other places (like notifications databases) they may have been saved to. OnionShare chat rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+"Наприклад, якщо ви надсилаєте повідомлення до групи в Signal, копія "
+"повідомлення потрапляє на кожен пристрій (телефони та комп’ютери, якщо на "
+"них встановлено Signal для комп'ютерів) кожного з учасників групи. Навіть "
+"якщо ввімкнено повідомлення що зникають, важко впевнитися, що всі копії "
+"повідомлень було фактично видалено з усіх пристроїв та з будь-яких інших "
+"місць (наприклад, баз даних сповіщень), до яких вони могли бути збережені. "
+"Чати OnionShare ніде не зберігають жодних повідомлень, тому це не проблема."
+
+#: ../../source/features.rst:137
+msgid "OnionShare chat rooms can also be useful for anonymous people wanting to chat securely with someone without needing to create any accounts. For example, a source can send an OnionShare address to a journalist using a disposable email address, and then wait for the journalist to join the chat room, all without compromosing their anonymity."
+msgstr ""
+"Чати OnionShare також можуть бути корисними для анонімних людей, які хочуть "
+"безпечно спілкуватися з кимось, не створюючи жодних облікових записів. "
+"Наприклад, джерело може надіслати журналісту адресу OnionShare за допомогою "
+"одноразової адреси електронної пошти, а потім зачекати, поки журналіст "
+"приєднається до чату і все це без шкоди для їхньої анонімности."
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr "Як працює шифрування?"
+
+#: ../../source/features.rst:142
+msgid "Because OnionShare relies on Tor onion services, connections between Tor Browser and OnionShare are all end-to-end encrypted (E2EE). When someone posts a message to an OnionShare chat room, they send it to the server through the E2EE onion connection, which then sends it to all other members of the chat room using WebSockets, through their E2EE onion connections."
+msgstr ""
+"Оскільки OnionShare покладається на onion служби Tor, з’єднання між Tor "
+"Browser та OnionShare захищено наскрізним шифруванням (E2EE). Коли хтось "
+"публікує повідомлення в кімнаті чату OnionShare, він надсилає його на сервер "
+"через E2EE onion з'єднання, який потім надсилає його всім іншим учасникам "
+"чату за допомогою WebSockets через їхні E2EE onion з'єднання."
+
+#: ../../source/features.rst:144
+msgid "OnionShare doesn't implement any chat encryption on its own. It relies on the Tor onion service's encryption instead."
+msgstr ""
+"OnionShare самостійно не здійснює жодне шифрування чату. Натомість він "
+"покладається на шифрування служби onion служби Tor."
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/help.po b/desktop/docs/source/locale/uk/LC_MESSAGES/help.po
new file mode 100644
index 00000000..9f5d80e6
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/help.po
@@ -0,0 +1,73 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-18 06:51+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr "Довідка"
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr "Якщо вам потрібна допомога з OnionShare, виконайте ці настанови."
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr "Ознайомтеся з цим вебсайтом"
+
+#: ../../source/help.rst:9
+msgid "This website is full of instructions on how to use OnionShare. Look through all of the sections first to see if it answers your questions."
+msgstr ""
+"Цей вебсайт наповнено настановами щодо користування OnionShare. Спочатку "
+"перегляньте всі розділи, щоб дізнатися, чи відповідає він на ваші питання."
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr "Перегляньте наявні проблеми на GitHub"
+
+#: ../../source/help.rst:14
+msgid "If you can't find a solution in this website, please check the `GitHub issues <https://github.com/micahflee/onionshare/issues>`_. It's possible that someone else has encountered the same problem and has either raised it with the developers, or maybe even posted a solution."
+msgstr ""
+"Якщо ви не можете знайти розв'язок на цьому вебсайті, перегляньте `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. Можливо, хтось "
+"інший зіткнувся з тією ж проблемою, або запитав про неї у розробників, або, "
+"можливо, навіть опублікував розв'язок."
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr "Поставте своє питання"
+
+#: ../../source/help.rst:19
+msgid "If you can't find a solution to your problem, or you wish to ask a question or suggest a new feature, please `submit an issue <https://github.com/micahflee/onionshare/issues/new>`_. This requires `creating an GitHub account <https://help.github.com/articles/signing-up-for-a-new-github-account/>`_."
+msgstr ""
+"Якщо не можете знайти розв'язання своєї проблеми або хочете поставити "
+"питання чи запропонувати нову функцію, будь ласка, `надішліть питання "
+"<https://github.com/micahflee/onionshare/issues/new>`_. Для цього потрібно `"
+"створити обліковий запис GitHub <https://help.github.com/articles/"
+"signing-up-for-a-new-github-account/>`_."
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr "Долучайтесь до нашої команди Keybase"
+
+#: ../../source/help.rst:24
+msgid "See :ref:`collaborating` for instructions on how to join our Keybase team that we use to discuss the project."
+msgstr ""
+"Читайте про :ref:`співпрацю`, щоб отримати вказівки щодо приєднання до нашої "
+"команди Keybase, яку ми використовуємо для обговорення проєкту."
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/index.po b/desktop/docs/source/locale/uk/LC_MESSAGES/index.po
new file mode 100644
index 00000000..1e3d6b41
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/index.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: 2020-09-14 23:50+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr "Документація OnionShare"
+
+#: ../../source/index.rst:6
+msgid "OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+"OnionShare — це засіб з відкритим кодом, який дозволяє безпечно та анонімно "
+"обмінюватися файлами, розміщувати вебсайти та спілкуватися з друзями за "
+"допомогою мережі Tor."
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/install.po b/desktop/docs/source/locale/uk/LC_MESSAGES/install.po
new file mode 100644
index 00000000..20212bb9
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/install.po
@@ -0,0 +1,144 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-18 06:51+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr "Встановлення"
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr "Встановлення на Windows або macOS"
+
+#: ../../source/install.rst:7
+msgid "You can download OnionShare for Windows and macOS from the `OnionShare website <https://onionshare.org/>`_."
+msgstr ""
+"Ви можете завантажити OnionShare для Windows та macOS із вебсайту `"
+"OnionShare website <https://onionshare.org/>`_."
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr "Для додаткової безпеки перегляньте :ref:`verifying_sigs`."
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr "Встановлення на Linux за допомогою Flatpak"
+
+#: ../../source/install.rst:16
+msgid "There are various ways to install OnionShare for Linux, but the recommended way is to use the Flatpak package. Flatpak ensures that you'll always use the most latest dependencies and run OnionShare inside of a sandbox."
+msgstr ""
+"Існують різні способи встановлення OnionShare для Linux, але рекомендованим "
+"способом є використання пакунку Flatpak. Flatpak гарантує, що ви завжди "
+"будете користуватися найновішими залежностями та запускати OnionShare "
+"всередині пісочниці."
+
+#: ../../source/install.rst:18
+msgid "Make sure you have ``flatpak`` installed and the Flathub repository added by following `these instructions <https://flatpak.org/setup/>`_ for your Linux distribution."
+msgstr ""
+"Переконайтесь, що у вас встановлено ``flatpak`` та додано сховище Flathub, "
+"дотримуючись `цих настанов <https://flatpak.org/setup/>`_ для вашого "
+"дистрибутива Linux."
+
+#: ../../source/install.rst:20
+msgid "Then install OnionShare from Flathub by following `the instructions here <https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+"Потім встановіть OnionShare із Flathub, дотримуючись `цих настанов "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr "Перевірка підписів PGP"
+
+#: ../../source/install.rst:27
+msgid "You can verify that the Windows, macOS, or source package you download is legitimate and hasn't been tampered with by verifying its PGP signature. For Windows and macOS, this step is optional and provides defense in depth: the installers also include their operating system-specific signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+"Ви можете переконатися, що завантажений пакунок для Windows, macOS або "
+"джерельний пакунок є законним і не підробленим, перевіривши його підпис PGP. "
+"Для Windows та macOS цей крок є необов’язковим, але забезпечує додатковий "
+"захист: встановлювачі також включають свої підписи для конкретної "
+"операційної системи, тож ви можете просто покластись лише на них, якщо "
+"хочете."
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr "Ключ підпису"
+
+#: ../../source/install.rst:32
+msgid "Windows, macOS, and source packaged are signed by Micah Lee, the core developer, using his PGP public key with fingerprint ``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+"Пакунки Windows, macOS та джерельні пакунки підписано основним розробником "
+"Micah Lee його відкритим ключем PGP із цифровим відбитком "
+"`927F419D7EC82C2F149C1BD1403C2657CD994F73``. Ви можете завантажити ключ "
+"Micah з сервера ключів keys.openpgp.org keyserver <https://keys.openpgp.org/"
+"vks/v1/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+
+#: ../../source/install.rst:34
+msgid "In order to verify signatures, you must have GnuPG installed. For macOS you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+"Для перевірки підписів потрібно встановити GnuPG. Для macOS ви, ймовірно, "
+"захочете `GPGTools <https://gpgtools.org/>`_, а для Windows ви, ймовірно, "
+"захочете `Gpg4win <https://www.gpg4win.org/>`_."
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr "Підписи"
+
+#: ../../source/install.rst:39
+msgid "You can find the signatures (``.asc`` files), as well as Windows, macOS, and source packages, at https://onionshare.org/dist/ in the folders named for each version of OnionShare. You can also find them on the `GitHub Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+"Ви можете знайти підписи (файли ``.asc``), а також пакунки Windows, macOS та "
+"джерельні пакунки за адресою https://onionshare.org/dist/ у теках, названих "
+"для кожної версії OnionShare. Ви також можете знайти їх на `сторінці "
+"випусків GitHub <https://github.com/micahflee/onionshare/releases>`_."
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr "Перевірка"
+
+#: ../../source/install.rst:44
+msgid "Once you have imported Micah's public key into your GnuPG keychain, downloaded the binary, and downloaded the ``.asc`` signature, you can verify the binary for macOS in terminal like this::"
+msgstr ""
+"Після того, як відкритий ключ Micah додано до вашої збірки ключів GnuPG, "
+"завантажено двійковий файл і завантажено підпис ``.asc``, ви можете "
+"перевірити двійковий файл для macOS в терміналі в такий спосіб::"
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr "Або для Windows у командному рядку у такий спосіб::"
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr "Очікуваний результат може виглядати так::"
+
+#: ../../source/install.rst:64
+msgid "If you don't see 'Good signature from', then there might be a problem with the integrity of the file (malicious or otherwise), and you perhaps should not install the package. (The WARNING shown above, is not a problem with the package: it only means you have not defined any level of 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+"Якщо ви не бачите 'Good signature from', можливо, проблема з цілісністю "
+"файлу (шкідлива чи інша), і, можливо, вам не слід встановлювати пакунок. ("
+"Вказане раніше ПОПЕРЕДЖЕННЯ не є проблемою з пакунком: воно означає лише, що "
+"ви не визначили жодного рівня 'довіри' щодо самого ключа PGP від Micah.)"
+
+#: ../../source/install.rst:66
+msgid "If you want to learn more about verifying PGP signatures, guides for `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and the `Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html.en>`_ may be helpful."
+msgstr ""
+"Якщо ви хочете дізнатися докладніше про перевірку підписів PGP, настанови "
+"для `Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ та "
+"`Tor Project <https://2019.www.torproject.org/docs/verifying-signatures.html."
+"en>`_ можуть допомогти."
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/security.po b/desktop/docs/source/locale/uk/LC_MESSAGES/security.po
new file mode 100644
index 00000000..7e1deb57
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/security.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-18 06:51+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr "Побудова безпеки"
+
+#: ../../source/security.rst:4
+msgid "First read :ref:`how_it_works` to understand the basics of how OnionShare works."
+msgstr ""
+"Спочатку прочитайте :ref:`how_it_works`, щоб зрозуміти основи роботи "
+"OnionShare."
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+"Як і все програмне забезпечення, OnionShare може містити вади або "
+"вразливості."
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr "Від чого захищає OnionShare"
+
+#: ../../source/security.rst:11
+msgid "**Third parties don't have access to anything that happens in OnionShare.** When you use OnionShare, you host services directly on your computer. For example, when you share files with OnionShare, you don't upload these files to any server, and when you start an OnionShare chat room, your computer is the chat room server itself. Traditional ways of sharing files or setting up websites and chat rooms require trusting a service with access to your data."
+msgstr ""
+"**Сторонні особи не мають доступу до всього, що відбувається в OnionShare.** "
+"Коли ви користуєтеся OnionShare, ви розміщуєте служби безпосередньо на "
+"своєму комп’ютері. Наприклад, коли ви ділитесь файлами з OnionShare, ви не "
+"завантажуєте ці файли на жоден сервер, а коли ви запускаєте кімнату чату "
+"OnionShare, ваш комп'ютер сам є сервером чату. Традиційні способи обміну "
+"файлами або розгортання вебсайтів та чатів вимагають довіри до служби з "
+"доступом до ваших даних."
+
+#: ../../source/security.rst:13
+msgid "**Network eavesdroppers can't spy on anything that happens in OnionShare in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on what happens in an OnionShare service. If the eavesdropper is positioned on the OnionShare user's end, the Tor Browser user's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect Tor Browser with OnionShare's onion service, the traffic will be encrypted using the onion service key."
+msgstr ""
+"**Мережні підслуховувачі не можуть шпигувати за тим, що відбувається в "
+"OnionShare під час передачі.** Оскільки зв’язки між службами onion Tor і Tor "
+"Browser захищено наскрізним шифруванням, жоден зловмисник з мережі не може "
+"підслуховувати те, що відбувається в службі OnionShare. Якщо підслуховувача "
+"розміщено на боці користувача OnionShare, на боці користувача Tor Browser "
+"або на шкідливому вузлі Tor, вони бачитимуть лише трафік Tor. Якщо "
+"підслуховувач — це зловмисний вузол зустрічі, який використовується для "
+"з'єднання Tor Browser зі службою onion OnionShare, трафік буде зашифровано "
+"за допомогою ключа служби onion."
+
+#: ../../source/security.rst:15
+msgid "**Anonymity of OnionShare users are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the OnionShare user anonymously communicates the OnionShare address with the Tor Browser users, the Tor Browser users and eavesdroppers can't learn the identity of the OnionShare user."
+msgstr ""
+"**Анонімність користувачів OnionShare захищено Tor.** OnionShare і Tor "
+"Browser захищають анонімність користувачів. Поки користувач OnionShare "
+"анонімно з'єднується за допомогою адреси OnionShare з користувачами Tor "
+"Browser, користувачі Tor Browser та підслуховувачі не можуть дізнатись особу "
+"користувача OnionShare."
+
+#: ../../source/security.rst:17
+msgid "**If an attacker learns about the onion service, they still can't access anything.** There have been attacks against the Tor network that can enumerate onion services. Even if someone discovers the .onion address of an OnionShare onion service, they can't access it without also knowing the service's random password (unless, of course, the OnionShare users chooses to disable the password and make it public). The password is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible password. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the password."
+msgstr ""
+"**Якщо зловмисник досліджує службу onion, він все одно не може ні до чого "
+"отримати доступ.** Існують атаки проти мережі Tor, які можуть вираховувати "
+"служби onion. Навіть якщо хтось виявить адресу .onion служби onion "
+"OnionShare, він не зможе отримати до неї доступ, не знаючи також випадкового "
+"пароля служби (якщо, звичайно, користувачі OnionShare не вирішать вимкнути "
+"пароль та зробити його загальнодоступним). Пароль створюється шляхом вибору "
+"двох випадкових слів з переліку з 6800 слів, тобто 6800^2, або близько 46 "
+"мільйонів можливих паролів. Але вони можуть зробити лише 20 неправильних "
+"спроб, перш ніж OnionShare зупинить сервер, запобігаючи грубим намаганням "
+"зламати пароль."
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr "Від чого OnionShare не захищає"
+
+#: ../../source/security.rst:22
+msgid "**Communicating the OnionShare address might not be secure.** The OnionShare user is responsible for securely communicating the OnionShare address with people. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're using OnionShare. If the attacker loads the address in Tor Browser before the legitimate recipient gets to it, they can access the service. If this risk fits the user's threat model, they must find a more secure way to communicate the address, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+"** Зв’язок з адресою OnionShare може бути ненадійним.** Користувач "
+"OnionShare несе відповідальність за безпечне передавання адреси OnionShare "
+"людям. Якщо вони надсилають його ненадійно (наприклад, через повідомлення "
+"електронної пошти, і їх електронна пошта контролюється зловмисником), "
+"підслуховувач дізнається, що вони використовують OnionShare. Якщо зловмисник "
+"завантажує адресу в Tor Browser раніше за законного одержувача, він зможе "
+"отримати доступ до служби. Якщо цей ризик є загрозливим для користувачів, їм "
+"необхідно знайти безпечніший спосіб передачі адреси, наприклад, зашифрованим "
+"електронним листом, чатом чи голосовим дзвінком. Це не обов'язково у "
+"випадках, коли OnionShare не використовується для чогось таємного."
+
+#: ../../source/security.rst:24
+msgid "**Communicating the OnionShare address might not be anonymous.** While OnionShare and Tor Browser allow for anonymity, if the user wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare address. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the address. This isn't necessary in cases where there's no need to protect anonymity, such as co-workers who know each other sharing work documents."
+msgstr ""
+"** Зв'язок з адресою OnionShare може бути не анонімним.** Хоча OnionShare і "
+"Tor Browser дозволяють отримати анонімність, якщо користувачі бажають "
+"залишатись анонімними, їм необхідно вжити додаткових заходів для "
+"забезпечення цього, під час повідомлення адреси OnionShare. Наприклад, їм "
+"може знадобитися використовувати Tor для створення нового анонімного "
+"облікового запису електронної пошти чи чату і входити до них лише через Tor, "
+"щоб користуватися ними для повідомлення адреси. Це не потрібно у випадках, "
+"коли немає потреби захищати анонімність, наприклад, колеги, які знають один "
+"одного, обмінюючись робочими документами."
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/uk/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f975c617
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/sphinx.po
@@ -0,0 +1,28 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: 2020-09-14 23:50+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr "Версії"
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr "Мови"
diff --git a/desktop/docs/source/locale/uk/LC_MESSAGES/tor.po b/desktop/docs/source/locale/uk/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..77513c75
--- /dev/null
+++ b/desktop/docs/source/locale/uk/LC_MESSAGES/tor.po
@@ -0,0 +1,292 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: onionshare-dev@lists.riseup.net\n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: 2020-09-20 02:39+0000\n"
+"Last-Translator: ihor_ck <igor_ck@outlook.com>\n"
+"Language-Team: none\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.3-dev\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr "З'єднання з Tor"
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+"Існує кілька способів з'єднання OnionShare з мережею Tor. Ви можете змінити "
+"їх у параметрах, до яких можна перейти, натиснувши піктограму шестірні внизу "
+"праворуч вікна."
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr "Використовуйте Tor, який постачається в комплекті з OnionShare"
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+"Це типовий і водночас найпростіший та найнадійніший спосіб з'єднання "
+"OnionShare з Tor. З цієї причини рекомендуємо його для більшості "
+"користувачів."
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+"Коли ви відкриєте OnionShare, він запустить процес Tor у фоновому режимі, "
+"який спеціально налаштований для використання OnionShare. Цей процес Tor не "
+"заважатиме іншим процесам Tor на вашому комп'ютері, тому ви можете запустити "
+"Tor Browser або використовувати системний Tor у фоновому режимі."
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr "Спробуйте автоматичну конфігурацію за допомогою Tor Browser"
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+"Ви можете налаштувати OnionShare для під'єднання до Tor, який постачається з "
+"Tor Browser. Спочатку `завантажте Tor Browser <https://www.torproject.org>`_ "
+"звідси, якщо у вас його ще немає. Якщо вибрано цей параметр, вам потрібно "
+"залишати Tor Browser відкритим у фоновому режимі під час користування "
+"OnionShare."
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr "Користування системним Tor на Windows"
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+"Це досить просунуто. Вам потрібно знати, як редагувати файли зі звичайним "
+"текстом та виконувати дії від імені адміністратором."
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+"Завантажте набір експерта Tor для Windows, який ви можете отримати `звідси "
+"<https://www.torproject.org/download/tor/>`_. Розархівуйте zip-файл і "
+"скопіюйте видобуту теку в ``C:\\Program Files (x86)\\`` і перейменуйте теку "
+"в ``tor-win32``, так що всередині цієї теки будуть теки ``Data`` та ``Tor``."
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+"Створіть пароль контрольного порту. Я буду використовувати своїм паролем ``"
+"comprised stumble rummage work avenging construct volatile``. Тепер "
+"відкрийте командний рядок як адміністратор і використовуйте ``tor.exe --hash-"
+"password``, щоб створити хеш вашого пароля. Наприклад::"
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+"Вивід хешованого пароля показано після деяких попереджень (якими ви можете "
+"знехтувати). У моєму випадку це було "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+"Тепер створіть новий текстовий файл в ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` та помістіть його до теки, замінивши ``HashedControlPassword``"
+" на той, який ви щойно створили:"
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+"В командному рядку адміністратора встановіть tor як службу, використовуючи "
+"відповідний файл ``torrc``, який ви щойно створили (дивіться `тут "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ для отримання "
+"додаткових подробиць про це). Як це::"
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr "Тепер ви використовуєте системний Tor на Windows!"
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+"Відкрийте OnionShare. Клацніть піктограму Параметри. У розділі \"Як "
+"OnionShare повинен з'єднуватися з Tor?\" виберіть \"Під'єднатися через порт "
+"керування\" та встановіть хостом порту управління ``127.0.0.1``, а портом "
+"``9051``. У розділі \"Параметри автентифікації Tor\" виберіть \"Пароль\" і "
+"встановіть пароль для свого пароля, в моєму випадку ``comprised stumble "
+"rummage work avenging construct volatile``. Натисніть кнопку \"Параметри "
+"тестування\". Якщо все піде добре, ви побачите успішне з'єднання з tor."
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr "Користування системним Tor на macOS"
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+"Спочатку встановіть `Homebrew, <http://brew.sh/>`_ якщо у вас його ще немає. "
+"Потім встановіть Tor::"
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr "Тепер налаштуйте Tor, щоб дозволити з'єднання з OnionShare::"
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr "І запустіть системну Tor-службу::"
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+"Відкрийте OnionShare. Клацніть піктограму Параметри. У розділі \"Як "
+"OnionShare повинен з'єднуватися з Tor?\" виберіть \"Під'єднуватися через "
+"файл сокета\" та встановіть для файлу сокета шлях ``/usr/local/var/run/tor/"
+"control.socket``. У розділі \"Параметри автентифікації Tor\" виберіть \"Без "
+"автентифікації або автентифікація через cookie\". Натисніть кнопку \"Тест "
+"налаштувань\". Якщо все піде добре, ви побачите успішне з'єднання з tor."
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr "Користування системним Tor на Linux"
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+"Спочатку встановіть пакунок tor. Якщо ви використовуєте Debian, Ubuntu або "
+"подібний дистрибутив Linux, я раджу вам використовувати `офіційне сховище "
+"<https://2019.www.torproject.org/docs/debian.html.en>`_. Наприклад, в Ubuntu "
+"20.04::"
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+"Потім додайте користувача до групи, яка запускає процес Tor (у випадку з "
+"Debian і Ubuntu, ``debian-tor``) і налаштуйте OnionShare для під'єднання до "
+"файлу керування сокетом Tor вашої системи."
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+"Додайте свого користувача до групи ``debian-tor``, запустивши цю команду ("
+"замініть ``username`` вашим іменем користувача)::"
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+"Перезавантажте комп'ютер. Після повторного завантаження відкрийте "
+"OnionShare. Клацніть піктограму Параметри. У розділі \"Як OnionShare повинен "
+"з'єднуватися з Tor?\" виберіть \"Під'єднуватися через файл сокета\" та "
+"встановіть для файлу сокета шлях ``/var/run/tor/control``. У розділі "
+"\"Параметри автентифікації Tor\" виберіть \"Без автентифікації або "
+"автентифікація через cookie\". Натисніть кнопку \"Тест налаштувань\". Якщо "
+"все піде добре, ви побачите успішне підключення до Tor."
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr "Користування мостами Tor"
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+"Якщо ваш доступ до Інтернету піддано цензурі, ви можете налаштувати "
+"OnionShare для під'єднання до мережі Tor за допомогою `Мостів Tor "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. Якщо OnionShare "
+"успішно під'єднано до Tor, вам не потрібно використовувати міст."
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr "Щоб налаштувати мости, відкрийте параметри OnionShare."
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+"Ви можете використовувати вбудовані під'єднувані транспорти obfs4, вбудовані "
+"під'єднувані транспорти meek_lite (Azure) або власні мости, які ви можете "
+"отримати від Tor `BridgeDB <https://bridges.torproject.org/>`_. Якщо вам "
+"потрібно використовувати міст, ви повинні спершу спробувати вбудовані obfs4."
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/develop.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/features.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/help.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/index.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/install.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/security.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_CN/LC_MESSAGES/tor.po b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/zh_CN/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/advanced.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/advanced.po
new file mode 100644
index 00000000..c3847657
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/advanced.po
@@ -0,0 +1,227 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-20 11:48-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/advanced.rst:2
+msgid "Advanced usage"
+msgstr ""
+
+#: ../../source/advanced.rst:7
+msgid "Save tabs"
+msgstr ""
+
+#: ../../source/advanced.rst:9
+msgid ""
+"By default, everything in OnionShare is temporary. As soon as you close "
+"an OnionShare tab its address no longer exists and can't be used again. "
+"But sometimes you might want an OnionShare service to be persistent. For "
+"example, this would be useful if you want to host a website that can keep"
+" the same URL even if you reboot your computer."
+msgstr ""
+
+#: ../../source/advanced.rst:11
+msgid ""
+"To make any tab persistent, check the \"Save this tab, and automatically "
+"open it when I open OnionShare\" box before starting the server. When a "
+"tab is saved a purple pin icon appears to the left of its server status."
+msgstr ""
+
+#: ../../source/advanced.rst:15
+msgid ""
+"When you quit OnionShare and then open it again, your saved tabs will "
+"start out open. You'll have to manually start each service, but when you "
+"do they will start with the same OnionShare address, and with the same "
+"password."
+msgstr ""
+
+#: ../../source/advanced.rst:17
+msgid ""
+"If you save a tab, a copy of that tab's onion service secret key will be "
+"stored on your computer with your OnionShare settings."
+msgstr ""
+
+#: ../../source/advanced.rst:22
+msgid "Disable passwords"
+msgstr ""
+
+#: ../../source/advanced.rst:24
+msgid ""
+"By default, all OnionShare services are protected with the username "
+"`onionshare` and a randomly-generated password. If someone makes 20 wrong"
+" guesses of the password, your onion service is automatically stopped to "
+"prevent a brute force attack against the OnionShare service."
+msgstr ""
+
+#: ../../source/advanced.rst:26
+msgid ""
+"But sometimes you might want your OnionShare service to be accessible to "
+"the public. For example, if you want to set up an OnionShare receive "
+"service so the public can securely and anonymously send you files. In "
+"this case, it's better to disable the password altogether. If you don't "
+"do this, someone can force your server to stop just by making 20 wrong "
+"guesses of your password, even if they know the correct password."
+msgstr ""
+
+#: ../../source/advanced.rst:28
+msgid ""
+"To disable the password for any tab, just check the \"Don't use a "
+"password\" box before starting the server. Then the server will be public"
+" and won't have a password."
+msgstr ""
+
+#: ../../source/advanced.rst:31
+msgid "Scheduled times"
+msgstr ""
+
+#: ../../source/advanced.rst:33
+msgid ""
+"OnionShare supports scheduling exactly when a service should start and "
+"stop. Before starting server, click \"Show advanced settings\" in its tab"
+" and then check the boxes next to either \"Start onion service at "
+"scheduled time\", \"Stop onion service at scheduled time\", or both, and "
+"set the desired dates and times."
+msgstr ""
+
+#: ../../source/advanced.rst:35
+msgid ""
+"If you scheduled a service to start in the future, when you click the "
+"start button you will see a timer counting down until it will start. If "
+"you scheduled it to stop in the future, after it's started you will see a"
+" timer counting down to when it will stop automatically."
+msgstr ""
+
+#: ../../source/advanced.rst:37
+msgid ""
+"**Scheduling an OnionShare service to automatically start can be used as "
+"a dead man's switch**, where your service will be made public at a given "
+"time in the future if anything happens to you. If nothing happens to you,"
+" you can cancel the service before it's scheduled to start."
+msgstr ""
+
+#: ../../source/advanced.rst:41
+msgid ""
+"**Scheduling an OnionShare service to automatically stop can be useful to"
+" limit exposure**, like if you want to share secret documents while "
+"making sure they're not available on the internet for more than a few "
+"days."
+msgstr ""
+
+#: ../../source/advanced.rst:46
+msgid "Command line interface"
+msgstr ""
+
+#: ../../source/advanced.rst:48
+msgid ""
+"In addition to its graphical interface, OnionShare has a command line "
+"interface."
+msgstr ""
+
+#: ../../source/advanced.rst:51
+msgid "Linux"
+msgstr ""
+
+#: ../../source/advanced.rst:53
+msgid ""
+"If you installed OnionShare using the Flatpak package, unfortunately the "
+"command line interface isn't supported."
+msgstr ""
+
+#: ../../source/advanced.rst:55
+msgid ""
+"If you installed OnionShare using an operating system package, you can "
+"just run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:58
+msgid "macOS"
+msgstr ""
+
+#: ../../source/advanced.rst:60
+msgid "Make a symbolic link to the OnionShare command line binary like this::"
+msgstr ""
+
+#: ../../source/advanced.rst:64
+msgid "Now you can run ``onionshare`` from the terminal."
+msgstr ""
+
+#: ../../source/advanced.rst:67
+msgid "Windows"
+msgstr ""
+
+#: ../../source/advanced.rst:69
+msgid "The command line interface isn't supported in Windows."
+msgstr ""
+
+#: ../../source/advanced.rst:71
+msgid ""
+"If you really want to use it anyway, you can set up a Windows development"
+" environment (see :ref:`starting_development`) and then run this in a "
+"command prompt::"
+msgstr ""
+
+#: ../../source/advanced.rst:76
+msgid "Usage"
+msgstr ""
+
+#: ../../source/advanced.rst:78
+msgid "You can see command line documentation by running ``onionshare --help``::"
+msgstr ""
+
+#: ../../source/advanced.rst:134
+msgid "Legacy addresses"
+msgstr ""
+
+#: ../../source/advanced.rst:136
+msgid ""
+"OnionShare uses v3 Tor onion services by default. These are modern onion "
+"addresses that have 56 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:140
+msgid ""
+"But it still has support for v2 onion addresses, the old type of onion "
+"addresses that have 16 characters, for example::"
+msgstr ""
+
+#: ../../source/advanced.rst:144
+msgid ""
+"OnionShare calls v2 onion addresses \"legacy addresses\". v3 onion "
+"addresses are more secure, and using legacy addresses is not recommended."
+msgstr ""
+
+#: ../../source/advanced.rst:146
+msgid ""
+"To use legacy addresses, before starting a server click \"Show advanced "
+"settings\" in its tab and check the \"Use a legacy address (v2 onion "
+"service, not recommended)\" box. In legacy mode you can optionally enable"
+" Tor client authentication. Once you start a server in legacy mode you "
+"cannot remove legacy mode in that tab. Instead you must start a separate "
+"service in a separate tab."
+msgstr ""
+
+#: ../../source/advanced.rst:148
+msgid ""
+"Tor Project plans to `completely deprecate v2 onion services "
+"<https://blog.torproject.org/v2-deprecation-timeline>`_ on October 15, "
+"2021, and legacy onion services will soon be removed from OnionShare as "
+"well."
+msgstr ""
+
+#~ msgid "Make a symbolic link to the OnionShare command line binary line this::"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/develop.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/develop.po
new file mode 100644
index 00000000..f20ff51c
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/develop.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/develop.rst:2
+msgid "Developing OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:7
+msgid "Collaborating"
+msgstr ""
+
+#: ../../source/develop.rst:9
+msgid ""
+"OnionShare has an open Keybase team that we use to discuss the project, "
+"including asking questions, sharing ideas and designs, and making plans "
+"for future development. (It's also an easy way to send end-to-end "
+"encrypted direct messages to others in the OnionShare community, like "
+"OnionShare addresses.) To use Keybase, you need to download the `Keybase "
+"app <https://keybase.io/download>`_, make an account, and `join this team"
+" <https://keybase.io/team/onionshare>`_. Within the app, go to Teams, "
+"click \"Join a Team\", and type \"onionshare\"."
+msgstr ""
+
+#: ../../source/develop.rst:11
+msgid ""
+"OnionShare also has a `mailing list "
+"<https://lists.riseup.net/www/subscribe/onionshare-dev>`_ for developers "
+"and and designers to discuss the project."
+msgstr ""
+
+#: ../../source/develop.rst:14
+msgid "Contributing code"
+msgstr ""
+
+#: ../../source/develop.rst:16
+msgid ""
+"OnionShare source code is in this git repository: "
+"https://github.com/micahflee/onionshare"
+msgstr ""
+
+#: ../../source/develop.rst:18
+msgid ""
+"If you'd like to contribute code to OnionShare, it helps to join the "
+"Keybase team and ask questions about what you're thinking of working on. "
+"You should also review all of the `open issues "
+"<https://github.com/micahflee/onionshare/issues>`_ on GitHub to see if "
+"there are any that you'd like to develop."
+msgstr ""
+
+#: ../../source/develop.rst:20
+msgid ""
+"When you're ready to contribute code, open a pull request in the GitHub "
+"repository and one of the project maintainers will review it and possible"
+" ask questions, request changes, reject it, or merge it into the project."
+msgstr ""
+
+#: ../../source/develop.rst:25
+msgid "Starting development"
+msgstr ""
+
+#: ../../source/develop.rst:27
+msgid ""
+"OnionShare is developed in Python. To get started, you should clone the "
+"git repository at https://github.com/micahflee/onionshare/ and then "
+"consult the ``BUILD.md`` file."
+msgstr ""
+
+#: ../../source/develop.rst:29
+msgid "That file contains the technical instructions and commands necessary:"
+msgstr ""
+
+#: ../../source/develop.rst:31
+msgid "Install dependencies for your platform"
+msgstr ""
+
+#: ../../source/develop.rst:32
+msgid "Run OnionShare from the source tree, without building a package"
+msgstr ""
+
+#: ../../source/develop.rst:33
+msgid "Building packages"
+msgstr ""
+
+#: ../../source/develop.rst:34
+msgid "Making a release of OnionShare"
+msgstr ""
+
+#: ../../source/develop.rst:37
+msgid "Debugging tips"
+msgstr ""
+
+#: ../../source/develop.rst:40
+msgid "Verbose mode"
+msgstr ""
+
+#: ../../source/develop.rst:42
+msgid ""
+"When developing, it's convenient to run OnionShare from a terminal and "
+"add the ``--verbose`` (or ``-v``) flag to the command. This will print a "
+"lot of helpful messages to the terminal such as when certain objects are "
+"initialized, when events occur (like buttons clicked, settings saved or "
+"reloaded), and other debug information. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:111
+msgid ""
+"You can add your own debug messages by running the ``Common.log`` method "
+"from ``onionshare/common.py``. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:115
+msgid ""
+"This can be useful when learning the chain of events that occur when "
+"using the application or the value of certain variables before and after "
+"they are manipulated."
+msgstr ""
+
+#: ../../source/develop.rst:118
+msgid "Local only"
+msgstr ""
+
+#: ../../source/develop.rst:120
+msgid ""
+"Tor is slow, and it's often convenient to skip starting onion services "
+"altogether during development. You can do this with the ``--local-only`` "
+"flag. For example::"
+msgstr ""
+
+#: ../../source/develop.rst:157
+msgid ""
+"In this case, you load the URL ``http://onionshare:eject-"
+"snack@127.0.0.1:17614`` in a normal web browser like Firefox, instead of "
+"using Tor Browser."
+msgstr ""
+
+#: ../../source/develop.rst:160
+msgid "Debugging in Windows"
+msgstr ""
+
+#: ../../source/develop.rst:162
+msgid ""
+"If you want to obtain debug output from the ``onionshare-gui.exe`` in "
+"Windows, you will need to edit ``install\\pyinstaller.spec`` and change "
+"``console=False`` to ``console=True``."
+msgstr ""
+
+#: ../../source/develop.rst:164
+msgid ""
+"Then rebuild the EXE with ``install\\build_exe.bat`` (you may need to "
+"comment out the ``signtool`` commands in the ``build_exe.bat`` and the "
+"``onionshare.nsi`` files, as per the ``BUILD.md`` instructions)."
+msgstr ""
+
+#: ../../source/develop.rst:166
+msgid ""
+"After this, you can run ``onionshare-gui.exe -v`` from a command prompt "
+"to see the debug output."
+msgstr ""
+
+#: ../../source/develop.rst:169
+msgid "Contributing translations"
+msgstr ""
+
+#: ../../source/develop.rst:171
+msgid ""
+"Most of the OnionShare is translatable. You can help make it easier to "
+"use and more familiar and welcoming for people around the globe. The "
+"Localization Lab has some `documentation about translating OnionShare "
+"<https://wiki.localizationlab.org/index.php/OnionShare>`_."
+msgstr ""
+
+#: ../../source/develop.rst:173
+msgid ""
+"OnionShare uses Weblate to keep track of translations. You can view the "
+"OnionShare project here: https://hosted.weblate.org/projects/onionshare/"
+msgstr ""
+
+#: ../../source/develop.rst:175
+msgid ""
+"To help translate, make a Hosted Weblate account and start contributing "
+"to that project."
+msgstr ""
+
+#: ../../source/develop.rst:178
+msgid "Suggestions for original English strings"
+msgstr ""
+
+#: ../../source/develop.rst:180
+msgid ""
+"Sometimes the original English strings could be improved, making them "
+"easier to translate into other languages."
+msgstr ""
+
+#: ../../source/develop.rst:182
+msgid ""
+"If you have suggestions for a better English string, please open a GitHub"
+" issue rather than commenting in Weblate. This ensures the upstream "
+"developers will definitely see the suggestion, and can potentially modify"
+" the string via the usual code review processes."
+msgstr ""
+
+#: ../../source/develop.rst:185
+msgid "Status of translations"
+msgstr ""
+
+#: ../../source/develop.rst:186
+msgid ""
+"Here is the current translation status. If you want start a translation "
+"in a language not to be found here, please write us to the mailing list: "
+"onionshare-dev@lists.riseup.net"
+msgstr ""
+
+#: ../../source/develop.rst:191
+msgid "Translate the .desktop file"
+msgstr ""
+
+#: ../../source/develop.rst:193
+msgid "You can also translate the ``install/onionshare.desktop`` file."
+msgstr ""
+
+#: ../../source/develop.rst:195
+msgid ""
+"Duplicate the line that begins with ``Comment=``. Add the language code "
+"to the new line so it becomes ``Comment[lang]=`` (lang should be your "
+"language). You can see what language codes are used for translation by "
+"looking at the ``share/locale/*.json`` filenames::"
+msgstr ""
+
+#: ../../source/develop.rst:200
+msgid "Do the same for other untranslated lines."
+msgstr ""
+
+#~ msgid ""
+#~ "OnionShare is developed in Python. To"
+#~ " get started, you should close the"
+#~ " git repository at "
+#~ "https://github.com/micahflee/onionshare/ and then "
+#~ "consult the ``BUILD.md`` file."
+#~ msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/features.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/features.po
new file mode 100644
index 00000000..29841dd8
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/features.po
@@ -0,0 +1,382 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/features.rst:4
+msgid "How OnionShare works"
+msgstr ""
+
+#: ../../source/features.rst:6
+msgid ""
+"OnionShare works by starting web servers locally on your own computer and"
+" making them accessible to other people as `Tor "
+"<https://www.torproject.org/>`_ `onion services "
+"<https://community.torproject.org/onion-services/>`_."
+msgstr ""
+
+#: ../../source/features.rst:8
+msgid ""
+"By default, OnionShare web addresses are protected with a random "
+"password. A typical OnionShare address might look something like this::"
+msgstr ""
+
+#: ../../source/features.rst:12
+msgid ""
+"You're responsible for securely sharing that URL using a communication "
+"channel of your choice like in an encrypted chat message, or using "
+"something less secure like a Twitter or Facebook message, depending on "
+"your `threat model <https://ssd.eff.org/en/module/your-security-plan>`_."
+msgstr ""
+
+#: ../../source/features.rst:14
+msgid ""
+"The people who you send the URL to must then copy and paste it into `Tor "
+"Browser <https://www.torproject.org/>`_ to access the OnionShare service."
+msgstr ""
+
+#: ../../source/features.rst:16
+msgid ""
+"With OnionShare, *your own computer is the web server*. If you run "
+"OnionShare on your laptop to send someone files, and then suspend your "
+"laptop before the files have been downloaded, the service will not be "
+"available until your laptop is unsuspended and connected to the internet "
+"again. OnionShare works best when working with people in real-time."
+msgstr ""
+
+#: ../../source/features.rst:18
+msgid ""
+"Because your own computer is the web server, *no third party can access "
+"anything that happens in OnionShare*, not even the developers of "
+"OnionShare. It's completely private. And because OnionShare is based on "
+"Tor onion services too, it also protects your anonymity. See the "
+":doc:`security design </security>` for more information."
+msgstr ""
+
+#: ../../source/features.rst:21
+msgid "Share Files"
+msgstr ""
+
+#: ../../source/features.rst:23
+msgid ""
+"You can use OnionShare to securely and anonymously send files and folders"
+" to people. Just open a share tab, drag in the files and folders you wish"
+" to share, and click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:27 ../../source/features.rst:91
+msgid ""
+"After you add files, you'll see some settings. Make sure you choose the "
+"setting you're interested in first before you start sharing."
+msgstr ""
+
+#: ../../source/features.rst:31
+msgid ""
+"By default, as soon as someone finishes downloading your files, "
+"OnionShare will automatically stop the server, completely removing the "
+"website from the internet. If you want to allow multiple people to "
+"download these files, uncheck the \"Stop sharing after files have been "
+"sent (uncheck to allow downloading individual files)\" box."
+msgstr ""
+
+#: ../../source/features.rst:33
+msgid ""
+"Also, if you uncheck this box, people will be able to download individual"
+" files that you share rather than a single compressed version of all of "
+"the files."
+msgstr ""
+
+#: ../../source/features.rst:35
+msgid ""
+"When you're ready to share, click the \"Start sharing\" button. You can "
+"always click \"Stop sharing\", or quit OnionShare, to immediate take the "
+"website down. You can also click the up arrow icon in the top-right "
+"corner to show the history and progress of people downloading files from "
+"you."
+msgstr ""
+
+#: ../../source/features.rst:39
+msgid ""
+"Now that you have a website that's sharing files, copy the address and "
+"send it to the person you want to receive the files. If the files need to"
+" stay secure, you should use an encrypted messaging app."
+msgstr ""
+
+#: ../../source/features.rst:41
+msgid ""
+"That person then must load the address in Tor Browser. After logging in "
+"with the random password that's included in the web address, they will be"
+" able to download the files directly from your computer by clicking the "
+"\"Download Files\" link in the corner."
+msgstr ""
+
+#: ../../source/features.rst:46
+msgid "Receive Files"
+msgstr ""
+
+#: ../../source/features.rst:48
+msgid ""
+"You can use OnionShare to let people anonymously upload files directly to"
+" your computer, essentially turning it into an anonymous dropbox. Open a "
+"receive tab, choose where you want files to get downloaded and other "
+"settings, and then click \"Start Receive Mode\"."
+msgstr ""
+
+#: ../../source/features.rst:52
+msgid ""
+"This will start the OnionShare service. Anyone that loads this address in"
+" Tor Browser will be able to upload files to your computer."
+msgstr ""
+
+#: ../../source/features.rst:56
+msgid ""
+"You can also click the down arrow icon in the top-right corner to show "
+"the history and progress of people sending files to you."
+msgstr ""
+
+#: ../../source/features.rst:58
+msgid "Here is what it looks like for someone sending you files."
+msgstr ""
+
+#: ../../source/features.rst:62
+msgid ""
+"When someone uploads files to your receive service, by default they get "
+"saved to a folder called ``OnionShare`` in your home folder on your "
+"computer, and they get automatically organized into separate subfolders "
+"based on the time that the files get uploaded."
+msgstr ""
+
+#: ../../source/features.rst:64
+msgid ""
+"Setting up an OnionShare receiving service is useful for journalists and "
+"others that need to securely accept documents from anonymous sources. "
+"When used in this way, OnionShare is sort of like a lightweight, simpler,"
+" not quite as secure version of `SecureDrop <https://securedrop.org/>`_, "
+"the whistleblower submission system."
+msgstr ""
+
+#: ../../source/features.rst:67
+msgid "Use at your own risk"
+msgstr ""
+
+#: ../../source/features.rst:69
+msgid ""
+"Just like with malicious email attachments, it's possible that someone "
+"could try to hack your computer by uploading a malicious file to your "
+"OnionShare service. OnionShare does not add any safety mechanisms to "
+"protect your system from malicious files, so use at your own risk."
+msgstr ""
+
+#: ../../source/features.rst:71
+msgid ""
+"If you receive an Office document or a PDF through OnionShare, you can "
+"convert these documents into PDFs that you know are safe to open using "
+"`Dangerzone <https://dangerzone.rocks/>`_. You can also protect yourself "
+"when opening untrusted documents by opening them in `Tails "
+"<https://tails.boum.org/>`_ or in a `Qubes <https://qubes-os.org/>`_ "
+"disposable VM."
+msgstr ""
+
+#: ../../source/features.rst:74
+msgid "Tips for running a receive service"
+msgstr ""
+
+#: ../../source/features.rst:76
+msgid ""
+"If you want to host your own anonymous dropbox using OnionShare, it's "
+"recommended that you do it on a separate, dedicated computer that's "
+"always powered on and connected to the internet, and not on the one you "
+"use on a regular basis."
+msgstr ""
+
+#: ../../source/features.rst:78
+msgid ""
+"If you intend on advertising the OnionShare address on your website or "
+"social media profiles, then you should save the tab (see "
+":ref:`save_tabs`) and run it as a public service (see "
+":ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:81
+msgid "Host a Website"
+msgstr ""
+
+#: ../../source/features.rst:83
+msgid ""
+"You can use OnionShare to host a static HTML website with just a click. "
+"Just open a website tab, drag in the files and folders that make up the "
+"static website, and click when you're ready click \"Start sharing\"."
+msgstr ""
+
+#: ../../source/features.rst:87
+msgid ""
+"If you add an ``index.html`` file, when someone loads your website it "
+"will render this page. You should also include any other HTML files, CSS "
+"files, JavaScript files, and images that make up the website. (Note that "
+"OnionShare only supports hosting *static* websites. It can't host "
+"websites that execute code or use databases. So you can't, for example, "
+"use WordPress.)"
+msgstr ""
+
+#: ../../source/features.rst:89
+msgid ""
+"If you don't have an ``index.html`` file, then it will show a directory "
+"listing instead, and people who load it can look through the files and "
+"download them."
+msgstr ""
+
+#: ../../source/features.rst:96
+msgid "Content Security Policy"
+msgstr ""
+
+#: ../../source/features.rst:98
+msgid ""
+"By default OnionShare will help secure your website by setting a strict "
+"`Content Security Police "
+"<https://en.wikipedia.org/wiki/Content_Security_Policy>`_ header. However"
+" this will prevent third-party content from loading inside the web page."
+msgstr ""
+
+#: ../../source/features.rst:100
+msgid ""
+"If you want to load content from third-party websites, like assets or "
+"JavaScript libraries from CDNs, then you must check the \"Disable Content"
+" Security Policy header (allows your website to use third-party "
+"resources)\" box before starting the service."
+msgstr ""
+
+#: ../../source/features.rst:103
+msgid "Tips for running a website service"
+msgstr ""
+
+#: ../../source/features.rst:105
+msgid ""
+"If you want to host a long-term website using OnionShare (that isn't just"
+" to quickly show someone something), it's recommended that you do it on a"
+" separate, dedicated computer that's always powered on and connected to "
+"the internet, and not on the one you use on a regular basis. You should "
+"also save the tab (see :ref:`save_tabs`) so that you can resume the "
+"website with the same address if you close OnionShare and re-open it "
+"later."
+msgstr ""
+
+#: ../../source/features.rst:107
+msgid ""
+"If your website is intended to be viewed by the public, you should run it"
+" as a public service (see :ref:`disable_passwords`)."
+msgstr ""
+
+#: ../../source/features.rst:110
+msgid "Chat Anonymously"
+msgstr ""
+
+#: ../../source/features.rst:112
+msgid ""
+"You can use OnionShare to set up a completely anonymous, secure chat room"
+" that doesn't log anything or leave any traces. Just open a chat tab and "
+"click \"Start chat server\"."
+msgstr ""
+
+#: ../../source/features.rst:116
+msgid ""
+"After you start the server, copy the OnionShare address and send it to "
+"the people who will join this anonymous chat room. If it's important to "
+"limit exactly who can join, you should use an encrypted messaging app to "
+"send the OnionShare address."
+msgstr ""
+
+#: ../../source/features.rst:120
+msgid ""
+"People can join the chat room by loading its OnionShare address in Tor "
+"Browser. The chat room requires JavasScript, so everyone who wants to "
+"participate must set their security level to Standard or Safer instead of"
+" Safest."
+msgstr ""
+
+#: ../../source/features.rst:122
+msgid ""
+"When someone joins the chat room they get assigned a random name. They "
+"can change their name by typing a new name in the box in the left panel "
+"and pressing enter. No chat history will get displayed at all, even if "
+"others were already chatting in the room, because the chat history isn't "
+"saved anywhere."
+msgstr ""
+
+#: ../../source/features.rst:126
+msgid ""
+"In an OnionShare chat room, everyone is anonymous. Anyone can change "
+"their name to anything, and there is no way to confirm anyone's identity."
+msgstr ""
+
+#: ../../source/features.rst:128
+msgid ""
+"However, if you create an OnionShare chat room and securely send the "
+"address only to a small group of trusted friends using encrypted "
+"messages, then you can be reasonably confident that the people who join "
+"the chat room are your friends."
+msgstr ""
+
+#: ../../source/features.rst:131
+msgid "How is this useful?"
+msgstr ""
+
+#: ../../source/features.rst:133
+msgid ""
+"If you need to already be using an encrypted messaging app, what's the "
+"point of an OnionShare chat room to begin with? It leaves less traces."
+msgstr ""
+
+#: ../../source/features.rst:135
+msgid ""
+"If you send a message to a Signal group, for example, a copy of your "
+"message ends up on each device (the phones and computers, if they set up "
+"Signal Desktop) of each member of the group. Even if disappearing "
+"messages is enabled, it's hard to confirm that all copies of the messages"
+" were actually deleted from all devices, and from any other places (like "
+"notifications databases) they may have been saved to. OnionShare chat "
+"rooms don't store any messages anywhere, so this isn't a problem."
+msgstr ""
+
+#: ../../source/features.rst:137
+msgid ""
+"OnionShare chat rooms can also be useful for anonymous people wanting to "
+"chat securely with someone without needing to create any accounts. For "
+"example, a source can send an OnionShare address to a journalist using a "
+"disposable email address, and then wait for the journalist to join the "
+"chat room, all without compromosing their anonymity."
+msgstr ""
+
+#: ../../source/features.rst:140
+msgid "How does the encryption work?"
+msgstr ""
+
+#: ../../source/features.rst:142
+msgid ""
+"Because OnionShare relies on Tor onion services, connections between Tor "
+"Browser and OnionShare are all end-to-end encrypted (E2EE). When someone "
+"posts a message to an OnionShare chat room, they send it to the server "
+"through the E2EE onion connection, which then sends it to all other "
+"members of the chat room using WebSockets, through their E2EE onion "
+"connections."
+msgstr ""
+
+#: ../../source/features.rst:144
+msgid ""
+"OnionShare doesn't implement any chat encryption on its own. It relies on"
+" the Tor onion service's encryption instead."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/help.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/help.po
new file mode 100644
index 00000000..d965eb13
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/help.po
@@ -0,0 +1,72 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/help.rst:2
+msgid "Getting Help"
+msgstr ""
+
+#: ../../source/help.rst:4
+msgid "If you need help with OnionShare, please follow the instructions below."
+msgstr ""
+
+#: ../../source/help.rst:7
+msgid "Read this website"
+msgstr ""
+
+#: ../../source/help.rst:9
+msgid ""
+"This website is full of instructions on how to use OnionShare. Look "
+"through all of the sections first to see if it answers your questions."
+msgstr ""
+
+#: ../../source/help.rst:12
+msgid "Check the GitHub issues"
+msgstr ""
+
+#: ../../source/help.rst:14
+msgid ""
+"If you can't find a solution in this website, please check the `GitHub "
+"issues <https://github.com/micahflee/onionshare/issues>`_. It's possible "
+"that someone else has encountered the same problem and has either raised "
+"it with the developers, or maybe even posted a solution."
+msgstr ""
+
+#: ../../source/help.rst:17
+msgid "Submit an issue yourself"
+msgstr ""
+
+#: ../../source/help.rst:19
+msgid ""
+"If you can't find a solution to your problem, or you wish to ask a "
+"question or suggest a new feature, please `submit an issue "
+"<https://github.com/micahflee/onionshare/issues/new>`_. This requires "
+"`creating an GitHub account <https://help.github.com/articles/signing-up-"
+"for-a-new-github-account/>`_."
+msgstr ""
+
+#: ../../source/help.rst:22
+msgid "Join our Keybase team"
+msgstr ""
+
+#: ../../source/help.rst:24
+msgid ""
+"See :ref:`collaborating` for instructions on how to join our Keybase team"
+" that we use to discuss the project."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/index.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/index.po
new file mode 100644
index 00000000..2ad2653c
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:46-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/index.rst:2
+msgid "OnionShare's documentation"
+msgstr ""
+
+#: ../../source/index.rst:6
+msgid ""
+"OnionShare is an open source tool that lets you securely and anonymously "
+"share files, host websites, and chat with friends using the Tor network."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/install.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/install.po
new file mode 100644
index 00000000..a2f5b321
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/install.po
@@ -0,0 +1,143 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/install.rst:2
+msgid "Installation"
+msgstr ""
+
+#: ../../source/install.rst:5
+msgid "Install on Windows or macOS"
+msgstr ""
+
+#: ../../source/install.rst:7
+msgid ""
+"You can download OnionShare for Windows and macOS from the `OnionShare "
+"website <https://onionshare.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:9
+msgid "For added security, see :ref:`verifying_sigs`."
+msgstr ""
+
+#: ../../source/install.rst:14
+msgid "Install in Linux with Flatpak"
+msgstr ""
+
+#: ../../source/install.rst:16
+msgid ""
+"There are various ways to install OnionShare for Linux, but the "
+"recommended way is to use the Flatpak package. Flatpak ensures that "
+"you'll always use the most latest dependencies and run OnionShare inside "
+"of a sandbox."
+msgstr ""
+
+#: ../../source/install.rst:18
+msgid ""
+"Make sure you have ``flatpak`` installed and the Flathub repository added"
+" by following `these instructions <https://flatpak.org/setup/>`_ for your"
+" Linux distribution."
+msgstr ""
+
+#: ../../source/install.rst:20
+msgid ""
+"Then install OnionShare from Flathub by following `the instructions here "
+"<https://flathub.org/apps/details/org.onionshare.OnionShare>`_."
+msgstr ""
+
+#: ../../source/install.rst:25
+msgid "Verifying PGP signatures"
+msgstr ""
+
+#: ../../source/install.rst:27
+msgid ""
+"You can verify that the Windows, macOS, or source package you download is"
+" legitimate and hasn't been tampered with by verifying its PGP signature."
+" For Windows and macOS, this step is optional and provides defense in "
+"depth: the installers also include their operating system-specific "
+"signatures, and you can just rely on those alone if you'd like."
+msgstr ""
+
+#: ../../source/install.rst:30
+msgid "Signing key"
+msgstr ""
+
+#: ../../source/install.rst:32
+msgid ""
+"Windows, macOS, and source packaged are signed by Micah Lee, the core "
+"developer, using his PGP public key with fingerprint "
+"``927F419D7EC82C2F149C1BD1403C2657CD994F73``. You can download Micah's "
+"key `from the keys.openpgp.org keyserver <https://keys.openpgp.org/vks/v1"
+"/by-fingerprint/927F419D7EC82C2F149C1BD1403C2657CD994F73>`_."
+msgstr ""
+
+#: ../../source/install.rst:34
+msgid ""
+"In order to verify signatures, you must have GnuPG installed. For macOS "
+"you probably want `GPGTools <https://gpgtools.org/>`_, and for Windows "
+"you probably want `Gpg4win <https://www.gpg4win.org/>`_."
+msgstr ""
+
+#: ../../source/install.rst:37
+msgid "Signatures"
+msgstr ""
+
+#: ../../source/install.rst:39
+msgid ""
+"You can find the signatures (``.asc`` files), as well as Windows, macOS, "
+"and source packages, at https://onionshare.org/dist/ in the folders named"
+" for each version of OnionShare. You can also find them on the `GitHub "
+"Releases page <https://github.com/micahflee/onionshare/releases>`_."
+msgstr ""
+
+#: ../../source/install.rst:42
+msgid "Verifying"
+msgstr ""
+
+#: ../../source/install.rst:44
+msgid ""
+"Once you have imported Micah's public key into your GnuPG keychain, "
+"downloaded the binary, and downloaded the ``.asc`` signature, you can "
+"verify the binary for macOS in terminal like this::"
+msgstr ""
+
+#: ../../source/install.rst:48
+msgid "Or for Windows in a command prompt like this::"
+msgstr ""
+
+#: ../../source/install.rst:52
+msgid "An expected output might look like this::"
+msgstr ""
+
+#: ../../source/install.rst:64
+msgid ""
+"If you don't see 'Good signature from', then there might be a problem "
+"with the integrity of the file (malicious or otherwise), and you perhaps "
+"should not install the package. (The WARNING shown above, is not a "
+"problem with the package: it only means you have not defined any level of"
+" 'trust' regarding Micah's PGP key itself.)"
+msgstr ""
+
+#: ../../source/install.rst:66
+msgid ""
+"If you want to learn more about verifying PGP signatures, guides for "
+"`Qubes OS <https://www.qubes-os.org/security/verifying-signatures/>`_ and"
+" the `Tor Project <https://2019.www.torproject.org/docs/verifying-"
+"signatures.html.en>`_ may be helpful."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/security.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/security.po
new file mode 100644
index 00000000..13d11a17
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/security.po
@@ -0,0 +1,114 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/security.rst:2
+msgid "Security design"
+msgstr ""
+
+#: ../../source/security.rst:4
+msgid ""
+"First read :ref:`how_it_works` to understand the basics of how OnionShare"
+" works."
+msgstr ""
+
+#: ../../source/security.rst:6
+msgid "Like all software, OnionShare may contain bugs or vulnerabilities."
+msgstr ""
+
+#: ../../source/security.rst:9
+msgid "What OnionShare protects against"
+msgstr ""
+
+#: ../../source/security.rst:11
+msgid ""
+"**Third parties don't have access to anything that happens in "
+"OnionShare.** When you use OnionShare, you host services directly on your"
+" computer. For example, when you share files with OnionShare, you don't "
+"upload these files to any server, and when you start an OnionShare chat "
+"room, your computer is the chat room server itself. Traditional ways of "
+"sharing files or setting up websites and chat rooms require trusting a "
+"service with access to your data."
+msgstr ""
+
+#: ../../source/security.rst:13
+msgid ""
+"**Network eavesdroppers can't spy on anything that happens in OnionShare "
+"in transit.** Because connections between Tor onion services and Tor "
+"Browser are end-to-end encrypted, no network attackers can eavesdrop on "
+"what happens in an OnionShare service. If the eavesdropper is positioned "
+"on the OnionShare user's end, the Tor Browser user's end, or is a "
+"malicious Tor node, they will only see Tor traffic. If the eavesdropper "
+"is a malicious rendezvous node used to connect Tor Browser with "
+"OnionShare's onion service, the traffic will be encrypted using the onion"
+" service key."
+msgstr ""
+
+#: ../../source/security.rst:15
+msgid ""
+"**Anonymity of OnionShare users are protected by Tor.** OnionShare and "
+"Tor Browser protect the anonymity of the users. As long as the OnionShare"
+" user anonymously communicates the OnionShare address with the Tor "
+"Browser users, the Tor Browser users and eavesdroppers can't learn the "
+"identity of the OnionShare user."
+msgstr ""
+
+#: ../../source/security.rst:17
+msgid ""
+"**If an attacker learns about the onion service, they still can't access "
+"anything.** There have been attacks against the Tor network that can "
+"enumerate onion services. Even if someone discovers the .onion address of"
+" an OnionShare onion service, they can't access it without also knowing "
+"the service's random password (unless, of course, the OnionShare users "
+"chooses to disable the password and make it public). The password is "
+"generated by choosing two random words from a list of 6800 words, meaning"
+" there are 6800^2, or about 46 million possible password. But they can "
+"only make 20 wrong guesses before OnionShare stops the server, preventing"
+" brute force attacks against the password."
+msgstr ""
+
+#: ../../source/security.rst:20
+msgid "What OnionShare doesn't protect against"
+msgstr ""
+
+#: ../../source/security.rst:22
+msgid ""
+"**Communicating the OnionShare address might not be secure.** The "
+"OnionShare user is responsible for securely communicating the OnionShare "
+"address with people. If they send it insecurely (such as through an email"
+" message, and their email is being monitored by an attacker), the "
+"eavesdropper will learn that they're using OnionShare. If the attacker "
+"loads the address in Tor Browser before the legitimate recipient gets to "
+"it, they can access the service. If this risk fits the user's threat "
+"model, they must find a more secure way to communicate the address, such "
+"as in an encrypted email, chat, or voice call. This isn't necessary in "
+"cases where OnionShare is being used for something that isn't secret."
+msgstr ""
+
+#: ../../source/security.rst:24
+msgid ""
+"**Communicating the OnionShare address might not be anonymous.** While "
+"OnionShare and Tor Browser allow for anonymity, if the user wishes to "
+"remain anonymous they must take extra steps to ensure this while "
+"communicating the OnionShare address. For example, they might need to use"
+" Tor to create a new anonymous email or chat account, and only access it "
+"over Tor, to use for sharing the address. This isn't necessary in cases "
+"where there's no need to protect anonymity, such as co-workers who know "
+"each other sharing work documents."
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/sphinx.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/sphinx.po
new file mode 100644
index 00000000..f2cc8ed5
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/sphinx.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-03 11:37-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/_templates/versions.html:10
+msgid "Versions"
+msgstr ""
+
+#: ../../source/_templates/versions.html:18
+msgid "Languages"
+msgstr ""
+
diff --git a/desktop/docs/source/locale/zh_TW/LC_MESSAGES/tor.po b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/tor.po
new file mode 100644
index 00000000..a4d227cd
--- /dev/null
+++ b/desktop/docs/source/locale/zh_TW/LC_MESSAGES/tor.po
@@ -0,0 +1,216 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) Micah Lee, et al.
+# This file is distributed under the same license as the OnionShare package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: OnionShare 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-17 09:38-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.8.0\n"
+
+#: ../../source/tor.rst:2
+msgid "Connecting to Tor"
+msgstr ""
+
+#: ../../source/tor.rst:4
+msgid ""
+"There are several options for how OnionShare should connect to Tor. You "
+"can change them in Settings, which you can get to by clicking the gear "
+"icon in the bottom-right of the window."
+msgstr ""
+
+#: ../../source/tor.rst:9
+msgid "Use Tor that is bundled with OnionShare"
+msgstr ""
+
+#: ../../source/tor.rst:11
+msgid ""
+"This is the default way that OnionShare connects to Tor, and it's also "
+"the simplest and most reliable way. For this reason, it's recommended for"
+" most users."
+msgstr ""
+
+#: ../../source/tor.rst:13
+msgid ""
+"When you open OnionShare, it will launch a Tor process in the background "
+"that's configured specifically for OnionShare to use. This Tor process "
+"won't interfere with other Tor processes on your computer, so you're free"
+" to run Tor Browser or use a system Tor in the background."
+msgstr ""
+
+#: ../../source/tor.rst:16
+msgid "Attempt automatic configuration with Tor Browser"
+msgstr ""
+
+#: ../../source/tor.rst:18
+msgid ""
+"You can configure OnionShare to connect to the Tor that comes with Tor "
+"Browser. First, `download Tor Browser <https://www.torproject.org>`_ here"
+" if you don't already have it. With this setting selected, you need to "
+"keep Tor Browser open in the background while you're using OnionShare."
+msgstr ""
+
+#: ../../source/tor.rst:21
+msgid "Using a system Tor in Windows"
+msgstr ""
+
+#: ../../source/tor.rst:23
+msgid ""
+"This is fairly advanced. You'll need to know how edit plaintext files and"
+" do stuff as an administrator."
+msgstr ""
+
+#: ../../source/tor.rst:25
+msgid ""
+"Download the Tor Windows Expert Bundle, which you can get `from here "
+"<https://www.torproject.org/download/tor/>`_. Extract the zip file and "
+"copy the extracted folder to ``C:\\Program Files (x86)\\``, and rename "
+"the folder to ``tor-win32``, so that inside that folder is the ``Data`` "
+"and ``Tor`` folders."
+msgstr ""
+
+#: ../../source/tor.rst:27
+msgid ""
+"Make up a control port password. I'm going to use ``comprised stumble "
+"rummage work avenging construct volatile`` as my password. Now open a "
+"command prompt as an administrator, and use ``tor.exe --hash-password`` "
+"to generate a hash of your password. For example::"
+msgstr ""
+
+#: ../../source/tor.rst:32
+msgid ""
+"The hashed password output is displayed after some warnings (which you "
+"can ignore). In my case, it was "
+"``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``."
+msgstr ""
+
+#: ../../source/tor.rst:34
+msgid ""
+"Now create a new text file at ``C:\\Program Files (x86)\\tor-"
+"win32\\torrc`` and put this in it, replacing the "
+"``HashedControlPassword`` with the one you just generated::"
+msgstr ""
+
+#: ../../source/tor.rst:39
+msgid ""
+"In your administrator command prompt, install tor as a service using the "
+"appropriate ``torrc`` file you just created (see `here "
+"<https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more "
+"information on doing this). Like this::"
+msgstr ""
+
+#: ../../source/tor.rst:43
+msgid "You're now running a system Tor in Windows!"
+msgstr ""
+
+#: ../../source/tor.rst:45
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using control port\", and set the "
+"control port host to ``127.0.0.1`` and the port to ``9051``. Under \"Tor "
+"authentication options\" choose \"Password\" and set the password to your"
+" password, in my case ``comprised stumble rummage work avenging construct"
+" volatile``. Click the \"Test Settings\" button. If all goes well, you "
+"should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:48
+msgid "Using a system Tor in macOS"
+msgstr ""
+
+#: ../../source/tor.rst:50
+msgid ""
+"First, install `Homebrew <http://brew.sh/>`_ if you don't already have "
+"it. Then, install Tor::"
+msgstr ""
+
+#: ../../source/tor.rst:54
+msgid "Now configure Tor to allow connections from OnionShare::"
+msgstr ""
+
+#: ../../source/tor.rst:61
+msgid "And start the system Tor service::"
+msgstr ""
+
+#: ../../source/tor.rst:65
+msgid ""
+"Open OnionShare. Click the Settings icon. Under \"How should OnionShare "
+"connect to Tor?\" choose \"Connect using socket file\", and set the "
+"socket file to be ``/usr/local/var/run/tor/control.socket``. Under \"Tor "
+"authentication options\" choose \"No authentication, or cookie "
+"authentication\". Click the \"Test Settings\" button. If all goes well, "
+"you should see successfully connected to tor."
+msgstr ""
+
+#: ../../source/tor.rst:68
+msgid "Using a system Tor in Linux"
+msgstr ""
+
+#: ../../source/tor.rst:70
+msgid ""
+"First, install the tor package. If you're using Debian, Ubuntu, or a "
+"similar Linux distro, I recommend you use Tor Project's `official "
+"repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For "
+"example, in Ubuntu 20.04::"
+msgstr ""
+
+#: ../../source/tor.rst:78
+msgid ""
+"Next, add your user to the group that runs the Tor process (in the case "
+"of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect"
+" to your system Tor's control socket file."
+msgstr ""
+
+#: ../../source/tor.rst:80
+msgid ""
+"Add your user to the ``debian-tor`` group by running this command "
+"(replace ``username`` with your actual username)::"
+msgstr ""
+
+#: ../../source/tor.rst:84
+msgid ""
+"Reboot your computer. After it boots up again, open OnionShare. Click the"
+" Settings icon. Under \"How should OnionShare connect to Tor?\" choose "
+"\"Connect using socket file\", and set the socket file to be "
+"``/var/run/tor/control``. Under \"Tor authentication options\" choose "
+"\"No authentication, or cookie authentication\". Click the \"Test "
+"Settings\" button. If all goes well, you should see successfully connect "
+"to Tor."
+msgstr ""
+
+#: ../../source/tor.rst:87
+msgid "Using Tor bridges"
+msgstr ""
+
+#: ../../source/tor.rst:89
+msgid ""
+"If your access to the internet is censored, you can configure OnionShare "
+"to connect to the Tor network using `Tor bridges "
+"<https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare "
+"successfully connects to Tor, you don't need to use a bridge."
+msgstr ""
+
+#: ../../source/tor.rst:91
+msgid "To configure bridges, open OnionShare settings."
+msgstr ""
+
+#: ../../source/tor.rst:93
+msgid ""
+"You can use the built-in obfs4 pluggable transports, the built-in "
+"meek_lite (Azure) pluggable transports, or custom bridges, which you can "
+"obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you "
+"need to use a bridge, you should try the built-in obfs4 ones first."
+msgstr ""
+
+#~ msgid "Using a system Tor in Mac OS X"
+#~ msgstr ""
+
diff --git a/desktop/docs/source/security.rst b/desktop/docs/source/security.rst
new file mode 100644
index 00000000..e7f4529b
--- /dev/null
+++ b/desktop/docs/source/security.rst
@@ -0,0 +1,24 @@
+Security design
+===============
+
+First read :ref:`how_it_works` to understand the basics of how OnionShare works.
+
+Like all software, OnionShare may contain bugs or vulnerabilities.
+
+What OnionShare protects against
+--------------------------------
+
+**Third parties don't have access to anything that happens in OnionShare.** When you use OnionShare, you host services directly on your computer. For example, when you share files with OnionShare, you don't upload these files to any server, and when you start an OnionShare chat room, your computer is the chat room server itself. Traditional ways of sharing files or setting up websites and chat rooms require trusting a service with access to your data.
+
+**Network eavesdroppers can't spy on anything that happens in OnionShare in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on what happens in an OnionShare service. If the eavesdropper is positioned on the OnionShare user's end, the Tor Browser user's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect Tor Browser with OnionShare's onion service, the traffic will be encrypted using the onion service key.
+
+**Anonymity of OnionShare users are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the OnionShare user anonymously communicates the OnionShare address with the Tor Browser users, the Tor Browser users and eavesdroppers can't learn the identity of the OnionShare user.
+
+**If an attacker learns about the onion service, they still can't access anything.** There have been attacks against the Tor network that can enumerate onion services. Even if someone discovers the .onion address of an OnionShare onion service, they can't access it without also knowing the service's random password (unless, of course, the OnionShare users chooses to disable the password and make it public). The password is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible password. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the password.
+
+What OnionShare doesn't protect against
+---------------------------------------
+
+**Communicating the OnionShare address might not be secure.** The OnionShare user is responsible for securely communicating the OnionShare address with people. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're using OnionShare. If the attacker loads the address in Tor Browser before the legitimate recipient gets to it, they can access the service. If this risk fits the user's threat model, they must find a more secure way to communicate the address, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where OnionShare is being used for something that isn't secret.
+
+**Communicating the OnionShare address might not be anonymous.** While OnionShare and Tor Browser allow for anonymity, if the user wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare address. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the address. This isn't necessary in cases where there's no need to protect anonymity, such as co-workers who know each other sharing work documents.
diff --git a/desktop/docs/source/tor.rst b/desktop/docs/source/tor.rst
new file mode 100644
index 00000000..5efe3dc0
--- /dev/null
+++ b/desktop/docs/source/tor.rst
@@ -0,0 +1,93 @@
+Connecting to Tor
+=================
+
+There are several options for how OnionShare should connect to Tor. You can change them in Settings, which you can get to by clicking the gear icon in the bottom-right of the window.
+
+.. image:: _static/screenshots/settings.png
+
+Use Tor that is bundled with OnionShare
+---------------------------------------
+
+This is the default way that OnionShare connects to Tor, and it's also the simplest and most reliable way. For this reason, it's recommended for most users.
+
+When you open OnionShare, it will launch a Tor process in the background that's configured specifically for OnionShare to use. This Tor process won't interfere with other Tor processes on your computer, so you're free to run Tor Browser or use a system Tor in the background.
+
+Attempt automatic configuration with Tor Browser
+------------------------------------------------
+
+You can configure OnionShare to connect to the Tor that comes with Tor Browser. First, `download Tor Browser <https://www.torproject.org>`_ here if you don't already have it. With this setting selected, you need to keep Tor Browser open in the background while you're using OnionShare.
+
+Using a system Tor in Windows
+-----------------------------
+
+This is fairly advanced. You'll need to know how edit plaintext files and do stuff as an administrator.
+
+Download the Tor Windows Expert Bundle, which you can get `from here <https://www.torproject.org/download/tor/>`_. Extract the zip file and copy the extracted folder to ``C:\Program Files (x86)\``, and rename the folder to ``tor-win32``, so that inside that folder is the ``Data`` and ``Tor`` folders.
+
+Make up a control port password. I'm going to use ``comprised stumble rummage work avenging construct volatile`` as my password. Now open a command prompt as an administrator, and use ``tor.exe --hash-password`` to generate a hash of your password. For example::
+
+ cd "C:\Program Files (x86)\tor-win32\Tor"
+ tor.exe --hash-password "comprised stumble rummage work avenging construct volatile"
+
+The hashed password output is displayed after some warnings (which you can ignore). In my case, it was ``16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF``.
+
+Now create a new text file at ``C:\Program Files (x86)\tor-win32\torrc`` and put this in it, replacing the ``HashedControlPassword`` with the one you just generated::
+
+ ControlPort 9051
+ HashedControlPassword 16:00322E903D96DE986058BB9ABDA91E010D7A863768635AC38E213FDBEF
+
+In your administrator command prompt, install tor as a service using the appropriate ``torrc`` file you just created (see `here <https://2019.www.torproject.org/docs/faq.html.en#NTService>`_ for more information on doing this). Like this::
+
+ tor.exe --service install -options -f "C:\Program Files (x86)\tor-win32\torrc"
+
+You're now running a system Tor in Windows!
+
+Open OnionShare. Click the Settings icon. Under "How should OnionShare connect to Tor?" choose "Connect using control port", and set the control port host to ``127.0.0.1`` and the port to ``9051``. Under "Tor authentication options" choose "Password" and set the password to your password, in my case ``comprised stumble rummage work avenging construct volatile``. Click the "Test Settings" button. If all goes well, you should see successfully connected to tor.
+
+Using a system Tor in macOS
+---------------------------
+
+First, install `Homebrew <http://brew.sh/>`_ if you don't already have it. Then, install Tor::
+
+ brew install tor
+
+Now configure Tor to allow connections from OnionShare::
+
+ mkdir -p /usr/local/var/run/tor
+ chmod 700 /usr/local/var/run/tor
+ echo 'SOCKSPort 9050' >> /usr/local/etc/tor/torrc
+ echo 'ControlPort unix:"/usr/local/var/run/tor/control.socket"' >> /usr/local/etc/tor/torrc
+
+And start the system Tor service::
+
+ brew services start tor
+
+Open OnionShare. Click the Settings icon. Under "How should OnionShare connect to Tor?" choose "Connect using socket file", and set the socket file to be ``/usr/local/var/run/tor/control.socket``. Under "Tor authentication options" choose "No authentication, or cookie authentication". Click the "Test Settings" button. If all goes well, you should see successfully connected to tor.
+
+Using a system Tor in Linux
+---------------------------
+
+First, install the tor package. If you're using Debian, Ubuntu, or a similar Linux distro, I recommend you use Tor Project's `official repository <https://2019.www.torproject.org/docs/debian.html.en>`_. For example, in Ubuntu 20.04::
+
+ sudo su -c "echo 'deb http://deb.torproject.org/torproject.org focal main' > /etc/apt/sources.list.d/torproject.list"
+ curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
+ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
+ sudo apt-get update
+ sudo apt-get install -y tor deb.torproject.org-keyring
+
+Next, add your user to the group that runs the Tor process (in the case of Debian and Ubuntu, ``debian-tor``) and configure OnionShare to connect to your system Tor's control socket file.
+
+Add your user to the ``debian-tor`` group by running this command (replace ``username`` with your actual username)::
+
+ sudo usermod -a -G debian-tor username
+
+Reboot your computer. After it boots up again, open OnionShare. Click the Settings icon. Under "How should OnionShare connect to Tor?" choose "Connect using socket file", and set the socket file to be ``/var/run/tor/control``. Under "Tor authentication options" choose "No authentication, or cookie authentication". Click the "Test Settings" button. If all goes well, you should see successfully connect to Tor.
+
+Using Tor bridges
+-----------------
+
+If your access to the internet is censored, you can configure OnionShare to connect to the Tor network using `Tor bridges <https://2019.www.torproject.org/docs/bridges.html.en>`_. If OnionShare successfully connects to Tor, you don't need to use a bridge.
+
+To configure bridges, open OnionShare settings.
+
+You can use the built-in obfs4 pluggable transports, the built-in meek_lite (Azure) pluggable transports, or custom bridges, which you can obtain from Tor's `BridgeDB <https://bridges.torproject.org/>`_. If you need to use a bridge, you should try the built-in obfs4 ones first.
diff --git a/desktop/git-hooks/README.md b/desktop/git-hooks/README.md
new file mode 100644
index 00000000..0d8f80c9
--- /dev/null
+++ b/desktop/git-hooks/README.md
@@ -0,0 +1,3 @@
+To use these hooks, cp any of them to onionshare's `.git/hooks`.
+
+* `pre-push` runs the test suite, and will push if the tests pass.
diff --git a/desktop/git-hooks/pre-push b/desktop/git-hooks/pre-push
new file mode 100755
index 00000000..1d8e57f8
--- /dev/null
+++ b/desktop/git-hooks/pre-push
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+# Pre-push hook. If you want to test with a different version of firefox, put
+# the path in the CFX_FIREFOX environment variable.
diff --git a/desktop/install/build_deb.sh b/desktop/install/build_deb.sh
new file mode 100755
index 00000000..aec026a4
--- /dev/null
+++ b/desktop/install/build_deb.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
+cd $DIR
+
+VERSION=`cat share/version.txt`
+
+# clean up from last build
+rm -r deb_dist >/dev/null 2>&1
+
+# build binary package
+python3 setup.py --command-packages=stdeb.command bdist_deb
+
+# return install instructions if onionshare builds properly
+if [[ $? -eq 0 ]]; then
+ # The build process in stdeb's util.py renames .dev to ~dev
+ # Adjust it here for the purposes of displaying the right filename
+ VERSION="${VERSION/.dev/~dev}"
+ echo ""
+ echo "To install, run:"
+ echo "sudo dpkg -i deb_dist/onionshare_$VERSION-1_all.deb"
+else
+ echo "OnionShare failed to build!"
+ exit 1
+fi
diff --git a/desktop/install/build_exe.bat b/desktop/install/build_exe.bat
new file mode 100644
index 00000000..ba626fa2
--- /dev/null
+++ b/desktop/install/build_exe.bat
@@ -0,0 +1,17 @@
+REM delete old dist files
+rmdir /s /q dist
+
+REM build onionshare-gui.exe
+pyinstaller install\pyinstaller.spec -y
+
+REM download tor
+python install\get-tor-windows.py
+
+REM sign onionshare-gui.exe
+signtool.exe sign /v /d "OnionShare" /a /tr http://time.certum.pl/ dist\onionshare\onionshare-gui.exe
+
+REM build an installer, dist\onionshare-setup.exe
+makensis.exe install\onionshare.nsi
+
+REM sign onionshare-setup.exe
+signtool.exe sign /v /d "OnionShare" /a /tr http://time.certum.pl/ dist\onionshare-setup.exe
diff --git a/desktop/install/build_osx.sh b/desktop/install/build_osx.sh
new file mode 100755
index 00000000..9d286591
--- /dev/null
+++ b/desktop/install/build_osx.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
+cd $ROOT
+
+# deleting dist
+echo Deleting dist folder
+rm -rf $ROOT/dist &>/dev/null 2>&1
+
+# build the .app
+echo Building OnionShare.app
+pyinstaller $ROOT/install/pyinstaller.spec
+python3 $ROOT/install/get-tor-osx.py
+
+# create a symlink of onionshare-gui called onionshare, for the CLI version
+cd $ROOT/dist/OnionShare.app/Contents/MacOS
+ln -s onionshare-gui onionshare
+cd $ROOT
+
+if [ "$1" = "--release" ]; then
+ mkdir -p dist
+ APP_PATH="$ROOT/dist/OnionShare.app"
+ IDENTITY_NAME_APPLICATION="Developer ID Application: Micah Lee (N9B95FDWH4)"
+ ENTITLEMENTS_CHILD_PATH="$ROOT/install/macos_sandbox/child.plist"
+ ENTITLEMENTS_PARENT_PATH="$ROOT/install/macos_sandbox/parent.plist"
+
+ echo "Codesigning the app bundle"
+ codesign \
+ --deep \
+ -s "$IDENTITY_NAME_APPLICATION" \
+ -o runtime \
+ --force \
+ --entitlements "$ENTITLEMENTS_CHILD_PATH" \
+ --timestamp \
+ "$APP_PATH"
+ codesign \
+ -s "$IDENTITY_NAME_APPLICATION" \
+ -o runtime \
+ --force \
+ --entitlements "$ENTITLEMENTS_PARENT_PATH" \
+ --timestamp \
+ "$APP_PATH"
+
+ echo "Create the DMG"
+ if [ ! -f "/usr/local/bin/create-dmg" ]; then
+ echo "Error: create-dmg is not installed"
+ exit 0
+ fi
+ /usr/local/bin/create-dmg "$APP_PATH" --identity "$IDENTITY_NAME_APPLICATION"
+ mv *.dmg dist
+
+ echo "Cleaning up"
+ rm -rf "$APP_PATH"
+
+ echo "All done, your DMG is in:"
+ ls dist/*.dmg
+fi
diff --git a/desktop/install/build_rpm.sh b/desktop/install/build_rpm.sh
new file mode 100755
index 00000000..145f0a3c
--- /dev/null
+++ b/desktop/install/build_rpm.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
+cd $DIR
+
+VERSION=`cat share/version.txt`
+
+# clean up from last build
+rm -r build dist >/dev/null 2>&1
+
+# build binary package
+python3 setup.py bdist_rpm --requires="python3-flask, python3-flask-httpauth, python3-stem, python3-qt5, python3-crypto, python3-pysocks, nautilus-python, tor, obfs4, python3-psutil, python3-socketio, python3-flask-socketio, python3-qrcode"
+
+# install it
+echo ""
+echo "To install, run:"
+echo "sudo dnf install dist/onionshare-$VERSION-1.noarch.rpm"
diff --git a/desktop/install/build_source.sh b/desktop/install/build_source.sh
new file mode 100755
index 00000000..d7f48722
--- /dev/null
+++ b/desktop/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/desktop/install/check_lacked_trans.py b/desktop/install/check_lacked_trans.py
new file mode 100755
index 00000000..965b103b
--- /dev/null
+++ b/desktop/install/check_lacked_trans.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+"""
+Check translation lacked or disused.
+
+Example:
+in OnionShare directory
+$ check_lacked_trans.py
+de disused choose_file
+de disused gui_starting_server
+de lacked gui_canceled
+de lacked gui_starting_server1
+de lacked gui_starting_server2
+de lacked gui_starting_server3
+en disused choose_file
+es disused choose_file
+es disused gui_starting_server
+...
+
+
+1. search `{{strings.translation_key}}` and `strings._('translation_key')`
+ from .py or .html files.
+2. load translation key from locale/*.json.
+3. compare these.
+
+"""
+
+
+import argparse
+import re
+import os
+import codecs
+import json
+import sys
+
+
+def arg_parser():
+ desc = __doc__.strip().splitlines()[0]
+ p = argparse.ArgumentParser(description=desc)
+ p.add_argument(
+ "-d",
+ default=".",
+ help="onionshare directory",
+ metavar="ONIONSHARE_DIR",
+ dest="onionshare_dir",
+ )
+ p.add_argument(
+ "--show-all-keys",
+ action="store_true",
+ help="show translation key in source and exit",
+ ),
+ p.add_argument(
+ "-l",
+ default="all",
+ help="language code (default: all)",
+ metavar="LANG_CODE",
+ dest="lang_code",
+ )
+ return p
+
+
+def files_in(*dirs):
+ dir = os.path.join(*dirs)
+ files = os.listdir(dir)
+ return [os.path.join(dir, f) for f in files]
+
+
+def main():
+ parser = arg_parser()
+ args = parser.parse_args()
+
+ dir = args.onionshare_dir
+
+ src = (
+ files_in(dir, "onionshare_gui")
+ + files_in(dir, "onionshare_gui/tab")
+ + files_in(dir, "onionshare_gui/tab/mode")
+ + files_in(dir, "onionshare_gui/tab/mode/chat_mode")
+ + files_in(dir, "onionshare_gui/tab/mode/receive_mode")
+ + files_in(dir, "onionshare_gui/tab/mode/share_mode")
+ + files_in(dir, "onionshare_gui/tab/mode/website_mode")
+ + files_in(dir, "install/scripts")
+ )
+ filenames = [p for p in src if p.endswith(".py")]
+
+ lang_code = args.lang_code
+
+ translate_keys = set()
+ for filename in filenames:
+ # load translate key from python source
+ with open(filename) as f:
+ src = f.read()
+
+ # find all the starting strings
+ start_substr = "strings._\("
+ starting_indices = [m.start() for m in re.finditer(start_substr, src)]
+
+ for starting_i in starting_indices:
+ # are we dealing with single quotes or double quotes?
+ quote = None
+ inc = 0
+ while True:
+ quote_i = starting_i + len("strings._(") + inc
+ if src[quote_i] == '"':
+ quote = '"'
+ break
+ elif src[quote_i] == "'":
+ quote = "'"
+ break
+ else:
+ inc += 1
+
+ # find the starting quote
+ starting_i = src.find(quote, starting_i)
+ if starting_i:
+ starting_i += 1
+ # find the ending quote
+ ending_i = src.find(quote, starting_i)
+ if ending_i:
+ key = src[starting_i:ending_i]
+ translate_keys.add(key)
+
+ if args.show_all_keys:
+ for k in sorted(translate_keys):
+ print(k)
+ sys.exit()
+
+ if lang_code == "all":
+ locale_files = [f for f in files_in(dir, "share/locale") if f.endswith(".json")]
+ else:
+ locale_files = [
+ f
+ for f in files_in(dir, "share/locale")
+ if f.endswith("%s.json" % lang_code)
+ ]
+ for locale_file in locale_files:
+ with codecs.open(locale_file, "r", encoding="utf-8") as f:
+ trans = json.load(f)
+ # trans -> {"key1": "translate-text1", "key2": "translate-text2", ...}
+ locale_keys = set(trans.keys())
+
+ disused = locale_keys - translate_keys
+ lacked = translate_keys - locale_keys
+
+ locale, ext = os.path.splitext(os.path.basename(locale_file))
+ for k in sorted(disused):
+ print(locale, "disused", k)
+
+ for k in sorted(lacked):
+ print(locale, "lacked", k)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/desktop/install/get-tor-osx.py b/desktop/install/get-tor-osx.py
new file mode 100644
index 00000000..a05870f2
--- /dev/null
+++ b/desktop/install/get-tor-osx.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+"""
+This script downloads a pre-built tor binary to bundle with OnionShare.
+In order to avoid a Mac gnupg dependency, I manually verify the signature
+and hard-code the sha256 hash.
+"""
+
+import inspect
+import os
+import sys
+import hashlib
+import zipfile
+import io
+import shutil
+import subprocess
+import requests
+
+
+def main():
+ dmg_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0/TorBrowser-10.0-osx64_en-US.dmg"
+ dmg_filename = "TorBrowser-10.0-osx64_en-US.dmg"
+ expected_dmg_sha256 = (
+ "4e1ca7068bc29d5e8ffba85ecc8fec36c52ae582faea67bcdf445cd57192fb08"
+ )
+
+ # Build paths
+ root_path = os.path.dirname(
+ os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+ )
+ working_path = os.path.join(root_path, "build", "tor")
+ dmg_tor_path = os.path.join(
+ "/Volumes", "Tor Browser", "Tor Browser.app", "Contents"
+ )
+ dmg_path = os.path.join(working_path, dmg_filename)
+ dist_path = os.path.join(root_path, "dist", "OnionShare.app", "Contents")
+
+ # Make sure the working folder exists
+ if not os.path.exists(working_path):
+ os.makedirs(working_path)
+
+ # Make sure the zip is downloaded
+ if not os.path.exists(dmg_path):
+ print("Downloading {}".format(dmg_url))
+ r = requests.get(dmg_url)
+ open(dmg_path, "wb").write(r.content)
+ dmg_sha256 = hashlib.sha256(r.content).hexdigest()
+ else:
+ dmg_data = open(dmg_path, "rb").read()
+ dmg_sha256 = hashlib.sha256(dmg_data).hexdigest()
+
+ # Compare the hash
+ if dmg_sha256 != expected_dmg_sha256:
+ print("ERROR! The sha256 doesn't match:")
+ print("expected: {}".format(expected_dmg_sha256))
+ print(" actual: {}".format(dmg_sha256))
+ sys.exit(-1)
+
+ # Mount the dmg, copy data to the working path
+ subprocess.call(["hdiutil", "attach", dmg_path])
+
+ # Make sure Resources/tor exists before copying files
+ if os.path.exists(os.path.join(dist_path, "Resources", "Tor")):
+ shutil.rmtree(os.path.join(dist_path, "Resources", "Tor"))
+ os.makedirs(os.path.join(dist_path, "Resources", "Tor"))
+ if os.path.exists(os.path.join(dist_path, "MacOS", "Tor")):
+ shutil.rmtree(os.path.join(dist_path, "MacOS", "Tor"))
+ os.makedirs(os.path.join(dist_path, "MacOS", "Tor"))
+
+ # Modify the tor script to adjust the path
+ tor_script = open(
+ os.path.join(dmg_tor_path, "Resources", "TorBrowser", "Tor", "tor"), "r"
+ ).read()
+ tor_script = tor_script.replace("../../../MacOS/Tor", "../../MacOS/Tor")
+ open(os.path.join(dist_path, "Resources", "Tor", "tor"), "w").write(tor_script)
+
+ # Copy into dist
+ shutil.copyfile(
+ os.path.join(dmg_tor_path, "Resources", "TorBrowser", "Tor", "geoip"),
+ os.path.join(dist_path, "Resources", "Tor", "geoip"),
+ )
+ shutil.copyfile(
+ os.path.join(dmg_tor_path, "Resources", "TorBrowser", "Tor", "geoip6"),
+ os.path.join(dist_path, "Resources", "Tor", "geoip6"),
+ )
+ os.chmod(os.path.join(dist_path, "Resources", "Tor", "tor"), 0o755)
+ shutil.copyfile(
+ os.path.join(dmg_tor_path, "MacOS", "Tor", "tor.real"),
+ os.path.join(dist_path, "MacOS", "Tor", "tor.real"),
+ )
+ shutil.copyfile(
+ os.path.join(dmg_tor_path, "MacOS", "Tor", "libevent-2.1.7.dylib"),
+ os.path.join(dist_path, "MacOS", "Tor", "libevent-2.1.7.dylib"),
+ )
+ os.chmod(os.path.join(dist_path, "MacOS", "Tor", "tor.real"), 0o755)
+ # obfs4proxy binary
+ shutil.copyfile(
+ os.path.join(dmg_tor_path, "MacOS", "Tor", "PluggableTransports", "obfs4proxy"),
+ os.path.join(dist_path, "Resources", "Tor", "obfs4proxy"),
+ )
+ os.chmod(os.path.join(dist_path, "Resources", "Tor", "obfs4proxy"), 0o755)
+
+ # Eject dmg
+ subprocess.call(["diskutil", "eject", "/Volumes/Tor Browser"])
+
+
+if __name__ == "__main__":
+ main()
diff --git a/desktop/install/get-tor-windows.py b/desktop/install/get-tor-windows.py
new file mode 100644
index 00000000..8b3e3c72
--- /dev/null
+++ b/desktop/install/get-tor-windows.py
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+"""
+This script downloads a pre-built tor binary to bundle with OnionShare.
+In order to avoid a Windows gnupg dependency, I manually verify the signature
+and hard-code the sha256 hash.
+"""
+
+import inspect
+import os
+import sys
+import hashlib
+import shutil
+import subprocess
+import requests
+
+
+def main():
+ exe_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0/torbrowser-install-10.0_en-US.exe"
+ exe_filename = "torbrowser-install-10.0_en-US.exe"
+ expected_exe_sha256 = (
+ "3d1a337da0e6eae32071e6de21963ba628a1a0939477bf823aa7df9051215410"
+ )
+ # 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")
+ exe_path = os.path.join(working_path, exe_filename)
+ dist_path = os.path.join(
+ os.path.join(os.path.join(root_path, "dist"), "onionshare"), "tor"
+ )
+
+ # Make sure the working folder exists
+ if not os.path.exists(working_path):
+ os.makedirs(working_path)
+
+ # Make sure the zip is downloaded
+ if not os.path.exists(exe_path):
+ print("Downloading {}".format(exe_url))
+ r = requests.get(exe_url)
+ open(exe_path, "wb").write(r.content)
+ exe_sha256 = hashlib.sha256(r.content).hexdigest()
+ else:
+ exe_data = open(exe_path, "rb").read()
+ exe_sha256 = hashlib.sha256(exe_data).hexdigest()
+
+ # Compare the hash
+ if exe_sha256 != expected_exe_sha256:
+ print("ERROR! The sha256 doesn't match:")
+ print("expected: {}".format(expected_exe_sha256))
+ print(" actual: {}".format(exe_sha256))
+ sys.exit(-1)
+
+ # Extract the bits we need from the exe
+ cmd = [
+ "7z",
+ "e",
+ "-y",
+ exe_path,
+ "Browser\TorBrowser\Tor",
+ "-o%s" % os.path.join(working_path, "Tor"),
+ ]
+ cmd2 = [
+ "7z",
+ "e",
+ "-y",
+ exe_path,
+ "Browser\TorBrowser\Data\Tor\geoip*",
+ "-o%s" % os.path.join(working_path, "Data"),
+ ]
+ subprocess.Popen(cmd).wait()
+ subprocess.Popen(cmd2).wait()
+
+ # Copy into dist
+ if os.path.exists(dist_path):
+ shutil.rmtree(dist_path)
+ os.makedirs(dist_path)
+ shutil.copytree(os.path.join(working_path, "Tor"), os.path.join(dist_path, "Tor"))
+ shutil.copytree(
+ os.path.join(working_path, "Data"), os.path.join(dist_path, "Data", "Tor")
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/desktop/install/licenses/license-jquery.txt b/desktop/install/licenses/license-jquery.txt
new file mode 100644
index 00000000..e3dbacb9
--- /dev/null
+++ b/desktop/install/licenses/license-jquery.txt
@@ -0,0 +1,20 @@
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/install/licenses/license-obfs4.txt b/desktop/install/licenses/license-obfs4.txt
new file mode 100644
index 00000000..6b89f8ca
--- /dev/null
+++ b/desktop/install/licenses/license-obfs4.txt
@@ -0,0 +1,55 @@
+Copyright (c) 2014, Yawning Angel <yawning at torproject dot org>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+
+Copyright (c) 2012 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/desktop/install/licenses/license-onionshare.txt b/desktop/install/licenses/license-onionshare.txt
new file mode 100644
index 00000000..77d05583
--- /dev/null
+++ b/desktop/install/licenses/license-onionshare.txt
@@ -0,0 +1,676 @@
+Copyright (C) 2014-2018 Micah Lee <micah@micahflee.com>
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/desktop/install/licenses/license-tor.txt b/desktop/install/licenses/license-tor.txt
new file mode 100644
index 00000000..3d0f8c12
--- /dev/null
+++ b/desktop/install/licenses/license-tor.txt
@@ -0,0 +1,381 @@
+ This file contains the license for Tor,
+ a free software project to provide anonymity on the Internet.
+
+ It also lists the licenses for other components used by Tor.
+
+ For more information about Tor, see https://www.torproject.org/.
+
+ If you got this file as a part of a larger bundle,
+ there may be other license terms that you should be aware of.
+
+===============================================================================
+Tor is distributed under this license:
+
+Copyright (c) 2001-2004, Roger Dingledine
+Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
+Copyright (c) 2007-2017, The Tor Project, Inc.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+ * Neither the names of the copyright owners nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+===============================================================================
+src/ext/strlcat.c and src/ext/strlcpy.c by Todd C. Miller are licensed
+under the following license:
+
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+===============================================================================
+src/ext/tor_queue.h is licensed under the following license:
+
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+
+===============================================================================
+src/ext/csiphash.c is licensed under the following license:
+
+ Copyright (c) 2013 Marek Majkowski <marek@popcount.org>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+===============================================================================
+Trunnel is distributed under this license:
+
+Copyright 2014 The Tor Project, Inc.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+ * Neither the names of the copyright owners nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===============================================================================
+src/config/geoip is licensed under the following license:
+
+OPEN DATA LICENSE (GeoLite Country and GeoLite City databases)
+
+Copyright (c) 2008 MaxMind, Inc. All Rights Reserved.
+
+All advertising materials and documentation mentioning features or use of
+this database must display the following acknowledgment:
+"This product includes GeoLite data created by MaxMind, available from
+http://maxmind.com/"
+
+Redistribution and use with or without modification, are permitted provided
+that the following conditions are met:
+1. Redistributions must retain the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution.
+2. All advertising materials and documentation mentioning features or use of
+this database must display the following acknowledgement:
+"This product includes GeoLite data created by MaxMind, available from
+http://maxmind.com/"
+3. "MaxMind" may not be used to endorse or promote products derived from this
+database without specific prior written permission.
+
+THIS DATABASE IS PROVIDED BY MAXMIND, INC ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MAXMIND BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+===============================================================================
+m4/pc_from_ucontext.m4 is available under the following license. Note that
+it is *not* built into the Tor software.
+
+Copyright (c) 2005, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===============================================================================
+m4/pkg.m4 is available under the following license. Note that
+it is *not* built into the Tor software.
+
+pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+serial 1 (pkg-config-0.24)
+
+Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+As a special exception to the GNU General Public License, if you
+distribute this file as part of a program that contains a
+configuration script generated by Autoconf, you may include it under
+the same distribution terms that you use for the rest of that program.
+===============================================================================
+src/ext/readpassphrase.[ch] are distributed under this license:
+
+ Copyright (c) 2000-2002, 2007 Todd C. Miller <Todd.Miller@courtesan.com>
+
+ Permission to use, copy, modify, and distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ Sponsored in part by the Defense Advanced Research Projects
+ Agency (DARPA) and Air Force Research Laboratory, Air Force
+ Materiel Command, USAF, under agreement number F39502-99-1-0512.
+
+===============================================================================
+src/ext/mulodi4.c is distributed under this license:
+
+ =========================================================================
+ compiler_rt License
+ =========================================================================
+
+ The compiler_rt library is dual licensed under both the
+ University of Illinois "BSD-Like" license and the MIT license.
+ As a user of this code you may choose to use it under either
+ license. As a contributor, you agree to allow your code to be
+ used under both.
+
+ Full text of the relevant licenses is included below.
+
+ =========================================================================
+
+ University of Illinois/NCSA
+ Open Source License
+
+ Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT
+
+ All rights reserved.
+
+ Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal with the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ * Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the following
+ disclaimers.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimers in the documentation and/or other materials
+ provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois
+ at Urbana-Champaign, nor the names of its contributors may
+ be used to endorse or promote products derived from this
+ Software without specific prior written permission.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS WITH THE SOFTWARE.
+
+ =========================================================================
+
+ Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+ =========================================================================
+ Copyrights and Licenses for Third Party Software Distributed with LLVM:
+ =========================================================================
+
+ The LLVM software contains code written by third parties. Such
+ software will have its own individual LICENSE.TXT file in the
+ directory in which it appears. This file will describe the
+ copyrights, license, and restrictions which apply to that code.
+
+ The disclaimer of warranty in the University of Illinois Open
+ Source License applies to all code in the LLVM Distribution, and
+ nothing in any of the other licenses gives permission to use the
+ names of the LLVM Team or the University of Illinois to endorse
+ or promote products derived from this Software.
+
+===============================================================================
+If you got Tor as a static binary with OpenSSL included, then you should know:
+ "This product includes software developed by the OpenSSL Project
+ for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+===============================================================================
diff --git a/desktop/install/licenses/readme.txt b/desktop/install/licenses/readme.txt
new file mode 100644
index 00000000..3dd5d2fe
--- /dev/null
+++ b/desktop/install/licenses/readme.txt
@@ -0,0 +1 @@
+This folder contains 3rd-party licenses for software included with OnionShare.
diff --git a/desktop/install/macos_sandbox/child.plist b/desktop/install/macos_sandbox/child.plist
new file mode 100644
index 00000000..06d88f66
--- /dev/null
+++ b/desktop/install/macos_sandbox/child.plist
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>com.apple.security.app-sandbox</key>
+ <true/>
+ <key>com.apple.security.inherit</key>
+ <true/>
+</dict>
+</plist>
diff --git a/desktop/install/macos_sandbox/parent.plist b/desktop/install/macos_sandbox/parent.plist
new file mode 100644
index 00000000..8b9ac949
--- /dev/null
+++ b/desktop/install/macos_sandbox/parent.plist
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <!-- Enable app sandbox -->
+ <key>com.apple.security.app-sandbox</key>
+ <true/>
+
+ <!-- Required for running PyInstaller python code with hardened runtime -->
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
+ <true/>
+
+ <!-- Both OnionShare and Tor need network server and client -->
+ <key>com.apple.security.network.server</key>
+ <true/>
+ <key>com.apple.security.network.client</key>
+ <true/>
+
+ <!-- In share mode, users need to be able to select files, and in receive mode,
+ users need to be able to choose a folder to save files to -->
+ <key>com.apple.security.files.user-selected.read-write</key>
+ <true/>
+
+ <!-- Flask needs to read this mime.types file when starting an HTTP server -->
+ <key>com.apple.security.temporary-exception.files.absolute-path.read-only</key>
+ <array>
+ <string>/private/etc/apache2/mime.types</string>
+ </array>
+
+ <!-- For OnionShare to be able to connect to Tor Browser's tor control port,
+ it needs to read it's control_auth_cookie file -->
+ <key>com.apple.security.temporary-exception.files.home-relative-path.read-only</key>
+ <array>
+ <string>/Library/Application Support/TorBrowser-Data/Tor/control_auth_cookie</string>
+ </array>
+
+ <!-- In receive mode, OnionShare needs to be able to write to ~/OnionShare -->
+ <key>com.apple.security.temporary-exception.files.home-relative-path.read-write</key>
+ <array>
+ <string>/OnionShare/</string>
+ </array>
+</dict>
+</plist>
diff --git a/desktop/install/onionshare.icns b/desktop/install/onionshare.icns
new file mode 100644
index 00000000..f65ad12d
--- /dev/null
+++ b/desktop/install/onionshare.icns
Binary files differ
diff --git a/desktop/install/onionshare.ico b/desktop/install/onionshare.ico
new file mode 100644
index 00000000..dcde4f1f
--- /dev/null
+++ b/desktop/install/onionshare.ico
Binary files differ
diff --git a/desktop/install/onionshare.nsi b/desktop/install/onionshare.nsi
new file mode 100644
index 00000000..21ac0baa
--- /dev/null
+++ b/desktop/install/onionshare.nsi
@@ -0,0 +1,111 @@
+!define APPNAME "OnionShare"
+!define BINPATH "..\dist\onionshare"
+!define ABOUTURL "https:\\onionshare.org\"
+
+# change these with each release
+!define INSTALLSIZE 132423
+!define VERSIONMAJOR 2
+!define VERSIONMINOR 3
+!define VERSIONSTRING "2.3.dev1"
+
+RequestExecutionLevel admin
+
+Name "OnionShare"
+InstallDir "$PROGRAMFILES\${APPNAME}"
+Icon "onionshare.ico"
+
+!include LogicLib.nsh
+
+Page directory
+Page instfiles
+
+!macro VerifyUserIsAdmin
+UserInfo::GetAccountType
+pop $0
+${If} $0 != "admin" ;Require admin rights on NT4+
+ messageBox mb_iconstop "Administrator rights required!"
+ setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
+ quit
+${EndIf}
+!macroend
+
+# in order to code sign uninstall.exe, we need to do some hacky stuff outlined
+# here: http:\\nsis.sourceforge.net\Signing_an_Uninstaller
+!ifdef INNER
+ !echo "Creating uninstall.exe"
+ OutFile "$%TEMP%\tempinstaller.exe"
+ SetCompress off
+!else
+ !echo "Creating normal installer"
+ !system "makensis.exe /DINNER onionshare.nsi" = 0
+ !system "$%TEMP%\tempinstaller.exe" = 2
+ !system "signtool.exe sign /v /d $\"Uninstall OnionShare$\" /a /tr http://time.certum.pl/ $%TEMP%\uninstall.exe" = 0
+
+ # all done, now we can build the real installer
+ OutFile "..\dist\onionshare-setup.exe"
+ SetCompressor /FINAL /SOLID lzma
+!endif
+
+Function .onInit
+ !ifdef INNER
+ WriteUninstaller "$%TEMP%\uninstall.exe"
+ Quit # bail out early
+ !endif
+
+ setShellVarContext all
+ !insertmacro VerifyUserIsAdmin
+FunctionEnd
+
+Section "install"
+ SetOutPath "$INSTDIR"
+ File "onionshare.ico"
+ File /a /r "${BINPATH}\"
+
+ # uninstaller
+ !ifndef INNER
+ SetOutPath $INSTDIR
+ File $%TEMP%\uninstall.exe
+ !endif
+
+ # start menu
+ CreateShortCut "$SMPROGRAMS\${APPNAME}.lnk" "$INSTDIR\onionshare-gui.exe" "" "$INSTDIR\onionshare.ico"
+
+ # registry information for add\remove programs
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" \S"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "InstallLocation" "$\"$INSTDIR$\""
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$\"$INSTDIR\onionshare.ico$\""
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLInfoAbout" "$\"${ABOUTURL}$\""
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" ${VERSIONSTRING}
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMajor" ${VERSIONMAJOR}
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMinor" ${VERSIONMINOR}
+ # there is no option for modifying or repairing the install
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" 1
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" 1
+ # set the INSTALLSIZE constant (!defined at the top of this script) so Add\Remove Programs can accurately report the size
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "EstimatedSize" ${INSTALLSIZE}
+SectionEnd
+
+# uninstaller
+Function un.onInit
+ SetShellVarContext all
+
+ #Verify the uninstaller - last chance to back out
+ MessageBox MB_OKCANCEL "Uninstall ${APPNAME}?" IDOK next
+ Abort
+ next:
+ !insertmacro VerifyUserIsAdmin
+FunctionEnd
+
+!ifdef INNER
+ Section "uninstall"
+ Delete "$SMPROGRAMS\${APPNAME}.lnk"
+
+ # remove files
+ RMDir /r $INSTDIR
+
+ # remove uninstaller information from the registry
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
+ SectionEnd
+!endif
diff --git a/desktop/install/onionshare80.xpm b/desktop/install/onionshare80.xpm
new file mode 100644
index 00000000..a3d0f6dc
--- /dev/null
+++ b/desktop/install/onionshare80.xpm
@@ -0,0 +1,257 @@
+/* XPM */
+static char * icon_xpm[] = {
+"80 80 174 2",
+" c None",
+". c #4E0D4E",
+"+ c #531453",
+"@ c #581B58",
+"# c #673067",
+"$ c #906890",
+"% c #B397B3",
+"& c #CFBECF",
+"* c #E0D5E0",
+"= c #F0EBF0",
+"- c #FCFCFC",
+"; c #4F0E4F",
+"> c #6E396E",
+", c #8F668F",
+"' c #C1AAC1",
+") c #EFE9EF",
+"! c #FFFFFF",
+"~ c #865986",
+"{ c #C5B0C5",
+"] c #EAE2EA",
+"^ c #764476",
+"/ c #DFD4DF",
+"( c #FAF9FA",
+"_ c #5E235E",
+": c #BDA5BD",
+"< c #885C88",
+"[ c #E8DFE8",
+"} c #521352",
+"| c #B89EB8",
+"1 c #FCFBFC",
+"2 c #5B1F5B",
+"3 c #4D0C4D",
+"4 c #571A57",
+"5 c #5D225D",
+"6 c #D8C9D8",
+"7 c #612761",
+"8 c #D4C4D4",
+"9 c #D4C5D4",
+"0 c #4E0C4E",
+"a c #632A63",
+"b c #DDD1DD",
+"c c #693269",
+"d c #DED3DE",
+"e c #FDFCFD",
+"f c #F6F3F6",
+"g c #D7C9D7",
+"h c #A482A4",
+"i c #7E4E7E",
+"j c #652D65",
+"k c #521252",
+"l c #490649",
+"m c #4B094B",
+"n c #662E66",
+"o c #D9CCD9",
+"p c #DCD0DC",
+"q c #A584A5",
+"r c #622862",
+"s c #440044",
+"t c #470447",
+"u c #4A084A",
+"v c #4C0A4C",
+"w c #825482",
+"x c #6F3A6F",
+"y c #4D0B4D",
+"z c #642B64",
+"A c #DBCFDB",
+"B c #F7F3F7",
+"C c #9B779B",
+"D c #835683",
+"E c #E5DBE5",
+"F c #E4DAE4",
+"G c #E8E0E8",
+"H c #713C71",
+"I c #4C0B4C",
+"J c #8C628C",
+"K c #E2D9E2",
+"L c #672F67",
+"M c #6D386D",
+"N c #E7DFE7",
+"O c #622962",
+"P c #926A92",
+"Q c #FAF8FA",
+"R c #E2D7E2",
+"S c #6C376C",
+"T c #4A074A",
+"U c #6B346B",
+"V c #CCBACC",
+"W c #875C87",
+"X c #F9F7F9",
+"Y c #7B4C7B",
+"Z c #DED4DE",
+"` c #5B1E5B",
+" . c #855885",
+".. c #DDD2DD",
+"+. c #895E89",
+"@. c #DBCEDB",
+"#. c #4B084B",
+"$. c #7F507F",
+"%. c #F7F4F7",
+"&. c #5F245F",
+"*. c #764576",
+"=. c #551755",
+"-. c #FEFEFE",
+";. c #D7CAD7",
+">. c #5C205C",
+",. c #815381",
+"'. c #F3EEF3",
+"). c #774577",
+"!. c #F4F0F4",
+"~. c #D3C3D3",
+"{. c #591C59",
+"]. c #703C70",
+"^. c #FEFDFE",
+"/. c #D3C4D3",
+"(. c #511051",
+"_. c #501150",
+":. c #B093B0",
+"<. c #B59AB5",
+"[. c #FDFDFD",
+"}. c #B79CB7",
+"|. c #B599B5",
+"1. c #895F89",
+"2. c #734073",
+"3. c #987298",
+"4. c #9A759A",
+"5. c #8A608A",
+"6. c #511251",
+"7. c #602660",
+"8. c #CEBCCE",
+"9. c #F1ECF1",
+"0. c #855985",
+"a. c #5E225E",
+"b. c #784778",
+"c. c #DED1DE",
+"d. c #F3EFF3",
+"e. c #7F517F",
+"f. c #F5F1F5",
+"g. c #470347",
+"h. c #5D215D",
+"i. c #F3F0F3",
+"j. c #865B86",
+"k. c #450145",
+"l. c #D6C7D6",
+"m. c #F4F1F4",
+"n. c #805280",
+"o. c #E6DCE6",
+"p. c #885D88",
+"q. c #5C215C",
+"r. c #E6DDE6",
+"s. c #F8F6F8",
+"t. c #936C93",
+"u. c #460246",
+"v. c #DACDDA",
+"w. c #F6F4F6",
+"x. c #8E658E",
+"y. c #450045",
+"z. c #5E245E",
+"A. c #642C64",
+"B. c #DED2DE",
+"C. c #F7F5F7",
+"D. c #EEE7EE",
+"E. c #EDE6ED",
+"F. c #916991",
+"G. c #ECE5EC",
+"H. c #FBF9FB",
+"I. c #6A336A",
+"J. c #662F66",
+"K. c #FBFAFB",
+"L. c #956F95",
+"M. c #E9E1E9",
+"N. c #DACCDA",
+"O. c #541654",
+"P. c #BAA1BA",
+"Q. c #4E0E4E",
+" . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . + @ # $ % & * = - - = * & % $ # @ + . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . ; > , ' ) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ) ' , > ; . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . ~ { ] ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] { ~ . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . ^ / ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ( / ^ . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . _ : ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : _ . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . < [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! [ < . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . } | 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 | } . . . . . . . . . . . . ",
+" . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . . ",
+" . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . . ",
+" . . . . . . . . . 3 3 4 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . ",
+" . . . . . . . . . . . . 5 6 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & } . . . . . . . . . . . ",
+" . . . . . . . . . . . . . 7 8 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! | . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . _ 9 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 < . . . . . . . . . . . ",
+" . . . . . . . 3 0 . . . . . . . a b ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! [ _ . . . . . . . . . . ",
+" . . . . . . . . 0 . . . . . . . . . c d ! ! ! ! ! ! ! ! ! ! e f g h i j k k j i h g f e ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : . . . . . . . . . . . ",
+" . . . . . . . . . . . . . l m . . . . n o ! ! ! ! ! ! ! ! p q r s t u v . . v u t s r q p ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ^ . . . . . . . . . . ",
+" . . . . . . . . . . . . . 3 w x y . . . . z A ! ! ! ! ! B C 7 t v . . . . . . . . . . v t 7 C B ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / . . . . . . . . . . . ",
+" . . . . . 3 0 . . . . . y D ! E 7 3 . . . . c F ! ! ! G H ; 3 . . . . . . . . . . . . . . 3 ; H G ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ( ~ . . . . . . . . . . ",
+" . . . . . 0 . . . . 3 I J ! ! ! K L l . . . . M E ! N O u . . . . . . . . . . . . . . . . . . u O N ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! { ; . . . . . . . . . ",
+" . . . . . . . . . . I P Q ! ! ! ! R S T . . . . U V O l . . . . . . . . . . . . . . . . . . . . l O G ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] > . . . . . . . . . ",
+" . . . . 0 . . . . . v W X ! ! ! ! ! ! / j 3 . . . . + u . . . . . . . . . . . . . . . . . . . . . . u H B ! ! ! ! ! ! ! ! ! ! ! ! ! ! , . . . . . . . . . . ",
+" . . . 0 . . . . . v Y ! ! ! ! ! ! ! ! ! Z ` 0 . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . ; C ! ! ! ! ! ! ! ! ! ! ! ! ! ! ' + . . . . . . . . . ",
+" . . 0 . . . . 0 I .! ! ! ! ! ! ! ! ! ! ! ..7 u . . . . . 3 . . . . . . . . . . . . . . . . . . . . . 3 7 p ! ! ! ! ! ! ! ! ! ! ! ! ! ) @ . . . . . . . . . ",
+" . . . . . . . v +.B ! ! ! ! ! ! ! ! ! ! ! ! @.L #.. . . . . 3 . . . . . . . . . . . . . . . . . . . . . t q e ! ! ! ! ! ! ! ! ! ! ! ! ! # . . . . . . . . . ",
+". 0 . . . . . m $.%.! ! ! ! ! ! ! ! ! ! ! ! ! ! o &.. . . . . . 3 . . . . . . . . . . . . . . . . . . . . v r f ! ! ! ! ! ! ! ! ! ! ! ! ! $ . . . . . . . . . . ",
+"3 . . . . . m *.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! o =.. . . . . . 3 . . . . . . . . . . . . . . . . . . . . s g ! ! ! ! ! ! ! ! ! ! ! ! ! % . . . . . . . . . . ",
+". . . . . v i -.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ;.>.m . . . . 3 3 . . . . . . . . . . . . . . . . . . . t h ! ! ! ! ! ! ! ! ! ! ! ! ! & . . . . . . . . . . ",
+". . . . v ,.'.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9 r v . . . . . 3 . . . . . . . . . . . . . . . . . . u i ! ! ! ! ! ! ! ! ! ! ! ! ! * . . . . . . . . . . ",
+". . . u ).!.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~.{.. . . . . . 3 . . . . . . . . . . . . . . . . . v j ! ! ! ! ! ! ! ! ! ! ! ! ! = . . . . . . . . . . ",
+". . m ].^.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! /.(.. . . . . . 3 . . . . . . . . . . . . . . . . . k ! ! ! ! ! ! ! ! ! ! ! ! ! - . . . . . . . . . . ",
+". y _.:.<.<.<.<.<.<.[.! ! ! ! ! ! ! ! ! ! ! ! ! }.<.<.<.|.<.1.l . . . . . 3 . . . . 3 . . . . . m 2.3.3.3.3.3.4.! ! ! ! ! ! ! ! ! ! ! ! ! [.3.3.3.3.3.3.5.6.3 . ",
+". . . . . . . . . . = ! ! ! ! ! ! ! ! ! ! ! ! ! j v . . . . . . . . . . . . . . . . 3 . . . . . y 7.8.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9.0.#.. . ",
+". . . . . . . . . . * ! ! ! ! ! ! ! ! ! ! ! ! ! i u . . . . . . . . . . . . . . . . . 3 . . . . . 3 a.8.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9.b.m . . . ",
+". . . . . . . . . . & ! ! ! ! ! ! ! ! ! ! ! ! ! h t . . . . . . . . . . . . . . . . . . 3 . . . . . 3 2 c.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! d.e.3 . . . . ",
+". . . . . . . . . . % ! ! ! ! ! ! ! ! ! ! ! ! ! g s . . . . . . . . . . . . . . . . . . . 3 . . . . . m {./ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! f.5.g.. . . . . ",
+". . . . . . . . . . $ ! ! ! ! ! ! ! ! ! ! ! ! ! f r v . . . . . . . . . . . . . . . . . . . 3 . . . . . m h.8 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! i.j.k.. . . . . 0 ",
+" . . . . . . . . . # ! ! ! ! ! ! ! ! ! ! ! ! ! e q t . . . . . . . . . . . . . . . . . . . . 3 . . . . . y r l.! ! ! ! ! ! ! ! ! ! ! ! ! ! m.n.m . . . . . 3 ",
+" . . . . . . . . . @ ) ! ! ! ! ! ! ! ! ! ! ! ! ! p 7 3 . . . . . . . . . . . . . . . . . . . . 3 . . . . . y &.o.! ! ! ! ! ! ! ! ! ! ! ! %.p.y . . . . . 3 . ",
+" . . . . . . . . . + ' ! ! ! ! ! ! ! ! ! ! ! ! ! ! C ; . . . . . . . . . . . . . . . . . . . . . 3 . . . . . #.q.r.! ! ! ! ! ! ! ! ! ! s.t.u.. . . . . 3 . . ",
+" . . . . . . . . . . , ! ! ! ! ! ! ! ! ! ! ! ! ! ! B H u . . . . . . . . . . . . . . . . . . . . . 3 3 . . . . #.7 v.! ! ! ! ! ! ! ! w.x.y.. . . . . 3 . . . ",
+" . . . . . . . . . > ] ! ! ! ! ! ! ! ! ! ! ! ! ! ! G O l . . . . . . . . . . . . . . . . . . . . l z.A.. . . . y L B.! ! ! ! ! ! C.+.v . . . . . 3 . . . ",
+" . . . . . . . . . ; { ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! N O u . . . . . . . . . . . . . . . . . . u O N D.h.. . . . y O E.! ! ! ! ( F.y . . . . . 3 . . . . ",
+" . . . . . . . . . . ~ ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! G H ; 3 . . . . . . . . . . . . . . 3 ; H G ! ! D.a . . . . u 7.G.! ! H.C k.. . . . . 3 . . . . . ",
+" . . . . . . . . . . . / ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! B C 7 t v . . . . . . . . . . v t 7 C B ! ! ! ! R I.. . . . #.J.R K.L.y.. . . . . 3 . . . . . . ",
+" . . . . . . . . . . ^ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! p q r s t u v . . v u t s r q p ! ! ! ! ! ! ! * 7 . . . . y x n.y . . . . . 3 . . . . . . ",
+" . . . . . . . . . . . : ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! e f g h i j k k j i h g f e ! ! ! ! ! ! ! ! ! M.@ . . . . . . . . . . . 3 . . . . . . . ",
+" . . . . . . . . . . _ [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! G _ . . . . . . . . . 3 . . . . . . . ",
+" . . . . . . . . . . . < 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @.A.. . . . . . . 3 . . . . . . . . ",
+" . . . . . . . . . . . | ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! N.2 . . . . . 3 3 . . . . . . . ",
+" . . . . . . . . . . . } & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! F O.. . . 3 . . . . . . . . . ",
+" . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! P.Q.. 3 . . . . . . . . . ",
+" . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 0 3 . . . . . . . . . . ",
+" . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . . ",
+" . . . . . . . . . . . . } | 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 | } . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . < [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! [ < . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . _ : ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : _ . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . ^ / ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ( / ^ . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . ~ { ] ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] { ~ . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . ; > , ' ) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ) ' , > ; . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . + @ # $ % & * = - - = * & % $ # @ + . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . "};
diff --git a/desktop/install/org.onionshare.OnionShare.appdata.xml b/desktop/install/org.onionshare.OnionShare.appdata.xml
new file mode 100644
index 00000000..3630b89c
--- /dev/null
+++ b/desktop/install/org.onionshare.OnionShare.appdata.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop-application">
+ <id>org.onionshare.OnionShare</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-3.0</project_license>
+ <name>OnionShare</name>
+ <summary>Securely and anonymously share files, host websites, and chat with friends</summary>
+ <description>
+ <p>
+ OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network.
+ </p>
+ </description>
+ <launchable type="desktop-id">org.onionshare.OnionShare.desktop</launchable>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://raw.githubusercontent.com/micahflee/onionshare/master/docs/source/_static/screenshots/tabs.png</image>
+ <caption>Types of services that OnionShare supports</caption>
+ </screenshot>
+ </screenshots>
+ <url type="bugtracker">https://github.com/micahflee/onionshare/issues/</url>
+ <url type="help">https://onionshare.org/</url>
+ <url type="homepage">https://onionshare.org/</url>
+ <developer_name>Micah Lee</developer_name>
+ <update_contact>micah@micahflee.com</update_contact>
+ <content_rating type="oars-1.1" />
+ <releases>
+ <release type="development" date="2020-09-20" version="2.3.dev1" />
+ </releases>
+</component>
diff --git a/desktop/install/org.onionshare.OnionShare.desktop b/desktop/install/org.onionshare.OnionShare.desktop
new file mode 100644
index 00000000..190e2f26
--- /dev/null
+++ b/desktop/install/org.onionshare.OnionShare.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Name=OnionShare
+GenericName=OnionShare Client
+Comment=Share a file securely and anonymously over Tor
+Comment[da]=Del en fil sikkert og anonymt over Tor
+Comment[de]=Teile Dateien sicher und anonym über das Tor-Netzwerk
+Comment[hr]=Dijeli datoteku sigurno i anonimno preko Tora
+Exec=onionshare-gui
+Terminal=false
+Type=Application
+Icon=org.onionshare.OnionShare
+Categories=Network;FileTransfer;
+Keywords=tor;anonymity;privacy;onion service;file sharing;file hosting;
+Keywords[da]=tor;anonymitet;privatliv;onion-tjeneste;fildeling;filhosting;
+Keywords[de]=tor;Anonymität;Privatsphäre;Onion-Service;File-Sharing;File-Hosting;
+Keywords[hr]=tor;anonimnost;privatnost;Onion usluga;dijeljenje datoteka;hosting datoteka;
+StartupNotify=true
+StartupWMClass=onionshare
diff --git a/desktop/install/org.onionshare.OnionShare.png b/desktop/install/org.onionshare.OnionShare.png
new file mode 100644
index 00000000..a4810d04
--- /dev/null
+++ b/desktop/install/org.onionshare.OnionShare.png
Binary files differ
diff --git a/desktop/install/org.onionshare.OnionShare.svg b/desktop/install/org.onionshare.OnionShare.svg
new file mode 100644
index 00000000..502da0d8
--- /dev/null
+++ b/desktop/install/org.onionshare.OnionShare.svg
@@ -0,0 +1,2154 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="OnionShare" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1024 1024"
+ style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#4E0D4E;}
+</style>
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <g>
+ <path class="st0" d="M896,512c0-212.08-171.92-384-384-384c-112.14,0-213.06,48.08-283.26,124.74l130.35,130.35
+ C395.77,339.61,450.66,312,512,312c110.46,0,200,89.54,200,200h-88l176,176l176-176H896z"/>
+ <circle class="st1" cx="512" cy="512" r="512"/>
+ <path class="st0" d="M896,512c0-212.08-171.92-384-384-384c-112.14,0-213.06,48.08-283.26,124.74l130.35,130.35
+ C395.77,339.61,450.66,312,512,312c110.46,0,200,89.54,200,200h-88l176,176l176-176H896z"/>
+ <path class="st0" d="M128,512c0,212.08,171.92,384,384,384c112.14,0,213.06-48.08,283.26-124.74L664.91,640.91
+ C628.23,684.39,573.34,712,512,712c-110.46,0-200-89.54-200-200h88L224,336L48,512H128z"/>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ eJzsvfuSHEd25vkE8Q65f8ise226FOGX8IjesTWrq7bX1FJbtzQj2dgYDSKhFkYkQAPB1vQ+/X6/
+73hkRlZlAaDIJns0qCBAVIZnXNyPn+t3zvmL/+M3v/vF9Rdv/unlL/LVeBj+4i9u37588e7N218e
+/OnhV19++e03797y0c9++/PD1K5GDbr+1fJZH/hfXr795tWb1788JF3gatLJB779s7sXr1//8XD3
+7ddfvvyfPz/87Oc68Xev3n35Uqe+fPP7N1ff/OH3P99up+/fvXinU+kv619O62H9ZZ0Pv/k1p1+8
+/sOLb7559f/p5DTnJeuzmzffvv7i1evf37z5n788/GJKtR1SG9vhFymnQ245acz/8+q3L795MnC+
+WnLNKbV5rtVfuirLlKa2lnVOvsBuRFm42rQfoivfvfn8269evn73m7dvPn/5zTe3b7588/abXx5u
+//ji9eHXL36vMy8O//jyyy/f/Nvh5ssXn//roMmqnz28+vKl5uWrF+8OU2YKr381pc9uvn315Rd/
+8+1X//RSM1aLP86f+ZJ//42upcvybz5un/3qK33yu5fv3umNdEOW4bd/dbN/DH3o42f/7bcvf//K
+q6aZ/e8/75d9++brr168/ddvfrC54Kp/9/Krr7/U2nmOUx2vqr7q/+1/6WM1CX0tppTO77+eX/zw
+i7ws+/uvh1zPHzGueVqOl3949fLffnn4mzevX8acX79997sgnFLGMf6OM7/99suXb//+9at3mouZ
+j9aY9F+/+eLllxp//P7Dly881z6m098x4O9evP39y3citDdffvvOe2DZ7qBF/esXf3wJZUxxg7/9
++uXrv3vzX/yMv0hzmq7mluuyLlNu66GUMl3lrF+WlEtdDuOVJq6uVTS/lDavIpt1PkzjNB2mxQ+h
+QVMaj882Hf/uj8ANud32HE0E8xuR0N++ffX7V69/OXmSawni+qu3r7440daUdO15+5/vcFWnlZ9l
+XNNcp/KRn7TqT9axzJmN+hGfxHRp5t+9e/m6T5/2yu2vd7Q/Xv36d3qd+9df3L75iuX/Br4gon+t
+/SD2EueO//YZff3br2Nq/PtnopTfvH31mmsOf+Mzy2e/+fJbnfqrt2++/fpXr//5zfCz4IL/5eXn
+YnUipi8Of/tP/0O/iKN5Px7+7u2Lz3UB/X4cc/Xi1dc/f+/l9HJvXx7ipL7pX7f/f/jbdy//WZzk
+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
+ ]]>
+ <![CDATA[
+ 2bZorSx1Ej8WuU2mwEXST/IGIF0JCsxNJCNRN6bkRNS1jg0BsoCRSBcALR/zyWXQ0Z/LAxmB0xKo
+s2kapRSsazyM1Ic5rdOYpBmsfphCwnGVGtH8MMuoLVYk/9MoLcQP8xQA9MFP4mFS5hmWs1SPP6eH
+6rP00y/ZnxkFfV+mM5WLTEcf75nOGdJpsYP+zhHGIpax2CMPPmFyfLFKXev4BL3mZD98k854a2gC
+gcUyHP3v9r4bkhu+98VxxX1UsdrnTizxbr5vYw8htmPo8I6A4dDjhQHBXh0YNLhgHY/4ptZxTR1b
+3fGs2U701rHUgaO+v34YDDEKnFA9IqcDNx1e7ocjYjow0+d46bWDpTe49P1we2+8dGCmN9R07qhp
+cNN75PTavffhU4+f+348BI56uB91dIX6PvejHI96BL0Hvvr8WJ4c69Dh1/vjzIN/8bi7cPSf4f7S
+z8Nzx3Mq9+kYnnyUPvoI6PijY3j60fc7Pl3wO3xxF30M/AJhwKXzF1BQgWKI6N9sJFSgKu+cQjB2
+bhP8ZnX0727wWo82QjdYw2LD9c4hwIcj4HLuHOjGPOj+yIUiJaBtGClSAO4N/N8gUvUIxAyIf0Ax
+k3NcirH8sCZs/NuOigrMfgkMQ+AXrnsIcMMrpCMygQBgABA2wAFYgqnH/rKzYyIe35E9mw4IhvKI
+mLRlE1Z12aWAcOyRgNe7VJDbLYA3HDNCtqyQLS9k43XB7+oxSySO5XicEBOhfMb/bvc/eybycH4c
++eSeX05HrqljuMsXjvLsUT9wzIP578cd7cKxPD6Gpx+951g/fAwfM+i7HP+BL+gkrfGH9Qpen3kF
+nXRye+YVTM5LPKWyRprJlmRy3zNMTvklzi4ZztJLPia55OQTzLu01vtj2uBFj2CKRJNjqsklf+DJ
+GxiJJ90ZODzyBj72BW6ewPnoCTz3Aj5xAQ47D+C5/++S76/147HLb+fsGy54+k4+vueceo8cd/tj
+uOicu+Q7egbWNa3nx/D4g2n56KNdOobLH3/EMV8+hudO/HuP/7AX3McbbiVol4c5eMvDKOX21txl
+kcJd4C/3o9ThO6e+kfgWaW8kvUXK23XnMxW0SmS7bbluPdPNKdKnNLfvkOQ2PMlyezgyoeuzRLct
+1W1Ldtv4UcQpIlIhvjRYtTklPvfUZ+fMbnnPj7OeFyOmIhO/Ps59HnpCekQ07rssvu2p+Tcdebh2
+dhZp+s3wrGBskbJfesgjk7qfeuRjCm7XOV4cm2G0KQUnCNAp+eOElrQ6NnTE6LI72u6YHx310fHk
+Zyj5wpGePaYPHHDnjz3MxT94DB83rB/3Hz6Gjxn0XY7/sBc8cRZnmou7kH1+bSzxom05m9NAy9mC
+dHK5Bwbf2+q+NffBBFjNgzDztS8HewGKGRKiF3lHlQjcCPdmT3dO0Q7t/9pZuqu10uZc3dn5urVv
+G2kAQ9fCEZVRbCL09ntztTtzttvN79yTu8IY2MwDM5duNGi7D7Yjtu2Yj5bGqfIEx7HaxLHSxHac
+sIf9noNZ6Onnenfs8YznuVHn2MezfK6hl6vYH5dyxy5nmj3NSEuRpvb+uNT4MceWHTecEuU+6rj/
+0DF8eMh7j7vHx/D0o+93fLrgxx4fjHASoJGYXcZxnrL+N7mW6SLtQWr1KnW6trTl5Y6k45atWBEO
+7HSWh2w/+Hmm7rNhyR/xnudRx1IvBBz14Y8V60uXE4z18YHgR3e7X8zhvN3lzh1zXqzcPTzKf9ln
+wVBkJQ/HFJjzNJjzhJgt2e48I2bd5cPcWNEUQx/O0mKepNkdc2CmLQ9mf846672/ubmLfoqqN3+C
+C049sWHzZ66P/JnFlh2ezO7F9Gv32bhc0wiTeKtmdEIXzS6I1ZV3q+53diOsobCjMG+lse5dluja
+SjlliFIvPITGfX0sgiUtukTtK5Tgpcx2BkxS9e7IDcPkb1JZJ+kfWO/XunHF3JZScSu7F3O1uBAV
+5afWsbncVNaEXJ7HKKZz0Wf3PGL/ct72LtFpeKzHPzqWJ0d7cpwp9sNF7f6pfv9hxb4r7qHohSdi
+jKNHQe67MnfXfaM3XaXblLqjWqfjpNdZsxveq9ohB06K3V6py70Uy3TU5UKTux26End9VN5ar85S
+u6YWGtqmld0fdbDH5b5CewqP/wX+slUa2CrOPK43E9lrW6WZ9Ripc6xu6MUBpp7pX85qHe3rHD3s
+ahwVe66P1Y16YaN7nM9D9zRHbG7uMbmoZHS3q2JE0K30qlJLL1x06+jXQy9YFMWK5nMgBISzyoTW
+ThvXPAfuZFplKqex8o8p+bO8j/gmgDVrOSsRSF3B5SxuvhVMbPpyLmeFC3/Em0ZJkXFJTb+3aVpy
+Q7JLyGvJp3nW5qLKuO+3CfC4pePjZ+ghyoOsusnuQ0v2dkGZ+PFu+T1l/+WQezoPuR8jtVv0dtvz
+seOPu/5k0bHx++Z/6JHYuxMLGI48YNnxgPnIAzbn5yMecGbJrXv7bdhxg3q02/LObjtZa4/ttM1S
+OxlnLpmwt8M22+uSyXUyqfZ1A7fagben4iLX9pZFIcHliI3acuZqL0VZ7Ec7Hb3KYD92estwVFoe
+uqpzt1NfQjOK+51+TgUL2u7oelY46S4fl0TXVhkhH4+juzy0vOGR8jceiyA+7BTF8+O9kalh98vt
+e46PrkByWan9HocvGHi01j0KIZrOS4ctrjq5h3TfOngzB6DbcO4br1cNdWt5GHrh0eZoDc7Ru65f
+La46mlz48V73vO5KVahVuDKh16WrVNklRbVlB+tVS9cmMpqANas71xCNSEoU9YpYyVbSC/0uCno5
+siGtIfDD14N1LrQuXJ5EWqII6N1Z+c/W9bBitXR6Thv7GM32O/98uuCf6wX/FKbWNIjAwupZncJ9
+79qNUYkCBMetKfe+V7IpDuWRt313rEWxVbNZtSO0jQfXGZ2sPFPRprkixbULPPaijq6XdSrkGMiN
+m111ilPNxjLXoRep2DAc171Y691WotHH1KszRq2KLbe7p3AfK9+4RuNwVqjxaanGdCzYmI+p4POj
+YzkWyNEx7Mo4Psdu9/z7jLvvijym7f/DTkrkXR2My06Akwtgee4YLn78PQrGDLtfNu/spcD+04Ib
+zxzDxw/9Dhfs9qpZbsjb0BHCYRt+6lCjIqq8gdQi/hzx6O0nItam66FvhHqMckfMeyOebfEiPr7p
+PpuLfMPEbFBAh9gfOgwqjqkfp6SY7edkrNbjMR+Pth3DiXxPqsdZHZKTu/t2d+zhOY9CJGeBpLNI
+1eMg17kF/TR81iNrp5+nhnp9EqqbXRvr0tF9AsMFN8FFnawfHyy/MjxXcO7i8RGFC4aPGPQeTNTT
+47Ij5nscumAPanm2F08T77ah7Ta+PZ/wdjuuHfjfC1XJ5rthVwBxq0o270DBx5pkvRTiqY5Q25UP
+uj3VQhx6McStMu58VgoxXJ7nJZnPXROPCzLfDo8rMt9sBZnzDo33uCTzzRGH97gscxp6ZeZyVp35
+hDcO22ePOr7bwHWPYMcBPM7DDhq3R7btIWkRPwib7bZXct6jkR82NDLH0Is7R4Hny7jk+giXfI5N
+3qGROYbOfJ/HJD9FJT+LRn6MSH4Wh9wrTn/U8RSR/D0PLhhb5sxkvt0ZzOcxzcexzKcRzF0hy6dx
+ylNM8kLg8Zl44S4Ydbs79mHW/c9e0O+L0p3Xt3tUr+i8+tQ5J31cAutx9ayj7T6cG/H741Eg4hSO
+eHycKSDD8Z+3zx7vK/r4XsXn3G/wvp9nFbPnVLP27z+GCx/O3+cYvt/XL15wH+B0XtrtyZ17ZHxb
+rkVwuq06fa9M/8SjGyluZ27nk9P5YcfOz/NDOvM22069vlA74lGflu7+cPHup+W7/WRPwJ+nbPDW
+IVI75OcZ7nOH+fSljFN7sLvwmTLtH1Ok/Uf1cl9N+VJrph/xpvZyr9JAZt1rXuh46pRZKRxcZ6or
+yWFb/Hq7jJ3KxbWs93ckk649eoTn8/J+1LtG4p10omlpunzNIlCmtczzmmoroyh1nDbf+n5eK0+W
+nxQpX56k+ul76Wly3Y92y+/lzU/pkjNfn+7j+D19JcrX3XQz8aEbhVHAbt6VsLsLK64XsSs2xFbb
+WLeRwxKum9V5MjfW7e7D10K5vGPGzJbOO5/VzYvsmYedPdpvf7rotX2HXPr+eNHHF95f9MasaV+S
+L2/unW4xO3xROwTtfdzmI1tCBNsKuFtA3eb33OD5vhNnt4mLBpru9tHF65OLP37+R5ff3uJRo4W2
+VrHsnKe5ru4MNopQs6h5khEktu9PZtnAy0jmUopq+NrxTyJU52EsPjmRPJ9dzFj9ie5vHpJob5BG
+beIpz6uLCdRJvLrJQpvIo+WTUlYxZxlrS3N/NXOos9xXc7snG3zXKaDU6ZmM75/sCb4Xh8kXoULZ
+rQjKxmE6pLI9hlbuYvUfis/d7eJxvXz5cgrdd6NhMxRO5sFzNsCm+XdNf3gUc9sXsM2PNPtNi99Q
+7Ruu/bqrvi20vqg0EAj4J/j3uYdx9hV5Nsh76VD3+7NoTgBl7oaOkjlhZO7cKG6xQpWkSqFIoUKB
+jaE7yxa9oe9bsjYXmpzIQ1trGnbYmOpWbaO46q04LC3Z3oOOeY/3/j8GTOrpz5YGWl0NNqBT67Ee
+7P0wPnSBcpZ2tE86Oks52nXd2/fd27KMtvwirfNwTCo6ZRJNR+371ITvlAq0pflsOTqIxNo78pUp
+D1tTPsvOsbfmuz+257uNHdQjdLxpRB6iRd8pWucn4ALbql/wh91dcIadu8L2jrCTG8xOsGHzgR0d
+YOXYB2Rdr4+Or4djtny9lC9/BOCUoeNvTuibE/bmHHnzCHfzHOhmuIsqI4+SD57PLK7vOebTMex/
+6Q3FLh/Le46d+2B45E94Hn59855jlwk76L9zu/bmEZq+3XY79byq+FY3fLM7j/G1qadFo1J2O7Ie
+j51rPHSh+6MzbMu118Tvn+gRZuQcNXLbq870jKWlu3nOJYB49/Epd5pp6nXqW68lEbndXK17iY9+
+4p2n2L7iIJXIksg99/8Is9sgdo9s1aWObZ6ztaAxNJ5RVnSaK6Wql4ViSP70ccMhmjA9NhO73F+X
+K+nK8844/VPeJay0BYtP09ZqlgzEZMptJTghfiJ2Nz9vMu10l9HfXE93Q/c73XFO0v1kCJ8MtR/z
+rt0anUXBkxjd2kuozGK2egwxNjHxdbvjyfb13PmOu0coq7XW8868pztOV/T73BukP+Jd/Z4LamgT
+W5YRvKSoL1MhoSrZV32luON0pnpzxyca67qbaKmqF62DH+l+30sbni8pwzO68NHa7pXlt7ry7ahF
+3J4ZyScT+ayo/BkDcmH5oYdeu2F+ZpYv54Z5hyqcykvsAl4uMe+A19B7aAROYasyv3Xhye70tZfw
+exl/kvI7OT9cjHptnSIf9+HZWmfcnjWHPGtMOux6Q+567RybYeyj8Q9nTUov9QSzaw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ abn0zMFzbA5HaVZ0InDaP7YyHytC54U9UjrRE5sKMOLkpwYF4qaijTtpKhLIqoeWakaaKzV9Z0is
+EaNTgBHyOiWzbrMTPYLmgJOop0YTMYwH9HF1hK6QPFv+pOE9B9arEnd/eHBuqdqMxZeqWqexQl90
+Io8mB+V3CV8A/BVIlYIK3m/5UDGMZYccos8w7ubzMHLeH9DykklAJ6ZHJ4XkkzH0r88EGelELDUb
+o28ypb/g9T3vTBwpuQGx6zW4pKpk3lkys/gt2Uxqk2pCSAAyxJ/ccxkjmDMA5IsVzYGWXEHQ8isO
+bmirHXm7UUeofrYrCp6VK/28NwUJ2KTLhaNuU4EFPbrFKyOBc7w+ny7BwK/+jBgf/5LSVO0Wr15s
+GB0FOUjP0pl2diHv2x2PoBDVtkzYmQSLzq7MhY1b1w6rOVxZwOWf2gglL/qGEFS3FddrL14w1rVx
+vvVUgNDT6P0CH0T3DvhghbtLErAc0RAZsVxcH4meA33Rm2QQptEeRqWmhJmqGwXO4en9YjTsVj4t
+21JHpmOAjE1zrxgIezfe0TnqSuhl5pAgvS62ylGaQuPMma8prHzybGIPBxCPem70AE27MOZGQaNl
+MoBDZjJsC+klrpxkW0hFpCm+QvpQZWIkpbV1jl4CytzUynCSA3pCRys0ysFsqEqTZINa6RbzoRIf
+oGEab3DRYqRYhPzFLfSL3Fccio1lQTMh/aKLxfKhTMVOXoqmULcc94RzsaE3sX8O6imQbsEr0t5b
+1lOk1UH0V9uoP2lmWPeBSzZkQaDeAwz/cfv8qfd1qobbUmJKrVJ9z8wvTiLJX5sRNIm25Q7iC26+
+uNMAeSmpcMhSV6ni24+WrVqLjlqMMGqn4gsEmwLokorFy0C2wRE3Fz6v4JxYFD8RBNka5EwHmA08
+UszvyWjgLHOiUbF/qVo2T6kJeXdV8Mu+6eQJyPCVG6WpcOxr1H+9VPWhPQTtca4CBnX5kpSqpZEO
+VYKD1N1/sV2Bne+XJAIJ4jawHtYltXJM/FyGSp4qfodu4S9a1wEXsBxopatiiFJDyawdquiGY7Ht
+EcCWfm9lkqZqBa+83/QMgYTTjab1SISNnBs7DXpNsBFAdqOY//f7hgZerwsFjxGOHSJHwnpJpykt
+ewguFMyDKEh6XajIdV9QNlcEEvrltIFBoQK1bsuQ2KdIXadWDsASH4AaXa3yhXPDVYd6SM+INBVB
+7Awjwm2fwspKMC8fFpGAEhcIMoNqMYR2BJo6sJwS5q2kpWBI1C8hBwvqJkrfBqUg5Dg96xUo4pYo
+XHfwnLnSqwDnBgfXAp5YZARo5wEV06RuuiiNjAvwofO8kxJQfuZtaZZzm1zUaeC67mVGQD+CjADy
+XsDYFLhRkQX7MvQ3JZdEgGekYA2vjqI1ytfZTkEEACUGcxWEEWfVqzIHrUCQq6RkaOh6zJAgCGsj
+zShfm4rV+IbcpQsvYk7dvx7uoRhPXOAr8sUAX5UfHyJfaU49MEGm9C3yBtKw/eH5eGiWjcK6mWHd
+0Kk+z6mmgnxJsTyT7uOx0QHprFxueFdn95zd+2s1liVRf0cfPeVfaLCclcRFQ3W4ZWyKB6MDHgV0
+QaLOZUKKlCjgD6op/n4Ax8l4i4bsLOxhrxD2muoRgpZe0Ru4kegPGlWtiQAFBCaWwHKE1XcVWJyw
+PV0sWJ7zSiiP2E6SgYvPFKuHGpW5HSbE/FBPm6m7ajolql+d6WB74N/uL67dG0YH61IyQeMDIKkW
+AcothkBAvORaJF8yrfa9J1JRPU8l/7eA0+mWjMsCGCpk4P42Iy+HJoXbJvt5td9NcxgFKfyB5VRO
+wzHY5RzJjkirfKTWBJy3iKM+2+i6IL/Rbo9onhOuXrTLZcxLObPlvqf8Zw52mjTVkIFIuiCeStO7
+2jMH309QpG8NM2U+2smkNd6TF5/ssI6L+27CYc/f0cocyBE9uRUBdhTVYRsOlWNtuSOZG54ottM0
+V3QczwVGkGewPC3nWjkZdtYHmKbJpiK0HYGeKWyoyBlZDa/hbCRoUQhHH/+hBgaCjvIUuAw2pUuL
+h7g4rKVBkaeWppuP25aOZgWT5+qIV5ATT/IyBmkxQHH6eqmCBx59euCE9uiVEG0qdSI6AaGsBR7g
+rJQarQpg15waWEVmw+nYeTygHOorO5Dep2cLmAN2AM5YChlRc8oIxdHRLqAHOUwr2UIhxVIRhv1w
+e6kAU2xCn6OwgfKKZMpakUxhbwOxOfV1phY1hIoEkgYRioUwPmjWuaTEm7mihPrgffi90wG3ildH
+Ii3YBiWi8+rg551dduuUnbhCyWlQYhTj/+2iJWwT0x5rbMEwISUE1/AHR5AHjOhItRndTPS5ClYm
+Tv8zJcCLTl2BIq3l8gUmxRPx1dH1ZbOUclIC5gmAZtlI/TXw0WJJD96UGggAJGl6LSXs8+oUWgL7
+1IdILfHMcMfPr0bHdqDwiDOAFn47DwRXSIp1kpMHtAzcO2DQvDUEHE0+H9Rh3/sKcU06ed6WlEXx
+TSKPSiqqjp9ZeY6ahwuJjhDroaDlI7NvOSK/tcHEiIrKtFh+9opx9WIHrYqWHl8TlYb33VkC/Hm5
+CgVThcUnHlBDfRQ9gJ6mJCe1cLU/nxMX3ErRUHAK1OZZ04NeBnLi1vSUIskGiOgNnOAz8YdZF1YI
+FKFR0bpz5M5l3JrQVyax0rkJY0pnmn3SkgEjDCetywp45T1zIUdwmgrKAaGpCg6wwPDtx1TLDzMm
+fIa6BM9X9a6N9eJ5IqCwQGkONNiuflN5NWFEmuECLhF6p4kzwM7MqKKJH8BKDLsNRqh6agxC95BD
+xzQQLLSfe0qB1qbWzOfW/Ey4+veAe4IbxOGRqqY8cYKRTgBEi+3XUAbUEcriXS2uFS0uQEVMevd8
+bF9wMUSgTAHSaATd8N5M7mFp1E2AQmknfhZPTKK8o3zPNKpFL0351bOdA60fbC+s/THloFpDYoXj
+e1Q/x2tegVn2AOW/LEVtBRFRCyIs1D1t+IGmB2wT9B8HUN2a0hQKAkS2JN/3a1uQGECw9oyc29nU
+CJnP8cSTErbFbjrADaa/u+CkogSAzfy3XdmuntRC2kU9VVsXBpC4cFYV4+AglHREurvXfmUNokPQ
+ouLI5niPeDofQHDpfKg3phardRmVLuh8vIsW/iSyTcGF5nEh0mFmpk6D9g3Msm4nWb8/ellrf+dX
+lWOPpPXyHSNOd2YBzwcOznk+SlrbeimUnAhXn4x4PVAAG9rbQJaX58zr/SJSYZTnIDsLBUuF9Ei6
+Vl9nq8pbojeDjQTlzGpvh9f6py26f9rT/G85RXPMi8Q+G9pW64mGenYCWntRYuY952kOcNOW24rG
+ajTlPZV44YR/aG1dBTK8aghFEkORf/R56yasSTo0V5VSZDMxKDJC0w20xPZSaBnhSLk1Q6yhbPxD
+2E5C3RCRN/VYFmZmhDGL9sQfHG5lviy0arkAIMmp/AUx9GtWr33fyepTtEBWkHRLRvfspnpuh+eM
+qdL+WgmY5OTlms1/SYj8/vkhOOrVkCmrGMsPd1H7jzOIueg5RfOjtF9//U7+lfPgX2YV/X9kzZHs
+p8cBmU25naoxADr8VbSuiwnjGrCvZ9SJiOkrwRUgOmda0X/G0YRlD4VhCher19CitxYDRwh2TbAF
+1TG+ARL3K9nyWkRVOT2aEHTtrKtdxqqlQx+YKYIPpVenlsTUu7lS3NChmEjv7O18o567rjbATSdL
+d/eM0z0H9DkTEN7Ak9ZQS93MWCHHNTpHrOa47Ap4RwCMbEmu/TLA8ENHpfPPZWqp/iqYvWJDiJCy
+Tup7J4OAmYqw+N/98x1/Lh5hx5B9pc40aLV3dcYXYWml6oVzveJPcYOUwYK6zIuNxb6gRNLUD1Kk
+Z+QC8fj6dUWnzoJ55lpVg8IViUwUsFDxK8aaETDHxRR+Jqfg+eAJ6wbjrlXu19uVZdCJ83CrlqCF
+8piQ3har0KbKeS7ICPj/ZwQ2IHEZtf7G7gPWrUjbnoyg9LXvlUqqRg211DdXsqlJRaPNOFMoMQ3+
+YftzbQ+c7+bLNOWJInvFPTJ3apUIkadPGFqfVCSD8UlFFocnpuccZsXEdBqArKkBCNH6eZnppZ8Y
+GuVtAwwnNgR1JjatIdyqkYHFiLxTDGdpaJbSUW8HgIlSysYdL+o6uoRMLbsbIrnLEcQwkFrXZ3le
+ddaQpq756ae0CyeC/JfPr/U7sNHztU+JdRcG1mT0f7/fYi6sKRtTnELVy6+5xelqaYeCf8Mctv0q
+iCH6gWADNd0buMwTkpJJ0q+g3X2fqxYITdMqUM1nFLqTdJqfqjBxxbSQWgIQL5wwi8aV5lpt4kVc
+wTkglM17cEUhAEaueEaMDw3BKEDPfpgLYN/y+ucLoMrZKn2zDqh3QMkAtZ3PADyiMoKaEiO+GtcJ
+VDFT4mvWwi2NUSbEA1IcWIVz4Mbg/GzGFDuK2jnqhE8bpoxQkr8Dlued1Hhsq7V2ofAMQvuSQQB1
+fbcwMWqZsduloqTRDCn7tfGpmJi4R/UonKL7CNGkqli8/N1N+xRUF1CaPr+5uZ8Xvh+DemoJ3Agi
+j/Btzu0+7UpWsY0p6zdsW52VZun6bEID6VmcmNjD8D9hD+NFWoMXrYOtdsAbBcgPplmjRnqhWM4+
+PwfTHxSU2dBUaxjofuCPdf5kkV7jPk87hrV5R7zoizoCuhpw5R+XDNf5yM869+GHHb8Jtgg7cmeL
+0N2PERp9nx+OQ6ibzCxuESBptiOMg2nM1s/cBnVuQONDZ6zuTi//9TwiXJyQzMGfYyABzo1IrIcv
+WOg0NUcoQcdsA4NWbErYvZsUMe51VuTtyN4ofhWwKqg6Iz1Pp44ReicOpEywmP+gH4S4OkGd3wrW
+5PyYMCQHhaQbonO7elEPJF23a/SuQPT+zi5mmZwZd/bc7qY146SL1fh7HXkZddYSGQCOnmcQfiju
+fQim8DVPhJpZVCjuMULJ6BM7o4jtCERDQcLQlOXEhZmPgh6xZbY+AdsY4AI8wymuarxCU9IIxymk
+/CQ8XVTXC22d5i+LNfC+iKFzO1gI3gs/ufC+0tPMIMTzCbUJkOlHIXtQrPb57/oC49I7/fcZWRGo
+u1QBvS4U+84y+JyKVpSwED7c6BpUnYzdFR5Iyb8YMSB4ovZGzawqnU1UB2q/Da+kxNgYyh27iz5U
+QknJx+0BMS3I7t6RqzlKuZDegfo09zCAyfgqhZHRauz0Ou11jjm6h2DCISPzRtBSoUVr5jjmfSNY
+aPkkzn6HiVN/wg0DB0PM4zMEFgjewWO7PxEISx4xHIE7ASO0/yWGg0iuWhvxgLvQjCwUh+TCZbrj
+9kJ8BCFnIlB+AgEYHVRczixBxoWl9Lsfov487LjvPcTo4+JUQJsQ1z9M1wi419CzC+BudcSZ7DO+
+izoQnimJOqsjEMfE3KTtzz1wJm2k+Nru7ylQ9GhBnqWnb12ssR5ZWTmx8ZOno1Hxuw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+OHhWgu0m4WXzxsIxgspBsTiymKSzEnMKXiEu/LVgGwWp888aofCEHYg7u5r4EyXqXMUEiKDzOnjt
+INjVcWcpAiJXo8n0gs3bwoVI1k/XUTFfQxQEOMilsXGLNewrqACvemsV6hBEaCbnAQOIrom2As9n
+cXbNCKpTJrBKTwA1l+sDOdCPB1nvqqidda0gXFsn3LIvOnmPuW/BT4rRnzznAPoCEewovIFrSbtR
+riwPSYj9HRDMUVuFnrHuyCTGK6IQSThsQjjSBCLywHdFw4vy/gsmLoqQ67bY3HujmR+EEC1qcQUv
+AtziNUzu4oFYniNEi7bbBxgAkl6uOSgXhRbZVRb4Ii3RloPqv3UgOKO4Nox8LqLLIaM0LPVuUmbR
+UYMqi0F1hnImAHalNN7RrwgDLL4beDndABfptCyVrFR2u0XjqYRChgwCI66rrLR1DRFR7b2+XkR4
+pBMCooAdH3vCfYROmhFg1AE6O3qEsSMZqcK7xl3nSvsInQub0VRpwE3KNelCCPmCkw3yahIzq3p5
+UxPK4BNg28EEB8PunXNyn+vg3oCh761m9uZffHX05ujg4ujlN/aIW2prb3mDtPjtn04v1m/HA8/O
+dcuLY5p+87ef3xz5XW9tzT8H354c+Wu/ODv85n8f/ey/yc3it18dHZzc8KvfHb/+5suj88Oj04u1
+9rc948vzox+Pj36yR5y8ndj0q7Of3t46bmsvYW99fPR29Q6kOEOaBukssd9be/C3Y+vzfx6/vPi+
+PoakKtX7BIzE8v4f/s+j4+++v7jrBV8cvbr4xlbEH87PTu9s/LezN1faXlkJv3/2q8//1H7z+9OX
+9Zd8znz+5i9np1/aUr6w1by355efH31nd1v74tlf3vBN7988P3/39vvxPr/+y9FPi/phMTS/edYs
+Prf//8dPz5TT8e5ZWHz+5pkKsvW///jZPvwv++P/2aWfFmnx58X/+b/N4iW/+erZHkHUhf7zevkB
+TlFg315whQ9U9dx62X7yYv0+L56d8iq8w1fPAIyE5ybZQU38j2JhcuNJMU7CEiJfhOATuXMgEqlw
+fF+kVLFLKo3LtGnXUdjNWFUy4HriyaLZr5XnNfmkXfzj85t74F1VGXu+1LGvr7QfPIHuavt6ubZf
+fRG7fRksry/fZrx87f5QoZLAeOX+4+Vr9xcVeLx2//Ey7f/u68YW2qVVM2kxhSmLKbx3MVGhTIKv
+3hqU5uW71suEIAlXv6g9y7dcG3/+4ua7bt8iS/vYlGu9UcejaLKHq51sVXqd1i57z+GL9AVQTK1Z
+rIajVdotJvWlIcprawrORm4oc7+/9vh6WY9Hh8R0W13mnVilmXeK2bNQL10ETjwJDO3S5dWEXHkP
+yrMp3r3yHuNlfw98nsN6a+5NWcdAVi96C7Rgly5efo/l5dvfA+V+3DNr71Ev+3tk9P31yz5I2uX6
+C6qdyxcvvcfq8pX3iCsxub4fVpfH27y4chmGyKBlEWXjp/oeQWO01g+/9sWVTvvVDxAIfz89PXh9
+9HKhq4iGRXtdKtx6uoTm/ccLZmJRxSm7ae3wuPbFeAEkiH7tgLnt+urg8Re0f/5rO4SDCUkt1Z4s
+c4AYMinYywuZIGpX9wll430IHTytpbveqK6q6/fKAiZzWNR0270uNxp3ytVm7DpKMZ1+8vWNz7vc
+5ta38sLpDpLe2N32Vpcb3fpWUEoVnghq0G2vdbkR92JFvm+BkaVUzF5/fXWFjV+c3Lxum0vzcnOj
+a3f6/tl/2hr9/56NWuIWLlMBF1AjAstF/55leqlRnS6KvUlmGCdR9QfFmhEmvu1eVw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ DV6UbZnni4Nvp8/xLvg842JyRER9/4/NXICXfvN4QGDvTg+/2j2h8uQW235ZNItPY7n9cV5uj7/c
+wqci3J4/cqKK7CHqoP92fnD69tV0tovtWf0fovBsuxL3gRU6s9/ksfwmPmFbonPPnpPLE6RsvM9P
+TrZgarZlSD5szc5poB/wHo/7Dh9CYfWrz/8Umm9+f/pySWXFpcyVb/5ydvql3UIwP3t++fnRd8en
+6188+8sb3SP5V1///Prbs5Nnv7YpP/tp8eLo1cVvnjWLz+3///ETfxw9e3ftn78+W+W7/ONn+/C/
+7I//Z5d+WoRm8efF//m/zeIld/jK/tOG/bx4/WwvlP22G6J/3tN/x0v+qVkcPvO/lm33rrbwfw+f
+Xb5++UfLm116xpVv9c8Xz55/+2xM13n+vc3lr/9+yoC/XHx3fvDy2DSvRbSjeK/Zb5rQRLPq99vc
+R7uNDcB+apo01IEY//v8u2dt3E99akMbYhi6EvXN3rWre2VIYb/pUtt3izKEfj/F0jVp8fz1s1f2
+Vs+fXxr3f7N/7Q4l9iEPTbH3ybxNm3PIbba3a9vScyU0fexiCaXEtqdN03RdjClka9XFZFdyys3Q
+N+0QQ+7s6XZl6Jqi1ysxW6eafbvFWquy+MfBMw2/TaUNZTO0rT7Z/+2Nn1sG4Qsb9sV45dI39p8v
+nq033ltruVd/vLd+w73L3+7pDn+wafqd3iXWZdWVttdH/b8uhEEf/I6afG80/qHv7D9fPBub24e1
+hvW36/e7fN89/dj/fWHz9W9/f/Z3LaV/vHzWLX79m8U//vP6hV99Exaf2+77prEe/Oob3ei1/zE+
+eO119IKH9vX6W1/qjRqpxaWOX/5+r95l/f3Xmy9vcsr6//wUd7W962rtvdGOj2G/Hfq02IvR/3j9
+LHb7JfSMarfft01YxGF/GOzzsG9bZCjLz8HuX/+2pjajq3/bhq9b7f3xZ7o23tKeEZuyeuz4Hiwl
++y4vom3sxhbxXr/fN7aIl4vtsC5UXRmXmq1kfY90WP1E9+i6xXjLq32VoLhJOnTpN7ZXQjMELdCS
+99tij7Df9/0QrssGu38uJfcpxibqEV27n9vQ55hKarre1noX9mOKdrG1bVsS2yDv20aMtp+bvvS5
+R3YE26JDl3LOpUsIkM72/hBaEwwx2YD9w/apiZycit2n79vY2M9S2S92377tOrse+6kPi+1+yCGY
+/LTf9QsbtH4/xGivW/q+DIvnhw/Ys+f32LN+SPvB1rDdKnfBHtYPtvDykFLpsj2QnlVh/HdbAM1+
+v37sXdncN2wRu7jJJrHmd24T2+0bbhQkyF1bRfLh9s1iMmqj7bImTRal669IlBu1iLT487M9k0mp
+S/0i75fGZs5GsN2P0daQia39LnfRD/QmWkcDT4sdA2gHl71NttdL3WCPXw36YKuyt+6k/WwLxu7C
+eehi0f86lBzJrI96Za8Oa05Bf+vwH3Ir9aRZJPs4FAbapqHJYVFsAlpm0IalFDuWg42Hjoc92zeN
+HakLe9UcB1+CXeBgtAt05lqHD2+VNK6G5DaWIlGT9jubTBM1wU7I9gZRYwpK22uTRFvKNj2mbnTB
+VnaMubNj346CLtpitzVvQmvo0B84FewBnY1D3w5NztqQ9pLWZsjZdkZrG7I3hSG2eRhK39nuR9TY
+7JiEKI1tqBTs2l6ykUc7MR3CtiTDO+1hppi1TbIXTKZ6JBM1zEq2YU221e02iJoH69nz++xZ0+3b
+6w4mlCIdsa72+4OdHLHk9pKk+dU3ZoBdXLIzURnczkD7Xxxi7r87fbl4+/3Bm6PFaxlT/8NamXnw
+zU2KSLysr1/69rYNiSr/jEWNQIq26k0Io3HVK3vsKS7pD/ZK9Ga2V/T34bNhv3RtV/QJOZW0bfJ+
+09qGNmFhw8mFxv/4gjOk6wu/tqGyQ3XR24YqtgruYdvarfoQ673t1jxrCKk+3l6M97HjQ9uWV0TR
+4p2HbjF2mf6U3C+uDsqtm7Zo04ZhGGxNsmmb/aEkTIfS8O/VPWuSNPZ2VPZ2bnaBsbVTrLAf7FJJ
+Hd3Mw36brCd219Z0DB/A1EWT1rGNaUgyLawLduY1TbYViowaehObg52gJr8ZUduzkVVr5yzD0Cad
+zzY0vZkKnR2pXT/1Uak382Gwy7aL7HDpTUaZZhntJLZu2xvbwn64fj2/v341yZQMUwpKG3M/LPTs
+zja49SsNdrisqwbv2192/F7bRKtrE7bRr77ZdCPZab7JVnIFYeJmwtrYaDvR14031GUFYqhibLhD
+ZO1x+to9zG7FTtWY2uYzC83+LvxTlv/6Vf8v2o6J4BeXbvDivUq//e/QqK1O4as7mQFb/x9sLtOo
+bGEubFD2rn9tC84GQqo2b2z784ZbpPf/2GwO/dhW5i99/vMPef6QUVeLPWN9b9x4nP16L5hm1phy
+/5uVl+z5888PD9+9/ursYpk2VY+0u1TvyxOPnb2aen3q+NBE/1iufR6Wc07ry5+Wi+PyY15ojd5P
+5+o6L8211W3SbigxpM7+tZ2DP8cUk2AiylQik4F90pUmoYsgpzInjekVIZnSZKqHKUlhuUMOrm6X
+Th4I7XXrkP1Lv9Cl67+9rvp/1cR/gsfjfib2hpnsqldkfCv9VSejW/urr9+N/9bG4xve/+wEvWLA
+MTp6m14/q3+8eOZulRfP9tb/8K9ueZGw+O3zs7MT6XT5y+N/HZ18eXT+6ujwwn2y//Pg9OXJZb3u
+xtvklWbYfnlwcXF0fvrV0XfHby/O1ZW/VWe0xswsjcQRohXw26+ODk683M2+vXSD4euTY4fDt9H5
+4/nxy/999HO9yftf+venRO9/GFvH6+8Gtvf5xeqtmrUbLtvoLn98d/zSAxJ1AEbxv3KBu/P6Bnf2
+n9+9PT6cPdmzJ3v2ZM+e7GmebFToS0664YqTbljzZA8P5cmWtlHKmkM7lYkO7fJgDm3blp09rzXN
+z92+ttGs/y37cEO3r6k5wSyspdvXJEkOxcyQlUM7NWajtQnJ427f1JscKA0iZzOHdo8116SlQ7uY
+cVqSDfDSof0QPXt+jz2rDm3cV72JwqVDO8TW7Ltc7smhPXWvVIf2e3fLfTu0L+2Y6te+bc/c4Nd+
+7675JX5tO98292vH635tjf26Xzt/BL92utuvHe/ya693+L792jnEwTYCvlZ3/naxTTF1uG6qO5Yp
+TcEuju7YXGxnmZGKm6L6fs0eNp3CFIql77dvu9wOZuaOXu00DCWkxt6vq75fW6txyAP6z9SHyatt
+Go41tM05erW7knEldf3Kq/3x+/X8PvvlPu0mFbtq/Rp92tGUw4AYm53a7tTur3jieilAs1N7dmrP
+Tu0NndpTt9IOOrX/elUjQ3eQdzKZDHaD1R2bQf654qfwmpd7/FDC+id9ZapDSp2O6qZPGQdVsd50
+6CBB/qqy+qOYCW/Snw+9fdCgDPY72994Q5Ni6zYoLCHTN6MEEseKLSN+nBlue6TpL9Fe35Q7grIo
+f1J1omkHJes3tvT5zv5tu16vYpOQZRrGmieBWtQyzINtM35kClFsUOZsfjiZogkg/cZ030SwtUVT
+xtI1oWRHn6SlXbJdLCWGhdbyV8Sm+ad9iZKVGtsojFSL+lKkkOpTlq6lr6J9iFpy1vvB9p99DtJ4
+Bnsn20V839mcHD6zzifOTdtftrPNOrW1ZCenLbKmD/YirXXHFFNuhPlhv0imEpouuLBxzNFuaSOg
+xAYbm5TtTLaWxfY7n+10Zcitw0pBsH/tBE7Sbls7z20QNeJMemECshQ4GTWmtuLhNjtCSudycf3z
+/SZhY4+0raCoh3XdBEw3KeoRNFe2cNBlTO/GeYVFf3MQYfAVY4OfrB3aUSZkcUs0xHSPmJgas5ls
+fibeux9s4QazsoLth9jdEi25l/e+JYryYe9NdMX2a9uWhpN2TVR/3CgBrnZbI03CbAkuQQZ2voSK
+rYtSHfXjd8MYRPCrHG5IXBr3kjtmays2qT2116/+6Gy7Jkmdwf4m3StKzjR9zwWXo3u2cQPHgLUI
+GB2IkUT3aGNmdqzuVpNg9ua2S0v1xNko2m+71OWqahUpLkwZJrftO7ObJVbiUCWcHeeFDcde5Ufd
+KHpsW0eOFkRP07JnbTlZn2xyk42I/TSZNs1PuEJMjLtJ1+av2PeSPNj1Jnn66NLFhqaQj+KfUt23
+9iHYh6gA7lB7ZLIuZ8mTnlnm+y4UTr6M5DGJmVBhrD8RyVOQJ40kTaQ3CZFVmKtD2aJdU825wMBW
+8YmyEJAfxRp0kq8+4NZdFzw2ZLwUc9sydCZTbcUyPKWYkDMtqthb8Qu7gny0KzJz11bVP20dK6ri
+yvkcWtn20MrF0RxZmSMrc2RljqxMiqzIizu6dbHBLrl72YTNA0ZTZPGtoil5ajSlf7BoSkntYFu+
+dMuYQzKdpXTJ9LVNYw6ctbFfxRyyaS9Nt14eUDCCbP+WMebQmXWSO/vhhuUBJgK40TKY0ptZ1HdD
+vwqmPETHnt9jx2owpRsGUx1tvmowpccrk1Po7yeYcuf2sM3/3g3yEQIoq01SAyi3bZMbAijv3Si/
+JICScrt5AKW9FkDx8V4PoLAe7zuA0t4dQAl3BVDWO3zvAZRslm1nFtUy0mAmAo7+IQwbhRpKRwih
+T3EMNSTTCEwHMQNjGULpbRdm24t4/zzUEHvTU7rQMxcbhFDsromdnpchFPlazSpeC6E8QM+e32fP
+CKKYCLTlaI+IyyBKG03RMgNuDqLUIMpwxfM7tPexbecYyhxD+dRiKBN30g6GUC4Zw24E3hhVaRbf
+Kdl/z/0OeVFqQMSMonb8YEvTTl5UPjN47VJUqCGkpvMPuNlLadd/uZdrFYH+eKXn4EYjIrPXyUsv
+8xjPgMbVZiN0qXr/THFpiQ2gwZjFjozAjcZpXq9YR2ySTWE5fDZeavcHvYXcogXvHRssyrHvAQc7
+lKKkqJ2GLU6qoBpXHoqPsGXAs6aRqeVx2QSRIir18/pj66W9sI9XMcnXJ0XMFI9oG25xrb9f2EDo
+sgJHthGJkmigbDjbwc5TjyVlDevY7r31F3u4UAc7bBe1DqPFlT8lIGHKoJm08qjY396V2ysaTE80
+FXIgN8uG9OY4RLdvM2i9iNzr7nv2vZlLpoU2SIt0S/jhl7zlzVGHDd9yyDZH+N37rhnWEzn+7RZf
+6QZqCK6NQJRQjpzsQUHbFL10XTniFSJjJ2HLFen2CIgXijKW0NSMsuLFPFduddfKMUUbj3tdOcHM
+xjx56ZhQC7S38SQedssAdv6Oy5lpI/rdLevHBE20Y7I0RC6m3bfvTYyaptBlUxpvC2H94te9eSF9
+wOv6YhpQ3/t4+YC8TeW8LME/fh3MXqeDoFt0NUIlcV4/EHAhl83EnJZlUOAn5Cb5B8IhpW/Xf7k3
+Vsvoj1eYC4lgDKHlYuc66910iwbPpQlO/LEe57E725HYSJ77IRCwHl1sj6dCCF0M8g==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ mCq1sdu6NWwcXMKyjIqwaV/hMD3YlZo/8hZuZBIQQNmJM3AiU7smwzgr2A/mkw7Igfixs/nkeDaL
+A63J+RI/QXG5jNds18nAXEYh80Z8oWOw8vzdathxVo55Z6XQlR1nhWAQYB4JBoGYsism8gRVPcbW
+QNw9J8mz6Bw23erGCG/PLECjHdRSlq2NH42YCmgndkis9yxJ49G4vVsibDuzyLbPqpSsRLFbhtwW
+78chy5dIyAnKsYsEj3Lu7m054n6eGQjd6P5p+7Gc+1MKVFyBdM7szc4vUAzNL2jNiJFifpt5xSuj
+eFbecQekMj0NmoXbht71hfYrs2DvoNE5JQuELrArv2DW7/ZsD+lOcuBdmWt4bldzROWK6Wcxd5Yl
+X2+9Stpif4XonOiWfNvuCtuW6oquXxqRK8m5khmJg60XsqqlYVG8b9OObzirHhrIucJ874sP4p3j
+9DQkrqIPuX7Qxm6fFceXUJm6QpGgjsRBJXQQNyIwrNFlMMat9LXG/nnM+rYvZ84sO2etvgSzzrnY
+0kbkhDD1Fn7qV8Qc32LnSuTLHXVlck92awNj367PWf7hsp7NxfRIPn9wdKnbGNqLgsxWSqWuhxTc
+3n4gfl/js8Uw1gLMDHVVnD1oNtTLo2S72mZqYyTKB1eZt0vQltFczFDkbVtvvu5CxtFhbtY8PYGM
+nd28ETzvZG8P14vpt+BL2V44QFaJe/kxq/ZiFrSl5ces2ouZ633Hj1m1F+MLefkxq/ZifCEvP2Zh
+qd/88twNftHiMnbLT23oXBumNs5q5JVht17IrSXJK8RuvZBbik2vFLv1Qm59oVVjt17IrR3XXR12
+64Xc+kKrxm69kFva+yvFbr2ii+Qtq8VuvZBbEqNeLXbrhdwS7GC12O13sIOfY7deyC2PHawGu/0i
+dvBL7NYLuf02dvApdvs5drAK7NYrYg7zyhVjtx+i+SvDbr2Q2x/K2AfY7Vdl7HfYrRdy+30Z+wy7
+/YKMrQC7fQ+fWi12+7GMrQq79eLDF/Gpb2C376H5q8VuvYwIw6ZXid16Ibfvofk/x269RsaHaP6P
+sFsv5PZDi/wj7PY7a9J+jt16Ibfz2nIV2O0XteUvsVsv5NbTT/4VduuF3DoaZmXYrRdyO6+TV4Hd
+eiG3tp+8OuzWAsrmkFtfaNXYrRdyy1aJ/xy7ddGkhXXeLvqY3olxOxFueWQpnXUB1VseD0uXknzI
+4J1NNAtbaOAt/8QmmoUtNEQn/wObaBa20HAcW+UmmoUtNKT3/4FNNAtbaFzUeKWbaBa20JB++Qc2
+0SxsoXFG5Wo30SxsobHR/BVvolmoDbTl+5toyCTc3fRAY0GWzrLA74gd5DwdOXhurR+zt/vdTZim
+6q2dbjiaamIrF4F9Mtfaq6bIERb/ZFE/JRXDxeAzUXrFuBsshScuEdNjdGvxHjnzVaAIOC7cCeQU
+vGLynWMTisgBFza4ozfSyh+2PsddkkIXpFhrbBZXo7B7VSww3MjZpTKn0crIjlEuIkiqbO9SidLt
+OdY+FGj6zb7V8aDH2D0GkxHtRXUWMOuZhVKLiTxm4JFL20WQnG2k/0n7wLIQiPb+YNjh4VlfKAR3
+KuZ09koKKPcZs9sblpt/m2Mf9rM/BH/kVzP8WNT9oqJAQiF3yy1f+GTYGw0rT82xGfGXhz7k3z/w
+he6T++NprteeQl5z/Lc/RW7VjsrVUs6f8s89s+UPQ8XQPTwAuRECD99jfzIzGg1ITiV/5T/49+to
+PPXTWvkvRv5spfJ5ucvepNcamHPlgQn3pIbwf+0vcmH6ZvDPiQ/5kdVM8ldr+pDVbij4NyQO4eIZ
+bv3lx8h/5L++Rf4OIXLuS0gqEnRJkURRU1VF1v2SiA1B1rGINUM2VNH/4lVIlrCgKLqKkSJqmuxP
+QKagKZphYFGUFCihImmOTEKT5QUii0XavoSuqIIBSV3TkaJi7EHHUDRBN0SkK7KKoQZ+SVEUQYaK
+GEjEigiVwUjUBWRoIpBTNKxBfTVd0KDSOtJlBEWy8CpDg1uGouqSJiJSSJJ1QTIUIKEYpFAZCqlY
+QCqwBMmyKEkiFDKwoKu6LMoGENP8CR2pAtYkWdGgbXABL1vgoEfTF4tA01VJFiQNioGEYg0pHnSU
+JTqSaAiGpENlsPFOkcX+zJJXiZ8UgqbL0BXzhZAsLRYS9c/Ep/wVGSv7HmG87r/6kKBBFxoaVkUo
+D6wlgiwA00XVQBrWgb+GTu4ouqhgCYEgytB95A5SdB1ETzRkjDUN7iAFQRfBoxj6WJU8ysBISYif
+8uLFo5BoSCpUFcuiCoKHgPGyKoKkKIqEQDoMBftFDWmfiMFSERADkF1NAKJAW1VlrHjQweJc1yge
+tVkqstQq8qqlQgoSBeArAsbJmij6l2sjaTDyPxHuxSLwqiXuLNNZ7oil2nzeV20QJG/1/UkakwGf
+PDeboI6bvVTqYDDovU7MVKpo9rpPU0thv1foqteZPrEyUFNQjRgUmAgCKOme5bNgu8xx3TEDpeF0
+oURp2Jv2moOzWbMzbg6t9yNPYuejaZM0ZX/YHZgLlmX+rYNRu/9Xb2J+RO20Z1amzfGUo6ZhA1Sc
+KquaBjpQVj5oUu0T0mCtOcJbrEC59y8TzOkrKdIcN18mLJd/OOJPVoc9sgCrMh33ht2lB4vNYWdg
+jo+bL+/Qnjehr8s28/+m8P+m8H/EFCYweKofq+8Xr0KIWArQOWA7NSwbREBAhrAIb5IQaF3NL0L5
+z4zSYpE245JqYKyABtBkXfWgo8Aw0DSQMqgEFiVSRJdgYEBFiFwZBjGRMFI0SVIMXVMMUQK7BeyA
+lkE3g2WGItAhCggVmGykgQ+AEWG1gQRFJW8H4wFlgIsqNFwF8YXHwCtQNdIfGki5jDAyMAixPwGv
+FGTwI3Qdgf2Ad0noc1FcLEJHoSKIhgj/GToGX8KDjrFEB2ohwKiBIaka7xTxEEV9Sco8BAijOYFV
+yChUlgqBSvhYfMpfkbHye8Y0LAkYnAFDArVs6+NMZr8NkzLbGHHqtuoz/OGIv3blK2fYLA2sAJ3l
+JBIwgTttds2LcbMH2tvXnTT/ZfqbwyGhYr5Cjr87NifT0dj0T55Gf5E78IhdHGZ/J3nffwFO02W8
+ ]]>
+</i:pgf>
+</svg>
diff --git a/desktop/install/ppa_release.sh b/desktop/install/ppa_release.sh
new file mode 100755
index 00000000..cb1a4cdb
--- /dev/null
+++ b/desktop/install/ppa_release.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# This script pushes updates to my Ubuntu PPA: https://launchpad.net/~micahflee/+archive/ppa
+# If you want to use it, you'll need your own ~/.dput.cf and ssh key.
+# More info: https://help.launchpad.net/Packaging/PPA/Uploading
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
+cd $DIR
+
+VERSION=`cat share/version.txt`
+
+rm -rf deb_dist >/dev/null 2>&1
+python3 setup.py --command-packages=stdeb.command sdist_dsc
+cd deb_dist/onionshare-$VERSION
+dpkg-buildpackage -S
+cd ..
+dput ppa:micahflee/ppa onionshare_$VERSION-1_source.changes
+cd ..
diff --git a/desktop/install/pyinstaller.spec b/desktop/install/pyinstaller.spec
new file mode 100644
index 00000000..24c0ed07
--- /dev/null
+++ b/desktop/install/pyinstaller.spec
@@ -0,0 +1,116 @@
+# -*- mode: python -*-
+
+import os
+import platform
+from distutils.sysconfig import get_python_lib
+
+p = platform.system()
+
+version = open("share/version.txt").read().strip()
+
+paths = ["."]
+if p == "Windows":
+ paths.append(os.path.join(get_python_lib(), "PyQt5", "Qt", "bin"))
+ paths.append(
+ os.path.join(
+ os.path.abspath(os.sep),
+ "Program Files (x86)",
+ "Windows Kits",
+ "10",
+ "bin",
+ "x86",
+ )
+ )
+ paths.append(
+ os.path.join(
+ os.path.abspath(os.sep),
+ "Program Files (x86)",
+ "Windows Kits",
+ "10",
+ "bin",
+ "x64",
+ )
+ )
+ paths.append(
+ os.path.join(
+ os.path.abspath(os.sep),
+ "Program Files (x86)",
+ "Windows Kits",
+ "10",
+ "Redist",
+ "ucrt",
+ "DLLs",
+ "x86",
+ )
+ )
+ paths.append(
+ os.path.join(
+ os.path.abspath(os.sep),
+ "Program Files (x86)",
+ "Windows Kits",
+ "10",
+ "Redist",
+ "ucrt",
+ "DLLs",
+ "x64",
+ )
+ )
+
+a = Analysis(
+ ["scripts/onionshare-pyinstaller"],
+ pathex=paths,
+ binaries=None,
+ datas=[
+ ("../share/version.txt", "share"),
+ ("../share/wordlist.txt", "share"),
+ ("../share/torrc_template", "share"),
+ ("../share/torrc_template-obfs4", "share"),
+ ("../share/torrc_template-meek_lite_azure", "share"),
+ ("../share/images/*", "share/images"),
+ ("../share/locale/*", "share/locale"),
+ ("../share/static/*", "share/static"),
+ ("../share/templates/*", "share/templates"),
+ ("../share/static/css/*", "share/static/css"),
+ ("../share/static/img/*", "share/static/img"),
+ ("../share/static/js/*", "share/static/js"),
+ ("../install/licenses/*", "licenses"),
+ ],
+ hiddenimports=["engineio.async_drivers.threading"],
+ hookspath=[],
+ runtime_hooks=[],
+ win_no_prefer_redirects=False,
+ win_private_assemblies=False,
+ cipher=None,
+)
+
+pyz = PYZ(a.pure, a.zipped_data, cipher=None)
+
+# Show console in dev releases, don't show console in production releases
+console = "dev" in version
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ exclude_binaries=True,
+ name="onionshare-gui",
+ debug=False,
+ strip=False,
+ upx=True,
+ console=console,
+)
+
+coll = COLLECT(
+ exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name="onionshare"
+)
+
+if p == "Darwin":
+ app = BUNDLE(
+ coll,
+ name="OnionShare.app",
+ icon="onionshare.icns",
+ bundle_identifier="com.micahflee.onionshare",
+ info_plist={
+ "CFBundleShortVersionString": version,
+ "NSHighResolutionCapable": "True",
+ },
+ )
diff --git a/desktop/install/scripts/onionshare b/desktop/install/scripts/onionshare
new file mode 100755
index 00000000..67298b6f
--- /dev/null
+++ b/desktop/install/scripts/onionshare
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import onionshare
+
+onionshare.main()
diff --git a/desktop/install/scripts/onionshare-gui b/desktop/install/scripts/onionshare-gui
new file mode 100755
index 00000000..f1d36a86
--- /dev/null
+++ b/desktop/install/scripts/onionshare-gui
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import onionshare_gui
+
+onionshare_gui.main()
diff --git a/desktop/install/scripts/onionshare-nautilus.py b/desktop/install/scripts/onionshare-nautilus.py
new file mode 100644
index 00000000..776ca5de
--- /dev/null
+++ b/desktop/install/scripts/onionshare-nautilus.py
@@ -0,0 +1,105 @@
+import os
+import sys
+import json
+import locale
+import subprocess
+try:
+ import urllib.request
+except:
+ import urllib
+import gi
+
+gi.require_version("Nautilus", "3.0")
+
+from gi.repository import Nautilus
+from gi.repository import GObject
+
+# Put me in /usr/share/nautilus-python/extensions/
+class OnionShareExtension(GObject.GObject, Nautilus.MenuProvider):
+ def __init__(self):
+ # Get the localized string for "Share via OnionShare" label
+ self.label = None
+ default_label = "Share via OnionShare"
+
+ try:
+ # Re-implement localization in python2
+ default_locale = "en"
+ locale_dir = os.path.join(sys.prefix, "share/onionshare/locale")
+ if os.path.exists(locale_dir):
+ # Load all translations
+ strings = {}
+ translations = {}
+ for filename in os.listdir(locale_dir):
+ abs_filename = os.path.join(locale_dir, filename)
+ lang, ext = os.path.splitext(filename)
+ if ext == ".json":
+ with open(abs_filename) as f:
+ translations[lang] = json.load(f)
+
+ strings = translations[default_locale]
+ lc, enc = locale.getdefaultlocale()
+ if lc:
+ lang = lc[:2]
+ if lang in translations:
+ # if a string doesn't exist, fallback to English
+ for key in translations[default_locale]:
+ if key in translations[lang]:
+ strings[key] = translations[lang][key]
+
+ self.label = strings["share_via_onionshare"]
+
+ except:
+ self.label = default_label
+
+ if not self.label:
+ self.label = default_label
+
+ """
+ # This more elegant solution will only work if nautilus is using python3, and onionshare is installed system-wide.
+ # But nautilus is using python2, so this is commented out.
+ try:
+ import onionshare
+ onionshare.strings.load_strings(onionshare.common)
+ self.label = onionshare.strings._('share_via_onionshare')
+ except:
+ import sys
+ print('python version: {}').format(sys.version)
+ self.label = 'Share via OnionShare'
+ """
+
+ def url2path(self, url):
+ file_uri = url.get_activation_uri()
+ arg_uri = file_uri[7:]
+ try:
+ path = urllib.request.url2pathname(arg_uri)
+ except:
+ path = urllib.url2pathname(arg_uri)
+ return path
+
+ def exec_onionshare(self, filenames):
+ # Would prefer this method but there is a conflict between GTK 2.0 vs GTK 3.0 components being loaded at once
+ # (nautilus:3090): Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
+ # sys.argv = ["", "--filenames"] + filenames
+ # sys.exit(onionshare_gui.main())
+ path = os.path.join(os.sep, "usr", "bin", "onionshare-gui")
+ cmd = [path, "--filenames"] + filenames
+ subprocess.Popen(cmd)
+
+ def get_file_items(self, window, files):
+ menuitem = Nautilus.MenuItem(
+ name="OnionShare::Nautilus", label=self.label, tip="", icon=""
+ )
+ menu = Nautilus.Menu()
+ menu.append_item(menuitem)
+ menuitem.connect("activate", self.menu_activate_cb, files)
+ return (menuitem,)
+
+ def menu_activate_cb(self, menu, files):
+ file_list = []
+ for file in files:
+ file_list.append(self.url2path(file))
+ self.exec_onionshare(file_list)
+
+ # Workaround https://bugzilla.gnome.org/show_bug.cgi?id=784278
+ def get_background_items(self, window, file):
+ return None
diff --git a/desktop/install/scripts/onionshare-pyinstaller b/desktop/install/scripts/onionshare-pyinstaller
new file mode 100644
index 00000000..8ca791aa
--- /dev/null
+++ b/desktop/install/scripts/onionshare-pyinstaller
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import sys, os, platform
+
+# In macOS, allow both CLI and GUI depending on the filename of the binary
+# being executed
+if platform.system() == "Darwin":
+ # If the binary being executed is called 'onionshare', use CLI
+ basename = os.path.basename(sys.argv[0])
+ if basename == "onionshare":
+ import onionshare
+
+ onionshare.main()
+
+ # Otherwise, use GUI
+ else:
+ import onionshare_gui
+
+ onionshare_gui.main()
+
+# Unfortunately this trick won't work in Windows because I want to set
+# console=False in the PyInstaller spec file, so there isn't a command prompt
+# open in the background every you run the GUI. Hopefully Windows can get
+# a built-in CLI when PyInstaller 3.3 comes out:
+# https://pyinstaller.readthedocs.io/en/stable/spec-files.html#multipackage-bundles
+else:
+ import onionshare_gui
+
+ onionshare_gui.main()
diff --git a/desktop/onionshare/__init__.py b/desktop/onionshare/__init__.py
new file mode 100644
index 00000000..c1367b1e
--- /dev/null
+++ b/desktop/onionshare/__init__.py
@@ -0,0 +1,514 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os, sys, time, argparse, threading
+from datetime import datetime
+from datetime import timedelta
+
+from .common import Common
+from .web import Web
+from .onion import *
+from .onionshare import OnionShare
+from .mode_settings import ModeSettings
+
+
+def build_url(mode_settings, app, web):
+ # Build the URL
+ if mode_settings.get("general", "public"):
+ return f"http://{app.onion_host}"
+ else:
+ return f"http://onionshare:{web.password}@{app.onion_host}"
+
+
+def main(cwd=None):
+ """
+ The main() function implements all of the logic that the command-line version of
+ onionshare uses.
+ """
+ common = Common()
+
+ # Display OnionShare banner
+ print(f"OnionShare {common.version} | https://onionshare.org/")
+ reset = "\033[0m"
+ purple = "\33[95m"
+ print(purple)
+ print(" @@@@@@@@@ ")
+ print(" @@@@@@@@@@@@@@@@@@@ ")
+ print(" @@@@@@@@@@@@@@@@@@@@@@@@@ ")
+ print(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ")
+ print(
+ " @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ___ _ "
+ )
+ print(
+ " @@@@@@ @@@@@@@@@@@@@ / _ \ (_) "
+ )
+ print(
+ " @@@@ @ @@@@@@@@@@@ | | | |_ __ _ ___ _ __ "
+ )
+ print(
+ " @@@@@@@@ @@@@@@@@@@ | | | | '_ \| |/ _ \| '_ \ "
+ )
+ print(
+ " @@@@@@@@@@@@ @@@@@@@@@@ \ \_/ / | | | | (_) | | | | "
+ )
+ print(
+ " @@@@@@@@@@@@@@@@ @@@@@@@@@ \___/|_| |_|_|\___/|_| |_| "
+ )
+ print(
+ " @@@@@@@@@ @@@@@@@@@@@@@@@@ _____ _ "
+ )
+ print(
+ " @@@@@@@@@@ @@@@@@@@@@@@ / ___| | "
+ )
+ print(
+ " @@@@@@@@@@ @@@@@@@@ \ `--.| |__ __ _ _ __ ___ "
+ )
+ print(
+ " @@@@@@@@@@@ @ @@@@ `--. \ '_ \ / _` | '__/ _ \\"
+ )
+ print(
+ " @@@@@@@@@@@@@ @@@@@@ /\__/ / | | | (_| | | | __/"
+ )
+ print(
+ " @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \____/|_| |_|\__,_|_| \___|"
+ )
+ print(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ")
+ print(" @@@@@@@@@@@@@@@@@@@@@@@@@ ")
+ print(" @@@@@@@@@@@@@@@@@@@ ")
+ print(" @@@@@@@@@ ")
+ print(reset)
+
+ # OnionShare CLI in OSX needs to change current working directory (#132)
+ if common.platform == "Darwin":
+ if cwd:
+ os.chdir(cwd)
+
+ # Parse arguments
+ parser = argparse.ArgumentParser(
+ formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=28)
+ )
+ # Select modes
+ parser.add_argument(
+ "--receive", action="store_true", dest="receive", help="Receive files"
+ )
+ parser.add_argument(
+ "--website", action="store_true", dest="website", help="Publish website"
+ )
+ parser.add_argument(
+ "--chat", action="store_true", dest="chat", help="Start chat server"
+ )
+ # Tor connection-related args
+ parser.add_argument(
+ "--local-only",
+ action="store_true",
+ dest="local_only",
+ default=False,
+ help="Don't use Tor (only for development)",
+ )
+ parser.add_argument(
+ "--connect-timeout",
+ metavar="SECONDS",
+ dest="connect_timeout",
+ default=120,
+ help="Give up connecting to Tor after a given amount of seconds (default: 120)",
+ )
+ parser.add_argument(
+ "--config",
+ metavar="FILENAME",
+ default=None,
+ help="Filename of custom global settings",
+ )
+ # Persistent file
+ parser.add_argument(
+ "--persistent",
+ metavar="FILENAME",
+ default=None,
+ help="Filename of persistent session",
+ )
+ # General args
+ parser.add_argument(
+ "--public",
+ action="store_true",
+ dest="public",
+ default=False,
+ help="Don't use a password",
+ )
+ parser.add_argument(
+ "--auto-start-timer",
+ metavar="SECONDS",
+ dest="autostart_timer",
+ default=0,
+ help="Start onion service at scheduled time (N seconds from now)",
+ )
+ parser.add_argument(
+ "--auto-stop-timer",
+ metavar="SECONDS",
+ dest="autostop_timer",
+ default=0,
+ help="Stop onion service at schedule time (N seconds from now)",
+ )
+ parser.add_argument(
+ "--legacy",
+ action="store_true",
+ dest="legacy",
+ default=False,
+ help="Use legacy address (v2 onion service, not recommended)",
+ )
+ parser.add_argument(
+ "--client-auth",
+ action="store_true",
+ dest="client_auth",
+ default=False,
+ help="Use client authorization (requires --legacy)",
+ )
+ # Share args
+ parser.add_argument(
+ "--autostop-sharing",
+ action="store_true",
+ dest="autostop_sharing",
+ default=True,
+ help="Share files: Stop sharing after files have been sent",
+ )
+ # Receive args
+ parser.add_argument(
+ "--data-dir",
+ metavar="data_dir",
+ default=None,
+ help="Receive files: Save files received to this directory",
+ )
+ # Website args
+ parser.add_argument(
+ "--disable_csp",
+ action="store_true",
+ dest="disable_csp",
+ default=False,
+ help="Publish website: Disable Content Security Policy header (allows your website to use third-party resources)",
+ )
+ # Other
+ 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
+ for i in range(len(filenames)):
+ filenames[i] = os.path.abspath(filenames[i])
+
+ receive = bool(args.receive)
+ website = bool(args.website)
+ chat = bool(args.chat)
+ local_only = bool(args.local_only)
+ connect_timeout = int(args.connect_timeout)
+ config_filename = args.config
+ persistent_filename = args.persistent
+ public = bool(args.public)
+ autostart_timer = int(args.autostart_timer)
+ autostop_timer = int(args.autostop_timer)
+ legacy = bool(args.legacy)
+ client_auth = bool(args.client_auth)
+ autostop_sharing = bool(args.autostop_sharing)
+ data_dir = args.data_dir
+ disable_csp = bool(args.disable_csp)
+ verbose = bool(args.verbose)
+
+ if receive:
+ mode = "receive"
+ elif website:
+ mode = "website"
+ elif chat:
+ mode = "chat"
+ else:
+ mode = "share"
+
+ # Verbose mode?
+ common.verbose = verbose
+
+ # client_auth can only be set if legacy is also set
+ if client_auth and not legacy:
+ print(
+ "Client authentication (--client-auth) is only supported with with legacy onion services (--legacy)"
+ )
+ sys.exit()
+
+ # Re-load settings, if a custom config was passed in
+ if config_filename:
+ common.load_settings(config_filename)
+ else:
+ common.load_settings()
+
+ # Mode settings
+ if persistent_filename:
+ mode_settings = ModeSettings(common, persistent_filename)
+ mode_settings.set("persistent", "enabled", True)
+ else:
+ mode_settings = ModeSettings(common)
+
+ if mode_settings.just_created:
+ # This means the mode settings were just created, not loaded from disk
+ mode_settings.set("general", "public", public)
+ mode_settings.set("general", "autostart_timer", autostart_timer)
+ mode_settings.set("general", "autostop_timer", autostop_timer)
+ mode_settings.set("general", "legacy", legacy)
+ mode_settings.set("general", "client_auth", client_auth)
+ if mode == "share":
+ mode_settings.set("share", "autostop_sharing", autostop_sharing)
+ if mode == "receive":
+ if data_dir:
+ mode_settings.set("receive", "data_dir", data_dir)
+ if mode == "website":
+ mode_settings.set("website", "disable_csp", disable_csp)
+ else:
+ # See what the persistent mode was
+ mode = mode_settings.get("persistent", "mode")
+
+ # In share and website mode, you must supply a list of filenames
+ if mode == "share" or mode == "website":
+ # Unless you passed in a persistent filename, in which case get the filenames from
+ # the mode settings
+ if persistent_filename and not mode_settings.just_created:
+ filenames = mode_settings.get(mode, "filenames")
+
+ else:
+ # Make sure filenames given if not using receiver mode
+ if len(filenames) == 0:
+ if persistent_filename:
+ mode_settings.delete()
+
+ parser.print_help()
+ sys.exit()
+
+ # Validate filenames
+ valid = True
+ for filename in filenames:
+ if not os.path.isfile(filename) and not os.path.isdir(filename):
+ print(f"{filename} is not a valid file.")
+ valid = False
+ if not os.access(filename, os.R_OK):
+ print(f"{filename} is not a readable file.")
+ valid = False
+ if not valid:
+ sys.exit()
+
+ # Create the Web object
+ web = Web(common, False, mode_settings, mode)
+
+ # Start the Onion object
+ onion = Onion(common, use_tmp_dir=True)
+ try:
+ onion.connect(
+ custom_settings=False,
+ config=config_filename,
+ connect_timeout=connect_timeout,
+ local_only=local_only,
+ )
+ except KeyboardInterrupt:
+ print("")
+ sys.exit()
+ except Exception as e:
+ sys.exit(e.args[0])
+
+ # Start the onionshare app
+ try:
+ common.settings.load()
+ if not mode_settings.get("general", "public"):
+ web.generate_password(mode_settings.get("onion", "password"))
+ else:
+ web.password = None
+ app = OnionShare(common, onion, local_only, autostop_timer)
+ app.choose_port()
+
+ # 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 autostop_timer > 0 and 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(mode_settings, False, True)
+ url = build_url(mode_settings, app, web)
+ schedule = datetime.now() + timedelta(seconds=autostart_timer)
+ if mode == "receive":
+ print(
+ f"Files sent to you appear in this folder: {mode_settings.get('receive', '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 mode_settings.get("general", "client_auth"):
+ print(
+ f"Give this address and HidServAuth lineto your sender, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
+ )
+ print(app.auth_string)
+ else:
+ print(
+ f"Give this address to your sender, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
+ )
+ else:
+ if mode_settings.get("general", "client_auth"):
+ print(
+ f"Give this address and HidServAuth line to your recipient, and tell them it won't be accessible until: {schedule.strftime('%I:%M:%S%p, %b %d, %y')}"
+ )
+ print(app.auth_string)
+ else:
+ print(
+ f"Give this address to your recipient, and tell them it won't be accessible until: {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(mode_settings)
+ else:
+ app.start_onion_service(mode_settings)
+ except KeyboardInterrupt:
+ print("")
+ sys.exit()
+ except (TorTooOld, TorErrorProtocolError) as e:
+ print("")
+ print(e.args[0])
+ sys.exit()
+
+ if mode == "website":
+ # Prepare files to share
+ try:
+ web.website_mode.set_file_info(filenames)
+ except OSError as e:
+ print(e.strerror)
+ sys.exit(1)
+
+ if mode == "share":
+ # Prepare files to share
+ print("Compressing files.")
+ try:
+ web.share_mode.set_file_info(filenames)
+ app.cleanup_filenames += web.share_mode.cleanup_filenames
+ except OSError as e:
+ print(e.strerror)
+ sys.exit(1)
+
+ # Warn about sending large files over Tor
+ if web.share_mode.download_filesize >= 157286400: # 150mb
+ print("")
+ 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,))
+ t.daemon = True
+ t.start()
+
+ try: # Trap Ctrl-C
+ # Wait for web.generate_password() to finish running
+ time.sleep(0.2)
+
+ # start auto-stop timer thread
+ if app.autostop_timer > 0:
+ app.autostop_timer_thread.start()
+
+ # Save the web password if we are using a persistent private key
+ if mode_settings.get("persistent", "enabled"):
+ if not mode_settings.get("onion", "password"):
+ mode_settings.set("onion", "password", web.password)
+ # mode_settings.save()
+
+ # Build the URL
+ url = build_url(mode_settings, app, web)
+
+ print("")
+ if autostart_timer > 0:
+ print("Server started")
+ else:
+ if mode == "receive":
+ print(
+ f"Files sent to you appear in this folder: {mode_settings.get('receive', '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 mode_settings.get("general", "client_auth"):
+ 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:
+ if mode_settings.get("general", "client_auth"):
+ 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("Press Ctrl+C to stop the server")
+
+ # Wait for app to close
+ while t.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" or (mode == "website"):
+ # If there were no attempts to download the share, or all downloads are done, we can stop
+ if web.share_mode.cur_history_id == 0 or web.done:
+ print("Stopped because auto-stop timer ran out")
+ web.stop(app.port)
+ break
+ if mode == "receive":
+ if (
+ web.receive_mode.cur_history_id == 0
+ or not web.receive_mode.uploads_in_progress
+ ):
+ print("Stopped because auto-stop timer ran out")
+ web.stop(app.port)
+ break
+ else:
+ web.receive_mode.can_upload = False
+ # Allow KeyboardInterrupt exception to be handled with threads
+ # https://stackoverflow.com/questions/3788208/python-threading-ignores-keyboardinterrupt-exception
+ time.sleep(0.2)
+ except KeyboardInterrupt:
+ web.stop(app.port)
+ finally:
+ # Shutdown
+ app.cleanup()
+ onion.cleanup()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/desktop/onionshare/common.py b/desktop/onionshare/common.py
new file mode 100644
index 00000000..27104669
--- /dev/null
+++ b/desktop/onionshare/common.py
@@ -0,0 +1,336 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import base64
+import hashlib
+import inspect
+import os
+import platform
+import random
+import socket
+import sys
+import tempfile
+import threading
+import time
+import shutil
+
+from .settings import Settings
+
+
+class Common:
+ """
+ The Common object is shared amongst all parts of OnionShare.
+ """
+
+ def __init__(self, verbose=False):
+ self.verbose = verbose
+
+ # The platform OnionShare is running on
+ self.platform = platform.system()
+ if self.platform.endswith("BSD") or self.platform == "DragonFly":
+ self.platform = "BSD"
+
+ # The current version of OnionShare
+ with open(self.get_resource_path("version.txt")) as f:
+ self.version = f.read().strip()
+
+ def load_settings(self, config=None):
+ """
+ Loading settings, optionally from a custom config json file.
+ """
+ self.settings = Settings(self, config)
+ self.settings.load()
+
+ def log(self, module, func, msg=None):
+ """
+ If verbose mode is on, log error messages to stdout
+ """
+ if self.verbose:
+ timestamp = time.strftime("%b %d %Y %X")
+
+ final_msg = f"[{timestamp}] {module}.{func}"
+ if msg:
+ final_msg = f"{final_msg}: {msg}"
+ print(final_msg)
+
+ def get_resource_path(self, filename):
+ """
+ Returns the absolute path of a resource, regardless of whether OnionShare is installed
+ systemwide, and whether regardless of platform
+ """
+ # On Windows, and in Windows dev mode, switch slashes in incoming filename to backslackes
+ if self.platform == "Windows":
+ filename = filename.replace("/", "\\")
+
+ if getattr(sys, "onionshare_dev_mode", False):
+ # Look for resources directory relative to python file
+ prefix = os.path.join(
+ os.path.dirname(
+ os.path.dirname(
+ os.path.abspath(inspect.getfile(inspect.currentframe()))
+ )
+ ),
+ "share",
+ )
+ if not os.path.exists(prefix):
+ # While running tests during stdeb bdist_deb, look 3 directories up for the share folder
+ prefix = os.path.join(
+ os.path.dirname(
+ os.path.dirname(os.path.dirname(os.path.dirname(prefix)))
+ ),
+ "share",
+ )
+
+ elif self.platform == "BSD" or self.platform == "Linux":
+ # Look for resources relative to the binary, so if the binary is /usr/bin/onionshare-gui and
+ # the resource dir is /usr/share/onionshare, then the resource dir relative to the binary dir
+ # is ../share/onionshare
+ prefix = os.path.join(
+ os.path.dirname(os.path.dirname(sys.argv[0])), "share/onionshare"
+ )
+
+ elif getattr(sys, "frozen", False):
+ # Check if app is "frozen"
+ # https://pythonhosted.org/PyInstaller/#run-time-information
+ if self.platform == "Darwin":
+ prefix = os.path.join(sys._MEIPASS, "share")
+ elif self.platform == "Windows":
+ prefix = os.path.join(os.path.dirname(sys.executable), "share")
+
+ return os.path.join(prefix, filename)
+
+ def get_tor_paths(self):
+ if self.platform == "Linux":
+ tor_path = shutil.which("tor")
+ obfs4proxy_file_path = shutil.which("obfs4proxy")
+ prefix = os.path.dirname(os.path.dirname(tor_path))
+ tor_geo_ip_file_path = os.path.join(prefix, "share/tor/geoip")
+ tor_geo_ipv6_file_path = os.path.join(prefix, "share/tor/geoip6")
+ elif self.platform == "Windows":
+ base_path = os.path.join(
+ os.path.dirname(os.path.dirname(self.get_resource_path(""))), "tor"
+ )
+ tor_path = os.path.join(os.path.join(base_path, "Tor"), "tor.exe")
+ obfs4proxy_file_path = os.path.join(
+ os.path.join(base_path, "Tor"), "obfs4proxy.exe"
+ )
+ tor_geo_ip_file_path = os.path.join(
+ os.path.join(os.path.join(base_path, "Data"), "Tor"), "geoip"
+ )
+ tor_geo_ipv6_file_path = os.path.join(
+ os.path.join(os.path.join(base_path, "Data"), "Tor"), "geoip6"
+ )
+ elif self.platform == "Darwin":
+ base_path = os.path.dirname(
+ os.path.dirname(os.path.dirname(self.get_resource_path("")))
+ )
+ tor_path = os.path.join(base_path, "Resources", "Tor", "tor")
+ tor_geo_ip_file_path = os.path.join(base_path, "Resources", "Tor", "geoip")
+ tor_geo_ipv6_file_path = os.path.join(
+ base_path, "Resources", "Tor", "geoip6"
+ )
+ obfs4proxy_file_path = os.path.join(
+ base_path, "Resources", "Tor", "obfs4proxy"
+ )
+ elif self.platform == "BSD":
+ tor_path = "/usr/local/bin/tor"
+ tor_geo_ip_file_path = "/usr/local/share/tor/geoip"
+ tor_geo_ipv6_file_path = "/usr/local/share/tor/geoip6"
+ obfs4proxy_file_path = "/usr/local/bin/obfs4proxy"
+
+ return (
+ tor_path,
+ tor_geo_ip_file_path,
+ tor_geo_ipv6_file_path,
+ obfs4proxy_file_path,
+ )
+
+ def build_data_dir(self):
+ """
+ Returns the path of the OnionShare data directory.
+ """
+ if self.platform == "Windows":
+ try:
+ appdata = os.environ["APPDATA"]
+ onionshare_data_dir = f"{appdata}\\OnionShare"
+ except:
+ # If for some reason we don't have the 'APPDATA' environment variable
+ # (like running tests in Linux while pretending to be in Windows)
+ onionshare_data_dir = os.path.expanduser("~/.config/onionshare")
+ elif self.platform == "Darwin":
+ onionshare_data_dir = os.path.expanduser(
+ "~/Library/Application Support/OnionShare"
+ )
+ else:
+ onionshare_data_dir = os.path.expanduser("~/.config/onionshare")
+
+ # Modify the data dir if running tests
+ if getattr(sys, "onionshare_test_mode", False):
+ onionshare_data_dir += "-testdata"
+
+ os.makedirs(onionshare_data_dir, 0o700, True)
+ return onionshare_data_dir
+
+ def build_tmp_dir(self):
+ """
+ Returns path to a folder that can hold temporary files
+ """
+ tmp_dir = os.path.join(self.build_data_dir(), "tmp")
+ os.makedirs(tmp_dir, 0o700, True)
+ return tmp_dir
+
+ def build_persistent_dir(self):
+ """
+ Returns the path to the folder that holds persistent files
+ """
+ persistent_dir = os.path.join(self.build_data_dir(), "persistent")
+ os.makedirs(persistent_dir, 0o700, True)
+ return persistent_dir
+
+ def build_tor_dir(self):
+ """
+ Returns path to the tor data directory
+ """
+ tor_dir = os.path.join(self.build_data_dir(), "tor_data")
+ os.makedirs(tor_dir, 0o700, True)
+ return tor_dir
+
+ def build_password(self, word_count=2):
+ """
+ Returns a random string made of words from the wordlist, such as "deter-trig".
+ """
+ with open(self.get_resource_path("wordlist.txt")) as f:
+ wordlist = f.read().split()
+
+ r = random.SystemRandom()
+ return "-".join(r.choice(wordlist) for _ in range(word_count))
+
+ def build_username(self, word_count=2):
+ """
+ Returns a random string made of words from the wordlist, such as "deter-trig".
+ """
+ with open(self.get_resource_path("wordlist.txt")) as f:
+ wordlist = f.read().split()
+
+ r = random.SystemRandom()
+ return "-".join(r.choice(wordlist) for _ in range(word_count))
+
+ @staticmethod
+ def random_string(num_bytes, output_len=None):
+ """
+ Returns a random string with a specified number of bytes.
+ """
+ b = os.urandom(num_bytes)
+ h = hashlib.sha256(b).digest()[:16]
+ s = base64.b32encode(h).lower().replace(b"=", b"").decode("utf-8")
+ if not output_len:
+ return s
+ return s[:output_len]
+
+ @staticmethod
+ def human_readable_filesize(b):
+ """
+ Returns filesize in a human readable format.
+ """
+ thresh = 1024.0
+ if b < thresh:
+ return "{:.1f} B".format(b)
+ units = ("KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB")
+ u = 0
+ b /= thresh
+ while b >= thresh:
+ b /= thresh
+ u += 1
+ return "{:.1f} {}".format(b, units[u])
+
+ @staticmethod
+ def format_seconds(seconds):
+ """Return a human-readable string of the format 1d2h3m4s"""
+ days, seconds = divmod(seconds, 86400)
+ hours, seconds = divmod(seconds, 3600)
+ minutes, seconds = divmod(seconds, 60)
+
+ human_readable = []
+ if days:
+ human_readable.append("{:.0f}d".format(days))
+ if hours:
+ human_readable.append("{:.0f}h".format(hours))
+ if minutes:
+ human_readable.append("{:.0f}m".format(minutes))
+ if seconds or not human_readable:
+ human_readable.append("{:.0f}s".format(seconds))
+ return "".join(human_readable)
+
+ @staticmethod
+ def estimated_time_remaining(bytes_downloaded, total_bytes, started):
+ now = time.time()
+ time_elapsed = now - started # in seconds
+ download_rate = bytes_downloaded / time_elapsed
+ remaining_bytes = total_bytes - bytes_downloaded
+ eta = remaining_bytes / download_rate
+ return Common.format_seconds(eta)
+
+ @staticmethod
+ def get_available_port(min_port, max_port):
+ """
+ Find a random available port within the given range.
+ """
+ with socket.socket() as tmpsock:
+ while True:
+ try:
+ tmpsock.bind(("127.0.0.1", random.randint(min_port, max_port)))
+ break
+ except OSError as e:
+ pass
+ _, port = tmpsock.getsockname()
+ return port
+
+ @staticmethod
+ def dir_size(start_path):
+ """
+ Calculates the total size, in bytes, of all of the files in a directory.
+ """
+ total_size = 0
+ for dirpath, dirnames, filenames in os.walk(start_path):
+ for f in filenames:
+ fp = os.path.join(dirpath, f)
+ if not os.path.islink(fp):
+ total_size += os.path.getsize(fp)
+ return total_size
+
+
+class AutoStopTimer(threading.Thread):
+ """
+ Background thread sleeps t hours and returns.
+ """
+
+ def __init__(self, common, time):
+ threading.Thread.__init__(self)
+
+ self.common = common
+
+ self.setDaemon(True)
+ self.time = time
+
+ def run(self):
+ self.common.log(
+ "AutoStopTimer", f"Server will shut down after {self.time} seconds"
+ )
+ time.sleep(self.time)
+ return 1
diff --git a/desktop/onionshare/mode_settings.py b/desktop/onionshare/mode_settings.py
new file mode 100644
index 00000000..b353fcde
--- /dev/null
+++ b/desktop/onionshare/mode_settings.py
@@ -0,0 +1,146 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import os
+import json
+import platform
+
+if platform.system() == "Darwin":
+ import pwd
+
+
+class ModeSettings:
+ """
+ This stores the settings for a single instance of an OnionShare mode. In CLI there
+ is only one ModeSettings, and in the GUI there is a separate ModeSettings for each tab
+ """
+
+ def __init__(self, common, filename=None, id=None):
+ self.common = common
+
+ self.default_settings = {
+ "onion": {
+ "private_key": None,
+ "hidservauth_string": None,
+ "password": None,
+ },
+ "persistent": {"mode": None, "enabled": False},
+ "general": {
+ "public": False,
+ "autostart_timer": False,
+ "autostop_timer": False,
+ "legacy": False,
+ "client_auth": False,
+ "service_id": None,
+ },
+ "share": {"autostop_sharing": True, "filenames": []},
+ "receive": {"data_dir": self.build_default_receive_data_dir()},
+ "website": {"disable_csp": False, "filenames": []},
+ "chat": {"room": "default"},
+ }
+ self._settings = {}
+
+ self.just_created = False
+ if id:
+ self.id = id
+ else:
+ self.id = self.common.build_password(3)
+
+ self.load(filename)
+
+ def fill_in_defaults(self):
+ """
+ If there are any missing settings from self._settings, replace them with
+ their default values.
+ """
+ for key in self.default_settings:
+ if key in self._settings:
+ for inner_key in self.default_settings[key]:
+ if inner_key not in self._settings[key]:
+ self._settings[key][inner_key] = self.default_settings[key][
+ inner_key
+ ]
+ else:
+ self._settings[key] = self.default_settings[key]
+
+ def get(self, group, key):
+ return self._settings[group][key]
+
+ def set(self, group, key, val):
+ self._settings[group][key] = val
+ self.common.log(
+ "ModeSettings", "set", f"updating {self.id}: {group}.{key} = {val}"
+ )
+ self.save()
+
+ def build_default_receive_data_dir(self):
+ """
+ Returns the path of the default Downloads directory for receive mode.
+ """
+
+ if self.common.platform == "Darwin":
+ # We can't use os.path.expanduser() in macOS because in the sandbox it
+ # returns the path to the sandboxed homedir
+ real_homedir = pwd.getpwuid(os.getuid()).pw_dir
+ return os.path.join(real_homedir, "OnionShare")
+ elif self.common.platform == "Windows":
+ # On Windows, os.path.expanduser() needs to use backslash, or else it
+ # retains the forward slash, which breaks opening the folder in explorer.
+ return os.path.expanduser("~\OnionShare")
+ else:
+ # All other OSes
+ return os.path.expanduser("~/OnionShare")
+
+ def load(self, filename=None):
+ # Load persistent settings from disk. If the file doesn't exist, create it
+ if filename:
+ self.filename = filename
+ else:
+ self.filename = os.path.join(
+ self.common.build_persistent_dir(), f"{self.id}.json"
+ )
+
+ if os.path.exists(self.filename):
+ try:
+ with open(self.filename, "r") as f:
+ self._settings = json.load(f)
+ self.fill_in_defaults()
+ self.common.log("ModeSettings", "load", f"loaded {self.filename}")
+ return
+ except:
+ pass
+
+ # If loading settings didn't work, create the settings file
+ self.common.log("ModeSettings", "load", f"creating {self.filename}")
+ self.fill_in_defaults()
+ self.just_created = True
+
+ def save(self):
+ # Save persistent setting to disk
+ if not self.get("persistent", "enabled"):
+ return
+
+ if self.filename:
+ with open(self.filename, "w") as file:
+ file.write(json.dumps(self._settings, indent=2))
+
+ def delete(self):
+ # Delete the file from disk
+ if os.path.exists(self.filename):
+ os.remove(self.filename)
diff --git a/desktop/onionshare/onion.py b/desktop/onionshare/onion.py
new file mode 100644
index 00000000..c66c0df4
--- /dev/null
+++ b/desktop/onionshare/onion.py
@@ -0,0 +1,775 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from stem.control import Controller
+from stem import ProtocolError, SocketClosed
+from stem.connection import MissingPassword, UnreadableCookieFile, AuthenticationFailure
+from Crypto.PublicKey import RSA
+import base64, os, sys, tempfile, shutil, urllib, platform, subprocess, time, shlex
+
+from distutils.version import LooseVersion as Version
+from . import common, strings
+from .settings import Settings
+
+
+class TorErrorAutomatic(Exception):
+ """
+ OnionShare is failing to connect and authenticate to the Tor controller,
+ using automatic settings that should work with Tor Browser.
+ """
+
+ pass
+
+
+class TorErrorInvalidSetting(Exception):
+ """
+ This exception is raised if the settings just don't make sense.
+ """
+
+ pass
+
+
+class TorErrorSocketPort(Exception):
+ """
+ OnionShare can't connect to the Tor controller using the supplied address and port.
+ """
+
+ pass
+
+
+class TorErrorSocketFile(Exception):
+ """
+ OnionShare can't connect to the Tor controller using the supplied socket file.
+ """
+
+ pass
+
+
+class TorErrorMissingPassword(Exception):
+ """
+ OnionShare connected to the Tor controller, but it requires a password.
+ """
+
+ pass
+
+
+class TorErrorUnreadableCookieFile(Exception):
+ """
+ OnionShare connected to the Tor controller, but your user does not have permission
+ to access the cookie file.
+ """
+
+ pass
+
+
+class TorErrorAuthError(Exception):
+ """
+ OnionShare connected to the address and port, but can't authenticate. It's possible
+ that a Tor controller isn't listening on this port.
+ """
+
+ pass
+
+
+class TorErrorProtocolError(Exception):
+ """
+ This exception is raised if onionshare connects to the Tor controller, but it
+ isn't acting like a Tor controller (such as in Whonix).
+ """
+
+ pass
+
+
+class TorTooOld(Exception):
+ """
+ This exception is raised if onionshare needs to use a feature of Tor or stem
+ (like stealth ephemeral onion services) but the version you have installed
+ is too old.
+ """
+
+ pass
+
+
+class BundledTorNotSupported(Exception):
+ """
+ This exception is raised if onionshare is set to use the bundled Tor binary,
+ but it's not supported on that platform, or in dev mode.
+ """
+
+
+class BundledTorTimeout(Exception):
+ """
+ This exception is raised if onionshare is set to use the bundled Tor binary,
+ but Tor doesn't finish connecting promptly.
+ """
+
+
+class BundledTorCanceled(Exception):
+ """
+ This exception is raised if onionshare is set to use the bundled Tor binary,
+ and the user cancels connecting to Tor
+ """
+
+
+class BundledTorBroken(Exception):
+ """
+ This exception is raised if onionshare is set to use the bundled Tor binary,
+ but the process seems to fail to run.
+ """
+
+
+class Onion(object):
+ """
+ Onion is an abstraction layer for connecting to the Tor control port and
+ creating onion services. OnionShare supports creating onion services by
+ connecting to the Tor controller and using ADD_ONION, DEL_ONION.
+
+ stealth: Should the onion service be stealth?
+
+ settings: A Settings object. If it's not passed in, load from disk.
+
+ bundled_connection_func: If the tor connection type is bundled, optionally
+ call this function and pass in a status string while connecting to tor. This
+ is necessary for status updates to reach the GUI.
+ """
+
+ def __init__(self, common, use_tmp_dir=False):
+ self.common = common
+ self.common.log("Onion", "__init__")
+
+ self.use_tmp_dir = use_tmp_dir
+
+ # Is bundled tor supported?
+ if (
+ self.common.platform == "Windows" or self.common.platform == "Darwin"
+ ) and getattr(sys, "onionshare_dev_mode", False):
+ self.bundle_tor_supported = False
+ else:
+ self.bundle_tor_supported = True
+
+ # Set the path of the tor binary, for bundled tor
+ (
+ self.tor_path,
+ self.tor_geo_ip_file_path,
+ self.tor_geo_ipv6_file_path,
+ self.obfs4proxy_file_path,
+ ) = self.common.get_tor_paths()
+
+ # The tor process
+ self.tor_proc = None
+
+ # The Tor controller
+ self.c = None
+
+ # Start out not connected to Tor
+ self.connected_to_tor = False
+
+ # Assigned later if we are using stealth mode
+ self.auth_string = None
+
+ def connect(
+ self,
+ custom_settings=None,
+ config=None,
+ tor_status_update_func=None,
+ connect_timeout=120,
+ local_only=False,
+ ):
+ if local_only:
+ self.common.log(
+ "Onion", "connect", "--local-only, so skip trying to connect"
+ )
+ return
+
+ 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
+
+ if self.settings.get("connection_type") == "bundled":
+ if not self.bundle_tor_supported:
+ raise BundledTorNotSupported(
+ strings._("settings_error_bundled_tor_not_supported")
+ )
+
+ # Create a torrc for this session
+ if self.use_tmp_dir:
+ self.tor_data_directory = tempfile.TemporaryDirectory(
+ dir=self.common.build_tmp_dir()
+ )
+ self.tor_data_directory_name = self.tor_data_directory.name
+ else:
+ self.tor_data_directory_name = self.common.build_tor_dir()
+ self.common.log(
+ "Onion",
+ "connect",
+ f"tor_data_directory_name={self.tor_data_directory_name}",
+ )
+
+ # Create the torrc
+ with open(self.common.get_resource_path("torrc_template")) as f:
+ torrc_template = f.read()
+ self.tor_cookie_auth_file = os.path.join(
+ self.tor_data_directory_name, "cookie"
+ )
+ try:
+ self.tor_socks_port = self.common.get_available_port(1000, 65535)
+ except:
+ raise OSError(strings._("no_available_port"))
+ self.tor_torrc = os.path.join(self.tor_data_directory_name, "torrc")
+
+ if self.common.platform == "Windows" or self.common.platform == "Darwin":
+ # Windows doesn't support unix sockets, so it must use a network port.
+ # macOS can't use unix sockets either because socket filenames are limited to
+ # 100 chars, and the macOS sandbox forces us to put the socket file in a place
+ # with a really long path.
+ torrc_template += "ControlPort {{control_port}}\n"
+ try:
+ self.tor_control_port = self.common.get_available_port(1000, 65535)
+ except:
+ raise OSError(strings._("no_available_port"))
+ self.tor_control_socket = None
+ else:
+ # Linux and BSD can use unix sockets
+ torrc_template += "ControlSocket {{control_socket}}\n"
+ self.tor_control_port = None
+ self.tor_control_socket = os.path.join(
+ self.tor_data_directory_name, "control_socket"
+ )
+
+ torrc_template = torrc_template.replace(
+ "{{data_directory}}", self.tor_data_directory_name
+ )
+ torrc_template = torrc_template.replace(
+ "{{control_port}}", str(self.tor_control_port)
+ )
+ torrc_template = torrc_template.replace(
+ "{{control_socket}}", str(self.tor_control_socket)
+ )
+ torrc_template = torrc_template.replace(
+ "{{cookie_auth_file}}", self.tor_cookie_auth_file
+ )
+ torrc_template = torrc_template.replace(
+ "{{geo_ip_file}}", self.tor_geo_ip_file_path
+ )
+ torrc_template = torrc_template.replace(
+ "{{geo_ipv6_file}}", self.tor_geo_ipv6_file_path
+ )
+ torrc_template = torrc_template.replace(
+ "{{socks_port}}", str(self.tor_socks_port)
+ )
+
+ with open(self.tor_torrc, "w") as f:
+ f.write(torrc_template)
+
+ # Bridge support
+ if self.settings.get("tor_bridges_use_obfs4"):
+ f.write(
+ f"ClientTransportPlugin obfs4 exec {self.obfs4proxy_file_path}\n"
+ )
+ with open(
+ self.common.get_resource_path("torrc_template-obfs4")
+ ) as o:
+ for line in o:
+ f.write(line)
+ elif self.settings.get("tor_bridges_use_meek_lite_azure"):
+ f.write(
+ f"ClientTransportPlugin meek_lite exec {self.obfs4proxy_file_path}\n"
+ )
+ with open(
+ self.common.get_resource_path("torrc_template-meek_lite_azure")
+ ) as o:
+ for line in o:
+ f.write(line)
+
+ if self.settings.get("tor_bridges_use_custom_bridges"):
+ if "obfs4" in self.settings.get("tor_bridges_use_custom_bridges"):
+ f.write(
+ f"ClientTransportPlugin obfs4 exec {self.obfs4proxy_file_path}\n"
+ )
+ elif "meek_lite" in self.settings.get(
+ "tor_bridges_use_custom_bridges"
+ ):
+ f.write(
+ f"ClientTransportPlugin meek_lite exec {self.obfs4proxy_file_path}\n"
+ )
+ f.write(self.settings.get("tor_bridges_use_custom_bridges"))
+ f.write("\nUseBridges 1")
+
+ # Execute a tor subprocess
+ start_ts = time.time()
+ if self.common.platform == "Windows":
+ # In Windows, hide console window when opening tor.exe subprocess
+ startupinfo = subprocess.STARTUPINFO()
+ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
+ self.tor_proc = subprocess.Popen(
+ [self.tor_path, "-f", self.tor_torrc],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ startupinfo=startupinfo,
+ )
+ else:
+ self.tor_proc = subprocess.Popen(
+ [self.tor_path, "-f", self.tor_torrc],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ # Wait for the tor controller to start
+ time.sleep(2)
+
+ # Connect to the controller
+ try:
+ if (
+ self.common.platform == "Windows"
+ or self.common.platform == "Darwin"
+ ):
+ self.c = Controller.from_port(port=self.tor_control_port)
+ self.c.authenticate()
+ else:
+ self.c = Controller.from_socket_file(path=self.tor_control_socket)
+ self.c.authenticate()
+ except Exception as e:
+ raise BundledTorBroken(
+ strings._("settings_error_bundled_tor_broken").format(e.args[0])
+ )
+
+ while True:
+ try:
+ res = self.c.get_info("status/bootstrap-phase")
+ except SocketClosed:
+ raise BundledTorCanceled()
+
+ res_parts = shlex.split(res)
+ progress = res_parts[2].split("=")[1]
+ summary = res_parts[4].split("=")[1]
+
+ # "\033[K" clears the rest of the line
+ print(
+ f"\rConnecting to the Tor network: {progress}% - {summary}\033[K",
+ end="",
+ )
+
+ if callable(tor_status_update_func):
+ if not tor_status_update_func(progress, summary):
+ # If the dialog was canceled, stop connecting to Tor
+ self.common.log(
+ "Onion",
+ "connect",
+ "tor_status_update_func returned false, canceling connecting to Tor",
+ )
+ print()
+ return False
+
+ if summary == "Done":
+ print("")
+ break
+ time.sleep(0.2)
+
+ # If using bridges, it might take a bit longer to connect to Tor
+ 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")
+ ):
+ # 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("")
+ 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
+
+ # Try connecting to control port
+ found_tor = False
+
+ # If the TOR_CONTROL_PORT environment variable is set, use that
+ env_port = os.environ.get("TOR_CONTROL_PORT")
+ if env_port:
+ try:
+ self.c = Controller.from_port(port=int(env_port))
+ found_tor = True
+ except:
+ pass
+
+ else:
+ # Otherwise, try default ports for Tor Browser, Tor Messenger, and system tor
+ try:
+ ports = [9151, 9153, 9051]
+ for port in ports:
+ self.c = Controller.from_port(port=port)
+ found_tor = True
+ except:
+ pass
+
+ # If this still didn't work, try guessing the default socket file path
+ socket_file_path = ""
+ if not found_tor:
+ try:
+ if self.common.platform == "Darwin":
+ socket_file_path = os.path.expanduser(
+ "~/Library/Application Support/TorBrowser-Data/Tor/control.socket"
+ )
+
+ self.c = Controller.from_socket_file(path=socket_file_path)
+ found_tor = True
+ except:
+ pass
+
+ # If connecting to default control ports failed, so let's try
+ # guessing the socket file name next
+ if not found_tor:
+ try:
+ if self.common.platform == "Linux" or self.common.platform == "BSD":
+ socket_file_path = (
+ f"/run/user/{os.geteuid()}/Tor/control.socket"
+ )
+ elif self.common.platform == "Darwin":
+ socket_file_path = (
+ f"/run/user/{os.geteuid()}/Tor/control.socket"
+ )
+ elif self.common.platform == "Windows":
+ # Windows doesn't support unix sockets
+ raise TorErrorAutomatic(strings._("settings_error_automatic"))
+
+ self.c = Controller.from_socket_file(path=socket_file_path)
+
+ except:
+ raise TorErrorAutomatic(strings._("settings_error_automatic"))
+
+ # Try authenticating
+ try:
+ self.c.authenticate()
+ except:
+ raise TorErrorAutomatic(strings._("settings_error_automatic"))
+
+ else:
+ # Use specific settings to connect to tor
+
+ # Try connecting
+ try:
+ if self.settings.get("connection_type") == "control_port":
+ self.c = Controller.from_port(
+ address=self.settings.get("control_port_address"),
+ port=self.settings.get("control_port_port"),
+ )
+ elif self.settings.get("connection_type") == "socket_file":
+ self.c = Controller.from_socket_file(
+ path=self.settings.get("socket_file_path")
+ )
+ else:
+ raise TorErrorInvalidSetting(strings._("settings_error_unknown"))
+
+ except:
+ if self.settings.get("connection_type") == "control_port":
+ raise TorErrorSocketPort(
+ strings._("settings_error_socket_port").format(
+ self.settings.get("control_port_address"),
+ self.settings.get("control_port_port"),
+ )
+ )
+ else:
+ raise TorErrorSocketFile(
+ strings._("settings_error_socket_file").format(
+ self.settings.get("socket_file_path")
+ )
+ )
+
+ # Try authenticating
+ try:
+ if self.settings.get("auth_type") == "no_auth":
+ self.c.authenticate()
+ elif self.settings.get("auth_type") == "password":
+ self.c.authenticate(self.settings.get("auth_password"))
+ else:
+ raise TorErrorInvalidSetting(strings._("settings_error_unknown"))
+
+ except MissingPassword:
+ raise TorErrorMissingPassword(
+ strings._("settings_error_missing_password")
+ )
+ except UnreadableCookieFile:
+ raise TorErrorUnreadableCookieFile(
+ strings._("settings_error_unreadable_cookie_file")
+ )
+ except AuthenticationFailure:
+ raise TorErrorAuthError(
+ strings._("settings_error_auth").format(
+ self.settings.get("control_port_address"),
+ self.settings.get("control_port_port"),
+ )
+ )
+
+ # If we made it this far, we should be connected to Tor
+ self.connected_to_tor = True
+
+ # Get the tor version
+ self.tor_version = self.c.get_version().version_str
+ self.common.log("Onion", "connect", f"Connected to tor {self.tor_version}")
+
+ # Do the versions of stem and tor that I'm using support ephemeral onion services?
+ list_ephemeral_hidden_services = getattr(
+ self.c, "list_ephemeral_hidden_services", None
+ )
+ self.supports_ephemeral = (
+ callable(list_ephemeral_hidden_services) and self.tor_version >= "0.2.7.1"
+ )
+
+ # Do the versions of stem and tor that I'm using support stealth onion services?
+ try:
+ res = self.c.create_ephemeral_hidden_service(
+ {1: 1},
+ basic_auth={"onionshare": None},
+ await_publication=False,
+ key_type="NEW",
+ key_content="RSA1024",
+ )
+ tmp_service_id = res.service_id
+ self.c.remove_ephemeral_hidden_service(tmp_service_id)
+ self.supports_stealth = True
+ except:
+ # ephemeral stealth onion services are not supported
+ self.supports_stealth = False
+
+ # Does this version of Tor support next-gen ('v3') onions?
+ # Note, this is the version of Tor where this bug was fixed:
+ # https://trac.torproject.org/projects/tor/ticket/28619
+ self.supports_v3_onions = self.tor_version >= Version("0.3.5.7")
+
+ def is_authenticated(self):
+ """
+ Returns True if the Tor connection is still working, or False otherwise.
+ """
+ if self.c is not None:
+ return self.c.is_authenticated()
+ else:
+ return False
+
+ def start_onion_service(self, mode_settings, port, await_publication):
+ """
+ Start a onion service on port 80, pointing to the given port, and
+ return the onion hostname.
+ """
+ self.common.log("Onion", "start_onion_service", f"port={port}")
+
+ if not self.supports_ephemeral:
+ raise TorTooOld(strings._("error_ephemeral_not_supported"))
+ if mode_settings.get("general", "client_auth") and not self.supports_stealth:
+ raise TorTooOld(strings._("error_stealth_not_supported"))
+
+ auth_cookie = None
+ if mode_settings.get("general", "client_auth"):
+ if mode_settings.get("onion", "hidservauth_string"):
+ auth_cookie = mode_settings.get("onion", "hidservauth_string").split()[
+ 2
+ ]
+ if auth_cookie:
+ basic_auth = {"onionshare": auth_cookie}
+ else:
+ # If we had neither a scheduled auth cookie or a persistent hidservauth string,
+ # set the cookie to 'None', which means Tor will create one for us
+ basic_auth = {"onionshare": None}
+ else:
+ # Not using client auth at all
+ basic_auth = None
+
+ if mode_settings.get("onion", "private_key"):
+ key_content = mode_settings.get("onion", "private_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
+ if self.supports_v3_onions and not mode_settings.get("general", "legacy"):
+ key_content = "ED25519-V3"
+ else:
+ # fall back to v2 onion services
+ key_content = "RSA1024"
+
+ # v3 onions don't yet support basic auth. Our ticket:
+ # https://github.com/micahflee/onionshare/issues/697
+ if (
+ key_type == "NEW"
+ and key_content == "ED25519-V3"
+ and not mode_settings.get("general", "legacy")
+ ):
+ basic_auth = None
+
+ debug_message = f"key_type={key_type}"
+ if key_type == "NEW":
+ debug_message += f", key_content={key_content}"
+ self.common.log("Onion", "start_onion_service", debug_message)
+ try:
+ 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,
+ )
+
+ except ProtocolError as e:
+ raise TorErrorProtocolError(
+ strings._("error_tor_protocol_error").format(e.args[0])
+ )
+
+ onion_host = res.service_id + ".onion"
+
+ # Save the service_id
+ mode_settings.set("general", "service_id", res.service_id)
+
+ # Save the private key and hidservauth string
+ if not mode_settings.get("onion", "private_key"):
+ mode_settings.set("onion", "private_key", res.private_key)
+ if mode_settings.get("general", "client_auth") and not mode_settings.get(
+ "onion", "hidservauth_string"
+ ):
+ auth_cookie = list(res.client_auth.values())[0]
+ self.auth_string = f"HidServAuth {onion_host} {auth_cookie}"
+ mode_settings.set("onion", "hidservauth_string", self.auth_string)
+
+ return onion_host
+
+ def stop_onion_service(self, mode_settings):
+ """
+ Stop a specific onion service
+ """
+ onion_host = mode_settings.get("general", "service_id")
+ if onion_host:
+ self.common.log("Onion", "stop_onion_service", f"onion host: {onion_host}")
+ try:
+ self.c.remove_ephemeral_hidden_service(
+ mode_settings.get("general", "service_id")
+ )
+ except:
+ self.common.log(
+ "Onion", "stop_onion_service", f"failed to remove {onion_host}"
+ )
+
+ def cleanup(self, stop_tor=True):
+ """
+ Stop onion services that were created earlier. If there's a tor subprocess running, kill it.
+ """
+ self.common.log("Onion", "cleanup")
+
+ # Cleanup the ephemeral onion services, if we have any
+ try:
+ onions = self.c.list_ephemeral_hidden_services()
+ for service_id in onions:
+ onion_host = f"{service_id}.onion"
+ try:
+ self.common.log(
+ "Onion", "cleanup", f"trying to remove onion {onion_host}"
+ )
+ self.c.remove_ephemeral_hidden_service(service_id)
+ except:
+ self.common.log(
+ "Onion", "cleanup", f"failed to remove onion {onion_host}"
+ )
+ pass
+ except:
+ pass
+
+ if stop_tor:
+ # Stop tor process
+ if self.tor_proc:
+ self.tor_proc.terminate()
+ time.sleep(0.2)
+ if self.tor_proc.poll() is None:
+ self.common.log(
+ "Onion",
+ "cleanup",
+ "Tried to terminate tor process but it's still running",
+ )
+ try:
+ self.tor_proc.kill()
+ time.sleep(0.2)
+ if self.tor_proc.poll() is None:
+ self.common.log(
+ "Onion",
+ "cleanup",
+ "Tried to kill tor process but it's still running",
+ )
+ except:
+ self.common.log(
+ "Onion", "cleanup", "Exception while killing tor process"
+ )
+ self.tor_proc = None
+
+ # Reset other Onion settings
+ self.connected_to_tor = False
+
+ try:
+ # Delete the temporary tor data directory
+ if self.use_tmp_dir:
+ self.tor_data_directory.cleanup()
+ except:
+ pass
+
+ def get_tor_socks_port(self):
+ """
+ Returns a (address, port) tuple for the Tor SOCKS port
+ """
+ self.common.log("Onion", "get_tor_socks_port")
+
+ if self.settings.get("connection_type") == "bundled":
+ return ("127.0.0.1", self.tor_socks_port)
+ elif self.settings.get("connection_type") == "automatic":
+ return ("127.0.0.1", 9150)
+ else:
+ return (self.settings.get("socks_address"), self.settings.get("socks_port"))
+
+ def is_v2_key(self, key):
+ """
+ Helper function for determining if a key is RSA1024 (v2) or not.
+ """
+ try:
+ # Import the key
+ key = RSA.importKey(base64.b64decode(key))
+ # Is this a v2 Onion key? (1024 bits) If so, we should keep using it.
+ if key.n.bit_length() == 1024:
+ return True
+ else:
+ return False
+ except:
+ return False
diff --git a/desktop/onionshare/onionshare.py b/desktop/onionshare/onionshare.py
new file mode 100644
index 00000000..25c8ad90
--- /dev/null
+++ b/desktop/onionshare/onionshare.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os, shutil
+
+from . import common, strings
+from .onion import TorTooOld, TorErrorProtocolError
+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, autostop_timer=0):
+ self.common = common
+
+ self.common.log("OnionShare", "__init__")
+
+ # The Onion object
+ self.onion = onion
+
+ self.hidserv_dir = None
+ self.onion_host = None
+ self.port = None
+
+ # files and dirs to delete on shutdown
+ self.cleanup_filenames = []
+
+ # do not use tor -- for development
+ self.local_only = local_only
+
+ # optionally shut down after N hours
+ self.autostop_timer = autostop_timer
+ # init auto-stop timer thread
+ self.autostop_timer_thread = None
+
+ def choose_port(self):
+ """
+ Choose a random port.
+ """
+ try:
+ self.port = self.common.get_available_port(17600, 17650)
+ except:
+ raise OSError(strings._("no_available_port"))
+
+ def start_onion_service(self, mode_settings, await_publication=True):
+ """
+ Start the onionshare onion service.
+ """
+ self.common.log("OnionShare", "start_onion_service")
+
+ if not self.port:
+ self.choose_port()
+
+ if self.autostop_timer > 0:
+ self.autostop_timer_thread = AutoStopTimer(self.common, self.autostop_timer)
+
+ if self.local_only:
+ self.onion_host = f"127.0.0.1:{self.port}"
+ return
+
+ self.onion_host = self.onion.start_onion_service(
+ mode_settings, self.port, await_publication
+ )
+
+ if mode_settings.get("general", "client_auth"):
+ self.auth_string = self.onion.auth_string
+
+ def stop_onion_service(self, mode_settings):
+ """
+ Stop the onion service
+ """
+ self.onion.stop_onion_service(mode_settings)
+
+ def cleanup(self):
+ """
+ Shut everything down and clean up temporary files, etc.
+ """
+ self.common.log("OnionShare", "cleanup")
+
+ # Cleanup files
+ try:
+ for filename in self.cleanup_filenames:
+ if os.path.isfile(filename):
+ os.remove(filename)
+ elif os.path.isdir(filename):
+ shutil.rmtree(filename)
+ except:
+ # Don't crash if file is still in use
+ pass
+ self.cleanup_filenames = []
diff --git a/desktop/onionshare/settings.py b/desktop/onionshare/settings.py
new file mode 100644
index 00000000..6b6ed6ab
--- /dev/null
+++ b/desktop/onionshare/settings.py
@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import json
+import os
+import platform
+import locale
+
+try:
+ # We only need pwd module in macOS, and it's not available in Windows
+ import pwd
+except:
+ pass
+
+from . import strings
+
+
+class Settings(object):
+ """
+ This class stores all of the settings for OnionShare, specifically for how
+ to connect to Tor. If it can't find the settings file, it uses the default,
+ which is to attempt to connect automatically using default Tor Browser
+ settings.
+ """
+
+ def __init__(self, common, config=False):
+ self.common = common
+
+ self.common.log("Settings", "__init__")
+
+ # 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 = {
+ "ar": "العربية", # Arabic
+ #'bn': 'বাংলা', # Bengali (commented out because not at 90% translation)
+ "ca": "Català", # Catalan
+ "zh_Hant": "正體中文 (繁體)", # Traditional Chinese
+ "zh_Hans": "中文 (简体)", # Simplified Chinese
+ "da": "Dansk", # Danish
+ "nl": "Nederlands", # Dutch
+ "en": "English", # English
+ # "fi": "Suomi", # Finnish (commented out because not at 90% translation)
+ "fr": "Français", # French
+ "de": "Deutsch", # German
+ "el": "Ελληνικά", # Greek
+ "is": "Íslenska", # Icelandic
+ "ga": "Gaeilge", # Irish
+ "it": "Italiano", # Italian
+ "ja": "日本語", # Japanese
+ "nb_NO": "Norsk Bokmål", # Norwegian Bokmål
+ "fa": "فارسی", # Persian
+ "pl": "Polski", # Polish
+ "pt_BR": "Português (Brasil)", # Portuguese Brazil
+ "pt_PT": "Português (Portugal)", # Portuguese Portugal
+ "ro": "Română", # Romanian
+ "ru": "Русский", # Russian
+ "sr_Latn": "Srpska (latinica)", # Serbian (latin)
+ "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
+ self.default_settings = {
+ "version": self.common.version,
+ "connection_type": "bundled",
+ "control_port_address": "127.0.0.1",
+ "control_port_port": 9051,
+ "socks_address": "127.0.0.1",
+ "socks_port": 9050,
+ "socket_file_path": "/var/run/tor/control",
+ "auth_type": "no_auth",
+ "auth_password": "",
+ "use_autoupdate": True,
+ "autoupdate_timestamp": None,
+ "no_bridges": True,
+ "tor_bridges_use_obfs4": False,
+ "tor_bridges_use_meek_lite_azure": False,
+ "tor_bridges_use_custom_bridges": "",
+ "persistent_tabs": [],
+ "locale": None, # this gets defined in fill_in_defaults()
+ }
+ self._settings = {}
+ self.fill_in_defaults()
+
+ def fill_in_defaults(self):
+ """
+ If there are any missing settings from self._settings, replace them with
+ their default values.
+ """
+ for key in self.default_settings:
+ if key not in self._settings:
+ self._settings[key] = self.default_settings[key]
+
+ # Choose the default locale based on the OS preference, and fall-back to English
+ if self._settings["locale"] is None:
+ language_code, encoding = locale.getdefaultlocale()
+
+ # Default to English
+ if not language_code:
+ language_code = "en_US"
+
+ if language_code == "pt_PT" and language_code == "pt_BR":
+ # Portuguese locales include country code
+ default_locale = language_code
+ else:
+ # All other locales cut off the country code
+ default_locale = language_code[:2]
+
+ if default_locale not in self.available_locales:
+ default_locale = "en"
+ self._settings["locale"] = default_locale
+
+ def build_filename(self):
+ """
+ Returns the path of the settings file.
+ """
+ return os.path.join(self.common.build_data_dir(), "onionshare.json")
+
+ def load(self):
+ """
+ Load the settings from file.
+ """
+ self.common.log("Settings", "load")
+
+ # If the settings file exists, load it
+ if os.path.exists(self.filename):
+ try:
+ self.common.log("Settings", "load", f"Trying to load {self.filename}")
+ with open(self.filename, "r") as f:
+ self._settings = json.load(f)
+ self.fill_in_defaults()
+ except:
+ pass
+
+ # Make sure data_dir exists
+ try:
+ os.makedirs(self.get("data_dir"), exist_ok=True)
+ except:
+ pass
+
+ def save(self):
+ """
+ Save settings to file.
+ """
+ self.common.log("Settings", "save")
+ open(self.filename, "w").write(json.dumps(self._settings, indent=2))
+ self.common.log("Settings", "save", f"Settings saved in {self.filename}")
+
+ def get(self, key):
+ return self._settings[key]
+
+ def set(self, key, val):
+ # If typecasting int values fails, fallback to default values
+ if key == "control_port_port" or key == "socks_port":
+ try:
+ val = int(val)
+ except:
+ if key == "control_port_port":
+ val = self.default_settings["control_port_port"]
+ elif key == "socks_port":
+ val = self.default_settings["socks_port"]
+
+ self._settings[key] = val
diff --git a/desktop/onionshare/strings.py b/desktop/onionshare/strings.py
new file mode 100644
index 00000000..7e1756e3
--- /dev/null
+++ b/desktop/onionshare/strings.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import json
+import locale
+import os
+
+strings = {}
+translations = {}
+
+
+def load_strings(common):
+ """
+ Loads translated strings and fallback to English
+ if the translation does not exist.
+ """
+ global strings, translations
+
+ # Load all translations
+ translations = {}
+ for locale in common.settings.available_locales:
+ locale_dir = common.get_resource_path("locale")
+ filename = os.path.join(locale_dir, f"{locale}.json")
+ with open(filename, encoding="utf-8") as f:
+ translations[locale] = json.load(f)
+
+ # Build strings
+ default_locale = "en"
+ current_locale = common.settings.get("locale")
+ strings = {}
+ for s in translations[default_locale]:
+ if s in translations[current_locale] and translations[current_locale][s] != "":
+ strings[s] = translations[current_locale][s]
+ else:
+ strings[s] = translations[default_locale][s]
+
+
+def translated(k):
+ """
+ Returns a translated string.
+ """
+ return strings[k]
+
+
+_ = translated
diff --git a/desktop/onionshare/web/__init__.py b/desktop/onionshare/web/__init__.py
new file mode 100644
index 00000000..f036d011
--- /dev/null
+++ b/desktop/onionshare/web/__init__.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from .web import Web
diff --git a/desktop/onionshare/web/chat_mode.py b/desktop/onionshare/web/chat_mode.py
new file mode 100644
index 00000000..15e236d3
--- /dev/null
+++ b/desktop/onionshare/web/chat_mode.py
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from flask import (
+ Request,
+ request,
+ render_template,
+ make_response,
+ jsonify,
+ redirect,
+ session,
+)
+from werkzeug.utils import secure_filename
+from flask_socketio import emit, join_room, leave_room
+
+
+class ChatModeWeb:
+ """
+ All of the web logic for chat mode
+ """
+
+ def __init__(self, common, web):
+ self.common = common
+ self.common.log("ChatModeWeb", "__init__")
+
+ self.web = web
+
+ # This tracks users in the room
+ self.connected_users = []
+
+ # This tracks the history id
+ self.cur_history_id = 0
+
+ self.define_routes()
+
+ def define_routes(self):
+ """
+ The web app routes for chatting
+ """
+
+ @self.web.app.route("/")
+ def index():
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ session["name"] = (
+ session.get("name")
+ if session.get("name")
+ else self.common.build_username()
+ )
+ session["room"] = self.web.settings.default_settings["chat"]["room"]
+ self.web.add_request(
+ request.path, {"id": history_id, "status_code": 200},
+ )
+
+ self.web.add_request(self.web.REQUEST_LOAD, request.path)
+ r = make_response(
+ render_template(
+ "chat.html",
+ static_url_path=self.web.static_url_path,
+ username=session.get("name"),
+ )
+ )
+ return self.web.add_security_headers(r)
+
+ @self.web.app.route("/update-session-username", methods=["POST"])
+ def update_session_username():
+ history_id = self.cur_history_id
+ data = request.get_json()
+ if data.get("username", "") not in self.connected_users:
+ session["name"] = data.get("username", session.get("name"))
+ self.web.add_request(
+ request.path, {"id": history_id, "status_code": 200},
+ )
+
+ self.web.add_request(self.web.REQUEST_LOAD, request.path)
+ r = make_response(jsonify(username=session.get("name"), success=True,))
+ return self.web.add_security_headers(r)
+
+ @self.web.socketio.on("joined", namespace="/chat")
+ def joined(message):
+ """Sent by clients when they enter a room.
+ A status message is broadcast to all people in the room."""
+ self.connected_users.append(session.get("name"))
+ join_room(session.get("room"))
+ emit(
+ "status",
+ {
+ "username": session.get("name"),
+ "msg": "{} has joined.".format(session.get("name")),
+ "connected_users": self.connected_users,
+ "user": session.get("name"),
+ },
+ room=session.get("room"),
+ )
+
+ @self.web.socketio.on("text", namespace="/chat")
+ def text(message):
+ """Sent by a client when the user entered a new message.
+ The message is sent to all people in the room."""
+ emit(
+ "message",
+ {"username": session.get("name"), "msg": message["msg"]},
+ room=session.get("room"),
+ )
+
+ @self.web.socketio.on("update_username", namespace="/chat")
+ def update_username(message):
+ """Sent by a client when the user updates their username.
+ The message is sent to all people in the room."""
+ current_name = session.get("name")
+ if message["username"] not in self.connected_users:
+ session["name"] = message["username"]
+ self.connected_users[
+ self.connected_users.index(current_name)
+ ] = session.get("name")
+ emit(
+ "status",
+ {
+ "msg": "{} has updated their username to: {}".format(
+ current_name, session.get("name")
+ ),
+ "connected_users": self.connected_users,
+ "old_name": current_name,
+ "new_name": session.get("name"),
+ },
+ room=session.get("room"),
+ )
+
+ @self.web.socketio.on("disconnect", namespace="/chat")
+ def disconnect():
+ """Sent by clients when they disconnect from a room.
+ A status message is broadcast to all people in the room."""
+ self.connected_users.remove(session.get("name"))
+ leave_room(session.get("room"))
+ emit(
+ "status",
+ {
+ "msg": "{} has left the room.".format(session.get("name")),
+ "connected_users": self.connected_users,
+ },
+ room=session.get("room"),
+ )
diff --git a/desktop/onionshare/web/receive_mode.py b/desktop/onionshare/web/receive_mode.py
new file mode 100644
index 00000000..a9876c40
--- /dev/null
+++ b/desktop/onionshare/web/receive_mode.py
@@ -0,0 +1,492 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+import tempfile
+import json
+from datetime import datetime
+from flask import Request, request, render_template, make_response, flash, redirect
+from werkzeug.utils import secure_filename
+
+from .. import strings
+
+
+class ReceiveModeWeb:
+ """
+ All of the web logic for receive mode
+ """
+
+ def __init__(self, common, web):
+ self.common = common
+ self.common.log("ReceiveModeWeb", "__init__")
+
+ self.web = web
+
+ self.can_upload = True
+ self.uploads_in_progress = []
+
+ # This tracks the history id
+ self.cur_history_id = 0
+
+ self.define_routes()
+
+ def define_routes(self):
+ """
+ The web app routes for receiving files
+ """
+
+ @self.web.app.route("/")
+ def index():
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ self.web.add_request(
+ self.web.REQUEST_INDIVIDUAL_FILE_STARTED,
+ request.path,
+ {"id": history_id, "status_code": 200},
+ )
+
+ self.web.add_request(self.web.REQUEST_LOAD, request.path)
+ r = make_response(
+ render_template(
+ "receive.html", static_url_path=self.web.static_url_path
+ )
+ )
+ return self.web.add_security_headers(r)
+
+ @self.web.app.route("/upload", methods=["POST"])
+ def upload(ajax=False):
+ """
+ Handle the upload files POST request, though at this point, the files have
+ already been uploaded and saved to their correct locations.
+ """
+ files = request.files.getlist("file[]")
+ filenames = []
+ for f in files:
+ if f.filename != "":
+ filename = secure_filename(f.filename)
+ filenames.append(filename)
+ local_path = os.path.join(request.receive_mode_dir, filename)
+ basename = os.path.basename(local_path)
+
+ # Tell the GUI the receive mode directory for this file
+ self.web.add_request(
+ self.web.REQUEST_UPLOAD_SET_DIR,
+ request.path,
+ {
+ "id": request.history_id,
+ "filename": basename,
+ "dir": request.receive_mode_dir,
+ },
+ )
+
+ self.common.log(
+ "ReceiveModeWeb",
+ "define_routes",
+ f"/upload, uploaded {f.filename}, saving to {local_path}",
+ )
+ print(f"\nReceived: {local_path}")
+
+ if request.upload_error:
+ self.common.log(
+ "ReceiveModeWeb",
+ "define_routes",
+ "/upload, there was an upload error",
+ )
+
+ self.web.add_request(
+ self.web.REQUEST_ERROR_DATA_DIR_CANNOT_CREATE,
+ request.path,
+ {"receive_mode_dir": request.receive_mode_dir},
+ )
+ print(
+ f"Could not create OnionShare data folder: {request.receive_mode_dir}"
+ )
+
+ msg = "Error uploading, please inform the OnionShare user"
+ if ajax:
+ return json.dumps({"error_flashes": [msg]})
+ else:
+ flash(msg, "error")
+ return redirect("/")
+
+ # Note that flash strings are in English, and not translated, on purpose,
+ # to avoid leaking the locale of the OnionShare user
+ if ajax:
+ info_flashes = []
+
+ if len(filenames) == 0:
+ msg = "No files uploaded"
+ if ajax:
+ info_flashes.append(msg)
+ else:
+ flash(msg, "info")
+ else:
+ msg = "Sent "
+ for filename in filenames:
+ msg += f"{filename}, "
+ msg = msg.rstrip(", ")
+ if ajax:
+ info_flashes.append(msg)
+ else:
+ flash(msg, "info")
+
+ if self.can_upload:
+ if ajax:
+ return json.dumps({"info_flashes": info_flashes})
+ else:
+ return redirect("/")
+ else:
+ if ajax:
+ return json.dumps(
+ {
+ "new_body": render_template(
+ "thankyou.html",
+ static_url_path=self.web.static_url_path,
+ )
+ }
+ )
+ else:
+ # It was the last upload and the timer ran out
+ r = make_response(
+ render_template("thankyou.html"),
+ static_url_path=self.web.static_url_path,
+ )
+ return self.web.add_security_headers(r)
+
+ @self.web.app.route("/upload-ajax", methods=["POST"])
+ def upload_ajax_public():
+ if not self.can_upload:
+ return self.web.error403()
+ return upload(ajax=True)
+
+
+class ReceiveModeWSGIMiddleware(object):
+ """
+ Custom WSGI middleware in order to attach the Web object to environ, so
+ ReceiveModeRequest can access it.
+ """
+
+ def __init__(self, app, web):
+ self.app = app
+ self.web = web
+
+ def __call__(self, environ, start_response):
+ environ["web"] = self.web
+ environ["stop_q"] = self.web.stop_q
+ return self.app(environ, start_response)
+
+
+class ReceiveModeFile(object):
+ """
+ A custom file object that tells ReceiveModeRequest every time data gets
+ written to it, in order to track the progress of uploads. It starts out with
+ a .part file extension, and when it's complete it removes that extension.
+ """
+
+ def __init__(self, request, filename, write_func, close_func):
+ self.onionshare_request = request
+ self.onionshare_filename = filename
+ self.onionshare_write_func = write_func
+ self.onionshare_close_func = close_func
+
+ self.filename = os.path.join(self.onionshare_request.receive_mode_dir, filename)
+ self.filename_in_progress = f"{self.filename}.part"
+
+ # Open the file
+ self.upload_error = False
+ try:
+ self.f = open(self.filename_in_progress, "wb+")
+ except:
+ # This will only happen if someone is messing with the data dir while
+ # OnionShare is running, but if it does make sure to throw an error
+ self.upload_error = True
+ self.f = tempfile.TemporaryFile("wb+")
+
+ # Make all the file-like methods and attributes actually access the
+ # TemporaryFile, except for write
+ attrs = [
+ "closed",
+ "detach",
+ "fileno",
+ "flush",
+ "isatty",
+ "mode",
+ "name",
+ "peek",
+ "raw",
+ "read",
+ "read1",
+ "readable",
+ "readinto",
+ "readinto1",
+ "readline",
+ "readlines",
+ "seek",
+ "seekable",
+ "tell",
+ "truncate",
+ "writable",
+ "writelines",
+ ]
+ for attr in attrs:
+ setattr(self, attr, getattr(self.f, attr))
+
+ def write(self, b):
+ """
+ Custom write method that calls out to onionshare_write_func
+ """
+ if self.upload_error or (not self.onionshare_request.stop_q.empty()):
+ self.close()
+ self.onionshare_request.close()
+ return
+
+ try:
+ bytes_written = self.f.write(b)
+ self.onionshare_write_func(self.onionshare_filename, bytes_written)
+
+ except:
+ self.upload_error = True
+
+ def close(self):
+ """
+ Custom close method that calls out to onionshare_close_func
+ """
+ try:
+ self.f.close()
+
+ if not self.upload_error:
+ # Rename the in progress file to the final filename
+ os.rename(self.filename_in_progress, self.filename)
+
+ except:
+ self.upload_error = True
+
+ self.onionshare_close_func(self.onionshare_filename, self.upload_error)
+
+
+class ReceiveModeRequest(Request):
+ """
+ A custom flask Request object that keeps track of how much data has been
+ uploaded for each file, for receive mode.
+ """
+
+ def __init__(self, environ, populate_request=True, shallow=False):
+ super(ReceiveModeRequest, self).__init__(environ, populate_request, shallow)
+ self.web = environ["web"]
+ self.stop_q = environ["stop_q"]
+
+ self.web.common.log("ReceiveModeRequest", "__init__")
+
+ # Prevent running the close() method more than once
+ self.closed = False
+
+ # Is this a valid upload request?
+ self.upload_request = False
+ if self.method == "POST":
+ if self.path == "/upload" or self.path == "/upload-ajax":
+ self.upload_request = True
+
+ if self.upload_request:
+ # No errors yet
+ self.upload_error = False
+
+ # Figure out what files should be saved
+ now = datetime.now()
+ date_dir = now.strftime("%Y-%m-%d")
+ time_dir = now.strftime("%H.%M.%S")
+ self.receive_mode_dir = os.path.join(
+ self.web.settings.get("receive", "data_dir"), date_dir, time_dir
+ )
+
+ # Create that directory, which shouldn't exist yet
+ try:
+ os.makedirs(self.receive_mode_dir, 0o700, exist_ok=False)
+ except OSError:
+ # If this directory already exists, maybe someone else is uploading files at
+ # the same second, so use a different name in that case
+ if os.path.exists(self.receive_mode_dir):
+ # Keep going until we find a directory name that's available
+ i = 1
+ while True:
+ new_receive_mode_dir = f"{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
+ i += 1
+ # Failsafe
+ if i == 100:
+ self.web.common.log(
+ "ReceiveModeRequest",
+ "__init__",
+ "Error finding available receive mode directory",
+ )
+ self.upload_error = True
+ break
+ except PermissionError:
+ self.web.add_request(
+ self.web.REQUEST_ERROR_DATA_DIR_CANNOT_CREATE,
+ request.path,
+ {"receive_mode_dir": self.receive_mode_dir},
+ )
+ print(
+ f"Could not create OnionShare data folder: {self.receive_mode_dir}"
+ )
+ self.web.common.log(
+ "ReceiveModeRequest",
+ "__init__",
+ "Permission denied creating receive mode directory",
+ )
+ self.upload_error = True
+
+ # If there's an error so far, finish early
+ if self.upload_error:
+ return
+
+ # A dictionary that maps filenames to the bytes uploaded so far
+ self.progress = {}
+
+ # Prevent new uploads if we've said so (timer expired)
+ if self.web.receive_mode.can_upload:
+
+ # Create an history_id, attach it to the request
+ self.history_id = self.web.receive_mode.cur_history_id
+ self.web.receive_mode.cur_history_id += 1
+
+ # Figure out the content length
+ try:
+ self.content_length = int(self.headers["Content-Length"])
+ except:
+ self.content_length = 0
+
+ date_str = datetime.now().strftime("%b %d, %I:%M%p")
+ size_str = self.web.common.human_readable_filesize(self.content_length)
+ print(f"{date_str}: Upload of total size {size_str} is starting")
+
+ # Don't tell the GUI that a request has started until we start receiving files
+ self.told_gui_about_request = False
+
+ self.previous_file = None
+
+ def _get_file_stream(
+ self, total_content_length, content_type, filename=None, content_length=None
+ ):
+ """
+ This gets called for each file that gets uploaded, and returns an file-like
+ writable stream.
+ """
+ if self.upload_request:
+ if not self.told_gui_about_request:
+ # Tell the GUI about the request
+ self.web.add_request(
+ self.web.REQUEST_STARTED,
+ self.path,
+ {"id": self.history_id, "content_length": self.content_length},
+ )
+ self.web.receive_mode.uploads_in_progress.append(self.history_id)
+
+ self.told_gui_about_request = True
+
+ self.filename = secure_filename(filename)
+
+ self.progress[self.filename] = {"uploaded_bytes": 0, "complete": False}
+
+ f = ReceiveModeFile(
+ self, self.filename, self.file_write_func, self.file_close_func
+ )
+ if f.upload_error:
+ self.web.common.log(
+ "ReceiveModeRequest", "_get_file_stream", "Error creating file"
+ )
+ self.upload_error = True
+ return f
+
+ def close(self):
+ """
+ Closing the request.
+ """
+ super(ReceiveModeRequest, self).close()
+
+ # Prevent calling this method more than once per request
+ if self.closed:
+ return
+ self.closed = True
+
+ self.web.common.log("ReceiveModeRequest", "close")
+
+ try:
+ if self.told_gui_about_request:
+ history_id = self.history_id
+
+ if (
+ not self.web.stop_q.empty()
+ or not self.progress[self.filename]["complete"]
+ ):
+ # Inform the GUI that the upload has canceled
+ self.web.add_request(
+ self.web.REQUEST_UPLOAD_CANCELED, self.path, {"id": history_id}
+ )
+ else:
+ # Inform the GUI that the upload has finished
+ self.web.add_request(
+ self.web.REQUEST_UPLOAD_FINISHED, self.path, {"id": history_id}
+ )
+ self.web.receive_mode.uploads_in_progress.remove(history_id)
+
+ except AttributeError:
+ pass
+
+ def file_write_func(self, filename, length):
+ """
+ This function gets called when a specific file is written to.
+ """
+ if self.closed:
+ return
+
+ if self.upload_request:
+ self.progress[filename]["uploaded_bytes"] += length
+
+ if self.previous_file != filename:
+ self.previous_file = filename
+
+ size_str = self.web.common.human_readable_filesize(
+ self.progress[filename]["uploaded_bytes"]
+ )
+ print(f"\r=> {size_str} {filename} ", end="")
+
+ # Update the GUI on the upload progress
+ if self.told_gui_about_request:
+ self.web.add_request(
+ self.web.REQUEST_PROGRESS,
+ self.path,
+ {"id": self.history_id, "progress": self.progress},
+ )
+
+ def file_close_func(self, filename, upload_error=False):
+ """
+ This function gets called when a specific file is closed.
+ """
+ self.progress[filename]["complete"] = True
+
+ # If the file tells us there was an upload error, let the request know as well
+ if upload_error:
+ self.upload_error = True
diff --git a/desktop/onionshare/web/send_base_mode.py b/desktop/onionshare/web/send_base_mode.py
new file mode 100644
index 00000000..9d5f876b
--- /dev/null
+++ b/desktop/onionshare/web/send_base_mode.py
@@ -0,0 +1,323 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+import sys
+import tempfile
+import mimetypes
+import gzip
+from flask import Response, request, render_template, make_response
+
+from .. import strings
+
+
+class SendBaseModeWeb:
+ """
+ All of the web logic shared between share and website mode (modes where the user sends files)
+ """
+
+ def __init__(self, common, web):
+ super(SendBaseModeWeb, self).__init__()
+ self.common = common
+ self.web = web
+
+ # Information about the file to be shared
+ self.is_zipped = False
+ self.download_filename = None
+ self.download_filesize = None
+ self.gzip_filename = None
+ self.gzip_filesize = None
+ self.zip_writer = None
+
+ # If autostop_sharing, only allow one download at a time
+ self.download_in_progress = False
+
+ # This tracks the history id
+ self.cur_history_id = 0
+
+ self.define_routes()
+ self.init()
+
+ def set_file_info(self, filenames, processed_size_callback=None):
+ """
+ Build a data structure that describes the list of files
+ """
+ # If there's just one folder, replace filenames with a list of files inside that folder
+ if len(filenames) == 1 and os.path.isdir(filenames[0]):
+ filenames = [
+ os.path.join(filenames[0], x) for x in os.listdir(filenames[0])
+ ]
+
+ # Re-initialize
+ self.files = {} # Dictionary mapping file paths to filenames on disk
+ self.root_files = (
+ {}
+ ) # This is only the root files and dirs, as opposed to all of them
+ self.cleanup_filenames = []
+ self.cur_history_id = 0
+ self.file_info = {"files": [], "dirs": []}
+ self.gzip_individual_files = {}
+ self.init()
+
+ # Build the file list
+ for filename in filenames:
+ basename = os.path.basename(filename.rstrip("/"))
+
+ # If it's a filename, add it
+ if os.path.isfile(filename):
+ self.files[basename] = filename
+ self.root_files[basename] = filename
+
+ # If it's a directory, add it recursively
+ elif os.path.isdir(filename):
+ self.root_files[basename + "/"] = filename
+
+ for root, _, nested_filenames in os.walk(filename):
+ # Normalize the root path. So if the directory name is "/home/user/Documents/some_folder",
+ # and it has a nested folder foobar, the root is "/home/user/Documents/some_folder/foobar".
+ # The normalized_root should be "some_folder/foobar"
+ normalized_root = os.path.join(
+ basename, root[len(filename) :].lstrip("/")
+ ).rstrip("/")
+
+ # Add the dir itself
+ self.files[normalized_root + "/"] = root
+
+ # Add the files in this dir
+ for nested_filename in nested_filenames:
+ self.files[
+ os.path.join(normalized_root, nested_filename)
+ ] = os.path.join(root, nested_filename)
+
+ self.set_file_info_custom(filenames, processed_size_callback)
+
+ def directory_listing(self, filenames, path="", filesystem_path=None):
+ # Tell the GUI about the directory listing
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ self.web.add_request(
+ self.web.REQUEST_INDIVIDUAL_FILE_STARTED,
+ f"/{path}",
+ {"id": history_id, "method": request.method, "status_code": 200},
+ )
+
+ breadcrumbs = [("☗", "/")]
+ parts = path.split("/")[:-1]
+ for i in range(len(parts)):
+ breadcrumbs.append((parts[i], f"/{'/'.join(parts[0 : i + 1])}/"))
+ breadcrumbs_leaf = breadcrumbs.pop()[0]
+
+ # If filesystem_path is None, this is the root directory listing
+ files, dirs = self.build_directory_listing(filenames, filesystem_path)
+ r = self.directory_listing_template(
+ path, files, dirs, breadcrumbs, breadcrumbs_leaf
+ )
+ return self.web.add_security_headers(r)
+
+ def build_directory_listing(self, filenames, filesystem_path):
+ files = []
+ dirs = []
+
+ for filename in filenames:
+ if filesystem_path:
+ this_filesystem_path = os.path.join(filesystem_path, filename)
+ else:
+ this_filesystem_path = self.files[filename]
+
+ is_dir = os.path.isdir(this_filesystem_path)
+
+ if is_dir:
+ dirs.append({"basename": filename})
+ else:
+ size = os.path.getsize(this_filesystem_path)
+ size_human = self.common.human_readable_filesize(size)
+ files.append({"basename": filename, "size_human": size_human})
+ return files, dirs
+
+ def stream_individual_file(self, filesystem_path):
+ """
+ Return a flask response that's streaming the download of an individual file, and gzip
+ compressing it if the browser supports it.
+ """
+ use_gzip = self.should_use_gzip()
+
+ # gzip compress the individual file, if it hasn't already been compressed
+ if use_gzip:
+ if filesystem_path not in self.gzip_individual_files:
+ gzip_filename = tempfile.mkstemp("wb+")[1]
+ self._gzip_compress(filesystem_path, gzip_filename, 6, None)
+ self.gzip_individual_files[filesystem_path] = gzip_filename
+
+ # Make sure the gzip file gets cleaned up when onionshare stops
+ self.cleanup_filenames.append(gzip_filename)
+
+ file_to_download = self.gzip_individual_files[filesystem_path]
+ filesize = os.path.getsize(self.gzip_individual_files[filesystem_path])
+ else:
+ file_to_download = filesystem_path
+ filesize = os.path.getsize(filesystem_path)
+
+ path = request.path
+
+ # Tell GUI the individual file started
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+
+ # Only GET requests are allowed, any other method should fail
+ if request.method != "GET":
+ return self.web.error405(history_id)
+
+ self.web.add_request(
+ self.web.REQUEST_INDIVIDUAL_FILE_STARTED,
+ path,
+ {"id": history_id, "filesize": filesize},
+ )
+
+ def generate():
+ chunk_size = 102400 # 100kb
+
+ fp = open(file_to_download, "rb")
+ done = False
+ while not done:
+ chunk = fp.read(chunk_size)
+ if chunk == b"":
+ done = True
+ else:
+ try:
+ yield chunk
+
+ # Tell GUI the progress
+ downloaded_bytes = fp.tell()
+ percent = (1.0 * downloaded_bytes / filesize) * 100
+ if (
+ not self.web.is_gui
+ or self.common.platform == "Linux"
+ or self.common.platform == "BSD"
+ ):
+ sys.stdout.write(
+ "\r{0:s}, {1:.2f}% ".format(
+ self.common.human_readable_filesize(
+ downloaded_bytes
+ ),
+ percent,
+ )
+ )
+ sys.stdout.flush()
+
+ self.web.add_request(
+ self.web.REQUEST_INDIVIDUAL_FILE_PROGRESS,
+ path,
+ {
+ "id": history_id,
+ "bytes": downloaded_bytes,
+ "filesize": filesize,
+ },
+ )
+ done = False
+ except:
+ # Looks like the download was canceled
+ done = True
+
+ # Tell the GUI the individual file was canceled
+ self.web.add_request(
+ self.web.REQUEST_INDIVIDUAL_FILE_CANCELED,
+ path,
+ {"id": history_id},
+ )
+
+ fp.close()
+
+ if self.common.platform != "Darwin":
+ sys.stdout.write("\n")
+
+ basename = os.path.basename(filesystem_path)
+
+ r = Response(generate())
+ if use_gzip:
+ r.headers.set("Content-Encoding", "gzip")
+ r.headers.set("Content-Length", filesize)
+ r.headers.set("Content-Disposition", "inline", filename=basename)
+ r = self.web.add_security_headers(r)
+ (content_type, _) = mimetypes.guess_type(basename, strict=False)
+ if content_type is not None:
+ r.headers.set("Content-Type", content_type)
+ return r
+
+ def should_use_gzip(self):
+ """
+ Should we use gzip for this browser?
+ """
+ return (not self.is_zipped) and (
+ "gzip" in request.headers.get("Accept-Encoding", "").lower()
+ )
+
+ def _gzip_compress(
+ self, input_filename, output_filename, level, processed_size_callback=None
+ ):
+ """
+ Compress a file with gzip, without loading the whole thing into memory
+ Thanks: https://stackoverflow.com/questions/27035296/python-how-to-gzip-a-large-text-file-without-memoryerror
+ """
+ bytes_processed = 0
+ blocksize = 1 << 16 # 64kB
+ with open(input_filename, "rb") as input_file:
+ output_file = gzip.open(output_filename, "wb", level)
+ while True:
+ if processed_size_callback is not None:
+ processed_size_callback(bytes_processed)
+
+ block = input_file.read(blocksize)
+ if len(block) == 0:
+ break
+ output_file.write(block)
+ bytes_processed += blocksize
+
+ output_file.close()
+
+ def init(self):
+ """
+ Inherited class will implement this
+ """
+ pass
+
+ def define_routes(self):
+ """
+ Inherited class will implement this
+ """
+ pass
+
+ def directory_listing_template(self):
+ """
+ Inherited class will implement this. It should call render_template and return
+ the response.
+ """
+ pass
+
+ def set_file_info_custom(self, filenames, processed_size_callback):
+ """
+ Inherited class will implement this.
+ """
+ pass
+
+ def render_logic(self, path=""):
+ """
+ Inherited class will implement this.
+ """
+ pass
diff --git a/desktop/onionshare/web/share_mode.py b/desktop/onionshare/web/share_mode.py
new file mode 100644
index 00000000..ccd29e1c
--- /dev/null
+++ b/desktop/onionshare/web/share_mode.py
@@ -0,0 +1,412 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+import sys
+import tempfile
+import zipfile
+import mimetypes
+from flask import Response, request, render_template, make_response
+
+from .send_base_mode import SendBaseModeWeb
+from .. import strings
+
+
+class ShareModeWeb(SendBaseModeWeb):
+ """
+ All of the web logic for share mode
+ """
+
+ def init(self):
+ self.common.log("ShareModeWeb", "init")
+
+ # Allow downloading individual files if "Stop sharing after files have been sent" is unchecked
+ self.download_individual_files = not self.web.settings.get(
+ "share", "autostop_sharing"
+ )
+
+ def define_routes(self):
+ """
+ The web app routes for sharing files
+ """
+
+ @self.web.app.route("/", defaults={"path": ""})
+ @self.web.app.route("/<path:path>")
+ def index(path):
+ """
+ Render the template for the onionshare landing page.
+ """
+ self.web.add_request(self.web.REQUEST_LOAD, request.path)
+
+ # Deny new downloads if "Stop sharing after files have been sent" is checked and there is
+ # currently a download
+ deny_download = (
+ self.web.settings.get("share", "autostop_sharing")
+ and self.download_in_progress
+ )
+ if deny_download:
+ r = make_response(
+ render_template("denied.html"),
+ static_url_path=self.web.static_url_path,
+ )
+ return self.web.add_security_headers(r)
+
+ # If download is allowed to continue, serve download page
+ if self.should_use_gzip():
+ self.filesize = self.gzip_filesize
+ else:
+ self.filesize = self.download_filesize
+
+ return self.render_logic(path)
+
+ @self.web.app.route("/download")
+ def download():
+ """
+ Download the zip file.
+ """
+ # Deny new downloads if "Stop After First Download" is checked and there is
+ # currently a download
+ deny_download = (
+ self.web.settings.get("share", "autostop_sharing")
+ and self.download_in_progress
+ )
+ if deny_download:
+ r = make_response(
+ render_template(
+ "denied.html", static_url_path=self.web.static_url_path
+ )
+ )
+ return self.web.add_security_headers(r)
+
+ # Prepare some variables to use inside generate() function below
+ # which is outside of the request context
+ shutdown_func = request.environ.get("werkzeug.server.shutdown")
+ path = request.path
+
+ # If this is a zipped file, then serve as-is. If it's not zipped, then,
+ # if the http client supports gzip compression, gzip the file first
+ # and serve that
+ use_gzip = self.should_use_gzip()
+ if use_gzip:
+ file_to_download = self.gzip_filename
+ self.filesize = self.gzip_filesize
+ else:
+ file_to_download = self.download_filename
+ self.filesize = self.download_filesize
+
+ # Tell GUI the download started
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ self.web.add_request(
+ self.web.REQUEST_STARTED, path, {"id": history_id, "use_gzip": use_gzip}
+ )
+
+ basename = os.path.basename(self.download_filename)
+
+ def generate():
+ # Starting a new download
+ if self.web.settings.get("share", "autostop_sharing"):
+ self.download_in_progress = True
+
+ chunk_size = 102400 # 100kb
+
+ fp = open(file_to_download, "rb")
+ self.web.done = False
+ canceled = False
+ while not self.web.done:
+ # The user has canceled the download, so stop serving the file
+ if not self.web.stop_q.empty():
+ self.web.add_request(
+ self.web.REQUEST_CANCELED, path, {"id": history_id}
+ )
+ break
+
+ chunk = fp.read(chunk_size)
+ if chunk == b"":
+ self.web.done = True
+ else:
+ try:
+ yield chunk
+
+ # tell GUI the progress
+ downloaded_bytes = fp.tell()
+ percent = (1.0 * downloaded_bytes / self.filesize) * 100
+
+ # only output to stdout if running onionshare in CLI mode, or if using Linux (#203, #304)
+ if (
+ not self.web.is_gui
+ or self.common.platform == "Linux"
+ or self.common.platform == "BSD"
+ ):
+ sys.stdout.write(
+ "\r{0:s}, {1:.2f}% ".format(
+ self.common.human_readable_filesize(
+ downloaded_bytes
+ ),
+ percent,
+ )
+ )
+ sys.stdout.flush()
+
+ self.web.add_request(
+ self.web.REQUEST_PROGRESS,
+ path,
+ {"id": history_id, "bytes": downloaded_bytes},
+ )
+ self.web.done = False
+ except:
+ # looks like the download was canceled
+ self.web.done = True
+ canceled = True
+
+ # tell the GUI the download has canceled
+ self.web.add_request(
+ self.web.REQUEST_CANCELED, path, {"id": history_id}
+ )
+
+ fp.close()
+
+ if self.common.platform != "Darwin":
+ sys.stdout.write("\n")
+
+ # Download is finished
+ if self.web.settings.get("share", "autostop_sharing"):
+ self.download_in_progress = False
+
+ # Close the server, if necessary
+ if self.web.settings.get("share", "autostop_sharing") and not canceled:
+ print("Stopped because transfer is complete")
+ self.web.running = False
+ try:
+ if shutdown_func is None:
+ raise RuntimeError("Not running with the Werkzeug Server")
+ shutdown_func()
+ except:
+ pass
+
+ r = Response(generate())
+ if use_gzip:
+ r.headers.set("Content-Encoding", "gzip")
+ r.headers.set("Content-Length", self.filesize)
+ r.headers.set("Content-Disposition", "attachment", filename=basename)
+ r = self.web.add_security_headers(r)
+ # guess content type
+ (content_type, _) = mimetypes.guess_type(basename, strict=False)
+ if content_type is not None:
+ r.headers.set("Content-Type", content_type)
+ return r
+
+ def directory_listing_template(
+ self, path, files, dirs, breadcrumbs, breadcrumbs_leaf
+ ):
+ return make_response(
+ render_template(
+ "send.html",
+ file_info=self.file_info,
+ files=files,
+ dirs=dirs,
+ breadcrumbs=breadcrumbs,
+ breadcrumbs_leaf=breadcrumbs_leaf,
+ filename=os.path.basename(self.download_filename),
+ filesize=self.filesize,
+ filesize_human=self.common.human_readable_filesize(
+ self.download_filesize
+ ),
+ is_zipped=self.is_zipped,
+ static_url_path=self.web.static_url_path,
+ download_individual_files=self.download_individual_files,
+ )
+ )
+
+ def set_file_info_custom(self, filenames, processed_size_callback):
+ self.common.log("ShareModeWeb", "set_file_info_custom")
+ self.web.cancel_compression = False
+ self.build_zipfile_list(filenames, processed_size_callback)
+
+ def render_logic(self, path=""):
+ if path in self.files:
+ filesystem_path = self.files[path]
+
+ # If it's a directory
+ if os.path.isdir(filesystem_path):
+ # Render directory listing
+ filenames = []
+ for filename in os.listdir(filesystem_path):
+ if os.path.isdir(os.path.join(filesystem_path, filename)):
+ filenames.append(filename + "/")
+ else:
+ filenames.append(filename)
+ filenames.sort()
+ return self.directory_listing(filenames, path, filesystem_path)
+
+ # If it's a file
+ elif os.path.isfile(filesystem_path):
+ if self.download_individual_files:
+ return self.stream_individual_file(filesystem_path)
+ else:
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ return self.web.error404(history_id)
+
+ # If it's not a directory or file, throw a 404
+ else:
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ return self.web.error404(history_id)
+ else:
+ # Special case loading /
+
+ if path == "":
+ # Root directory listing
+ filenames = list(self.root_files)
+ filenames.sort()
+ return self.directory_listing(filenames, path)
+
+ else:
+ # If the path isn't found, throw a 404
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ return self.web.error404(history_id)
+
+ def build_zipfile_list(self, filenames, processed_size_callback=None):
+ self.common.log("ShareModeWeb", "build_zipfile_list")
+ for filename in filenames:
+ info = {
+ "filename": filename,
+ "basename": os.path.basename(filename.rstrip("/")),
+ }
+ if os.path.isfile(filename):
+ info["size"] = os.path.getsize(filename)
+ info["size_human"] = self.common.human_readable_filesize(info["size"])
+ self.file_info["files"].append(info)
+ if os.path.isdir(filename):
+ info["size"] = self.common.dir_size(filename)
+ info["size_human"] = self.common.human_readable_filesize(info["size"])
+ self.file_info["dirs"].append(info)
+ self.file_info["files"] = sorted(
+ self.file_info["files"], key=lambda k: k["basename"]
+ )
+ self.file_info["dirs"] = sorted(
+ self.file_info["dirs"], key=lambda k: k["basename"]
+ )
+
+ # Check if there's only 1 file and no folders
+ if len(self.file_info["files"]) == 1 and len(self.file_info["dirs"]) == 0:
+ self.download_filename = self.file_info["files"][0]["filename"]
+ self.download_filesize = self.file_info["files"][0]["size"]
+
+ # Compress the file with gzip now, so we don't have to do it on each request
+ self.gzip_filename = tempfile.mkstemp("wb+")[1]
+ self._gzip_compress(
+ self.download_filename, self.gzip_filename, 6, processed_size_callback
+ )
+ self.gzip_filesize = os.path.getsize(self.gzip_filename)
+
+ # Make sure the gzip file gets cleaned up when onionshare stops
+ self.cleanup_filenames.append(self.gzip_filename)
+
+ self.is_zipped = False
+
+ else:
+ # Zip up the files and folders
+ self.zip_writer = ZipWriter(
+ self.common, processed_size_callback=processed_size_callback
+ )
+ self.download_filename = self.zip_writer.zip_filename
+ for info in self.file_info["files"]:
+ self.zip_writer.add_file(info["filename"])
+ # Canceling early?
+ if self.web.cancel_compression:
+ self.zip_writer.close()
+ return False
+
+ for info in self.file_info["dirs"]:
+ if not self.zip_writer.add_dir(info["filename"]):
+ return False
+
+ self.zip_writer.close()
+ self.download_filesize = os.path.getsize(self.download_filename)
+
+ # Make sure the zip file gets cleaned up when onionshare stops
+ self.cleanup_filenames.append(self.zip_writer.zip_filename)
+
+ self.is_zipped = True
+
+ return True
+
+
+class ZipWriter(object):
+ """
+ ZipWriter accepts files and directories and compresses them into a zip file
+ with. If a zip_filename is not passed in, it will use the default onionshare
+ filename.
+ """
+
+ def __init__(self, common, zip_filename=None, processed_size_callback=None):
+ self.common = common
+ self.cancel_compression = False
+
+ if zip_filename:
+ self.zip_filename = zip_filename
+ else:
+ self.zip_filename = (
+ f"{tempfile.mkdtemp()}/onionshare_{self.common.random_string(4, 6)}.zip"
+ )
+
+ self.z = zipfile.ZipFile(self.zip_filename, "w", allowZip64=True)
+ self.processed_size_callback = processed_size_callback
+ if self.processed_size_callback is None:
+ self.processed_size_callback = lambda _: None
+ self._size = 0
+ self.processed_size_callback(self._size)
+
+ def add_file(self, filename):
+ """
+ Add a file to the zip archive.
+ """
+ self.z.write(filename, os.path.basename(filename), zipfile.ZIP_DEFLATED)
+ self._size += os.path.getsize(filename)
+ self.processed_size_callback(self._size)
+
+ def add_dir(self, filename):
+ """
+ Add a directory, and all of its children, to the zip archive.
+ """
+ dir_to_strip = os.path.dirname(filename.rstrip("/")) + "/"
+ for dirpath, dirnames, filenames in os.walk(filename):
+ for f in filenames:
+ # Canceling early?
+ if self.cancel_compression:
+ return False
+
+ full_filename = os.path.join(dirpath, f)
+ if not os.path.islink(full_filename):
+ arc_filename = full_filename[len(dir_to_strip) :]
+ self.z.write(full_filename, arc_filename, zipfile.ZIP_DEFLATED)
+ self._size += os.path.getsize(full_filename)
+ self.processed_size_callback(self._size)
+
+ return True
+
+ def close(self):
+ """
+ Close the zip archive.
+ """
+ self.z.close()
diff --git a/desktop/onionshare/web/web.py b/desktop/onionshare/web/web.py
new file mode 100644
index 00000000..117ea83a
--- /dev/null
+++ b/desktop/onionshare/web/web.py
@@ -0,0 +1,426 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import hmac
+import logging
+import os
+import queue
+import socket
+import sys
+import tempfile
+import requests
+from distutils.version import LooseVersion as Version
+from urllib.request import urlopen
+
+import flask
+from flask import (
+ Flask,
+ request,
+ render_template,
+ abort,
+ make_response,
+ send_file,
+ __version__ as flask_version,
+)
+from flask_httpauth import HTTPBasicAuth
+from flask_socketio import SocketIO
+
+from .. import strings
+
+from .share_mode import ShareModeWeb
+from .receive_mode import ReceiveModeWeb, ReceiveModeWSGIMiddleware, ReceiveModeRequest
+from .website_mode import WebsiteModeWeb
+from .chat_mode import ChatModeWeb
+
+# Stub out flask's show_server_banner function, to avoiding showing warnings that
+# are not applicable to OnionShare
+def stubbed_show_server_banner(env, debug, app_import_path, eager_loading):
+ pass
+
+
+try:
+ flask.cli.show_server_banner = stubbed_show_server_banner
+except:
+ pass
+
+
+class Web:
+ """
+ The Web object is the OnionShare web server, powered by flask
+ """
+
+ REQUEST_LOAD = 0
+ REQUEST_STARTED = 1
+ REQUEST_PROGRESS = 2
+ REQUEST_CANCELED = 3
+ REQUEST_RATE_LIMIT = 4
+ REQUEST_UPLOAD_FILE_RENAMED = 5
+ REQUEST_UPLOAD_SET_DIR = 6
+ REQUEST_UPLOAD_FINISHED = 7
+ REQUEST_UPLOAD_CANCELED = 8
+ REQUEST_INDIVIDUAL_FILE_STARTED = 9
+ REQUEST_INDIVIDUAL_FILE_PROGRESS = 10
+ REQUEST_INDIVIDUAL_FILE_CANCELED = 11
+ REQUEST_ERROR_DATA_DIR_CANNOT_CREATE = 12
+ REQUEST_OTHER = 13
+ REQUEST_INVALID_PASSWORD = 14
+
+ def __init__(self, common, is_gui, mode_settings, mode="share"):
+ self.common = common
+ self.common.log("Web", "__init__", f"is_gui={is_gui}, mode={mode}")
+
+ self.settings = mode_settings
+
+ # The flask app
+ self.app = Flask(
+ __name__,
+ static_folder=self.common.get_resource_path("static"),
+ static_url_path=f"/static_{self.common.random_string(16)}", # randomize static_url_path to avoid making /static unusable
+ template_folder=self.common.get_resource_path("templates"),
+ )
+ self.app.secret_key = self.common.random_string(8)
+ self.generate_static_url_path()
+ self.auth = HTTPBasicAuth()
+ self.auth.error_handler(self.error401)
+
+ # Verbose mode?
+ if self.common.verbose:
+ self.verbose_mode()
+
+ # Are we running in GUI mode?
+ self.is_gui = is_gui
+
+ # If the user stops the server while a transfer is in progress, it should
+ # immediately stop the transfer. In order to make it thread-safe, stop_q
+ # is a queue. If anything is in it, then the user stopped the server
+ self.stop_q = queue.Queue()
+
+ # Are we using receive mode?
+ self.mode = mode
+ if self.mode == "receive":
+ # Use custom WSGI middleware, to modify environ
+ self.app.wsgi_app = ReceiveModeWSGIMiddleware(self.app.wsgi_app, self)
+ # Use a custom Request class to track upload progess
+ self.app.request_class = ReceiveModeRequest
+
+ # Starting in Flask 0.11, render_template_string autoescapes template variables
+ # by default. To prevent content injection through template variables in
+ # earlier versions of Flask, we force autoescaping in the Jinja2 template
+ # engine if we detect a Flask version with insecure default behavior.
+ if Version(flask_version) < Version("0.11"):
+ # Monkey-patch in the fix from https://github.com/pallets/flask/commit/99c99c4c16b1327288fd76c44bc8635a1de452bc
+ Flask.select_jinja_autoescape = self._safe_select_jinja_autoescape
+
+ self.security_headers = [
+ ("X-Frame-Options", "DENY"),
+ ("X-Xss-Protection", "1; mode=block"),
+ ("X-Content-Type-Options", "nosniff"),
+ ("Referrer-Policy", "no-referrer"),
+ ("Server", "OnionShare"),
+ ]
+
+ self.q = queue.Queue()
+ self.password = None
+
+ self.reset_invalid_passwords()
+
+ self.done = False
+
+ # shutting down the server only works within the context of flask, so the easiest way to do it is over http
+ self.shutdown_password = self.common.random_string(16)
+
+ # Keep track if the server is running
+ self.running = False
+
+ # Define the web app routes
+ self.define_common_routes()
+
+ # Create the mode web object, which defines its own routes
+ self.share_mode = None
+ self.receive_mode = None
+ self.website_mode = None
+ self.chat_mode = None
+ if self.mode == "share":
+ self.share_mode = ShareModeWeb(self.common, self)
+ elif self.mode == "receive":
+ self.receive_mode = ReceiveModeWeb(self.common, self)
+ elif self.mode == "website":
+ self.website_mode = WebsiteModeWeb(self.common, self)
+ elif self.mode == "chat":
+ self.socketio = SocketIO()
+ self.socketio.init_app(self.app)
+ self.chat_mode = ChatModeWeb(self.common, self)
+
+ def get_mode(self):
+ if self.mode == "share":
+ return self.share_mode
+ elif self.mode == "receive":
+ return self.receive_mode
+ elif self.mode == "website":
+ return self.website_mode
+ elif self.mode == "chat":
+ return self.chat_mode
+ else:
+ return None
+
+ def generate_static_url_path(self):
+ # The static URL path has a 128-bit random number in it to avoid having name
+ # collisions with files that might be getting shared
+ self.static_url_path = f"/static_{self.common.random_string(16)}"
+ self.common.log(
+ "Web",
+ "generate_static_url_path",
+ f"new static_url_path is {self.static_url_path}",
+ )
+
+ # Update the flask route to handle the new static URL path
+ self.app.static_url_path = self.static_url_path
+ self.app.add_url_rule(
+ self.static_url_path + "/<path:filename>",
+ endpoint="static",
+ view_func=self.app.send_static_file,
+ )
+
+ def define_common_routes(self):
+ """
+ Common web app routes between all modes.
+ """
+
+ @self.auth.get_password
+ def get_pw(username):
+ if username == "onionshare":
+ return self.password
+ else:
+ return None
+
+ @self.app.before_request
+ def conditional_auth_check():
+ # Allow static files without basic authentication
+ if request.path.startswith(self.static_url_path + "/"):
+ return None
+
+ # If public mode is disabled, require authentication
+ if not self.settings.get("general", "public"):
+
+ @self.auth.login_required
+ def _check_login():
+ return None
+
+ return _check_login()
+
+ @self.app.errorhandler(404)
+ def not_found(e):
+ mode = self.get_mode()
+ history_id = mode.cur_history_id
+ mode.cur_history_id += 1
+ return self.error404(history_id)
+
+ @self.app.route("/<password_candidate>/shutdown")
+ def shutdown(password_candidate):
+ """
+ Stop the flask web server, from the context of an http request.
+ """
+ if password_candidate == self.shutdown_password:
+ self.force_shutdown()
+ return ""
+ abort(404)
+
+ if self.mode != "website":
+
+ @self.app.route("/favicon.ico")
+ def favicon():
+ return send_file(
+ f"{self.common.get_resource_path('static')}/img/favicon.ico"
+ )
+
+ def error401(self):
+ auth = request.authorization
+ if auth:
+ if (
+ auth["username"] == "onionshare"
+ and auth["password"] not in self.invalid_passwords
+ ):
+ print(f"Invalid password guess: {auth['password']}")
+ self.add_request(Web.REQUEST_INVALID_PASSWORD, data=auth["password"])
+
+ self.invalid_passwords.append(auth["password"])
+ self.invalid_passwords_count += 1
+
+ if self.invalid_passwords_count == 20:
+ self.add_request(Web.REQUEST_RATE_LIMIT)
+ self.force_shutdown()
+ print(
+ "Someone has made too many wrong attempts to guess your password, so OnionShare has stopped the server. Start sharing again and send the recipient a new address to share."
+ )
+
+ r = make_response(
+ render_template("401.html", static_url_path=self.static_url_path), 401
+ )
+ return self.add_security_headers(r)
+
+ def error403(self):
+ self.add_request(Web.REQUEST_OTHER, request.path)
+ r = make_response(
+ render_template("403.html", static_url_path=self.static_url_path), 403
+ )
+ return self.add_security_headers(r)
+
+ def error404(self, history_id):
+ self.add_request(
+ self.REQUEST_INDIVIDUAL_FILE_STARTED,
+ request.path,
+ {"id": history_id, "status_code": 404},
+ )
+
+ self.add_request(Web.REQUEST_OTHER, request.path)
+ r = make_response(
+ render_template("404.html", static_url_path=self.static_url_path), 404
+ )
+ return self.add_security_headers(r)
+
+ def error405(self, history_id):
+ self.add_request(
+ self.REQUEST_INDIVIDUAL_FILE_STARTED,
+ request.path,
+ {"id": history_id, "status_code": 405},
+ )
+
+ self.add_request(Web.REQUEST_OTHER, request.path)
+ r = make_response(
+ render_template("405.html", static_url_path=self.static_url_path), 405
+ )
+ return self.add_security_headers(r)
+
+ def add_security_headers(self, r):
+ """
+ Add security headers to a request
+ """
+ for header, value in self.security_headers:
+ r.headers.set(header, value)
+ # Set a CSP header unless in website mode and the user has disabled it
+ if not self.settings.get("website", "disable_csp") or self.mode != "website":
+ r.headers.set(
+ "Content-Security-Policy",
+ "default-src 'self'; style-src 'self'; script-src 'self'; img-src 'self' data:;",
+ )
+ return r
+
+ def _safe_select_jinja_autoescape(self, filename):
+ if filename is None:
+ return True
+ return filename.endswith((".html", ".htm", ".xml", ".xhtml"))
+
+ def add_request(self, request_type, path=None, data=None):
+ """
+ Add a request to the queue, to communicate with the GUI.
+ """
+ self.q.put({"type": request_type, "path": path, "data": data})
+
+ def generate_password(self, saved_password=None):
+ self.common.log("Web", "generate_password", f"saved_password={saved_password}")
+ if saved_password != None and saved_password != "":
+ self.password = saved_password
+ self.common.log(
+ "Web",
+ "generate_password",
+ f'saved_password sent, so password is: "{self.password}"',
+ )
+ else:
+ self.password = self.common.build_password()
+ self.common.log(
+ "Web", "generate_password", f'built random password: "{self.password}"'
+ )
+
+ def verbose_mode(self):
+ """
+ Turn on verbose mode, which will log flask errors to a file.
+ """
+ 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)
+
+ def reset_invalid_passwords(self):
+ self.invalid_passwords_count = 0
+ self.invalid_passwords = []
+
+ def force_shutdown(self):
+ """
+ Stop the flask web server, from the context of the flask app.
+ """
+ # Shutdown the flask service
+ try:
+ func = request.environ.get("werkzeug.server.shutdown")
+ if func is None:
+ raise RuntimeError("Not running with the Werkzeug Server")
+ func()
+ except:
+ pass
+ self.running = False
+
+ def start(self, port):
+ """
+ Start the flask web server.
+ """
+ self.common.log("Web", "start", f"port={port}")
+
+ # Make sure the stop_q is empty when starting a new server
+ while not self.stop_q.empty():
+ try:
+ self.stop_q.get(block=False)
+ except queue.Empty:
+ pass
+
+ # In Whonix, listen on 0.0.0.0 instead of 127.0.0.1 (#220)
+ if os.path.exists("/usr/share/anon-ws-base-files/workstation"):
+ host = "0.0.0.0"
+ else:
+ host = "127.0.0.1"
+
+ self.running = True
+ if self.mode == "chat":
+ self.socketio.run(self.app, host=host, port=port)
+ else:
+ self.app.run(host=host, port=port, threaded=True)
+
+ def stop(self, port):
+ """
+ Stop the flask web server by loading /shutdown.
+ """
+ self.common.log("Web", "stop", "stopping server")
+
+ # Let the mode know that the user stopped the server
+ self.stop_q.put(True)
+
+ # To stop flask, load http://shutdown:[shutdown_password]@127.0.0.1/[shutdown_password]/shutdown
+ # (We're putting the shutdown_password in the path as well to make routing simpler)
+ if self.running:
+ if self.password:
+ requests.get(
+ f"http://127.0.0.1:{port}/{self.shutdown_password}/shutdown",
+ auth=requests.auth.HTTPBasicAuth("onionshare", self.password),
+ )
+ else:
+ requests.get(
+ f"http://127.0.0.1:{port}/{self.shutdown_password}/shutdown"
+ )
+
+ # Reset any password that was in use
+ self.password = None
diff --git a/desktop/onionshare/web/website_mode.py b/desktop/onionshare/web/website_mode.py
new file mode 100644
index 00000000..2838fc05
--- /dev/null
+++ b/desktop/onionshare/web/website_mode.py
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+import sys
+import tempfile
+import mimetypes
+from flask import Response, request, render_template, make_response
+
+from .send_base_mode import SendBaseModeWeb
+from .. import strings
+
+
+class WebsiteModeWeb(SendBaseModeWeb):
+ """
+ All of the web logic for website mode
+ """
+
+ def init(self):
+ pass
+
+ def define_routes(self):
+ """
+ The web app routes for sharing a website
+ """
+
+ @self.web.app.route("/", defaults={"path": ""})
+ @self.web.app.route("/<path:path>")
+ def path_public(path):
+ return path_logic(path)
+
+ def path_logic(path=""):
+ """
+ Render the onionshare website.
+ """
+ return self.render_logic(path)
+
+ def directory_listing_template(
+ self, path, files, dirs, breadcrumbs, breadcrumbs_leaf
+ ):
+ return make_response(
+ render_template(
+ "listing.html",
+ path=path,
+ files=files,
+ dirs=dirs,
+ breadcrumbs=breadcrumbs,
+ breadcrumbs_leaf=breadcrumbs_leaf,
+ static_url_path=self.web.static_url_path,
+ )
+ )
+
+ def set_file_info_custom(self, filenames, processed_size_callback):
+ self.common.log("WebsiteModeWeb", "set_file_info_custom")
+ self.web.cancel_compression = True
+
+ def render_logic(self, path=""):
+ if path in self.files:
+ filesystem_path = self.files[path]
+
+ # If it's a directory
+ if os.path.isdir(filesystem_path):
+ # Is there an index.html?
+ index_path = os.path.join(path, "index.html")
+ if index_path in self.files:
+ # Render it
+ return self.stream_individual_file(self.files[index_path])
+
+ else:
+ # Otherwise, render directory listing
+ filenames = []
+ for filename in os.listdir(filesystem_path):
+ if os.path.isdir(os.path.join(filesystem_path, filename)):
+ filenames.append(filename + "/")
+ else:
+ filenames.append(filename)
+ filenames.sort()
+ return self.directory_listing(filenames, path, filesystem_path)
+
+ # If it's a file
+ elif os.path.isfile(filesystem_path):
+ return self.stream_individual_file(filesystem_path)
+
+ # If it's not a directory or file, throw a 404
+ else:
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ return self.web.error404(history_id)
+ else:
+ # Special case loading /
+
+ if path == "":
+ index_path = "index.html"
+ if index_path in self.files:
+ # Render it
+ return self.stream_individual_file(self.files[index_path])
+ else:
+ # Root directory listing
+ filenames = list(self.root_files)
+ filenames.sort()
+ return self.directory_listing(filenames, path)
+
+ else:
+ # If the path isn't found, throw a 404
+ history_id = self.cur_history_id
+ self.cur_history_id += 1
+ return self.web.error404(history_id)
diff --git a/desktop/onionshare_gui/__init__.py b/desktop/onionshare_gui/__init__.py
new file mode 100644
index 00000000..070d03a4
--- /dev/null
+++ b/desktop/onionshare_gui/__init__.py
@@ -0,0 +1,192 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from __future__ import division
+import os
+import sys
+import platform
+import argparse
+import signal
+import json
+import psutil
+import getpass
+from PyQt5 import QtCore, QtWidgets
+
+from onionshare.common import Common
+
+from .gui_common import GuiCommon
+from .widgets import Alert
+from .main_window import MainWindow
+
+
+class Application(QtWidgets.QApplication):
+ """
+ This is Qt's QApplication class. It has been overridden to support threads
+ and the quick keyboard shortcut.
+ """
+
+ def __init__(self, common):
+ if common.platform == "Linux" or common.platform == "BSD":
+ self.setAttribute(QtCore.Qt.AA_X11InitThreads, True)
+ QtWidgets.QApplication.__init__(self, sys.argv)
+ self.installEventFilter(self)
+
+ def eventFilter(self, obj, event):
+ if (
+ event.type() == QtCore.QEvent.KeyPress
+ and event.key() == QtCore.Qt.Key_Q
+ and event.modifiers() == QtCore.Qt.ControlModifier
+ ):
+ self.quit()
+ return False
+
+
+def main():
+ """
+ The main() function implements all of the logic that the GUI version of onionshare uses.
+ """
+ common = Common()
+
+ # Display OnionShare banner
+ print(f"OnionShare {common.version} | https://onionshare.org/")
+
+ # Start the Qt app
+ global qtapp
+ qtapp = Application(common)
+
+ # 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="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",
+ )
+ args = parser.parse_args()
+
+ filenames = args.filenames
+ if filenames:
+ for i in range(len(filenames)):
+ filenames[i] = os.path.abspath(filenames[i])
+
+ local_only = bool(args.local_only)
+ verbose = bool(args.verbose)
+
+ # Verbose mode?
+ common.verbose = verbose
+
+ # Attach the GUI common parts to the common object
+ common.gui = GuiCommon(common, qtapp, local_only)
+
+ # Validation
+ if filenames:
+ valid = True
+ for filename in filenames:
+ if not os.path.isfile(filename) and not os.path.isdir(filename):
+ Alert(common, f"{filename} is not a valid file.")
+ valid = False
+ if not os.access(filename, os.R_OK):
+ Alert(common, f"{filename} is not a readable file.")
+ valid = False
+ if not valid:
+ sys.exit()
+
+ # Is there another onionshare-gui running?
+ if os.path.exists(common.gui.lock_filename):
+ with open(common.gui.lock_filename, "r") as f:
+ existing_pid = int(f.read())
+
+ # Is this process actually still running?
+ still_running = True
+ if not psutil.pid_exists(existing_pid):
+ still_running = False
+ else:
+ for proc in psutil.process_iter(["pid", "name", "username"]):
+ if proc.pid == existing_pid:
+ if (
+ proc.username() != getpass.getuser()
+ or "onionshare" not in " ".join(proc.cmdline()).lower()
+ ):
+ still_running = False
+
+ if still_running:
+ print(f"Opening tab in existing OnionShare window (pid {existing_pid})")
+
+ # Make an event for the existing OnionShare window
+ if filenames:
+ obj = {"type": "new_share_tab", "filenames": filenames}
+ else:
+ obj = {"type": "new_tab"}
+
+ # Write that event to disk
+ with open(common.gui.events_filename, "a") as f:
+ f.write(json.dumps(obj) + "\n")
+ return
+ else:
+ os.remove(common.gui.lock_filename)
+
+ # Write the lock file
+ with open(common.gui.lock_filename, "w") as f:
+ f.write(f"{os.getpid()}\n")
+
+ # Allow Ctrl-C to smoothly quit the program instead of throwing an exception
+ def signal_handler(s, frame):
+ print("\nCtrl-C pressed, quitting")
+ if os.path.exists(common.gui.lock_filename):
+ os.remove(common.gui.lock_filename)
+ sys.exit(0)
+
+ signal.signal(signal.SIGINT, signal_handler)
+
+ # Launch the gui
+ main_window = MainWindow(common, filenames)
+
+ # If filenames were passed in, open them in a tab
+ if filenames:
+ main_window.tabs.new_share_tab(filenames)
+
+ # Clean up when app quits
+ def shutdown():
+ main_window.cleanup()
+ os.remove(common.gui.lock_filename)
+
+ qtapp.aboutToQuit.connect(shutdown)
+
+ # All done
+ sys.exit(qtapp.exec_())
+
+
+if __name__ == "__main__":
+ main()
diff --git a/desktop/onionshare_gui/gui_common.py b/desktop/onionshare_gui/gui_common.py
new file mode 100644
index 00000000..2e350cca
--- /dev/null
+++ b/desktop/onionshare_gui/gui_common.py
@@ -0,0 +1,329 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+
+from onionshare import strings
+from onionshare.onion import Onion
+
+
+class GuiCommon:
+ """
+ The shared code for all of the OnionShare GUI.
+ """
+
+ MODE_SHARE = "share"
+ MODE_RECEIVE = "receive"
+ MODE_WEBSITE = "website"
+ MODE_CHAT = "chat"
+
+ def __init__(self, common, qtapp, local_only):
+ self.common = common
+ self.qtapp = qtapp
+ self.local_only = local_only
+
+ # Are we running in a flatpak package?
+ self.is_flatpak = os.path.exists("/.flatpak-info")
+
+ # Load settings
+ self.common.load_settings()
+
+ # Load strings
+ strings.load_strings(self.common)
+
+ # Start the Onion
+ self.onion = Onion(common)
+
+ # Lock filename
+ self.lock_filename = os.path.join(self.common.build_data_dir(), "lock")
+
+ # Events filenames
+ self.events_dir = os.path.join(self.common.build_data_dir(), "events")
+ if not os.path.exists(self.events_dir):
+ os.makedirs(self.events_dir, 0o700, True)
+ self.events_filename = os.path.join(self.events_dir, "events")
+
+ self.css = {
+ # OnionShareGui styles
+ "tab_widget": """
+ QTabBar::tab { width: 170px; height: 30px; }
+ """,
+ "tab_widget_new_tab_button": """
+ QPushButton {
+ font-weight: bold;
+ font-size: 20px;
+ }""",
+ "mode_new_tab_button": """
+ QPushButton {
+ font-weight: bold;
+ font-size: 30px;
+ color: #601f61;
+ }""",
+ "mode_header_label": """
+ QLabel {
+ color: #4E064F;
+ font-size: 48px;
+ margin-bottom: 16px;
+ }""",
+ "settings_button": """
+ QPushButton {
+ border: 0;
+ border-radius: 0;
+ }""",
+ "server_status_indicator_label": """
+ QLabel {
+ font-style: italic;
+ color: #666666;
+ padding: 2px;
+ }""",
+ "status_bar": """
+ QStatusBar {
+ font-style: italic;
+ color: #666666;
+ }
+ QStatusBar::item {
+ border: 0px;
+ }""",
+ # Common styles between modes and their child widgets
+ "mode_settings_toggle_advanced": """
+ QPushButton {
+ color: #3f7fcf;
+ text-align: left;
+ }
+ """,
+ "mode_info_label": """
+ QLabel {
+ font-size: 12px;
+ color: #666666;
+ }
+ """,
+ "server_status_url": """
+ QLabel {
+ background-color: #ffffff;
+ color: #000000;
+ padding: 10px;
+ border: 1px solid #666666;
+ font-size: 12px;
+ }
+ """,
+ "server_status_url_buttons": """
+ QPushButton {
+ color: #3f7fcf;
+ }
+ """,
+ "server_status_button_stopped": """
+ QPushButton {
+ background-color: #5fa416;
+ color: #ffffff;
+ padding: 10px 30px 10px 30px;
+ border: 0;
+ border-radius: 5px;
+ }""",
+ "server_status_button_working": """
+ QPushButton {
+ background-color: #4c8211;
+ color: #ffffff;
+ padding: 10px 30px 10px 30px;
+ border: 0;
+ border-radius: 5px;
+ font-style: italic;
+ }""",
+ "server_status_button_started": """
+ QPushButton {
+ background-color: #d0011b;
+ color: #ffffff;
+ padding: 10px 30px 10px 30px;
+ border: 0;
+ border-radius: 5px;
+ }""",
+ "downloads_uploads_empty": """
+ QWidget {
+ background-color: #ffffff;
+ border: 1px solid #999999;
+ }
+ QWidget QLabel {
+ background-color: none;
+ border: 0px;
+ }
+ """,
+ "downloads_uploads_empty_text": """
+ QLabel {
+ color: #999999;
+ }""",
+ "downloads_uploads_label": """
+ QLabel {
+ font-weight: bold;
+ font-size 14px;
+ text-align: center;
+ background-color: none;
+ border: none;
+ }""",
+ "downloads_uploads_clear": """
+ QPushButton {
+ color: #3f7fcf;
+ }
+ """,
+ "download_uploads_indicator": """
+ QLabel {
+ color: #ffffff;
+ background-color: #f44449;
+ font-weight: bold;
+ font-size: 10px;
+ padding: 2px;
+ border-radius: 7px;
+ text-align: center;
+ }""",
+ "downloads_uploads_progress_bar": """
+ QProgressBar {
+ border: 1px solid #4e064f;
+ background-color: #ffffff !important;
+ text-align: center;
+ color: #9b9b9b;
+ font-size: 14px;
+ }
+ QProgressBar::chunk {
+ background-color: #4e064f;
+ width: 10px;
+ }""",
+ "history_individual_file_timestamp_label": """
+ QLabel {
+ color: #666666;
+ }""",
+ "history_individual_file_status_code_label_2xx": """
+ QLabel {
+ color: #008800;
+ }""",
+ "history_individual_file_status_code_label_4xx": """
+ QLabel {
+ color: #cc0000;
+ }""",
+ # New tab
+ "new_tab_button_image": """
+ QLabel {
+ padding: 30px;
+ text-align: center;
+ }
+ """,
+ "new_tab_button_text": """
+ QLabel {
+ border: 1px solid #efeff0;
+ border-radius: 4px;
+ background-color: #ffffff;
+ text-align: center;
+ color: #4e0d4e;
+ }
+ """,
+ "new_tab_title_text": """
+ QLabel {
+ text-align: center;
+ color: #333333;
+ font-size: 28px;
+ }
+ """,
+ # Share mode and child widget styles
+ "share_delete_all_files_button": """
+ QPushButton {
+ color: #3f7fcf;
+ }
+ """,
+ "share_zip_progess_bar": """
+ QProgressBar {
+ border: 1px solid #4e064f;
+ background-color: #ffffff !important;
+ text-align: center;
+ color: #9b9b9b;
+ }
+ QProgressBar::chunk {
+ border: 0px;
+ background-color: #4e064f;
+ width: 10px;
+ }""",
+ "share_filesize_warning": """
+ QLabel {
+ padding: 10px 0;
+ font-weight: bold;
+ color: #333333;
+ }
+ """,
+ "share_file_selection_drop_here_header_label": """
+ QLabel {
+ color: #4E064F;
+ font-size: 48px;
+ margin-bottom: 72px;
+ }""",
+ "share_file_selection_drop_here_label": """
+ QLabel {
+ color: #666666;
+ margin-bottom: 48px;
+ }""",
+ "share_file_selection_drop_count_label": """
+ QLabel {
+ color: #ffffff;
+ background-color: #f44449;
+ font-weight: bold;
+ padding: 5px 10px;
+ border-radius: 10px;
+ }""",
+ "share_file_list_drag_enter": """
+ FileList {
+ border: 3px solid #538ad0;
+ }
+ """,
+ "share_file_list_drag_leave": """
+ FileList {
+ border: none;
+ }
+ """,
+ "share_file_list_item_size": """
+ QLabel {
+ color: #666666;
+ font-size: 11px;
+ }""",
+ # Receive mode and child widget styles
+ "receive_file": """
+ QWidget {
+ background-color: #ffffff;
+ }
+ """,
+ "receive_file_size": """
+ QLabel {
+ color: #666666;
+ font-size: 11px;
+ }""",
+ # Settings dialog
+ "settings_version": """
+ QLabel {
+ color: #666666;
+ }""",
+ "settings_tor_status": """
+ QLabel {
+ background-color: #ffffff;
+ color: #000000;
+ padding: 10px;
+ }""",
+ "settings_whats_this": """
+ QLabel {
+ font-size: 12px;
+ }""",
+ "settings_connect_to_tor": """
+ QLabel {
+ font-style: italic;
+ }""",
+ }
diff --git a/desktop/onionshare_gui/main_window.py b/desktop/onionshare_gui/main_window.py
new file mode 100644
index 00000000..6bd84b8a
--- /dev/null
+++ b/desktop/onionshare_gui/main_window.py
@@ -0,0 +1,289 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.web import Web
+
+from .tor_connection_dialog import TorConnectionDialog
+from .settings_dialog import SettingsDialog
+from .widgets import Alert
+from .update_checker import UpdateThread
+from .tab_widget import TabWidget
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ """
+ MainWindow is the OnionShare main window, which contains the GUI elements, including all open tabs
+ """
+
+ def __init__(self, common, filenames):
+ super(MainWindow, self).__init__()
+
+ self.common = common
+ self.common.log("MainWindow", "__init__")
+
+ # Initialize the window
+ self.setMinimumWidth(1040)
+ self.setMinimumHeight(700)
+ self.setWindowTitle("OnionShare")
+ self.setWindowIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+
+ # System tray
+ menu = QtWidgets.QMenu()
+ self.settings_action = menu.addAction(strings._("gui_settings_window_title"))
+ self.settings_action.triggered.connect(self.open_settings)
+ 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)
+
+ self.system_tray = QtWidgets.QSystemTrayIcon(self)
+
+ # The convention is Mac systray icons are always grayscale
+ if self.common.platform == "Darwin":
+ self.system_tray.setIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo_grayscale.png"))
+ )
+ else:
+ self.system_tray.setIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+ self.system_tray.setContextMenu(menu)
+ self.system_tray.show()
+
+ # Status bar
+ self.status_bar = QtWidgets.QStatusBar()
+ self.status_bar.setSizeGripEnabled(False)
+ self.status_bar.setStyleSheet(self.common.gui.css["status_bar"])
+ self.setStatusBar(self.status_bar)
+
+ # Server status indicator icons
+ self.status_bar.server_status_image_stopped = QtGui.QImage(
+ self.common.get_resource_path("images/server_stopped.png")
+ )
+ self.status_bar.server_status_image_working = QtGui.QImage(
+ self.common.get_resource_path("images/server_working.png")
+ )
+ self.status_bar.server_status_image_started = QtGui.QImage(
+ self.common.get_resource_path("images/server_started.png")
+ )
+
+ # Server status indicator on the status bar
+ self.status_bar.server_status_image_label = QtWidgets.QLabel()
+ self.status_bar.server_status_image_label.setFixedWidth(20)
+ self.status_bar.server_status_label = QtWidgets.QLabel("")
+ self.status_bar.server_status_label.setStyleSheet(
+ self.common.gui.css["server_status_indicator_label"]
+ )
+ server_status_indicator_layout = QtWidgets.QHBoxLayout()
+ server_status_indicator_layout.addWidget(
+ self.status_bar.server_status_image_label
+ )
+ server_status_indicator_layout.addWidget(self.status_bar.server_status_label)
+ self.status_bar.server_status_indicator = QtWidgets.QWidget()
+ self.status_bar.server_status_indicator.setLayout(
+ server_status_indicator_layout
+ )
+ self.status_bar.addPermanentWidget(self.status_bar.server_status_indicator)
+
+ # Settings button
+ self.settings_button = QtWidgets.QPushButton()
+ self.settings_button.setDefault(False)
+ self.settings_button.setFixedSize(40, 50)
+ self.settings_button.setIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/settings.png"))
+ )
+ self.settings_button.clicked.connect(self.open_settings)
+ self.settings_button.setStyleSheet(self.common.gui.css["settings_button"])
+ self.status_bar.addPermanentWidget(self.settings_button)
+
+ # Tabs
+ self.tabs = TabWidget(self.common, self.system_tray, self.status_bar)
+ self.tabs.bring_to_front.connect(self.bring_to_front)
+
+ # If we have saved persistent tabs, try opening those
+ if len(self.common.settings.get("persistent_tabs")) > 0:
+ for mode_settings_id in self.common.settings.get("persistent_tabs"):
+ self.tabs.load_tab(mode_settings_id)
+ else:
+ # Start with opening the first tab
+ self.tabs.new_tab_clicked()
+
+ # Layout
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(self.tabs)
+
+ central_widget = QtWidgets.QWidget()
+ central_widget.setLayout(layout)
+ self.setCentralWidget(central_widget)
+ self.show()
+
+ # Start the "Connecting to Tor" dialog, which calls onion.connect()
+ tor_con = TorConnectionDialog(self.common)
+ tor_con.canceled.connect(self.tor_connection_canceled)
+ tor_con.open_settings.connect(self.tor_connection_open_settings)
+ if not self.common.gui.local_only:
+ tor_con.start()
+ self.settings_have_changed()
+
+ # After connecting to Tor, check for updates
+ self.check_for_updates()
+
+ # Create the close warning dialog -- the dialog widget needs to be in the constructor
+ # in order to test it
+ self.close_dialog = QtWidgets.QMessageBox()
+ self.close_dialog.setWindowTitle(strings._("gui_quit_warning_title"))
+ self.close_dialog.setText(strings._("gui_quit_warning_description"))
+ self.close_dialog.setIcon(QtWidgets.QMessageBox.Critical)
+ self.close_dialog.accept_button = self.close_dialog.addButton(
+ strings._("gui_quit_warning_quit"), QtWidgets.QMessageBox.AcceptRole
+ )
+ self.close_dialog.reject_button = self.close_dialog.addButton(
+ strings._("gui_quit_warning_cancel"), QtWidgets.QMessageBox.NoRole
+ )
+ self.close_dialog.setDefaultButton(self.close_dialog.reject_button)
+
+ def tor_connection_canceled(self):
+ """
+ If the user cancels before Tor finishes connecting, ask if they want to
+ quit, or open settings.
+ """
+ self.common.log("MainWindow", "tor_connection_canceled")
+
+ def ask():
+ a = Alert(
+ self.common,
+ strings._("gui_tor_connection_ask"),
+ QtWidgets.QMessageBox.Question,
+ buttons=QtWidgets.QMessageBox.NoButton,
+ autostart=False,
+ )
+ settings_button = QtWidgets.QPushButton(
+ strings._("gui_tor_connection_ask_open_settings")
+ )
+ quit_button = QtWidgets.QPushButton(
+ strings._("gui_tor_connection_ask_quit")
+ )
+ a.addButton(settings_button, QtWidgets.QMessageBox.AcceptRole)
+ a.addButton(quit_button, QtWidgets.QMessageBox.RejectRole)
+ a.setDefaultButton(settings_button)
+ a.exec_()
+
+ if a.clickedButton() == settings_button:
+ # Open settings
+ self.common.log(
+ "OnionShareGui",
+ "_tor_connection_canceled",
+ "Settings button clicked",
+ )
+ self.open_settings()
+
+ if a.clickedButton() == quit_button:
+ # Quit
+ self.common.log(
+ "OnionShareGui", "_tor_connection_canceled", "Quit button clicked"
+ )
+
+ # Wait 1ms for the event loop to finish, then quit
+ QtCore.QTimer.singleShot(1, self.common.gui.qtapp.quit)
+
+ # Wait 100ms before asking
+ QtCore.QTimer.singleShot(100, ask)
+
+ def tor_connection_open_settings(self):
+ """
+ The TorConnectionDialog wants to open the Settings dialog
+ """
+ self.common.log("MainWindow", "tor_connection_open_settings")
+
+ # Wait 1ms for the event loop to finish closing the TorConnectionDialog
+ QtCore.QTimer.singleShot(1, self.open_settings)
+
+ def open_settings(self):
+ """
+ Open the SettingsDialog.
+ """
+ self.common.log("MainWindow", "open_settings")
+ d = SettingsDialog(self.common)
+ d.settings_saved.connect(self.settings_have_changed)
+ d.exec_()
+
+ def settings_have_changed(self):
+ self.common.log("OnionShareGui", "settings_have_changed")
+
+ if self.common.gui.onion.is_authenticated():
+ self.status_bar.clearMessage()
+
+ # Tell each tab that settings have changed
+ for index in range(self.tabs.count()):
+ tab = self.tabs.widget(index)
+ tab.settings_have_changed()
+
+ def check_for_updates(self):
+ """
+ Check for updates in a new thread, if enabled.
+ """
+ if self.common.platform == "Windows" or self.common.platform == "Darwin":
+ if self.common.settings.get("use_autoupdate"):
+
+ def update_available(update_url, installed_version, latest_version):
+ Alert(
+ self.common,
+ strings._("update_available").format(
+ update_url, installed_version, latest_version
+ ),
+ )
+
+ self.update_thread = UpdateThread(self.common, self.common.gui.onion)
+ self.update_thread.update_available.connect(update_available)
+ self.update_thread.start()
+
+ def bring_to_front(self):
+ self.common.log("MainWindow", "bring_to_front")
+ self.raise_()
+ self.activateWindow()
+
+ def closeEvent(self, e):
+ self.common.log("MainWindow", "closeEvent")
+
+ if self.tabs.are_tabs_active():
+ # Open the warning dialog
+ self.common.log("MainWindow", "closeEvent, opening warning dialog")
+ self.close_dialog.exec_()
+
+ # Close
+ if self.close_dialog.clickedButton() == self.close_dialog.accept_button:
+ self.system_tray.hide()
+ e.accept()
+ # Cancel
+ else:
+ e.ignore()
+ return
+
+ self.system_tray.hide()
+ e.accept()
+
+ def cleanup(self):
+ self.tabs.cleanup()
+ self.common.gui.onion.cleanup()
diff --git a/desktop/onionshare_gui/settings_dialog.py b/desktop/onionshare_gui/settings_dialog.py
new file mode 100644
index 00000000..dd711e59
--- /dev/null
+++ b/desktop/onionshare_gui/settings_dialog.py
@@ -0,0 +1,1056 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+import sys
+import platform
+import datetime
+import re
+import os
+
+from onionshare import strings, common
+from onionshare.settings import Settings
+from onionshare.onion import *
+
+from .widgets import Alert
+from .update_checker import *
+from .tor_connection_dialog import TorConnectionDialog
+
+
+class SettingsDialog(QtWidgets.QDialog):
+ """
+ Settings dialog.
+ """
+
+ settings_saved = QtCore.pyqtSignal()
+
+ def __init__(self, common):
+ super(SettingsDialog, self).__init__()
+
+ self.common = common
+
+ self.common.log("SettingsDialog", "__init__")
+
+ self.setModal(True)
+ self.setWindowTitle(strings._("gui_settings_window_title"))
+ self.setWindowIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+
+ self.system = platform.system()
+
+ # If ONIONSHARE_HIDE_TOR_SETTINGS=1, hide Tor settings in the dialog
+ self.hide_tor_settings = os.environ.get("ONIONSHARE_HIDE_TOR_SETTINGS") == "1"
+
+ # Automatic updates options
+
+ # Autoupdate
+ self.autoupdate_checkbox = QtWidgets.QCheckBox()
+ self.autoupdate_checkbox.setCheckState(QtCore.Qt.Unchecked)
+ self.autoupdate_checkbox.setText(strings._("gui_settings_autoupdate_option"))
+
+ # Last update time
+ self.autoupdate_timestamp = QtWidgets.QLabel()
+
+ # Check for updates button
+ self.check_for_updates_button = QtWidgets.QPushButton(
+ strings._("gui_settings_autoupdate_check_button")
+ )
+ self.check_for_updates_button.clicked.connect(self.check_for_updates)
+ # We can't check for updates if not connected to Tor
+ if not self.common.gui.onion.connected_to_tor:
+ self.check_for_updates_button.setEnabled(False)
+
+ # Autoupdate options layout
+ autoupdate_group_layout = QtWidgets.QVBoxLayout()
+ autoupdate_group_layout.addWidget(self.autoupdate_checkbox)
+ autoupdate_group_layout.addWidget(self.autoupdate_timestamp)
+ autoupdate_group_layout.addWidget(self.check_for_updates_button)
+ autoupdate_group = QtWidgets.QGroupBox(
+ strings._("gui_settings_autoupdate_label")
+ )
+ autoupdate_group.setLayout(autoupdate_group_layout)
+
+ # Autoupdate is only available for Windows and Mac (Linux updates using package manager)
+ if self.system != "Windows" and self.system != "Darwin":
+ autoupdate_group.hide()
+
+ # Language settings
+ language_label = QtWidgets.QLabel(strings._("gui_settings_language_label"))
+ self.language_combobox = QtWidgets.QComboBox()
+ # Populate the dropdown with all of OnionShare's available languages
+ language_names_to_locales = {
+ v: k for k, v in self.common.settings.available_locales.items()
+ }
+ language_names = list(language_names_to_locales)
+ language_names.sort()
+ for language_name in language_names:
+ locale = language_names_to_locales[language_name]
+ self.language_combobox.addItem(language_name, QtCore.QVariant(locale))
+ language_layout = QtWidgets.QHBoxLayout()
+ language_layout.addWidget(language_label)
+ language_layout.addWidget(self.language_combobox)
+ language_layout.addStretch()
+
+ # Connection type: either automatic, control port, or socket file
+
+ # Bundled Tor
+ self.connection_type_bundled_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_connection_type_bundled_option")
+ )
+ self.connection_type_bundled_radio.toggled.connect(
+ self.connection_type_bundled_toggled
+ )
+
+ # Bundled Tor doesn't work on dev mode in Windows or Mac
+ if (self.system == "Windows" or self.system == "Darwin") and getattr(
+ sys, "onionshare_dev_mode", False
+ ):
+ self.connection_type_bundled_radio.setEnabled(False)
+
+ # Bridge options for bundled tor
+
+ # No bridges option radio
+ self.tor_bridges_no_bridges_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_tor_bridges_no_bridges_radio_option")
+ )
+ self.tor_bridges_no_bridges_radio.toggled.connect(
+ self.tor_bridges_no_bridges_radio_toggled
+ )
+
+ # obfs4 option radio
+ # if the obfs4proxy binary is missing, we can't use obfs4 transports
+ (
+ self.tor_path,
+ self.tor_geo_ip_file_path,
+ self.tor_geo_ipv6_file_path,
+ self.obfs4proxy_file_path,
+ ) = self.common.get_tor_paths()
+ if not self.obfs4proxy_file_path or not os.path.isfile(
+ self.obfs4proxy_file_path
+ ):
+ self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy")
+ )
+ self.tor_bridges_use_obfs4_radio.setEnabled(False)
+ else:
+ self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_tor_bridges_obfs4_radio_option")
+ )
+ self.tor_bridges_use_obfs4_radio.toggled.connect(
+ self.tor_bridges_use_obfs4_radio_toggled
+ )
+
+ # meek_lite-azure option radio
+ # if the obfs4proxy binary is missing, we can't use meek_lite-azure transports
+ (
+ self.tor_path,
+ self.tor_geo_ip_file_path,
+ self.tor_geo_ipv6_file_path,
+ self.obfs4proxy_file_path,
+ ) = self.common.get_tor_paths()
+ if not self.obfs4proxy_file_path or not os.path.isfile(
+ self.obfs4proxy_file_path
+ ):
+ self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton(
+ strings._(
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy"
+ )
+ )
+ self.tor_bridges_use_meek_lite_azure_radio.setEnabled(False)
+ else:
+ self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_tor_bridges_meek_lite_azure_radio_option")
+ )
+ self.tor_bridges_use_meek_lite_azure_radio.toggled.connect(
+ self.tor_bridges_use_meek_lite_azure_radio_toggled
+ )
+
+ # Custom bridges radio and textbox
+ self.tor_bridges_use_custom_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_tor_bridges_custom_radio_option")
+ )
+ self.tor_bridges_use_custom_radio.toggled.connect(
+ self.tor_bridges_use_custom_radio_toggled
+ )
+
+ self.tor_bridges_use_custom_label = QtWidgets.QLabel(
+ strings._("gui_settings_tor_bridges_custom_label")
+ )
+ self.tor_bridges_use_custom_label.setTextInteractionFlags(
+ QtCore.Qt.TextBrowserInteraction
+ )
+ self.tor_bridges_use_custom_label.setOpenExternalLinks(True)
+ self.tor_bridges_use_custom_textbox = QtWidgets.QPlainTextEdit()
+ self.tor_bridges_use_custom_textbox.setMaximumHeight(200)
+ self.tor_bridges_use_custom_textbox.setPlaceholderText(
+ "[address:port] [identifier]"
+ )
+
+ tor_bridges_use_custom_textbox_options_layout = QtWidgets.QVBoxLayout()
+ tor_bridges_use_custom_textbox_options_layout.addWidget(
+ self.tor_bridges_use_custom_label
+ )
+ tor_bridges_use_custom_textbox_options_layout.addWidget(
+ self.tor_bridges_use_custom_textbox
+ )
+
+ self.tor_bridges_use_custom_textbox_options = QtWidgets.QWidget()
+ self.tor_bridges_use_custom_textbox_options.setLayout(
+ tor_bridges_use_custom_textbox_options_layout
+ )
+ self.tor_bridges_use_custom_textbox_options.hide()
+
+ # Bridges layout/widget
+ bridges_layout = QtWidgets.QVBoxLayout()
+ bridges_layout.addWidget(self.tor_bridges_no_bridges_radio)
+ bridges_layout.addWidget(self.tor_bridges_use_obfs4_radio)
+ bridges_layout.addWidget(self.tor_bridges_use_meek_lite_azure_radio)
+ bridges_layout.addWidget(self.tor_bridges_use_custom_radio)
+ bridges_layout.addWidget(self.tor_bridges_use_custom_textbox_options)
+
+ self.bridges = QtWidgets.QWidget()
+ self.bridges.setLayout(bridges_layout)
+
+ # Automatic
+ self.connection_type_automatic_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_connection_type_automatic_option")
+ )
+ self.connection_type_automatic_radio.toggled.connect(
+ self.connection_type_automatic_toggled
+ )
+
+ # Control port
+ self.connection_type_control_port_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_connection_type_control_port_option")
+ )
+ self.connection_type_control_port_radio.toggled.connect(
+ self.connection_type_control_port_toggled
+ )
+
+ connection_type_control_port_extras_label = QtWidgets.QLabel(
+ strings._("gui_settings_control_port_label")
+ )
+ self.connection_type_control_port_extras_address = QtWidgets.QLineEdit()
+ self.connection_type_control_port_extras_port = QtWidgets.QLineEdit()
+ connection_type_control_port_extras_layout = QtWidgets.QHBoxLayout()
+ connection_type_control_port_extras_layout.addWidget(
+ connection_type_control_port_extras_label
+ )
+ connection_type_control_port_extras_layout.addWidget(
+ self.connection_type_control_port_extras_address
+ )
+ connection_type_control_port_extras_layout.addWidget(
+ self.connection_type_control_port_extras_port
+ )
+
+ self.connection_type_control_port_extras = QtWidgets.QWidget()
+ self.connection_type_control_port_extras.setLayout(
+ connection_type_control_port_extras_layout
+ )
+ self.connection_type_control_port_extras.hide()
+
+ # Socket file
+ self.connection_type_socket_file_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_connection_type_socket_file_option")
+ )
+ self.connection_type_socket_file_radio.toggled.connect(
+ self.connection_type_socket_file_toggled
+ )
+
+ connection_type_socket_file_extras_label = QtWidgets.QLabel(
+ strings._("gui_settings_socket_file_label")
+ )
+ self.connection_type_socket_file_extras_path = QtWidgets.QLineEdit()
+ connection_type_socket_file_extras_layout = QtWidgets.QHBoxLayout()
+ connection_type_socket_file_extras_layout.addWidget(
+ connection_type_socket_file_extras_label
+ )
+ connection_type_socket_file_extras_layout.addWidget(
+ self.connection_type_socket_file_extras_path
+ )
+
+ self.connection_type_socket_file_extras = QtWidgets.QWidget()
+ self.connection_type_socket_file_extras.setLayout(
+ connection_type_socket_file_extras_layout
+ )
+ self.connection_type_socket_file_extras.hide()
+
+ # Tor SOCKS address and port
+ gui_settings_socks_label = QtWidgets.QLabel(
+ strings._("gui_settings_socks_label")
+ )
+ self.connection_type_socks_address = QtWidgets.QLineEdit()
+ self.connection_type_socks_port = QtWidgets.QLineEdit()
+ connection_type_socks_layout = QtWidgets.QHBoxLayout()
+ connection_type_socks_layout.addWidget(gui_settings_socks_label)
+ connection_type_socks_layout.addWidget(self.connection_type_socks_address)
+ connection_type_socks_layout.addWidget(self.connection_type_socks_port)
+
+ self.connection_type_socks = QtWidgets.QWidget()
+ self.connection_type_socks.setLayout(connection_type_socks_layout)
+ self.connection_type_socks.hide()
+
+ # Authentication options
+
+ # No authentication
+ self.authenticate_no_auth_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_authenticate_no_auth_option")
+ )
+ self.authenticate_no_auth_radio.toggled.connect(
+ self.authenticate_no_auth_toggled
+ )
+
+ # Password
+ self.authenticate_password_radio = QtWidgets.QRadioButton(
+ strings._("gui_settings_authenticate_password_option")
+ )
+ self.authenticate_password_radio.toggled.connect(
+ self.authenticate_password_toggled
+ )
+
+ authenticate_password_extras_label = QtWidgets.QLabel(
+ strings._("gui_settings_password_label")
+ )
+ self.authenticate_password_extras_password = QtWidgets.QLineEdit("")
+ authenticate_password_extras_layout = QtWidgets.QHBoxLayout()
+ authenticate_password_extras_layout.addWidget(
+ authenticate_password_extras_label
+ )
+ authenticate_password_extras_layout.addWidget(
+ self.authenticate_password_extras_password
+ )
+
+ self.authenticate_password_extras = QtWidgets.QWidget()
+ self.authenticate_password_extras.setLayout(authenticate_password_extras_layout)
+ self.authenticate_password_extras.hide()
+
+ # Authentication options layout
+ authenticate_group_layout = QtWidgets.QVBoxLayout()
+ authenticate_group_layout.addWidget(self.authenticate_no_auth_radio)
+ authenticate_group_layout.addWidget(self.authenticate_password_radio)
+ authenticate_group_layout.addWidget(self.authenticate_password_extras)
+ self.authenticate_group = QtWidgets.QGroupBox(
+ strings._("gui_settings_authenticate_label")
+ )
+ self.authenticate_group.setLayout(authenticate_group_layout)
+
+ # Put the radios into their own group so they are exclusive
+ connection_type_radio_group_layout = QtWidgets.QVBoxLayout()
+ connection_type_radio_group_layout.addWidget(self.connection_type_bundled_radio)
+ connection_type_radio_group_layout.addWidget(
+ self.connection_type_automatic_radio
+ )
+ connection_type_radio_group_layout.addWidget(
+ self.connection_type_control_port_radio
+ )
+ connection_type_radio_group_layout.addWidget(
+ self.connection_type_socket_file_radio
+ )
+ connection_type_radio_group = QtWidgets.QGroupBox(
+ strings._("gui_settings_connection_type_label")
+ )
+ connection_type_radio_group.setLayout(connection_type_radio_group_layout)
+
+ # The Bridges options are not exclusive (enabling Bridges offers obfs4 or custom bridges)
+ connection_type_bridges_radio_group_layout = QtWidgets.QVBoxLayout()
+ connection_type_bridges_radio_group_layout.addWidget(self.bridges)
+ self.connection_type_bridges_radio_group = QtWidgets.QGroupBox(
+ strings._("gui_settings_tor_bridges")
+ )
+ self.connection_type_bridges_radio_group.setLayout(
+ connection_type_bridges_radio_group_layout
+ )
+ self.connection_type_bridges_radio_group.hide()
+
+ # Test tor settings button
+ self.connection_type_test_button = QtWidgets.QPushButton(
+ strings._("gui_settings_connection_type_test_button")
+ )
+ self.connection_type_test_button.clicked.connect(self.test_tor_clicked)
+ connection_type_test_button_layout = QtWidgets.QHBoxLayout()
+ connection_type_test_button_layout.addWidget(self.connection_type_test_button)
+ connection_type_test_button_layout.addStretch()
+
+ # Connection type layout
+ connection_type_layout = QtWidgets.QVBoxLayout()
+ connection_type_layout.addWidget(self.connection_type_control_port_extras)
+ connection_type_layout.addWidget(self.connection_type_socket_file_extras)
+ connection_type_layout.addWidget(self.connection_type_socks)
+ connection_type_layout.addWidget(self.authenticate_group)
+ connection_type_layout.addWidget(self.connection_type_bridges_radio_group)
+ connection_type_layout.addLayout(connection_type_test_button_layout)
+
+ # Buttons
+ self.save_button = QtWidgets.QPushButton(strings._("gui_settings_button_save"))
+ self.save_button.clicked.connect(self.save_clicked)
+ self.cancel_button = QtWidgets.QPushButton(
+ strings._("gui_settings_button_cancel")
+ )
+ self.cancel_button.clicked.connect(self.cancel_clicked)
+ version_label = QtWidgets.QLabel(f"OnionShare {self.common.version}")
+ version_label.setStyleSheet(self.common.gui.css["settings_version"])
+ self.help_button = QtWidgets.QPushButton(strings._("gui_settings_button_help"))
+ self.help_button.clicked.connect(self.help_clicked)
+ buttons_layout = QtWidgets.QHBoxLayout()
+ buttons_layout.addWidget(version_label)
+ buttons_layout.addWidget(self.help_button)
+ buttons_layout.addStretch()
+ buttons_layout.addWidget(self.save_button)
+ buttons_layout.addWidget(self.cancel_button)
+
+ # Tor network connection status
+ self.tor_status = QtWidgets.QLabel()
+ self.tor_status.setStyleSheet(self.common.gui.css["settings_tor_status"])
+ self.tor_status.hide()
+
+ # Layout
+ tor_layout = QtWidgets.QVBoxLayout()
+ tor_layout.addWidget(connection_type_radio_group)
+ tor_layout.addLayout(connection_type_layout)
+ tor_layout.addWidget(self.tor_status)
+ tor_layout.addStretch()
+
+ layout = QtWidgets.QVBoxLayout()
+ if not self.hide_tor_settings:
+ layout.addLayout(tor_layout)
+ layout.addSpacing(20)
+ layout.addWidget(autoupdate_group)
+ if autoupdate_group.isVisible():
+ layout.addSpacing(20)
+ layout.addLayout(language_layout)
+ layout.addSpacing(20)
+ layout.addStretch()
+ layout.addLayout(buttons_layout)
+
+ self.setLayout(layout)
+ self.cancel_button.setFocus()
+
+ self.reload_settings()
+
+ def reload_settings(self):
+ # Load settings, and fill them in
+ self.old_settings = Settings(self.common)
+ self.old_settings.load()
+
+ use_autoupdate = self.old_settings.get("use_autoupdate")
+ if use_autoupdate:
+ self.autoupdate_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.autoupdate_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ autoupdate_timestamp = self.old_settings.get("autoupdate_timestamp")
+ self._update_autoupdate_timestamp(autoupdate_timestamp)
+
+ locale = self.old_settings.get("locale")
+ locale_index = self.language_combobox.findData(QtCore.QVariant(locale))
+ self.language_combobox.setCurrentIndex(locale_index)
+
+ connection_type = self.old_settings.get("connection_type")
+ if connection_type == "bundled":
+ if self.connection_type_bundled_radio.isEnabled():
+ self.connection_type_bundled_radio.setChecked(True)
+ else:
+ # If bundled tor is disabled, fallback to automatic
+ self.connection_type_automatic_radio.setChecked(True)
+ elif connection_type == "automatic":
+ self.connection_type_automatic_radio.setChecked(True)
+ elif connection_type == "control_port":
+ self.connection_type_control_port_radio.setChecked(True)
+ elif connection_type == "socket_file":
+ self.connection_type_socket_file_radio.setChecked(True)
+ self.connection_type_control_port_extras_address.setText(
+ self.old_settings.get("control_port_address")
+ )
+ self.connection_type_control_port_extras_port.setText(
+ str(self.old_settings.get("control_port_port"))
+ )
+ self.connection_type_socket_file_extras_path.setText(
+ self.old_settings.get("socket_file_path")
+ )
+ self.connection_type_socks_address.setText(
+ self.old_settings.get("socks_address")
+ )
+ self.connection_type_socks_port.setText(
+ str(self.old_settings.get("socks_port"))
+ )
+ auth_type = self.old_settings.get("auth_type")
+ if auth_type == "no_auth":
+ self.authenticate_no_auth_radio.setChecked(True)
+ elif auth_type == "password":
+ self.authenticate_password_radio.setChecked(True)
+ self.authenticate_password_extras_password.setText(
+ self.old_settings.get("auth_password")
+ )
+
+ if self.old_settings.get("no_bridges"):
+ self.tor_bridges_no_bridges_radio.setChecked(True)
+ self.tor_bridges_use_obfs4_radio.setChecked(False)
+ self.tor_bridges_use_meek_lite_azure_radio.setChecked(False)
+ self.tor_bridges_use_custom_radio.setChecked(False)
+ else:
+ self.tor_bridges_no_bridges_radio.setChecked(False)
+ self.tor_bridges_use_obfs4_radio.setChecked(
+ self.old_settings.get("tor_bridges_use_obfs4")
+ )
+ self.tor_bridges_use_meek_lite_azure_radio.setChecked(
+ self.old_settings.get("tor_bridges_use_meek_lite_azure")
+ )
+
+ if self.old_settings.get("tor_bridges_use_custom_bridges"):
+ self.tor_bridges_use_custom_radio.setChecked(True)
+ # Remove the 'Bridge' lines at the start of each bridge.
+ # They are added automatically to provide compatibility with
+ # copying/pasting bridges provided from https://bridges.torproject.org
+ new_bridges = []
+ bridges = self.old_settings.get("tor_bridges_use_custom_bridges").split(
+ "Bridge "
+ )
+ for bridge in bridges:
+ new_bridges.append(bridge)
+ new_bridges = "".join(new_bridges)
+ self.tor_bridges_use_custom_textbox.setPlainText(new_bridges)
+
+ def connection_type_bundled_toggled(self, checked):
+ """
+ Connection type bundled was toggled. If checked, hide authentication fields.
+ """
+ self.common.log("SettingsDialog", "connection_type_bundled_toggled")
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.authenticate_group.hide()
+ self.connection_type_socks.hide()
+ self.connection_type_bridges_radio_group.show()
+
+ def tor_bridges_no_bridges_radio_toggled(self, checked):
+ """
+ 'No bridges' option was toggled. If checked, enable other bridge options.
+ """
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.tor_bridges_use_custom_textbox_options.hide()
+
+ def tor_bridges_use_obfs4_radio_toggled(self, checked):
+ """
+ obfs4 bridges option was toggled. If checked, disable custom bridge options.
+ """
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.tor_bridges_use_custom_textbox_options.hide()
+
+ def tor_bridges_use_meek_lite_azure_radio_toggled(self, checked):
+ """
+ meek_lite_azure bridges option was toggled. If checked, disable custom bridge options.
+ """
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.tor_bridges_use_custom_textbox_options.hide()
+ # Alert the user about meek's costliness if it looks like they're turning it on
+ if not self.old_settings.get("tor_bridges_use_meek_lite_azure"):
+ Alert(
+ self.common,
+ strings._("gui_settings_meek_lite_expensive_warning"),
+ QtWidgets.QMessageBox.Warning,
+ )
+
+ def tor_bridges_use_custom_radio_toggled(self, checked):
+ """
+ Custom bridges option was toggled. If checked, show custom bridge options.
+ """
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.tor_bridges_use_custom_textbox_options.show()
+
+ def connection_type_automatic_toggled(self, checked):
+ """
+ Connection type automatic was toggled. If checked, hide authentication fields.
+ """
+ self.common.log("SettingsDialog", "connection_type_automatic_toggled")
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.authenticate_group.hide()
+ self.connection_type_socks.hide()
+ self.connection_type_bridges_radio_group.hide()
+
+ def connection_type_control_port_toggled(self, checked):
+ """
+ Connection type control port was toggled. If checked, show extra fields
+ for Tor control address and port. If unchecked, hide those extra fields.
+ """
+ self.common.log("SettingsDialog", "connection_type_control_port_toggled")
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.authenticate_group.show()
+ self.connection_type_control_port_extras.show()
+ self.connection_type_socks.show()
+ self.connection_type_bridges_radio_group.hide()
+ else:
+ self.connection_type_control_port_extras.hide()
+
+ def connection_type_socket_file_toggled(self, checked):
+ """
+ Connection type socket file was toggled. If checked, show extra fields
+ for socket file. If unchecked, hide those extra fields.
+ """
+ self.common.log("SettingsDialog", "connection_type_socket_file_toggled")
+ if self.hide_tor_settings:
+ return
+ if checked:
+ self.authenticate_group.show()
+ self.connection_type_socket_file_extras.show()
+ self.connection_type_socks.show()
+ self.connection_type_bridges_radio_group.hide()
+ else:
+ self.connection_type_socket_file_extras.hide()
+
+ def authenticate_no_auth_toggled(self, checked):
+ """
+ Authentication option no authentication was toggled.
+ """
+ self.common.log("SettingsDialog", "authenticate_no_auth_toggled")
+
+ def authenticate_password_toggled(self, checked):
+ """
+ Authentication option password was toggled. If checked, show extra fields
+ for password auth. If unchecked, hide those extra fields.
+ """
+ self.common.log("SettingsDialog", "authenticate_password_toggled")
+ if checked:
+ self.authenticate_password_extras.show()
+ else:
+ self.authenticate_password_extras.hide()
+
+ def test_tor_clicked(self):
+ """
+ Test Tor Settings button clicked. With the given settings, see if we can
+ successfully connect and authenticate to Tor.
+ """
+ self.common.log("SettingsDialog", "test_tor_clicked")
+ settings = self.settings_from_fields()
+
+ try:
+ # Show Tor connection status if connection type is bundled tor
+ if settings.get("connection_type") == "bundled":
+ self.tor_status.show()
+ self._disable_buttons()
+
+ def tor_status_update_func(progress, summary):
+ self._tor_status_update(progress, summary)
+ return True
+
+ else:
+ tor_status_update_func = None
+
+ onion = Onion(self.common, use_tmp_dir=True)
+ onion.connect(
+ custom_settings=settings, tor_status_update_func=tor_status_update_func,
+ )
+
+ # If an exception hasn't been raised yet, the Tor settings work
+ Alert(
+ self.common,
+ strings._("settings_test_success").format(
+ onion.tor_version,
+ onion.supports_ephemeral,
+ onion.supports_stealth,
+ onion.supports_v3_onions,
+ ),
+ )
+
+ # Clean up
+ onion.cleanup()
+
+ except (
+ TorErrorInvalidSetting,
+ TorErrorAutomatic,
+ TorErrorSocketPort,
+ TorErrorSocketFile,
+ TorErrorMissingPassword,
+ TorErrorUnreadableCookieFile,
+ TorErrorAuthError,
+ TorErrorProtocolError,
+ BundledTorNotSupported,
+ BundledTorTimeout,
+ ) as e:
+ Alert(self.common, e.args[0], QtWidgets.QMessageBox.Warning)
+ if settings.get("connection_type") == "bundled":
+ self.tor_status.hide()
+ self._enable_buttons()
+
+ def check_for_updates(self):
+ """
+ Check for Updates button clicked. Manually force an update check.
+ """
+ self.common.log("SettingsDialog", "check_for_updates")
+ # Disable buttons
+ self._disable_buttons()
+ self.common.gui.qtapp.processEvents()
+
+ def update_timestamp():
+ # Update the last checked label
+ settings = Settings(self.common)
+ settings.load()
+ autoupdate_timestamp = settings.get("autoupdate_timestamp")
+ self._update_autoupdate_timestamp(autoupdate_timestamp)
+
+ def close_forced_update_thread():
+ forced_update_thread.quit()
+ # Enable buttons
+ self._enable_buttons()
+ # Update timestamp
+ update_timestamp()
+
+ # Check for updates
+ def update_available(update_url, installed_version, latest_version):
+ Alert(
+ self.common,
+ strings._("update_available").format(
+ update_url, installed_version, latest_version
+ ),
+ )
+ close_forced_update_thread()
+
+ def update_not_available():
+ Alert(self.common, strings._("update_not_available"))
+ close_forced_update_thread()
+
+ def update_error():
+ Alert(
+ self.common,
+ strings._("update_error_check_error"),
+ QtWidgets.QMessageBox.Warning,
+ )
+ close_forced_update_thread()
+
+ def update_invalid_version(latest_version):
+ Alert(
+ self.common,
+ strings._("update_error_invalid_latest_version").format(latest_version),
+ QtWidgets.QMessageBox.Warning,
+ )
+ close_forced_update_thread()
+
+ forced_update_thread = UpdateThread(self.common, self.onion, force=True)
+ forced_update_thread.update_available.connect(update_available)
+ forced_update_thread.update_not_available.connect(update_not_available)
+ forced_update_thread.update_error.connect(update_error)
+ forced_update_thread.update_invalid_version.connect(update_invalid_version)
+ forced_update_thread.start()
+
+ def save_clicked(self):
+ """
+ Save button clicked. Save current settings to disk.
+ """
+ self.common.log("SettingsDialog", "save_clicked")
+
+ def changed(s1, s2, keys):
+ """
+ Compare the Settings objects s1 and s2 and return true if any values
+ have changed for the given keys.
+ """
+ for key in keys:
+ if s1.get(key) != s2.get(key):
+ return True
+ return False
+
+ settings = self.settings_from_fields()
+ if settings:
+ # If language changed, inform user they need to restart OnionShare
+ if changed(settings, self.old_settings, ["locale"]):
+ # Look up error message in different locale
+ new_locale = settings.get("locale")
+ if (
+ new_locale in strings.translations
+ and "gui_settings_language_changed_notice"
+ in strings.translations[new_locale]
+ ):
+ notice = strings.translations[new_locale][
+ "gui_settings_language_changed_notice"
+ ]
+ else:
+ notice = strings._("gui_settings_language_changed_notice")
+ Alert(self.common, notice, QtWidgets.QMessageBox.Information)
+
+ # Save the new settings
+ settings.save()
+
+ # If Tor isn't connected, or if Tor settings have changed, Reinitialize
+ # the Onion object
+ reboot_onion = False
+ if not self.common.gui.local_only:
+ if self.common.gui.onion.is_authenticated():
+ self.common.log(
+ "SettingsDialog", "save_clicked", "Connected to Tor"
+ )
+
+ if changed(
+ settings,
+ self.old_settings,
+ [
+ "connection_type",
+ "control_port_address",
+ "control_port_port",
+ "socks_address",
+ "socks_port",
+ "socket_file_path",
+ "auth_type",
+ "auth_password",
+ "no_bridges",
+ "tor_bridges_use_obfs4",
+ "tor_bridges_use_meek_lite_azure",
+ "tor_bridges_use_custom_bridges",
+ ],
+ ):
+
+ reboot_onion = True
+
+ else:
+ self.common.log(
+ "SettingsDialog", "save_clicked", "Not connected to Tor"
+ )
+ # Tor isn't connected, so try connecting
+ reboot_onion = True
+
+ # Do we need to reinitialize Tor?
+ if reboot_onion:
+ # Reinitialize the Onion object
+ self.common.log(
+ "SettingsDialog", "save_clicked", "rebooting the Onion"
+ )
+ self.common.gui.onion.cleanup()
+
+ tor_con = TorConnectionDialog(self.common, settings)
+ tor_con.start()
+
+ self.common.log(
+ "SettingsDialog",
+ "save_clicked",
+ f"Onion done rebooting, connected to Tor: {self.common.gui.onion.connected_to_tor}",
+ )
+
+ if (
+ self.common.gui.onion.is_authenticated()
+ and not tor_con.wasCanceled()
+ ):
+ self.settings_saved.emit()
+ self.close()
+
+ else:
+ self.settings_saved.emit()
+ self.close()
+ else:
+ self.settings_saved.emit()
+ self.close()
+
+ def cancel_clicked(self):
+ """
+ Cancel button clicked.
+ """
+ self.common.log("SettingsDialog", "cancel_clicked")
+ if (
+ not self.common.gui.local_only
+ and not self.common.gui.onion.is_authenticated()
+ ):
+ Alert(
+ self.common,
+ strings._("gui_tor_connection_canceled"),
+ QtWidgets.QMessageBox.Warning,
+ )
+ sys.exit()
+ else:
+ self.close()
+
+ def help_clicked(self):
+ """
+ Help button clicked.
+ """
+ self.common.log("SettingsDialog", "help_clicked")
+ SettingsDialog.open_help()
+
+ @staticmethod
+ def open_help():
+ help_url = "https://docs.onionshare.org/"
+ QtGui.QDesktopServices.openUrl(QtCore.QUrl(help_url))
+
+ def settings_from_fields(self):
+ """
+ Return a Settings object that's full of values from the settings dialog.
+ """
+ self.common.log("SettingsDialog", "settings_from_fields")
+ settings = Settings(self.common)
+ settings.load() # To get the last update timestamp
+
+ # Language
+ locale_index = self.language_combobox.currentIndex()
+ locale = self.language_combobox.itemData(locale_index)
+ settings.set("locale", locale)
+
+ # Tor connection
+ if self.connection_type_bundled_radio.isChecked():
+ settings.set("connection_type", "bundled")
+ if self.connection_type_automatic_radio.isChecked():
+ settings.set("connection_type", "automatic")
+ if self.connection_type_control_port_radio.isChecked():
+ settings.set("connection_type", "control_port")
+ if self.connection_type_socket_file_radio.isChecked():
+ settings.set("connection_type", "socket_file")
+
+ if self.autoupdate_checkbox.isChecked():
+ settings.set("use_autoupdate", True)
+ else:
+ settings.set("use_autoupdate", False)
+
+ settings.set(
+ "control_port_address",
+ self.connection_type_control_port_extras_address.text(),
+ )
+ settings.set(
+ "control_port_port", self.connection_type_control_port_extras_port.text()
+ )
+ settings.set(
+ "socket_file_path", self.connection_type_socket_file_extras_path.text()
+ )
+
+ settings.set("socks_address", self.connection_type_socks_address.text())
+ settings.set("socks_port", self.connection_type_socks_port.text())
+
+ if self.authenticate_no_auth_radio.isChecked():
+ settings.set("auth_type", "no_auth")
+ if self.authenticate_password_radio.isChecked():
+ settings.set("auth_type", "password")
+
+ settings.set("auth_password", self.authenticate_password_extras_password.text())
+
+ # Whether we use bridges
+ if self.tor_bridges_no_bridges_radio.isChecked():
+ settings.set("no_bridges", True)
+ settings.set("tor_bridges_use_obfs4", False)
+ settings.set("tor_bridges_use_meek_lite_azure", False)
+ settings.set("tor_bridges_use_custom_bridges", "")
+ if self.tor_bridges_use_obfs4_radio.isChecked():
+ settings.set("no_bridges", False)
+ settings.set("tor_bridges_use_obfs4", True)
+ settings.set("tor_bridges_use_meek_lite_azure", False)
+ settings.set("tor_bridges_use_custom_bridges", "")
+ if self.tor_bridges_use_meek_lite_azure_radio.isChecked():
+ settings.set("no_bridges", False)
+ settings.set("tor_bridges_use_obfs4", False)
+ settings.set("tor_bridges_use_meek_lite_azure", True)
+ settings.set("tor_bridges_use_custom_bridges", "")
+ if self.tor_bridges_use_custom_radio.isChecked():
+ settings.set("no_bridges", False)
+ settings.set("tor_bridges_use_obfs4", False)
+ settings.set("tor_bridges_use_meek_lite_azure", False)
+
+ # Insert a 'Bridge' line at the start of each bridge.
+ # This makes it easier to copy/paste a set of bridges
+ # provided from https://bridges.torproject.org
+ new_bridges = []
+ bridges = self.tor_bridges_use_custom_textbox.toPlainText().split("\n")
+ bridges_valid = False
+ for bridge in bridges:
+ if bridge != "":
+ # Check the syntax of the custom bridge to make sure it looks legitimate
+ ipv4_pattern = re.compile(
+ "(obfs4\s+)?(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):([0-9]+)(\s+)([A-Z0-9]+)(.+)$"
+ )
+ ipv6_pattern = re.compile(
+ "(obfs4\s+)?\[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\]:[0-9]+\s+[A-Z0-9]+(.+)$"
+ )
+ meek_lite_pattern = re.compile(
+ "(meek_lite)(\s)+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)(\s)+([0-9A-Z]+)(\s)+url=(.+)(\s)+front=(.+)"
+ )
+ if (
+ ipv4_pattern.match(bridge)
+ or ipv6_pattern.match(bridge)
+ or meek_lite_pattern.match(bridge)
+ ):
+ new_bridges.append("".join(["Bridge ", bridge, "\n"]))
+ bridges_valid = True
+
+ if bridges_valid:
+ new_bridges = "".join(new_bridges)
+ settings.set("tor_bridges_use_custom_bridges", new_bridges)
+ else:
+ Alert(self.common, strings._("gui_settings_tor_bridges_invalid"))
+ settings.set("no_bridges", True)
+ return False
+
+ return settings
+
+ def closeEvent(self, e):
+ self.common.log("SettingsDialog", "closeEvent")
+
+ # On close, if Tor isn't connected, then quit OnionShare altogether
+ if not self.common.gui.local_only:
+ if not self.common.gui.onion.is_authenticated():
+ self.common.log(
+ "SettingsDialog", "closeEvent", "Closing while not connected to Tor"
+ )
+
+ # Wait 1ms for the event loop to finish, then quit
+ QtCore.QTimer.singleShot(1, self.common.gui.qtapp.quit)
+
+ def _update_autoupdate_timestamp(self, autoupdate_timestamp):
+ self.common.log("SettingsDialog", "_update_autoupdate_timestamp")
+
+ if autoupdate_timestamp:
+ dt = datetime.datetime.fromtimestamp(autoupdate_timestamp)
+ last_checked = dt.strftime("%B %d, %Y %H:%M")
+ else:
+ last_checked = strings._("gui_settings_autoupdate_timestamp_never")
+ self.autoupdate_timestamp.setText(
+ strings._("gui_settings_autoupdate_timestamp").format(last_checked)
+ )
+
+ def _tor_status_update(self, progress, summary):
+ self.tor_status.setText(
+ f"<strong>{strings._('connecting_to_tor')}</strong><br>{progress}% {summary}"
+ )
+ self.common.gui.qtapp.processEvents()
+ if "Done" in summary:
+ self.tor_status.hide()
+ self._enable_buttons()
+
+ def _disable_buttons(self):
+ self.common.log("SettingsDialog", "_disable_buttons")
+
+ self.check_for_updates_button.setEnabled(False)
+ self.connection_type_test_button.setEnabled(False)
+ self.save_button.setEnabled(False)
+ self.cancel_button.setEnabled(False)
+
+ def _enable_buttons(self):
+ self.common.log("SettingsDialog", "_enable_buttons")
+ # We can't check for updates if we're still not connected to Tor
+ if not self.common.gui.onion.connected_to_tor:
+ self.check_for_updates_button.setEnabled(False)
+ else:
+ self.check_for_updates_button.setEnabled(True)
+ self.connection_type_test_button.setEnabled(True)
+ self.save_button.setEnabled(True)
+ self.cancel_button.setEnabled(True)
diff --git a/desktop/onionshare_gui/tab/__init__.py b/desktop/onionshare_gui/tab/__init__.py
new file mode 100644
index 00000000..162d13aa
--- /dev/null
+++ b/desktop/onionshare_gui/tab/__init__.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from .tab import Tab
diff --git a/desktop/onionshare_gui/tab/mode/__init__.py b/desktop/onionshare_gui/tab/mode/__init__.py
new file mode 100644
index 00000000..65e46444
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/__init__.py
@@ -0,0 +1,494 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.common import AutoStopTimer
+
+from .history import IndividualFileHistoryItem
+from .mode_settings_widget import ModeSettingsWidget
+
+from ..server_status import ServerStatus
+from ...threads import OnionThread, AutoStartTimer
+from ...widgets import Alert
+
+
+class Mode(QtWidgets.QWidget):
+ """
+ The class that all modes inherit from
+ """
+
+ start_server_finished = QtCore.pyqtSignal()
+ stop_server_finished = QtCore.pyqtSignal()
+ 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)
+ change_persistent = QtCore.pyqtSignal(int, bool)
+
+ def __init__(self, tab):
+ super(Mode, self).__init__()
+ self.tab = tab
+ self.settings = tab.settings
+
+ self.common = tab.common
+ self.qtapp = self.common.gui.qtapp
+ self.app = tab.app
+
+ self.status_bar = tab.status_bar
+ self.server_status_label = tab.status_bar.server_status_label
+ self.system_tray = tab.system_tray
+
+ self.filenames = tab.filenames
+
+ # The web object gets created in init()
+ self.web = None
+
+ # Threads start out as None
+ self.onion_thread = None
+ self.web_thread = None
+ self.startup_thread = None
+
+ # Mode settings widget
+ self.mode_settings_widget = ModeSettingsWidget(
+ self.common, self.tab, self.settings
+ )
+ self.mode_settings_widget.change_persistent.connect(self.change_persistent)
+
+ # Server status
+ self.server_status = ServerStatus(
+ self.common,
+ self.qtapp,
+ self.app,
+ self.settings,
+ self.mode_settings_widget,
+ None,
+ self.common.gui.local_only,
+ )
+ self.server_status.server_started.connect(self.start_server)
+ self.server_status.server_stopped.connect(self.stop_server)
+ self.server_status.server_canceled.connect(self.cancel_server)
+ self.start_server_finished.connect(self.server_status.start_server_finished)
+ 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
+ # Note: It's up to the downstream Mode to add this to its layout
+ self.primary_action_layout = QtWidgets.QVBoxLayout()
+ self.primary_action_layout.addWidget(self.mode_settings_widget)
+ self.primary_action = QtWidgets.QWidget()
+ self.primary_action.setLayout(self.primary_action_layout)
+
+ def init(self):
+ """
+ Add custom initialization here.
+ """
+ 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 = (
+ (f"{days}{strings._('days_first_letter')}, " if days else "")
+ + (f"{hours}{strings._('hours_first_letter')}, " if hours else "")
+ + (f"{minutes}{strings._('minutes_first_letter')}, " if minutes else "")
+ + f"{seconds}{strings._('seconds_first_letter')}"
+ )
+
+ return result
+
+ def timer_callback(self):
+ """
+ This method is called regularly on a timer.
+ """
+ # If this is a scheduled share, display the countdown til the share starts
+ if self.server_status.status == ServerStatus.STATUS_WORKING:
+ if self.settings.get("general", "autostart_timer"):
+ now = QtCore.QDateTime.currentDateTime()
+ if self.server_status.local_only:
+ seconds_remaining = now.secsTo(
+ self.mode_settings_widget.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.autostop_timer_thread and self.settings.get(
+ "general", "autostop_timer"
+ ):
+ if self.autostop_timer_datetime_delta > 0:
+ now = QtCore.QDateTime.currentDateTime()
+ seconds_remaining = now.secsTo(
+ self.server_status.autostop_timer_datetime
+ )
+
+ # Update the server button
+ 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.autostop_timer_thread.is_alive():
+ if self.autostop_timer_finished_should_stop_server():
+ self.server_status.stop_server()
+
+ def timer_callback_custom(self):
+ """
+ Add custom timer code.
+ """
+ pass
+
+ def get_stop_server_autostop_timer_text(self):
+ """
+ Return the string to put on the stop server button, if there's an auto-stop timer
+ """
+ pass
+
+ def autostop_timer_finished_should_stop_server(self):
+ """
+ The auto-stop timer expired, should we stop the server? Returns a bool
+ """
+ pass
+
+ def start_server(self):
+ """
+ Start the onionshare server. This uses multiple threads to start the Tor onion
+ server and the web app.
+ """
+ self.common.log("Mode", "start_server")
+
+ self.start_server_custom()
+ self.set_server_active.emit(True)
+
+ # Clear the status bar
+ self.status_bar.clearMessage()
+ self.server_status_label.setText("")
+
+ # Hide the mode settings
+ self.mode_settings_widget.hide()
+
+ # 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, password
+ # and onion address, but it will not start the WebThread yet.
+ if self.settings.get("general", "autostart_timer"):
+ self.start_onion_thread(obtain_onion_early=True)
+ 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()
+ else:
+ self.start_onion_thread()
+
+ 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)
+ self.onion_thread.start()
+
+ def start_server_custom(self):
+ """
+ Add custom initialization here.
+ """
+ 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.
+ """
+ self.common.log("Mode", "start_server_step2")
+
+ self.start_server_step2_custom()
+
+ # Nothing to do here.
+
+ # start_server_step2_custom has call these to move on:
+ # self.starting_server_step3.emit()
+ # self.start_server_finished.emit()
+
+ def start_server_step2_custom(self):
+ """
+ Add custom initialization here.
+ """
+ pass
+
+ def start_server_step3(self):
+ """
+ Step 3 in starting the onionshare server.
+ """
+ self.common.log("Mode", "start_server_step3")
+
+ self.start_server_step3_custom()
+
+ if self.settings.get("general", "autostop_timer"):
+ # Convert the date value to seconds between now and then
+ now = QtCore.QDateTime.currentDateTime()
+ 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_autostop_timer")
+ )
+
+ def start_server_step3_custom(self):
+ """
+ Add custom initialization here.
+ """
+ pass
+
+ def start_server_error(self, error):
+ """
+ If there's an error when trying to start the onion service
+ """
+ self.common.log("Mode", "start_server_error")
+
+ Alert(self.common, error, QtWidgets.QMessageBox.Warning)
+ self.set_server_active.emit(False)
+ self.server_status.stop_server()
+ self.status_bar.clearMessage()
+
+ self.start_server_error_custom()
+
+ def start_server_error_custom(self):
+ """
+ Add custom initialization here.
+ """
+ pass
+
+ def cancel_server(self):
+ """
+ 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()
+ if self.web_thread:
+ self.common.log("Mode", "cancel_server: quitting web thread")
+ self.web_thread.quit()
+ self.stop_server()
+
+ def cancel_server_custom(self):
+ """
+ Add custom initialization here.
+ """
+ pass
+
+ def stop_server(self):
+ """
+ Stop the onionshare server.
+ """
+ self.common.log("Mode", "stop_server")
+
+ if self.server_status.status != ServerStatus.STATUS_STOPPED:
+ try:
+ self.web.stop(self.app.port)
+ except:
+ # Probably we had no port to begin with (Onion service didn't start)
+ pass
+ self.app.cleanup()
+
+ self.stop_server_custom()
+
+ self.set_server_active.emit(False)
+ self.stop_server_finished.emit()
+
+ # Show the mode settings
+ self.mode_settings_widget.show()
+
+ def stop_server_custom(self):
+ """
+ Add custom initialization here.
+ """
+ pass
+
+ def handle_tor_broke(self):
+ """
+ Handle connection from Tor breaking.
+ """
+ if self.server_status.status != ServerStatus.STATUS_STOPPED:
+ self.server_status.stop_server()
+ self.handle_tor_broke_custom()
+
+ def handle_tor_broke_custom(self):
+ """
+ Add custom initialization here.
+ """
+ pass
+
+ # Handle web server events
+
+ def handle_request_load(self, event):
+ """
+ Handle REQUEST_LOAD event.
+ """
+ pass
+
+ def handle_request_started(self, event):
+ """
+ Handle REQUEST_STARTED event.
+ """
+ pass
+
+ def handle_request_rate_limit(self, event):
+ """
+ Handle REQUEST_RATE_LIMIT event.
+ """
+ self.stop_server()
+ Alert(
+ self.common, strings._("error_rate_limit"), QtWidgets.QMessageBox.Critical
+ )
+
+ def handle_request_progress(self, event):
+ """
+ Handle REQUEST_PROGRESS event.
+ """
+ pass
+
+ def handle_request_canceled(self, event):
+ """
+ Handle REQUEST_CANCELED event.
+ """
+ pass
+
+ def handle_request_upload_file_renamed(self, event):
+ """
+ Handle REQUEST_UPLOAD_FILE_RENAMED event.
+ """
+ pass
+
+ def handle_request_upload_set_dir(self, event):
+ """
+ Handle REQUEST_UPLOAD_SET_DIR event.
+ """
+ pass
+
+ def handle_request_upload_finished(self, event):
+ """
+ Handle REQUEST_UPLOAD_FINISHED event.
+ """
+ pass
+
+ def handle_request_upload_canceled(self, event):
+ """
+ Handle REQUEST_UPLOAD_CANCELED event.
+ """
+ pass
+
+ def handle_request_individual_file_started(self, event):
+ """
+ Handle REQUEST_INDVIDIDUAL_FILES_STARTED event.
+ Used in both Share and Website modes, so implemented here.
+ """
+ self.toggle_history.update_indicator(True)
+ self.history.requests_count += 1
+ self.history.update_requests()
+
+ item = IndividualFileHistoryItem(self.common, event["data"], event["path"])
+ self.history.add(event["data"]["id"], item)
+
+ def handle_request_individual_file_progress(self, event):
+ """
+ Handle REQUEST_INDVIDIDUAL_FILES_PROGRESS event.
+ Used in both Share and Website modes, so implemented here.
+ """
+ self.history.update(event["data"]["id"], event["data"]["bytes"])
+
+ if self.server_status.status == self.server_status.STATUS_STOPPED:
+ self.history.cancel(event["data"]["id"])
+
+ def handle_request_individual_file_canceled(self, event):
+ """
+ Handle REQUEST_INDVIDIDUAL_FILES_CANCELED event.
+ Used in both Share and Website modes, so implemented here.
+ """
+ self.history.cancel(event["data"]["id"])
diff --git a/desktop/onionshare_gui/tab/mode/chat_mode/__init__.py b/desktop/onionshare_gui/tab/mode/chat_mode/__init__.py
new file mode 100644
index 00000000..4de9f387
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/chat_mode/__init__.py
@@ -0,0 +1,153 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+import random
+import string
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.onion import *
+from onionshare.common import Common
+from onionshare.web import Web
+
+from .. import Mode
+from ....widgets import MinimumWidthWidget
+
+
+class ChatMode(Mode):
+ """
+ Parts of the main window UI for sharing files.
+ """
+
+ success = QtCore.pyqtSignal()
+ error = QtCore.pyqtSignal(str)
+
+ def init(self):
+ """
+ Custom initialization for ChatMode.
+ """
+ # Create the Web object
+ self.web = Web(self.common, True, self.settings, "chat")
+
+ # Chat image
+ self.image_label = QtWidgets.QLabel()
+ self.image_label.setPixmap(
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(self.common.get_resource_path("images/mode_chat.png"))
+ )
+ )
+ self.image_label.setFixedSize(300, 300)
+ image_layout = QtWidgets.QVBoxLayout()
+ image_layout.addStretch()
+ image_layout.addWidget(self.image_label)
+ image_layout.addStretch()
+ self.image = QtWidgets.QWidget()
+ self.image.setLayout(image_layout)
+
+ # Server status
+ self.server_status.set_mode("chat")
+ self.server_status.server_started_finished.connect(self.update_primary_action)
+ self.server_status.server_stopped.connect(self.update_primary_action)
+ self.server_status.server_canceled.connect(self.update_primary_action)
+ # Tell server_status about web, then update
+ self.server_status.web = self.web
+ self.server_status.update()
+
+ # Header
+ header_label = QtWidgets.QLabel(strings._("gui_new_tab_chat_button"))
+ header_label.setStyleSheet(self.common.gui.css["mode_header_label"])
+
+ # Top bar
+ top_bar_layout = QtWidgets.QHBoxLayout()
+ top_bar_layout.addStretch()
+
+ # Main layout
+ self.main_layout = QtWidgets.QVBoxLayout()
+ self.main_layout.addLayout(top_bar_layout)
+ self.main_layout.addStretch()
+ self.main_layout.addWidget(header_label)
+ self.main_layout.addWidget(self.primary_action)
+ self.main_layout.addWidget(self.server_status)
+ self.main_layout.addStretch()
+ self.main_layout.addWidget(MinimumWidthWidget(700))
+
+ # Column layout
+ self.column_layout = QtWidgets.QHBoxLayout()
+ self.column_layout.addWidget(self.image)
+ self.column_layout.addLayout(self.main_layout)
+
+ # Wrapper layout
+ self.wrapper_layout = QtWidgets.QVBoxLayout()
+ self.wrapper_layout.addLayout(self.column_layout)
+ self.setLayout(self.wrapper_layout)
+
+ def get_stop_server_autostop_timer_text(self):
+ """
+ Return the string to put on the stop server button, if there's an auto-stop timer
+ """
+ return strings._("gui_share_stop_server_autostop_timer")
+
+ def autostop_timer_finished_should_stop_server(self):
+ """
+ The auto-stop timer expired, should we stop the server? Returns a bool
+ """
+
+ self.server_status.stop_server()
+ self.server_status_label.setText(strings._("close_on_autostop_timer"))
+ return True
+
+ def start_server_custom(self):
+ """
+ Starting the server.
+ """
+ # Reset web counters
+ self.web.chat_mode.cur_history_id = 0
+ self.web.reset_invalid_passwords()
+
+ def start_server_step2_custom(self):
+ """
+ Step 2 in starting the server. Zipping up files.
+ """
+ # Continue
+ self.starting_server_step3.emit()
+ self.start_server_finished.emit()
+
+ def cancel_server_custom(self):
+ """
+ Log that the server has been cancelled
+ """
+ self.common.log("ChatMode", "cancel_server")
+
+ def handle_tor_broke_custom(self):
+ """
+ Connection to Tor broke.
+ """
+ self.primary_action.hide()
+
+ def on_reload_settings(self):
+ """
+ We should be ok to re-enable the 'Start Receive Mode' button now.
+ """
+ self.primary_action.show()
+
+ def update_primary_action(self):
+ self.common.log("ChatMode", "update_primary_action")
diff --git a/desktop/onionshare_gui/tab/mode/file_selection.py b/desktop/onionshare_gui/tab/mode/file_selection.py
new file mode 100644
index 00000000..a3212c96
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/file_selection.py
@@ -0,0 +1,496 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+
+from ...widgets import Alert, AddFileDialog
+
+
+class DropHereWidget(QtWidgets.QWidget):
+ """
+ When there are no files or folders in the FileList yet, display the
+ 'drop files here' message and graphic.
+ """
+
+ def __init__(self, common, image_filename, header_text, w, h, parent):
+ super(DropHereWidget, self).__init__(parent)
+ self.common = common
+ self.setAcceptDrops(True)
+
+ self.image_label = QtWidgets.QLabel(parent=self)
+ self.image_label.setPixmap(
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(self.common.get_resource_path(image_filename))
+ )
+ )
+ self.image_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.image_label.show()
+
+ self.header_label = QtWidgets.QLabel(parent=self)
+ self.header_label.setText(header_text)
+ self.header_label.setStyleSheet(
+ self.common.gui.css["share_file_selection_drop_here_header_label"]
+ )
+ self.header_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.header_label.show()
+
+ self.text_label = QtWidgets.QLabel(parent=self)
+ self.text_label.setText(strings._("gui_drag_and_drop"))
+ self.text_label.setStyleSheet(
+ self.common.gui.css["share_file_selection_drop_here_label"]
+ )
+ self.text_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.text_label.show()
+
+ self.resize(w, h)
+ self.hide()
+
+ def dragEnterEvent(self, event):
+ self.hide()
+ event.accept()
+
+ def resize(self, w, h):
+ self.setGeometry(0, 0, w, h)
+ self.image_label.setGeometry(0, 0, w, h - 100)
+ self.header_label.setGeometry(0, 340, w, h - 340)
+ self.text_label.setGeometry(0, 410, w, h - 410)
+
+
+class DropCountLabel(QtWidgets.QLabel):
+ """
+ While dragging files over the FileList, this counter displays the
+ number of files you're dragging.
+ """
+
+ def __init__(self, common, parent):
+ self.parent = parent
+ super(DropCountLabel, self).__init__(parent=parent)
+
+ self.common = common
+
+ self.setAcceptDrops(True)
+ self.setAlignment(QtCore.Qt.AlignCenter)
+ self.setText(strings._("gui_drag_and_drop"))
+ self.setStyleSheet(self.common.gui.css["share_file_selection_drop_count_label"])
+ self.hide()
+
+ def dragEnterEvent(self, event):
+ self.hide()
+ event.accept()
+
+
+class FileList(QtWidgets.QListWidget):
+ """
+ The list of files and folders in the GUI.
+ """
+
+ files_dropped = QtCore.pyqtSignal()
+ files_updated = QtCore.pyqtSignal()
+
+ def __init__(self, common, background_image_filename, header_text, parent=None):
+ super(FileList, self).__init__(parent)
+ self.common = common
+ self.setAcceptDrops(True)
+
+ self.setIconSize(QtCore.QSize(32, 32))
+ self.setSortingEnabled(True)
+ self.setMinimumHeight(160)
+ self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
+ self.drop_here = DropHereWidget(
+ self.common,
+ background_image_filename,
+ header_text,
+ self.width(),
+ self.height(),
+ self,
+ )
+ self.drop_count = DropCountLabel(self.common, self)
+ self.resizeEvent(None)
+ self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
+
+ def update(self):
+ """
+ Update the GUI elements based on the current state.
+ """
+ # file list should have a background image if empty
+ if self.count() == 0:
+ self.drop_here.show()
+ else:
+ self.drop_here.hide()
+
+ def server_started(self):
+ """
+ Update the GUI when the server starts, by hiding delete buttons.
+ """
+ self.setAcceptDrops(False)
+ self.setCurrentItem(None)
+ self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+ for index in range(self.count()):
+ self.item(index).item_button.hide()
+
+ def server_stopped(self):
+ """
+ Update the GUI when the server stops, by showing delete buttons.
+ """
+ self.setAcceptDrops(True)
+ self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
+ for index in range(self.count()):
+ self.item(index).item_button.show()
+
+ def resizeEvent(self, event):
+ """
+ When the widget is resized, resize the drop files image and text.
+ """
+ self.drop_here.resize(self.width(), self.height())
+
+ if self.count() > 0:
+ # Add and delete an empty item, to force all items to get redrawn
+ # This is ugly, but the only way I could figure out how to proceed
+ item = QtWidgets.QListWidgetItem("fake item")
+ self.addItem(item)
+ self.takeItem(self.row(item))
+ self.update()
+
+ # Extend any filenames that were truncated to fit the window
+ # We use 200 as a rough guess at how wide the 'file size + delete button' widget is
+ # and extend based on the overall width minus that amount.
+ for index in range(self.count()):
+ metrics = QtGui.QFontMetrics(self.item(index).font())
+ elided = metrics.elidedText(
+ self.item(index).basename, QtCore.Qt.ElideRight, self.width() - 200
+ )
+ self.item(index).setText(elided)
+
+ def dragEnterEvent(self, event):
+ """
+ dragEnterEvent for dragging files and directories into the widget.
+ """
+ if event.mimeData().hasUrls:
+ self.setStyleSheet(self.common.gui.css["share_file_list_drag_enter"])
+ count = len(event.mimeData().urls())
+ self.drop_count.setText(f"+{count}")
+
+ size_hint = self.drop_count.sizeHint()
+ self.drop_count.setGeometry(
+ self.width() - size_hint.width() - 30,
+ self.height() - size_hint.height() - 10,
+ size_hint.width(),
+ size_hint.height(),
+ )
+ self.drop_count.show()
+ event.accept()
+ else:
+ event.ignore()
+
+ def dragLeaveEvent(self, event):
+ """
+ dragLeaveEvent for dragging files and directories into the widget.
+ """
+ self.setStyleSheet(self.common.gui.css["share_file_list_drag_leave"])
+ self.drop_count.hide()
+ event.accept()
+ self.update()
+
+ def dragMoveEvent(self, event):
+ """
+ dragMoveEvent for dragging files and directories into the widget.
+ """
+ if event.mimeData().hasUrls:
+ event.setDropAction(QtCore.Qt.CopyAction)
+ event.accept()
+ else:
+ event.ignore()
+
+ def dropEvent(self, event):
+ """
+ dropEvent for dragging files and directories into the widget.
+ """
+ if event.mimeData().hasUrls:
+ event.setDropAction(QtCore.Qt.CopyAction)
+ event.accept()
+ for url in event.mimeData().urls():
+ filename = str(url.toLocalFile())
+ self.add_file(filename)
+ else:
+ event.ignore()
+
+ self.setStyleSheet(self.common.gui.css["share_file_list_drag_leave"])
+ self.drop_count.hide()
+
+ self.files_dropped.emit()
+
+ def add_file(self, filename):
+ """
+ Add a file or directory to this widget.
+ """
+ filenames = []
+ for index in range(self.count()):
+ filenames.append(self.item(index).filename)
+
+ if filename not in filenames:
+ if not os.access(filename, os.R_OK):
+ Alert(self.common, strings._("not_a_readable_file").format(filename))
+ return
+
+ fileinfo = QtCore.QFileInfo(filename)
+ ip = QtWidgets.QFileIconProvider()
+ icon = ip.icon(fileinfo)
+
+ if os.path.isfile(filename):
+ size_bytes = fileinfo.size()
+ size_readable = self.common.human_readable_filesize(size_bytes)
+ else:
+ size_bytes = self.common.dir_size(filename)
+ size_readable = self.common.human_readable_filesize(size_bytes)
+
+ # Create a new item
+ item = QtWidgets.QListWidgetItem()
+ item.setIcon(icon)
+ item.size_bytes = size_bytes
+
+ # Item's filename attribute and size labels
+ item.filename = filename
+ item_size = QtWidgets.QLabel(size_readable)
+ item_size.setStyleSheet(self.common.gui.css["share_file_list_item_size"])
+
+ item.basename = os.path.basename(filename.rstrip("/"))
+ # Use the basename as the method with which to sort the list
+ metrics = QtGui.QFontMetrics(item.font())
+ elided = metrics.elidedText(
+ item.basename, QtCore.Qt.ElideRight, self.sizeHint().width()
+ )
+ item.setData(QtCore.Qt.DisplayRole, elided)
+
+ # Item's delete button
+ def delete_item():
+ itemrow = self.row(item)
+ self.takeItem(itemrow)
+ self.files_updated.emit()
+
+ item.item_button = QtWidgets.QPushButton()
+ item.item_button.setDefault(False)
+ item.item_button.setFlat(True)
+ item.item_button.setIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/file_delete.png"))
+ )
+ item.item_button.clicked.connect(delete_item)
+ item.item_button.setSizePolicy(
+ QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed
+ )
+
+ # Item info widget, with a white background
+ item_info_layout = QtWidgets.QHBoxLayout()
+ item_info_layout.setContentsMargins(0, 0, 0, 0)
+ item_info_layout.addWidget(item_size)
+ item_info_layout.addWidget(item.item_button)
+ item_info = QtWidgets.QWidget()
+ item_info.setObjectName("item-info")
+ item_info.setLayout(item_info_layout)
+
+ # Create the item's widget and layouts
+ item_hlayout = QtWidgets.QHBoxLayout()
+ item_hlayout.addStretch()
+ item_hlayout.addWidget(item_info)
+ widget = QtWidgets.QWidget()
+ widget.setLayout(item_hlayout)
+
+ item.setSizeHint(widget.sizeHint())
+
+ self.addItem(item)
+ self.setItemWidget(item, widget)
+
+ self.files_updated.emit()
+
+
+class FileSelection(QtWidgets.QVBoxLayout):
+ """
+ The list of files and folders in the GUI, as well as buttons to add and
+ delete the files and folders.
+ """
+
+ def __init__(self, common, background_image_filename, header_text, parent):
+ super(FileSelection, self).__init__()
+
+ self.common = common
+ self.parent = parent
+
+ self.server_on = False
+
+ # File list
+ self.file_list = FileList(self.common, background_image_filename, header_text)
+ self.file_list.itemSelectionChanged.connect(self.update)
+ self.file_list.files_dropped.connect(self.update)
+ self.file_list.files_updated.connect(self.update)
+
+ # Buttons
+ if self.common.platform == "Darwin":
+ # The macOS sandbox makes it so the Mac version needs separate add files
+ # and folders buttons, in order to use native file selection dialogs
+ self.add_files_button = QtWidgets.QPushButton(strings._("gui_add_files"))
+ self.add_files_button.clicked.connect(self.add_files)
+ self.add_folder_button = QtWidgets.QPushButton(strings._("gui_add_folder"))
+ self.add_folder_button.clicked.connect(self.add_folder)
+ else:
+ self.add_button = QtWidgets.QPushButton(strings._("gui_add"))
+ self.add_button.clicked.connect(self.add)
+ self.remove_button = QtWidgets.QPushButton(strings._("gui_remove"))
+ self.remove_button.clicked.connect(self.delete)
+ button_layout = QtWidgets.QHBoxLayout()
+ button_layout.addStretch()
+ if self.common.platform == "Darwin":
+ button_layout.addWidget(self.add_files_button)
+ button_layout.addWidget(self.add_folder_button)
+ else:
+ button_layout.addWidget(self.add_button)
+ button_layout.addWidget(self.remove_button)
+
+ # Add the widgets
+ self.addWidget(self.file_list)
+ self.addLayout(button_layout)
+
+ self.update()
+
+ def update(self):
+ """
+ Update the GUI elements based on the current state.
+ """
+ # All buttons should be hidden if the server is on
+ if self.server_on:
+ if self.common.platform == "Darwin":
+ self.add_files_button.hide()
+ self.add_folder_button.hide()
+ else:
+ self.add_button.hide()
+ self.remove_button.hide()
+ else:
+ if self.common.platform == "Darwin":
+ self.add_files_button.show()
+ self.add_folder_button.show()
+ else:
+ self.add_button.show()
+
+ # Delete button should be hidden if item isn't selected
+ if len(self.file_list.selectedItems()) == 0:
+ self.remove_button.hide()
+ else:
+ self.remove_button.show()
+
+ # Update the file list
+ self.file_list.update()
+
+ # Save the latest file list to mode settings
+ self.save_filenames()
+
+ def add(self):
+ """
+ Add button clicked.
+ """
+ file_dialog = AddFileDialog(self.common, caption=strings._("gui_choose_items"))
+ if file_dialog.exec_() == QtWidgets.QDialog.Accepted:
+ for filename in file_dialog.selectedFiles():
+ self.file_list.add_file(filename)
+
+ self.file_list.setCurrentItem(None)
+ self.update()
+
+ def add_files(self):
+ """
+ Add files button clicked.
+ """
+ files = QtWidgets.QFileDialog.getOpenFileNames(
+ self.parent, caption=strings._("gui_choose_items")
+ )
+ filenames = files[0]
+ for filename in filenames:
+ self.file_list.add_file(filename)
+
+ def add_folder(self):
+ """
+ Add folder button clicked.
+ """
+ filename = QtWidgets.QFileDialog.getExistingDirectory(
+ self.parent,
+ caption=strings._("gui_choose_items"),
+ options=QtWidgets.QFileDialog.ShowDirsOnly,
+ )
+ self.file_list.add_file(filename)
+
+ def delete(self):
+ """
+ Delete button clicked
+ """
+ selected = self.file_list.selectedItems()
+ for item in selected:
+ itemrow = self.file_list.row(item)
+ self.file_list.takeItem(itemrow)
+ self.file_list.files_updated.emit()
+
+ self.file_list.setCurrentItem(None)
+ self.update()
+
+ def server_started(self):
+ """
+ Gets called when the server starts.
+ """
+ self.server_on = True
+ self.file_list.server_started()
+ self.update()
+
+ def server_stopped(self):
+ """
+ Gets called when the server stops.
+ """
+ self.server_on = False
+ self.file_list.server_stopped()
+ self.update()
+
+ def get_num_files(self):
+ """
+ Returns the total number of files and folders in the list.
+ """
+ return len(range(self.file_list.count()))
+
+ def get_filenames(self):
+ """
+ Return the list of file and folder names
+ """
+ filenames = []
+ for index in range(self.file_list.count()):
+ filenames.append(self.file_list.item(index).filename)
+ return filenames
+
+ def save_filenames(self):
+ """
+ Save the filenames to mode settings
+ """
+ filenames = self.get_filenames()
+ if self.parent.tab.mode == self.common.gui.MODE_SHARE:
+ self.parent.settings.set("share", "filenames", filenames)
+ elif self.parent.tab.mode == self.common.gui.MODE_WEBSITE:
+ self.parent.settings.set("website", "filenames", filenames)
+
+ def setFocus(self):
+ """
+ Set the Qt app focus on the file selection box.
+ """
+ self.file_list.setFocus()
diff --git a/desktop/onionshare_gui/tab/mode/history.py b/desktop/onionshare_gui/tab/mode/history.py
new file mode 100644
index 00000000..feb671ef
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/history.py
@@ -0,0 +1,807 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import time
+import subprocess
+import os
+from datetime import datetime
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from ...widgets import Alert
+
+
+class HistoryItem(QtWidgets.QWidget):
+ """
+ The base history item
+ """
+
+ STATUS_STARTED = 0
+ STATUS_FINISHED = 1
+ STATUS_CANCELED = 2
+
+ def __init__(self):
+ super(HistoryItem, self).__init__()
+
+ def update(self):
+ pass
+
+ def cancel(self):
+ pass
+
+ def get_finished_label_text(self, started):
+ """
+ When an item finishes, returns a string displaying the start/end datetime range.
+ started is a datetime object.
+ """
+ return self._get_label_text(
+ "gui_all_modes_transfer_finished",
+ "gui_all_modes_transfer_finished_range",
+ started,
+ )
+
+ def get_canceled_label_text(self, started):
+ """
+ When an item is canceled, returns a string displaying the start/end datetime range.
+ started is a datetime object.
+ """
+ return self._get_label_text(
+ "gui_all_modes_transfer_canceled",
+ "gui_all_modes_transfer_canceled_range",
+ started,
+ )
+
+ def _get_label_text(self, string_name, string_range_name, started):
+ """
+ Return a string that contains a date, or date range.
+ """
+ ended = datetime.now()
+ if (
+ started.year == ended.year
+ and started.month == ended.month
+ and started.day == ended.day
+ ):
+ if started.hour == ended.hour and started.minute == ended.minute:
+ text = strings._(string_name).format(started.strftime("%b %d, %I:%M%p"))
+ else:
+ text = strings._(string_range_name).format(
+ started.strftime("%b %d, %I:%M%p"), ended.strftime("%I:%M%p")
+ )
+ else:
+ text = strings._(string_range_name).format(
+ started.strftime("%b %d, %I:%M%p"), ended.strftime("%b %d, %I:%M%p")
+ )
+ return text
+
+
+class ShareHistoryItem(HistoryItem):
+ """
+ Download history item, for share mode
+ """
+
+ def __init__(self, common, id, total_bytes):
+ super(ShareHistoryItem, self).__init__()
+ self.common = common
+
+ self.id = id
+ self.total_bytes = total_bytes
+ self.downloaded_bytes = 0
+ self.started = time.time()
+ self.started_dt = datetime.fromtimestamp(self.started)
+ self.status = HistoryItem.STATUS_STARTED
+
+ # Label
+ self.label = QtWidgets.QLabel(
+ strings._("gui_all_modes_transfer_started").format(
+ self.started_dt.strftime("%b %d, %I:%M%p")
+ )
+ )
+
+ # Progress bar
+ self.progress_bar = QtWidgets.QProgressBar()
+ self.progress_bar.setTextVisible(True)
+ self.progress_bar.setAttribute(QtCore.Qt.WA_DeleteOnClose)
+ self.progress_bar.setAlignment(QtCore.Qt.AlignHCenter)
+ self.progress_bar.setMinimum(0)
+ self.progress_bar.setMaximum(total_bytes / 1024)
+ self.progress_bar.setValue(0)
+ self.progress_bar.setStyleSheet(
+ self.common.gui.css["downloads_uploads_progress_bar"]
+ )
+ self.progress_bar.total_bytes = total_bytes
+
+ # Layout
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(self.label)
+ layout.addWidget(self.progress_bar)
+ self.setLayout(layout)
+
+ # Start at 0
+ self.update(0)
+
+ def update(self, downloaded_bytes):
+ self.downloaded_bytes = downloaded_bytes
+
+ self.progress_bar.setValue(downloaded_bytes / 1024)
+ if (downloaded_bytes / 1024) == (self.progress_bar.total_bytes / 1024):
+ pb_fmt = strings._("gui_all_modes_progress_complete").format(
+ self.common.format_seconds(time.time() - self.started)
+ )
+
+ # Change the label
+ self.label.setText(self.get_finished_label_text(self.started_dt))
+ self.status = HistoryItem.STATUS_FINISHED
+
+ else:
+ elapsed = time.time() - self.started
+ if elapsed < 10:
+ # Wait a couple of seconds for the download rate to stabilize.
+ # This prevents a "Windows copy dialog"-esque experience at
+ # the beginning of the download.
+ pb_fmt = strings._("gui_all_modes_progress_starting").format(
+ self.common.human_readable_filesize(downloaded_bytes)
+ )
+ else:
+ pb_fmt = strings._("gui_all_modes_progress_eta").format(
+ self.common.human_readable_filesize(downloaded_bytes),
+ self.estimated_time_remaining,
+ )
+
+ self.progress_bar.setFormat(pb_fmt)
+
+ def cancel(self):
+ self.progress_bar.setFormat(strings._("gui_canceled"))
+ self.status = HistoryItem.STATUS_CANCELED
+
+ @property
+ def estimated_time_remaining(self):
+ return self.common.estimated_time_remaining(
+ self.downloaded_bytes, self.total_bytes, self.started
+ )
+
+
+class ReceiveHistoryItemFile(QtWidgets.QWidget):
+ def __init__(self, common, filename):
+ super(ReceiveHistoryItemFile, self).__init__()
+ self.common = common
+
+ self.common.log("ReceiveHistoryItemFile", "__init__", f"filename: {filename}")
+
+ self.filename = filename
+ self.dir = None
+ self.started = datetime.now()
+
+ # Filename label
+ self.filename_label = QtWidgets.QLabel(self.filename)
+ self.filename_label_width = self.filename_label.width()
+
+ # File size label
+ self.filesize_label = QtWidgets.QLabel()
+ self.filesize_label.setStyleSheet(self.common.gui.css["receive_file_size"])
+ self.filesize_label.hide()
+
+ # Folder button
+ folder_pixmap = QtGui.QPixmap.fromImage(
+ QtGui.QImage(self.common.get_resource_path("images/open_folder.png"))
+ )
+ folder_icon = QtGui.QIcon(folder_pixmap)
+ self.folder_button = QtWidgets.QPushButton()
+ self.folder_button.clicked.connect(self.open_folder)
+ self.folder_button.setIcon(folder_icon)
+ self.folder_button.setIconSize(folder_pixmap.rect().size())
+ self.folder_button.setFlat(True)
+ self.folder_button.hide()
+
+ # Layouts
+ layout = QtWidgets.QHBoxLayout()
+ layout.addWidget(self.filename_label)
+ layout.addWidget(self.filesize_label)
+ layout.addStretch()
+ layout.addWidget(self.folder_button)
+ self.setLayout(layout)
+
+ def update(self, uploaded_bytes, complete):
+ self.filesize_label.setText(self.common.human_readable_filesize(uploaded_bytes))
+ self.filesize_label.show()
+
+ if complete:
+ self.folder_button.show()
+
+ def rename(self, new_filename):
+ self.filename = new_filename
+ self.filename_label.setText(self.filename)
+
+ def set_dir(self, dir):
+ self.dir = dir
+
+ def open_folder(self):
+ """
+ Open the downloads folder, with the file selected, in a cross-platform manner
+ """
+ self.common.log("ReceiveHistoryItemFile", "open_folder")
+
+ if not self.dir:
+ self.common.log(
+ "ReceiveHistoryItemFile",
+ "open_folder",
+ "dir has not been set yet, can't open folder",
+ )
+ return
+
+ abs_filename = os.path.join(self.dir, self.filename)
+
+ # Linux
+ if self.common.platform == "Linux" or self.common.platform == "BSD":
+ try:
+ # If nautilus is available, open it
+ subprocess.Popen(["xdg-open", self.dir])
+ except:
+ Alert(
+ self.common,
+ strings._("gui_open_folder_error").format(abs_filename),
+ )
+
+ # macOS
+ elif self.common.platform == "Darwin":
+ subprocess.call(["open", "-R", abs_filename])
+
+ # Windows
+ elif self.common.platform == "Windows":
+ subprocess.Popen(["explorer", f"/select,{abs_filename}"])
+
+
+class ReceiveHistoryItem(HistoryItem):
+ def __init__(self, common, id, content_length):
+ super(ReceiveHistoryItem, self).__init__()
+ self.common = common
+ self.id = id
+ self.content_length = content_length
+ self.started = datetime.now()
+ self.status = HistoryItem.STATUS_STARTED
+
+ # Label
+ self.label = QtWidgets.QLabel(
+ strings._("gui_all_modes_transfer_started").format(
+ self.started.strftime("%b %d, %I:%M%p")
+ )
+ )
+
+ # Progress bar
+ self.progress_bar = QtWidgets.QProgressBar()
+ self.progress_bar.setTextVisible(True)
+ self.progress_bar.setAttribute(QtCore.Qt.WA_DeleteOnClose)
+ self.progress_bar.setAlignment(QtCore.Qt.AlignHCenter)
+ self.progress_bar.setMinimum(0)
+ self.progress_bar.setValue(0)
+ self.progress_bar.setStyleSheet(
+ self.common.gui.css["downloads_uploads_progress_bar"]
+ )
+
+ # This layout contains file widgets
+ self.files_layout = QtWidgets.QVBoxLayout()
+ self.files_layout.setContentsMargins(0, 0, 0, 0)
+ files_widget = QtWidgets.QWidget()
+ files_widget.setStyleSheet(self.common.gui.css["receive_file"])
+ files_widget.setLayout(self.files_layout)
+
+ # Layout
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(self.label)
+ layout.addWidget(self.progress_bar)
+ layout.addWidget(files_widget)
+ layout.addStretch()
+ self.setLayout(layout)
+
+ # We're also making a dictionary of file widgets, to make them easier to access
+ self.files = {}
+
+ def update(self, data):
+ """
+ Using the progress from Web, update the progress bar and file size labels
+ for each file
+ """
+ if data["action"] == "progress":
+ total_uploaded_bytes = 0
+ for filename in data["progress"]:
+ total_uploaded_bytes += data["progress"][filename]["uploaded_bytes"]
+
+ # Update the progress bar
+ self.progress_bar.setMaximum(self.content_length / 1024)
+ self.progress_bar.setValue(total_uploaded_bytes / 1024)
+
+ elapsed = datetime.now() - self.started
+ if elapsed.seconds < 10:
+ pb_fmt = strings._("gui_all_modes_progress_starting").format(
+ self.common.human_readable_filesize(total_uploaded_bytes)
+ )
+ else:
+ estimated_time_remaining = self.common.estimated_time_remaining(
+ total_uploaded_bytes, self.content_length, self.started.timestamp()
+ )
+ pb_fmt = strings._("gui_all_modes_progress_eta").format(
+ self.common.human_readable_filesize(total_uploaded_bytes),
+ estimated_time_remaining,
+ )
+
+ self.progress_bar.setFormat(pb_fmt)
+
+ # Using list(progress) to avoid "RuntimeError: dictionary changed size during iteration"
+ for filename in list(data["progress"]):
+ # Add a new file if needed
+ if filename not in self.files:
+ self.files[filename] = ReceiveHistoryItemFile(self.common, filename)
+ self.files_layout.addWidget(self.files[filename])
+
+ # Update the file
+ self.files[filename].update(
+ data["progress"][filename]["uploaded_bytes"],
+ data["progress"][filename]["complete"],
+ )
+
+ elif data["action"] == "rename":
+ self.files[data["old_filename"]].rename(data["new_filename"])
+ self.files[data["new_filename"]] = self.files.pop(data["old_filename"])
+
+ elif data["action"] == "set_dir":
+ self.files[data["filename"]].set_dir(data["dir"])
+
+ elif data["action"] == "finished":
+ # Change the status
+ self.status = HistoryItem.STATUS_FINISHED
+
+ # Hide the progress bar
+ self.progress_bar.hide()
+
+ # Change the label
+ self.label.setText(self.get_finished_label_text(self.started))
+
+ elif data["action"] == "canceled":
+ # Change the status
+ self.status = HistoryItem.STATUS_CANCELED
+
+ # Hide the progress bar
+ self.progress_bar.hide()
+
+ # Change the label
+ self.label.setText(self.get_canceled_label_text(self.started))
+
+
+class IndividualFileHistoryItem(HistoryItem):
+ """
+ Individual file history item, for share mode viewing of individual files
+ """
+
+ def __init__(self, common, data, path):
+ super(IndividualFileHistoryItem, self).__init__()
+ self.status = HistoryItem.STATUS_STARTED
+ self.common = common
+
+ self.id = id
+ self.path = path
+ self.total_bytes = 0
+ self.downloaded_bytes = 0
+ self.started = time.time()
+ self.started_dt = datetime.fromtimestamp(self.started)
+ self.status = HistoryItem.STATUS_STARTED
+
+ self.directory_listing = "directory_listing" in data
+
+ # Labels
+ self.timestamp_label = QtWidgets.QLabel(
+ self.started_dt.strftime("%b %d, %I:%M%p")
+ )
+ self.timestamp_label.setStyleSheet(
+ self.common.gui.css["history_individual_file_timestamp_label"]
+ )
+ self.path_label = QtWidgets.QLabel(self.path)
+ self.status_code_label = QtWidgets.QLabel()
+
+ # Progress bar
+ self.progress_bar = QtWidgets.QProgressBar()
+ self.progress_bar.setTextVisible(True)
+ self.progress_bar.setAttribute(QtCore.Qt.WA_DeleteOnClose)
+ self.progress_bar.setAlignment(QtCore.Qt.AlignHCenter)
+ self.progress_bar.setValue(0)
+ self.progress_bar.setStyleSheet(
+ self.common.gui.css["downloads_uploads_progress_bar"]
+ )
+
+ # Text layout
+ labels_layout = QtWidgets.QHBoxLayout()
+ labels_layout.addWidget(self.timestamp_label)
+ labels_layout.addWidget(self.path_label)
+ labels_layout.addWidget(self.status_code_label)
+ labels_layout.addStretch()
+
+ # Layout
+ layout = QtWidgets.QVBoxLayout()
+ layout.addLayout(labels_layout)
+ layout.addWidget(self.progress_bar)
+ self.setLayout(layout)
+
+ # Is a status code already sent?
+ if "status_code" in data:
+ self.status_code_label.setText(str(data["status_code"]))
+ if data["status_code"] >= 200 and data["status_code"] < 300:
+ self.status_code_label.setStyleSheet(
+ self.common.gui.css["history_individual_file_status_code_label_2xx"]
+ )
+ if data["status_code"] >= 400 and data["status_code"] < 500:
+ self.status_code_label.setStyleSheet(
+ self.common.gui.css["history_individual_file_status_code_label_4xx"]
+ )
+ self.status = HistoryItem.STATUS_FINISHED
+ self.progress_bar.hide()
+ return
+
+ else:
+ self.total_bytes = data["filesize"]
+ self.progress_bar.setMinimum(0)
+ self.progress_bar.setMaximum(data["filesize"] / 1024)
+ self.progress_bar.total_bytes = data["filesize"]
+
+ # Start at 0
+ self.update(0)
+
+ def update(self, downloaded_bytes):
+ self.downloaded_bytes = downloaded_bytes
+
+ self.progress_bar.setValue(downloaded_bytes / 1024)
+ if (downloaded_bytes / 1024) == (self.progress_bar.total_bytes / 1024):
+ self.status_code_label.setText("200")
+ self.status_code_label.setStyleSheet(
+ self.common.gui.css["history_individual_file_status_code_label_2xx"]
+ )
+ self.progress_bar.hide()
+ self.status = HistoryItem.STATUS_FINISHED
+
+ else:
+ elapsed = time.time() - self.started
+ if elapsed < 10:
+ # Wait a couple of seconds for the download rate to stabilize.
+ # This prevents a "Windows copy dialog"-esque experience at
+ # the beginning of the download.
+ pb_fmt = strings._("gui_all_modes_progress_starting").format(
+ self.common.human_readable_filesize(downloaded_bytes)
+ )
+ else:
+ pb_fmt = strings._("gui_all_modes_progress_eta").format(
+ self.common.human_readable_filesize(downloaded_bytes),
+ self.estimated_time_remaining,
+ )
+
+ self.progress_bar.setFormat(pb_fmt)
+
+ def cancel(self):
+ self.progress_bar.setFormat(strings._("gui_canceled"))
+ self.status = HistoryItem.STATUS_CANCELED
+
+ @property
+ def estimated_time_remaining(self):
+ return self.common.estimated_time_remaining(
+ self.downloaded_bytes, self.total_bytes, self.started
+ )
+
+
+class HistoryItemList(QtWidgets.QScrollArea):
+ """
+ List of items
+ """
+
+ def __init__(self, common):
+ super(HistoryItemList, self).__init__()
+ self.common = common
+
+ self.items = {}
+
+ # The layout that holds all of the items
+ self.items_layout = QtWidgets.QVBoxLayout()
+ self.items_layout.setContentsMargins(0, 0, 0, 0)
+ self.items_layout.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize)
+
+ # Wrapper layout that also contains a stretch
+ wrapper_layout = QtWidgets.QVBoxLayout()
+ wrapper_layout.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize)
+ wrapper_layout.addLayout(self.items_layout)
+ wrapper_layout.addStretch()
+
+ # The internal widget of the scroll area
+ widget = QtWidgets.QWidget()
+ widget.setLayout(wrapper_layout)
+ self.setWidget(widget)
+ self.setWidgetResizable(True)
+
+ # Other scroll area settings
+ self.setBackgroundRole(QtGui.QPalette.Light)
+ self.verticalScrollBar().rangeChanged.connect(self.resizeScroll)
+
+ def resizeScroll(self, minimum, maximum):
+ """
+ Scroll to the bottom of the window when the range changes.
+ """
+ self.verticalScrollBar().setValue(maximum)
+
+ def add(self, id, item):
+ """
+ Add a new item. Override this method.
+ """
+ self.items[id] = item
+ self.items_layout.addWidget(item)
+
+ def update(self, id, data):
+ """
+ Update an item. Override this method.
+ """
+ if id in self.items:
+ self.items[id].update(data)
+
+ def cancel(self, id):
+ """
+ Cancel an item. Override this method.
+ """
+ if id in self.items:
+ self.items[id].cancel()
+
+ def reset(self):
+ """
+ Reset all items, emptying the list. Override this method.
+ """
+ for key, item in self.items.copy().items():
+ self.items_layout.removeWidget(item)
+ item.close()
+ del self.items[key]
+
+
+class History(QtWidgets.QWidget):
+ """
+ A history of what's happened so far in this mode. This contains an internal
+ object full of a scrollable list of items.
+ """
+
+ def __init__(self, common, empty_image, empty_text, header_text, mode=""):
+ super(History, self).__init__()
+ self.common = common
+ self.mode = mode
+
+ self.setMinimumWidth(350)
+
+ # In progress and completed counters
+ self.in_progress_count = 0
+ self.completed_count = 0
+ self.requests_count = 0
+
+ # In progress, completed, and requests labels
+ self.in_progress_label = QtWidgets.QLabel()
+ self.in_progress_label.setStyleSheet(self.common.gui.css["mode_info_label"])
+ self.completed_label = QtWidgets.QLabel()
+ self.completed_label.setStyleSheet(self.common.gui.css["mode_info_label"])
+ self.requests_label = QtWidgets.QLabel()
+ self.requests_label.setStyleSheet(self.common.gui.css["mode_info_label"])
+
+ # Header
+ self.header_label = QtWidgets.QLabel(header_text)
+ self.header_label.setStyleSheet(self.common.gui.css["downloads_uploads_label"])
+ self.clear_button = QtWidgets.QPushButton(
+ strings._("gui_all_modes_clear_history")
+ )
+ self.clear_button.setStyleSheet(self.common.gui.css["downloads_uploads_clear"])
+ self.clear_button.setFlat(True)
+ self.clear_button.clicked.connect(self.reset)
+ header_layout = QtWidgets.QHBoxLayout()
+ header_layout.addWidget(self.header_label)
+ header_layout.addStretch()
+ header_layout.addWidget(self.in_progress_label)
+ header_layout.addWidget(self.completed_label)
+ header_layout.addWidget(self.requests_label)
+ header_layout.addWidget(self.clear_button)
+
+ # When there are no items
+ self.empty_image = QtWidgets.QLabel()
+ self.empty_image.setAlignment(QtCore.Qt.AlignCenter)
+ self.empty_image.setPixmap(empty_image)
+ self.empty_text = QtWidgets.QLabel(empty_text)
+ self.empty_text.setAlignment(QtCore.Qt.AlignCenter)
+ self.empty_text.setStyleSheet(
+ self.common.gui.css["downloads_uploads_empty_text"]
+ )
+ empty_layout = QtWidgets.QVBoxLayout()
+ empty_layout.addStretch()
+ empty_layout.addWidget(self.empty_image)
+ empty_layout.addWidget(self.empty_text)
+ empty_layout.addStretch()
+ self.empty = QtWidgets.QWidget()
+ self.empty.setStyleSheet(self.common.gui.css["downloads_uploads_empty"])
+ self.empty.setLayout(empty_layout)
+
+ # When there are items
+ self.item_list = HistoryItemList(self.common)
+ self.not_empty_layout = QtWidgets.QVBoxLayout()
+ self.not_empty_layout.addLayout(header_layout)
+ self.not_empty_layout.addWidget(self.item_list)
+ self.not_empty = QtWidgets.QWidget()
+ self.not_empty.setLayout(self.not_empty_layout)
+
+ # Layout
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.addWidget(self.empty)
+ layout.addWidget(self.not_empty)
+ self.setLayout(layout)
+
+ # Reset once at the beginning
+ self.reset()
+
+ def add(self, id, item):
+ """
+ Add a new item.
+ """
+ self.common.log("History", "add", f"id: {id}, item: {item}")
+
+ # Hide empty, show not empty
+ self.empty.hide()
+ self.not_empty.show()
+
+ # Add it to the list
+ self.item_list.add(id, item)
+
+ def update(self, id, data):
+ """
+ Update an item.
+ """
+ self.item_list.update(id, data)
+
+ def cancel(self, id):
+ """
+ Cancel an item.
+ """
+ self.item_list.cancel(id)
+
+ def reset(self):
+ """
+ Reset all items.
+ """
+ self.item_list.reset()
+ if len(self.item_list.items) == 0:
+ # Hide not empty, show empty
+ self.not_empty.hide()
+ self.empty.show()
+ # Reset in-progress counter
+ self.in_progress_count = 0
+ self.update_in_progress()
+
+ # Reset completed counter
+ self.completed_count = 0
+ self.update_completed()
+
+ # Reset web requests counter
+ self.requests_count = 0
+ self.update_requests()
+
+ def update_completed(self):
+ """
+ Update the 'completed' widget.
+ """
+ if self.completed_count == 0:
+ image = self.common.get_resource_path("images/history_completed_none.png")
+ else:
+ image = self.common.get_resource_path("images/history_completed.png")
+ self.completed_label.setText(f'<img src="{image}" /> {self.completed_count}')
+ self.completed_label.setToolTip(
+ strings._("history_completed_tooltip").format(self.completed_count)
+ )
+
+ def update_in_progress(self):
+ """
+ Update the 'in progress' widget.
+ """
+ if self.in_progress_count == 0:
+ image = self.common.get_resource_path("images/history_in_progress_none.png")
+ else:
+ image = self.common.get_resource_path("images/history_in_progress.png")
+
+ self.in_progress_label.setText(
+ f'<img src="{image}" /> {self.in_progress_count}'
+ )
+ self.in_progress_label.setToolTip(
+ strings._("history_in_progress_tooltip").format(self.in_progress_count)
+ )
+
+ def update_requests(self):
+ """
+ Update the 'web requests' widget.
+ """
+ if self.requests_count == 0:
+ image = self.common.get_resource_path("images/history_requests_none.png")
+ else:
+ image = self.common.get_resource_path("images/history_requests.png")
+
+ self.requests_label.setText(f'<img src="{image}" /> {self.requests_count}')
+ self.requests_label.setToolTip(
+ strings._("history_requests_tooltip").format(self.requests_count)
+ )
+
+
+class ToggleHistory(QtWidgets.QPushButton):
+ """
+ Widget for toggling showing or hiding the history, as well as keeping track
+ of the indicator counter if it's hidden
+ """
+
+ def __init__(self, common, current_mode, history_widget, icon, selected_icon):
+ super(ToggleHistory, self).__init__()
+ self.common = common
+ self.current_mode = current_mode
+ self.history_widget = history_widget
+ self.icon = icon
+ self.selected_icon = selected_icon
+
+ # Toggle button
+ self.setDefault(False)
+ self.setFixedWidth(35)
+ self.setFixedHeight(30)
+ self.setFlat(True)
+ self.setIcon(icon)
+ self.clicked.connect(self.toggle_clicked)
+
+ # Keep track of indicator
+ self.indicator_count = 0
+ self.indicator_label = QtWidgets.QLabel(parent=self)
+ self.indicator_label.setStyleSheet(
+ self.common.gui.css["download_uploads_indicator"]
+ )
+ self.update_indicator()
+
+ def update_indicator(self, increment=False):
+ """
+ Update the display of the indicator count. If increment is True, then
+ only increment the counter if History is hidden.
+ """
+ if increment and not self.history_widget.isVisible():
+ self.indicator_count += 1
+
+ self.indicator_label.setText(str(self.indicator_count))
+
+ if self.indicator_count == 0:
+ self.indicator_label.hide()
+ else:
+ size = self.indicator_label.sizeHint()
+ self.indicator_label.setGeometry(
+ 35 - size.width(), 0, size.width(), size.height()
+ )
+ self.indicator_label.show()
+
+ def toggle_clicked(self):
+ """
+ Toggle showing and hiding the history widget
+ """
+ self.common.log("ToggleHistory", "toggle_clicked")
+
+ if self.history_widget.isVisible():
+ self.history_widget.hide()
+ self.setIcon(self.icon)
+ self.setFlat(True)
+ else:
+ self.history_widget.show()
+ self.setIcon(self.selected_icon)
+ self.setFlat(False)
+
+ # Reset the indicator count
+ self.indicator_count = 0
+ self.update_indicator()
diff --git a/desktop/onionshare_gui/tab/mode/mode_settings_widget.py b/desktop/onionshare_gui/tab/mode/mode_settings_widget.py
new file mode 100644
index 00000000..7c3b4667
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/mode_settings_widget.py
@@ -0,0 +1,296 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets
+
+from onionshare import strings
+
+
+class ModeSettingsWidget(QtWidgets.QWidget):
+ """
+ All of the common settings for each mode are in this widget
+ """
+
+ change_persistent = QtCore.pyqtSignal(int, bool)
+
+ def __init__(self, common, tab, mode_settings):
+ super(ModeSettingsWidget, self).__init__()
+ self.common = common
+ self.tab = tab
+ self.settings = mode_settings
+
+ # Downstream Mode need to fill in this layout with its settings
+ self.mode_specific_layout = QtWidgets.QVBoxLayout()
+
+ # Persistent
+ self.persistent_checkbox = QtWidgets.QCheckBox()
+ self.persistent_checkbox.clicked.connect(self.persistent_checkbox_clicked)
+ self.persistent_checkbox.setText(strings._("mode_settings_persistent_checkbox"))
+ if self.settings.get("persistent", "enabled"):
+ self.persistent_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.persistent_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ # Public
+ self.public_checkbox = QtWidgets.QCheckBox()
+ self.public_checkbox.clicked.connect(self.public_checkbox_clicked)
+ self.public_checkbox.setText(strings._("mode_settings_public_checkbox"))
+ if self.settings.get("general", "public"):
+ self.public_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.public_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ # Whether or not to use an auto-start timer
+ self.autostart_timer_checkbox = QtWidgets.QCheckBox()
+ self.autostart_timer_checkbox.clicked.connect(
+ self.autostart_timer_checkbox_clicked
+ )
+ self.autostart_timer_checkbox.setText(
+ strings._("mode_settings_autostart_timer_checkbox")
+ )
+ if self.settings.get("general", "autostart_timer"):
+ self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ # The autostart timer widget
+ self.autostart_timer_widget = QtWidgets.QDateTimeEdit()
+ self.autostart_timer_widget.setDisplayFormat("hh:mm A MMM d, yy")
+ self.autostart_timer_reset()
+ self.autostart_timer_widget.setCurrentSection(
+ QtWidgets.QDateTimeEdit.MinuteSection
+ )
+ if self.settings.get("general", "autostart_timer"):
+ self.autostart_timer_widget.show()
+ else:
+ self.autostart_timer_widget.hide()
+
+ # Autostart timer layout
+ autostart_timer_layout = QtWidgets.QHBoxLayout()
+ autostart_timer_layout.setContentsMargins(0, 0, 0, 0)
+ autostart_timer_layout.addWidget(self.autostart_timer_checkbox)
+ autostart_timer_layout.addWidget(self.autostart_timer_widget)
+
+ # Whether or not to use an auto-stop timer
+ self.autostop_timer_checkbox = QtWidgets.QCheckBox()
+ self.autostop_timer_checkbox.clicked.connect(
+ self.autostop_timer_checkbox_clicked
+ )
+ self.autostop_timer_checkbox.setText(
+ strings._("mode_settings_autostop_timer_checkbox")
+ )
+ if self.settings.get("general", "autostop_timer"):
+ self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ # The autostop timer widget
+ self.autostop_timer_widget = QtWidgets.QDateTimeEdit()
+ self.autostop_timer_widget.setDisplayFormat("hh:mm A MMM d, yy")
+ self.autostop_timer_reset()
+ self.autostop_timer_widget.setCurrentSection(
+ QtWidgets.QDateTimeEdit.MinuteSection
+ )
+ if self.settings.get("general", "autostop_timer"):
+ self.autostop_timer_widget.show()
+ else:
+ self.autostop_timer_widget.hide()
+
+ # Autostop timer layout
+ autostop_timer_layout = QtWidgets.QHBoxLayout()
+ autostop_timer_layout.setContentsMargins(0, 0, 0, 0)
+ autostop_timer_layout.addWidget(self.autostop_timer_checkbox)
+ autostop_timer_layout.addWidget(self.autostop_timer_widget)
+
+ # Legacy address
+ self.legacy_checkbox = QtWidgets.QCheckBox()
+ self.legacy_checkbox.clicked.connect(self.legacy_checkbox_clicked)
+ self.legacy_checkbox.clicked.connect(self.update_ui)
+ self.legacy_checkbox.setText(strings._("mode_settings_legacy_checkbox"))
+ if self.settings.get("general", "legacy"):
+ self.legacy_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.legacy_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ # Client auth
+ self.client_auth_checkbox = QtWidgets.QCheckBox()
+ self.client_auth_checkbox.clicked.connect(self.client_auth_checkbox_clicked)
+ self.client_auth_checkbox.clicked.connect(self.update_ui)
+ self.client_auth_checkbox.setText(
+ strings._("mode_settings_client_auth_checkbox")
+ )
+ if self.settings.get("general", "client_auth"):
+ self.client_auth_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.client_auth_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ # Toggle advanced settings
+ self.toggle_advanced_button = QtWidgets.QPushButton()
+ self.toggle_advanced_button.clicked.connect(self.toggle_advanced_clicked)
+ self.toggle_advanced_button.setFlat(True)
+ self.toggle_advanced_button.setStyleSheet(
+ self.common.gui.css["mode_settings_toggle_advanced"]
+ )
+
+ # Advanced group itself
+ advanced_layout = QtWidgets.QVBoxLayout()
+ advanced_layout.setContentsMargins(0, 0, 0, 0)
+ advanced_layout.addLayout(autostart_timer_layout)
+ advanced_layout.addLayout(autostop_timer_layout)
+ advanced_layout.addWidget(self.legacy_checkbox)
+ advanced_layout.addWidget(self.client_auth_checkbox)
+ self.advanced_widget = QtWidgets.QWidget()
+ self.advanced_widget.setLayout(advanced_layout)
+ self.advanced_widget.hide()
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addLayout(self.mode_specific_layout)
+ layout.addWidget(self.persistent_checkbox)
+ layout.addWidget(self.public_checkbox)
+ layout.addWidget(self.advanced_widget)
+ layout.addWidget(self.toggle_advanced_button)
+ self.setLayout(layout)
+
+ self.update_ui()
+
+ def update_ui(self):
+ # Update text on advanced group toggle button
+ if self.advanced_widget.isVisible():
+ self.toggle_advanced_button.setText(
+ strings._("mode_settings_advanced_toggle_hide")
+ )
+ else:
+ self.toggle_advanced_button.setText(
+ strings._("mode_settings_advanced_toggle_show")
+ )
+
+ # Client auth is only a legacy option
+ if self.client_auth_checkbox.isChecked():
+ self.legacy_checkbox.setChecked(True)
+ self.legacy_checkbox.setEnabled(False)
+ else:
+ self.legacy_checkbox.setEnabled(True)
+ if self.legacy_checkbox.isChecked():
+ self.client_auth_checkbox.show()
+ else:
+ self.client_auth_checkbox.hide()
+
+ # If the server has been started in the past, prevent changing legacy option
+ if self.settings.get("onion", "private_key"):
+ if self.legacy_checkbox.isChecked():
+ # If using legacy, disable legacy and client auth options
+ self.legacy_checkbox.setEnabled(False)
+ self.client_auth_checkbox.setEnabled(False)
+ else:
+ # If using v3, hide legacy and client auth options
+ self.legacy_checkbox.hide()
+ self.client_auth_checkbox.hide()
+
+ def persistent_checkbox_clicked(self):
+ self.settings.set("persistent", "enabled", self.persistent_checkbox.isChecked())
+ self.settings.set("persistent", "mode", self.tab.mode)
+ self.change_persistent.emit(
+ self.tab.tab_id, self.persistent_checkbox.isChecked()
+ )
+
+ # If disabling persistence, delete the file from disk
+ if not self.persistent_checkbox.isChecked():
+ self.settings.delete()
+
+ def public_checkbox_clicked(self):
+ self.settings.set("general", "public", self.public_checkbox.isChecked())
+
+ def autostart_timer_checkbox_clicked(self):
+ self.settings.set(
+ "general", "autostart_timer", self.autostart_timer_checkbox.isChecked()
+ )
+
+ if self.autostart_timer_checkbox.isChecked():
+ self.autostart_timer_widget.show()
+ else:
+ self.autostart_timer_widget.hide()
+
+ def autostop_timer_checkbox_clicked(self):
+ self.settings.set(
+ "general", "autostop_timer", self.autostop_timer_checkbox.isChecked()
+ )
+
+ if self.autostop_timer_checkbox.isChecked():
+ self.autostop_timer_widget.show()
+ else:
+ self.autostop_timer_widget.hide()
+
+ def legacy_checkbox_clicked(self):
+ self.settings.set("general", "legacy", self.legacy_checkbox.isChecked())
+
+ def client_auth_checkbox_clicked(self):
+ self.settings.set(
+ "general", "client_auth", self.client_auth_checkbox.isChecked()
+ )
+
+ def toggle_advanced_clicked(self):
+ if self.advanced_widget.isVisible():
+ self.advanced_widget.hide()
+ else:
+ self.advanced_widget.show()
+
+ self.update_ui()
+
+ def autostart_timer_reset(self):
+ """
+ Reset the auto-start timer in the UI after stopping a share
+ """
+ if self.common.gui.local_only:
+ # For testing
+ self.autostart_timer_widget.setDateTime(
+ QtCore.QDateTime.currentDateTime().addSecs(15)
+ )
+ self.autostart_timer_widget.setMinimumDateTime(
+ QtCore.QDateTime.currentDateTime()
+ )
+ else:
+ self.autostart_timer_widget.setDateTime(
+ QtCore.QDateTime.currentDateTime().addSecs(
+ 300
+ ) # 5 minutes in the future
+ )
+ self.autostart_timer_widget.setMinimumDateTime(
+ QtCore.QDateTime.currentDateTime().addSecs(60)
+ )
+
+ def autostop_timer_reset(self):
+ """
+ Reset the auto-stop timer in the UI after stopping a share
+ """
+ if self.common.gui.local_only:
+ # For testing
+ self.autostop_timer_widget.setDateTime(
+ QtCore.QDateTime.currentDateTime().addSecs(15)
+ )
+ self.autostop_timer_widget.setMinimumDateTime(
+ QtCore.QDateTime.currentDateTime()
+ )
+ else:
+ self.autostop_timer_widget.setDateTime(
+ QtCore.QDateTime.currentDateTime().addSecs(300)
+ )
+ self.autostop_timer_widget.setMinimumDateTime(
+ QtCore.QDateTime.currentDateTime().addSecs(60)
+ )
diff --git a/desktop/onionshare_gui/tab/mode/receive_mode/__init__.py b/desktop/onionshare_gui/tab/mode/receive_mode/__init__.py
new file mode 100644
index 00000000..e6ca6f70
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/receive_mode/__init__.py
@@ -0,0 +1,323 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.web import Web
+
+from ..history import History, ToggleHistory, ReceiveHistoryItem
+from .. import Mode
+from ....widgets import MinimumWidthWidget, Alert
+
+
+class ReceiveMode(Mode):
+ """
+ Parts of the main window UI for receiving files.
+ """
+
+ def init(self):
+ """
+ Custom initialization for ReceiveMode.
+ """
+ # Create the Web object
+ self.web = Web(self.common, True, self.settings, "receive")
+
+ # Receive image
+ self.image_label = QtWidgets.QLabel()
+ self.image_label.setPixmap(
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(self.common.get_resource_path("images/mode_receive.png"))
+ )
+ )
+ self.image_label.setFixedSize(250, 250)
+ image_layout = QtWidgets.QVBoxLayout()
+ image_layout.addWidget(self.image_label)
+ self.image = QtWidgets.QWidget()
+ self.image.setLayout(image_layout)
+
+ # Settings
+ data_dir_label = QtWidgets.QLabel(
+ strings._("mode_settings_receive_data_dir_label")
+ )
+ self.data_dir_lineedit = QtWidgets.QLineEdit()
+ self.data_dir_lineedit.setReadOnly(True)
+ self.data_dir_lineedit.setText(self.settings.get("receive", "data_dir"))
+ data_dir_button = QtWidgets.QPushButton(
+ strings._("mode_settings_receive_data_dir_browse_button")
+ )
+ data_dir_button.clicked.connect(self.data_dir_button_clicked)
+ data_dir_layout = QtWidgets.QHBoxLayout()
+ data_dir_layout.addWidget(data_dir_label)
+ data_dir_layout.addWidget(self.data_dir_lineedit)
+ data_dir_layout.addWidget(data_dir_button)
+
+ self.mode_settings_widget.mode_specific_layout.addLayout(data_dir_layout)
+
+ # Server status
+ self.server_status.set_mode("receive")
+ self.server_status.server_started_finished.connect(self.update_primary_action)
+ self.server_status.server_stopped.connect(self.update_primary_action)
+ self.server_status.server_canceled.connect(self.update_primary_action)
+
+ # Tell server_status about web, then update
+ self.server_status.web = self.web
+ self.server_status.update()
+
+ # Upload history
+ self.history = History(
+ self.common,
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(
+ self.common.get_resource_path("images/receive_icon_transparent.png")
+ )
+ ),
+ strings._("gui_receive_mode_no_files"),
+ strings._("gui_all_modes_history"),
+ )
+ self.history.hide()
+
+ # Toggle history
+ self.toggle_history = ToggleHistory(
+ self.common,
+ self,
+ self.history,
+ QtGui.QIcon(
+ self.common.get_resource_path("images/receive_icon_toggle.png")
+ ),
+ QtGui.QIcon(
+ self.common.get_resource_path("images/receive_icon_toggle_selected.png")
+ ),
+ )
+
+ # Header
+ header_label = QtWidgets.QLabel(strings._("gui_new_tab_receive_button"))
+ header_label.setStyleSheet(self.common.gui.css["mode_header_label"])
+
+ # Receive mode warning
+ receive_warning = QtWidgets.QLabel(strings._("gui_receive_mode_warning"))
+ receive_warning.setMinimumHeight(80)
+ receive_warning.setWordWrap(True)
+
+ # Top bar
+ top_bar_layout = QtWidgets.QHBoxLayout()
+ top_bar_layout.addStretch()
+ top_bar_layout.addWidget(self.toggle_history)
+
+ # Main layout
+ self.main_layout = QtWidgets.QVBoxLayout()
+ self.main_layout.addWidget(header_label)
+ self.main_layout.addWidget(receive_warning)
+ self.main_layout.addWidget(self.primary_action)
+ self.main_layout.addWidget(MinimumWidthWidget(525))
+
+ # Row layout
+ content_row = QtWidgets.QHBoxLayout()
+ content_row.addLayout(self.main_layout)
+ content_row.addWidget(self.image)
+ row_layout = QtWidgets.QVBoxLayout()
+ row_layout.addLayout(top_bar_layout)
+ row_layout.addStretch()
+ row_layout.addLayout(content_row)
+ row_layout.addWidget(self.server_status)
+ row_layout.addStretch()
+
+
+ # Column layout
+ self.column_layout = QtWidgets.QHBoxLayout()
+ self.column_layout.addLayout(row_layout)
+ self.column_layout.addWidget(self.history, stretch=1)
+
+ # Wrapper layout
+ self.wrapper_layout = QtWidgets.QVBoxLayout()
+ self.wrapper_layout.addLayout(self.column_layout)
+ self.setLayout(self.wrapper_layout)
+
+ def data_dir_button_clicked(self):
+ """
+ Browse for a new OnionShare data directory, and save to tab settings
+ """
+ data_dir = self.data_dir_lineedit.text()
+ selected_dir = QtWidgets.QFileDialog.getExistingDirectory(
+ self, strings._("mode_settings_receive_data_dir_label"), data_dir
+ )
+
+ if selected_dir:
+ # If we're running inside a flatpak package, the data dir must be inside ~/OnionShare
+ if self.common.gui.is_flatpak:
+ if not selected_dir.startswith(os.path.expanduser("~/OnionShare")):
+ Alert(self.common, strings._("gui_receive_flatpak_data_dir"))
+ return
+
+ self.common.log(
+ "ReceiveMode",
+ "data_dir_button_clicked",
+ f"selected dir: {selected_dir}",
+ )
+ self.data_dir_lineedit.setText(selected_dir)
+ self.settings.set("receive", "data_dir", selected_dir)
+
+ def get_stop_server_autostop_timer_text(self):
+ """
+ Return the string to put on the stop server button, if there's an auto-stop timer
+ """
+ return strings._("gui_receive_stop_server_autostop_timer")
+
+ def autostop_timer_finished_should_stop_server(self):
+ """
+ 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.cur_history_id == 0
+ or not self.web.receive_mode.uploads_in_progress
+ ):
+ self.server_status.stop_server()
+ 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_autostop_timer_waiting")
+ )
+ self.web.receive_mode.can_upload = False
+ return False
+
+ def start_server_custom(self):
+ """
+ Starting the server.
+ """
+ # Reset web counters
+ self.web.receive_mode.cur_history_id = 0
+ self.web.reset_invalid_passwords()
+
+ # Hide and reset the uploads if we have previously shared
+ self.reset_info_counters()
+
+ def start_server_step2_custom(self):
+ """
+ Step 2 in starting the server.
+ """
+ # Continue
+ self.starting_server_step3.emit()
+ self.start_server_finished.emit()
+
+ def handle_tor_broke_custom(self):
+ """
+ Connection to Tor broke.
+ """
+ self.primary_action.hide()
+
+ def handle_request_load(self, event):
+ """
+ Handle REQUEST_LOAD event.
+ """
+ self.system_tray.showMessage(
+ strings._("systray_page_loaded_title"),
+ strings._("systray_page_loaded_message"),
+ )
+
+ def handle_request_started(self, event):
+ """
+ Handle REQUEST_STARTED event.
+ """
+ item = ReceiveHistoryItem(
+ self.common, event["data"]["id"], event["data"]["content_length"]
+ )
+ self.history.add(event["data"]["id"], item)
+ self.toggle_history.update_indicator(True)
+ self.history.in_progress_count += 1
+ self.history.update_in_progress()
+
+ self.system_tray.showMessage(
+ strings._("systray_receive_started_title"),
+ strings._("systray_receive_started_message"),
+ )
+
+ def handle_request_progress(self, event):
+ """
+ Handle REQUEST_PROGRESS event.
+ """
+ self.history.update(
+ event["data"]["id"],
+ {"action": "progress", "progress": event["data"]["progress"]},
+ )
+
+ def handle_request_upload_file_renamed(self, event):
+ """
+ Handle REQUEST_UPLOAD_FILE_RENAMED event.
+ """
+ self.history.update(
+ event["data"]["id"],
+ {
+ "action": "rename",
+ "old_filename": event["data"]["old_filename"],
+ "new_filename": event["data"]["new_filename"],
+ },
+ )
+
+ def handle_request_upload_set_dir(self, event):
+ """
+ Handle REQUEST_UPLOAD_SET_DIR event.
+ """
+ self.history.update(
+ event["data"]["id"],
+ {
+ "action": "set_dir",
+ "filename": event["data"]["filename"],
+ "dir": event["data"]["dir"],
+ },
+ )
+
+ def handle_request_upload_finished(self, event):
+ """
+ Handle REQUEST_UPLOAD_FINISHED event.
+ """
+ self.history.update(event["data"]["id"], {"action": "finished"})
+ self.history.completed_count += 1
+ self.history.in_progress_count -= 1
+ self.history.update_completed()
+ self.history.update_in_progress()
+
+ def handle_request_upload_canceled(self, event):
+ """
+ Handle REQUEST_UPLOAD_CANCELED event.
+ """
+ self.history.update(event["data"]["id"], {"action": "canceled"})
+ self.history.in_progress_count -= 1
+ self.history.update_in_progress()
+
+ def on_reload_settings(self):
+ """
+ We should be ok to re-enable the 'Start Receive Mode' button now.
+ """
+ self.primary_action.show()
+
+ def reset_info_counters(self):
+ """
+ Set the info counters back to zero.
+ """
+ self.history.reset()
+ self.toggle_history.indicator_count = 0
+ self.toggle_history.update_indicator()
+
+ def update_primary_action(self):
+ self.common.log("ReceiveMode", "update_primary_action")
diff --git a/desktop/onionshare_gui/tab/mode/share_mode/__init__.py b/desktop/onionshare_gui/tab/mode/share_mode/__init__.py
new file mode 100644
index 00000000..ab4e320c
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/share_mode/__init__.py
@@ -0,0 +1,470 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.onion import *
+from onionshare.common import Common
+from onionshare.web import Web
+
+from ..file_selection import FileSelection
+from .threads import CompressThread
+from .. import Mode
+from ..history import History, ToggleHistory, ShareHistoryItem
+from ....widgets import Alert, MinimumWidthWidget
+
+
+class ShareMode(Mode):
+ """
+ Parts of the main window UI for sharing files.
+ """
+
+ def init(self):
+ """
+ Custom initialization for ReceiveMode.
+ """
+ # Threads start out as None
+ self.compress_thread = None
+
+ # Create the Web object
+ self.web = Web(self.common, True, self.settings, "share")
+
+ # Settings
+ self.autostop_sharing_checkbox = QtWidgets.QCheckBox()
+ self.autostop_sharing_checkbox.clicked.connect(
+ self.autostop_sharing_checkbox_clicked
+ )
+ self.autostop_sharing_checkbox.setText(
+ strings._("mode_settings_share_autostop_sharing_checkbox")
+ )
+ if self.settings.get("share", "autostop_sharing"):
+ self.autostop_sharing_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.autostop_sharing_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ self.mode_settings_widget.mode_specific_layout.addWidget(
+ self.autostop_sharing_checkbox
+ )
+
+ # File selection
+ self.file_selection = FileSelection(
+ self.common,
+ "images/mode_share.png",
+ strings._("gui_new_tab_share_button"),
+ self,
+ )
+ if self.filenames:
+ for filename in self.filenames:
+ self.file_selection.file_list.add_file(filename)
+
+ # Server status
+ self.server_status.set_mode("share", self.file_selection)
+ self.server_status.server_started.connect(self.file_selection.server_started)
+ self.server_status.server_stopped.connect(self.file_selection.server_stopped)
+ self.server_status.server_stopped.connect(self.update_primary_action)
+ self.server_status.server_canceled.connect(self.file_selection.server_stopped)
+ self.server_status.server_canceled.connect(self.update_primary_action)
+ self.file_selection.file_list.files_updated.connect(self.server_status.update)
+ self.file_selection.file_list.files_updated.connect(self.update_primary_action)
+ # Tell server_status about web, then update
+ self.server_status.web = self.web
+ self.server_status.update()
+
+ # Filesize warning
+ self.filesize_warning = QtWidgets.QLabel()
+ self.filesize_warning.setWordWrap(True)
+ self.filesize_warning.setStyleSheet(
+ self.common.gui.css["share_filesize_warning"]
+ )
+ self.filesize_warning.hide()
+
+ # Download history
+ self.history = History(
+ self.common,
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(
+ self.common.get_resource_path("images/share_icon_transparent.png")
+ )
+ ),
+ strings._("gui_share_mode_no_files"),
+ strings._("gui_all_modes_history"),
+ )
+ self.history.hide()
+
+ # Info label
+ self.info_label = QtWidgets.QLabel()
+ self.info_label.hide()
+
+ # Delete all files button
+ self.remove_all_button = QtWidgets.QPushButton(
+ strings._("gui_file_selection_remove_all")
+ )
+ self.remove_all_button.setFlat(True)
+ self.remove_all_button.setStyleSheet(
+ self.common.gui.css["share_delete_all_files_button"]
+ )
+ self.remove_all_button.clicked.connect(self.delete_all)
+ self.remove_all_button.hide()
+
+ # Toggle history
+ self.toggle_history = ToggleHistory(
+ self.common,
+ self,
+ self.history,
+ QtGui.QIcon(self.common.get_resource_path("images/share_icon_toggle.png")),
+ QtGui.QIcon(
+ self.common.get_resource_path("images/share_icon_toggle_selected.png")
+ ),
+ )
+
+ # Top bar
+ top_bar_layout = QtWidgets.QHBoxLayout()
+ top_bar_layout.addWidget(self.info_label)
+ top_bar_layout.addStretch()
+ top_bar_layout.addWidget(self.remove_all_button)
+ top_bar_layout.addWidget(self.toggle_history)
+
+ # Primary action layout
+ self.primary_action_layout.addWidget(self.filesize_warning)
+ self.primary_action.hide()
+ self.update_primary_action()
+
+ # Status bar, zip progress bar
+ self._zip_progress_bar = None
+
+ # Main layout
+ self.main_layout = QtWidgets.QVBoxLayout()
+ self.main_layout.addLayout(top_bar_layout)
+ self.main_layout.addLayout(self.file_selection)
+ self.main_layout.addWidget(self.primary_action)
+ self.main_layout.addWidget(self.server_status)
+ self.main_layout.addWidget(MinimumWidthWidget(700))
+
+ # Column layout
+ self.column_layout = QtWidgets.QHBoxLayout()
+ self.column_layout.addLayout(self.main_layout)
+ self.column_layout.addWidget(self.history, stretch=1)
+
+ # Wrapper layout
+ self.wrapper_layout = QtWidgets.QVBoxLayout()
+ self.wrapper_layout.addLayout(self.column_layout)
+ self.setLayout(self.wrapper_layout)
+
+ # Always start with focus on file selection
+ self.file_selection.setFocus()
+
+ def autostop_sharing_checkbox_clicked(self):
+ """
+ Save autostop sharing setting to the tab settings
+ """
+ self.settings.set(
+ "share", "autostop_sharing", self.autostop_sharing_checkbox.isChecked()
+ )
+
+ def get_stop_server_autostop_timer_text(self):
+ """
+ Return the string to put on the stop server button, if there's an auto-stop timer
+ """
+ return strings._("gui_share_stop_server_autostop_timer")
+
+ def autostop_timer_finished_should_stop_server(self):
+ """
+ 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.history.in_progress_count == 0 or self.web.done:
+ self.server_status.stop_server()
+ 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_autostop_timer_waiting")
+ )
+ return False
+
+ def start_server_custom(self):
+ """
+ Starting the server.
+ """
+ # Reset web counters
+ self.web.share_mode.cur_history_id = 0
+ self.web.reset_invalid_passwords()
+
+ # Hide and reset the downloads if we have previously shared
+ self.reset_info_counters()
+
+ self.remove_all_button.hide()
+
+ def start_server_step2_custom(self):
+ """
+ Step 2 in starting the server. Zipping up files.
+ """
+ # Add progress bar to the status bar, indicating the compressing of files.
+ self._zip_progress_bar = ZipProgressBar(self.common, 0)
+ self.filenames = self.file_selection.get_filenames()
+
+ self._zip_progress_bar.total_files_size = ShareMode._compute_total_size(
+ self.filenames
+ )
+ self.status_bar.insertWidget(0, self._zip_progress_bar)
+
+ # prepare the files for sending in a new thread
+ self.compress_thread = CompressThread(self)
+ self.compress_thread.success.connect(self.starting_server_step3.emit)
+ self.compress_thread.success.connect(self.start_server_finished.emit)
+ self.compress_thread.error.connect(self.starting_server_error.emit)
+ self.server_status.server_canceled.connect(self.compress_thread.cancel)
+ self.compress_thread.start()
+
+ def start_server_step3_custom(self):
+ """
+ Step 3 in starting the server. Remove zip progess bar, and display large filesize
+ warning, if applicable.
+ """
+ # Remove zip progress bar
+ if self._zip_progress_bar is not None:
+ self.status_bar.removeWidget(self._zip_progress_bar)
+ self._zip_progress_bar = None
+
+ # Warn about sending large files over Tor
+ if self.web.share_mode.download_filesize >= 157286400: # 150mb
+ self.filesize_warning.setText(strings._("large_filesize"))
+ self.filesize_warning.show()
+
+ def start_server_error_custom(self):
+ """
+ Start server error.
+ """
+ if self._zip_progress_bar is not None:
+ self.status_bar.removeWidget(self._zip_progress_bar)
+ self._zip_progress_bar = None
+
+ def stop_server_custom(self):
+ """
+ Stop server.
+ """
+ # Remove the progress bar
+ if self._zip_progress_bar is not None:
+ self.status_bar.removeWidget(self._zip_progress_bar)
+ self._zip_progress_bar = None
+
+ self.filesize_warning.hide()
+ self.history.in_progress_count = 0
+ self.history.completed_count = 0
+ self.history.update_in_progress()
+ self.file_selection.file_list.adjustSize()
+
+ self.remove_all_button.show()
+
+ def cancel_server_custom(self):
+ """
+ Stop the compression thread on cancel
+ """
+ if self.compress_thread:
+ self.common.log("ShareMode", "cancel_server: quitting compress thread")
+ self.compress_thread.quit()
+
+ def handle_tor_broke_custom(self):
+ """
+ Connection to Tor broke.
+ """
+ self.primary_action.hide()
+
+ def handle_request_started(self, event):
+ """
+ Handle REQUEST_STARTED event.
+ """
+ if event["data"]["use_gzip"]:
+ filesize = self.web.share_mode.gzip_filesize
+ else:
+ filesize = self.web.share_mode.download_filesize
+
+ item = ShareHistoryItem(self.common, event["data"]["id"], filesize)
+ self.history.add(event["data"]["id"], item)
+ self.toggle_history.update_indicator(True)
+ self.history.in_progress_count += 1
+ self.history.update_in_progress()
+
+ self.system_tray.showMessage(
+ strings._("systray_share_started_title"),
+ strings._("systray_share_started_message"),
+ )
+
+ def handle_request_progress(self, event):
+ """
+ Handle REQUEST_PROGRESS event.
+ """
+ self.history.update(event["data"]["id"], event["data"]["bytes"])
+
+ # Is the download complete?
+ if event["data"]["bytes"] == self.web.share_mode.filesize:
+ self.system_tray.showMessage(
+ strings._("systray_share_completed_title"),
+ strings._("systray_share_completed_message"),
+ )
+
+ # Update completed and in progress labels
+ self.history.completed_count += 1
+ self.history.in_progress_count -= 1
+ self.history.update_completed()
+ self.history.update_in_progress()
+
+ # Close on finish?
+ if self.settings.get("share", "autostop_sharing"):
+ self.server_status.stop_server()
+ self.status_bar.clearMessage()
+ self.server_status_label.setText(strings._("closing_automatically"))
+ else:
+ if self.server_status.status == self.server_status.STATUS_STOPPED:
+ self.history.cancel(event["data"]["id"])
+ self.history.in_progress_count = 0
+ self.history.update_in_progress()
+
+ def handle_request_canceled(self, event):
+ """
+ Handle REQUEST_CANCELED event.
+ """
+ self.history.cancel(event["data"]["id"])
+
+ # Update in progress count
+ self.history.in_progress_count -= 1
+ self.history.update_in_progress()
+ self.system_tray.showMessage(
+ strings._("systray_share_canceled_title"),
+ strings._("systray_share_canceled_message"),
+ )
+
+ def on_reload_settings(self):
+ """
+ If there were some files listed for sharing, we should be ok to re-enable
+ the 'Start Sharing' button now.
+ """
+ if self.server_status.file_selection.get_num_files() > 0:
+ self.primary_action.show()
+ self.info_label.show()
+ self.remove_all_button.show()
+
+ def update_primary_action(self):
+ self.common.log("ShareMode", "update_primary_action")
+
+ # Show or hide primary action layout
+ file_count = self.file_selection.file_list.count()
+ if file_count > 0:
+ self.primary_action.show()
+ self.info_label.show()
+ self.remove_all_button.show()
+
+ # Update the file count in the info label
+ total_size_bytes = 0
+ for index in range(self.file_selection.file_list.count()):
+ item = self.file_selection.file_list.item(index)
+ total_size_bytes += item.size_bytes
+ total_size_readable = self.common.human_readable_filesize(total_size_bytes)
+
+ if file_count > 1:
+ self.info_label.setText(
+ strings._("gui_file_info").format(file_count, total_size_readable)
+ )
+ else:
+ self.info_label.setText(
+ strings._("gui_file_info_single").format(
+ file_count, total_size_readable
+ )
+ )
+
+ else:
+ self.primary_action.hide()
+ self.info_label.hide()
+ self.remove_all_button.hide()
+
+ def reset_info_counters(self):
+ """
+ Set the info counters back to zero.
+ """
+ self.history.reset()
+ self.toggle_history.indicator_count = 0
+ self.toggle_history.update_indicator()
+
+ def delete_all(self):
+ """
+ Delete All button clicked
+ """
+ self.file_selection.file_list.clear()
+ self.file_selection.file_list.files_updated.emit()
+
+ self.file_selection.file_list.setCurrentItem(None)
+
+ @staticmethod
+ def _compute_total_size(filenames):
+ total_size = 0
+ for filename in filenames:
+ if os.path.isfile(filename):
+ total_size += os.path.getsize(filename)
+ if os.path.isdir(filename):
+ total_size += Common.dir_size(filename)
+ return total_size
+
+
+class ZipProgressBar(QtWidgets.QProgressBar):
+ update_processed_size_signal = QtCore.pyqtSignal(int)
+
+ def __init__(self, common, total_files_size):
+ super(ZipProgressBar, self).__init__()
+ self.common = common
+
+ self.setMaximumHeight(20)
+ self.setMinimumWidth(200)
+ self.setValue(0)
+ self.setFormat(strings._("zip_progress_bar_format"))
+ self.setStyleSheet(self.common.gui.css["share_zip_progess_bar"])
+
+ self._total_files_size = total_files_size
+ self._processed_size = 0
+
+ self.update_processed_size_signal.connect(self.update_processed_size)
+
+ @property
+ def total_files_size(self):
+ return self._total_files_size
+
+ @total_files_size.setter
+ def total_files_size(self, val):
+ self._total_files_size = val
+
+ @property
+ def processed_size(self):
+ return self._processed_size
+
+ @processed_size.setter
+ def processed_size(self, val):
+ self.update_processed_size(val)
+
+ def update_processed_size(self, val):
+ self._processed_size = val
+
+ if self.processed_size < self.total_files_size:
+ self.setValue(int((self.processed_size * 100) / self.total_files_size))
+ elif self.total_files_size != 0:
+ self.setValue(100)
+ else:
+ self.setValue(0)
diff --git a/desktop/onionshare_gui/tab/mode/share_mode/threads.py b/desktop/onionshare_gui/tab/mode/share_mode/threads.py
new file mode 100644
index 00000000..500b6525
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/share_mode/threads.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore
+
+
+class CompressThread(QtCore.QThread):
+ """
+ Compresses files to be shared
+ """
+
+ success = QtCore.pyqtSignal()
+ error = QtCore.pyqtSignal(str)
+
+ def __init__(self, mode):
+ super(CompressThread, self).__init__()
+ self.mode = mode
+ self.mode.common.log("CompressThread", "__init__")
+
+ # prepare files to share
+ def set_processed_size(self, x):
+ if self.mode._zip_progress_bar != None:
+ self.mode._zip_progress_bar.update_processed_size_signal.emit(x)
+
+ def run(self):
+ self.mode.common.log("CompressThread", "run")
+
+ try:
+ self.mode.web.share_mode.set_file_info(
+ self.mode.filenames, processed_size_callback=self.set_processed_size
+ )
+ self.success.emit()
+ self.mode.app.cleanup_filenames += (
+ self.mode.web.share_mode.cleanup_filenames
+ )
+ except OSError as e:
+ self.error.emit(e.strerror)
+
+ def cancel(self):
+ self.mode.common.log("CompressThread", "cancel")
+
+ # Let the Web and ZipWriter objects know that we're canceling compression early
+ self.mode.web.cancel_compression = True
+ try:
+ self.mode.web.zip_writer.cancel_compression = True
+ except AttributeError:
+ # we never made it as far as creating a ZipWriter object
+ pass
diff --git a/desktop/onionshare_gui/tab/mode/website_mode/__init__.py b/desktop/onionshare_gui/tab/mode/website_mode/__init__.py
new file mode 100644
index 00000000..96fcdea3
--- /dev/null
+++ b/desktop/onionshare_gui/tab/mode/website_mode/__init__.py
@@ -0,0 +1,330 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os
+import random
+import string
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.onion import *
+from onionshare.common import Common
+from onionshare.web import Web
+
+from ..file_selection import FileSelection
+from .. import Mode
+from ..history import History, ToggleHistory
+from ....widgets import Alert, MinimumWidthWidget
+
+
+class WebsiteMode(Mode):
+ """
+ Parts of the main window UI for sharing files.
+ """
+
+ success = QtCore.pyqtSignal()
+ error = QtCore.pyqtSignal(str)
+
+ def init(self):
+ """
+ Custom initialization for ReceiveMode.
+ """
+ # Create the Web object
+ self.web = Web(self.common, True, self.settings, "website")
+
+ # Settings
+ self.disable_csp_checkbox = QtWidgets.QCheckBox()
+ self.disable_csp_checkbox.clicked.connect(self.disable_csp_checkbox_clicked)
+ self.disable_csp_checkbox.setText(
+ strings._("mode_settings_website_disable_csp_checkbox")
+ )
+ if self.settings.get("website", "disable_csp"):
+ self.disable_csp_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.disable_csp_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ self.mode_settings_widget.mode_specific_layout.addWidget(
+ self.disable_csp_checkbox
+ )
+
+ # File selection
+ self.file_selection = FileSelection(
+ self.common,
+ "images/mode_website.png",
+ strings._("gui_new_tab_website_button"),
+ self,
+ )
+ if self.filenames:
+ for filename in self.filenames:
+ self.file_selection.file_list.add_file(filename)
+
+ # Server status
+ self.server_status.set_mode("website", self.file_selection)
+ self.server_status.server_started.connect(self.file_selection.server_started)
+ self.server_status.server_stopped.connect(self.file_selection.server_stopped)
+ self.server_status.server_stopped.connect(self.update_primary_action)
+ self.server_status.server_canceled.connect(self.file_selection.server_stopped)
+ self.server_status.server_canceled.connect(self.update_primary_action)
+ self.file_selection.file_list.files_updated.connect(self.server_status.update)
+ self.file_selection.file_list.files_updated.connect(self.update_primary_action)
+ # Tell server_status about web, then update
+ self.server_status.web = self.web
+ self.server_status.update()
+
+ # Filesize warning
+ self.filesize_warning = QtWidgets.QLabel()
+ self.filesize_warning.setWordWrap(True)
+ self.filesize_warning.setStyleSheet(
+ self.common.gui.css["share_filesize_warning"]
+ )
+ self.filesize_warning.hide()
+
+ # Download history
+ self.history = History(
+ self.common,
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(
+ self.common.get_resource_path("images/share_icon_transparent.png")
+ )
+ ),
+ strings._("gui_website_mode_no_files"),
+ strings._("gui_all_modes_history"),
+ "website",
+ )
+ self.history.in_progress_label.hide()
+ self.history.completed_label.hide()
+ self.history.hide()
+
+ # Info label
+ self.info_label = QtWidgets.QLabel()
+ self.info_label.hide()
+
+ # Delete all files button
+ self.remove_all_button = QtWidgets.QPushButton(
+ strings._("gui_file_selection_remove_all")
+ )
+ self.remove_all_button.setFlat(True)
+ self.remove_all_button.setStyleSheet(
+ self.common.gui.css["share_delete_all_files_button"]
+ )
+ self.remove_all_button.clicked.connect(self.delete_all)
+ self.remove_all_button.hide()
+
+ # Toggle history
+ self.toggle_history = ToggleHistory(
+ self.common,
+ self,
+ self.history,
+ QtGui.QIcon(self.common.get_resource_path("images/share_icon_toggle.png")),
+ QtGui.QIcon(
+ self.common.get_resource_path("images/share_icon_toggle_selected.png")
+ ),
+ )
+
+ # Top bar
+ top_bar_layout = QtWidgets.QHBoxLayout()
+ top_bar_layout.addWidget(self.info_label)
+ top_bar_layout.addStretch()
+ top_bar_layout.addWidget(self.remove_all_button)
+ top_bar_layout.addWidget(self.toggle_history)
+
+ # Primary action layout
+ self.primary_action_layout.addWidget(self.filesize_warning)
+ self.primary_action.hide()
+ self.update_primary_action()
+
+ # Main layout
+ self.main_layout = QtWidgets.QVBoxLayout()
+ self.main_layout.addLayout(top_bar_layout)
+ self.main_layout.addLayout(self.file_selection)
+ self.main_layout.addWidget(self.primary_action)
+ self.main_layout.addWidget(self.server_status)
+ self.main_layout.addWidget(MinimumWidthWidget(700))
+
+ # Column layout
+ self.column_layout = QtWidgets.QHBoxLayout()
+ self.column_layout.addLayout(self.main_layout)
+ self.column_layout.addWidget(self.history, stretch=1)
+
+ # Wrapper layout
+ self.wrapper_layout = QtWidgets.QVBoxLayout()
+ self.wrapper_layout.addLayout(self.column_layout)
+ self.setLayout(self.wrapper_layout)
+
+ # Always start with focus on file selection
+ self.file_selection.setFocus()
+
+ def disable_csp_checkbox_clicked(self):
+ """
+ Save disable CSP setting to the tab settings
+ """
+ self.settings.set(
+ "website", "disable_csp", self.disable_csp_checkbox.isChecked()
+ )
+
+ def get_stop_server_autostop_timer_text(self):
+ """
+ Return the string to put on the stop server button, if there's an auto-stop timer
+ """
+ return strings._("gui_share_stop_server_autostop_timer")
+
+ def autostop_timer_finished_should_stop_server(self):
+ """
+ The auto-stop timer expired, should we stop the server? Returns a bool
+ """
+
+ self.server_status.stop_server()
+ self.server_status_label.setText(strings._("close_on_autostop_timer"))
+ return True
+
+ def start_server_custom(self):
+ """
+ Starting the server.
+ """
+ # Reset web counters
+ self.web.website_mode.visit_count = 0
+ self.web.reset_invalid_passwords()
+
+ # Hide and reset the downloads if we have previously shared
+ self.reset_info_counters()
+
+ self.remove_all_button.hide()
+
+ def start_server_step2_custom(self):
+ """
+ Step 2 in starting the server. Zipping up files.
+ """
+ self.filenames = []
+ for index in range(self.file_selection.file_list.count()):
+ self.filenames.append(self.file_selection.file_list.item(index).filename)
+
+ # Continue
+ self.starting_server_step3.emit()
+ self.start_server_finished.emit()
+
+ def start_server_step3_custom(self):
+ """
+ Step 3 in starting the server. Display large filesize
+ warning, if applicable.
+ """
+ self.web.website_mode.set_file_info(self.filenames)
+ self.success.emit()
+
+ def start_server_error_custom(self):
+ """
+ Start server error.
+ """
+ if self._zip_progress_bar is not None:
+ self.status_bar.removeWidget(self._zip_progress_bar)
+ self._zip_progress_bar = None
+
+ def stop_server_custom(self):
+ """
+ Stop server.
+ """
+
+ self.filesize_warning.hide()
+ self.history.completed_count = 0
+ self.file_selection.file_list.adjustSize()
+
+ self.remove_all_button.show()
+
+ def cancel_server_custom(self):
+ """
+ Log that the server has been cancelled
+ """
+ self.common.log("WebsiteMode", "cancel_server")
+
+ def handle_tor_broke_custom(self):
+ """
+ Connection to Tor broke.
+ """
+ self.primary_action.hide()
+
+ def on_reload_settings(self):
+ """
+ If there were some files listed for sharing, we should be ok to re-enable
+ the 'Start Sharing' button now.
+ """
+ if self.server_status.file_selection.get_num_files() > 0:
+ self.primary_action.show()
+ self.info_label.show()
+ self.remove_all_button.show()
+
+ def update_primary_action(self):
+ self.common.log("WebsiteMode", "update_primary_action")
+
+ # Show or hide primary action layout
+ file_count = self.file_selection.file_list.count()
+ if file_count > 0:
+ self.primary_action.show()
+ self.info_label.show()
+ self.remove_all_button.show()
+
+ # Update the file count in the info label
+ total_size_bytes = 0
+ for index in range(self.file_selection.file_list.count()):
+ item = self.file_selection.file_list.item(index)
+ total_size_bytes += item.size_bytes
+ total_size_readable = self.common.human_readable_filesize(total_size_bytes)
+
+ if file_count > 1:
+ self.info_label.setText(
+ strings._("gui_file_info").format(file_count, total_size_readable)
+ )
+ else:
+ self.info_label.setText(
+ strings._("gui_file_info_single").format(
+ file_count, total_size_readable
+ )
+ )
+
+ else:
+ self.primary_action.hide()
+ self.info_label.hide()
+ self.remove_all_button.hide()
+
+ def reset_info_counters(self):
+ """
+ Set the info counters back to zero.
+ """
+ self.history.reset()
+ self.toggle_history.indicator_count = 0
+ self.toggle_history.update_indicator()
+
+ def delete_all(self):
+ """
+ Delete All button clicked
+ """
+ self.file_selection.file_list.clear()
+ self.file_selection.file_list.files_updated.emit()
+
+ self.file_selection.file_list.setCurrentItem(None)
+
+ @staticmethod
+ def _compute_total_size(filenames):
+ total_size = 0
+ for filename in filenames:
+ if os.path.isfile(filename):
+ total_size += os.path.getsize(filename)
+ if os.path.isdir(filename):
+ total_size += Common.dir_size(filename)
+ return total_size
diff --git a/desktop/onionshare_gui/tab/server_status.py b/desktop/onionshare_gui/tab/server_status.py
new file mode 100644
index 00000000..efa50669
--- /dev/null
+++ b/desktop/onionshare_gui/tab/server_status.py
@@ -0,0 +1,466 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import platform
+import textwrap
+from PyQt5 import QtCore, QtWidgets, QtGui
+from PyQt5.QtCore import Qt
+
+from onionshare import strings
+
+from ..widgets import Alert
+from ..widgets import QRCodeDialog
+
+
+class ServerStatus(QtWidgets.QWidget):
+ """
+ The server status chunk of the GUI.
+ """
+
+ server_started = QtCore.pyqtSignal()
+ server_started_finished = QtCore.pyqtSignal()
+ server_stopped = QtCore.pyqtSignal()
+ server_canceled = QtCore.pyqtSignal()
+ button_clicked = QtCore.pyqtSignal()
+ url_copied = QtCore.pyqtSignal()
+ hidservauth_copied = QtCore.pyqtSignal()
+
+ STATUS_STOPPED = 0
+ STATUS_WORKING = 1
+ STATUS_STARTED = 2
+
+ def __init__(
+ self,
+ common,
+ qtapp,
+ app,
+ mode_settings,
+ mode_settings_widget,
+ file_selection=None,
+ local_only=False,
+ ):
+ super(ServerStatus, self).__init__()
+
+ self.common = common
+
+ self.status = self.STATUS_STOPPED
+ self.mode = None # Gets set in self.set_mode
+
+ self.qtapp = qtapp
+ self.app = app
+ self.settings = mode_settings
+ self.mode_settings_widget = mode_settings_widget
+
+ self.web = None
+ self.autostart_timer_datetime = None
+ self.local_only = local_only
+
+ self.resizeEvent(None)
+
+ # Server layout
+ self.server_button = QtWidgets.QPushButton()
+ self.server_button.clicked.connect(self.server_button_clicked)
+
+ # URL layout
+ url_font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont)
+ self.url_description = QtWidgets.QLabel()
+ self.url_description.setWordWrap(True)
+ self.url_description.setMinimumHeight(50)
+ self.url = QtWidgets.QLabel()
+ self.url.setFont(url_font)
+ self.url.setWordWrap(True)
+ self.url.setMinimumSize(self.url.sizeHint())
+ self.url.setStyleSheet(self.common.gui.css["server_status_url"])
+ self.url.setTextInteractionFlags(
+ Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard
+ )
+
+ self.copy_url_button = QtWidgets.QPushButton(strings._("gui_copy_url"))
+ self.copy_url_button.setFlat(True)
+ self.copy_url_button.setStyleSheet(
+ self.common.gui.css["server_status_url_buttons"]
+ )
+ self.copy_url_button.clicked.connect(self.copy_url)
+ self.copy_hidservauth_button = QtWidgets.QPushButton(
+ strings._("gui_copy_hidservauth")
+ )
+ self.show_url_qr_code_button = QtWidgets.QPushButton(
+ strings._("gui_show_url_qr_code")
+ )
+ self.show_url_qr_code_button.hide()
+ self.show_url_qr_code_button.clicked.connect(
+ self.show_url_qr_code_button_clicked
+ )
+ self.show_url_qr_code_button.setFlat(True)
+ self.show_url_qr_code_button.setStyleSheet(
+ self.common.gui.css["server_status_url_buttons"]
+ )
+
+ self.copy_hidservauth_button.setFlat(True)
+ self.copy_hidservauth_button.setStyleSheet(
+ self.common.gui.css["server_status_url_buttons"]
+ )
+ self.copy_hidservauth_button.clicked.connect(self.copy_hidservauth)
+ url_buttons_layout = QtWidgets.QHBoxLayout()
+ url_buttons_layout.addWidget(self.copy_url_button)
+ url_buttons_layout.addWidget(self.show_url_qr_code_button)
+ url_buttons_layout.addWidget(self.copy_hidservauth_button)
+ url_buttons_layout.addStretch()
+
+ url_layout = QtWidgets.QVBoxLayout()
+ url_layout.addWidget(self.url_description)
+ url_layout.addWidget(self.url)
+ url_layout.addLayout(url_buttons_layout)
+
+ # Add the widgets
+ button_layout = QtWidgets.QHBoxLayout()
+ button_layout.addWidget(self.server_button)
+ button_layout.addStretch()
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addLayout(button_layout)
+ layout.addLayout(url_layout)
+ self.setLayout(layout)
+
+ def set_mode(self, share_mode, file_selection=None):
+ """
+ The server status is in share mode.
+ """
+ self.mode = share_mode
+
+ if (self.mode == self.common.gui.MODE_SHARE) or (
+ self.mode == self.common.gui.MODE_WEBSITE
+ ):
+ self.file_selection = file_selection
+
+ self.update()
+
+ def resizeEvent(self, event):
+ """
+ When the widget is resized, try and adjust the display of a v3 onion URL.
+ """
+ try:
+ # Wrap the URL label
+ url_length = len(self.get_url())
+ if url_length > 60:
+ width = self.frameGeometry().width()
+ if width < 530:
+ wrapped_onion_url = textwrap.fill(self.get_url(), 46)
+ self.url.setText(wrapped_onion_url)
+ else:
+ self.url.setText(self.get_url())
+ except:
+ pass
+
+ def show_url(self):
+ """
+ Show the URL in the UI.
+ """
+ self.url_description.show()
+
+ info_image = self.common.get_resource_path("images/info.png")
+
+ if self.mode == self.common.gui.MODE_SHARE:
+ self.url_description.setText(
+ strings._("gui_share_url_description").format(info_image)
+ )
+ elif self.mode == self.common.gui.MODE_WEBSITE:
+ self.url_description.setText(
+ strings._("gui_website_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.settings.get("persistent", "enabled"):
+ if self.mode == self.common.gui.MODE_SHARE and self.settings.get(
+ "share", "autostop_sharing"
+ ):
+ self.url_description.setToolTip(
+ strings._("gui_url_label_onetime_and_persistent")
+ )
+ else:
+ self.url_description.setToolTip(strings._("gui_url_label_persistent"))
+ else:
+ if self.mode == self.common.gui.MODE_SHARE and self.settings.get(
+ "share", "autostop_sharing"
+ ):
+ 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.copy_url_button.show()
+
+ self.show_url_qr_code_button.show()
+
+ if self.settings.get("general", "client_auth"):
+ self.copy_hidservauth_button.show()
+ else:
+ self.copy_hidservauth_button.hide()
+
+ def update(self):
+ """
+ Update the GUI elements based on the current state.
+ """
+ self.common.log("ServerStatus", "update")
+ # Set the URL fields
+ if self.status == self.STATUS_STARTED:
+ # The backend Onion may have saved new settings, such as the private key.
+ # Reload the settings before saving new ones.
+ self.common.settings.load()
+ self.show_url()
+
+ if not self.settings.get("onion", "password"):
+ self.settings.set("onion", "password", self.web.password)
+ self.settings.save()
+
+ if self.settings.get("general", "autostop_timer"):
+ self.server_button.setToolTip(
+ strings._("gui_stop_server_autostop_timer_tooltip").format(
+ self.mode_settings_widget.autostop_timer_widget.dateTime().toString(
+ "h:mm AP, MMMM dd, yyyy"
+ )
+ )
+ )
+ else:
+ self.url_description.hide()
+ self.url.hide()
+ self.copy_url_button.hide()
+ self.copy_hidservauth_button.hide()
+ self.show_url_qr_code_button.hide()
+
+ self.mode_settings_widget.update_ui()
+
+ # Button
+ if (
+ self.mode == self.common.gui.MODE_SHARE
+ and self.file_selection.get_num_files() == 0
+ ):
+ self.server_button.hide()
+ elif (
+ self.mode == self.common.gui.MODE_WEBSITE
+ and self.file_selection.get_num_files() == 0
+ ):
+ self.server_button.hide()
+ else:
+ self.server_button.show()
+
+ if self.status == self.STATUS_STOPPED:
+ self.server_button.setStyleSheet(
+ self.common.gui.css["server_status_button_stopped"]
+ )
+ self.server_button.setEnabled(True)
+ if self.mode == self.common.gui.MODE_SHARE:
+ self.server_button.setText(strings._("gui_share_start_server"))
+ elif self.mode == self.common.gui.MODE_WEBSITE:
+ self.server_button.setText(strings._("gui_share_start_server"))
+ elif self.mode == self.common.gui.MODE_CHAT:
+ self.server_button.setText(strings._("gui_chat_start_server"))
+ else:
+ self.server_button.setText(strings._("gui_receive_start_server"))
+ self.server_button.setToolTip("")
+ elif self.status == self.STATUS_STARTED:
+ self.server_button.setStyleSheet(
+ self.common.gui.css["server_status_button_started"]
+ )
+ self.server_button.setEnabled(True)
+ if self.mode == self.common.gui.MODE_SHARE:
+ self.server_button.setText(strings._("gui_share_stop_server"))
+ elif self.mode == self.common.gui.MODE_WEBSITE:
+ self.server_button.setText(strings._("gui_share_stop_server"))
+ elif self.mode == self.common.gui.MODE_CHAT:
+ self.server_button.setText(strings._("gui_chat_stop_server"))
+ else:
+ self.server_button.setText(strings._("gui_receive_stop_server"))
+ elif self.status == self.STATUS_WORKING:
+ self.server_button.setStyleSheet(
+ self.common.gui.css["server_status_button_working"]
+ )
+ self.server_button.setEnabled(True)
+ if self.settings.get("general", "autostart_timer"):
+ self.server_button.setToolTip(
+ strings._("gui_start_server_autostart_timer_tooltip").format(
+ self.mode_settings_widget.autostart_timer_widget.dateTime().toString(
+ "h:mm AP, MMMM dd, yyyy"
+ )
+ )
+ )
+ else:
+ self.server_button.setText(strings._("gui_please_wait"))
+ else:
+ self.server_button.setStyleSheet(
+ self.common.gui.css["server_status_button_working"]
+ )
+ self.server_button.setEnabled(False)
+ self.server_button.setText(strings._("gui_please_wait"))
+
+ def server_button_clicked(self):
+ """
+ Toggle starting or stopping the server.
+ """
+ if self.status == self.STATUS_STOPPED:
+ can_start = True
+ if self.settings.get("general", "autostart_timer"):
+ if self.local_only:
+ self.autostart_timer_datetime = (
+ self.mode_settings_widget.autostart_timer_widget.dateTime().toPyDateTime()
+ )
+ else:
+ self.autostart_timer_datetime = (
+ self.mode_settings_widget.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.settings.get("general", "autostop_timer"):
+ if self.local_only:
+ self.autostop_timer_datetime = (
+ self.mode_settings_widget.autostop_timer_widget.dateTime().toPyDateTime()
+ )
+ 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.mode_settings_widget.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.settings.get("general", "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()
+ elif self.status == self.STATUS_WORKING:
+ self.cancel_server()
+ self.button_clicked.emit()
+
+ def show_url_qr_code_button_clicked(self):
+ """
+ Show a QR code of the onion URL.
+ """
+ self.qr_code_dialog = QRCodeDialog(self.common, self.get_url())
+
+ def start_server(self):
+ """
+ Start the server.
+ """
+ self.status = self.STATUS_WORKING
+ self.update()
+ self.server_started.emit()
+
+ def start_server_finished(self):
+ """
+ The server has finished starting.
+ """
+ self.status = self.STATUS_STARTED
+ # self.copy_url()
+ self.update()
+ self.server_started_finished.emit()
+
+ def stop_server(self):
+ """
+ Stop the server.
+ """
+ self.status = self.STATUS_WORKING
+ self.mode_settings_widget.autostart_timer_reset()
+ self.mode_settings_widget.autostop_timer_reset()
+ self.update()
+ self.server_stopped.emit()
+
+ def cancel_server(self):
+ """
+ Cancel the server.
+ """
+ self.common.log(
+ "ServerStatus", "cancel_server", "Canceling the server mid-startup"
+ )
+ self.status = self.STATUS_WORKING
+ self.mode_settings_widget.autostart_timer_reset()
+ self.mode_settings_widget.autostop_timer_reset()
+ self.update()
+ self.server_canceled.emit()
+
+ def stop_server_finished(self):
+ """
+ The server has finished stopping.
+ """
+ self.status = self.STATUS_STOPPED
+ self.update()
+
+ def copy_url(self):
+ """
+ Copy the onionshare URL to the clipboard.
+ """
+ clipboard = self.qtapp.clipboard()
+ clipboard.setText(self.get_url())
+
+ self.url_copied.emit()
+
+ def copy_hidservauth(self):
+ """
+ Copy the HidServAuth line to the clipboard.
+ """
+ clipboard = self.qtapp.clipboard()
+ clipboard.setText(self.app.auth_string)
+
+ self.hidservauth_copied.emit()
+
+ def get_url(self):
+ """
+ Returns the OnionShare URL.
+ """
+ if self.settings.get("general", "public"):
+ url = f"http://{self.app.onion_host}"
+ else:
+ url = f"http://onionshare:{self.web.password}@{self.app.onion_host}"
+ return url
diff --git a/desktop/onionshare_gui/tab/tab.py b/desktop/onionshare_gui/tab/tab.py
new file mode 100644
index 00000000..ae987729
--- /dev/null
+++ b/desktop/onionshare_gui/tab/tab.py
@@ -0,0 +1,661 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import queue
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.onionshare import OnionShare
+from onionshare.web import Web
+from onionshare.mode_settings import ModeSettings
+
+from .mode.share_mode import ShareMode
+from .mode.receive_mode import ReceiveMode
+from .mode.website_mode import WebsiteMode
+from .mode.chat_mode import ChatMode
+
+from .server_status import ServerStatus
+
+from ..widgets import Alert
+
+
+class NewTabButton(QtWidgets.QPushButton):
+ def __init__(self, common, image_filename, title, text):
+ super(NewTabButton, self).__init__()
+ self.common = common
+
+ self.setFixedSize(280, 280)
+
+ # Image
+ self.image_label = QtWidgets.QLabel(parent=self)
+ self.image_label.setPixmap(
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(self.common.get_resource_path(image_filename))
+ )
+ )
+ self.image_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.image_label.setStyleSheet(self.common.gui.css["new_tab_button_image"])
+ self.image_label.setGeometry(0, 0, self.width(), 200)
+ self.image_label.show()
+
+ # Title
+ self.title_label = QtWidgets.QLabel(title, parent=self)
+ self.title_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.title_label.setStyleSheet(self.common.gui.css["new_tab_title_text"])
+ self.title_label.setGeometry(
+ (self.width() - 250) / 2, self.height() - 100, 250, 30
+ )
+ self.title_label.show()
+
+ # Text
+ self.text_label = QtWidgets.QLabel(text, parent=self)
+ self.text_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.text_label.setStyleSheet(self.common.gui.css["new_tab_button_text"])
+ self.text_label.setGeometry(
+ (self.width() - 200) / 2, self.height() - 50, 200, 30
+ )
+ self.text_label.show()
+
+
+class Tab(QtWidgets.QWidget):
+ """
+ A GUI tab, you know, sort of like in a web browser
+ """
+
+ change_title = QtCore.pyqtSignal(int, str)
+ change_icon = QtCore.pyqtSignal(int, str)
+ change_persistent = QtCore.pyqtSignal(int, bool)
+
+ def __init__(
+ self,
+ common,
+ tab_id,
+ system_tray,
+ status_bar,
+ mode_settings=None,
+ filenames=None,
+ ):
+ super(Tab, self).__init__()
+ self.common = common
+ self.common.log("Tab", "__init__")
+
+ self.tab_id = tab_id
+ self.system_tray = system_tray
+ self.status_bar = status_bar
+ self.filenames = filenames
+
+ self.mode = None
+
+ # Start the OnionShare app
+ self.app = OnionShare(common, self.common.gui.onion, self.common.gui.local_only)
+
+ # Onionshare logo
+ self.image_label = QtWidgets.QLabel()
+ self.image_label.setPixmap(
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(self.common.get_resource_path("images/logo_text.png"))
+ )
+ )
+ self.image_label.setFixedSize(160, 40)
+ image_layout = QtWidgets.QVBoxLayout()
+ image_layout.addWidget(self.image_label)
+ image_layout.addStretch()
+ self.image = QtWidgets.QWidget()
+ self.image.setLayout(image_layout)
+
+ # New tab buttons
+ self.share_button = NewTabButton(
+ self.common,
+ "images/mode_new_tab_share.png",
+ strings._("gui_new_tab_share_button"),
+ strings._("gui_main_page_share_button"),
+ )
+ self.share_button.clicked.connect(self.share_mode_clicked)
+
+ self.receive_button = NewTabButton(
+ self.common,
+ "images/mode_new_tab_receive.png",
+ strings._("gui_new_tab_receive_button"),
+ strings._("gui_main_page_receive_button"),
+ )
+ self.receive_button.clicked.connect(self.receive_mode_clicked)
+
+ self.website_button = NewTabButton(
+ self.common,
+ "images/mode_new_tab_website.png",
+ strings._("gui_new_tab_website_button"),
+ strings._("gui_main_page_website_button"),
+ )
+ self.website_button.clicked.connect(self.website_mode_clicked)
+
+ self.chat_button = NewTabButton(
+ self.common,
+ "images/mode_new_tab_chat.png",
+ strings._("gui_new_tab_chat_button"),
+ strings._("gui_main_page_chat_button"),
+ )
+ self.chat_button.clicked.connect(self.chat_mode_clicked)
+
+ new_tab_top_layout = QtWidgets.QHBoxLayout()
+ new_tab_top_layout.addStretch()
+ new_tab_top_layout.addWidget(self.share_button)
+ new_tab_top_layout.addWidget(self.receive_button)
+ new_tab_top_layout.addStretch()
+
+ new_tab_bottom_layout = QtWidgets.QHBoxLayout()
+ new_tab_bottom_layout.addStretch()
+ new_tab_bottom_layout.addWidget(self.website_button)
+ new_tab_bottom_layout.addWidget(self.chat_button)
+ new_tab_bottom_layout.addStretch()
+
+ new_tab_layout = QtWidgets.QVBoxLayout()
+ new_tab_layout.addStretch()
+ new_tab_layout.addLayout(new_tab_top_layout)
+ new_tab_layout.addLayout(new_tab_bottom_layout)
+ new_tab_layout.addStretch()
+
+ new_tab_img_layout = QtWidgets.QHBoxLayout()
+ new_tab_img_layout.addWidget(self.image)
+ new_tab_img_layout.addStretch(1)
+ new_tab_img_layout.addLayout(new_tab_layout)
+ new_tab_img_layout.addStretch(2)
+
+ self.new_tab = QtWidgets.QWidget()
+ self.new_tab.setLayout(new_tab_img_layout)
+ self.new_tab.show()
+
+ # Layout
+ self.layout = QtWidgets.QVBoxLayout()
+ self.layout.setContentsMargins(0, 0, 0, 0)
+ self.layout.addWidget(self.new_tab)
+ self.setLayout(self.layout)
+
+ # Create the timer
+ self.timer = QtCore.QTimer()
+ self.timer.timeout.connect(self.timer_callback)
+
+ # Persistent image
+ self.persistent_image_label = QtWidgets.QLabel()
+ self.persistent_image_label.setPixmap(
+ QtGui.QPixmap.fromImage(
+ QtGui.QImage(
+ self.common.get_resource_path("images/persistent_enabled.png")
+ )
+ )
+ )
+ self.persistent_image_label.setFixedSize(20, 20)
+
+ # Create the close warning dialog -- the dialog widget needs to be in the constructor
+ # in order to test it
+ self.close_dialog = QtWidgets.QMessageBox()
+ self.close_dialog.setWindowTitle(strings._("gui_close_tab_warning_title"))
+ self.close_dialog.setIcon(QtWidgets.QMessageBox.Critical)
+ self.close_dialog.accept_button = self.close_dialog.addButton(
+ strings._("gui_close_tab_warning_close"), QtWidgets.QMessageBox.AcceptRole
+ )
+ self.close_dialog.reject_button = self.close_dialog.addButton(
+ strings._("gui_close_tab_warning_cancel"), QtWidgets.QMessageBox.RejectRole
+ )
+ self.close_dialog.setDefaultButton(self.close_dialog.reject_button)
+
+ def init(self, mode_settings=None):
+ if mode_settings:
+ # Load this tab
+ self.settings = mode_settings
+ mode = self.settings.get("persistent", "mode")
+ if mode == "share":
+ self.filenames = self.settings.get("share", "filenames")
+ self.share_mode_clicked()
+ elif mode == "receive":
+ self.receive_mode_clicked()
+ elif mode == "website":
+ self.filenames = self.settings.get("website", "filenames")
+ self.website_mode_clicked()
+ else:
+ # This is a new tab
+ self.settings = ModeSettings(self.common)
+
+ def share_mode_clicked(self):
+ self.common.log("Tab", "share_mode_clicked")
+ self.mode = self.common.gui.MODE_SHARE
+ self.new_tab.hide()
+
+ self.share_mode = ShareMode(self)
+ self.share_mode.change_persistent.connect(self.change_persistent)
+
+ self.layout.addWidget(self.share_mode)
+ self.share_mode.show()
+
+ self.share_mode.init()
+ self.share_mode.server_status.server_started.connect(
+ self.update_server_status_indicator
+ )
+ self.share_mode.server_status.server_stopped.connect(
+ self.update_server_status_indicator
+ )
+ self.share_mode.start_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.share_mode.stop_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.share_mode.stop_server_finished.connect(self.stop_server_finished)
+ self.share_mode.start_server_finished.connect(self.clear_message)
+ self.share_mode.server_status.button_clicked.connect(self.clear_message)
+ self.share_mode.server_status.url_copied.connect(self.copy_url)
+ self.share_mode.server_status.hidservauth_copied.connect(self.copy_hidservauth)
+
+ self.change_title.emit(self.tab_id, strings._("gui_tab_name_share"))
+
+ self.update_server_status_indicator()
+ self.timer.start(500)
+
+ def receive_mode_clicked(self):
+ self.common.log("Tab", "receive_mode_clicked")
+ self.mode = self.common.gui.MODE_RECEIVE
+ self.new_tab.hide()
+
+ self.receive_mode = ReceiveMode(self)
+ self.receive_mode.change_persistent.connect(self.change_persistent)
+
+ self.layout.addWidget(self.receive_mode)
+ self.receive_mode.show()
+
+ self.receive_mode.init()
+ self.receive_mode.server_status.server_started.connect(
+ self.update_server_status_indicator
+ )
+ self.receive_mode.server_status.server_stopped.connect(
+ self.update_server_status_indicator
+ )
+ self.receive_mode.start_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.receive_mode.stop_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.receive_mode.stop_server_finished.connect(self.stop_server_finished)
+ self.receive_mode.start_server_finished.connect(self.clear_message)
+ self.receive_mode.server_status.button_clicked.connect(self.clear_message)
+ self.receive_mode.server_status.url_copied.connect(self.copy_url)
+ self.receive_mode.server_status.hidservauth_copied.connect(
+ self.copy_hidservauth
+ )
+
+ self.change_title.emit(self.tab_id, strings._("gui_tab_name_receive"))
+
+ self.update_server_status_indicator()
+ self.timer.start(500)
+
+ def website_mode_clicked(self):
+ self.common.log("Tab", "website_mode_clicked")
+ self.mode = self.common.gui.MODE_WEBSITE
+ self.new_tab.hide()
+
+ self.website_mode = WebsiteMode(self)
+ self.website_mode.change_persistent.connect(self.change_persistent)
+
+ self.layout.addWidget(self.website_mode)
+ self.website_mode.show()
+
+ self.website_mode.init()
+ self.website_mode.server_status.server_started.connect(
+ self.update_server_status_indicator
+ )
+ self.website_mode.server_status.server_stopped.connect(
+ self.update_server_status_indicator
+ )
+ self.website_mode.start_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.website_mode.stop_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.website_mode.stop_server_finished.connect(self.stop_server_finished)
+ self.website_mode.start_server_finished.connect(self.clear_message)
+ self.website_mode.server_status.button_clicked.connect(self.clear_message)
+ self.website_mode.server_status.url_copied.connect(self.copy_url)
+ self.website_mode.server_status.hidservauth_copied.connect(
+ self.copy_hidservauth
+ )
+
+ self.change_title.emit(self.tab_id, strings._("gui_tab_name_website"))
+
+ self.update_server_status_indicator()
+ self.timer.start(500)
+
+ def chat_mode_clicked(self):
+ self.common.log("Tab", "chat_mode_clicked")
+ self.mode = self.common.gui.MODE_CHAT
+ self.new_tab.hide()
+
+ self.chat_mode = ChatMode(self)
+ self.chat_mode.change_persistent.connect(self.change_persistent)
+
+ self.layout.addWidget(self.chat_mode)
+ self.chat_mode.show()
+
+ self.chat_mode.init()
+ self.chat_mode.server_status.server_started.connect(
+ self.update_server_status_indicator
+ )
+ self.chat_mode.server_status.server_stopped.connect(
+ self.update_server_status_indicator
+ )
+ self.chat_mode.start_server_finished.connect(
+ self.update_server_status_indicator
+ )
+ self.chat_mode.stop_server_finished.connect(self.update_server_status_indicator)
+ self.chat_mode.stop_server_finished.connect(self.stop_server_finished)
+ self.chat_mode.start_server_finished.connect(self.clear_message)
+ self.chat_mode.server_status.button_clicked.connect(self.clear_message)
+ self.chat_mode.server_status.url_copied.connect(self.copy_url)
+ self.chat_mode.server_status.hidservauth_copied.connect(self.copy_hidservauth)
+
+ self.change_title.emit(self.tab_id, strings._("gui_tab_name_chat"))
+
+ self.update_server_status_indicator()
+ self.timer.start(500)
+
+ def update_server_status_indicator(self):
+ # Set the status image
+ if self.mode == self.common.gui.MODE_SHARE:
+ # Share mode
+ if self.share_mode.server_status.status == ServerStatus.STATUS_STOPPED:
+ self.set_server_status_indicator_stopped(
+ strings._("gui_status_indicator_share_stopped")
+ )
+ elif self.share_mode.server_status.status == ServerStatus.STATUS_WORKING:
+ if self.settings.get("general", "autostart_timer"):
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_share_scheduled")
+ )
+ else:
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_share_working")
+ )
+ elif self.share_mode.server_status.status == ServerStatus.STATUS_STARTED:
+ self.set_server_status_indicator_started(
+ strings._("gui_status_indicator_share_started")
+ )
+ elif self.mode == self.common.gui.MODE_WEBSITE:
+ # Website mode
+ if self.website_mode.server_status.status == ServerStatus.STATUS_STOPPED:
+ self.set_server_status_indicator_stopped(
+ strings._("gui_status_indicator_share_stopped")
+ )
+ elif self.website_mode.server_status.status == ServerStatus.STATUS_WORKING:
+ if self.website_mode.server_status.autostart_timer_datetime:
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_share_scheduled")
+ )
+ else:
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_share_working")
+ )
+ elif self.website_mode.server_status.status == ServerStatus.STATUS_STARTED:
+ self.set_server_status_indicator_started(
+ strings._("gui_status_indicator_share_started")
+ )
+ elif self.mode == self.common.gui.MODE_RECEIVE:
+ # Receive mode
+ if self.receive_mode.server_status.status == ServerStatus.STATUS_STOPPED:
+ self.set_server_status_indicator_stopped(
+ strings._("gui_status_indicator_receive_stopped")
+ )
+ elif self.receive_mode.server_status.status == ServerStatus.STATUS_WORKING:
+ if self.settings.get("general", "autostart_timer"):
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_receive_scheduled")
+ )
+ else:
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_receive_working")
+ )
+ elif self.receive_mode.server_status.status == ServerStatus.STATUS_STARTED:
+ self.set_server_status_indicator_started(
+ strings._("gui_status_indicator_receive_started")
+ )
+ elif self.mode == self.common.gui.MODE_CHAT:
+ # Chat mode
+ if self.chat_mode.server_status.status == ServerStatus.STATUS_STOPPED:
+ self.set_server_status_indicator_stopped(
+ strings._("gui_status_indicator_receive_stopped")
+ )
+ elif self.chat_mode.server_status.status == ServerStatus.STATUS_WORKING:
+ if self.settings.get("general", "autostart_timer"):
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_receive_scheduled")
+ )
+ else:
+ self.set_server_status_indicator_working(
+ strings._("gui_status_indicator_receive_working")
+ )
+ elif self.chat_mode.server_status.status == ServerStatus.STATUS_STARTED:
+ self.set_server_status_indicator_started(
+ strings._("gui_status_indicator_receive_started")
+ )
+
+ def set_server_status_indicator_stopped(self, label_text):
+ self.change_icon.emit(self.tab_id, "images/server_stopped.png")
+ self.status_bar.server_status_image_label.setPixmap(
+ QtGui.QPixmap.fromImage(self.status_bar.server_status_image_stopped)
+ )
+ self.status_bar.server_status_label.setText(label_text)
+
+ def set_server_status_indicator_working(self, label_text):
+ self.change_icon.emit(self.tab_id, "images/server_working.png")
+ self.status_bar.server_status_image_label.setPixmap(
+ QtGui.QPixmap.fromImage(self.status_bar.server_status_image_working)
+ )
+ self.status_bar.server_status_label.setText(label_text)
+
+ def set_server_status_indicator_started(self, label_text):
+ self.change_icon.emit(self.tab_id, "images/server_started.png")
+ self.status_bar.server_status_image_label.setPixmap(
+ QtGui.QPixmap.fromImage(self.status_bar.server_status_image_started)
+ )
+ self.status_bar.server_status_label.setText(label_text)
+
+ def stop_server_finished(self):
+ # When the server stopped, cleanup the ephemeral onion service
+ self.get_mode().app.stop_onion_service(self.settings)
+
+ def timer_callback(self):
+ """
+ Check for messages communicated from the web app, and update the GUI accordingly. Also,
+ call ShareMode and ReceiveMode's timer_callbacks.
+ """
+ self.update()
+
+ if not self.common.gui.local_only:
+ # Have we lost connection to Tor somehow?
+ if not self.common.gui.onion.is_authenticated():
+ self.timer.stop()
+ self.status_bar.showMessage(strings._("gui_tor_connection_lost"))
+ self.system_tray.showMessage(
+ strings._("gui_tor_connection_lost"),
+ strings._("gui_tor_connection_error_settings"),
+ )
+ self.get_mode().handle_tor_broke()
+
+ # Process events from the web object
+ mode = self.get_mode()
+
+ events = []
+
+ done = False
+ while not done:
+ try:
+ r = mode.web.q.get(False)
+ events.append(r)
+ except queue.Empty:
+ done = True
+
+ for event in events:
+ if event["type"] == Web.REQUEST_LOAD:
+ mode.handle_request_load(event)
+
+ elif event["type"] == Web.REQUEST_STARTED:
+ mode.handle_request_started(event)
+
+ elif event["type"] == Web.REQUEST_RATE_LIMIT:
+ mode.handle_request_rate_limit(event)
+
+ elif event["type"] == Web.REQUEST_PROGRESS:
+ mode.handle_request_progress(event)
+
+ elif event["type"] == Web.REQUEST_CANCELED:
+ mode.handle_request_canceled(event)
+
+ elif event["type"] == Web.REQUEST_UPLOAD_FILE_RENAMED:
+ mode.handle_request_upload_file_renamed(event)
+
+ elif event["type"] == Web.REQUEST_UPLOAD_SET_DIR:
+ mode.handle_request_upload_set_dir(event)
+
+ elif event["type"] == Web.REQUEST_UPLOAD_FINISHED:
+ mode.handle_request_upload_finished(event)
+
+ elif event["type"] == Web.REQUEST_UPLOAD_CANCELED:
+ mode.handle_request_upload_canceled(event)
+
+ elif event["type"] == Web.REQUEST_INDIVIDUAL_FILE_STARTED:
+ mode.handle_request_individual_file_started(event)
+
+ elif event["type"] == Web.REQUEST_INDIVIDUAL_FILE_PROGRESS:
+ mode.handle_request_individual_file_progress(event)
+
+ elif event["type"] == Web.REQUEST_INDIVIDUAL_FILE_CANCELED:
+ mode.handle_request_individual_file_canceled(event)
+
+ if event["type"] == Web.REQUEST_ERROR_DATA_DIR_CANNOT_CREATE:
+ Alert(
+ self.common,
+ strings._("error_cannot_create_data_dir").format(
+ event["data"]["receive_mode_dir"]
+ ),
+ )
+
+ if event["type"] == Web.REQUEST_OTHER:
+ if (
+ event["path"] != "/favicon.ico"
+ and event["path"] != f"/{mode.web.shutdown_password}/shutdown"
+ ):
+ self.status_bar.showMessage(
+ f"{strings._('other_page_loaded')}: {event['path']}"
+ )
+
+ if event["type"] == Web.REQUEST_INVALID_PASSWORD:
+ self.status_bar.showMessage(
+ f"[#{mode.web.invalid_passwords_count}] {strings._('incorrect_password')}: {event['data']}"
+ )
+
+ mode.timer_callback()
+
+ def copy_url(self):
+ """
+ When the URL gets copied to the clipboard, display this in the status bar.
+ """
+ self.common.log("Tab", "copy_url")
+ self.system_tray.showMessage(
+ strings._("gui_copied_url_title"), strings._("gui_copied_url")
+ )
+
+ def copy_hidservauth(self):
+ """
+ When the stealth onion service HidServAuth gets copied to the clipboard, display this in the status bar.
+ """
+ self.common.log("Tab", "copy_hidservauth")
+ self.system_tray.showMessage(
+ strings._("gui_copied_hidservauth_title"),
+ strings._("gui_copied_hidservauth"),
+ )
+
+ def clear_message(self):
+ """
+ Clear messages from the status bar.
+ """
+ self.status_bar.clearMessage()
+
+ def get_mode(self):
+ if self.mode:
+ if self.mode == self.common.gui.MODE_SHARE:
+ return self.share_mode
+ elif self.mode == self.common.gui.MODE_RECEIVE:
+ return self.receive_mode
+ elif self.mode == self.common.gui.MODE_CHAT:
+ return self.chat_mode
+ else:
+ return self.website_mode
+ else:
+ return None
+
+ def settings_have_changed(self):
+ # Global settings have changed
+ self.common.log("Tab", "settings_have_changed")
+
+ # We might've stopped the main requests timer if a Tor connection failed. If we've reloaded
+ # settings, we probably succeeded in obtaining a new connection. If so, restart the timer.
+ if not self.common.gui.local_only:
+ if self.common.gui.onion.is_authenticated():
+ mode = self.get_mode()
+ if mode:
+ if not self.timer.isActive():
+ self.timer.start(500)
+ mode.on_reload_settings()
+
+ def close_tab(self):
+ self.common.log("Tab", "close_tab")
+ if self.mode is None:
+ return True
+
+ if self.settings.get("persistent", "enabled"):
+ dialog_text = strings._("gui_close_tab_warning_persistent_description")
+ else:
+ server_status = self.get_mode().server_status
+ if server_status.status == server_status.STATUS_STOPPED:
+ return True
+ else:
+ if self.mode == self.common.gui.MODE_SHARE:
+ dialog_text = strings._("gui_close_tab_warning_share_description")
+ elif self.mode == self.common.gui.MODE_RECEIVE:
+ dialog_text = strings._("gui_close_tab_warning_receive_description")
+ else:
+ dialog_text = strings._("gui_close_tab_warning_website_description")
+
+ # Open the warning dialog
+ self.common.log("Tab", "close_tab, opening warning dialog")
+ self.close_dialog.setText(dialog_text)
+ self.close_dialog.exec_()
+
+ # Close
+ if self.close_dialog.clickedButton() == self.close_dialog.accept_button:
+ self.common.log("Tab", "close_tab", "close, closing tab")
+ self.get_mode().stop_server()
+ self.app.cleanup()
+ return True
+ # Cancel
+ else:
+ self.common.log("Tab", "close_tab", "cancel, keeping tab open")
+ return False
+
+ def cleanup(self):
+ self.app.cleanup()
diff --git a/desktop/onionshare_gui/tab_widget.py b/desktop/onionshare_gui/tab_widget.py
new file mode 100644
index 00000000..fe80b95d
--- /dev/null
+++ b/desktop/onionshare_gui/tab_widget.py
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.mode_settings import ModeSettings
+
+from .tab import Tab
+from .threads import EventHandlerThread
+
+
+class TabWidget(QtWidgets.QTabWidget):
+ """
+ A custom tab widget, that has a "+" button for adding new tabs
+ """
+
+ bring_to_front = QtCore.pyqtSignal()
+
+ def __init__(self, common, system_tray, status_bar):
+ super(TabWidget, self).__init__()
+ self.common = common
+ self.common.log("TabWidget", "__init__")
+
+ self.system_tray = system_tray
+ self.status_bar = status_bar
+
+ # Keep track of tabs in a dictionary
+ self.tabs = {}
+ self.current_tab_id = 0 # Each tab has a unique id
+
+ # Define the new tab button
+ self.new_tab_button = QtWidgets.QPushButton("+", parent=self)
+ self.new_tab_button.setFlat(True)
+ self.new_tab_button.setFixedSize(40, 30)
+ self.new_tab_button.clicked.connect(self.new_tab_clicked)
+ self.new_tab_button.setStyleSheet(
+ self.common.gui.css["tab_widget_new_tab_button"]
+ )
+ self.new_tab_button.setToolTip(strings._("gui_new_tab_tooltip"))
+
+ # Use a custom tab bar
+ tab_bar = TabBar()
+ tab_bar.move_new_tab_button.connect(self.move_new_tab_button)
+ tab_bar.currentChanged.connect(self.tab_changed)
+ self.setTabBar(tab_bar)
+
+ # Set up the tab widget
+ self.setMovable(True)
+ self.setTabsClosable(True)
+ self.setUsesScrollButtons(True)
+ self.setDocumentMode(True)
+ self.setStyleSheet(self.common.gui.css["tab_widget"])
+
+ self.tabCloseRequested.connect(self.close_tab)
+
+ self.move_new_tab_button()
+
+ # Watch the events file for changes
+ self.event_handler_t = EventHandlerThread(common)
+ self.event_handler_t.new_tab.connect(self.add_tab)
+ self.event_handler_t.new_share_tab.connect(self.new_share_tab)
+ self.event_handler_t.start()
+
+ def cleanup(self):
+ # Stop the event thread
+ self.event_handler_t.should_quit = True
+ self.event_handler_t.quit()
+ self.event_handler_t.wait(50)
+
+ # Clean up each tab
+ for index in range(self.count()):
+ tab = self.widget(index)
+ tab.cleanup()
+
+ def move_new_tab_button(self):
+ # Find the width of all tabs
+ tabs_width = sum(
+ [self.tabBar().tabRect(i).width() for i in range(self.count())]
+ )
+
+ # The current position of the new tab button
+ pos = self.new_tab_button.pos()
+
+ # If there are so many tabs it scrolls, move the button to the left of the scroll buttons
+ if tabs_width > self.width():
+ pos.setX(self.width() - 65)
+ else:
+ # Otherwise move the button to the right of the tabs
+ pos.setX(self.tabBar().sizeHint().width())
+
+ self.new_tab_button.move(pos)
+ self.new_tab_button.raise_()
+
+ def tab_changed(self):
+ # Active tab was changed
+ tab_id = self.currentIndex()
+ self.common.log("TabWidget", "tab_changed", f"Tab was changed to {tab_id}")
+ try:
+ mode = self.tabs[tab_id].get_mode()
+ if mode:
+ # Update the server status indicator to reflect that of the current tab
+ self.tabs[tab_id].update_server_status_indicator()
+ else:
+ # If this tab doesn't have a mode set yet, blank the server status indicator
+ self.status_bar.server_status_image_label.clear()
+ self.status_bar.server_status_label.clear()
+ except KeyError:
+ # When all current tabs are closed, index briefly drops to -1 before resetting to 0
+ # which will otherwise trigger a KeyError on tab.get_mode() above.
+ pass
+
+ def new_tab_clicked(self):
+ # Create a new tab
+ self.add_tab()
+
+ def load_tab(self, mode_settings_id):
+ # Load the tab's mode settings
+ mode_settings = ModeSettings(self.common, id=mode_settings_id)
+ self.add_tab(mode_settings)
+
+ def new_share_tab(self, filenames):
+ mode_settings = ModeSettings(self.common)
+ mode_settings.set("persistent", "mode", "share")
+ mode_settings.set("share", "filenames", filenames)
+ self.add_tab(mode_settings)
+
+ def add_tab(self, mode_settings=None):
+ tab = Tab(self.common, self.current_tab_id, self.system_tray, self.status_bar)
+ tab.change_title.connect(self.change_title)
+ tab.change_icon.connect(self.change_icon)
+ tab.change_persistent.connect(self.change_persistent)
+
+ self.tabs[self.current_tab_id] = tab
+ self.current_tab_id += 1
+
+ index = self.addTab(tab, strings._("gui_new_tab"))
+ self.setCurrentIndex(index)
+
+ # Create a close button
+ def close_tab():
+ self.tabBar().tabCloseRequested.emit(self.indexOf(tab))
+
+ close_button = QtWidgets.QPushButton()
+ close_button.setFlat(True)
+ close_button.setFixedWidth(40)
+ close_button.setIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/close_tab.png"))
+ )
+ close_button.clicked.connect(close_tab)
+ self.tabBar().setTabButton(index, QtWidgets.QTabBar.RightSide, close_button)
+
+ tab.init(mode_settings)
+ # If it's persistent, set the persistent image in the tab
+ self.change_persistent(tab.tab_id, tab.settings.get("persistent", "enabled"))
+
+ # Bring the window to front, in case this is being added by an event
+ self.bring_to_front.emit()
+
+ def change_title(self, tab_id, title):
+ index = self.indexOf(self.tabs[tab_id])
+ self.setTabText(index, title)
+
+ def change_icon(self, tab_id, icon_path):
+ index = self.indexOf(self.tabs[tab_id])
+ self.setTabIcon(index, QtGui.QIcon(self.common.get_resource_path(icon_path)))
+
+ def change_persistent(self, tab_id, is_persistent):
+ index = self.indexOf(self.tabs[tab_id])
+ if is_persistent:
+ self.tabBar().setTabButton(
+ index,
+ QtWidgets.QTabBar.LeftSide,
+ self.tabs[tab_id].persistent_image_label,
+ )
+ else:
+ invisible_widget = QtWidgets.QWidget()
+ invisible_widget.setFixedSize(0, 0)
+ self.tabBar().setTabButton(
+ index, QtWidgets.QTabBar.LeftSide, invisible_widget
+ )
+
+ self.save_persistent_tabs()
+
+ def save_persistent_tabs(self):
+ # Figure out the order of persistent tabs to save in settings
+ persistent_tabs = []
+ for index in range(self.count()):
+ tab = self.widget(index)
+ if tab.settings.get("persistent", "enabled"):
+ persistent_tabs.append(tab.settings.id)
+ # Only save if tabs have actually moved
+ if persistent_tabs != self.common.settings.get("persistent_tabs"):
+ self.common.settings.set("persistent_tabs", persistent_tabs)
+ self.common.settings.save()
+
+ def close_tab(self, index):
+ self.common.log("TabWidget", "close_tab", f"{index}")
+ tab = self.widget(index)
+ if tab.close_tab():
+ # If the tab is persistent, delete the settings file from disk
+ if tab.settings.get("persistent", "enabled"):
+ tab.settings.delete()
+
+ # Remove the tab
+ self.removeTab(index)
+ del self.tabs[tab.tab_id]
+
+ # If the last tab is closed, open a new one
+ if self.count() == 0:
+ self.new_tab_clicked()
+
+ self.save_persistent_tabs()
+
+ def are_tabs_active(self):
+ """
+ See if there are active servers in any open tabs
+ """
+ for tab_id in self.tabs:
+ mode = self.tabs[tab_id].get_mode()
+ if mode:
+ if mode.server_status.status != mode.server_status.STATUS_STOPPED:
+ return True
+ return False
+
+ def paintEvent(self, event):
+ super(TabWidget, self).paintEvent(event)
+ # Save the order of persistent tabs whenever a new tab is switched to -- ideally we would
+ # do this whenever tabs gets moved, but paintEvent is the only event that seems to get triggered
+ # when this happens
+ self.save_persistent_tabs()
+
+ def resizeEvent(self, event):
+ # Make sure to move new tab button on each resize
+ super(TabWidget, self).resizeEvent(event)
+ self.move_new_tab_button()
+
+
+class TabBar(QtWidgets.QTabBar):
+ """
+ A custom tab bar
+ """
+
+ move_new_tab_button = QtCore.pyqtSignal()
+
+ def __init__(self):
+ super(TabBar, self).__init__()
+
+ def tabLayoutChange(self):
+ self.move_new_tab_button.emit()
diff --git a/desktop/onionshare_gui/threads.py b/desktop/onionshare_gui/threads.py
new file mode 100644
index 00000000..d1e6ea3c
--- /dev/null
+++ b/desktop/onionshare_gui/threads.py
@@ -0,0 +1,253 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import time
+import json
+import os
+from PyQt5 import QtCore
+
+from onionshare import strings
+from onionshare.onion import (
+ TorTooOld,
+ TorErrorInvalidSetting,
+ TorErrorAutomatic,
+ TorErrorSocketPort,
+ TorErrorSocketFile,
+ TorErrorMissingPassword,
+ TorErrorUnreadableCookieFile,
+ TorErrorAuthError,
+ TorErrorProtocolError,
+ BundledTorTimeout,
+)
+
+
+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):
+ super(OnionThread, self).__init__()
+ self.mode = mode
+ self.mode.common.log("OnionThread", "__init__")
+
+ # allow this thread to be terminated
+ self.setTerminationEnabled()
+
+ def run(self):
+ self.mode.common.log("OnionThread", "run")
+
+ # Make a new static URL path for each new share
+ self.mode.web.generate_static_url_path()
+
+ # Choose port and password early, because we need them to exist in advance for scheduled shares
+ if not self.mode.app.port:
+ self.mode.app.choose_port()
+ if not self.mode.settings.get("general", "public"):
+ if not self.mode.web.password:
+ self.mode.web.generate_password(
+ self.mode.settings.get("onion", "password")
+ )
+
+ try:
+ if self.mode.obtain_onion_early:
+ self.mode.app.start_onion_service(
+ self.mode.settings, await_publication=False
+ )
+ # 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.stop_onion_service(self.mode.settings)
+ else:
+ self.mode.app.start_onion_service(
+ self.mode.settings, 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])
+ return
+
+
+class WebThread(QtCore.QThread):
+ """
+ Starts the web service
+ """
+
+ success = QtCore.pyqtSignal()
+ error = QtCore.pyqtSignal(str)
+
+ def __init__(self, mode):
+ super(WebThread, self).__init__()
+ self.mode = mode
+ self.mode.common.log("WebThread", "__init__")
+
+ def run(self):
+ self.mode.common.log("WebThread", "run")
+ self.mode.web.start(self.mode.app.port)
+ 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
+
+
+class EventHandlerThread(QtCore.QThread):
+ """
+ To trigger an event, write a JSON line to the events file. When that file changes,
+ each line will be handled as an event. Valid events are:
+ {"type": "new_tab"}
+ {"type": "new_share_tab", "filenames": ["file1", "file2"]}
+ """
+
+ new_tab = QtCore.pyqtSignal()
+ new_share_tab = QtCore.pyqtSignal(list)
+
+ def __init__(self, common):
+ super(EventHandlerThread, self).__init__()
+ self.common = common
+ self.common.log("EventHandlerThread", "__init__")
+ self.should_quit = False
+
+ def run(self):
+ self.common.log("EventHandlerThread", "run")
+
+ mtime = 0
+ while True:
+ if os.path.exists(self.common.gui.events_filename):
+ # Events file exists
+ if os.stat(self.common.gui.events_filename).st_mtime != mtime:
+ # Events file has been modified, load events
+ try:
+ with open(self.common.gui.events_filename, "r") as f:
+ lines = f.readlines()
+ os.remove(self.common.gui.events_filename)
+
+ self.common.log(
+ "EventHandler", "run", f"processing {len(lines)} lines"
+ )
+ for line in lines:
+ try:
+ obj = json.loads(line)
+ if "type" not in obj:
+ self.common.log(
+ "EventHandler",
+ "run",
+ f"event does not have a type: {obj}",
+ )
+ continue
+ except json.decoder.JSONDecodeError:
+ self.common.log(
+ "EventHandler",
+ "run",
+ f"ignoring invalid line: {line}",
+ )
+ continue
+
+ if obj["type"] == "new_tab":
+ self.common.log("EventHandler", "run", "new_tab event")
+ self.new_tab.emit()
+
+ elif obj["type"] == "new_share_tab":
+ if (
+ "filenames" in obj
+ and type(obj["filenames"]) is list
+ ):
+ self.new_share_tab.emit(obj["filenames"])
+ else:
+ self.common.log(
+ "EventHandler",
+ "run",
+ f"invalid new_share_tab event: {obj}",
+ )
+
+ else:
+ self.common.log(
+ "EventHandler", "run", f"invalid event type: {obj}"
+ )
+
+ except:
+ pass
+
+ if self.should_quit:
+ break
+ time.sleep(0.2)
diff --git a/desktop/onionshare_gui/tor_connection_dialog.py b/desktop/onionshare_gui/tor_connection_dialog.py
new file mode 100644
index 00000000..02868625
--- /dev/null
+++ b/desktop/onionshare_gui/tor_connection_dialog.py
@@ -0,0 +1,168 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+
+from onionshare import strings
+from onionshare.onion import *
+
+from .widgets import Alert
+
+
+class TorConnectionDialog(QtWidgets.QProgressDialog):
+ """
+ Connecting to Tor dialog.
+ """
+
+ open_settings = QtCore.pyqtSignal()
+
+ def __init__(self, common, custom_settings=False):
+ super(TorConnectionDialog, self).__init__(None)
+
+ self.common = common
+
+ if custom_settings:
+ self.settings = custom_settings
+ else:
+ self.settings = self.common.settings
+
+ self.common.log("TorConnectionDialog", "__init__")
+
+ self.setWindowTitle("OnionShare")
+ self.setWindowIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+ self.setModal(True)
+ self.setFixedSize(400, 150)
+
+ # Label
+ self.setLabelText(strings._("connecting_to_tor"))
+
+ # Progress bar ticks from 0 to 100
+ self.setRange(0, 100)
+ # Don't show if connection takes less than 100ms (for non-bundled tor)
+ self.setMinimumDuration(100)
+
+ # Start displaying the status at 0
+ self._tor_status_update(0, "")
+
+ def start(self):
+ self.common.log("TorConnectionDialog", "start")
+
+ t = TorConnectionThread(self.common, self.settings, self)
+ t.tor_status_update.connect(self._tor_status_update)
+ t.connected_to_tor.connect(self._connected_to_tor)
+ t.canceled_connecting_to_tor.connect(self._canceled_connecting_to_tor)
+ t.error_connecting_to_tor.connect(self._error_connecting_to_tor)
+ t.start()
+
+ # The main thread needs to remain active, and checking for Qt events,
+ # until the thread is finished. Otherwise it won't be able to handle
+ # accepting signals.
+ self.active = True
+ while self.active:
+ time.sleep(0.1)
+ self.common.gui.qtapp.processEvents()
+
+ def _tor_status_update(self, progress, summary):
+ self.setValue(int(progress))
+ self.setLabelText(
+ f"<strong>{strings._('connecting_to_tor')}</strong><br>{summary}"
+ )
+
+ def _connected_to_tor(self):
+ self.common.log("TorConnectionDialog", "_connected_to_tor")
+ self.active = False
+
+ # Close the dialog after connecting
+ self.setValue(self.maximum())
+
+ def _canceled_connecting_to_tor(self):
+ self.common.log("TorConnectionDialog", "_canceled_connecting_to_tor")
+ self.active = False
+ self.common.gui.onion.cleanup()
+
+ # Cancel connecting to Tor
+ QtCore.QTimer.singleShot(1, self.cancel)
+
+ def _error_connecting_to_tor(self, msg):
+ self.common.log("TorConnectionDialog", "_error_connecting_to_tor")
+ self.active = False
+
+ def alert_and_open_settings():
+ # Display the exception in an alert box
+ Alert(
+ self.common,
+ f"{msg}\n\n{strings._('gui_tor_connection_error_settings')}",
+ QtWidgets.QMessageBox.Warning,
+ )
+
+ # Open settings
+ self.open_settings.emit()
+
+ QtCore.QTimer.singleShot(1, alert_and_open_settings)
+
+ # Cancel connecting to Tor
+ QtCore.QTimer.singleShot(1, self.cancel)
+
+
+class TorConnectionThread(QtCore.QThread):
+ tor_status_update = QtCore.pyqtSignal(str, str)
+ connected_to_tor = QtCore.pyqtSignal()
+ canceled_connecting_to_tor = QtCore.pyqtSignal()
+ error_connecting_to_tor = QtCore.pyqtSignal(str)
+
+ def __init__(self, common, settings, dialog):
+ super(TorConnectionThread, self).__init__()
+
+ self.common = common
+
+ self.common.log("TorConnectionThread", "__init__")
+
+ self.settings = settings
+
+ self.dialog = dialog
+
+ def run(self):
+ self.common.log("TorConnectionThread", "run")
+
+ # Connect to the Onion
+ try:
+ self.common.gui.onion.connect(self.settings, False, self._tor_status_update)
+ if self.common.gui.onion.connected_to_tor:
+ self.connected_to_tor.emit()
+ else:
+ self.canceled_connecting_to_tor.emit()
+
+ except BundledTorCanceled as e:
+ self.common.log(
+ "TorConnectionThread", "run", "caught exception: BundledTorCanceled"
+ )
+ self.canceled_connecting_to_tor.emit()
+
+ except Exception as e:
+ self.common.log("TorConnectionThread", "run", f"caught exception: {e}")
+ self.error_connecting_to_tor.emit(str(e))
+
+ def _tor_status_update(self, progress, summary):
+ self.tor_status_update.emit(progress, summary)
+
+ # Return False if the dialog was canceled
+ return not self.dialog.wasCanceled()
diff --git a/desktop/onionshare_gui/update_checker.py b/desktop/onionshare_gui/update_checker.py
new file mode 100644
index 00000000..699ad952
--- /dev/null
+++ b/desktop/onionshare_gui/update_checker.py
@@ -0,0 +1,234 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore
+import datetime, time, socket, re, platform
+import socks
+from distutils.version import LooseVersion as Version
+
+from onionshare.settings import Settings
+from onionshare.onion import Onion
+
+from onionshare import strings
+
+
+class UpdateCheckerCheckError(Exception):
+ """
+ Error checking for updates because of some Tor connection issue, or because
+ the OnionShare website is down.
+ """
+
+ pass
+
+
+class UpdateCheckerInvalidLatestVersion(Exception):
+ """
+ Successfully downloaded the latest version, but it doesn't appear to be a
+ valid version string.
+ """
+
+ def __init__(self, latest_version):
+ self.latest_version = latest_version
+
+
+class UpdateChecker(QtCore.QObject):
+ """
+ Load http://elx57ue5uyfplgva.onion/latest-version.txt to see what the latest
+ version of OnionShare is. If the latest version is newer than the
+ installed version, alert the user.
+
+ Only check at most once per day, unless force is True.
+ """
+
+ update_available = QtCore.pyqtSignal(str, str, str)
+ update_not_available = QtCore.pyqtSignal()
+ update_error = QtCore.pyqtSignal()
+ update_invalid_version = QtCore.pyqtSignal(str)
+
+ def __init__(self, common, onion):
+ super(UpdateChecker, self).__init__()
+
+ self.common = common
+
+ self.common.log("UpdateChecker", "__init__")
+ self.onion = onion
+
+ def check(self, force=False):
+ self.common.log("UpdateChecker", "check", f"force={force}")
+ # Load the settings
+ settings = Settings(self.common)
+ settings.load()
+
+ # If force=True, then definitely check
+ if force:
+ check_for_updates = True
+ else:
+ check_for_updates = False
+
+ # See if it's been 1 day since the last check
+ autoupdate_timestamp = settings.get("autoupdate_timestamp")
+ if autoupdate_timestamp:
+ last_checked = datetime.datetime.fromtimestamp(autoupdate_timestamp)
+ now = datetime.datetime.now()
+
+ one_day = datetime.timedelta(days=1)
+ if now - last_checked > one_day:
+ check_for_updates = True
+ else:
+ check_for_updates = True
+
+ # Check for updates
+ if check_for_updates:
+ self.common.log("UpdateChecker", "check", "checking for updates")
+ # Download the latest-version file over Tor
+ try:
+ # User agent string includes OnionShare version and platform
+ user_agent = f"OnionShare {self.common.version}, {self.common.platform}"
+
+ # If the update is forced, add '?force=1' to the URL, to more
+ # accurately measure daily users
+ path = "/latest-version.txt"
+ if force:
+ path += "?force=1"
+
+ if Version(self.onion.tor_version) >= Version("0.3.2.9"):
+ onion_domain = (
+ "lldan5gahapx5k7iafb3s4ikijc4ni7gx5iywdflkba5y2ezyg6sjgyd.onion"
+ )
+ else:
+ onion_domain = "elx57ue5uyfplgva.onion"
+
+ self.common.log(
+ "UpdateChecker", "check", f"loading http://{onion_domain}{path}"
+ )
+
+ (socks_address, socks_port) = self.onion.get_tor_socks_port()
+ socks.set_default_proxy(socks.SOCKS5, socks_address, socks_port)
+
+ s = socks.socksocket()
+ s.settimeout(15) # 15 second timeout
+ s.connect((onion_domain, 80))
+
+ http_request = f"GET {path} HTTP/1.0\r\n"
+ http_request += f"Host: {onion_domain}\r\n"
+ http_request += f"User-Agent: {user_agent}\r\n"
+ http_request += "\r\n"
+ s.sendall(http_request.encode("utf-8"))
+
+ http_response = s.recv(1024)
+ latest_version = (
+ http_response[http_response.find(b"\r\n\r\n") :]
+ .strip()
+ .decode("utf-8")
+ )
+
+ self.common.log(
+ "UpdateChecker",
+ "check",
+ f"latest OnionShare version: {latest_version}",
+ )
+
+ except Exception as e:
+ self.common.log("UpdateChecker", "check", str(e))
+ self.update_error.emit()
+ raise UpdateCheckerCheckError
+
+ # Validate that latest_version looks like a version string
+ # This regex is: 1-3 dot-separated numeric components
+ version_re = r"^(\d+\.)?(\d+\.)?(\d+)$"
+ if not re.match(version_re, latest_version):
+ self.update_invalid_version.emit(latest_version)
+ raise UpdateCheckerInvalidLatestVersion(latest_version)
+
+ # Update the last checked timestamp (dropping the seconds and milliseconds)
+ timestamp = (
+ datetime.datetime.now()
+ .replace(microsecond=0)
+ .replace(second=0)
+ .timestamp()
+ )
+ # Re-load the settings first before saving, just in case they've changed since we started our thread
+ settings.load()
+ settings.set("autoupdate_timestamp", timestamp)
+ settings.save()
+
+ # Do we need to update?
+ update_url = f"https://github.com/micahflee/onionshare/releases/tag/v{latest_version}"
+ installed_version = self.common.version
+ if installed_version < latest_version:
+ self.update_available.emit(
+ update_url, installed_version, latest_version
+ )
+ return
+
+ # No updates are available
+ self.update_not_available.emit()
+
+
+class UpdateThread(QtCore.QThread):
+ update_available = QtCore.pyqtSignal(str, str, str)
+ update_not_available = QtCore.pyqtSignal()
+ update_error = QtCore.pyqtSignal()
+ update_invalid_version = QtCore.pyqtSignal(str)
+
+ def __init__(self, common, onion, force=False):
+ super(UpdateThread, self).__init__()
+
+ self.common = common
+
+ self.common.log("UpdateThread", "__init__")
+ self.onion = onion
+ self.force = force
+
+ def run(self):
+ self.common.log("UpdateThread", "run")
+
+ u = UpdateChecker(self.common, self.onion)
+ u.update_available.connect(self._update_available)
+ u.update_not_available.connect(self._update_not_available)
+ u.update_error.connect(self._update_error)
+ u.update_invalid_version.connect(self._update_invalid_version)
+
+ try:
+ u.check(force=self.force)
+ except Exception as e:
+ # If update check fails, silently ignore
+ self.common.log("UpdateThread", "run", str(e))
+ pass
+
+ def _update_available(self, update_url, installed_version, latest_version):
+ self.common.log("UpdateThread", "_update_available")
+ self.active = False
+ self.update_available.emit(update_url, installed_version, latest_version)
+
+ def _update_not_available(self):
+ self.common.log("UpdateThread", "_update_not_available")
+ self.active = False
+ self.update_not_available.emit()
+
+ def _update_error(self):
+ self.common.log("UpdateThread", "_update_error")
+ self.active = False
+ self.update_error.emit()
+
+ def _update_invalid_version(self, latest_version):
+ self.common.log("UpdateThread", "_update_invalid_version")
+ self.active = False
+ self.update_invalid_version.emit(latest_version)
diff --git a/desktop/onionshare_gui/widgets.py b/desktop/onionshare_gui/widgets.py
new file mode 100644
index 00000000..846ff4e7
--- /dev/null
+++ b/desktop/onionshare_gui/widgets.py
@@ -0,0 +1,156 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from PyQt5 import QtCore, QtWidgets, QtGui
+from onionshare import strings
+import qrcode
+
+
+class Alert(QtWidgets.QMessageBox):
+ """
+ An alert box dialog.
+ """
+
+ def __init__(
+ self,
+ common,
+ message,
+ icon=QtWidgets.QMessageBox.NoIcon,
+ buttons=QtWidgets.QMessageBox.Ok,
+ autostart=True,
+ ):
+ super(Alert, self).__init__(None)
+
+ self.common = common
+
+ self.common.log("Alert", "__init__")
+
+ self.setWindowTitle("OnionShare")
+ self.setWindowIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+ self.setText(message)
+ self.setIcon(icon)
+ self.setStandardButtons(buttons)
+
+ if autostart:
+ self.exec_()
+
+
+class AddFileDialog(QtWidgets.QFileDialog):
+ """
+ Overridden version of QFileDialog which allows us to select folders as well
+ as, or instead of, files. For adding files/folders to share.
+
+ Note that this dialog can't be used in macOS, only in Windows, Linux, and BSD.
+ This is because the macOS sandbox requires native dialogs, and this is a Qt5
+ dialog.
+ """
+
+ def __init__(self, common, *args, **kwargs):
+ QtWidgets.QFileDialog.__init__(self, *args, **kwargs)
+
+ self.common = common
+ self.common.log("AddFileDialog", "__init__")
+
+ self.setOption(self.DontUseNativeDialog, True)
+ self.setOption(self.ReadOnly, True)
+ self.setOption(self.ShowDirsOnly, False)
+ self.setFileMode(self.ExistingFiles)
+ tree_view = self.findChild(QtWidgets.QTreeView)
+ tree_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
+ list_view = self.findChild(QtWidgets.QListView, "listView")
+ list_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
+
+ def accept(self):
+ self.common.log("AddFileDialog", "accept")
+ QtWidgets.QDialog.accept(self)
+
+
+class MinimumWidthWidget(QtWidgets.QWidget):
+ """
+ An empty widget with a minimum width, just to force layouts to behave
+ """
+
+ def __init__(self, width):
+ super(MinimumWidthWidget, self).__init__()
+ self.setMinimumWidth(width)
+
+
+class Image(qrcode.image.base.BaseImage):
+ """
+ A custom Image class, for use with the QR Code pixmap.
+ """
+
+ def __init__(self, border, width, box_size):
+ self.border = border
+ self.width = width
+ self.box_size = box_size
+ size = (width + border * 2) * box_size
+ self._image = QtGui.QImage(size, size, QtGui.QImage.Format_RGB16)
+ self._image.fill(QtCore.Qt.white)
+
+ def pixmap(self):
+ return QtGui.QPixmap.fromImage(self._image)
+
+ def drawrect(self, row, col):
+ painter = QtGui.QPainter(self._image)
+ painter.fillRect(
+ (col + self.border) * self.box_size,
+ (row + self.border) * self.box_size,
+ self.box_size,
+ self.box_size,
+ QtCore.Qt.black,
+ )
+
+ def save(self, stream, kind=None):
+ pass
+
+
+class QRCodeDialog(QtWidgets.QDialog):
+ """
+ A dialog showing a QR code.
+ """
+
+ def __init__(self, common, text):
+ super(QRCodeDialog, self).__init__()
+
+ self.common = common
+ self.text = text
+
+ self.common.log("QrCode", "__init__")
+
+ self.qr_label = QtWidgets.QLabel(self)
+ self.qr_label.setPixmap(qrcode.make(self.text, image_factory=Image).pixmap())
+
+ self.qr_label_description = QtWidgets.QLabel(self)
+ self.qr_label_description.setText(strings._("gui_qr_code_description"))
+ self.qr_label_description.setWordWrap(True)
+
+ self.setWindowTitle(strings._("gui_qr_code_dialog_title"))
+ self.setWindowIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+ layout = QtWidgets.QVBoxLayout(self)
+ layout.addWidget(self.qr_label)
+ layout.addWidget(self.qr_label_description)
+
+ self.exec_()
+
diff --git a/desktop/pyproject.toml b/desktop/pyproject.toml
new file mode 100644
index 00000000..79ae4a43
--- /dev/null
+++ b/desktop/pyproject.toml
@@ -0,0 +1,51 @@
+[tool.briefcase]
+project_name = "OnionShare"
+bundle = "org.onionshare.OnionShare"
+version = "2.3.dev1"
+url = "https://onionshare.org"
+license = "GPLv3"
+author = 'Micah Lee'
+author_email = "micah@micahflee.com"
+
+[tool.briefcase.app.helloworld]
+formal_name = "OnionShare"
+description = "OnionShare lets you securely and anonymously send and receive files. It works by starting a web server, making it accessible as a Tor onion service, and generating an unguessable web address so others can download files from you, or upload files to you. It does _not_ require setting up a separate server or using a third party file-sharing service."
+icon = "src/helloworld/resources/helloworld"
+sources = ['src/onionshare']
+requires = [
+ "Click",
+ "eventlet",
+ "Flask",
+ "Flask-HTTPAuth",
+ "flask-socketio",
+ "psutil",
+ "pycryptodome",
+ "PyQt5==5.14",
+ "PyQt5-sip",
+ "PySocks",
+ "qrcode",
+ "requests",
+ "stem",
+ "urllib3",
+]
+
+[tool.briefcase.app.helloworld.macOS]
+requires = []
+
+[tool.briefcase.app.helloworld.linux]
+requires = []
+system_requires = []
+
+[tool.briefcase.app.helloworld.windows]
+requires = ["pywin32"]
+
+# Mobile deployments
+[tool.briefcase.app.helloworld.iOS]
+requires = []
+
+[tool.briefcase.app.helloworld.android]
+requires = []
+
+# TODO: Figure out tests with briefcase
+# Test dependencies: pytest, pytest-faulthandler, pytest-qt
+# Also probably https://pypi.org/project/pytest-briefcase/ \ No newline at end of file
diff --git a/desktop/screenshots/appdata-onionshare-receive-client.png b/desktop/screenshots/appdata-onionshare-receive-client.png
new file mode 100644
index 00000000..8edcc326
--- /dev/null
+++ b/desktop/screenshots/appdata-onionshare-receive-client.png
Binary files differ
diff --git a/desktop/screenshots/appdata-onionshare-receive-server.png b/desktop/screenshots/appdata-onionshare-receive-server.png
new file mode 100644
index 00000000..121eab48
--- /dev/null
+++ b/desktop/screenshots/appdata-onionshare-receive-server.png
Binary files differ
diff --git a/desktop/screenshots/appdata-onionshare-share-client.png b/desktop/screenshots/appdata-onionshare-share-client.png
new file mode 100644
index 00000000..c57fb2a8
--- /dev/null
+++ b/desktop/screenshots/appdata-onionshare-share-client.png
Binary files differ
diff --git a/desktop/screenshots/appdata-onionshare-share-server.png b/desktop/screenshots/appdata-onionshare-share-server.png
new file mode 100644
index 00000000..d85e45ce
--- /dev/null
+++ b/desktop/screenshots/appdata-onionshare-share-server.png
Binary files differ
diff --git a/desktop/screenshots/onionshare-receive-client.png b/desktop/screenshots/onionshare-receive-client.png
new file mode 100644
index 00000000..648d67ae
--- /dev/null
+++ b/desktop/screenshots/onionshare-receive-client.png
Binary files differ
diff --git a/desktop/screenshots/onionshare-receive-server.png b/desktop/screenshots/onionshare-receive-server.png
new file mode 100644
index 00000000..0e801d3d
--- /dev/null
+++ b/desktop/screenshots/onionshare-receive-server.png
Binary files differ
diff --git a/desktop/screenshots/onionshare-share-client.png b/desktop/screenshots/onionshare-share-client.png
new file mode 100644
index 00000000..58f102d4
--- /dev/null
+++ b/desktop/screenshots/onionshare-share-client.png
Binary files differ
diff --git a/desktop/screenshots/onionshare-share-server.png b/desktop/screenshots/onionshare-share-server.png
new file mode 100644
index 00000000..329fc8af
--- /dev/null
+++ b/desktop/screenshots/onionshare-share-server.png
Binary files differ
diff --git a/desktop/screenshots/onionshare-website-server.png b/desktop/screenshots/onionshare-website-server.png
new file mode 100644
index 00000000..55e4fa27
--- /dev/null
+++ b/desktop/screenshots/onionshare-website-server.png
Binary files differ
diff --git a/desktop/setup.cfg b/desktop/setup.cfg
new file mode 100644
index 00000000..0a8df87a
--- /dev/null
+++ b/desktop/setup.cfg
@@ -0,0 +1,2 @@
+[wheel]
+universal = 1 \ No newline at end of file
diff --git a/desktop/setup.py b/desktop/setup.py
new file mode 100644
index 00000000..ebecd40b
--- /dev/null
+++ b/desktop/setup.py
@@ -0,0 +1,98 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import os, sys, platform, tempfile
+from distutils.core import setup
+
+
+def file_list(path):
+ files = []
+ for filename in os.listdir(path):
+ if os.path.isfile(os.path.join(path, filename)):
+ files.append(os.path.join(path, filename))
+ return files
+
+
+version = open("share/version.txt").read().strip()
+description = "OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network."
+
+author = "Micah Lee"
+author_email = "micah@micahflee.com"
+url = "https://onionshare.org"
+license = "GPL v3"
+keywords = "onion, share, onionshare, tor, anonymous, web server"
+classifiers = [
+ "Programming Language :: Python :: 3",
+ "Framework :: Flask",
+ "Topic :: Communications :: File Sharing",
+ "Topic :: Security :: Cryptography",
+ "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
+ "Intended Audience :: End Users/Desktop",
+ "Operating System :: OS Independent",
+ "Environment :: Web Environment",
+]
+data_files = [
+ ("share/applications", ["install/org.onionshare.OnionShare.desktop"],),
+ ("share/icons/hicolor/512x512/apps", ["install/org.onionshare.OnionShare.png"],),
+ ("share/metainfo", ["install/org.onionshare.OnionShare.appdata.xml"],),
+ ("share/onionshare", file_list("share")),
+ ("share/onionshare/images", file_list("share/images")),
+ ("share/onionshare/locale", file_list("share/locale")),
+ ("share/onionshare/templates", file_list("share/templates"),),
+ ("share/onionshare/static/css", file_list("share/static/css"),),
+ ("share/onionshare/static/img", file_list("share/static/img"),),
+ ("share/onionshare/static/js", file_list("share/static/js"),),
+]
+if not platform.system().endswith("BSD") and platform.system() != "DragonFly":
+ data_files.append(
+ (
+ "share/nautilus-python/extensions/",
+ ["install/scripts/onionshare-nautilus.py"],
+ )
+ )
+
+setup(
+ name="onionshare",
+ version=version,
+ description=description,
+ author=author,
+ author_email=author_email,
+ maintainer=author,
+ maintainer_email=author_email,
+ url=url,
+ license=license,
+ keywords=keywords,
+ classifiers=classifiers,
+ packages=[
+ "onionshare",
+ "onionshare.web",
+ "onionshare_gui",
+ "onionshare_gui.tab",
+ "onionshare_gui.tab.mode",
+ "onionshare_gui.tab.mode.share_mode",
+ "onionshare_gui.tab.mode.receive_mode",
+ "onionshare_gui.tab.mode.website_mode",
+ "onionshare_gui.tab.mode.chat_mode",
+ ],
+ include_package_data=True,
+ scripts=["install/scripts/onionshare", "install/scripts/onionshare-gui"],
+ data_files=data_files,
+)
diff --git a/desktop/share/images/close_tab.png b/desktop/share/images/close_tab.png
new file mode 100644
index 00000000..a7984a6d
--- /dev/null
+++ b/desktop/share/images/close_tab.png
Binary files differ
diff --git a/desktop/share/images/file_delete.png b/desktop/share/images/file_delete.png
new file mode 100644
index 00000000..b9057df5
--- /dev/null
+++ b/desktop/share/images/file_delete.png
Binary files differ
diff --git a/desktop/share/images/history_completed.png b/desktop/share/images/history_completed.png
new file mode 100644
index 00000000..e68fe5a2
--- /dev/null
+++ b/desktop/share/images/history_completed.png
Binary files differ
diff --git a/desktop/share/images/history_completed_none.png b/desktop/share/images/history_completed_none.png
new file mode 100644
index 00000000..8dbd6939
--- /dev/null
+++ b/desktop/share/images/history_completed_none.png
Binary files differ
diff --git a/desktop/share/images/history_in_progress.png b/desktop/share/images/history_in_progress.png
new file mode 100644
index 00000000..19694659
--- /dev/null
+++ b/desktop/share/images/history_in_progress.png
Binary files differ
diff --git a/desktop/share/images/history_in_progress_none.png b/desktop/share/images/history_in_progress_none.png
new file mode 100644
index 00000000..2d61dba4
--- /dev/null
+++ b/desktop/share/images/history_in_progress_none.png
Binary files differ
diff --git a/desktop/share/images/history_requests.png b/desktop/share/images/history_requests.png
new file mode 100644
index 00000000..4965744d
--- /dev/null
+++ b/desktop/share/images/history_requests.png
Binary files differ
diff --git a/desktop/share/images/history_requests_none.png b/desktop/share/images/history_requests_none.png
new file mode 100644
index 00000000..93a71ef3
--- /dev/null
+++ b/desktop/share/images/history_requests_none.png
Binary files differ
diff --git a/desktop/share/images/info.png b/desktop/share/images/info.png
new file mode 100644
index 00000000..4be4e65e
--- /dev/null
+++ b/desktop/share/images/info.png
Binary files differ
diff --git a/desktop/share/images/logo.png b/desktop/share/images/logo.png
new file mode 100644
index 00000000..43884c1f
--- /dev/null
+++ b/desktop/share/images/logo.png
Binary files differ
diff --git a/desktop/share/images/logo_grayscale.png b/desktop/share/images/logo_grayscale.png
new file mode 100644
index 00000000..950d9ff6
--- /dev/null
+++ b/desktop/share/images/logo_grayscale.png
Binary files differ
diff --git a/desktop/share/images/logo_text.png b/desktop/share/images/logo_text.png
new file mode 100644
index 00000000..3b584acd
--- /dev/null
+++ b/desktop/share/images/logo_text.png
Binary files differ
diff --git a/desktop/share/images/logo_transparent.png b/desktop/share/images/logo_transparent.png
new file mode 100644
index 00000000..1e8ed196
--- /dev/null
+++ b/desktop/share/images/logo_transparent.png
Binary files differ
diff --git a/desktop/share/images/mode_chat.png b/desktop/share/images/mode_chat.png
new file mode 100644
index 00000000..33114364
--- /dev/null
+++ b/desktop/share/images/mode_chat.png
Binary files differ
diff --git a/desktop/share/images/mode_chat.svg b/desktop/share/images/mode_chat.svg
new file mode 100644
index 00000000..335e9cf4
--- /dev/null
+++ b/desktop/share/images/mode_chat.svg
@@ -0,0 +1,81 @@
+<svg width="300" height="252" viewBox="0 0 300 252" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M84.6089 251.006C129.061 251.006 165.097 245.451 165.097 238.599C165.097 231.746 129.061 226.191 84.6089 226.191C40.1567 226.191 4.12109 231.746 4.12109 238.599C4.12109 245.451 40.1567 251.006 84.6089 251.006Z" fill="#E5E5E5"/>
+<path d="M62.3512 56.9482H17.8125V57.5845H62.3512V56.9482Z" fill="#E5E5E5"/>
+<path d="M30.5386 51.2207H29.9023V57.1062H30.5386V51.2207Z" fill="#E5E5E5"/>
+<path d="M49.9527 51.2207H49.3164V57.1062H49.9527V51.2207Z" fill="#E5E5E5"/>
+<path d="M181.98 39.4482H137.441V40.0845H181.98V39.4482Z" fill="#E5E5E5"/>
+<path d="M150.168 33.7207H149.531V39.6062H150.168V33.7207Z" fill="#E5E5E5"/>
+<path d="M169.562 33.7207H168.926V39.6062H169.562V33.7207Z" fill="#E5E5E5"/>
+<path d="M207.097 216.65H162.559V217.287H207.097V216.65Z" fill="#E5E5E5"/>
+<path d="M175.304 210.923H174.668V216.808H175.304V210.923Z" fill="#E5E5E5"/>
+<path d="M194.699 210.923H194.062V216.808H194.699V210.923Z" fill="#E5E5E5"/>
+<path d="M296.492 188.018H251.953V188.654H296.492V188.018Z" fill="#E5E5E5"/>
+<path d="M264.679 182.29H264.043V188.175H264.679V182.29Z" fill="#E5E5E5"/>
+<path d="M284.093 182.29H283.457V188.175H284.093V182.29Z" fill="#E5E5E5"/>
+<path d="M300.007 115.161H255.469V115.797H300.007V115.161Z" fill="#E5E5E5"/>
+<path d="M268.195 109.438H267.559V115.324H268.195V109.438Z" fill="#E5E5E5"/>
+<path d="M287.589 109.438H286.953V115.324H287.589V109.438Z" fill="#E5E5E5"/>
+<path d="M141.882 122.163H97.3438V122.799H141.882V122.163Z" fill="#E5E5E5"/>
+<path d="M110.07 116.436H109.434V122.321H110.07V116.436Z" fill="#E5E5E5"/>
+<path d="M129.484 116.436H128.848V122.321H129.484V116.436Z" fill="#E5E5E5"/>
+<path d="M252.605 169.883H208.066V170.519H252.605V169.883Z" fill="#E5E5E5"/>
+<path d="M220.773 164.155H220.137V170.041H220.773V164.155Z" fill="#E5E5E5"/>
+<path d="M240.187 164.155H239.551V170.041H240.187V164.155Z" fill="#E5E5E5"/>
+<path d="M189.929 149.839H145.391V150.475H189.929V149.839Z" fill="#E5E5E5"/>
+<path d="M158.117 144.111H157.48V149.997H158.117V144.111Z" fill="#E5E5E5"/>
+<path d="M177.531 144.111H176.895V149.997H177.531V144.111Z" fill="#E5E5E5"/>
+<path d="M129.168 86.8506H84.6289V87.4869H129.168V86.8506Z" fill="#E5E5E5"/>
+<path d="M97.355 81.123H96.7188V87.0085H97.355V81.123Z" fill="#E5E5E5"/>
+<path d="M116.75 81.123H116.113V87.0085H116.75V81.123Z" fill="#E5E5E5"/>
+<path d="M44.5387 156.201H0V156.837H44.5387V156.201Z" fill="#E5E5E5"/>
+<path d="M12.7261 150.474H12.0898V156.359H12.7261V150.474Z" fill="#E5E5E5"/>
+<path d="M32.1402 150.474H31.5039V156.359H32.1402V150.474Z" fill="#E5E5E5"/>
+<path d="M230.313 136.797C268.088 136.797 298.711 106.174 298.711 68.3987C298.711 30.6232 268.088 0 230.313 0C192.537 0 161.914 30.6232 161.914 68.3987C161.914 106.174 192.537 136.797 230.313 136.797Z" fill="white"/>
+<path d="M20.9705 104.275L20.3516 104.424L35.7741 168.732L36.3929 168.583L20.9705 104.275Z" fill="#2F2E41"/>
+<path d="M90.1822 148.091C90.1822 148.091 103.226 153.499 99.0899 156.68C94.9542 159.862 86.3646 152.863 86.6827 151.908C87.0008 150.954 85.4102 148.727 85.4102 148.727L90.1822 148.091Z" fill="#9F616A"/>
+<path d="M78.7196 105.459L82.8553 109.277L83.8097 120.411L86.9911 132.182C86.9911 132.182 92.3993 143.317 91.4449 145.544C90.4905 147.771 92.3993 148.407 92.3993 148.407L85.0822 151.27C85.0822 151.27 77.1289 142.362 77.1289 140.454C77.1289 138.545 78.7196 105.459 78.7196 105.459Z" fill="#575A88"/>
+<path opacity="0.1" d="M78.7196 105.459L82.8553 109.277L83.8097 120.411L86.9911 132.182C86.9911 132.182 92.3993 143.317 91.4449 145.544C90.4905 147.771 92.3993 148.407 92.3993 148.407L85.0822 151.27C85.0822 151.27 77.1289 142.362 77.1289 140.454C77.1289 138.545 78.7196 105.459 78.7196 105.459Z" fill="black"/>
+<path d="M117.858 219.992C117.858 219.992 116.267 227.309 115.949 227.945C115.631 228.582 121.994 230.809 121.994 230.809L129.629 225.4C129.629 225.4 126.447 218.401 126.447 217.129L117.858 219.992Z" fill="#575A88"/>
+<path d="M76.1747 148.726L78.4017 151.271C78.4017 151.271 124.531 156.997 125.485 165.905C126.44 174.813 133.121 216.806 129.303 218.079C125.485 219.351 115.623 224.123 115.623 221.578C115.623 219.033 109.261 184.038 110.533 177.676C110.533 177.676 55.496 170.677 54.2235 162.723C52.951 154.77 55.496 151.271 55.496 151.271L76.1747 148.726Z" fill="#2F2E41"/>
+<path opacity="0.1" d="M76.1747 148.726L78.4017 151.271C78.4017 151.271 124.531 156.997 125.485 165.905C126.44 174.813 133.121 216.806 129.303 218.079C125.485 219.351 115.623 224.123 115.623 221.578C115.623 219.033 109.261 184.038 110.533 177.676C110.533 177.676 55.496 170.677 54.2235 162.723C52.951 154.77 55.496 151.271 55.496 151.271L76.1747 148.726Z" fill="black"/>
+<path d="M117.224 227.306C117.224 227.306 115.951 224.443 115.315 225.397C114.679 226.352 112.452 237.486 114.679 237.486C116.906 237.486 137.266 242.576 140.129 241.94C142.993 241.304 148.401 242.258 147.765 239.077C147.128 235.896 143.947 235.577 143.947 235.577C143.947 235.577 132.176 228.578 131.54 225.079C130.903 221.58 127.404 223.488 127.404 223.488V225.715C127.404 225.715 120.723 230.805 117.224 227.306Z" fill="#2F2E41"/>
+<path d="M56.7686 81.2837C56.7686 81.2837 58.9955 92.1002 54.2235 93.0546C49.4515 94.009 60.268 100.372 60.268 100.372L67.267 104.189L72.3571 99.0992C72.3571 99.0992 67.7442 89.7142 71.2437 82.7153C74.7431 75.7163 56.7686 81.2837 56.7686 81.2837Z" fill="#9F616A"/>
+<path d="M72.3571 99.0992L67.267 104.189L60.268 100.372C60.268 100.372 49.4515 94.009 54.2235 93.0546C57.2935 92.4406 57.4653 87.745 57.2012 84.4746C57.1151 83.4039 56.9706 82.3387 56.7686 81.2837C56.7686 81.2837 74.7431 75.7163 71.2437 82.7153C70.7119 83.7961 70.3432 84.9496 70.1493 86.1384C69.0771 92.4279 72.3571 99.0992 72.3571 99.0992Z" fill="#9F616A"/>
+<path d="M90.1758 229.217V236.534H102.265L103.219 233.67L101.947 226.035L90.1758 229.217Z" fill="#575A88"/>
+<path d="M40.2344 155.092C40.2344 155.092 40.2344 173.862 47.8696 174.498C55.5048 175.134 82.8643 178.634 82.8643 178.634C82.8643 178.634 84.4549 209.811 87.3181 219.991C90.1813 230.171 87.6363 230.808 90.1813 231.444C92.7264 232.08 103.543 229.853 103.225 227.626C102.907 225.399 101.634 169.09 101.634 169.09C101.634 169.09 104.497 157.001 66.3213 151.274L40.2344 155.092Z" fill="#2F2E41"/>
+<path d="M91.1248 234.304C91.1248 234.304 89.216 230.168 88.8978 231.441C88.5797 232.713 84.7621 243.848 88.5797 244.802C92.3973 245.757 104.486 250.847 112.44 250.529C120.393 250.21 121.348 249.892 121.348 249.892C121.348 249.892 123.574 246.711 120.711 244.802C117.848 242.893 106.077 231.759 105.441 230.486C104.805 229.214 100.033 228.259 100.033 230.486C100.033 232.713 93.3517 237.167 91.1248 234.304Z" fill="#2F2E41"/>
+<path opacity="0.1" d="M71.2524 82.7153C70.7207 83.7961 70.3519 84.9496 70.1581 86.1384C68.5737 87.096 67.5143 86.851 65.526 86.851C62.5769 86.851 61.3871 83.0811 59.4815 81.1246C59.332 79.3081 56.7773 81.2837 56.7773 81.2837C56.7773 81.2837 74.7519 75.7163 71.2524 82.7153Z" fill="black"/>
+<path d="M64.7171 86.6951C70.5153 86.6951 75.2155 81.9948 75.2155 76.1967C75.2155 70.3985 70.5153 65.6982 64.7171 65.6982C58.919 65.6982 54.2188 70.3985 54.2188 76.1967C54.2188 81.9948 58.919 86.6951 64.7171 86.6951Z" fill="#9F616A"/>
+<path d="M82.8574 109.278C82.8574 109.278 81.2668 120.731 80.3124 124.866C79.358 129.002 78.0854 148.09 77.4492 150.635C76.8129 153.18 72.9953 153.816 65.3601 152.862C64.8808 152.802 64.3987 152.766 63.9158 152.754C59.2138 152.604 53.8341 154.364 48.8553 155.744C45.9921 156.54 43.2594 157.208 40.8638 157.316C37.2371 157.481 36.1745 153.46 36.2986 149.108C36.4163 145.058 37.5648 140.716 38.6369 139.182C40.568 136.421 38.6687 111.629 39.3813 103.453V103.45C39.4895 102.202 39.6581 101.344 39.9094 101.006C41.8182 98.4612 54.2254 92.0985 55.6157 92.3562C57.0027 92.6139 68.8596 100.052 68.8596 100.052C71.7228 100.052 71.6305 96.9469 71.6305 96.9469C71.6305 96.9469 73.6316 100.688 77.4492 101.643C81.2668 102.597 82.8574 109.278 82.8574 109.278Z" fill="#575A88"/>
+<path d="M61.5862 150.522C61.5862 150.522 82.0791 151.175 78.4891 153.61C74.8992 156.044 58.9925 158.271 58.6744 155.09C58.3563 151.909 61.5862 150.522 61.5862 150.522Z" fill="#9F616A"/>
+<path opacity="0.1" d="M63.9258 152.758C63.9926 153.98 60.7063 156.731 59.6437 158.593C59.0552 159.623 54.4995 158.265 48.8653 155.748C44.5418 153.808 40.3476 151.591 36.3086 149.112C36.4263 145.062 37.5748 140.72 38.6469 139.186C40.578 136.425 38.6787 111.633 39.3913 103.457V103.454C39.5612 103.367 39.7378 103.295 39.9194 103.237H43.737C56.7805 109.282 41.8282 135.369 41.8282 135.369C41.8282 135.369 61.5525 151.594 63.4613 152.23C63.5865 152.254 63.7002 152.318 63.7843 152.414C63.8685 152.51 63.9182 152.631 63.9258 152.758V152.758Z" fill="black"/>
+<path d="M43.7174 101.323H39.8998C39.8998 101.323 36.4004 102.278 33.5372 108.64C30.6739 115.003 20.1755 134.727 29.4014 142.363C38.6273 149.998 58.3516 158.905 59.6241 156.679C60.8966 154.452 65.3505 150.952 63.4417 150.316C61.5329 149.68 41.8086 133.455 41.8086 133.455C41.8086 133.455 56.7609 107.368 43.7174 101.323Z" fill="#575A88"/>
+<path d="M63.0985 71.3068C63.0985 71.3068 63.5592 64.929 69.2429 67.5295C74.9266 70.13 74.5557 62.9622 72.8381 61.6955C71.1206 60.4289 71.1749 60.1154 64.8931 60.9629C58.6112 61.8104 46.4153 63.2462 50.3588 75.8772C54.3023 88.5081 57.8737 85.2588 57.8737 85.2588C57.8737 85.2588 54.7392 73.8926 57.9152 76.058L61.0913 78.2235L62.7673 77.8685L63.0985 71.3068Z" fill="#2F2E41"/>
+<path d="M110.386 232.666L90.0963 177.504L36.4882 173.72L22.5527 232.63L21.9336 232.483L35.9938 173.047L36.2633 173.066L90.5512 176.898L90.6225 177.091L110.983 232.447L110.386 232.666Z" fill="#2F2E41"/>
+<path opacity="0.4" d="M189.843 186.762C195.334 186.762 199.784 182.311 199.784 176.821C199.784 171.331 195.334 166.88 189.843 166.88C184.353 166.88 179.902 171.331 179.902 176.821C179.902 182.311 184.353 186.762 189.843 186.762Z" fill="#6C63FF"/>
+<path opacity="0.4" d="M171.427 188.537C175.278 188.537 178.4 185.415 178.4 181.563C178.4 177.712 175.278 174.59 171.427 174.59C167.575 174.59 164.453 177.712 164.453 181.563C164.453 185.415 167.575 188.537 171.427 188.537Z" fill="#6C63FF"/>
+<path opacity="0.4" d="M17.7743 90.2361C21.6257 90.2361 24.7479 87.114 24.7479 83.2626C24.7479 79.4112 21.6257 76.2891 17.7743 76.2891C13.9229 76.2891 10.8008 79.4112 10.8008 83.2626C10.8008 87.114 13.9229 90.2361 17.7743 90.2361Z" fill="#6C63FF"/>
+<path d="M150.968 235.14L150.332 235.128C150.578 228.053 151.333 221.006 152.591 214.04C155.342 199.125 159.917 189.33 166.189 184.927L166.554 185.447C151.903 195.734 150.976 234.747 150.968 235.14Z" fill="#2F2E41"/>
+<path d="M158.937 234.985L158.301 234.972C158.314 234.268 158.712 217.661 165.25 213.071L165.615 213.592C159.341 217.997 158.94 234.815 158.937 234.985Z" fill="#2F2E41"/>
+<path d="M170.174 185.503C171.931 185.503 173.355 184.079 173.355 182.322C173.355 180.565 171.931 179.141 170.174 179.141C168.417 179.141 166.992 180.565 166.992 182.322C166.992 184.079 168.417 185.503 170.174 185.503Z" fill="#6C63FF"/>
+<path d="M168.611 212.862C170.368 212.862 171.792 211.437 171.792 209.68C171.792 207.923 170.368 206.499 168.611 206.499C166.854 206.499 165.43 207.923 165.43 209.68C165.43 211.437 166.854 212.862 168.611 212.862Z" fill="#6C63FF"/>
+<path d="M157.465 187.41C158.063 191.229 156.504 194.645 156.504 194.645C156.504 194.645 153.977 191.869 153.379 188.05C152.781 184.231 154.339 180.815 154.339 180.815C154.339 180.815 156.867 183.591 157.465 187.41Z" fill="#2F2E41"/>
+<path d="M167.838 196.684C164.182 197.938 160.547 196.999 160.547 196.999C160.547 196.999 162.84 194.026 166.496 192.772C170.153 191.518 173.787 192.457 173.787 192.457C173.787 192.457 171.494 195.43 167.838 196.684Z" fill="#2F2E41"/>
+<path d="M167.962 220.916C166.307 221.436 164.545 221.512 162.852 221.137C163.927 219.768 165.375 218.739 167.022 218.174C168.668 217.609 170.443 217.532 172.132 217.953C171.026 219.289 169.588 220.31 167.962 220.916V220.916Z" fill="#2F2E41"/>
+<path d="M54.624 62.2314L56.9767 61.7967L59.3462 74.6232L55.5921 75.3167L53.4815 63.8916C53.4129 63.5199 53.4947 63.1362 53.7089 62.8249C53.9232 62.5135 54.2524 62.3 54.624 62.2314V62.2314Z" fill="#6C63FF"/>
+<path d="M57.8775 82.0782C60.513 82.0782 62.6495 79.9417 62.6495 77.3062C62.6495 74.6707 60.513 72.5342 57.8775 72.5342C55.242 72.5342 53.1055 74.6707 53.1055 77.3062C53.1055 79.9417 55.242 82.0782 57.8775 82.0782Z" fill="#6C63FF"/>
+<path d="M57.8827 80.1698C59.4641 80.1698 60.746 78.8879 60.746 77.3066C60.746 75.7253 59.4641 74.4434 57.8827 74.4434C56.3014 74.4434 55.0195 75.7253 55.0195 77.3066C55.0195 78.8879 56.3014 80.1698 57.8827 80.1698Z" fill="#F2F2F2"/>
+<path d="M57.888 78.2613C58.4151 78.2613 58.8424 77.834 58.8424 77.3069C58.8424 76.7798 58.4151 76.3525 57.888 76.3525C57.3609 76.3525 56.9336 76.7798 56.9336 77.3069C56.9336 77.834 57.3609 78.2613 57.888 78.2613Z" fill="#6C63FF"/>
+<path d="M237.154 42.9346V71.5666H195.533L187.844 80.7925L188.722 71.5666H184.98V42.9346H237.154Z" fill="#4E064F"/>
+<path opacity="0.1" d="M237.149 52.7979H218.379V71.5677H237.149V52.7979Z" fill="black"/>
+<path d="M222.52 56.9336H274.693V85.5656H270.952L271.83 94.7915L264.142 85.5656H222.52V56.9336Z" fill="#4E064F"/>
+<path opacity="0.1" d="M188.152 85.4086C194.477 85.4086 199.605 84.9083 199.605 84.2912C199.605 83.6741 194.477 83.1738 188.152 83.1738C181.827 83.1738 176.699 83.6741 176.699 84.2912C176.699 84.9083 181.827 85.4086 188.152 85.4086Z" fill="black"/>
+<path opacity="0.1" d="M271.833 100.519C279.036 100.519 284.876 99.949 284.876 99.2462C284.876 98.5434 279.036 97.9736 271.833 97.9736C264.629 97.9736 258.789 98.5434 258.789 99.2462C258.789 99.949 264.629 100.519 271.833 100.519Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="300" height="251.007" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/desktop/share/images/mode_new_tab_chat.png b/desktop/share/images/mode_new_tab_chat.png
new file mode 100644
index 00000000..50759d64
--- /dev/null
+++ b/desktop/share/images/mode_new_tab_chat.png
Binary files differ
diff --git a/desktop/share/images/mode_new_tab_receive.png b/desktop/share/images/mode_new_tab_receive.png
new file mode 100644
index 00000000..9db809be
--- /dev/null
+++ b/desktop/share/images/mode_new_tab_receive.png
Binary files differ
diff --git a/desktop/share/images/mode_new_tab_share.png b/desktop/share/images/mode_new_tab_share.png
new file mode 100644
index 00000000..92973175
--- /dev/null
+++ b/desktop/share/images/mode_new_tab_share.png
Binary files differ
diff --git a/desktop/share/images/mode_new_tab_website.png b/desktop/share/images/mode_new_tab_website.png
new file mode 100644
index 00000000..86b45f66
--- /dev/null
+++ b/desktop/share/images/mode_new_tab_website.png
Binary files differ
diff --git a/desktop/share/images/mode_receive.png b/desktop/share/images/mode_receive.png
new file mode 100644
index 00000000..d57aa409
--- /dev/null
+++ b/desktop/share/images/mode_receive.png
Binary files differ
diff --git a/desktop/share/images/mode_receive.svg b/desktop/share/images/mode_receive.svg
new file mode 100644
index 00000000..5a0a29fd
--- /dev/null
+++ b/desktop/share/images/mode_receive.svg
@@ -0,0 +1,74 @@
+<svg width="300" height="229" viewBox="0 0 300 229" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M215.881 135.736L218.241 134.244C218.466 134.099 218.687 133.943 218.914 133.798C213.853 132.906 209.24 130.27 205.84 126.326C202.44 122.382 200.456 117.367 200.217 112.111C200.044 108.496 200.711 104.89 202.164 101.591C203.516 98.5041 205.513 95.7588 208.014 93.5486C210.514 91.3384 213.458 89.7171 216.636 88.799L216.52 98.3153L221.622 87.9574C221.643 87.954 221.664 87.954 221.685 87.9574C224.642 87.816 227.597 88.2726 230.381 89.3012C233.166 90.3299 235.725 91.9103 237.913 93.9524C240.102 95.9945 241.876 98.4582 243.135 101.203C244.394 103.947 245.113 106.919 245.25 109.949C245.269 110.389 245.25 110.822 245.25 111.243C247.026 109.168 248.637 106.945 249.705 104.507C251.866 99.5712 251.917 93.9812 251.737 87.1871C251.395 73.7218 250.83 60.1562 250.091 46.6295C244.763 46.0233 239.821 43.4907 236.153 39.4867C232.484 35.4826 230.33 30.2696 230.076 24.7841C230.045 24.0752 230.054 23.3793 230.076 22.6866C230.076 22.5151 230.076 22.3403 230.101 22.1687C230.146 21.4987 230.206 20.8351 230.307 20.1813C230.307 20.0712 230.345 19.9677 230.364 19.8576C230.456 19.303 230.567 18.7549 230.695 18.2133C230.746 18.0126 230.793 17.8087 230.847 17.608C231.005 17.0189 231.163 16.4395 231.381 15.8666C231.447 15.6756 231.526 15.4911 231.596 15.3034C231.757 14.8826 231.931 14.4683 232.114 14.0572C232.212 13.8403 232.307 13.6267 232.411 13.4098C232.436 13.3548 232.458 13.2998 232.487 13.2448C234.866 8.43106 238.815 4.62354 243.65 2.48404C248.484 0.344543 253.898 0.0083428 258.949 1.53388L258.798 13.918L263.853 3.68962C267.999 6.12119 271.278 9.8473 273.21 14.3237C275.143 18.8001 275.628 23.7923 274.594 28.5712H274.62C274.585 28.7363 274.534 28.8949 274.496 29.0567C274.427 29.361 274.351 29.662 274.269 29.963C274.161 30.3482 274.041 30.7269 273.918 31.1056C273.823 31.3872 273.732 31.6753 273.628 31.9537C273.476 32.3615 273.312 32.7596 273.128 33.1578C273.027 33.3908 272.936 33.6271 272.812 33.8569C272.524 34.4525 272.208 35.0351 271.865 35.6048C271.748 35.8023 271.615 35.99 271.492 36.1875C271.252 36.5694 271.008 36.9481 270.746 37.3171C270.585 37.5437 270.411 37.7606 270.241 37.9839C269.994 38.3076 269.742 38.6313 269.479 38.9258C269.293 39.1427 269.103 39.3563 268.907 39.5732C268.633 39.871 268.348 40.1591 268.054 40.4439C267.862 40.6349 267.666 40.8258 267.464 41.0071C267.132 41.3081 266.784 41.5962 266.434 41.8778C266.257 42.0202 266.086 42.1691 265.903 42.3051C265.37 42.7108 264.819 43.0916 264.251 43.4477C264.143 43.5124 264.029 43.5674 263.935 43.6322C263.461 43.9203 262.987 44.1889 262.478 44.4414C262.267 44.5482 262.045 44.6421 261.827 44.7424C261.42 44.9302 261.009 45.1114 260.589 45.2765C260.346 45.3704 260.096 45.4578 259.847 45.5452C259.433 45.6908 259.012 45.8235 258.583 45.9433C258.33 46.0145 258.08 46.0857 257.825 46.1472C257.363 46.2605 256.893 46.3544 256.419 46.4353C256.387 46.4353 256.359 46.4353 256.327 46.4547C256.639 52.1602 256.916 57.8689 257.158 63.5808C258.502 60.7545 260.395 58.2393 262.722 56.1894C265.048 54.1396 267.759 52.5983 270.688 51.6603C273.616 50.7222 276.701 50.4071 279.753 50.7342C282.805 51.0614 285.76 52.0239 288.435 53.5628L284.451 64.7461L292.647 56.6831C297.034 60.8028 299.647 66.5369 299.913 72.6278C300.017 74.7649 299.825 76.9065 299.341 78.9882C298.312 83.493 295.985 87.5769 292.662 90.71C289.339 93.8431 285.174 95.8808 280.707 96.5588C276.239 97.2367 271.677 96.5236 267.61 94.512C263.543 92.5003 260.16 89.283 257.9 85.2773C257.9 85.8567 257.941 86.4394 257.957 87.0187C258.106 93.0134 258.292 100.471 255.376 107.132C253.402 111.648 250.22 115.315 247.077 118.601C245.032 120.74 242.913 122.808 240.739 124.812C238.602 127.752 235.812 130.129 232.601 131.745C229.03 134.564 225.334 137.203 221.511 139.663L219.189 141.197C217.044 142.56 214.845 143.958 212.687 145.405C213.066 145.366 213.442 145.324 213.828 145.308C218.604 145.078 223.328 146.411 227.317 149.112C231.306 151.814 234.353 155.744 236.019 160.336L221.935 172.083L237.415 168.403C237.411 172.307 236.441 176.147 234.595 179.564C232.75 182.98 230.089 185.862 226.861 187.939C223.634 190.016 219.945 191.221 216.14 191.441C212.335 191.662 208.537 190.89 205.102 189.199C205.449 189.646 205.8 190.089 206.147 190.533C206.839 191.416 207.528 192.294 208.201 193.164C217.363 205.053 219.916 216.343 215.376 224.95L209.86 221.895C214.283 213.518 207.648 202.797 203.279 197.146C202.619 196.291 201.942 195.43 201.26 194.556C195.406 187.111 188.771 178.657 188.939 168.296C189.176 152.694 203.99 143.285 215.881 135.736Z" fill="#F3F3F3"/>
+<path d="M143.907 228.38C223.385 228.38 287.814 225.337 287.814 221.583C287.814 217.829 223.385 214.786 143.907 214.786C64.4295 214.786 0 217.829 0 221.583C0 225.337 64.4295 228.38 143.907 228.38Z" fill="#E5E5E5"/>
+<path d="M260.166 219.049C261.114 217.265 260.04 215.08 258.814 213.488C257.588 211.895 256.094 210.251 256.125 208.215C256.17 205.302 259.187 203.583 261.601 202.039C263.388 200.892 265.037 199.533 266.513 197.99C267.133 197.396 267.645 196.695 268.027 195.918C268.523 194.779 268.51 193.484 268.478 192.235C268.373 188.079 268.173 183.927 267.878 179.779" stroke="#3F3D56" stroke-width="0.998733" stroke-miterlimit="10"/>
+<path d="M272.463 179.559C272.428 178.798 272.207 178.059 271.821 177.409C271.434 176.759 270.895 176.218 270.252 175.837L269.26 177.85L269.288 175.416C268.61 175.207 267.892 175.169 267.196 175.304C266.5 175.439 265.846 175.743 265.289 176.191C264.732 176.639 264.287 177.218 263.994 177.878C263.7 178.538 263.566 179.261 263.601 179.986C263.657 181.188 264.176 182.318 265.044 183.128C265.474 183.529 265.977 183.839 266.524 184.041C267.072 184.243 267.652 184.332 268.233 184.304C268.814 184.276 269.384 184.131 269.91 183.877C270.436 183.624 270.908 183.266 271.299 182.826C271.691 182.385 271.994 181.87 272.191 181.309C272.388 180.749 272.475 180.154 272.447 179.559H272.463Z" fill="#57B793"/>
+<path d="M264.555 210.309C264.091 211.233 263.33 211.965 262.402 212.383C261.473 212.802 260.432 212.88 259.454 212.605C258.476 212.331 257.619 211.72 257.028 210.876C256.437 210.031 256.147 209.004 256.207 207.967C256.267 206.929 256.673 205.944 257.358 205.177C258.042 204.41 258.963 203.907 259.966 203.753C260.969 203.599 261.994 203.803 262.868 204.331C263.742 204.858 264.412 205.677 264.767 206.651L261.999 208.959L265.045 208.234C265.045 208.956 264.877 209.667 264.555 210.309V210.309Z" fill="#57B793"/>
+<path d="M262.364 201.475C261.782 201.504 261.2 201.415 260.652 201.213C260.104 201.01 259.601 200.699 259.17 200.297C258.74 199.895 258.392 199.41 258.145 198.87C257.898 198.329 257.758 197.744 257.732 197.148C257.697 196.437 257.828 195.728 258.114 195.079C258.38 194.472 258.772 193.932 259.263 193.497C259.755 193.062 260.333 192.742 260.958 192.561L260.936 194.435L261.94 192.396C263.116 192.34 264.264 192.764 265.134 193.576C266.004 194.387 266.523 195.52 266.578 196.724C266.633 197.928 266.219 199.105 265.427 199.996C264.635 200.887 263.529 201.419 262.354 201.475H262.364Z" fill="#57B793"/>
+<path d="M273.129 194.125C271.956 194.181 270.809 193.758 269.94 192.949C269.071 192.139 268.552 191.009 268.497 189.807C268.442 188.605 268.855 187.43 269.645 186.54C270.436 185.65 271.539 185.118 272.712 185.062C273.541 185.02 274.365 185.22 275.087 185.638L274.304 187.839L275.915 186.253C276.78 187.062 277.296 188.19 277.349 189.389C277.37 189.809 277.331 190.23 277.236 190.639C277.015 191.598 276.494 192.458 275.753 193.087C275.012 193.716 274.09 194.081 273.129 194.125V194.125Z" fill="#57B793"/>
+<path opacity="0.1" d="M271.867 180.757C270.844 180.873 269.849 181.2 268.822 181.265C267.795 181.33 266.667 181.077 266.016 180.258C265.666 179.818 265.492 179.261 265.195 178.782C264.915 178.335 264.532 177.965 264.08 177.705C263.812 178.278 263.665 178.902 263.648 179.537C263.631 180.171 263.745 180.803 263.981 181.39C264.218 181.977 264.572 182.507 265.022 182.944C265.471 183.382 266.005 183.718 266.589 183.93C267.173 184.143 267.795 184.227 268.413 184.178C269.031 184.129 269.632 183.947 270.177 183.644C270.722 183.342 271.199 182.925 271.577 182.422C271.954 181.918 272.225 181.339 272.37 180.721C272.199 180.728 272.032 180.741 271.867 180.757Z" fill="black"/>
+<path opacity="0.1" d="M273.13 194.125C272.365 194.164 271.603 194 270.919 193.648C270.235 193.295 269.652 192.767 269.227 192.115C268.802 191.462 268.549 190.708 268.494 189.925C268.439 189.143 268.583 188.359 268.912 187.651C269.264 187.894 269.566 188.205 269.803 188.567C270.119 189.056 270.308 189.619 270.681 190.069C271.37 190.901 272.551 191.173 273.622 191.121C274.693 191.069 275.723 190.761 276.782 190.661C276.927 190.661 277.079 190.635 277.227 190.632C277.008 191.591 276.489 192.451 275.75 193.082C275.01 193.712 274.09 194.078 273.13 194.125Z" fill="black"/>
+<path opacity="0.1" d="M262.364 201.476C261.782 201.504 261.2 201.415 260.652 201.213C260.104 201.011 259.601 200.7 259.17 200.297C258.74 199.895 258.392 199.41 258.145 198.87C257.898 198.329 257.758 197.744 257.732 197.148C257.697 196.437 257.828 195.728 258.114 195.08C258.482 195.326 258.803 195.638 259.062 196.002C259.407 196.501 259.621 197.073 260.01 197.533C260.759 198.388 262.016 198.689 263.15 198.66C264.285 198.63 265.305 198.359 266.398 198.274C266.128 199.168 265.596 199.955 264.874 200.528C264.153 201.101 263.276 201.432 262.364 201.476Z" fill="black"/>
+<path opacity="0.1" d="M264.554 210.309C264.316 210.853 263.975 211.344 263.551 211.753C263.128 212.161 262.63 212.481 262.086 212.693C261.542 212.904 260.962 213.004 260.38 212.987C259.799 212.969 259.226 212.834 258.695 212.59C258.164 212.345 257.686 211.996 257.287 211.562C256.887 211.128 256.576 210.618 256.369 210.061C256.162 209.503 256.065 208.909 256.082 208.313C256.099 207.717 256.231 207.131 256.469 206.587C256.833 206.835 257.161 207.134 257.443 207.477C257.863 208.005 258.141 208.6 258.63 209.095C259.537 210.005 261 210.39 262.302 210.416C263.054 210.426 263.806 210.391 264.554 210.309V210.309Z" fill="black"/>
+<path d="M253.482 216.993C253.482 216.993 256.98 216.883 258.035 216.113C259.09 215.342 263.406 214.423 263.681 215.66C263.956 216.896 268.941 221.81 264.989 221.829C261.036 221.848 255.808 221.182 254.756 220.534C253.704 219.887 253.482 216.993 253.482 216.993Z" fill="#656380"/>
+<path opacity="0.2" d="M265.058 221.398C261.109 221.431 255.877 220.751 254.825 220.104C254.026 219.605 253.704 217.809 253.599 216.98H253.482C253.482 216.98 253.704 219.87 254.746 220.541C255.789 221.211 261.027 221.861 264.979 221.835C266.12 221.835 266.515 221.408 266.493 220.793C266.344 221.159 265.908 221.392 265.058 221.398Z" fill="black"/>
+<path d="M61.4202 209.063C59.1265 204.712 61.7361 199.385 64.7185 195.507C67.7009 191.629 71.3531 187.596 71.2741 182.653C71.1604 175.552 63.8055 171.36 57.9291 167.596C53.5686 164.802 49.5462 161.489 45.9458 157.727C44.502 156.215 43.1024 154.603 42.2621 152.674C41.0489 149.897 41.0805 146.741 41.1595 143.698C41.4122 133.556 41.9008 123.433 42.6254 113.33" stroke="#3F3D56" stroke-width="0.998733" stroke-miterlimit="10"/>
+<path d="M31.4494 112.777C31.5359 110.924 32.0754 109.123 33.0182 107.54C33.9611 105.956 35.2771 104.64 36.8455 103.714L39.2656 108.618L39.1929 102.681C41.3915 102.017 43.739 102.087 45.8966 102.879C48.0542 103.671 49.9102 105.146 51.1966 107.089C52.483 109.033 53.1332 111.345 53.0534 113.692C52.9735 116.039 52.1678 118.299 50.7524 120.146C49.3371 121.993 47.3854 123.331 45.1792 123.968C42.973 124.604 40.6264 124.506 38.4783 123.687C36.3302 122.868 34.4917 121.371 33.2283 119.412C31.9649 117.452 31.3419 115.132 31.4494 112.787V112.777Z" fill="#57B793"/>
+<path d="M50.7274 187.729C51.8143 189.899 53.5702 191.64 55.7225 192.683C57.8748 193.725 60.3028 194.01 62.6295 193.494C64.9561 192.977 67.0511 191.688 68.5889 189.826C70.1267 187.964 71.0212 185.633 71.1335 183.197C71.209 181.665 70.969 180.135 70.429 178.704C69.6397 176.606 68.2459 174.804 66.4328 173.537C64.6198 172.271 62.4733 171.599 60.2788 171.612C58.0843 171.625 55.9456 172.322 54.1469 173.61C52.3483 174.898 50.9749 176.717 50.2093 178.824L56.9608 184.45L49.5332 182.679C49.5301 184.436 49.9397 186.168 50.7274 187.729Z" fill="#57B793"/>
+<path d="M56.0637 166.229C58.7142 166.354 61.3168 165.475 63.3758 163.76C65.4349 162.046 66.8068 159.616 67.2302 156.932C67.6536 154.249 67.099 151.499 65.672 149.207C64.245 146.916 62.0453 145.241 59.4916 144.504L59.5484 149.064L57.1157 144.102H57.0873C54.2229 143.965 51.4228 145 49.3029 146.978C47.1829 148.957 45.9169 151.717 45.7832 154.651C45.6496 157.586 46.6593 160.455 48.5902 162.627C50.5211 164.799 53.2151 166.096 56.0795 166.233L56.0637 166.229Z" fill="#57B793"/>
+<path d="M29.8236 148.34C31.4972 148.423 33.1668 148.107 34.7006 147.417C36.2345 146.726 37.5906 145.679 38.662 144.359C39.7334 143.039 40.4907 141.482 40.8741 139.811C41.2575 138.14 41.2565 136.401 40.8713 134.73C40.486 133.059 39.7271 131.503 38.6542 130.185C37.5814 128.866 36.2241 127.821 34.6895 127.132C33.1549 126.443 31.4849 126.128 29.8115 126.214C28.138 126.299 26.5068 126.782 25.0467 127.624L26.9423 132.988L23.0279 129.113C21.9815 130.089 21.1331 131.266 20.5314 132.578C19.9296 133.89 19.5863 135.311 19.5211 136.759C19.4709 137.783 19.5634 138.81 19.7959 139.808C20.3333 142.154 21.6032 144.257 23.413 145.797C25.2228 147.337 27.4736 148.23 29.8236 148.34V148.34Z" fill="#57B793"/>
+<path opacity="0.1" d="M32.9052 115.729C35.4011 116.011 37.8274 116.804 40.3296 116.962C42.8318 117.121 45.5836 116.509 47.1664 114.515C48.0194 113.44 48.4459 112.081 49.1663 110.909C49.8488 109.817 50.7844 108.916 51.8896 108.284C52.5778 109.688 52.9668 111.225 53.0307 112.795C53.0946 114.364 52.832 115.929 52.2603 117.387C51.6886 118.844 50.8208 120.161 49.7147 121.248C48.6085 122.336 47.2892 123.17 45.8443 123.695C44.3995 124.22 42.8621 124.425 41.3342 124.295C39.8063 124.165 38.3229 123.703 36.9824 122.941C35.6419 122.179 34.4749 121.133 33.559 119.874C32.6431 118.614 31.9992 117.169 31.6699 115.635C32.0901 115.654 32.5008 115.684 32.9052 115.729Z" fill="black"/>
+<path opacity="0.1" d="M29.8236 148.34C31.6865 148.428 33.5399 148.021 35.204 147.159C36.8681 146.296 38.2864 145.008 39.3212 143.418C40.356 141.829 40.9721 139.992 41.1099 138.087C41.2476 136.182 40.9022 134.272 40.1073 132.544C39.249 133.135 38.5108 133.892 37.9336 134.771C37.1628 135.962 36.6983 137.338 35.7916 138.432C34.1077 140.458 31.2327 141.122 28.6231 141.002C26.0135 140.882 23.4955 140.118 20.8986 139.875C20.5384 139.843 20.1719 139.817 19.8086 139.807C20.3453 142.152 21.6134 144.253 23.4207 145.793C25.2279 147.333 27.4758 148.227 29.8236 148.34V148.34Z" fill="black"/>
+<path opacity="0.1" d="M56.065 166.23C57.9097 166.319 59.7458 165.922 61.3982 165.077C63.0505 164.232 64.4641 162.968 65.5039 161.404C66.5437 159.84 67.1752 158.03 67.338 156.145C67.5008 154.261 67.1895 152.365 66.4339 150.638C65.5437 151.244 64.7695 152.012 64.1497 152.904C63.3093 154.118 62.7849 155.516 61.8023 156.636C59.9794 158.717 56.9148 159.452 54.1504 159.384C51.4745 159.326 48.8965 158.653 46.2363 158.442C46.8949 160.618 48.1918 162.533 49.9505 163.926C51.7091 165.32 53.8442 166.124 56.065 166.23V166.23Z" fill="black"/>
+<path opacity="0.1" d="M50.7285 187.729C51.8154 189.899 53.5713 191.641 55.7236 192.683C57.8759 193.726 60.3039 194.011 62.6306 193.494C64.9572 192.977 67.0522 191.688 68.59 189.826C70.1278 187.964 71.0223 185.634 71.1346 183.197C71.2101 181.666 70.97 180.135 70.4301 178.705C69.5407 179.303 68.7422 180.033 68.0606 180.87C67.0338 182.165 66.3546 183.608 65.1666 184.806C62.9551 187.026 59.3882 187.946 56.2131 188.043C54.3805 188.049 52.5491 187.944 50.7285 187.729V187.729Z" fill="black"/>
+<path d="M136.237 215.53L94.5335 224.269L93.5857 224.172L56.9375 220.385V172.804L101.8 165.035L134.341 168.919L134.35 169.13L134.354 169.233L136.237 215.53Z" fill="#4E0D4E"/>
+<path opacity="0.05" d="M134.354 169.233L134.341 169.243L93.5857 175.393L56.9375 172.804L101.8 165.035L134.341 168.919L134.35 169.13L134.354 169.233Z" fill="black"/>
+<path opacity="0.5" d="M136.237 215.53L94.5337 224.27L93.5859 224.173V175.394L134.351 169.13L136.237 215.53Z" fill="#3A0A3A"/>
+<path d="M182.045 217.472L140.342 226.212L139.394 226.115L102.746 222.327V174.746L147.609 166.978L180.15 170.862L180.159 171.072L180.162 171.176L182.045 217.472Z" fill="#3F3D56"/>
+<path opacity="0.1" d="M182.045 217.472L140.342 226.212L139.395 226.115V177.336L180.159 171.072L182.045 217.472Z" fill="#EFEFEF"/>
+<path opacity="0.05" d="M180.162 171.176L180.15 171.185L139.394 177.335L102.746 174.746L147.608 166.978L180.15 170.862L180.159 171.072L180.162 171.176Z" fill="black"/>
+<path d="M153.297 170.862L111.594 179.601L110.646 179.504L73.998 175.717V128.136L118.86 120.367L151.402 124.251L151.411 124.462L151.414 124.565L153.297 170.862Z" fill="#3F3D56"/>
+<path opacity="0.1" d="M153.295 170.861L111.592 179.601L110.645 179.504V130.725L151.409 124.461L153.295 170.861Z" fill="black"/>
+<path opacity="0.05" d="M151.414 124.565L151.401 124.575L110.646 130.725L73.998 128.136L118.86 120.367L151.401 124.251L151.411 124.462L151.414 124.565Z" fill="black"/>
+<path d="M176.991 172.855L155.226 177.419L154.73 177.367L135.604 175.39V150.557L159.017 146.501L176.002 148.53L176.008 148.641V148.692L176.991 172.855Z" fill="#3F3D56"/>
+<path opacity="0.1" d="M176.991 172.856L155.226 177.42L154.73 177.368V151.91L176.008 148.641L176.991 172.856Z" fill="black"/>
+<path opacity="0.05" d="M176.008 148.692L176.002 148.699L154.73 151.91L135.604 150.557L159.017 146.501L176.002 148.53L176.008 148.641V148.692Z" fill="black"/>
+<path d="M118.545 124.626L96.7808 129.187L96.2848 129.138L77.1582 127.161V102.328L100.572 98.272L117.556 100.301L117.563 100.412V100.463L118.545 124.626Z" fill="#3F3D56"/>
+<path opacity="0.1" d="M118.544 124.627L96.7792 129.188L96.2832 129.139V103.681L117.561 100.412L118.544 124.627Z" fill="black"/>
+<path opacity="0.05" d="M117.563 100.463L117.556 100.47L96.2848 103.681L77.1582 102.328L100.572 98.272L117.556 100.301L117.563 100.412V100.463Z" fill="black"/>
+<path d="M156.77 123.656L135.005 128.216L134.509 128.168L115.383 126.19V101.357L138.797 97.3013L155.781 99.3308L155.787 99.4408V99.4926L156.77 123.656Z" fill="#4E0D4E"/>
+<path opacity="0.1" d="M156.772 123.655L135.008 128.216L134.512 128.167V102.71L155.79 99.4404L156.772 123.655Z" fill="black"/>
+<path opacity="0.05" d="M155.787 99.4926L155.781 99.4991L134.509 102.71L115.383 101.357L138.797 97.3013L155.781 99.3308L155.787 99.4408V99.4926Z" fill="black"/>
+<path d="M168.145 98.7318L146.38 103.292L145.884 103.244L126.758 101.266V76.4332L150.172 72.3774L167.156 74.4069L167.162 74.517V74.5688L168.145 98.7318Z" fill="#3F3D56"/>
+<path opacity="0.1" d="M168.145 98.7323L146.381 103.293L145.885 103.244V77.7868L167.163 74.5176L168.145 98.7323Z" fill="black"/>
+<path opacity="0.05" d="M167.162 74.5688L167.156 74.5753L145.884 77.7862L126.758 76.4332L150.172 72.3774L167.156 74.4069L167.162 74.517V74.5688Z" fill="black"/>
+<path d="M182.967 47.9656C182.737 50.0696 181.17 51.7657 180.588 53.7919C179.717 56.8507 181.22 60.1361 183.293 62.5314C184.963 64.4346 186.985 65.9793 189.243 67.0761C191.5 68.1729 193.947 68.7999 196.442 68.9209C197.175 68.9855 197.913 68.9031 198.616 68.6781C199.241 68.4174 199.804 68.0222 200.268 67.5194C201.822 65.9171 202.66 63.6999 202.991 61.4632C203.323 59.2266 203.197 56.9511 203.067 54.695C203.067 54.2281 202.983 53.7652 202.821 53.3291C202.609 52.9143 202.318 52.5477 201.964 52.2512C200.844 51.1962 199.609 50.2763 198.284 49.5096C197.715 49.1859 197.105 48.8622 196.742 48.3023C196.493 47.8563 196.331 47.3649 196.265 46.8554L195.858 44.732C195.785 44.1198 195.581 43.5316 195.26 43.01C194.543 42.0196 193.169 41.8836 191.965 41.8351L187.542 41.657C186.168 41.602 184.361 41.1974 183.018 41.4758C181.754 41.7315 182.181 42.9162 182.408 43.9908C182.737 45.2905 182.925 46.6236 182.967 47.9656V47.9656Z" fill="#FFC0C6"/>
+<path opacity="0.1" d="M182.967 47.9656C182.737 50.0696 181.17 51.7657 180.588 53.7919C179.717 56.8507 181.22 60.1361 183.293 62.5314C184.963 64.4346 186.985 65.9793 189.243 67.0761C191.5 68.1729 193.947 68.7999 196.442 68.9209C197.175 68.9855 197.913 68.9031 198.616 68.6781C199.241 68.4174 199.804 68.0222 200.268 67.5194C201.822 65.9171 202.66 63.6999 202.991 61.4632C203.323 59.2266 203.197 56.9511 203.067 54.695C203.067 54.2281 202.983 53.7652 202.821 53.3291C202.609 52.9143 202.318 52.5477 201.964 52.2512C200.844 51.1962 199.609 50.2763 198.284 49.5096C197.715 49.1859 197.105 48.8622 196.742 48.3023C196.493 47.8563 196.331 47.3649 196.265 46.8554L195.858 44.732C195.785 44.1198 195.581 43.5316 195.26 43.01C194.543 42.0196 193.169 41.8836 191.965 41.8351L187.542 41.657C186.168 41.602 184.361 41.1974 183.018 41.4758C181.754 41.7315 182.181 42.9162 182.408 43.9908C182.737 45.2905 182.925 46.6236 182.967 47.9656V47.9656Z" fill="black"/>
+<path d="M211.06 142.727L209.183 163.805C208.693 169.334 208.194 174.885 207.234 180.342C206.918 182.223 206.513 184.094 206.052 185.949C204.769 191.098 202.908 196.132 202.308 201.411C202.289 201.563 202.273 201.735 202.258 201.874C202.134 203.039 202.027 204.217 201.626 205.305C201.31 206.111 200.864 206.846 200.539 207.642C199.907 209.234 199.806 210.995 199.727 212.721C197.45 211.403 194.956 210.526 192.369 210.131C191.105 209.94 189.731 209.807 188.894 208.836C187.946 207.781 188.057 206.166 188.214 204.748C188.712 200.346 189.207 195.946 189.699 191.548C189.864 189.656 190.181 187.781 190.647 185.942C190.818 185.33 191.023 184.728 191.232 184.126C191.519 183.298 191.81 182.469 192.028 181.618C192.33 180.25 192.539 178.862 192.653 177.465C193.162 173.037 193.775 168.619 194.312 164.194L194.34 163.961C195.146 157.254 195.759 150.515 195.582 143.76C195.557 142.76 195.516 141.759 195.452 140.756C195.364 139.303 195.234 138.532 196.4 137.623C197.699 136.619 199.408 135.917 200.893 135.26C201.692 134.904 210.494 131.699 210.687 132.405C211.095 133.904 211.308 135.451 211.319 137.008C211.336 138.918 211.25 140.827 211.06 142.727V142.727Z" fill="#605D82"/>
+<path opacity="0.1" d="M207.231 180.342C206.915 182.223 206.51 184.094 206.049 185.948C204.767 191.098 202.906 196.131 202.305 201.411C202.286 201.563 202.271 201.734 202.255 201.874C198.331 196.131 195.026 189.956 191.197 184.152C191.485 183.323 191.775 182.495 191.993 181.643C192.308 180.268 192.527 178.872 192.651 177.465C193.159 173.037 193.772 168.618 194.309 164.194L194.338 163.96C194.559 164.899 194.877 165.812 195.285 166.683C197.857 172.036 203.967 174.742 206.956 179.866C207.055 180.026 207.147 180.185 207.231 180.342Z" fill="black"/>
+<path d="M175.394 133.272C175.524 137.564 176.194 141.821 176.864 146.061L178.244 154.801C178.999 159.591 179.789 164.475 182.001 168.764C183.656 171.975 186.038 174.714 188.196 177.591C193.497 184.667 197.481 192.684 202.508 199.967C203.971 202.084 206.059 204.376 208.552 203.932C210.188 203.644 211.376 202.246 212.659 201.171C214.175 199.903 216.001 198.974 217.195 197.381C218.39 195.789 218.624 193.147 217.006 192.014C216.453 191.629 215.78 191.484 215.155 191.238C212.649 190.267 211.025 187.755 209.995 185.217C208.965 182.679 208.337 179.957 206.962 177.598C203.974 172.474 197.86 169.768 195.289 164.411C193.848 161.413 193.709 157.937 193.602 154.613L193.32 146.097C193.289 145.164 193.267 144.197 193.636 143.345C194.619 141.08 197.589 140.866 199.996 140.578C202.726 140.251 205.371 139.397 207.79 138.06C209.177 137.292 210.529 136.315 211.265 134.891C211.942 133.596 212.033 132.071 212.112 130.602L212.946 115.165C213.019 113.838 213.082 112.463 212.63 111.22C211.483 108.093 207.629 107.07 204.372 107.219C198.312 107.497 192.72 110.168 186.996 111.974C185.577 112.421 184.152 112.822 182.689 113.123C181.426 113.385 179.846 113.278 178.633 113.699C176.459 114.45 176.513 119.325 176.206 121.345C175.574 125.286 175.302 129.279 175.394 133.272V133.272Z" fill="#605D82"/>
+<path d="M207.728 204.586C208.262 205.14 208.436 205.949 208.575 206.713C209.347 210.952 209.749 215.254 209.775 219.566C209.741 219.968 209.818 220.373 210 220.731C210.151 220.944 210.355 221.112 210.59 221.217C212.135 221.971 213.927 220.919 215.216 219.764C217.601 217.624 219.62 214.75 219.756 211.503C219.79 210.668 219.699 209.823 219.841 208.998C220.049 207.774 220.748 206.709 221.361 205.641C222.409 203.821 223.257 201.886 223.888 199.873C224.122 199.116 224.28 198.164 223.698 197.637C223.495 197.471 223.262 197.347 223.013 197.271L216.031 194.617C215.424 194.387 213.92 198.345 213.683 198.779C213.099 199.838 212.518 200.436 211.345 200.682C210.173 200.928 208.726 200.572 207.608 201.184C205.712 202.217 206.657 203.482 207.728 204.586Z" fill="#535070"/>
+<path d="M196.96 207.03C196.83 206.766 196.65 206.531 196.429 206.341C196.106 206.13 195.739 206.002 195.358 205.968C194.031 205.735 192.458 205.583 191.538 206.596C190.679 207.545 190.827 209.089 190.11 210.157C189.883 210.48 189.573 210.772 189.377 211.128C189.134 211.673 189.025 212.271 189.061 212.869C189.023 214.517 188.986 216.171 189.099 217.815C189.191 219.194 189.415 220.641 190.259 221.722C191.611 223.457 194.05 223.706 196.211 223.816L197.964 223.91C198.446 223.968 198.935 223.922 199.399 223.774C199.686 223.639 199.944 223.445 200.157 223.206C200.369 222.966 200.533 222.685 200.637 222.379C201.55 220.055 200.106 217.553 199.215 215.222C198.189 212.539 198.372 209.564 196.96 207.03Z" fill="#535070"/>
+<path d="M182.463 36.1025C182.441 35.8669 182.475 35.6293 182.561 35.4099C182.817 34.947 183.487 35.0862 183.992 35.2027C186.024 35.7271 188.166 35.2513 190.261 35.3743C192.355 35.4973 194.712 36.5687 195.132 38.6726C196.652 37.5708 197.962 36.1928 198.996 34.6071C199.577 33.717 200.083 32.6974 200.004 31.6292C199.89 30.0885 198.63 28.9362 197.476 27.9587L194.001 25.0455C193.543 24.6153 193.015 24.2712 192.441 24.0291C191.638 23.7475 190.76 23.8835 189.913 23.8835C187.386 23.8835 184.675 22.702 182.422 23.8835C181.474 24.3787 180.77 25.23 180.088 26.0586L176.982 29.8263C176.747 30.0665 176.575 30.3638 176.483 30.6906C176.394 31.1502 176.625 31.6033 176.707 32.0662C176.852 32.9078 176.499 33.8076 176.77 34.6168C177.222 35.9569 178.814 36.1479 179.787 36.9182C180.148 37.2031 180.716 38.1774 181.149 38.1644C181.91 38.1482 182.441 36.724 182.463 36.1025Z" fill="#3F3D56"/>
+<path d="M187.733 47.2143C193.229 47.2143 197.685 42.6494 197.685 37.0183C197.685 31.3872 193.229 26.8223 187.733 26.8223C182.237 26.8223 177.781 31.3872 177.781 37.0183C177.781 42.6494 182.237 47.2143 187.733 47.2143Z" fill="#FFC0C6"/>
+<path d="M190.064 59.3298C189.727 58.3416 189.092 57.4887 188.251 56.8941C187.41 56.2995 186.407 55.994 185.385 56.0218C185.092 56.0791 184.789 56.0394 184.52 55.9085C184.367 55.789 184.244 55.6336 184.163 55.4553C183.559 54.3394 183.073 53.1611 182.712 51.9401C182.554 51.3996 182.336 50.7619 181.802 50.6227C181.373 50.5095 180.934 50.7943 180.646 51.1406C180.391 51.5123 180.115 51.8679 179.818 52.2056C178.555 53.3514 176.343 52.3059 175.019 53.3579C174.801 53.5294 174.621 53.7495 174.388 53.9081C174.16 54.0501 173.914 54.1591 173.658 54.2318C171.088 55.0883 168.569 56.0967 166.113 57.2518C166.998 62.7026 167.901 68.257 169.974 73.3551C170.96 75.7827 172.075 78.1618 172.865 80.6638C174.615 86.2085 174.691 92.1417 174.713 97.9712C174.713 101.959 174.713 106.031 173.449 109.805C173.165 110.66 172.817 111.508 172.738 112.395C172.659 113.281 172.918 114.285 173.629 114.816C174.041 115.094 174.513 115.264 175.004 115.311C177.187 115.635 179.386 115.046 181.534 114.534C187.293 113.168 193.17 112.385 199.03 111.621L208.856 110.326C209.561 110.276 210.25 110.092 210.89 109.786C212.688 108.779 212.859 106.008 211.74 104.247C211.206 103.403 210.451 102.71 209.999 101.817C209.548 100.923 209.513 99.6673 210.287 99.0491C211.867 97.7867 211.393 95.4465 211.469 93.4008C211.679 87.6781 211.651 81.9597 211.383 76.2456C211.303 75.0606 211.284 73.8721 211.326 72.685C211.437 70.6717 211.923 68.7005 212.41 66.7422L215.396 54.7012C214.615 53.4388 213.121 52.6361 211.709 52.2735C210.296 51.911 208.821 51.8042 207.428 51.3607C204.584 50.4544 202.032 48.1563 199.052 48.3699C198.826 48.374 198.604 48.4293 198.402 48.5317C197.732 48.9234 197.836 49.9139 197.795 50.7037C197.7 52.4548 196.443 53.9146 195.059 54.9407C193.675 55.9668 192.089 56.7112 190.816 57.8797C190.595 58.0505 190.413 58.2688 190.283 58.5194C190.153 58.7699 190.078 59.0465 190.064 59.3298V59.3298Z" fill="#3F3D56"/>
+<path d="M150.633 70.7524C149.974 71.1915 149.273 71.5613 148.542 71.8562C147.847 72.1378 147.104 72.3611 146.536 72.8531C146.254 73.1034 146.018 73.4025 145.837 73.7368C145.501 74.3489 145.331 75.0423 145.345 75.7447C145.359 76.4471 145.556 77.1328 145.917 77.7303C146.278 78.3277 146.789 78.8151 147.396 79.1414C148.003 79.4678 148.685 79.6212 149.37 79.5858C150.283 79.5372 151.145 79.1585 151.982 78.7863L159.002 75.6562C160.19 75.1286 161.473 74.5136 162.035 73.316C162.1 73.2039 162.124 73.0723 162.105 72.9438C162.05 72.8027 161.947 72.6873 161.814 72.6201C160.232 71.5656 158.848 70.228 157.729 68.6711C157.442 68.2698 157.097 67.3246 156.68 67.0819C155.195 66.237 151.824 69.9626 150.633 70.7524Z" fill="#FFC0C6"/>
+<path d="M225.673 68.2119L228.261 71.2416C228.817 71.889 229.373 72.5363 229.878 73.2355C231.122 74.9907 232.12 76.9159 232.842 78.955C233.404 80.4666 233.871 82.0785 233.676 83.684C233.544 84.5071 233.327 85.3134 233.028 86.089C232.554 87.58 231.965 89.0303 231.268 90.4263C230.686 91.4856 230.028 92.4993 229.3 93.4592C227.296 96.18 225.103 98.7491 222.738 101.147C221.853 102.043 221.474 103.497 221.098 104.707C220.387 106.944 218.697 108.689 217.064 110.339C216.539 110.908 215.957 111.42 215.329 111.867C214.389 112.489 213.289 112.809 212.17 112.786C211.682 112.789 211.198 112.687 210.752 112.485C209.633 111.942 209.064 110.618 208.948 109.355C208.844 108.208 209.031 107.053 209.491 106.002C210.976 102.632 214.789 101.173 217.484 98.7126C219.064 97.2722 220.274 95.4596 221.468 93.6696C222.277 92.5508 222.952 91.337 223.48 90.0541C224.081 88.4065 223.847 86.458 224.375 84.7878C224.596 84.0789 225.006 83.4412 225.231 82.7388C225.455 82.0364 225.531 81.2046 225.111 80.5993C224.796 80.2123 224.393 79.9101 223.939 79.7189C222.217 78.8255 220.29 77.6732 219.961 75.7214C219.829 74.6405 220.105 73.5489 220.732 72.669C221.355 71.8004 222.085 71.0172 222.902 70.3385C223.651 69.6458 224.918 68.8787 225.673 68.2119Z" fill="#FFC0C6"/>
+<path d="M148.971 74.9802C148.516 74.035 147.944 73.0704 147.021 72.6011C146.572 72.4027 146.089 72.3003 145.6 72.3003C145.111 72.3003 144.627 72.4027 144.178 72.6011C143.284 72.9971 142.447 73.5154 141.688 74.1418L139.458 75.8282C138.952 76.1682 138.505 76.5914 138.134 77.0809C137.78 77.6747 137.546 78.335 137.445 79.023C137.13 80.5993 136.874 82.221 137.095 83.8167C137.449 86.4062 138.965 88.6461 140.633 90.6141C141.676 91.8376 142.965 93.0741 144.551 93.1291C145.236 93.1518 145.998 92.8734 146.282 92.2357C146.381 91.9824 146.434 91.7124 146.437 91.4395C146.608 88.5652 145.603 85.7588 144.434 83.1402C144.118 82.4281 143.777 81.6901 143.802 80.9101C143.792 80.7776 143.826 80.6456 143.897 80.5346C143.997 80.4269 144.131 80.3592 144.276 80.3436C145.878 80.0199 148.639 81.2952 149.761 79.4729C150.487 78.2688 149.489 76.0516 148.971 74.9802Z" fill="#FFC0C6"/>
+<path d="M181.939 32.8945C181.92 32.6587 181.954 32.4214 182.041 32.2019C182.296 31.7358 182.966 31.8782 183.472 31.9947C185.503 32.5191 187.645 32.0433 189.74 32.1663C191.835 32.2893 194.188 33.3606 194.612 35.4646C196.13 34.361 197.439 32.9834 198.475 31.3991C199.057 30.5058 199.562 29.4862 199.483 28.418C199.369 26.8773 198.106 25.7249 196.956 24.7507L193.481 21.8375C193.024 21.4073 192.497 21.0632 191.923 20.8211C191.117 20.5395 190.242 20.6755 189.395 20.6755C186.868 20.6755 184.157 19.494 181.905 20.6755C180.957 21.1707 180.252 22.022 179.57 22.8506L176.461 26.6183C176.227 26.859 176.057 27.1563 175.965 27.4825C175.877 27.9422 176.107 28.3953 176.19 28.8582C176.335 29.6998 175.981 30.5996 176.253 31.4056C176.704 32.7489 178.297 32.9399 179.27 33.7102C179.63 33.9951 180.199 34.9694 180.632 34.9564C181.38 34.9402 181.911 33.516 181.939 32.8945Z" fill="#3F3D56"/>
+<path d="M160.803 60.8349C160.402 61.1017 160.05 61.438 159.761 61.8286C159.398 62.395 159.322 63.1233 159.009 63.706C158.339 64.9813 156.769 65.4377 155.793 66.4832C155.635 66.6261 155.524 66.8163 155.477 67.027C155.471 67.3117 155.564 67.5893 155.739 67.8103L160.459 75.4104C162.039 75.5528 163.536 74.5429 165.11 74.6788C165.694 74.7274 166.298 74.9346 166.86 74.7565C167.262 74.5731 167.639 74.337 167.981 74.0541C168.929 73.4456 170.168 73.3744 170.954 72.5749C171.741 71.7754 171.807 70.6004 171.798 69.5096C171.812 68.5629 171.718 67.6177 171.517 66.6936C170.822 63.7804 168.645 61.534 167.28 58.951C166.613 57.6919 166.253 56.9572 164.847 57.8214C163.441 58.6856 162.134 59.8379 160.803 60.8349Z" fill="#3F3D56"/>
+<path d="M218.116 56.9929C219.003 57.583 219.803 58.3002 220.492 59.1227C221.209 60.0711 221.617 61.2364 222.309 62.2074C223 63.1785 223.888 63.8776 224.647 64.7451C225.8 66.0593 226.58 67.6583 227.345 69.2475C225.473 71.7425 223.433 74.1003 221.241 76.3038C220.996 76.5985 220.674 76.8144 220.312 76.9253C220.067 76.9523 219.819 76.9165 219.591 76.821C219.362 76.7255 219.161 76.5734 219.004 76.3783C218.663 76.0158 218.423 75.5626 218.097 75.1839C217.331 74.3738 216.309 73.8681 215.213 73.7565C214.126 73.648 213.032 73.6318 211.943 73.7079C211.704 73.737 211.461 73.6954 211.245 73.5881C211.083 73.4746 210.953 73.3209 210.866 73.1415C209.602 70.9145 209.997 68.1179 210.448 65.5737L211.482 59.7474C211.632 58.635 211.922 57.5472 212.344 56.5106C212.736 55.6528 213.608 54.1963 214.688 54.4552C215.769 54.7141 217.203 56.3196 218.116 56.9929Z" fill="#3F3D56"/>
+<path d="M128.022 99.7029L106.257 104.264L105.761 104.215L86.6348 102.237V77.4044L110.048 73.3486L127.033 75.3781L127.039 75.4882V75.54L128.022 99.7029Z" fill="#4E0D4E"/>
+<path opacity="0.1" d="M128.022 99.7031L106.258 104.264L105.762 104.215V78.7575L127.04 75.4883L128.022 99.7031Z" fill="black"/>
+<path opacity="0.05" d="M127.039 75.54L127.033 75.5464L105.761 78.7574L86.6348 77.4044L110.049 73.3486L127.033 75.3781L127.039 75.4882V75.54Z" fill="black"/>
+<path d="M139.395 75.1034L117.63 79.6673L117.134 79.6155L98.0078 77.6378V52.8048L121.422 48.749L138.406 50.7785L138.412 50.8886V50.9404L139.395 75.1034Z" fill="#3F3D56"/>
+<path opacity="0.1" d="M139.395 75.103L117.631 79.6669L117.135 79.6151V54.1574L138.413 50.8882L139.395 75.103Z" fill="black"/>
+<path opacity="0.05" d="M138.412 50.9404L138.406 50.9468L117.134 54.1578L98.0078 52.8048L121.422 48.749L138.406 50.7785L138.412 50.8886V50.9404Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="300" height="227.76" fill="white" transform="translate(0 0.620117)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/desktop/share/images/mode_share.png b/desktop/share/images/mode_share.png
new file mode 100644
index 00000000..ec287db4
--- /dev/null
+++ b/desktop/share/images/mode_share.png
Binary files differ
diff --git a/desktop/share/images/mode_share.svg b/desktop/share/images/mode_share.svg
new file mode 100644
index 00000000..9fb97c65
--- /dev/null
+++ b/desktop/share/images/mode_share.svg
@@ -0,0 +1,63 @@
+<svg width="300" height="223" viewBox="0 0 300 223" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M17.0615 222.435L12.1934 208.804C12.1934 208.804 17.5483 211.482 17.7917 214.889C17.7917 214.889 16.5747 197.851 14.1406 194.2C14.1406 194.2 18.0351 194.687 22.4165 213.672C22.4165 213.672 23.1467 191.766 16.5747 185.437C16.5747 185.437 25.5808 192.739 26.311 208.561V222.435H17.0615Z" fill="#F2F2F2"/>
+<path d="M181.446 222.233L184.654 213.249C184.654 213.249 181.125 215.014 180.965 217.26C180.965 217.26 181.767 206.03 183.371 203.624C183.371 203.624 180.804 203.944 177.916 216.458C177.916 216.458 177.435 202.019 181.767 197.848C181.767 197.848 175.831 202.661 175.35 213.089V222.233H181.446Z" fill="#F2F2F2"/>
+<path d="M130.086 222.234L127.541 215.109C127.541 215.109 130.34 216.508 130.467 218.29C130.467 218.29 129.831 209.383 128.559 207.475C128.559 207.475 130.595 207.729 132.885 217.653C132.885 217.653 133.267 206.202 129.831 202.894C129.831 202.894 134.539 206.711 134.921 214.981V222.234H130.086Z" fill="#F2F2F2"/>
+<path d="M127.255 173.583C125.971 173.583 124.68 173.541 123.409 173.46L123.45 172.82C124.709 172.9 125.987 172.941 127.251 172.941L127.289 172.941V173.582L127.259 173.583L127.255 173.583ZM131.171 173.455L131.129 172.815C132.402 172.732 133.688 172.606 134.952 172.441L135.035 173.077C133.758 173.244 132.458 173.371 131.171 173.455V173.455ZM119.544 173.087C118.264 172.921 116.975 172.711 115.712 172.462L115.836 171.832C117.085 172.079 118.361 172.287 119.627 172.451L119.544 173.087ZM138.867 172.446L138.742 171.817C139.992 171.569 141.251 171.276 142.482 170.946L142.648 171.566C141.403 171.899 140.131 172.195 138.867 172.446V172.446ZM111.929 171.586C110.685 171.255 109.435 170.877 108.211 170.463L108.417 169.856C109.627 170.265 110.864 170.639 112.094 170.966L111.929 171.586ZM146.364 170.438L146.158 169.83C147.362 169.422 148.569 168.967 149.746 168.478L149.992 169.071C148.802 169.564 147.581 170.025 146.364 170.438ZM104.57 169.095C103.38 168.603 102.188 168.063 101.029 167.491L101.312 166.916C102.459 167.481 103.638 168.015 104.816 168.503L104.57 169.095ZM153.524 167.467L153.239 166.891C154.382 166.326 155.52 165.716 156.622 165.079L156.943 165.634C155.83 166.279 154.679 166.895 153.524 167.467V167.467ZM97.6008 165.658C96.4839 165.013 95.3738 164.322 94.3013 163.605L94.6578 163.072C95.719 163.781 96.817 164.465 97.9217 165.103L97.6008 165.658ZM160.236 163.581L159.879 163.048C160.937 162.34 161.986 161.587 162.998 160.809L163.389 161.318C162.366 162.104 161.305 162.866 160.236 163.581V163.581ZM91.1435 161.341C90.1212 160.557 89.1109 159.728 88.1405 158.877L88.5635 158.395C89.5234 159.236 90.5229 160.056 91.5342 160.832L91.1435 161.341ZM166.39 158.853L165.966 158.371C166.924 157.53 167.867 156.646 168.769 155.744L169.223 156.198C168.311 157.109 167.358 158.003 166.39 158.853ZM85.3048 156.223C84.3922 155.312 83.4982 154.359 82.6479 153.391L83.1298 152.968C83.9712 153.925 84.8555 154.868 85.7582 155.769L85.3048 156.223ZM171.879 153.364L171.396 152.941C172.238 151.982 173.059 150.983 173.836 149.971L174.345 150.362C173.559 151.385 172.73 152.394 171.879 153.364ZM80.1811 150.393C79.3953 149.372 78.6329 148.311 77.9154 147.242L78.4484 146.884C79.1581 147.943 79.9123 148.992 80.6897 150.002L80.1811 150.393ZM176.611 147.206L176.078 146.849C176.788 145.788 177.472 144.69 178.111 143.586L178.666 143.908C178.02 145.024 177.329 146.133 176.611 147.206ZM75.8604 143.95C75.2138 142.834 74.5965 141.684 74.0258 140.531L74.6008 140.247C75.1654 141.387 75.7761 142.524 76.4156 143.628L75.8604 143.95ZM180.501 140.481L179.926 140.197C180.491 139.053 181.025 137.875 181.515 136.695L182.107 136.94C181.613 138.134 181.072 139.325 180.501 140.481V140.481ZM72.4196 137.001C71.9252 135.812 71.4641 134.591 71.0493 133.374L71.6568 133.167C72.067 134.371 72.523 135.578 73.0122 136.755L72.4196 137.001ZM183.478 133.301L182.87 133.095C183.28 131.886 183.654 130.65 183.983 129.418L184.603 129.584C184.27 130.829 183.892 132.079 183.478 133.301ZM69.9191 129.659C69.5847 128.414 69.2877 127.142 69.0359 125.877L69.6654 125.752C69.9142 127.003 70.2081 128.261 70.5388 129.492L69.9191 129.659ZM185.481 125.801L184.851 125.677C185.099 124.426 185.308 123.151 185.472 121.886L186.108 121.969C185.942 123.248 185.731 124.537 185.481 125.801ZM68.4035 122.047C68.2357 120.772 68.1075 119.472 68.0223 118.183L68.6628 118.141C68.7469 119.416 68.8738 120.702 69.0397 121.963L68.4035 122.047ZM186.485 118.105L185.844 118.063C185.926 116.796 185.968 115.504 185.968 114.225L185.967 114.072H186.609L186.609 114.222C186.609 115.518 186.567 116.823 186.485 118.105ZM68.5343 114.301H67.8926L67.8927 114.222C67.8927 112.958 67.933 111.678 68.0126 110.421L68.653 110.462C68.5744 111.706 68.5344 112.972 68.5344 114.225L68.5343 114.301ZM185.834 110.233C185.749 108.96 185.621 107.675 185.453 106.411L186.089 106.327C186.259 107.604 186.388 108.904 186.475 110.19L185.834 110.233ZM69.0199 106.638L68.3836 106.556C68.5484 105.278 68.758 103.988 69.0062 102.723L69.636 102.847C69.3903 104.098 69.183 105.373 69.0199 106.638ZM184.822 102.623C184.571 101.373 184.276 100.115 183.943 98.8837L184.563 98.7164C184.899 99.9615 185.198 101.233 185.451 102.497L184.822 102.623ZM70.4995 99.1043L69.8794 98.9395C70.2106 97.6928 70.5877 96.4418 71.0001 95.2213L71.6079 95.4266C71.2001 96.6337 70.8273 97.8711 70.4995 99.1043ZM182.821 95.2105C182.409 94.0054 181.951 92.7991 181.461 91.6249L182.053 91.3776C182.549 92.5649 183.011 93.7845 183.428 95.0028L182.821 95.2105ZM72.9583 91.8248L72.3651 91.5797C72.8577 90.3875 73.3966 89.1956 73.967 88.037L74.5426 88.3206C73.9785 89.4664 73.4453 90.6454 72.9583 91.8248ZM179.867 88.1349C179.303 86.9974 178.691 85.8606 178.048 84.7558L178.603 84.4333C179.253 85.5501 179.871 86.6995 180.442 87.8495L179.867 88.1349ZM76.3537 84.9283L75.7979 84.6077C76.4419 83.4911 77.1319 82.3805 77.8488 81.3069L78.3824 81.6631C77.6733 82.7253 76.9907 83.8239 76.3537 84.9283V84.9283ZM176.012 81.5019C175.3 80.4432 174.544 79.3952 173.766 78.3871L174.274 77.9951C175.061 79.0142 175.824 80.0736 176.544 81.1438L176.012 81.5019ZM80.6199 78.5379L80.1106 78.1475C80.8952 77.124 81.7237 76.113 82.573 75.1429L83.0558 75.5656C82.2156 76.5254 81.3961 77.5254 80.6199 78.5379V78.5379ZM171.322 75.4243C170.48 74.4688 169.595 73.5274 168.69 72.6261L169.143 72.1714C170.057 73.0824 170.953 74.0342 171.803 75L171.322 75.4243ZM85.6792 72.7585L85.2249 72.3054C86.1354 71.3926 87.0877 70.4981 88.0551 69.6467L88.479 70.1283C87.5219 70.9707 86.5799 71.8556 85.6792 72.7585V72.7585ZM165.881 70.0045C164.92 69.164 163.92 68.3451 162.908 67.5706L163.298 67.0611C164.321 67.8439 165.332 68.6718 166.304 69.5214L165.881 70.0045ZM91.4433 67.6863L91.0517 67.1781C92.0722 66.3916 93.1322 65.6287 94.2019 64.9103L94.5598 65.443C93.5015 66.1537 92.4529 66.9085 91.4433 67.6863V67.6863ZM159.781 65.3351C158.719 64.6272 157.62 63.9454 156.515 63.3084L156.835 62.7522C157.953 63.3963 159.064 64.0856 160.137 64.8011L159.781 65.3351ZM97.8149 63.4081L97.4927 62.8531C98.6059 62.2069 99.7555 61.5888 100.91 61.0162L101.195 61.5912C100.053 62.1575 98.9161 62.7688 97.8149 63.4081V63.4081ZM153.121 61.4995C151.975 60.936 150.796 60.4038 149.616 59.9173L149.861 59.3242C151.053 59.8158 152.246 60.354 153.404 60.9236L153.121 61.4995ZM104.686 60.0002L104.439 59.4079C105.628 58.9126 106.848 58.4508 108.065 58.0353L108.273 58.6425C107.069 59.0536 105.862 59.5105 104.686 60.0002ZM146.013 58.5692C144.805 58.162 143.567 57.7899 142.335 57.4633L142.499 56.8429C143.745 57.1731 144.996 57.5493 146.218 57.961L146.013 58.5692ZM111.947 57.5223L111.78 56.9026C113.024 56.5676 114.296 56.2698 115.56 56.0171L115.686 56.6463C114.435 56.8963 113.177 57.191 111.947 57.5224L111.947 57.5223ZM138.591 56.6022C137.342 56.3577 136.066 56.1513 134.8 55.9887L134.882 55.3523C136.161 55.5165 137.451 55.7252 138.715 55.9724L138.591 56.6022ZM119.475 56.0182L119.391 55.3821C120.666 55.2135 121.966 55.0844 123.255 54.9986L123.297 55.6389C122.022 55.7238 120.736 55.8515 119.475 56.0182V56.0182ZM130.976 55.6242C129.745 55.5471 128.491 55.5079 127.251 55.5079L127.137 55.5081V54.8664L127.25 54.8662C128.505 54.8662 129.772 54.9057 131.017 54.9837L130.976 55.6242Z" fill="#ABABAB"/>
+<path d="M222.227 118.716C220.944 118.716 219.653 118.675 218.382 118.594L218.422 117.954C219.681 118.034 220.96 118.075 222.224 118.075L222.262 118.074V118.716L222.232 118.716L222.227 118.716ZM226.144 118.589L226.102 117.948C227.374 117.865 228.661 117.739 229.924 117.574L230.008 118.21C228.73 118.378 227.43 118.505 226.144 118.589ZM214.517 118.221C213.237 118.055 211.948 117.845 210.684 117.596L210.808 116.966C212.058 117.212 213.334 117.42 214.599 117.584L214.517 118.221ZM233.839 117.58L233.714 116.951C234.965 116.703 236.223 116.41 237.455 116.08L237.621 116.7C236.376 117.033 235.103 117.329 233.839 117.58V117.58ZM206.901 116.72C205.658 116.389 204.407 116.011 203.184 115.597L203.39 114.989C204.6 115.399 205.837 115.772 207.067 116.1L206.901 116.72ZM241.337 115.572L241.131 114.964C242.334 114.555 243.541 114.1 244.718 113.612L244.965 114.204C243.774 114.698 242.554 115.158 241.337 115.572ZM199.543 114.229C198.352 113.737 197.161 113.197 196.001 112.625L196.285 112.05C197.432 112.615 198.611 113.149 199.788 113.636L199.543 114.229ZM248.496 112.6L248.212 112.025C249.355 111.46 250.493 110.85 251.594 110.213L251.916 110.768C250.802 111.413 249.652 112.029 248.496 112.6V112.6ZM192.574 110.792C191.457 110.147 190.346 109.456 189.274 108.739L189.631 108.206C190.692 108.915 191.79 109.598 192.894 110.236L192.574 110.792ZM255.209 108.715L254.852 108.182C255.91 107.474 256.959 106.721 257.971 105.943L258.362 106.452C257.339 107.238 256.278 107.999 255.209 108.715V108.715ZM186.116 106.475C185.094 105.69 184.084 104.861 183.113 104.011L183.536 103.528C184.496 104.37 185.496 105.19 186.507 105.966L186.116 106.475ZM261.362 103.987L260.939 103.504C261.897 102.663 262.84 101.78 263.742 100.878L264.196 101.332C263.284 102.243 262.331 103.136 261.362 103.987ZM180.277 101.357C179.365 100.446 178.471 99.4931 177.621 98.5252L178.102 98.1016C178.944 99.059 179.828 100.002 180.731 100.903L180.277 101.357ZM266.852 98.4977L266.369 98.0743C267.211 97.1154 268.032 96.1165 268.809 95.1052L269.318 95.4962C268.532 96.5185 267.702 97.5282 266.852 98.4977V98.4977ZM175.154 95.5269C174.368 94.5056 173.606 93.4453 172.888 92.3754L173.421 92.0179C174.131 93.0765 174.885 94.1254 175.662 95.1356L175.154 95.5269ZM271.584 92.3397L271.05 91.9828C271.76 90.9218 272.444 89.8242 273.083 88.72L273.638 89.0415C272.993 90.1576 272.301 91.2673 271.584 92.3397V92.3397ZM170.833 89.0835C170.186 87.968 169.569 86.8179 168.998 85.6652L169.573 85.3803C170.138 86.5206 170.749 87.6583 171.388 88.7617L170.833 89.0835ZM275.474 85.6149L274.898 85.3307C275.463 84.1871 275.998 83.0089 276.487 81.8285L277.08 82.0742C276.585 83.2675 276.045 84.4588 275.474 85.6149V85.6149ZM167.392 82.1346C166.898 80.9455 166.437 79.7253 166.022 78.5076L166.629 78.3008C167.04 79.505 167.496 80.7121 167.985 81.8884L167.392 82.1346ZM278.451 78.4343L277.843 78.2285C278.252 77.0202 278.627 75.7833 278.956 74.5519L279.576 74.7177C279.243 75.9624 278.865 77.2129 278.451 78.4343ZM164.892 74.7926C164.557 73.5477 164.26 72.2754 164.009 71.0112L164.638 70.8859C164.887 72.1364 165.181 73.3948 165.512 74.6262L164.892 74.7926ZM280.453 70.9349L279.824 70.8105C280.071 69.56 280.28 68.2847 280.445 67.0201L281.081 67.1032C280.915 68.3816 280.703 69.6708 280.453 70.9349ZM163.376 67.1804C163.208 65.9056 163.08 64.6057 162.995 63.3166L163.635 63.2743C163.72 64.5496 163.846 65.8356 164.012 67.0967L163.376 67.1804ZM281.457 63.2386L280.817 63.1973C280.899 61.9294 280.94 60.6378 280.94 59.3583L280.94 59.206H281.582L281.582 59.3563C281.582 60.6514 281.54 61.9569 281.457 63.2386V63.2386ZM163.507 59.4349H162.865L162.865 59.3562C162.865 58.0919 162.906 56.8123 162.985 55.5549L163.626 55.5953C163.547 56.8394 163.507 58.1054 163.507 59.3583L163.507 59.4349ZM280.807 55.3672C280.722 54.0942 280.593 52.8083 280.425 51.5453L281.061 51.4607C281.231 52.7377 281.361 54.0375 281.447 55.3242L280.807 55.3672ZM163.993 51.7718L163.356 51.6897C163.521 50.4113 163.731 49.1218 163.979 47.857L164.609 47.9808C164.363 49.2316 164.156 50.5072 163.993 51.7718ZM279.794 47.7566C279.544 46.5068 279.248 45.2489 278.916 44.0175L279.536 43.8502C279.872 45.0953 280.17 46.3671 280.423 47.6306L279.794 47.7566ZM165.472 44.2381L164.852 44.0733C165.183 42.8265 165.56 41.5756 165.973 40.3551L166.581 40.5603C166.173 41.7675 165.8 43.0048 165.472 44.2381ZM277.793 40.3443C277.381 39.1392 276.924 37.9329 276.433 36.7587L277.026 36.5114C277.521 37.6987 277.984 38.9183 278.4 40.1366L277.793 40.3443ZM167.931 36.9586L167.338 36.7135C167.83 35.5213 168.369 34.3294 168.94 33.1708L169.515 33.4544C168.951 34.6002 168.418 35.7792 167.931 36.9586ZM274.84 33.2687C274.275 32.1312 273.663 30.9944 273.021 29.8896L273.576 29.5671C274.225 30.6839 274.844 31.8333 275.415 32.9833L274.84 33.2687ZM171.326 30.062L170.771 29.7415C171.415 28.6249 172.105 27.5143 172.821 26.4407L173.355 26.7969C172.646 27.8591 171.963 28.9577 171.326 30.062ZM270.984 26.6357C270.272 25.577 269.517 24.529 268.739 23.5209L269.247 23.1289C270.033 24.148 270.797 25.2074 271.517 26.2776L270.984 26.6357ZM175.593 23.6717L175.083 23.2813C175.868 22.2578 176.696 21.2468 177.546 20.2767L178.028 20.6994C177.188 21.6592 176.369 22.6592 175.593 23.6717V23.6717ZM266.295 20.5581C265.453 19.6026 264.568 18.6612 263.663 17.7599L264.116 17.3052C265.03 18.2162 265.925 19.168 266.776 20.1338L266.295 20.5581ZM180.652 17.8922L180.198 17.4392C181.108 16.5264 182.06 15.6318 183.028 14.7805L183.452 15.2621C182.495 16.1045 181.553 16.9894 180.652 17.8922V17.8922ZM260.854 15.1383C259.893 14.2978 258.892 13.4789 257.88 12.7044L258.27 12.1949C259.293 12.9777 260.305 13.8056 261.276 14.6552L260.854 15.1383ZM186.416 12.8201L186.024 12.3119C187.045 11.5254 188.105 10.7624 189.175 10.0441L189.532 10.5768C188.474 11.2874 187.426 12.0423 186.416 12.8201V12.8201ZM254.754 10.4689C253.692 9.76103 252.593 9.07921 251.487 8.4422L251.807 7.88603C252.925 8.5301 254.036 9.21943 255.11 9.93493L254.754 10.4689ZM192.788 8.54184L192.465 7.98693C193.579 7.34067 194.728 6.72262 195.882 6.15L196.168 6.72497C195.026 7.29132 193.889 7.90264 192.788 8.54184V8.54184ZM248.094 6.63332C246.948 6.06979 245.768 5.5376 244.589 5.05113L244.833 4.45799C246.026 4.94961 247.218 5.48776 248.377 6.05741L248.094 6.63332ZM199.659 5.13401L199.412 4.54164C200.601 4.04642 201.821 3.58456 203.038 3.16908L203.245 3.77632C202.041 4.18742 200.835 4.64426 199.659 5.13401ZM240.986 3.70299C239.778 3.29582 238.54 2.92372 237.307 2.59707L237.472 1.97667C238.718 2.30692 239.969 2.68308 241.191 3.0948L240.986 3.70299ZM206.919 2.65614L206.753 2.03636C207.997 1.70138 209.269 1.40358 210.533 1.15087L210.659 1.78005C209.408 2.0301 208.15 2.3248 206.919 2.65615V2.65614ZM233.564 1.73603C232.314 1.49147 231.039 1.28514 229.773 1.12251L229.854 0.486128C231.134 0.650316 232.424 0.858999 233.688 1.10622L233.564 1.73603ZM214.448 1.15197L214.364 0.515897C215.638 0.347323 216.938 0.218227 218.228 0.132372L218.27 0.772676C216.995 0.857603 215.709 0.98528 214.448 1.15198V1.15197ZM225.949 0.757959C224.717 0.68088 223.464 0.641711 222.224 0.641711L222.109 0.641865V0.00015422L222.223 0C223.477 0 224.744 0.0394655 225.989 0.117501L225.949 0.757959Z" fill="#E6E6E6"/>
+<path d="M71.9124 43.7183H71.9124C63.019 43.7183 56.5446 49.7569 54.362 58.3782L51.6562 71.3118H53.5814L57.7525 60.7236L56.8744 71.3118H59.0359L60.6402 65.8573L60.3025 71.3118H86.3087V58.1145C86.3087 56.2239 85.9363 54.3519 85.2128 52.6053C84.4893 50.8587 83.4289 49.2716 82.0921 47.9348C80.7553 46.598 79.1682 45.5376 77.4216 44.8141C75.675 44.0906 73.803 43.7183 71.9124 43.7183V43.7183Z" fill="#2F2E41"/>
+<path d="M68.1811 60.5635C68.1811 60.5635 69.4645 68.264 66.256 69.5474C63.0474 70.8309 62.7266 70.8309 62.7266 70.8309L68.502 88.4779L75.5608 90.7239L83.2613 69.8683L79.7319 68.264C79.7319 68.264 76.2025 63.4512 77.4859 60.5635H68.1811Z" fill="#A0616A"/>
+<path d="M56.9514 121.205C56.9514 121.205 50.5343 128.906 52.1386 155.537L51.8177 163.237C51.8177 163.237 35.1332 206.553 46.0423 208.799C56.9514 211.045 57.914 212.649 58.8765 210.082C59.8391 207.515 75.2402 148.478 75.2402 148.478C75.2402 148.478 87.7536 209.761 93.8498 209.12C99.9461 208.478 107.967 210.403 107.647 205.59C107.326 200.777 99.9461 163.879 99.9461 163.879C99.9461 163.879 98.3418 119.922 89.9995 117.355C81.6573 114.788 64.6519 113.826 56.9514 121.205Z" fill="#2F2E41"/>
+<path d="M48.61 206.553L45.7223 213.932C45.7223 213.932 40.5886 220.991 43.7972 221.954C47.0057 222.916 51.4977 220.35 51.4977 220.35C51.4977 220.35 54.0645 210.724 54.0645 208.157L48.61 206.553Z" fill="#2F2E41"/>
+<path d="M101.871 206.553L104.758 213.932C104.758 213.932 109.892 220.991 106.683 221.954C103.475 222.916 98.9829 220.35 98.9829 220.35C98.9829 220.35 96.416 210.724 96.416 208.157L101.871 206.553Z" fill="#2F2E41"/>
+<path d="M72.3534 64.4134C76.7835 64.4134 80.3748 60.8221 80.3748 56.392C80.3748 51.9619 76.7835 48.3706 72.3534 48.3706C67.9233 48.3706 64.332 51.9619 64.332 56.392C64.332 60.8221 67.9233 64.4134 72.3534 64.4134Z" fill="#A0616A"/>
+<path d="M73.6367 82.3817C73.6367 82.3817 66.5778 79.1731 63.6901 69.8683L58.5565 71.4726C58.5565 71.4726 60.1607 81.74 59.1982 83.986C59.1982 83.986 57.9147 116.392 58.5565 117.034C59.1982 117.676 53.4228 123.13 55.3479 123.772C57.273 124.414 67.5404 122.81 66.257 120.884L64.9736 118.959L86.7917 119.28C86.7917 119.28 85.1875 123.772 89.6794 123.772C94.1714 123.772 91.6046 115.109 91.6046 115.109L88.7169 85.2694C88.7169 85.2694 85.5083 74.3603 86.4709 70.51L81.9789 68.9058C81.9789 68.9058 79.4121 78.2106 73.6367 82.3817Z" fill="#3F3D56"/>
+<path d="M66.9283 51.9787L66.6581 54.5456H73.9871L74.9497 52.6205L74.7472 54.5456H83.6128L77.5165 44.9199L64.0406 45.2408L60.832 54.5456H65.6449L66.9283 51.9787Z" fill="#2F2E41"/>
+<path d="M212.085 66.8198H128.342V114.306H212.085V66.8198Z" fill="#F2F2F2"/>
+<path d="M145.829 85.4294C150.082 85.4294 153.53 81.9817 153.53 77.7289C153.53 73.476 150.082 70.0283 145.829 70.0283C141.577 70.0283 138.129 73.476 138.129 77.7289C138.129 81.9817 141.577 85.4294 145.829 85.4294Z" fill="white"/>
+<path d="M202.3 76.4458H158.021V79.0126H202.3V76.4458Z" fill="white"/>
+<path d="M202.3 82.8628H158.021V85.4296H202.3V82.8628Z" fill="white"/>
+<path d="M202.3 89.2798H138.129V91.8466H202.3V89.2798Z" fill="white"/>
+<path d="M202.3 95.6963H138.129V98.2631H202.3V95.6963Z" fill="white"/>
+<path d="M202.3 102.114H138.129V104.681H202.3V102.114Z" fill="white"/>
+<path d="M202.3 108.531H138.129V111.098H202.3V108.531Z" fill="white"/>
+<path d="M182.056 114.627H128.021V66.499H212.407V85.4128H211.765V67.1407H128.663V113.986H182.056V114.627Z" fill="#3F3D56"/>
+<path d="M114.544 134.841H30.8008V182.328H114.544V134.841Z" fill="#F2F2F2"/>
+<path d="M84.8361 182.649H30.8008V134.521H115.186V153.435H114.544V135.163H31.4425V182.008H84.8361V182.649Z" fill="#3F3D56"/>
+<path d="M59.3571 71.3117C59.3571 71.3117 52.6192 70.9908 52.6192 76.4453C52.6192 81.8999 53.2609 99.2261 53.2609 99.2261L53.9026 104.681L53.5817 126.82C53.5817 126.82 47.4855 140.616 51.6566 140.937C55.8277 141.258 58.0737 128.424 58.0737 128.424L59.3571 116.873C59.3571 116.873 58.555 85.5897 59.5176 84.3063L59.3571 71.3117Z" fill="#A0616A"/>
+<path d="M86.3089 70.3497C86.3089 70.3497 93.0468 70.0289 93.0468 75.4834C93.0468 80.938 92.4051 98.2642 92.4051 98.2642L91.7634 103.719L92.0843 125.858C92.0843 125.858 98.1805 139.655 94.0094 139.975C89.8383 140.296 87.5923 127.462 87.5923 127.462L86.3089 115.911C86.3089 115.911 87.111 84.6278 86.1484 83.3444L86.3089 70.3497Z" fill="#A0616A"/>
+<path d="M215.936 50.7769L299.68 50.7769V3.29023L215.936 3.29023V50.7769Z" fill="#F2F2F2"/>
+<path d="M299.998 51.0981H245.963V50.4564H299.357V3.61144H216.255V21.8832H215.613V2.96973H299.998V51.0981Z" fill="#3F3D56"/>
+<path d="M290.054 8.42432H225.883V10.9912H290.054V8.42432Z" fill="white"/>
+<path d="M290.054 14.1997H225.883V16.7666H290.054V14.1997Z" fill="white"/>
+<path d="M290.054 19.9751H225.883V22.5419H290.054V19.9751Z" fill="white"/>
+<path d="M290.054 25.75H225.883V28.3168H290.054V25.75Z" fill="white"/>
+<path d="M290.054 31.5254H225.883V34.0922H290.054V31.5254Z" fill="white"/>
+<path d="M290.055 38.585H276.258V45.9646H290.055V38.585Z" fill="white"/>
+<path d="M256.364 221.793H0V222.435H256.364V221.793Z" fill="#2F2E41"/>
+<path d="M210.804 119.119C214.348 119.119 217.221 116.246 217.221 112.702C217.221 109.158 214.348 106.285 210.804 106.285C207.26 106.285 204.387 109.158 204.387 112.702C204.387 116.246 207.26 119.119 210.804 119.119Z" fill="#4E064F"/>
+<path d="M215.128 112.284H211.221V108.377H210.385V112.284H206.479V113.121H210.385V117.027H211.221V113.121H215.128V112.284Z" fill="white"/>
+<path d="M214.331 56.2317C217.875 56.2317 220.748 53.3586 220.748 49.8146C220.748 46.2705 217.875 43.3975 214.331 43.3975C210.787 43.3975 207.914 46.2705 207.914 49.8146C207.914 53.3586 210.787 56.2317 214.331 56.2317Z" fill="#4E064F"/>
+<path d="M218.657 49.3963H214.751V45.4902H213.914V49.3963H210.008V50.2334H213.914V54.1395H214.751V50.2334H218.657V49.3963Z" fill="white"/>
+<g clip-path="url(#clip1)">
+<path d="M62.4185 148.419C56.5606 154.277 56.5606 163.775 62.4185 169.632C68.2763 175.49 77.7738 175.49 83.6317 169.632C89.4895 163.775 89.4895 154.277 83.6317 148.419C77.7738 142.561 68.2763 142.561 62.4185 148.419Z" fill="#4E064F"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M65.8148 151.817C69.7947 147.837 76.2474 147.837 80.2273 151.817C84.2072 155.797 84.2072 162.25 80.2273 166.23C76.2474 170.21 69.7947 170.21 65.8148 166.23C61.8349 162.25 61.8349 155.797 65.8148 151.817ZM68.6973 154.7C66.3094 157.088 66.3094 160.959 68.6973 163.347C71.0853 165.735 74.9569 165.735 77.3448 163.347C79.7328 160.959 79.7328 157.088 77.3448 154.7C74.9569 152.312 71.0853 152.312 68.6973 154.7Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M85.9941 160.945L80.7096 166.229L76.3858 161.906L81.6704 156.621L85.9941 160.945Z" fill="#4E064F"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M69.6582 155.66L64.6138 160.705L60.2901 156.381L65.3345 151.336L69.6582 155.66Z" fill="#4E064F"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M67.2578 153.739L63.4145 157.582L61.2526 155.42L65.0959 151.577L67.2578 153.739Z" fill="#4E064F"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M85.5137 161.906L81.6703 165.749L79.5085 163.587L83.3518 159.744L85.5137 161.906Z" fill="#4E064F"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M69.2258 160.173L65.3207 156.267C65.1889 156.136 64.9752 156.136 64.8434 156.267L60.9995 160.111C60.8677 160.243 60.8677 160.457 60.9995 160.589C61.0622 160.651 61.1469 160.687 61.2355 160.687L68.9845 160.749C69.1709 160.75 69.3232 160.6 69.3246 160.414C69.3253 160.323 69.2897 160.237 69.2258 160.173Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M76.5398 156.894L80.4449 160.799C80.5767 160.931 80.7904 160.931 80.9222 160.799L84.7661 156.956C84.8979 156.824 84.8979 156.61 84.7661 156.478C84.7035 156.416 84.6187 156.38 84.5301 156.379L76.7812 156.318C76.5948 156.317 76.4425 156.467 76.441 156.653C76.4403 156.743 76.4759 156.83 76.5398 156.894Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M66.2953 151.815L68.7005 154.221C68.8323 154.352 68.8323 154.566 68.7005 154.698L68.6974 154.701C68.5656 154.833 68.3519 154.833 68.2201 154.701L65.8149 152.296C65.6831 152.164 65.6831 151.95 65.8149 151.818L65.818 151.815C65.9498 151.684 66.1635 151.684 66.2953 151.815Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M78.0648 163.105L80.47 165.511C80.6018 165.642 80.6018 165.856 80.47 165.988L80.4669 165.991C80.3351 166.123 80.1214 166.123 79.9896 165.991L77.5844 163.586C77.4526 163.454 77.4526 163.24 77.5844 163.108L77.5875 163.105C77.7193 162.974 77.933 162.974 78.0648 163.105Z" fill="white"/>
+</g>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="300" height="222.435" fill="white"/>
+</clipPath>
+<clipPath id="clip1">
+<rect width="30" height="30" fill="white" transform="translate(58 144)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/desktop/share/images/mode_website.png b/desktop/share/images/mode_website.png
new file mode 100644
index 00000000..37a556d9
--- /dev/null
+++ b/desktop/share/images/mode_website.png
Binary files differ
diff --git a/desktop/share/images/mode_website.svg b/desktop/share/images/mode_website.svg
new file mode 100644
index 00000000..1a80846f
--- /dev/null
+++ b/desktop/share/images/mode_website.svg
@@ -0,0 +1,35 @@
+<svg width="300" height="205" viewBox="0 0 300 205" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M127.628 49.6012C125.191 58.6086 116.845 64.1872 116.845 64.1872C116.845 64.1872 112.45 55.1618 114.886 46.1543C117.323 37.1469 125.669 31.5684 125.669 31.5684C125.669 31.5684 130.065 40.5938 127.628 49.6012Z" fill="#4E0D4E"/>
+<path d="M105.462 49.6012C107.899 58.6086 116.245 64.1872 116.245 64.1872C116.245 64.1872 120.641 55.1618 118.204 46.1543C115.767 37.1469 107.421 31.5684 107.421 31.5684C107.421 31.5684 103.026 40.5938 105.462 49.6012Z" fill="#3A0A3A"/>
+<path d="M109.042 47.6655C115.729 54.1743 116.545 64.1799 116.545 64.1799C116.545 64.1799 106.521 63.6326 99.835 57.1238C93.1487 50.615 92.332 40.6094 92.332 40.6094C92.332 40.6094 102.356 41.1567 109.042 47.6655Z" fill="#3F3D56"/>
+<path d="M124.048 47.6655C117.362 54.1743 116.545 64.1799 116.545 64.1799C116.545 64.1799 126.569 63.6326 133.255 57.1238C139.941 50.615 140.758 40.6094 140.758 40.6094C140.758 40.6094 130.734 41.1567 124.048 47.6655Z" fill="#3F3D56"/>
+<path d="M284.522 182.496C286.089 188.289 291.457 191.877 291.457 191.877C291.457 191.877 294.284 186.072 292.717 180.279C291.15 174.486 285.782 170.898 285.782 170.898C285.782 170.898 282.955 176.703 284.522 182.496Z" fill="#6C63FF"/>
+<path d="M286.825 181.251C291.126 185.437 291.651 191.872 291.651 191.872C291.651 191.872 285.204 191.52 280.904 187.334C276.603 183.148 276.078 176.713 276.078 176.713C276.078 176.713 282.525 177.065 286.825 181.251Z" fill="#3F3D56"/>
+<path opacity="0.75" d="M33.6035 61.6396V191.798H199.487V61.6396H33.6035ZM142.504 127.593C142.504 128.769 142.434 129.944 142.294 131.112L141.571 131.025C141.434 132.164 141.228 133.293 140.955 134.407L141.663 134.581C141.382 135.724 141.032 136.85 140.614 137.951L139.933 137.692C139.526 138.765 139.054 139.812 138.52 140.828L139.165 141.167C138.617 142.209 138.007 143.216 137.337 144.184L136.738 143.77C136.085 144.714 135.377 145.617 134.616 146.476L135.161 146.959C134.381 147.839 133.548 148.672 132.668 149.452L132.185 148.907C131.327 149.668 130.424 150.377 129.481 151.029L129.895 151.628C128.928 152.297 127.921 152.907 126.881 153.455L126.541 152.811C125.526 153.345 124.48 153.817 123.407 154.224L123.666 154.906C122.566 155.323 121.441 155.674 120.299 155.955L120.125 155.247C119.011 155.522 117.882 155.728 116.743 155.865L116.83 156.588C115.662 156.729 114.488 156.799 113.312 156.8L113.311 156.073L113.297 156.073C112.155 156.073 111.014 156.004 109.879 155.868L109.793 156.592C108.625 156.452 107.466 156.241 106.324 155.962L106.497 155.254C105.382 154.981 104.285 154.64 103.212 154.233L102.953 154.915C101.853 154.498 100.778 154.014 99.736 153.467L100.075 152.822C99.059 152.288 98.0764 151.694 97.1323 151.042L96.7181 151.641C95.7503 150.972 94.8234 150.246 93.9423 149.467L94.4256 148.921C93.5668 148.16 92.7544 147.349 91.9929 146.491L91.4478 146.975C90.6673 146.095 89.9401 145.17 89.2701 144.203L89.8693 143.788C89.2165 142.845 88.6211 141.864 88.0866 140.849L87.4418 141.189C86.8935 140.148 86.4088 139.075 85.9902 137.975L86.6713 137.716C86.2634 136.644 85.9213 135.548 85.6466 134.434L84.9391 134.609C84.6577 133.466 84.4457 132.308 84.3042 131.14L85.0271 131.053C84.8884 129.909 84.8184 128.759 84.8177 127.607L84.0907 127.621L84.091 127.582C84.0913 126.419 84.1602 125.258 84.2974 124.103L85.0208 124.189C85.1565 123.05 85.3611 121.92 85.6335 120.806L84.9255 120.633C85.2053 119.489 85.5543 118.364 85.9707 117.262L86.6523 117.52C87.0584 116.447 87.5293 115.399 88.0624 114.383L87.4171 114.044C87.9641 113.002 88.5733 111.994 89.2415 111.025L89.8413 111.439C90.4929 110.495 91.2007 109.591 91.9609 108.732L91.4151 108.249C92.1945 107.368 93.0261 106.534 93.9052 105.753L94.3893 106.298C95.2467 105.536 96.1491 104.826 97.0917 104.173L96.6764 103.574C97.643 102.904 98.649 102.293 99.6889 101.744L100.029 102.389C101.044 101.853 102.09 101.38 103.162 100.972L102.902 100.291C104.002 99.8719 105.126 99.5205 106.268 99.2383L106.443 99.9457C107.557 99.6704 108.686 99.463 109.824 99.3244L109.737 98.6016C110.904 98.46 112.079 98.3882 113.255 98.3867L113.256 99.1138C113.27 99.1138 113.284 99.1133 113.297 99.1133C114.431 99.1137 115.563 99.181 116.688 99.315L116.774 98.5914C117.942 98.7302 119.101 98.9393 120.244 99.2176L120.071 99.9259C121.186 100.198 122.284 100.538 123.358 100.943L123.615 100.261C124.716 100.677 125.791 101.16 126.834 101.706L126.496 102.352C127.512 102.884 128.495 103.478 129.44 104.129L129.854 103.529C130.822 104.197 131.75 104.922 132.631 105.701L132.149 106.247C133.008 107.007 133.821 107.818 134.584 108.675L135.128 108.19C135.91 109.069 136.638 109.994 137.309 110.96L136.71 111.376C137.364 112.318 137.96 113.299 138.495 114.312L139.14 113.972C139.689 115.013 140.175 116.085 140.595 117.185L139.914 117.445C140.323 118.516 140.666 119.612 140.942 120.725L141.649 120.55C141.932 121.692 142.145 122.85 142.287 124.018L141.565 124.106C141.704 125.245 141.775 126.391 141.777 127.538H142.504L142.504 127.593Z" fill="#EFEFEF"/>
+<path d="M40.989 71.1362C42.5945 71.1362 43.896 69.8347 43.896 68.2292C43.896 66.6238 42.5945 65.3223 40.989 65.3223C39.3835 65.3223 38.082 66.6238 38.082 68.2292C38.082 69.8347 39.3835 71.1362 40.989 71.1362Z" fill="#6C63FF"/>
+<path d="M50.0007 71.1362C51.6062 71.1362 52.9077 69.8347 52.9077 68.2292C52.9077 66.6238 51.6062 65.3223 50.0007 65.3223C48.3952 65.3223 47.0938 66.6238 47.0938 68.2292C47.0938 69.8347 48.3952 71.1362 50.0007 71.1362Z" fill="#6C63FF"/>
+<path d="M59.0124 71.1362C60.6179 71.1362 61.9194 69.8347 61.9194 68.2292C61.9194 66.6238 60.6179 65.3223 59.0124 65.3223C57.407 65.3223 56.1055 66.6238 56.1055 68.2292C56.1055 69.8347 57.407 71.1362 59.0124 71.1362Z" fill="#6C63FF"/>
+<path d="M191.57 74.334H40.9883V74.9154H191.57V74.334Z" fill="white"/>
+<path d="M141.863 167.648H84.0137V168.229H141.863V167.648Z" fill="#E6E6E6"/>
+<path d="M141.863 173.752H84.0137V174.334H141.863V173.752Z" fill="#E6E6E6"/>
+<path d="M141.863 179.857H84.0137V180.439H141.863V179.857Z" fill="#E6E6E6"/>
+<path d="M300 191.485H0V192.067H300V191.485Z" fill="#3F3D56"/>
+<path d="M222.491 57.4082C216.759 57.4082 212.111 62.5656 212.111 68.9276V77.0106H214.597L216.036 74.0158L215.677 77.0106H231.655L232.964 74.288L232.637 77.0106H234.436V70.664C234.436 63.343 229.088 57.4082 222.491 57.4082Z" fill="#2F2E41"/>
+<path d="M222.568 178.602L227.315 191.343L233.061 194.341L228.564 178.602H222.568Z" fill="#FFB8B8"/>
+<path d="M248.801 179.601L256.046 194.34L259.793 192.092L254.297 177.103L248.801 179.601Z" fill="#FFB8B8"/>
+<path d="M220.819 74.6747C224.683 74.6747 227.814 71.5429 227.814 67.6796C227.814 63.8164 224.683 60.6846 220.819 60.6846C216.956 60.6846 213.824 63.8164 213.824 67.6796C213.824 71.5429 216.956 74.6747 220.819 74.6747Z" fill="#FFB8B8"/>
+<path d="M219.82 73.1758C219.82 73.1758 222.319 79.6712 220.82 81.42C219.321 83.1688 230.313 78.6719 230.313 78.6719C230.313 78.6719 225.566 72.926 225.816 70.4277L219.82 73.1758Z" fill="#FFB8B8"/>
+<path d="M228.566 78.1724L232.313 77.4229L236.061 72.9261C236.061 72.9261 237.81 66.6805 240.058 64.9317V64.1822C240.058 64.1822 228.566 56.6875 225.068 56.9373C225.068 56.9373 213.327 60.4349 215.575 56.9373C216.208 55.9536 217.294 55.1676 218.53 54.5458C220.305 53.6725 222.24 53.1716 224.216 53.0739C226.191 52.9761 228.166 53.2836 230.019 53.9773L246.304 59.9352C246.668 60.8135 246.834 61.7613 246.791 62.7111C246.748 63.661 246.496 64.5897 246.054 65.4314C244.555 68.4293 239.308 83.9184 239.308 83.9184C238.07 86.4319 236.986 89.0182 236.061 91.6629C234.812 95.4103 233.812 97.9085 233.812 97.9085L212.577 97.6587L214.326 89.9141C214.326 89.9141 212.577 86.6664 210.079 86.4166C210.079 86.4166 192.092 79.4215 191.342 75.1745C191.342 75.1745 191.092 73.6756 192.092 72.9261C193.091 72.1766 204.333 59.9352 204.333 59.9352C204.333 59.9352 209.33 53.4398 211.828 55.4384C214.326 57.437 207.331 62.4335 207.331 62.4335C207.331 62.4335 200.086 73.4257 199.087 74.1752C199.087 74.1752 206.082 78.4222 208.08 78.9219C210.079 79.4215 214.826 78.9219 217.074 80.9205C218.074 81.1966 219.118 81.2725 220.147 81.1439C221.176 81.0153 222.169 80.6846 223.07 80.171C226.068 78.4222 228.566 78.1724 228.566 78.1724Z" fill="#FFB8B8"/>
+<path d="M218.071 79.9207L214.324 89.9137C214.324 89.9137 211.076 92.9116 212.325 99.9067C212.325 99.9067 212.825 106.402 211.326 108.401C209.827 110.399 189.092 133.133 208.828 181.1C208.828 181.1 222.069 178.601 232.061 182.848C242.054 187.095 258.543 178.351 258.543 178.351L232.561 114.396C232.561 114.396 231.812 101.156 236.059 95.16L233.311 92.9116C233.311 92.9116 230.063 84.9172 230.563 82.419C230.563 82.419 231.562 77.4225 232.061 76.9229H230.063L227.315 83.4183C227.315 83.4183 222.818 91.9123 219.071 91.1628C215.323 90.4134 218.321 85.167 218.321 85.167L219.57 80.1706L218.071 79.9207Z" fill="#2F2E41"/>
+<path d="M233.062 192.092C233.062 192.092 227.387 189.771 226.977 190.432C226.567 191.093 224.568 195.09 224.568 195.09C224.568 195.09 216.823 203.085 223.069 204.084C229.315 205.083 230.064 201.586 230.064 201.586C230.064 201.586 230.314 201.336 231.313 201.336C232.312 201.336 236.31 199.837 236.06 199.087C235.81 198.338 233.062 192.092 233.062 192.092Z" fill="#2F2E41"/>
+<path d="M260.044 190.343C260.044 190.343 254.797 191.592 254.547 192.592C254.298 193.591 252.549 200.336 254.048 200.836C255.547 201.336 257.795 202.085 258.545 201.835C259.294 201.585 261.043 205.083 264.79 204.333C268.538 203.584 270.286 203.084 270.037 202.834C269.787 202.585 268.787 198.837 265.79 197.338C262.792 195.839 260.044 190.343 260.044 190.343Z" fill="#2F2E41"/>
+<path d="M225.442 60.5811C224.942 59.9103 224.295 59.3637 223.55 58.9836C222.805 58.6034 221.983 58.4 221.146 58.3892H220.943C217.013 58.3892 213.828 61.9446 213.828 66.3305V66.3305H215.145L215.357 64.7121L215.669 66.3305H223.478L224.132 64.9613L223.968 66.3305H225.504C226.221 69.8904 225.191 73.4503 222.414 77.0102H225.031L226.34 74.2718L226.013 77.0102H231.001L231.982 70.7119C231.982 65.995 229.241 61.9952 225.442 60.5811Z" fill="#2F2E41"/>
+<path d="M240.68 29.1514C240.68 29.1281 240.681 29.105 240.681 29.0818C240.681 27.9627 240.615 26.8445 240.484 25.7331L241.316 25.6316C241.173 24.4639 240.96 23.3058 240.678 22.1637L239.881 22.3608C239.612 21.2492 239.276 20.1549 238.875 19.084L239.623 18.7984C239.204 17.6991 238.718 16.6262 238.169 15.5857L237.478 15.9505C236.949 14.9348 236.36 13.952 235.712 13.0074L236.337 12.5739C235.666 11.6079 234.938 10.6828 234.157 9.80379L233.604 10.2952C232.847 9.43341 232.039 8.61788 231.184 7.85299L231.66 7.31484C230.778 6.53596 229.85 5.81057 228.882 5.14256L228.486 5.71648C227.544 5.05857 226.563 4.45828 225.548 3.9189L225.862 3.31974C224.819 2.77368 223.745 2.29114 222.644 1.87477L222.411 2.4889C221.337 2.076 220.238 1.72914 219.121 1.45028L219.272 0.831211C218.129 0.552643 216.97 0.343465 215.802 0.204823L215.729 0.819308C214.586 0.67822 213.436 0.605936 212.284 0.602846L212.283 0C211.107 0.00166833 209.932 0.0734284 208.765 0.214898L208.836 0.800607C207.691 0.935307 206.555 1.13969 205.435 1.41261L205.296 0.851369C204.154 1.1339 203.03 1.48548 201.931 1.90415L202.133 2.43482C201.054 2.84286 200 3.31646 198.979 3.853L198.717 3.35765C197.677 3.90663 196.671 4.51766 195.705 5.18743L196.021 5.64363C195.072 6.30005 194.164 7.01329 193.301 7.77944L192.934 7.36639C192.055 8.14791 191.223 8.98138 190.443 9.8623L190.857 10.2282C190.093 11.093 189.381 12.0033 188.727 12.9541L188.27 12.6388C187.602 13.6076 186.992 14.6157 186.445 15.6578L186.941 15.9179C186.407 16.9411 185.936 17.996 185.53 19.0766L184.999 18.8758C184.583 19.9771 184.234 21.1028 183.954 22.2465L184.515 22.3838C184.245 23.5046 184.044 24.6408 183.912 25.7862L183.326 25.7164C183.188 26.8748 183.119 28.0403 183.119 29.2068V29.2343L183.723 29.2229C183.728 30.3784 183.803 31.5326 183.946 32.6792L183.333 32.7535C183.474 33.9214 183.686 35.0796 183.967 36.222L184.586 36.0696C184.868 37.1851 185.217 38.2824 185.632 39.3553L185.018 39.5889C185.437 40.6885 185.922 41.7617 186.47 42.8028L187.069 42.4873C187.61 43.5001 188.212 44.4791 188.872 45.4192L188.299 45.816C188.969 46.7827 189.696 47.7084 190.476 48.5883L191.014 48.1115C191.78 48.9647 192.598 49.7711 193.461 50.5263L192.971 51.0796C193.852 51.8596 194.779 52.5859 195.747 53.2548L196.179 52.6292C197.125 53.2746 198.11 53.8623 199.127 54.389L198.764 55.0806C199.807 55.6276 200.881 56.1112 201.982 56.5285L202.266 55.7793C203.338 56.1785 204.434 56.5121 205.547 56.7783L205.352 57.5752C206.495 57.8549 207.653 58.0653 208.821 58.2052L208.921 57.3727C210.01 57.4981 211.105 57.5613 212.201 57.5618C212.247 57.5618 212.293 57.5602 212.34 57.56L212.34 58.4134C213.516 58.4128 214.691 58.3421 215.859 58.2018L215.755 57.3414C216.887 57.2002 218.01 56.9908 219.117 56.7142L219.328 57.5687C220.47 57.2872 221.595 56.9367 222.695 56.5192L222.379 55.6872C223.444 55.2795 224.483 54.8078 225.491 54.2747L225.909 55.0691C226.95 54.5211 227.957 53.911 228.924 53.242L228.41 52.4998C229.347 51.8502 230.244 51.1451 231.096 50.3884L231.697 51.0658C232.577 50.2851 233.409 49.4525 234.19 48.5724L233.512 47.9721C234.269 47.1191 234.974 46.2216 235.624 45.2844L236.366 45.7977C237.035 44.8296 237.645 43.8221 238.193 42.7807L237.399 42.363C237.932 41.3541 238.403 40.3141 238.811 39.2484L239.643 39.564C240.06 38.4631 240.41 37.3379 240.691 36.1946L239.837 35.9848C240.113 34.8775 240.322 33.7545 240.462 32.622L241.323 32.7254C241.462 31.5577 241.533 30.3828 241.533 29.2068V29.1514L240.68 29.1514Z" fill="#F3F3F3"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="300" height="204.439" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/desktop/share/images/open_folder.png b/desktop/share/images/open_folder.png
new file mode 100644
index 00000000..0a734c41
--- /dev/null
+++ b/desktop/share/images/open_folder.png
Binary files differ
diff --git a/desktop/share/images/persistent_enabled.png b/desktop/share/images/persistent_enabled.png
new file mode 100644
index 00000000..6c295db5
--- /dev/null
+++ b/desktop/share/images/persistent_enabled.png
Binary files differ
diff --git a/desktop/share/images/receive_icon_toggle.png b/desktop/share/images/receive_icon_toggle.png
new file mode 100644
index 00000000..846ececb
--- /dev/null
+++ b/desktop/share/images/receive_icon_toggle.png
Binary files differ
diff --git a/desktop/share/images/receive_icon_toggle_selected.png b/desktop/share/images/receive_icon_toggle_selected.png
new file mode 100644
index 00000000..127ce208
--- /dev/null
+++ b/desktop/share/images/receive_icon_toggle_selected.png
Binary files differ
diff --git a/desktop/share/images/receive_icon_transparent.png b/desktop/share/images/receive_icon_transparent.png
new file mode 100644
index 00000000..99207097
--- /dev/null
+++ b/desktop/share/images/receive_icon_transparent.png
Binary files differ
diff --git a/desktop/share/images/server_started.png b/desktop/share/images/server_started.png
new file mode 100644
index 00000000..9c0c3176
--- /dev/null
+++ b/desktop/share/images/server_started.png
Binary files differ
diff --git a/desktop/share/images/server_stopped.png b/desktop/share/images/server_stopped.png
new file mode 100644
index 00000000..5c5b2ec0
--- /dev/null
+++ b/desktop/share/images/server_stopped.png
Binary files differ
diff --git a/desktop/share/images/server_working.png b/desktop/share/images/server_working.png
new file mode 100644
index 00000000..e5c8b318
--- /dev/null
+++ b/desktop/share/images/server_working.png
Binary files differ
diff --git a/desktop/share/images/settings.png b/desktop/share/images/settings.png
new file mode 100644
index 00000000..b6f8fa55
--- /dev/null
+++ b/desktop/share/images/settings.png
Binary files differ
diff --git a/desktop/share/images/share_icon_toggle.png b/desktop/share/images/share_icon_toggle.png
new file mode 100644
index 00000000..87303c9f
--- /dev/null
+++ b/desktop/share/images/share_icon_toggle.png
Binary files differ
diff --git a/desktop/share/images/share_icon_toggle_selected.png b/desktop/share/images/share_icon_toggle_selected.png
new file mode 100644
index 00000000..0ba52cff
--- /dev/null
+++ b/desktop/share/images/share_icon_toggle_selected.png
Binary files differ
diff --git a/desktop/share/images/share_icon_transparent.png b/desktop/share/images/share_icon_transparent.png
new file mode 100644
index 00000000..3648c3fb
--- /dev/null
+++ b/desktop/share/images/share_icon_transparent.png
Binary files differ
diff --git a/desktop/share/locale/af.json b/desktop/share/locale/af.json
new file mode 100644
index 00000000..c9e641f5
--- /dev/null
+++ b/desktop/share/locale/af.json
@@ -0,0 +1,183 @@
+{
+ "preparing_files": "Pers lêers saam.",
+ "not_a_readable_file": "{0:s} is nie ’n leesbare lêer nie.",
+ "no_available_port": "Kon geen beskikbare poort vind om die uidiens te begin nie",
+ "other_page_loaded": "Adres gelaai",
+ "incorrect_password": "Verkeerde wagwoord",
+ "close_on_autostop_timer": "Gestop omdat outo-stoptydhouer afgeloop het",
+ "closing_automatically": "Gestop omdat die oordrag klaar is",
+ "large_filesize": "Waarskuwing: die stuur van ’n groot lêer kan ure duur",
+ "gui_drag_and_drop": "Sleep-en-los lêers en vouers\nom te begin deel",
+ "gui_add": "Voeg Toe",
+ "gui_add_files": "Voeg Lêers Toe",
+ "gui_add_folder": "Voeg Vouer Toe",
+ "gui_delete": "Skrap",
+ "gui_choose_items": "Kies",
+ "gui_share_start_server": "Begin deel",
+ "gui_share_stop_server": "Staak deel",
+ "gui_share_stop_server_autostop_timer": "Staak Deel ({})",
+ "gui_stop_server_autostop_timer_tooltip": "Outo-stoptydhouer eindig om {}",
+ "gui_start_server_autostart_timer_tooltip": "Outo-begintydhouer eindig om {}",
+ "gui_receive_start_server": "Begin Ontvangmodus",
+ "gui_receive_stop_server": "Staak Ontvangmodus",
+ "gui_receive_stop_server_autostop_timer": "Staak Ontvangmodus ({} oorblywend)",
+ "gui_copy_url": "Kopieer Adres",
+ "gui_copy_hidservauth": "Kopieer HidServAuth",
+ "gui_canceled": "Gekanselleer",
+ "gui_copied_url_title": "OnionShare-adres Gekopieer",
+ "gui_copied_url": "OnionShare-adres na knipbord gekopieer",
+ "gui_copied_hidservauth_title": "HidServAuth Gekopieer",
+ "gui_copied_hidservauth": "HidServAuth-reël na knipbord gekopieer",
+ "gui_waiting_to_start": "Geskeduleer om oor {} te begin. Klik om te kanselleer.",
+ "gui_please_wait": "Begin… Klik om te kanselleer.",
+ "gui_quit_title": "Nie so haastig nie",
+ "gui_share_quit_warning": "U is besig om lêers te verstuur. Is u seker u wil OnionShare afsluit?",
+ "gui_receive_quit_warning": "U is besig om lêers te ontvang. Is u seker u wil OnionShare afsluit?",
+ "gui_quit_warning_quit": "Sluit Af",
+ "gui_quit_warning_dont_quit": "Kanselleer",
+ "error_rate_limit": "Iemand het te veel verkeerde raaiskote met u wagwoord probeer, daarom het OnionShare die bediener gestaak. Begin weer deel en stuur ’n nuwe adres aan die ontvanger.",
+ "zip_progress_bar_format": "Samepersing: %p%",
+ "error_stealth_not_supported": "U benodig ten minste Tor 0.2.6.1-alfa (of TorBrowser 6.5) en python3-stem 1.5.0 om kliënt-magtiging te gebruik.",
+ "error_ephemeral_not_supported": "OnionShare vereis ten minste Tor 0.2.7.1 en python3-stem 1.4.0.",
+ "gui_settings_window_title": "Instellings",
+ "gui_settings_whats_this": "<a href='{0:s}'>Wat is dit?</a>",
+ "gui_settings_stealth_option": "Gebruik kliëntmagtiging",
+ "gui_settings_stealth_hidservauth_string": "Deur u privaat sleutel vir herbruik bewaar te hê kan u nou klik om u HidServAuth te kopieer.",
+ "gui_settings_autoupdate_label": "Soek na nuwe weergawe",
+ "gui_settings_autoupdate_option": "Laat my weet wanneer ’n nuwe weergawe beskikbaar is",
+ "gui_settings_autoupdate_timestamp": "Laas gesoek: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nooit",
+ "gui_settings_autoupdate_check_button": "Soek na Nuwe Weergawe",
+ "gui_settings_general_label": "Algemene instellings",
+ "gui_settings_onion_label": "Ui-instellings",
+ "gui_settings_sharing_label": "Deelinstellings",
+ "gui_settings_close_after_first_download_option": "Staak deel nadat lêers verstuur is",
+ "gui_settings_csp_header_disabled_option": "Deaktiveer Inhoudsekuriteitsbeleidkop",
+ "gui_settings_individual_downloads_label": "Merk af om aflaai van individuele lêers toe te staan",
+ "gui_settings_connection_type_label": "Hoe moet OnionShare aan Tor koppel?",
+ "gui_settings_connection_type_bundled_option": "Gebruik die Tor-weergawe wat by OnionShare ingebou is",
+ "gui_settings_connection_type_automatic_option": "Probeer outo-opstelling met Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Koppel d.m.v. kontrolepoort",
+ "gui_settings_connection_type_socket_file_option": "Koppel d.m.v. soklêer",
+ "gui_settings_connection_type_test_button": "Toets Tor-koppeling",
+ "gui_settings_control_port_label": "Kontrolepoort",
+ "gui_settings_socket_file_label": "Soklêer",
+ "gui_settings_socks_label": "SOCKS-poort",
+ "gui_settings_authenticate_label": "Tormagtiginginstellings",
+ "gui_settings_authenticate_no_auth_option": "Geen magtiging of koekiemagtiging",
+ "gui_settings_authenticate_password_option": "Wagwoord",
+ "gui_settings_password_label": "Wagwoord",
+ "gui_settings_tor_bridges": "Tor-brugondersteuning",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Moenie brûe gebruik nie",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Gebruik ingeboude obfs4-inpropbare vervoere",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Gebruik ingeboude obfs4-inpropbare vervoere (vereis obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Gebruik ingeboude meek_lite (Azure)-inpropbare vervoere",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Gebruik ingeboude meek_lite (Azure)-inpropbare vervoere (vereis obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Waarskuwing: Die meek_lite-brûe is baie duur vir die Tor-projek om uit te voer.<br><br>Gebruik dit slegs indien u nie direk aan Tor, d.m.v. obfs4-vervoere, of ander normale brûe kan koppel nie.",
+ "gui_settings_tor_bridges_custom_radio_option": "Gebruik pasgemaakte brûe",
+ "gui_settings_tor_bridges_custom_label": "U kan brûe vanaf <a href=\"https://bridges.torproject.org/options?lang=af\">https://bridges.torproject.org</a> verkry",
+ "gui_settings_tor_bridges_invalid": "Geen van u toegevoegde brûe werk nie.\nGaan dit na of voeg ander toe.",
+ "gui_settings_button_save": "Bewaar",
+ "gui_settings_button_cancel": "Kanselleer",
+ "gui_settings_button_help": "Help",
+ "gui_settings_autostop_timer_checkbox": "Gebruik outo-stoptydhouer",
+ "gui_settings_autostop_timer": "Staak die deel om:",
+ "gui_settings_autostart_timer_checkbox": "Gebruik outo-begintydhouer",
+ "gui_settings_autostart_timer": "Begin die deel om:",
+ "settings_error_unknown": "Kan nie aan Tor-kontroleur koppel nie omdat u instellings onsinnig is.",
+ "settings_error_automatic": "Kon nie aan die Tor-kontroleur koppel nie. Loop Tor Browser (beskikbaar by torproject.org) in die agtergrond?",
+ "settings_error_socket_port": "Kan nie aan die Tor-kontroleur by {}:{} koppel nie .",
+ "settings_error_socket_file": "Kan nie aan die Tor-kontroleur d.m.v. soklêer {} koppel nie.",
+ "settings_error_auth": "Gekoppel aan {}:{} maar kan nie magtig nie. Miskien is die nie ’n Tor-kontroleur nie?",
+ "settings_error_missing_password": "Gekoppel aan Tor-kontroleur, maar dit vereis ’n wagwoord om te magtig.",
+ "settings_error_unreadable_cookie_file": "Gekoppel aan die Tor-kontroleur, maar wagwoord is dalk verkeerd of u gebruiker mag nie die koekielêer lees nie.",
+ "settings_error_bundled_tor_not_supported": "Die Tor-weergawe wat met OnionShare verskeep word werk nie in ontwikkelaarsmodus op Windows of macOS nie.",
+ "settings_error_bundled_tor_timeout": "Vat te lank om aan Tor te koppel. Miskien is u nie aan die Internet gekoppel nie of u stelselhorlosie is onakkuraat?",
+ "settings_error_bundled_tor_broken": "OnionShare kon nie in die agtergrond aan Tor koppel nie:\n{}",
+ "settings_test_success": "Gekoppel aan die Tor-kontroleur:\n\nTor-weergawe: {}\nSteun efemere uidienste: {}.\nSteun kliëntmagtiging: {}.\nSteun nuwegenerasie-.onionadresse: {}.",
+ "error_tor_protocol_error": "Daar was ’n fout met Tor: {}",
+ "error_tor_protocol_error_unknown": "Daar was ’n onbekende fout met Tor",
+ "connecting_to_tor": "Koppel tans aan die Tor-netwerk",
+ "update_available": "Nuwe OnionShare is beskikbaar. <a href='{}'>Klik hier</a> om dit te kry.<br><br>U gebruik {} en die nuutste is {}.",
+ "update_error_check_error": "Kon nie na nuwe weergawe soek nie: die OnionShare-webwerf sê dat die nuutste weergawe die onherkenbare ‘{}’ is…",
+ "update_error_invalid_latest_version": "Kon nie na die nuwe weergawe soek nie. U is dalk nie aan Tor gekoppel nie of die OnionShare-webwerf is vanlyn.",
+ "update_not_available": "U gebruik die nuutste OnionShare.",
+ "gui_tor_connection_ask": "Open die instellings om Tor-koppeling op te los?",
+ "gui_tor_connection_ask_open_settings": "Ja",
+ "gui_tor_connection_ask_quit": "Sluit Af",
+ "gui_tor_connection_error_settings": "Probeer in die instellings verander hoe OnionShare aan die Tor-netwerk koppel.",
+ "gui_tor_connection_canceled": "Kon nie aan Tor koppel nie.\n\nMaak seker u is aan die Internet gekoppel, open OnionShare dan weer en stel die Tor-koppeling weer op.",
+ "gui_tor_connection_lost": "Ontkoppel van Tor.",
+ "gui_server_started_after_autostop_timer": "Die outo-stoptydhouer het afgeloop voor die bediener kon begin. Skep ’n nuwe deel.",
+ "gui_server_autostop_timer_expired": "Die outo-stoptydhouer het reeds afgeloop. Pas dit aan om te begin deel.",
+ "gui_server_autostart_timer_expired": "Die geskeduleerde tyd is verstreke. Verstel dit om met deel te begin met.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Die outo-stoptyd kan nie dieselfde of vroeër as die outo-begintyd wees nie. Pas dit aan om te begin deel.",
+ "share_via_onionshare": "Deel d.m.v. OnionShare",
+ "gui_connect_to_tor_for_onion_settings": "Koppel aan Tor om uidiensinstellings te sien",
+ "gui_use_legacy_v2_onions_checkbox": "Gebruik argaïese adresse",
+ "gui_save_private_key_checkbox": "Gebruik ’n blywende adres",
+ "gui_share_url_description": "<b>Enigeen</b> met hierdie OnionShare-adres kan u lêers d.m.v. die <b>Tor Browser aflaai</b>: <img src=\"{}\"/>",
+ "gui_website_url_description": "<b>Enigeen</b> met hierdie OnionShare-adres kan u webwerf d.m.v. die <b>Tor Browser besoek</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Enigeen</b> met hierdie OnionShare-adres kan lêers d.m.v. die <b>Tor Browser</b> na u rekenaar <b>oplaai</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Hierdie deel sal nie self stop nie.<br><br>Elke opvolgende deel hergebruik die adres. (Deaktiveer “Gebruik ’n blywende adres” in die instellings om eenmalige adresse te gebruik.)",
+ "gui_url_label_stay_open": "Hierdie deel sal nie self stop nie.",
+ "gui_url_label_onetime": "Hierdie deel sal stop na eerste voltooiing.",
+ "gui_url_label_onetime_and_persistent": "Hierdie deel sal nie self stop nie.<br><br>Elke opvolgende deel sal die adres hergebruik. (Deaktiveer “Gebruik ’n blywende adres” in die instellings om eenmalige adresse te gebruik.)",
+ "gui_status_indicator_share_stopped": "Gereed om te deel",
+ "gui_status_indicator_share_working": "Begin…",
+ "gui_status_indicator_share_scheduled": "Geskeduleer…",
+ "gui_status_indicator_share_started": "Deel tans",
+ "gui_status_indicator_receive_stopped": "Gereed om te ontvang",
+ "gui_status_indicator_receive_working": "Begin…",
+ "gui_status_indicator_receive_scheduled": "Geskeduleer…",
+ "gui_status_indicator_receive_started": "Ontvang tans",
+ "gui_file_info": "{} lêers, {}",
+ "gui_file_info_single": "{} lêer, {}",
+ "history_in_progress_tooltip": "{} besig",
+ "history_completed_tooltip": "{} afgehandel",
+ "history_requests_tooltip": "{} webversoeke",
+ "error_cannot_create_data_dir": "Kon nie OnionShare-datavouer skep nie: {}",
+ "gui_receive_mode_warning": "Ontvangsmodus laat ander mense lêers op u rekenaar plaas.<br><br><b>Sommige van die lêers kan moontlik u rekenaar oorneem indien u dit open. Open slegs lêers van mense wat u vertrou of indien u weet wat u doen.</b>",
+ "gui_mode_share_button": "Deel Lêers",
+ "gui_mode_receive_button": "Ontvang Lêers",
+ "gui_mode_website_button": "Publiseer Webwerf",
+ "gui_settings_receiving_label": "Ontvangsinstellings",
+ "gui_settings_website_label": "Webwerfinstellings",
+ "gui_settings_data_dir_label": "Bewaar lêers na",
+ "gui_settings_data_dir_browse_button": "Blaai",
+ "gui_settings_public_mode_checkbox": "Openbaarmodus",
+ "gui_open_folder_error_nautilus": "Kan nie vouer oopmaak nie want nautilus is onbeskikbaar. Die lêer is hier: {}",
+ "gui_settings_language_label": "Voorkeurtaal",
+ "gui_settings_language_changed_notice": "Herbegin OnionShare om die nuwe taal te gebruik.",
+ "systray_menu_exit": "Sluit Af",
+ "systray_page_loaded_title": "Bladsy Gelaai",
+ "systray_page_loaded_message": "OnionShare-adres gelaai",
+ "systray_share_started_title": "Deel het Begin",
+ "systray_share_started_message": "Begin lêers aan iemand stuur",
+ "systray_share_completed_title": "Deel is Afgehandel",
+ "systray_share_completed_message": "Lêers klaar gestuur",
+ "systray_share_canceled_title": "Deel is Gekanselleer",
+ "systray_share_canceled_message": "Iemand het ontvangs van u lêers gekanselleer",
+ "systray_receive_started_title": "Ontvang het Begin",
+ "systray_receive_started_message": "Iemand stuur lêers aan u",
+ "gui_all_modes_history": "Geskiedenis",
+ "gui_all_modes_clear_history": "Wis Alles",
+ "gui_all_modes_transfer_started": "Begin {}",
+ "gui_all_modes_transfer_finished_range": "Oorgedra {} - {}",
+ "gui_all_modes_transfer_finished": "Oorgedra {}",
+ "gui_all_modes_transfer_canceled_range": "Gekanselleer {} - {}",
+ "gui_all_modes_transfer_canceled": "Gekanselleer {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} verstreke.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (bereken tans)",
+ "gui_all_modes_progress_eta": "{0:s}, Verwagte Aankomstyd: {1:s}, %p%",
+ "gui_share_mode_no_files": "Nog Geen Lêers Gestuur Nie",
+ "gui_share_mode_autostop_timer_waiting": "Wag om klaar te stuur",
+ "gui_website_mode_no_files": "Nog Geen Webwerf Gedeel Nie",
+ "gui_receive_mode_no_files": "Nog Geen Lêers Ontvang Nie",
+ "gui_receive_mode_autostop_timer_waiting": "Wag om klaar te ontvang",
+ "receive_mode_upload_starting": "Oplaai van totale grootte {} begin",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
+}
diff --git a/desktop/share/locale/am.json b/desktop/share/locale/am.json
new file mode 100644
index 00000000..b787a617
--- /dev/null
+++ b/desktop/share/locale/am.json
@@ -0,0 +1,185 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/ar.json b/desktop/share/locale/ar.json
new file mode 100644
index 00000000..f1451cc7
--- /dev/null
+++ b/desktop/share/locale/ar.json
@@ -0,0 +1,237 @@
+{
+ "config_onion_service": "تثبيت خدمة onion على المنفذ {0:d}.",
+ "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 service",
+ "other_page_loaded": "تم تحميل العنوان",
+ "close_on_autostop_timer": "تمّ الإيقاف بسبب بلوغ مؤقت الإيقاف أجله",
+ "closing_automatically": "تم الإيقاف بسبب تمام النقل",
+ "timeout_download_still_running": "انتظار اكتمال التحميل",
+ "large_filesize": "تحذير: رفع مشاركة كبيرة قد يستغرق ساعات",
+ "systray_menu_exit": "أنهِ",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "اكمل المستخدم تحميل الملفات",
+ "systray_download_canceled_title": "تم الغاء التحميل",
+ "systray_download_canceled_message": "الغى المستخدم التحميل",
+ "systray_upload_started_title": "بدأ الرفع",
+ "systray_upload_started_message": "بدأ مستخدم رفع ملفات الى حاسوبك",
+ "help_local_only": "لا تستخدم تور (فقط لغرض التطوير)",
+ "help_stay_open": "استمر في المشاركة بعد اول تحميل",
+ "help_autostop_timer": "أوقف المشاركة بعد ثواني محددة",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "قائمة الملفات أو المجلدات للمشاركة",
+ "help_config": "",
+ "gui_drag_and_drop": "اسحب الملفات و الأدلة و أسقطها\nلبدء رفعها لمشاركتها",
+ "gui_add": "أضِف",
+ "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": "انسخ 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_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "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": "لاستعمال استيثاق العميل تلزمك إصدارة تور ‪0.2.9.1-alpha‬ أو (متصفّح تور 6.5) و python3-stem الإصدارة 1.5.0، أو ما بعدها.",
+ "error_ephemeral_not_supported": "يتطلّب OnionShare كلّا من إصدارة تور 0.2.7.1 و الإصدارة 1.4.0 من python3-stem.",
+ "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_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_socket_file_option": "عبر ملف مقبس",
+ "gui_settings_connection_type_test_button": "اختبر الاتصال بشبكة تور",
+ "gui_settings_control_port_label": "منفذ التحكم",
+ "gui_settings_socket_file_label": "ملف المقبس",
+ "gui_settings_socks_label": "منفذ SOCKS",
+ "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": "باستخدام وسائل نقل 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 يكلّف مشروع تور للغاية..<br><br>استخدمها عند الضرورة فقط لتعذّر الاتّصال بتور مباشرة، أو عبر وسائل نقل 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": "أوقف المشاركة في:",
+ "settings_error_unknown": "تعذّر الاتصال بمتحكّم تور لأنّ تضبيطاتك غير صحيحة.",
+ "settings_error_automatic": "تعذّر الاتّصال بمتحكم تور. تأكد من اشتغال متصفّح تور في الخلفية (و هو متاح في torproject.org)",
+ "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": "استعمال إصدارة تور المضمّنة في OnionShare لا يعمل في طور التطوير في وِندوز و لا ماك أوإس.",
+ "settings_error_bundled_tor_timeout": "استغرق الاتّصال بتور وقتا أطول من اللازم. إمّا أنك غير متصّل بالإنترنت أو أنّ ساعة النظام غير مضبوطة.",
+ "settings_error_bundled_tor_broken": "تعذّر على OnionShare الاتصّال بتور في الخلفية:\n{}",
+ "settings_test_success": "تمّ الاتّصال بمتحكّم تور:\n\nإصدارة تور: {}\nيدعم خدمات تور الزائلة: {}\nيدعم استيثاق العميل: {}\nيدعم الجيل الأحدث من عناوين ‪.onion‬: {}",
+ "error_tor_protocol_error": "ثمّة عطل في تور: {}",
+ "error_tor_protocol_error_unknown": "طرأ عطل مجهول في تور",
+ "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_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>تنزيل</b> تلك الملفات باستعمال <b>متصفّح تور</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>أيّ شخص</b> لديه مسار OnionShare هذا سيكون بوسعه <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_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": "طور التلقّي يسمح للآخرين برفع ملفات إلى حاسوبك.<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": "الطور العلني",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "تم تحميل الصفحة",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": "أعد تشغيل OnionShare لتطبيق خيار اللغة الجديد.",
+ "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": "في انتظار إتمام التلقّي",
+ "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": "تمّت الجدولة…",
+ "error_cannot_create_data_dir": "تعذَّر إنشاء دليل بيانات OnionShare: {}",
+ "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%",
+ "days_first_letter": "يوم",
+ "hours_first_letter": "ساعة",
+ "minutes_first_letter": "دقيقة",
+ "seconds_first_letter": "ثانية",
+ "gui_website_url_description": "<b>أى شخص</b> معه مسار OnionsShare هذا سيكون بامكانه <b>زيارة</b> موقعك باستخدام <b>متصفح تور</b>: <img src='{}' />",
+ "gui_mode_website_button": "قم بإصدار الموقع",
+ "gui_website_mode_no_files": "لا يوجد موقع تمت مشاركته حتى الآن",
+ "incorrect_password": "كلمة السر غير صحيحة",
+ "gui_settings_individual_downloads_label": "ازل لتسمح بتحميل الملفات فرادى",
+ "history_requests_tooltip": "{} طلب من الويب",
+ "gui_settings_csp_header_disabled_option": "أوقف حماية Content Security Policy",
+ "gui_settings_website_label": "اعدادات الموقع"
+}
diff --git a/desktop/share/locale/bg.json b/desktop/share/locale/bg.json
new file mode 100644
index 00000000..9abe5623
--- /dev/null
+++ b/desktop/share/locale/bg.json
@@ -0,0 +1,185 @@
+{
+ "config_onion_service": "Създаване на onion услуга на порт {0:d}.",
+ "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": "Изчакване на свалянето да приключи",
+ "timeout_upload_still_running": "Изчакване ъплоудът да приключи",
+ "large_filesize": "Предупреждение: изпращане на голям дял може да отнеме часове",
+ "systray_menu_exit": "Изход",
+ "systray_download_started_title": "OnionShare сваляне започна",
+ "systray_download_started_message": "Потребител започна да сваля файловете Ви",
+ "systray_download_completed_title": "OnionShare свалянето приключи",
+ "systray_download_completed_message": "Потребителят приключи с изтегляне на Вашите файлове",
+ "systray_download_canceled_title": "OnionShare сваляне е отменено",
+ "systray_download_canceled_message": "Потребителят отмени свалянето",
+ "systray_upload_started_title": "OnionShare ъплоуд започна",
+ "systray_upload_started_message": "Ползвател започна да ъплоудва файлове на компютъра Ви",
+ "help_local_only": "Не използвайте Тор (само за разработване)",
+ "help_stay_open": "Продължи споделянето след първото изтегляне",
+ "help_autostop_timer": "Спри споделянето след дадено количество секунди",
+ "help_stealth": "Използвай клиент авторизация (напреднал)",
+ "help_receive": "Получаване на дялове вместо изпращане",
+ "help_verbose": "Протоколирай OnionShare грешки на stdout и уеб грешки на диск",
+ "help_filename": "Списък на документи или папки за споделяне",
+ "help_config": "Персонализирано местоположение на JSON конфигурационен файл (незадължително)",
+ "gui_drag_and_drop": "Плъзнете и пуснете файлове и папки, \nза да започнете споделяне",
+ "gui_add": "Добавете",
+ "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": "Копирайте 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_download_upload_progress_complete": "%p%, {0:s} изтече.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (изчисляване)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "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 (или на браузъра 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_sharing_label": "Настройки на споделяне",
+ "gui_settings_close_after_first_download_option": "Спри споделянето след първото изтегляне",
+ "gui_settings_connection_type_label": "Как OnionShare да се свържe с Тор?",
+ "gui_settings_connection_type_bundled_option": "Използвай Тор версия, вградена в OnionShare",
+ "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": "SOCKS порт",
+ "gui_settings_authenticate_label": "Настройки на Тор за удостоверяване на автентичността",
+ "gui_settings_authenticate_no_auth_option": "Без автентикация или cookie автентикация",
+ "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": "Използвайте вградените obfs4 pluggable транспорти",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Използвайте вградените obfs4 pluggable транспорти (изисква obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Използвайте вградените meek_lite (Azure) pluggable транспорти",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Използвайте вградените meek_lite (Azure) pluggable транспорти (изискват obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Предупреждение: meek_lite мостовета са много скъпи за проекта Тор. <br> <br> Използвайте ги само, ако не можете да се свържете пряко чрез obfs4 транспорти или други нормални мостове с Тор.",
+ "gui_settings_tor_bridges_custom_radio_option": "Използвайте персонализирани мостове",
+ "gui_settings_tor_bridges_custom_label": "Може да намерите мостове на <a href=\"https://bridges.torproject.org/options?lang=bg\">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": "Спри дела на:",
+ "settings_error_unknown": "Не мога да се свържа с Тор контролера, защото Вашите настройки не правят смисъл.",
+ "settings_error_automatic": "Не мога да се свържа с Тор контролера. Стартиран ли е Тор браузерът във фонов режим (достъпен от torproject. org)?",
+ "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": "Използване на Тор версия, идваща с OnionShare не работи в режим на разработчик под Windows или macOS.",
+ "settings_error_bundled_tor_timeout": "Oтнема прекалено дълго време да се свържа с Тор. Може би не сте свързани с интернет или системният часовник е неточен?",
+ "settings_error_bundled_tor_broken": "OnionShare не можа да се свърже с Тор във фонов режим:\n{}",
+ "settings_test_success": "Свързан с Тор контролер.\n\nТор версия: {}\nПоддържа ephemeral onion services: {}\nПоддържа клиент автентикация: {}\nПоддържа следваща генерация .onion адреси: {}",
+ "error_tor_protocol_error": "Станала е грешка с Тор: {}",
+ "error_tor_protocol_error_unknown": "Имаше неизвестена грешка с Тор",
+ "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_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> с този OnionShare адрес може да <b>свали</b> Вашите файлове използвайки <b>Тор браузера</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Всеки</b> с този OnionShare адрес може да <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_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": "Режим на приемане позволява на хора да качват файлове на Вашия компютър.<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_public_mode_checkbox": "Публичен режим",
+ "systray_close_server_title": "OnionShare сървърът приключи",
+ "systray_close_server_message": "Един ползвател затвори сървъра",
+ "systray_page_loaded_title": "OnionShare страницата е заредена",
+ "systray_download_page_loaded_message": "Един ползвател зареди свалената страница",
+ "systray_upload_page_loaded_message": "Един ползвател зареди ъплоуд страницата",
+ "gui_uploads": "Ъплоуд история",
+ "gui_no_uploads": "Все още няма качвания",
+ "gui_clear_history": "Изтрий всичко",
+ "gui_upload_in_progress": "Качването започна",
+ "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."
+}
diff --git a/desktop/share/locale/bn.json b/desktop/share/locale/bn.json
new file mode 100644
index 00000000..7d43b3bb
--- /dev/null
+++ b/desktop/share/locale/bn.json
@@ -0,0 +1,267 @@
+{
+ "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": "অনিয়ন সার্ভিস চালু করার জন্য কোন পোর্ট পাওয়া যাচ্ছে না",
+ "other_page_loaded": "ঠিকানা লোড হয়েছে",
+ "close_on_autostop_timer": "বন্ধ হয়ে গিয়েছে, কারণ অটো-স্টপ টাইমার এর সময় শেষ",
+ "closing_automatically": "ট্রান্সফার শেষ, তাই থেমে যাওয়া হলো",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "সতর্কতা: বড় ফাইল পাঠাতে গেলে অনেক সময় লাগতে পারে",
+ "systray_menu_exit": "করুন",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "help_local_only": "Tor ব্যবহার করবে না (শুধুমাত্র ডেভেলপারদের জন্য)",
+ "help_stay_open": "ফাইলগুলো পাঠানো হয়ে গেলেও শেয়ার করা থামিও না",
+ "help_autostop_timer": "নির্দিষ্ট সেকেন্ডের পর শেয়ার করা বন্ধ করে দিও",
+ "help_stealth": "ক্লায়েন্ট অনুমোদন ব্যবহার করুন (উন্নততর)",
+ "help_receive": "কোনকিছু শেয়ার না করে শুধু গ্রহণ করবে",
+ "help_verbose": "OnionShare-এর এররগুলো stdout-এ দেখাও, আর ওয়েব এররগুলো ডিস্কে লগ করো",
+ "help_filename": "শেয়ার করার জন্য ফাইল বা ফোল্ডারের লিস্ট",
+ "help_config": "কাস্টম JSON কনফিগারেশন ফাইলের লোকেশন (যদি থাকে)",
+ "gui_drag_and_drop": "শেয়ার করা শুরু করতে\nফাইল এবং ফোল্ডারগুলো টেনে ছেড়ে দাও",
+ "gui_add": "যোগ করো",
+ "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_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_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "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 (or Tor Browser 6.5) এবং python3-stem 1.5.0 দুটোই থাকতে হবে।",
+ "error_ephemeral_not_supported": "OnionShare ব্যবহার করার জন্য Tor 0.2.9.1-alpha (or Tor Browser 6.5) এবং python3-stem 1.5.0 দুটোই থাকতে হবে।",
+ "gui_settings_window_title": "সেটিংস",
+ "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_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 কিভাবে টর এর সাথে কানেক্ট করবে?",
+ "gui_settings_connection_type_bundled_option": "OnionShare-এর ভিতরে থাকা নিজস্ব টরটি ব্যবহার করো",
+ "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": "SOCKS পোর্ট",
+ "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": "নিজস্ব 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 Project-এর জন্য অনেক ব্যয়বহুল।<br><br>এগুলো তখনই ব্যবহার করো যখন Tor-এ সরাসরি কানেক্ট করতে পারছো না, obfs4 ট্রান্সপোর্ট দিয়ে, অথবা অন্যান্য সাধারণ ব্রিজ দিয়ে।",
+ "gui_settings_tor_bridges_custom_radio_option": "কাস্টম ব্রিজ ব্যবহার করো",
+ "gui_settings_tor_bridges_custom_label": "ব্রিজ পেতে চাইলে <a href=\"https://bridges.torproject.org/options?lang=bn\">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": "শেয়ার বন্ধ করো:",
+ "settings_error_unknown": "টর নিয়ন্ত্রকের সাথে সংযোগ করা যায় না কারণ তোমার বিন্যাসসমূহ বোধগম্য নয়।",
+ "settings_error_automatic": "টর নিয়ন্ত্রকের সাথে সংযোগ স্থাপন করা যায়নি । টর ব্রাউজার (torproject.org থেকে পাওয়া যায়) ব্রাকগ্রাউন্ডে কি চলমান?",
+ "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": "OnionShare এর সাথে আসা টর সংস্করণটি উইন্ডোজ বা ম্যাক এ ডেভেলপার মোডে কাজ করে না।",
+ "settings_error_bundled_tor_timeout": "টর সাথে সংযোগ করার জন্য খুব বেশি সময় লাগছে। হয়তো তুমি ইন্টারনেটের সাথে সংযুক্ত নন, অথবা তোমার কম্পিউটারের সময় ঠিক নেই?",
+ "settings_error_bundled_tor_broken": "OnionShare টর এর সাথে কানেক্ট করতে পারছে না:\n{}",
+ "settings_test_success": "টর নিয়ন্ত্রকের সঙ্গে যুক্ত হয়েছে।\n\nটর সংস্করণ: {}\nঅস্থায়ী অনিয়ন ঠিকানা সমর্থন করে: {}.\nক্লায়েন্ট অথেনটিকেশন সমর্থন করে: {}.\n৩য় প্রজন্মের অনিয়ন ঠিকানাগুলো(৫৬ অক্ষর) সমর্থন করে: {} .",
+ "error_tor_protocol_error": "টরে একটি ত্রুটি ছিল: {}",
+ "error_tor_protocol_error_unknown": "টরে একটি অজানা ত্রুটি আছে",
+ "error_invalid_private_key": "এই ব্যক্তিগত কী ধরন টি অসমর্থিত",
+ "connecting_to_tor": "টর নেটওয়ার্কে যুক্ত হচ্ছে",
+ "update_available": "নতুন OnionShare সংস্করণ বের হয়েছে। এটি পেতে এখানে <a href='{}'>ক্লিক করো</a> । <br><br>তুমি ব্যবহার করছো {} এবং সাম্প্রতিক সংস্করণ হলো {}।",
+ "update_error_check_error": "নতুন সংস্করণ চেক করতে পারছি না: অনিওনশেয়ার ওয়েবসাইট বলছে, সাম্প্রতিক সংস্করণটিকে চেনা যাচ্ছে না '{}'…",
+ "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 পুনরায় খুলো এবং টর এর সাথে OnionShare কে সেট আপ করো।",
+ "gui_tor_connection_lost": "টর এর সাথে যোগাযোগ বিচ্ছিন্ন হয়ে গেছে।",
+ "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>যে কেউ</b> আপনার ফাইল(গুলি) <b>ডাউনলোড</b> করতে পারবে:<img src='{}' />",
+ "gui_receive_url_description": "যার কাছেই এই ঠিকানা থাকবে সে ই <b>টর ব্রাউজার</b> ব্যবহার করে এই OnionShare ঠিকানায় গিয়ে <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_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": "গ্রহণ মোডে লোকজন আপনার কম্পিউটারে ফাইলগুলো আপলোড করতে দেয় । <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_public_mode_checkbox": "সর্বজনীন মোড",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "পৃষ্ঠা লোড করা হয়েছে",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_add_files": "ফাইল যোগ করো",
+ "gui_add_folder": "ফোল্ডার যোগ করো",
+ "gui_settings_onion_label": "অনিয়ন সেটিংস",
+ "gui_connect_to_tor_for_onion_settings": "অনিওন সার্ভিস সেটিংস দেখতে টর এর সাথে কানেক্ট করো",
+ "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_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": "{} শুরু হয়েছে",
+ "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": "রিসিভ শেষ হওয়ার জন্য অপেক্ষা করছি",
+ "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": "সে",
+ "gui_website_url_description": "<b>যার কাছেই</b> নিচের OnionShare ঠিকানাটি থাকবে সেই <b>টর ব্রাউজারের মাধ্যমে উক্ত ঠিকানায় গিয়ে <b> </b>আপনার ফাইল(গুলো) ডাউনলোড করতে পারবে</b>: <img src='{}' />",
+ "gui_mode_website_button": "ওয়েবসাইট পাবলিশ করুন",
+ "gui_website_mode_no_files": "এখনো কোন ওয়েবসাইট শেয়ার করা হয়নি",
+ "incorrect_password": "ভুল পাসওয়ার্ড",
+ "gui_settings_individual_downloads_label": "একাধিক ফাইলের ক্ষেত্রে আলাদাভাবে প্রত্যেক ফাইলকে ডাউনলোড করার জন্য চেক উঠিয়ে দিন",
+ "history_requests_tooltip": "{} ওয়েব রিকুয়েস্ট",
+ "gui_settings_csp_header_disabled_option": "\"কন্টেন্ট নিরাপত্তা পলিসি\" হেডারকে বন্ধ করো",
+ "gui_settings_website_label": "ওয়েবসাইট সেটিংস",
+ "gui_new_tab_receive_button": "ফাইল গ্রহণ করো",
+ "gui_new_tab_share_button": "ফাইল শেয়ার করো",
+ "gui_new_tab_tooltip": "একটি নতুন ট্যাব খুলো",
+ "gui_new_tab": "নতুন ট্যাব",
+ "mode_settings_website_disable_csp_checkbox": "বিষয়বস্তু নিরাপত্তা নীতি শীর্ষাংশ নিষ্ক্রিয় করো (তোমার ওয়েবসাইটকে তৃতীয় পক্ষের সম্পদ ব্যবহার করতে সম্মতি দাও)",
+ "mode_settings_legacy_checkbox": "একটি লেগাসি ঠিকানা ব্যবহার করো (অনিওন সেবা স.২, এর ব্যবহার উৎসাহযোগ্য না)",
+ "gui_new_tab_receive_description": "তোমার কম্পিউটারকে একটি অনলাইন ড্রপবক্স বানাও। অন্যরা টর ব্রাউজার ব্যবহার করে তোমার কম্পিউটারে ফাইল পাঠাতে পারবে।",
+ "gui_new_tab_share_description": "অন্য কাউকে পাঠাতে তোমার কম্পিউটারের ফাইল নির্বাচন করো. তুমি যাকে বা যাদের কাছে ফাইল পাঠাতে চাও তাকে বা তাদেরকে তোমার কাছ থেকে ফাইল ডাউনলোড করতে টর ব্রাউজার ব্যবহার করতে হবে।",
+ "mode_settings_share_autostop_sharing_checkbox": "ফাইল পাঠানোর পর শেয়ার করা বন্ধ করো (স্বতন্ত্র ফাইল ডাউনলোড এর মঞ্জুরি দিতে টিক চিহ্ন তুলে দাও)",
+ "mode_settings_client_auth_checkbox": "ক্লায়েন্ট অথোরাইজেশন ব্যবহার করো",
+ "mode_settings_autostop_timer_checkbox": "নির্ধারিত সময়ে অনিওন সেবা বন্ধ করো",
+ "mode_settings_autostart_timer_checkbox": "নির্ধারিত সময়ে অনিওন সেবা শুরু করো",
+ "mode_settings_persistent_checkbox": "এই ট্যাব সংরক্ষণ করো, এবং যখন আমি অনিওনশেয়ার খুলব তখন এটি স্বয়ংক্রিয়ভাবে খুলো",
+ "gui_quit_warning_description": "তোমার কিছু ট্যাবে শেয়ারিং সক্রিয়। তুমি যদি প্রস্থান করো, তোমার সমস্ত ট্যাব বন্ধ হয়ে যাবে। তুমি কি নিশ্চিত যে তুমি প্রস্থান করতে চাও?",
+ "gui_close_tab_warning_website_description": "তুমি সক্রিয়ভাবে একটি ওয়েবসাইট হোস্ট করছো। আপনি কি নিশ্চিত যে তুমি এই ট্যাবটি বন্ধ করতে চাও?",
+ "gui_close_tab_warning_receive_description": "তুমি ফাইল পাওয়ার প্রক্রিয়ায় আছো। তুমি কি নিশ্চিত যে তুমি এই ট্যাবটি বন্ধ করতে চাও?",
+ "gui_close_tab_warning_share_description": "তুমি ফাইল পাঠানোর প্রক্রিয়ায় আছো। তুমি কি নিশ্চিত যে তুমি এই ট্যাবটি বন্ধ করতে চাও?",
+ "gui_close_tab_warning_persistent_description": "এই ট্যাবটি স্থায়ী। তুমি যদি এটা বন্ধ করো তাহলে তুমি যে অনিওন ঠিকানা ব্যবহার করছো তা হারিয়ে ফেলবে। তুমি কি নিশ্চিত যে তুমি এটা বন্ধ করতে চাও?",
+ "gui_quit_warning_title": "তুমি নিশ্চিত?",
+ "gui_new_tab_website_description": "তোমার কম্পিউটার থেকে একটি স্ট্যাটিক এইচটিএমএল অনিওন ওয়েবসাইট হোস্ট করো।",
+ "gui_new_tab_website_button": "ওয়েবসাইট প্রকাশ করো",
+ "gui_close_tab_warning_title": "তুমি নিশ্চিত?",
+ "gui_close_tab_warning_close": "বন্ধ",
+ "gui_close_tab_warning_cancel": "বাতিল",
+ "gui_quit_warning_cancel": "বাতিল",
+ "mode_settings_advanced_toggle_show": "উন্নততর সেটিংস দেখাও",
+ "mode_settings_advanced_toggle_hide": "উন্নততর সেটিংস লুকাও",
+ "mode_settings_public_checkbox": "পাসওয়ার্ড ব্যবহার করো না",
+ "mode_settings_receive_data_dir_browse_button": "অনুসন্ধান করো",
+ "mode_settings_receive_data_dir_label": "ফাইল সংরক্ষণ করো"
+}
diff --git a/desktop/share/locale/ca.json b/desktop/share/locale/ca.json
new file mode 100644
index 00000000..62b69618
--- /dev/null
+++ b/desktop/share/locale/ca.json
@@ -0,0 +1,276 @@
+{
+ "config_onion_service": "S'està establint el servei onion al port {0:d}.",
+ "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 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_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 de fitxers molt grans podria trigar hores",
+ "systray_menu_exit": "Surt",
+ "systray_download_started_title": "S'ha iniciat la descàrrega amb OnionShare",
+ "systray_download_started_message": "Algú ha començat a descarregar els teus arxius",
+ "systray_download_completed_title": "S'ha completat la descàrrega amb OnionShare",
+ "systray_download_completed_message": "Algú ha acabat de descarregar els teus arxius",
+ "systray_download_canceled_title": "S'ha canceŀlat la descàrrega",
+ "systray_download_canceled_message": "L'usuari va cancel·lar la descàrrega",
+ "systray_upload_started_title": "S'ha iniciat la pujada",
+ "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_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_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 fitxers i carpetes\nper a començar a compartir",
+ "gui_add": "Afegeix",
+ "gui_delete": "Esborra",
+ "gui_choose_items": "Trieu",
+ "gui_share_start_server": "Comparteix",
+ "gui_share_stop_server": "Deixa de compartir",
+ "gui_share_stop_server_autostop_timer": "Deixa de compartir (queden {})",
+ "gui_share_stop_server_autostop_timer_tooltip": "El temporitzador acaba a {}",
+ "gui_receive_start_server": "Inicia el mode de recepció",
+ "gui_receive_stop_server": "Atura el mode de recepció",
+ "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",
+ "gui_no_downloads": "No n'hi ha cap",
+ "gui_canceled": "S'ha cancel·lat",
+ "gui_copied_url_title": "S'ha copiat l'adreça OnionShare",
+ "gui_copied_url": "S'ha copiat l'adreça OnionShare al porta-retalls",
+ "gui_copied_hidservauth_title": "S'ha copiat el HidServAuth",
+ "gui_copied_hidservauth": "S'ha copiat la línia HidServAuth al porta-retalls",
+ "gui_please_wait": "S'està iniciant… Feu clic per a cancel·lar.",
+ "gui_download_upload_progress_complete": "Han passat %p%, {0:s}.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (s'està calculant)",
+ "gui_download_upload_progress_eta": "{0:s}, temps restant: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Espereu un moment",
+ "gui_share_quit_warning": "Encara s'estan enviant fitxers. Segur que voleu sortir de l'OnionShare?",
+ "gui_receive_quit_warning": "Encara s'estan rebent fitxers. Segur que voleu sortir de l'OnionShare?",
+ "gui_quit_warning_quit": "Surt",
+ "gui_quit_warning_dont_quit": "Cancel·la",
+ "error_rate_limit": "Algú ha fet massa intents incorrectes intentant endevinar la vostra contrasenya. Per això l'OnionShare ha aturat el servidor. Torneu a començar el procés i envieu una adreça nova al receptor.",
+ "zip_progress_bar_format": "S'està comprimint: %p%",
+ "error_stealth_not_supported": "Per a fer servir l'autorització de client, necessiteu versions iguals o superiors a Tor 0.2.9.1-alpha (o Tor Browser 6.5) i python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare necessita almenys les versions Tor 0.2.7.1 i python3-stem 1.4.0.",
+ "gui_settings_window_title": "Configuració",
+ "gui_settings_whats_this": "<a href='{0:s}'>Què és això?</a>",
+ "gui_settings_stealth_option": "Fes servir autorització de client",
+ "gui_settings_stealth_hidservauth_string": "Ara que ja heu desat la clau privada per a reutilitzar-la, podeu fer clic per a copiar el HidServAuth.",
+ "gui_settings_autoupdate_label": "Comprova si hi ha versions noves",
+ "gui_settings_autoupdate_option": "Notifica'm si hi ha una actualització disponible",
+ "gui_settings_autoupdate_timestamp": "Última comprovació: {}",
+ "gui_settings_autoupdate_timestamp_never": "Mai",
+ "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 compartició",
+ "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 l'OnionShare al 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 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": "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ó amb galetes",
+ "gui_settings_authenticate_password_option": "Contrasenya",
+ "gui_settings_password_label": "Contrasenya",
+ "gui_settings_tor_bridges": "Ponts de Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "No facis servir ponts",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Fes servir el transport integrat obfs4",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Fes servir el transport integrat obfs4 (necessita obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Fes servir el transport integrat meek_lite (Azure)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Fes servir el transport integrat meek_lite (Azure, necessita obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Compte: fer funcionar els ponts meek_lite suposa un cost molt gran per al Tor Project .<br><br>Feu-los servir només si no podeu connectar-vos a Tor directament, a través d'obfs4, o a través de ponts normals.",
+ "gui_settings_tor_bridges_custom_radio_option": "Fes servir ponts personalitzats",
+ "gui_settings_tor_bridges_custom_label": "Podeu trobar-ne a <a href=\"https://bridges.torproject.org/options?lang=ca\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Cap dels ponts que heu afegit funciona.\nComproveu-los o proveu d'afegir-ne de nous.",
+ "gui_settings_button_save": "Desa",
+ "gui_settings_button_cancel": "Cancel·la",
+ "gui_settings_button_help": "Ajuda",
+ "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. Heu iniciat el Tor Browser? (disponible 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ò 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": "La connexió està trigant molt. Podeu revisar que tingueu connexió a Internet i que el rellotge del sistema estigui en hora?",
+ "settings_error_bundled_tor_broken": "OnionShare no s'ha pogut connectar a Tor:\n{}",
+ "settings_test_success": "S'ha connectat al controlador de Tor.\n\nVersió de Tor: {}\nCompatible amb serveis onion efímers: {}.\nCompatible amb autenticació del client: {}.\nCompatible amb adreces .onion de nova generació: {}.",
+ "error_tor_protocol_error": "Hi ha hagut un error amb Tor: {}",
+ "error_tor_protocol_error_unknown": "Hi ha hagut un error desconegut amb Tor",
+ "error_invalid_private_key": "Aquest tipus de clau privada no està suportat",
+ "connecting_to_tor": "S'està connectant a la xarxa Tor",
+ "update_available": "Hi ha una nova versió d'OnionShare.<a href='{}'>Feu clic aquí</a> per a obtenir-la.<br><br>Esteu usant {} i la més recent és {}.",
+ "update_error_check_error": "No s'ha pogut comprovar si hi ha una versió més nova. Pot ser que no estigueu connectat a Tor o que el web d'OnionShare estigui caigut?",
+ "update_error_invalid_latest_version": "No s'ha pogut comprovar si hi ha una versió més nova. La web d'OnionShare diu que l'última versió és '{}' però no s'ha pogut reconèixer…",
+ "update_not_available": "Aquesta és l'última versió d'OnionShare.",
+ "gui_tor_connection_ask": "Voleu anar a la configuració per a provar d'arreglar la connexió a Tor?",
+ "gui_tor_connection_ask_open_settings": "Sí",
+ "gui_tor_connection_ask_quit": "Surt",
+ "gui_tor_connection_error_settings": "Proveu 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\nAssegureu-vos que teniu connexió a internet, torneu a obrir l'OnionShare i prepareu la connexió a Tor.",
+ "gui_tor_connection_lost": "S'ha perdut la connexió amb Tor.",
+ "gui_server_started_after_autostop_timer": "El temporitzador de finalització automàtica ha acabat abans que s'iniciés el servidor.\nTorneu a compartir-ho.",
+ "gui_server_autostop_timer_expired": "El temporitzador de finalització automàtica ja s'ha acabat. Ajusteu-lo per a poder compartir.",
+ "share_via_onionshare": "Comparteix-ho amb l'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>baixar</b> els vostres fitxers fent servir el <b>Navegador Tor</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>pujar</b> fitxers al vostre ordinador fent servir el <b>Navegador Tor</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Aquest recurs no es tancarà ell sol.<br><br>Cada recurs compartit reutilitzarà aquesta mateixa adreça. Si voleu crear una adreça diferent per a cada recurs, desactiveu l'opció «Feu servir una adreça persistent».",
+ "gui_url_label_stay_open": "Aquest recurs no es tancarà ell sol.",
+ "gui_url_label_onetime": "Aquest recurs deixarà de compartir-se després de la primera baixada.",
+ "gui_url_label_onetime_and_persistent": "Aquest recurs no es tancarà ell sol.<br><br>Cada recurs compartit reutilitzarà aquesta mateixa adreça. Si voleu crear una adreça diferent per a cada recurs, desactiveu l'opció «Feu servir una adreça persistent».",
+ "gui_status_indicator_share_stopped": "A punt per a compartir",
+ "gui_status_indicator_share_working": "S'està iniciant…",
+ "gui_status_indicator_share_started": "S'està compartint",
+ "gui_status_indicator_receive_stopped": "A punt per a rebre",
+ "gui_status_indicator_receive_working": "S'està iniciant…",
+ "gui_status_indicator_receive_started": "S'està rebent",
+ "gui_file_info": "{} fitxers, {}",
+ "gui_file_info_single": "{} fitxer, {}",
+ "history_in_progress_tooltip": "{} en procés",
+ "history_completed_tooltip": "{} completats",
+ "info_in_progress_uploads_tooltip": "",
+ "info_completed_uploads_tooltip": "",
+ "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 pujar fitxers al vostre ordinador.<br><br><b>Alguns fitxers podrien guanyar el control de la vostra màquina si els obriu. Obriu només fitxers de persones de confiança, o si realment sabeu el que esteu fent.</b>",
+ "receive_mode_upload_starting": "S'està començant la pujada. Total: {}",
+ "receive_mode_received_file": "S'han rebut: {}",
+ "gui_mode_share_button": "Comparteix fitxers",
+ "gui_mode_receive_button": "Rep fitxers",
+ "gui_settings_receiving_label": "Configuració de rebuda",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Mode públic",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "S'ha carregat la pàgina",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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 és disponible. El fitxer és a: {}",
+ "gui_settings_language_label": "Llengua preferida",
+ "gui_settings_language_changed_notice": "Torneu a obrir l'OnionShare perquè s'apliqui la llengua nova.",
+ "timeout_upload_still_running": "S'està esperant que acabi la pujada",
+ "gui_add_files": "Afegeix fitxers",
+ "gui_add_folder": "Afegeix una carpeta",
+ "gui_settings_onion_label": "Configuració Onion",
+ "gui_connect_to_tor_for_onion_settings": "Connecteu-vos a Tor per a configurar els serveis onion",
+ "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 fitxers a",
+ "gui_settings_data_dir_browse_button": "Explora",
+ "systray_page_loaded_message": "S'ha carregat l'adreça d'OnionShare",
+ "systray_share_started_title": "S'ha començat a compartir",
+ "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": "S'ha acabat d'enviar els fitxers",
+ "systray_share_canceled_title": "S'ha deixat de compartir",
+ "systray_share_canceled_message": "Algú ha cancel·lat la recepció dels vostres fitxers",
+ "systray_receive_started_title": "S'ha començat a rebre",
+ "systray_receive_started_message": "Algú us està enviant fitxers",
+ "gui_all_modes_history": "Historial",
+ "gui_all_modes_clear_history": "Esborra-ho tot",
+ "gui_all_modes_transfer_started": "Ha començat el {}",
+ "gui_all_modes_transfer_finished_range": "S'ha transferit entre: {} - {}",
+ "gui_all_modes_transfer_finished": "Transferit el {}",
+ "gui_all_modes_transfer_canceled_range": "S'ha cancel·lat entre: {} - {}",
+ "gui_all_modes_transfer_canceled": "S'ha cancel·lat el {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} transferits.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (s'està calculant)",
+ "gui_all_modes_progress_eta": "{0:s}, Temps estimat: {1:s}, %p%",
+ "gui_share_mode_no_files": "Encara no s'han enviat fitxers",
+ "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 a iniciar en {}. Feu clic per a 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. Ajusteu-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. Ajusteu-la 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",
+ "invalid_password_guess": "Intent de contrasenya incorrecte",
+ "gui_website_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>visitar</b> el vostre lloc web fent servir el <b>Navegador Tor</b>: <img src='{}' />",
+ "gui_mode_website_button": "Publica el lloc web",
+ "systray_site_loaded_title": "S'ha carregat el lloc web",
+ "systray_site_loaded_message": "S'ha carregat el lloc web de l'OnionShare",
+ "systray_website_started_title": "S'ha començat a compartir el lloc web",
+ "systray_website_started_message": "Algú està visitant el vostre lloc web",
+ "gui_website_mode_no_files": "Encara no s'han compartit llocs web",
+ "gui_visit_started": "Algú ha visitat el vostre lloc web {}",
+ "incorrect_password": "La contrasenya no és correcta",
+ "history_requests_tooltip": "{} peticions web",
+ "systray_individual_file_downloaded_title": "S'ha carregat el fitxer individual",
+ "gui_settings_individual_downloads_label": "Desmarqueu per a permetre la baixada de fitxers individuals",
+ "systray_individual_file_downloaded_message": "S'ha visualitzat el fitxer individual {}",
+ "gui_settings_csp_header_disabled_option": "Desactiva la capçalera de la Política de Seguretat de Contingut",
+ "gui_settings_website_label": "Configuració del lloc web",
+ "gui_new_tab_share_button": "Comparteix arxius",
+ "gui_new_tab_tooltip": "Obre una pestanya nova",
+ "gui_new_tab": "Nova pestanya",
+ "mode_settings_website_disable_csp_checkbox": "Desactiva la capçalera de la política de seguretat de contingut (permet que el vostre lloc web usi recursos de tercers)",
+ "mode_settings_receive_data_dir_browse_button": "Navega",
+ "mode_settings_receive_data_dir_label": "Desa els fitxers a",
+ "mode_settings_share_autostop_sharing_checkbox": "Atura la compartició després que s'hagin enviat els fitxers (desmarqueu-ho per a permetre baixar fitxers individuals)",
+ "mode_settings_client_auth_checkbox": "Usa autorització del client",
+ "mode_settings_legacy_checkbox": "Usa una adreça antiga (servei ceba v2, no recomanat)",
+ "mode_settings_autostop_timer_checkbox": "Atura el servei ceba a una hora programada",
+ "mode_settings_autostart_timer_checkbox": "Inicia el servei ceba a una hora programada",
+ "mode_settings_public_checkbox": "No usis cap contrasenya",
+ "mode_settings_persistent_checkbox": "Desa aquesta pestanya i obre-la automàticament quan obri l'OnionShare",
+ "mode_settings_advanced_toggle_hide": "Amaga la configuració avançada",
+ "mode_settings_advanced_toggle_show": "Mostra la configuració avançada",
+ "gui_quit_warning_cancel": "Cancel·la",
+ "gui_quit_warning_description": "La compartició és activa en alguna de les pestanyes. Si sortiu, es tancaran totes les pestanyes. Esteu segur de voler sortir?",
+ "gui_quit_warning_title": "N'esteu segur?",
+ "gui_close_tab_warning_cancel": "Cancel·la",
+ "gui_close_tab_warning_close": "Tanca",
+ "gui_close_tab_warning_website_description": "Esteu hostatjant un lloc web. Esteu segur de voler tancar aquesta pestanya?",
+ "gui_close_tab_warning_receive_description": "Esteu en procés de rebre fitxers. Esteu segur de voler tancar aquesta pestanya?",
+ "gui_close_tab_warning_share_description": "Esteu en el procés d'enviar fitxers. Esteu segur de voler tancar aquesta pestanya?",
+ "gui_close_tab_warning_persistent_description": "Aquesta pestanya és persistent. Si la tanqueu, perdreu l'adreça ceba que està usant. Esteu segur de voler tancar-la?",
+ "gui_close_tab_warning_title": "N'esteu segur?",
+ "gui_new_tab_website_description": "Hostatgeu un lloc web ceba HTML estàtic en el vostre ordinador.",
+ "gui_new_tab_website_button": "Publicar un lloc web",
+ "gui_new_tab_receive_description": "Convertiu el vostre ordinador en un servei de fiters en línia. Les persones podran usar el navegador Tor per a enviar-vos fitxers al vostre ordinador.",
+ "gui_new_tab_receive_button": "Rebre fitxers",
+ "gui_new_tab_share_description": "Trieu els fitxers del vostre ordinador que voleu enviar a algú altre. La persona a qui voleu enviar els fitxers haurà d'usar el navegador Tor per a baixar-los del vostre equip."
+}
diff --git a/desktop/share/locale/cs.json b/desktop/share/locale/cs.json
new file mode 100644
index 00000000..7a5a4749
--- /dev/null
+++ b/desktop/share/locale/cs.json
@@ -0,0 +1,112 @@
+{
+ "config_onion_service": "Nastavuji onion požadavky na portu {0:d}.",
+ "preparing_files": "Probíhá komprese souborů.",
+ "give_this_url": "Dejte tuto URL osobě, které dané soubory posíláte:",
+ "give_this_url_stealth": "Sděl příjemci tuto URL a HidServAuth:",
+ "ctrlc_to_stop": "Stiskněte Ctrl+C pro zastavení serveru",
+ "not_a_file": "{0:s} není platný soubor.",
+ "other_page_loaded": "URL loaded",
+ "closing_automatically": "Zastavuji automaticky, protože stahování skončilo",
+ "large_filesize": "Varování: Posílání velkých souborů může trvat hodiny",
+ "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_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",
+ "gui_delete": "Smazat",
+ "gui_choose_items": "Vybrat",
+ "gui_share_start_server": "Spustit sdílení",
+ "gui_share_stop_server": "Zastavit sdílení",
+ "gui_copy_url": "Kopírovat URL",
+ "gui_copy_hidservauth": "Kopírovat HidServAuth",
+ "gui_downloads": "Historie stahování",
+ "gui_canceled": "Zrušeno",
+ "gui_copied_url": "URL zkopírováno do schránky",
+ "gui_copied_hidservauth": "HidServAuth zkopírováno do schránky",
+ "gui_please_wait": "Spouštění... Klikněte pro zrušení.",
+ "gui_download_upload_progress_complete": "%p%, Uplynulý čas: {0:s}",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (Computing ETA)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "version_string": "Onionshare {0:s} | https://onionshare.org/",
+ "gui_share_quit_warning": "Jste si jistí, že chcete odejít? URL, kterou sdílíte poté nebude existovat.",
+ "gui_quit_warning_quit": "Zavřít",
+ "gui_quit_warning_dont_quit": "Zůstat",
+ "error_rate_limit": "Útočník možná zkouší uhodnout vaši URL. Abychom tomu předešli, OnionShare automaticky zastavil server. Pro sdílení souborů ho musíte spustit znovu a sdílet novou URL.",
+ "zip_progress_bar_format": "Zpracovávám soubory: %p%",
+ "error_stealth_not_supported": "K autorizaci klienta potřebujete alespoň Tor 0.2.9.1-alpha (or Tor Browser 6.5) a python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare vyžaduje nejméně Tor 0.2.7.1 a nejméně python3-stem 1.4.0.",
+ "gui_settings_window_title": "Nastavení",
+ "gui_settings_connection_type_label": "Jak by se měl OnionShare připojit k Toru?",
+ "gui_settings_connection_type_automatic_option": "Zkusit automatické nastavení s Tor Browserem",
+ "gui_settings_connection_type_control_port_option": "Připojit použitím control port",
+ "gui_settings_connection_type_socket_file_option": "Připojit použitím socket file",
+ "gui_settings_control_port_label": "Control port",
+ "gui_settings_socket_file_label": "Socket file",
+ "gui_settings_authenticate_label": "Autentizační nastavení Toru",
+ "gui_settings_authenticate_no_auth_option": "Žádná autentizace ani cookie autentizace",
+ "gui_settings_authenticate_password_option": "Heslo",
+ "gui_settings_password_label": "Heslo",
+ "gui_settings_button_save": "Uložit",
+ "gui_settings_button_cancel": "Zrušit",
+ "settings_saved": "Nastavení uloženo do {}",
+ "settings_error_unknown": "Nejde se připojit k ovladači Toru, protože nastavení nedává smysl.",
+ "settings_error_automatic": "Nejde se připojit k ovladači Toru. Běží Tor Browser na pozadí? Pokud ho ještě nemáte, můžete ho získat na:\nhttps://www.torproject.org/.",
+ "settings_error_socket_port": "Nejde se připojit k ovladači Toru na {}:{}.",
+ "settings_error_socket_file": "Can't connect to Tor controller using socket file {}.",
+ "settings_error_auth": "Připojen k {}:{}, ale nejde se autentizovat. Možná to není ovladač Toru?",
+ "settings_error_missing_password": "Připojen k ovladači Toru, ale vyžaduje heslo pro autentizaci.",
+ "settings_error_unreadable_cookie_file": "Připojen k ovladači Toru, ale nejde se autentizovat, protože heslo je možná špatné a váš uživatel nemá povolení číst soubor cookie.",
+ "settings_test_success": "Congratulations, OnionShare can connect to the Tor controller.\n\nTor version: {}\nSupports ephemeral onion services: {}\nSupports stealth onion services: {}",
+ "error_tor_protocol_error": "Error talking to the Tor controller.\nIf you're using Whonix, check out https://www.whonix.org/wiki/onionshare to make OnionShare work.",
+ "give_this_url_receive": "Sděl tuto adresu odesilateli:",
+ "give_this_url_receive_stealth": "Sdělte tuto adresu a HidServAuth odesilateli:",
+ "no_available_port": "Port potřebný ke spuštění služeb onion nelze nalézt",
+ "not_a_readable_file": "{0:s} soubor není čitelný.",
+ "timeout_download_still_running": "Čeká se na konec stahování",
+ "systray_menu_exit": "Ukončit",
+ "systray_download_started_title": "Stahování pomocí OnionShare začalo",
+ "systray_download_started_message": "Někdo stahuje vaše soubory",
+ "systray_download_completed_title": "Stahování pomocí OnionShare skončilo",
+ "systray_download_completed_message": "Uživatel dokončil stahování vašich souborů",
+ "systray_download_canceled_title": "Stahování pomocí OnionShare bylo zrušeno",
+ "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_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_autostop_timer": "Zastavit mód přijímání ({} zbývá)",
+ "gui_copied_hidservauth_title": "Zkopírovaný HidServAuth token",
+ "gui_copied_url_title": "OnionShare Address zkopírována",
+ "gui_quit_title": "Ne tak rychle",
+ "gui_settings_stealth_option": "Autorizace klienta",
+ "gui_settings_stealth_hidservauth_string": "Uložení priváního klíče pro znovu použití znamená, že teď můžete zkopírovat Váš HidServAuth.",
+ "gui_settings_autoupdate_label": "Kontrola nové verze",
+ "gui_settings_autoupdate_option": "Upozornit na dostupnost nové verze",
+ "gui_settings_autoupdate_timestamp": "Poslední kontrola {}",
+ "gui_settings_autoupdate_timestamp_never": "Nikdy",
+ "gui_settings_autoupdate_check_button": "Kontrola nové verze",
+ "gui_settings_sharing_label": "Nastavení sdílení",
+ "gui_settings_close_after_first_download_option": "Zastavit sdílení po odeslání dat",
+ "gui_settings_connection_type_bundled_option": "Použít Tor verzi vestavěnou v OnionShare",
+ "gui_settings_connection_type_test_button": "Test připojení do Tor sítě",
+ "gui_settings_socks_label": "SOCKS port",
+ "gui_settings_tor_bridges": "Tor bridge podpora",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Nepoužívat Tor bridge",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Použít vestavěný obfs4 přenos",
+ "gui_receive_quit_warning": "Jste v procesu příjímání dat. Jste si opravdu jistí, že chcete OnionShare ukončit?",
+ "gui_settings_whats_this": "<a href='{0:s}'>Co je to?</a>",
+ "gui_settings_general_label": "Obecná nastavení",
+ "gui_add_files": "Přidat soubory",
+ "gui_add_folder": "Přidat adresář",
+ "gui_settings_onion_label": "Onion nastavení",
+ "close_on_autostop_timer": "Zastaveno protože vypršel čas auto-stop časovače",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop skončí v {}",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start skončí v {}",
+ "gui_waiting_to_start": "Naplánovaný start v {}. Klikněte pro zrušení.",
+ "incorrect_password": "Nesprávné heslo",
+ "gui_settings_individual_downloads_label": "Odškrtnout k povolení stahování libovolných souborů",
+ "gui_settings_csp_header_disabled_option": "Zakázat Conent Security Policy hlavičku"
+}
diff --git a/desktop/share/locale/da.json b/desktop/share/locale/da.json
new file mode 100644
index 00000000..3ecb16c2
--- /dev/null
+++ b/desktop/share/locale/da.json
@@ -0,0 +1,291 @@
+{
+ "config_onion_service": "Opsætter onion-tjeneste på port {0:d}.",
+ "preparing_files": "Komprimerer filer.",
+ "give_this_url": "Giv adressen til modtageren:",
+ "give_this_url_stealth": "Giv adressen og HidServAuth-linjen til modtageren:",
+ "ctrlc_to_stop": "Tryk på Ctrl+C for at stoppe serveren",
+ "not_a_file": "{0:s} er ikke en gyldig fil.",
+ "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_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",
+ "systray_menu_exit": "Afslut",
+ "systray_download_started_title": "OnionShare-download begyndte",
+ "systray_download_started_message": "En bruger begyndte download af dine filer",
+ "systray_download_completed_title": "OnionShare-download færdig",
+ "systray_download_completed_message": "Brugeren er færdig med at downloade dine filer",
+ "systray_download_canceled_title": "OnionShare-download annulleret",
+ "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_autostop_timer": "Stop deling efter et vist antal sekunder",
+ "help_stealth": "Brug klientautentifikation (avanceret)",
+ "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 begynde at dele",
+ "gui_add": "Tilføj",
+ "gui_delete": "Slet",
+ "gui_choose_items": "Vælg",
+ "gui_share_start_server": "Begynd at dele",
+ "gui_share_stop_server": "Stop deling",
+ "gui_copy_url": "Kopiér adresse",
+ "gui_copy_hidservauth": "Kopiér HidServAuth",
+ "gui_downloads": "Downloadhistorik",
+ "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_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%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "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å at gætte din adgangskode, 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.",
+ "gui_settings_window_title": "Indstillinger",
+ "gui_settings_stealth_option": "Brug klientautentifikation",
+ "gui_settings_stealth_hidservauth_string": "Ved at have gemt din private nøgle til at blive brugt igen, betyder det at du nu kan klikke for at kopiere din HidServAuth.",
+ "gui_settings_autoupdate_label": "Søg efter ny version",
+ "gui_settings_autoupdate_option": "Giv mig besked når der findes en ny version",
+ "gui_settings_autoupdate_timestamp": "Sidste søgning: {}",
+ "gui_settings_autoupdate_timestamp_never": "Aldrig",
+ "gui_settings_autoupdate_check_button": "Søg efter ny version",
+ "gui_settings_sharing_label": "Delingsindstillinger",
+ "gui_settings_close_after_first_download_option": "Stop deling efter filerne er blevet sendt",
+ "gui_settings_connection_type_label": "Hvordan skal OnionShare oprette forbindelse til Tor?",
+ "gui_settings_connection_type_bundled_option": "Brug den Tor-version som er indbygget i OnionShare",
+ "gui_settings_connection_type_automatic_option": "Prøv autokonfiguration med Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Opret forbindelse med kontrolport",
+ "gui_settings_connection_type_socket_file_option": "Opret forbindelse med sokkelfil",
+ "gui_settings_connection_type_test_button": "Test forbindelsen til Tor",
+ "gui_settings_control_port_label": "Kontrolport",
+ "gui_settings_socket_file_label": "Sokkelfil",
+ "gui_settings_socks_label": "SOCKS-port",
+ "gui_settings_authenticate_label": "Indstillinger for Tor-autentifikation",
+ "gui_settings_authenticate_no_auth_option": "Ingen autentifikation, eller cookieautentifikation",
+ "gui_settings_authenticate_password_option": "Adgangskode",
+ "gui_settings_password_label": "Adgangskode",
+ "gui_settings_tor_bridges": "Understøttelse af Tor-bro",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Brug ikke broer",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Brug indbyggede obfs4 udskiftelige transporter",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Brug indbyggede obfs4 udskiftelige transporter (kræver obfs4proxy)",
+ "gui_settings_tor_bridges_custom_radio_option": "Brug tilpassede broer",
+ "gui_settings_tor_bridges_custom_label": "Du kan få broer fra <a href=\"https://bridges.torproject.org/options?lang=da\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Ingen at de broer du tilføjede virker.\nDobbeltklik på dem eller tilføj andre.",
+ "gui_settings_button_save": "Gem",
+ "gui_settings_button_cancel": "Annuller",
+ "gui_settings_button_help": "Hjælp",
+ "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?",
+ "settings_error_socket_port": "Kan ikke oprette forbindelse til Tor-kontrolleren på {}:{}.",
+ "settings_error_socket_file": "Kan ikke oprette forbindelse til Tor-kontrolleren med sokkelfilen {}.",
+ "settings_error_auth": "Forbundet til {}:{}, men kan ikke autentificere. Er det fordi det ikke er en Tor-kontroller?",
+ "settings_error_missing_password": "Forbundet til Tor-kontroller, men den kræver en adgangskode for at autentificere.",
+ "settings_error_unreadable_cookie_file": "Forbundet til Tor-kontrolleren, men adgangskoden kan være forkert, eller din bruger har ikke tilladelse til at læse cookiefilen.",
+ "settings_error_bundled_tor_not_supported": "Brug af den Tor-version som kom med OnionShare virker ikke i udviklertilstand på Windows eller macOS.",
+ "settings_error_bundled_tor_timeout": "For længe om at oprette forbindelse til Tor. Måske har du ikke forbindelse til internettet, eller går dit systems ur forkert?",
+ "settings_error_bundled_tor_broken": "OnionShare kunne ikke oprette forbindelse til Tor:\n{}",
+ "settings_test_success": "Forbundet til Tor-kontrolleren.\n\nTor version: {}\nUnderstøtter kortvarige oniontjenester: {}.\nUnderstøtter klientautentifikation: {}.\nUnderstøtter næstegenerations .onion-adresser: {}.",
+ "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 version: Måske har du ikke oprettet forbindelse til Tor eller også er OnionShare-webstedet nede?",
+ "update_error_invalid_latest_version": "Kunne ikke søge efter ny version: OnionShare-webstedet siger at den seneste version er den ugenkendelige '{}' …",
+ "update_not_available": "Du kører den seneste OnionShare.",
+ "gui_tor_connection_ask": "Åbn indstillingerne for at rette forbindelsen til Tor?",
+ "gui_tor_connection_ask_open_settings": "Ja",
+ "gui_tor_connection_ask_quit": "Afslut",
+ "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_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. Juster 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",
+ "gui_copied_hidservauth_title": "Kopierede HidServAuth",
+ "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_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.",
+ "gui_url_label_onetime_and_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_file_info": "{} filer, {}",
+ "gui_file_info_single": "{} fil, {}",
+ "info_in_progress_downloads_tooltip": "{} igangværende downloads",
+ "info_completed_downloads_tooltip": "{} færdige downloads",
+ "give_this_url_receive": "Giv adressen til afsenderen:",
+ "give_this_url_receive_stealth": "Giv adressen og HidServAuth til afsenderen:",
+ "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_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 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_autostop_timer_tooltip": "Timer med autostop slutter ved {}",
+ "gui_receive_start_server": "Start modtagetilstand",
+ "gui_receive_stop_server": "Stop modtagetilstand",
+ "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 udgåede adresser",
+ "gui_status_indicator_share_stopped": "Klar til at dele",
+ "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_started": "Modtager",
+ "receive_mode_received_file": "Modtaget: {}",
+ "gui_mode_share_button": "Del filer",
+ "gui_mode_receive_button": "Modtag filer",
+ "gui_settings_receiving_label": "Modtagelsesindstillinger",
+ "gui_settings_downloads_label": "Gem filer til",
+ "gui_settings_downloads_button": "Gennemse",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "Modtagetilstand kan ikke stoppes af afsenderen",
+ "gui_settings_public_mode_checkbox": "Offentlig tilstand",
+ "systray_close_server_title": "OnionShare-server lukket",
+ "systray_close_server_message": "En bruger lukkede serveren",
+ "systray_page_loaded_title": "Siden er indlæst",
+ "systray_download_page_loaded_message": "En bruger indlæste downloadsiden",
+ "systray_upload_page_loaded_message": "En bruger indlæste uploadsiden",
+ "gui_uploads": "Uploadhistorik",
+ "gui_no_uploads": "Ingen uploads endnu",
+ "gui_clear_history": "Ryd alle",
+ "gui_upload_finished_range": "Uploadede {} til {}",
+ "gui_upload_finished": "Uploadet {}",
+ "gui_settings_language_label": "Foretrukne sprog",
+ "gui_settings_language_changed_notice": "Genstart OnionShare for at det nye sprog skal træder i kraft.",
+ "gui_settings_meek_lite_expensive_warning": "Advarsel: meek_lite-broerne er meget dyre at køre for Tor-projektet.<br><br>Brug dem kun hvis du ikke er i stand til at oprette forbindelse til Tor direkte, via obfs4-transporter eller andre normale broer.",
+ "gui_share_url_description": "<b>Alle</b> med OnionShare-adressen kan <b>downloade</b> dine filer, med <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Alle</b> med OnionShare-adressen kan <b>uploade</b> filer til din computer, med <b>Tor Browser</b>: <img src='{}' />",
+ "history_in_progress_tooltip": "{} igangværende",
+ "history_completed_tooltip": "{} færdige",
+ "info_in_progress_uploads_tooltip": "{} igangværende upload(s)",
+ "info_completed_uploads_tooltip": "{} upload(s) færdige",
+ "error_cannot_create_downloads_dir": "Kunne ikke oprette modtagetilstand-mappe: {}",
+ "receive_mode_downloads_dir": "Filer som sendes til dig vises i denne mappe: {}",
+ "receive_mode_warning": "Advarsel: Modtagetilstand lader folk uploade filer til din computer. Nogle filer kan potentielt tage kontrol over din computer hvis du åbner dem. Åbn kun ting fra folk du har tillid til, eller hvis du ved hvad du har gang i.",
+ "gui_receive_mode_warning": "Modtagetilstand lader folk uploade filer til din computer.<br><br><b>Nogle filer kan potentielt tage kontrol over din computer hvis du åbner dem. Åbn kun ting fra folk du har tillid til, eller hvis du ved hvad du har gang i.</b>",
+ "receive_mode_upload_starting": "Upload med samlet størrelse på {} starter",
+ "gui_open_folder_error_nautilus": "Kan ikke åbne mappe fordi nautilus ikke er tilgængelig. Filen er her: {}",
+ "timeout_upload_still_running": "Venter på at upload skal blive færdig",
+ "gui_add_files": "Tilføj filer",
+ "gui_add_folder": "Tilføj mappe",
+ "gui_connect_to_tor_for_onion_settings": "Opret forbindelse til Tor for at se indstillinger for onion-tjeneste",
+ "error_cannot_create_data_dir": "Kunne ikke oprette OnionShare-datamappe: {}",
+ "receive_mode_data_dir": "Filer som sendes til dig vises i denne mappe: {}",
+ "gui_settings_data_dir_label": "Gem filer i",
+ "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": "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",
+ "systray_share_canceled_message": "Nogen annullerede modtagelsen af dine filer",
+ "systray_receive_started_title": "Modtagelse startede",
+ "systray_receive_started_message": "Nogen sender filer til dig",
+ "gui_all_modes_history": "Historik",
+ "gui_all_modes_clear_history": "Ryd alle",
+ "gui_all_modes_transfer_started": "Startede {}",
+ "gui_all_modes_transfer_finished_range": "Overførte {} - {}",
+ "gui_all_modes_transfer_finished": "Overførte {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} forløbet.",
+ "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_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_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_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. Juster 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. Juster 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",
+ "invalid_password_guess": "Ugyldigt adgangskodegæt",
+ "gui_website_url_description": "<b>Alle</b> men OnionShare-adressen kan <b>besøge</b> dit websted med <b>Tor Browser</b>: <img src='{}' />",
+ "gui_mode_website_button": "Udgiv websted",
+ "gui_website_mode_no_files": "Intet websted delt endnu",
+ "incorrect_password": "Forkert adgangskode",
+ "gui_settings_individual_downloads_label": "Fravælg for at tillade download af individuelle filer",
+ "history_requests_tooltip": "{}-webanmodninger",
+ "gui_settings_csp_header_disabled_option": "Deaktivér indholdets header om sikkerhedspolitik",
+ "gui_settings_website_label": "Webstedsindstillinger",
+ "gui_new_tab_share_description": "Vælg filer på din computer som skal sendes til andre. Personen eller dem du vil sende filer til skal bruge Tor Browser til at downloade dem fra dig.",
+ "mode_settings_website_disable_csp_checkbox": "Deaktivér Content Security Policy-header (giver dit websted mulighed for at bruge tredjepartsressourcer)",
+ "gui_new_tab_receive_description": "Brug din computer som en online-dropbox. Andre vil kunne bruge Tor Browser til at sende filer til din computer.",
+ "mode_settings_share_autostop_sharing_checkbox": "Stop deling efter filerne er blevet sendt (fravælg for at gøre det muligt at downloade individuelle filer)",
+ "mode_settings_legacy_checkbox": "Brug en udgået adresse (v2 oniontjeneste, anbefales ikke)",
+ "mode_settings_client_auth_checkbox": "Brug klientautentifikation",
+ "mode_settings_autostop_timer_checkbox": "Stop oniontjeneste på det planlagte tidspunkt",
+ "mode_settings_autostart_timer_checkbox": "Start oniontjeneste på det planlagte tidspunkt",
+ "mode_settings_persistent_checkbox": "Gem fanebladet og åbn det automatisk når jeg åbner OnionShare",
+ "gui_quit_warning_description": "Deling er aktiv i nogle af dine faneblade. Hvis du afslutter, så lukkes alle dine faneblade. Er du sikker på, at du vil afslutte?",
+ "gui_close_tab_warning_website_description": "Du fungerer som vært for et websted. Er du sikker på, at du vil lukke fanebladet?",
+ "gui_close_tab_warning_receive_description": "Du er ved at modtage filer. Er du sikker på, at du vil lukke fanebladet?",
+ "gui_close_tab_warning_share_description": "Du er ved at sende filer. Er du sikker på, at du vil lukke fanebladet?",
+ "gui_close_tab_warning_persistent_description": "Fanebladet er vedvarende. Hvis du lukker det, så mister du den onionadresse som det bruger. Er du sikker på, at du vil lukke det?",
+ "gui_new_tab_website_description": "Vær vært for et statisk HTML-onionwebsted fra din computer.",
+ "gui_new_tab_website_button": "Udgiv websted",
+ "gui_new_tab_receive_button": "Modtag filer",
+ "gui_new_tab_share_button": "Del filer",
+ "gui_new_tab_tooltip": "Åbn et nyt faneblad",
+ "mode_settings_receive_data_dir_browse_button": "Gennemse",
+ "mode_settings_receive_data_dir_label": "Gem filer i",
+ "mode_settings_public_checkbox": "Brug ikke en adgangskode",
+ "mode_settings_advanced_toggle_hide": "Skjul avancerede indstillinger",
+ "mode_settings_advanced_toggle_show": "Vis avancerede indstillinger",
+ "gui_quit_warning_cancel": "Annuller",
+ "gui_quit_warning_title": "Er du sikker?",
+ "gui_close_tab_warning_cancel": "Annuller",
+ "gui_close_tab_warning_close": "Luk",
+ "gui_close_tab_warning_title": "Er du sikker?",
+ "gui_new_tab": "Nyt faneblad",
+ "gui_tab_name_chat": "Chat",
+ "gui_tab_name_website": "Websted",
+ "gui_tab_name_receive": "Modtag",
+ "gui_tab_name_share": "Del",
+ "gui_new_tab_chat_button": "Chat anonymt",
+ "gui_open_folder_error": "Kunne ikke åbne mappen med xdg-open. Filen er her: {}",
+ "gui_qr_code_description": "Skan QR-koden med en QR-læser såsom kameraet i din telefon for at gøre det lettere at dele OnionShare-adressen med andre.",
+ "gui_qr_code_dialog_title": "QR-kode til OnionShare",
+ "gui_show_url_qr_code": "Vis QR-kode",
+ "gui_receive_flatpak_data_dir": "Da du installerede OnionShare med Flatpak, så skal du gemme filer til en mappe i ~/OnionShare.",
+ "gui_chat_stop_server": "Stop chatserver",
+ "gui_chat_start_server": "Start chatserver",
+ "gui_chat_stop_server_autostop_timer": "Stop chatserver ({})",
+ "gui_file_selection_remove_all": "Fjern alle",
+ "gui_remove": "Fjern",
+ "gui_main_page_share_button": "Begynd at dele",
+ "gui_main_page_receive_button": "Begynd at modtage",
+ "gui_main_page_website_button": "Begynd at være vært",
+ "gui_main_page_chat_button": "Begynd at chatte"
+}
diff --git a/desktop/share/locale/de.json b/desktop/share/locale/de.json
new file mode 100644
index 00000000..1194a677
--- /dev/null
+++ b/desktop/share/locale/de.json
@@ -0,0 +1,287 @@
+{
+ "preparing_files": "Dateien werden komprimiert.",
+ "give_this_url": "Gib diese URL an den Empfänger:",
+ "ctrlc_to_stop": "Drücke Strg+C um den Server anzuhalten",
+ "not_a_file": "{0:s} ist keine gültige Datei.",
+ "other_page_loaded": "Daten geladen",
+ "closing_automatically": "Gestoppt, da die Übertragung erfolgreich beendet wurde",
+ "large_filesize": "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 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, um sie zu teilen",
+ "gui_add": "Hinzufügen",
+ "gui_delete": "Löschen",
+ "gui_choose_items": "Auswählen",
+ "gui_share_start_server": "Teilen beginnen",
+ "gui_share_stop_server": "Teilen beenden",
+ "gui_copy_url": "Adresse kopieren",
+ "gui_downloads": "Bisherige Downloads",
+ "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",
+ "gui_settings_password_label": "Passwort",
+ "gui_settings_button_save": "Speichern",
+ "gui_settings_button_cancel": "Abbrechen",
+ "gui_settings_button_help": "Hilfe",
+ "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",
+ "systray_download_completed_message": "Der Benutzer hat deine Dateien heruntergeladen",
+ "systray_download_canceled_title": "OnionShare Download abgebrochen",
+ "systray_download_canceled_message": "Der Benutzer hat den Download abgebrochen",
+ "gui_copy_hidservauth": "HidServAuth kopieren",
+ "gui_canceled": "Abgebrochen",
+ "gui_copied_hidservauth_title": "HidServAuth kopiert",
+ "gui_quit_warning_quit": "Beenden",
+ "gui_quit_warning_dont_quit": "Abbrechen",
+ "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 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} ist keine lesbare Datei.",
+ "no_available_port": "Es konnte kein freier verfügbarer Port gefunden werden, um OnionShare zu starten",
+ "close_on_autostop_timer": "Angehalten, da der automatische Timer abgelaufen ist",
+ "systray_upload_started_title": "OnionShare Upload wurde gestartet",
+ "systray_upload_started_message": "Ein Benutzer hat begonnen, Dateien auf deinen Computer hochzuladen",
+ "help_autostop_timer": "Den Server nach einer bestimmten Zeit anhalten (in Sekunden)",
+ "help_receive": "Empfange Dateien anstatt sie zu senden",
+ "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 Steuerungs-Port",
+ "gui_settings_connection_type_socket_file_option": "Verbinde über einen Socket-Datei",
+ "gui_settings_control_port_label": "Steuerungs-Port",
+ "gui_settings_socket_file_label": "Socket-Datei",
+ "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": "Keine Bridges benutzen",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Benutze integrierte „obfs4 pluggable transports“",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Benutze integrierte „obfs4 pluggable transports“ (benötigt obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Benutze integrierte „meek_lite (Amazon) pluggable transports“",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Benutze integrierte „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?lang=de\">https://bridges.torproject.org</a>",
+ "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 Tor-Netzwerk",
+ "gui_tor_connection_ask_quit": "Beenden",
+ "gui_tor_connection_lost": "Verbindung zu Tor getrennt.",
+ "help_stealth": "Nutze Klientauthorisierung (fortgeschritten)",
+ "gui_receive_start_server": "Empfangsmodus starten",
+ "gui_receive_stop_server": "Empfangsmodus stoppen",
+ "gui_receive_stop_server_autostop_timer": "Empfangsmodus stoppen ({} verbleibend)",
+ "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",
+ "gui_download_upload_progress_complete": "%p%, {0:s} vergangen.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (berechne)",
+ "gui_download_upload_progress_eta": "{0:s}, Voraussichtliche Dauer: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Nicht so schnell",
+ "gui_share_quit_warning": "Du versendest gerade Dateien. Bist du sicher, dass du OnionShare beenden willst?",
+ "gui_receive_quit_warning": "Du empfängst gerade Dateien. Bist du sicher, dass du OnionShare beenden willst?",
+ "error_rate_limit": "Jemand hat zu viele falsche Versuche gemacht, dein Passwort zu erraten, deswegen hat OnionShare die Freigabe gestoppt. Starte die Freigabe erneut und sende dem Empfänger eine neue OnionShare-Adresse.",
+ "zip_progress_bar_format": "Komprimiere: %p%",
+ "error_stealth_not_supported": "Um die Client-Authorisierung 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 sowohl 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": "Client-Authorisierung 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 automatische Konfiguration mittels Tor Browser",
+ "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 Tor-Netzwerk verbinden kannst.",
+ "gui_settings_tor_bridges_invalid": "Keine der Bridges, die du angegeben hast, funktioniert.\nÜberprüfe sie oder gib andere an.",
+ "settings_error_unknown": "Kann nicht zum Tor-Controller verbinden, weil deine Einstellungen keinen Sinn ergeben.",
+ "settings_error_automatic": "Kann nicht zum Tor-Controller verbinden. Läuft der Tor Browser (kann von https://www.torproject.org/ heruntergeladen werden) 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 Cookie-Datei nicht lesen.",
+ "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 Tor-Netzwerk 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 sich nicht mit Tor verbinden:\n{}",
+ "settings_test_success": "Verbunden mit dem Tor-Controller.\n\nTor-Version: {}\nUnterstützt vorübergehende Onion-Dienste: {}.\nUnterstützt Client-Authorisierung: {}.\nUnterstützt .onion-Adressen der nächsten Generation: {}.",
+ "error_tor_protocol_error": "Es gab einen Fehler mit Tor: {}",
+ "error_tor_protocol_error_unknown": "Es gab einen unbekannten Fehler mit Tor",
+ "error_invalid_private_key": "Diese Art von privatem Schlüssel wird nicht unterstützt",
+ "update_available": "Es gibt eine neue Version von OnionShare. <a href='{}'>Klicke hier</a>, um sie herunterzuladen.<br><br>Du benutzt {}, und die neueste Version ist {}.",
+ "update_error_check_error": "Konnte nicht nach neueren Versionen suchen: Bist du vielleicht nicht mit dem Tor-Netzwerk verbunden oder ist die OnionShare-Webseite offline?",
+ "update_error_invalid_latest_version": "Konnte nicht nach neueren Versionen suchen: Laut OnionShare-Webseite ist die neueste Version die nicht bestimmbare Version '{}'…",
+ "update_not_available": "Du benutzt bereits die neueste Version von OnionShare.",
+ "gui_tor_connection_ask": "Einstellungen öffnen, um die Verbindung zum Tor-Netzwerk zu reparieren?",
+ "gui_tor_connection_ask_open_settings": "Ja",
+ "gui_tor_connection_error_settings": "Versuche in den Einstellungen zu ändern, wie sich OnionShare mit dem Tor-Netzwerk verbindet.",
+ "gui_tor_connection_canceled": "Konnte keine Verbindung zu Tor herstellen.\n\nStelle sicher, dass du mit dem Internet verbunden bist, öffne OnionShare erneut und richte die Verbindung zu Tor ein.",
+ "share_via_onionshare": "Teilen über OnionShare",
+ "gui_use_legacy_v2_onions_checkbox": "Nutze das alte Adressformat",
+ "gui_save_private_key_checkbox": "Nutze eine gleichbleibende Adresse",
+ "gui_share_url_description": "<b>Jeder</b> mit dieser OnionShare-Adresse kann deine Dateien mit dem <b>Tor Browser</b> <b>herunterladen</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Jeder</b> mit dieser OnionShare-Adresse kann mit dem <b>Tor Browser</b> Dateien auf deinen Computer <b>hochladen</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Diese Freigabe wird nicht automatisch stoppen.<br><br>Jede folgende Freigabe wird die Adresse erneut nutzen. (Um Adressen nur einmal zu nutzen, schalte \"Nutze beständige Adressen\" in den Einstellungen aus.)",
+ "gui_url_label_stay_open": "Diese Freigabe wird nicht automatisch stoppen.",
+ "gui_url_label_onetime": "Diese Freigabe wird nach dem ersten vollständigen Download stoppen.",
+ "gui_status_indicator_share_working": "Starte…",
+ "gui_status_indicator_share_started": "Teilen",
+ "gui_status_indicator_receive_stopped": "Bereit zum Empfangen",
+ "gui_status_indicator_receive_working": "Starte…",
+ "gui_status_indicator_receive_started": "Empfange",
+ "gui_file_info": "{} Dateien, {}",
+ "gui_file_info_single": "{} Datei, {}",
+ "history_completed_tooltip": "{} abgeschlossen",
+ "info_in_progress_uploads_tooltip": "{} Upload(s) laufen",
+ "info_completed_uploads_tooltip": "{} Upload(s) vollständig",
+ "error_cannot_create_downloads_dir": "Konnte den Ordner für den Empfängermodus nicht erstellen: {}",
+ "receive_mode_downloads_dir": "Dateien, die dir geschickt werden, findest du in diesem Ordner: {}",
+ "receive_mode_warning": "Achtung: Im Empfängermodus können Leute Dateien auf deinen Computer laden. Einige Dateien können die Kontrolle über deinen Computer übernehmen, wenn du sie öffnest. Öffne nur Dateien von Personen, denen du vertraust oder wenn du genau weißt, was du tust.",
+ "gui_receive_mode_warning": "Im Empfangsmodus können Personen Dateien auf deinen Computer laden.<br><br><b>Einige Dateien können die Kontrolle über deinen Computer übernehmen, wenn du sie öffnest. Öffne nur Dateien von Personen, denen du vertraust, oder wenn du genau weißt, was du tust.</b>",
+ "receive_mode_received_file": "Empfangen: {}",
+ "gui_mode_share_button": "Versende Dateien",
+ "gui_mode_receive_button": "Empfange Dateien",
+ "gui_settings_receiving_label": "Empfangs-Einstellungen",
+ "gui_settings_downloads_label": "Speichere Dateien in",
+ "gui_settings_downloads_button": "Durchsuchen",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "Der Empfängermodus kann vom Versender gestoppt werden",
+ "gui_settings_public_mode_checkbox": "Öffentlicher Modus",
+ "systray_close_server_title": "OnionShareServer gestoppt",
+ "systray_close_server_message": "Ein Nutzer hat den Server gestoppt",
+ "systray_download_page_loaded_message": "Ein Nutzer hat die Downloadseite geöffnet",
+ "systray_upload_page_loaded_message": "Ein Nutzer hat die Uploadseite geöffnet",
+ "gui_uploads": "Uploadhistorie",
+ "gui_no_uploads": "Bisher keine Uploads",
+ "gui_clear_history": "Alle löschen",
+ "gui_upload_in_progress": "Upload gestartet {}",
+ "gui_download_in_progress": "Download gestartet {}",
+ "gui_open_folder_error_nautilus": "Kann den Ordner nicht öffnen, weil Nautilus nicht verfügbar ist. Die Datei ist hier: {}",
+ "gui_settings_language_label": "Bevorzugte Sprache",
+ "gui_settings_language_changed_notice": "Starte OnionShare neu, damit die neue Sprache übernommen wird.",
+ "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 klicken, um deinen HidServAuth zu kopieren.",
+ "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_autostop_timer": "Die Zeit ist abgelaufen, bevor der Server gestartet werden konnte. Bitte starte einen erneuten Teilvorgang.",
+ "gui_server_autostop_timer_expired": "Der automatische Stopp-Timer ist bereits abgelaufen. Bitte pass diesen an, 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",
+ "systray_page_loaded_title": "Seite geladen",
+ "gui_upload_finished_range": "{} hochgeladen zu {}",
+ "gui_upload_finished": "{} hochgeladen",
+ "gui_add_files": "Dateien hinzufügen",
+ "gui_add_folder": "Ordner hinzufügen",
+ "gui_connect_to_tor_for_onion_settings": "Verbinde dich mit Tor, um die Einstellungen für die Onion-Dienste zu sehen",
+ "gui_url_label_onetime_and_persistent": "Diese Freigabe wird nicht automatisch stoppen. >br><br>Jede nachfolgende Freigabe wird die gleiche Adresse nutzen. (Um jedes Mal eine andere Adresse zu nutzen, schalte \"Nutze eine gleichbleibende Adresse\" in den Einstellungen aus.)",
+ "gui_settings_onion_label": "Adresseinstellungen",
+ "error_cannot_create_data_dir": "Der Ordner für die OnionShare-Dateien konnte nicht erstellt werden: {}",
+ "receive_mode_data_dir": "Die Dateien, die dir geschickt wurden, findest du in folgendem Ordner: {}",
+ "gui_settings_data_dir_label": "Speichere Dateien in",
+ "gui_settings_data_dir_browse_button": "Durchsuchen",
+ "systray_page_loaded_message": "OnionShare-Adresse geladen",
+ "systray_share_started_title": "Freigabe gestartet",
+ "systray_share_started_message": "Upload von Dateien begonnen",
+ "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_receive_started_title": "Empfange",
+ "systray_receive_started_message": "Jemand sendet dir Dateien",
+ "gui_all_modes_history": "Verlauf",
+ "gui_all_modes_clear_history": "Liste leeren",
+ "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": "Noch keine Dateien versendet",
+ "gui_share_mode_autostop_timer_waiting": "Warte auf Abschluss des Sendens",
+ "gui_receive_mode_no_files": "Noch 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 um:",
+ "gui_waiting_to_start": "Geplant in {} zu starten. Klicken zum Abbrechen.",
+ "gui_stop_server_autostop_timer_tooltip": "Automatischer Stopptimer endet um {}",
+ "gui_start_server_autostart_timer_tooltip": "Automatischer Stopptimer endet um {}",
+ "gui_server_autostart_timer_expired": "Die geplante Zeit ist bereits abgelaufen. Bitte passe diese an, um das Teilen zu starten.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Die automatische Stoppzeit kann nicht gleich oder früher als die Startzeit sein. Bitte passe die Zeiten an, 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",
+ "invalid_password_guess": "Ungültige Passwortratschläge",
+ "gui_website_url_description": "<b>Jeder</b> mit dieser OnionShare-Adresse kann deine Webseite mit dem <b>Tor Browser</b> <b>ansehen</b>: <img src='{}' />",
+ "gui_mode_website_button": "Webseite veröffentlichen",
+ "systray_site_loaded_title": "Webseite geladen",
+ "systray_site_loaded_message": "OnionShare Website geladen",
+ "systray_website_started_title": "Freigabe der Webseite starten",
+ "systray_website_started_message": "Jemand besucht deine Webseite",
+ "gui_website_mode_no_files": "Noch keine Webseite freigegeben",
+ "gui_visit_started": "Jemand hat deine Webseite besucht {}",
+ "incorrect_password": "Falsches Passwort",
+ "systray_individual_file_downloaded_title": "Individuelle Datei geladen",
+ "gui_settings_individual_downloads_label": "Abwählen, um den Download einzelner Dateien zu erlauben",
+ "history_requests_tooltip": "{} Web-Anfragen",
+ "systray_individual_file_downloaded_message": "Individuelle Datei {} betrachtet",
+ "mode_settings_share_autostop_sharing_checkbox": "Dateifreigabe beenden, sobald alle Dateien versendet wurden (abwählen, um das Herunterladen einzelner Dateien zu erlauben)",
+ "mode_settings_website_disable_csp_checkbox": "Content-Security-Policy-Header deaktivieren (ermöglicht es, Ressourcen von Drittanbietern auf deiner Onion-Webseite einzubinden)",
+ "mode_settings_receive_data_dir_browse_button": "Durchsuchen",
+ "mode_settings_receive_data_dir_label": "Dateien speichern unter",
+ "mode_settings_client_auth_checkbox": "Benutze Client-Authorisierung",
+ "mode_settings_legacy_checkbox": "Benutze ein veraltetes Adressformat (Onion-Dienste-Adressformat v2, nicht empfohlen)",
+ "mode_settings_autostop_timer_checkbox": "Onion-Dienst zu einem festgelegten Zeitpunkt stoppen",
+ "mode_settings_autostart_timer_checkbox": "Onion-Dienst zu einem festgelegten Zeitpunkt starten",
+ "mode_settings_public_checkbox": "Kein Passwort verwenden",
+ "mode_settings_persistent_checkbox": "Speichere diesen Reiter und öffne ihn automatisch, wenn ich OnionShare starte",
+ "mode_settings_advanced_toggle_hide": "Erweiterte Einstellungen ausblenden",
+ "mode_settings_advanced_toggle_show": "Erweiterte Einstellungen anzeigen",
+ "gui_quit_warning_cancel": "Abbrechen",
+ "gui_quit_warning_description": "In einigen Reitern sind noch Dateifreigaben aktiv. Wenn du beendest, werden alle Reiter geschlossen. Möchtest du wirklich beenden?",
+ "gui_quit_warning_title": "Bist du sicher?",
+ "gui_close_tab_warning_cancel": "Abbrechen",
+ "gui_close_tab_warning_close": "Schließen",
+ "gui_close_tab_warning_website_description": "Du hostest gerade eine Webseite. Möchtest du diesen Reiter wirklich schließen?",
+ "gui_close_tab_warning_receive_description": "Du empfängst gerade Dateien. Möchtest du diesen Reiter wirklich schließen?",
+ "gui_close_tab_warning_share_description": "Du versendest gerade Dateien. Möchtest du diesen Reiter wirklich schließen?",
+ "gui_close_tab_warning_persistent_description": "Dies ist ein dauerhafter Reiter. Wenn du ihn schließt, verlierst du die dazugehörige Onion-Adresse. Möchtest du den Reiter wirklich schließen?",
+ "gui_close_tab_warning_title": "Bist du sicher?",
+ "gui_new_tab_website_description": "Hoste eine statische HTML-Onion-Webseite auf deinem Computer.",
+ "gui_new_tab_website_button": "Webseite veröffentlichen",
+ "gui_new_tab_receive_description": "Verwandle deinen Computer in eine Online-Packstation. Nutzer des Tor Browsers können dir Dateien auf deinen Computer schicken.",
+ "gui_new_tab_receive_button": "Dateien empfangen",
+ "gui_new_tab_share_description": "Wähle Dateien auf deinem Computer, um sie jemand anderem zu schicken. Die Empfänger benötigen den Tor Browser, um die Dateien empfangen zu können.",
+ "gui_new_tab_share_button": "Dateien teilen",
+ "gui_new_tab_tooltip": "Einen neuen Reiter öffnen",
+ "gui_new_tab": "Neuer Reiter",
+ "gui_settings_website_label": "Webseiten-Einstellung",
+ "gui_settings_csp_header_disabled_option": "Content-Security-Policy-Header deaktivieren",
+ "gui_tab_name_website": "Webseite",
+ "gui_tab_name_chat": "Chat",
+ "gui_tab_name_receive": "Empfangen",
+ "gui_tab_name_share": "Teilen",
+ "gui_file_selection_remove_all": "Alle entfernen",
+ "gui_remove": "Entfernen",
+ "gui_new_tab_chat_button": "Anonym chatten",
+ "gui_qr_code_dialog_title": "OnionShare QR-Code",
+ "gui_show_url_qr_code": "QR-Code anzeigen",
+ "gui_chat_stop_server": "Chatserver stoppen",
+ "gui_chat_start_server": "Chatserver starten"
+}
diff --git a/desktop/share/locale/el.json b/desktop/share/locale/el.json
new file mode 100644
index 00000000..b4645890
--- /dev/null
+++ b/desktop/share/locale/el.json
@@ -0,0 +1,238 @@
+{
+ "config_onion_service": "Δημιουργία onion service στην πύλη {0:d}.",
+ "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": "Προειδοποίηση: Η αποστολή μεγάλου όγκου δεδομένων μπορεί να διαρκέσει ώρες",
+ "systray_menu_exit": "Έξοδος",
+ "systray_download_started_title": "Η λήψη του OnionShare ξεκίνησε",
+ "systray_download_started_message": "Ένας/μια χρήστης/τρια ξεκίνησε να κατεβάζει τα αρχεία σου",
+ "systray_download_completed_title": "Η λήψη του OnionShare ολοκληρώθηκε",
+ "systray_download_completed_message": "Ο/η χρήστης/τρια ολοκλήρωσε την λήψη των αρχείων σου",
+ "systray_download_canceled_title": "Η λήψη του OnionShare ακυρώθηκε",
+ "systray_download_canceled_message": "Ο/η χρήστης/τρια ακύρωσε τη λήψη",
+ "systray_upload_started_title": "Η λήψη του OnionShare ξεκίνησε",
+ "systray_upload_started_message": "Ένας/μια χρήστης/τρια ξεκίνησε να ανεβάζει αρχεία στον υπολογιστή σου",
+ "help_local_only": "Να μην χρησιμοποιηθεί το Tor (μόνο για development)",
+ "help_stay_open": "Να συνεχίσει ο διαμοιρασμός μετά την αποστολή των αρχείων",
+ "help_autostop_timer": "Να τερματιστεί ο διαμοιρασμός μετά από ένα συγκεκριμένο αριθμό δευτερολέπτων",
+ "help_stealth": "Κάντε χρήση εξουσιοδότησης πελάτη (Για προχωρημένους)",
+ "help_receive": "Λάβετε διαμοιρασμένα αρχεία αντι να τα στέλνετε",
+ "help_verbose": "Κατέγραψε τα σφάλματα του OnionShare στο stdout (συνήθως οθόνη) και τα σφάλματα web στον δίσκο",
+ "help_filename": "Λίστα αρχείων ή φακέλων για μοίρασμα",
+ "help_config": "Ορίστε σημείο αποθήκευσης αρχείου JSON",
+ "gui_drag_and_drop": "Σύρτε και αφήστε αρχεία και φακέλους\nγια να αρχίσετε να τα μοιράζεστε",
+ "gui_add": "Προσθήκη",
+ "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": "Αντιγραφή 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_download_upload_progress_complete": "%p%, {0:s} πέρασαν.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (υπολογισμός)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "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 σταμάτησε τον server. Ξεκινήστε πάλι το διαμοιρασμό και στείλτε στον/ην παραλήπτη/τρια μια νέα διεύθυνση για διαμοιρασμό.",
+ "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_sharing_label": "Ρυθμίσεις κοινοποίησης",
+ "gui_settings_close_after_first_download_option": "Τερματισμός κοινοποίησης αρχείων μετά την αποστολή τους",
+ "gui_settings_connection_type_label": "Πώς να συνδέεται το OnionShare με το Tor;",
+ "gui_settings_connection_type_bundled_option": "Χρησιμοποιήστε την έκδοση του Tor που είναι ενσωματωμένη στο OnionShare",
+ "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 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": "Προσοχή: Τα meek_lite bridges επιβαρύνουν πολύ το Tor Project στη λειτουργία. <br><br> Χρησιμοποιήστε τα μόνο αν δεν μπορείτε να συνδεθείτε κατ' ευθείαν στο Tor μέσω obfs4 transports ή άλλων κανονικών bridges.",
+ "gui_settings_tor_bridges_custom_radio_option": "Χρήση παραμετροποιημένων bridges",
+ "gui_settings_tor_bridges_custom_label": "Αποκτήστε bridges στο <a href=\"https://bridges.torproject.org/options?lang=el\"> https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Δεν λειτούργησε κάποιο από τα bridges που προσθέσατε.\nΞαναελέγξτε τα ή προσθέστε άλλα.",
+ "gui_settings_button_save": "Αποθήκευση",
+ "gui_settings_button_cancel": "Ακύρωση",
+ "gui_settings_button_help": "Βοήθεια",
+ "gui_settings_autostop_timer_checkbox": "Χρήση χρονομέτρου αυτόματης διακοπής",
+ "gui_settings_autostop_timer": "Διακοπή διαμοιρασμού σε:",
+ "settings_error_unknown": "Αποτυχία σύνδεσης στον ελεγκτή Tor, γιατί οι ρυθμίσεις σας δεν βγάζουν κανένα νόημα.",
+ "settings_error_automatic": "Αδυναμία σύνδεσης στον ελεγκτή Tor. Λειτουργεί ο Tor Browser (διαθέσιμος στο torproject.org) στο παρασκήνιο;",
+ "settings_error_socket_port": "Αδυναμία σύνδεσης στον ελεγκτή Tor στις {}:{}.",
+ "settings_error_socket_file": "Αποτυχία σύνδεσης στον ελεγκτή Tor χρησιμοποιώντας το αρχείο socket {}.",
+ "settings_error_auth": "Εγινε σύνδεση με {}:{}, αλλα δεν μπορεί να γίνει πιστοποίηση. Ίσως δεν είναι ελεγκτής Tor;",
+ "settings_error_missing_password": "Έγινε σύνδεση με τον ελεγκτή Tor, αλλά απαιτείται κωδικός για πιστοποίηση.",
+ "settings_error_unreadable_cookie_file": "Έγινε σύνδεση με τον ελεγκτή Tor, αλλα ο κωδικός πιθανόν να είναι λάθος, ή δεν επιτρέπεται στο χρήστη να διαβάζει αρχεία cookie.",
+ "settings_error_bundled_tor_not_supported": "Η χρήση της έκδοσης Tor που περιέχεται στο OnionShare δεν είναι συμβατή με το περιβάλλον προγραμματιστή σε Windows ή macOS.",
+ "settings_error_bundled_tor_timeout": "Η σύνδεση με Tor αργεί αρκετά. Ισως δεν είστε συνδεδεμένοι στο Διαδίκτυο ή το ρολόι του συστήματος δεν είναι σωστό;",
+ "settings_error_bundled_tor_broken": "Το OnionShare δεν μπορεί να συνδεθεί με το Tor στο παρασκήνιο:\n{}",
+ "settings_test_success": "Εγινε σύνδεση με τον ελεγκτή Tor.\n\nΕκδοση Tor: {}\nΥποστηρίζει εφήμερες υπηρεσίες onion: {}.\nΥποστηρίζει πιστοποίηση πελάτη: {}.\nΥποστηρίζει νέας γενιάς διευθύνσεις .onion: {}.",
+ "error_tor_protocol_error": "Υπήρξε σφάλμα με το Tor: {}",
+ "error_tor_protocol_error_unknown": "Υπήρξε άγνωστο σφάλμα με το Tor",
+ "error_invalid_private_key": "Αυτο το ιδιωτικό κλειδί δεν υποστηρίζεται",
+ "connecting_to_tor": "Γίνεται σύνδεση στο δίκτυο Tor",
+ "update_available": "Βγήκε ενα νέο OnionShare. <a href='{}'>Κάντε κλικ εδώ</a> για να το λάβετε.<br><br>Χρησιμοποιείτε {} και το πιό πρόσφατο είναι το {}.",
+ "update_error_check_error": "Δεν μπόρεσε να γίνει έλεγχος για νέα έκδοση. Ο ιστότοπος του 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": "Το χρονόμετρο αυτόματης διακοπής τελείωσε πριν την εκκίνηση του server. Παρακαλώ κάντε ένα νέο διαμοιρασμό.",
+ "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>κατεβάσει</b> τα αρχεία σας χρησιμοποιώντας το <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare, μπορεί να <b>ανεβάσει</b> αρχεία στον υπολογιστή σας χρησιμοποιώντας το <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Αυτός ο διαμοιρασμός δεν θα λήξει αυτόματα.<br><br>Οποιοσδήποτε επακόλουθος διαμοιρασμός θα επαναχρησιμοποιήσει αυτή τη διεύθυνση. (Για να χρησιμοποιήσετε διευθύνσεις μιας χρήσης, απενεργοποιήστε τη λειτουργία \"Χρήση μόνιμης διεύθυνσης\" στις Ρυθμίσεις.)",
+ "gui_url_label_stay_open": "Αυτός ο διαμοιρασμός δε λήγει αυτόματα.",
+ "gui_url_label_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": "Η λειτουργία λήψης, επιτρέπει σε τρίτους/ες να ανεβάζουν αρχεία στον υπολογιστή σας.<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": "Δημόσια λειτουργία",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "Η σελίδα φορτώθηκε",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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 για να εφαρμοστεί η αλλαγή γλώσσας.",
+ "timeout_upload_still_running": "Αναμονή ολοκλήρωσης του ανεβάσματος",
+ "gui_add_files": "Προσθέστε αρχεία",
+ "gui_add_folder": "Προσθέστε φάκελο",
+ "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_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": "δ",
+ "gui_website_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare μπορεί <b>να επισκεφτεί</b> την ιστοσελία χρησιμοποιώντας τον <b>Tor Browser</b>: <img src='{}' />",
+ "gui_mode_website_button": "Δημοσίευση ιστοσελίδας",
+ "gui_website_mode_no_files": "Η ιστοσελίδα δεν έχει μοιραστεί ακόμα",
+ "incorrect_password": "Λάθος κωδικός",
+ "gui_settings_individual_downloads_label": "Απεπιλέξτε για να επιτρέψετε τη λήψη μεμονωμένων αρχείων",
+ "history_requests_tooltip": "{} αιτήματα δικτύου",
+ "gui_settings_csp_header_disabled_option": "Απενεργοποίηση της κεφαλίδας Content Security Policy",
+ "gui_settings_website_label": "Ρυθμίσεις ιστοσελίδας"
+}
diff --git a/desktop/share/locale/en.json b/desktop/share/locale/en.json
new file mode 100644
index 00000000..b56c52d8
--- /dev/null
+++ b/desktop/share/locale/en.json
@@ -0,0 +1,191 @@
+{
+ "not_a_readable_file": "{0:s} is not a readable file.",
+ "other_page_loaded": "Address loaded",
+ "incorrect_password": "Incorrect password",
+ "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",
+ "gui_drag_and_drop": "Drag and drop files and folders to start sharing",
+ "gui_add": "Add",
+ "gui_add_files": "Add Files",
+ "gui_add_folder": "Add Folder",
+ "gui_remove": "Remove",
+ "gui_file_selection_remove_all": "Remove All",
+ "gui_choose_items": "Choose",
+ "gui_share_start_server": "Start sharing",
+ "gui_share_stop_server": "Stop sharing",
+ "gui_share_stop_server_autostop_timer": "Stop Sharing ({})",
+ "gui_chat_start_server": "Start chat server",
+ "gui_chat_stop_server": "Stop chat server",
+ "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_autostop_timer": "Stop Receive Mode ({} remaining)",
+ "gui_receive_flatpak_data_dir": "Because you installed OnionShare using Flatpak, you must save files to a folder in ~/OnionShare.",
+ "gui_copy_url": "Copy Address",
+ "gui_copy_hidservauth": "Copy HidServAuth",
+ "gui_canceled": "Canceled",
+ "gui_copied_url_title": "Copied OnionShare Address",
+ "gui_copied_url": "OnionShare address copied to clipboard",
+ "gui_copied_hidservauth_title": "Copied HidServAuth",
+ "gui_copied_hidservauth": "HidServAuth line copied to clipboard",
+ "gui_show_url_qr_code": "Show QR Code",
+ "gui_qr_code_dialog_title": "OnionShare QR Code",
+ "gui_qr_code_description": "Scan this QR code with a QR reader, such as the camera on your phone, in order to more easily share the OnionShare address with someone.",
+ "gui_waiting_to_start": "Scheduled to start in {}. Click to cancel.",
+ "gui_please_wait": "Starting… Click to cancel.",
+ "error_rate_limit": "Someone has made too many wrong attempts to guess your password, so OnionShare has stopped the server. Start sharing again and send the recipient a new address to share.",
+ "zip_progress_bar_format": "Compressing: %p%",
+ "gui_settings_window_title": "Settings",
+ "gui_settings_autoupdate_label": "Check for new version",
+ "gui_settings_autoupdate_option": "Notify me when a new version is available",
+ "gui_settings_autoupdate_timestamp": "Last checked: {}",
+ "gui_settings_autoupdate_timestamp_never": "Never",
+ "gui_settings_autoupdate_check_button": "Check for New Version",
+ "gui_settings_connection_type_label": "How should OnionShare connect to Tor?",
+ "gui_settings_connection_type_bundled_option": "Use the Tor version built into OnionShare",
+ "gui_settings_connection_type_automatic_option": "Attempt auto-configuration with Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Connect using control port",
+ "gui_settings_connection_type_socket_file_option": "Connect using socket file",
+ "gui_settings_connection_type_test_button": "Test Connection to Tor",
+ "gui_settings_control_port_label": "Control port",
+ "gui_settings_socket_file_label": "Socket file",
+ "gui_settings_socks_label": "SOCKS port",
+ "gui_settings_authenticate_label": "Tor authentication settings",
+ "gui_settings_authenticate_no_auth_option": "No authentication, or cookie authentication",
+ "gui_settings_authenticate_password_option": "Password",
+ "gui_settings_password_label": "Password",
+ "gui_settings_tor_bridges": "Tor bridge support",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Don't use bridges",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Use built-in obfs4 pluggable transports",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Use built-in obfs4 pluggable transports (requires obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Use built-in meek_lite (Azure) pluggable transports",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Use built-in meek_lite (Azure) pluggable transports (requires obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "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": "Use custom bridges",
+ "gui_settings_tor_bridges_custom_label": "You can get bridges from <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "None of the bridges you added work.\nDouble-check them or add others.",
+ "gui_settings_button_save": "Save",
+ "gui_settings_button_cancel": "Cancel",
+ "gui_settings_button_help": "Help",
+ "settings_test_success": "Connected to the Tor controller.\n\nTor version: {}\nSupports ephemeral onion services: {}.\nSupports client authentication: {}.\nSupports next-gen .onion addresses: {}.",
+ "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_invalid_latest_version": "Could not check for new version: The OnionShare website is saying the latest version is the unrecognizable '{}'…",
+ "update_error_check_error": "Could not check for new version: Maybe you're not connected to Tor, or the OnionShare website is down?",
+ "update_not_available": "You are running the latest OnionShare.",
+ "gui_tor_connection_ask": "Open the settings to sort out connection to Tor?",
+ "gui_tor_connection_ask_open_settings": "Yes",
+ "gui_tor_connection_ask_quit": "Quit",
+ "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\nMake sure 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_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 adjust it to start sharing.",
+ "gui_server_autostart_timer_expired": "The scheduled time has already passed. Please adjust 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 adjust it to start sharing.",
+ "share_via_onionshare": "Share via OnionShare",
+ "gui_share_url_description": "<b>Anyone</b> with this OnionShare address can <b>download</b> your files using the <b>Tor Browser</b>: <img src='{}' />",
+ "gui_website_url_description": "<b>Anyone</b> with this OnionShare address can <b>visit</b> your website using the <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Anyone</b> with this OnionShare address can <b>upload</b> files to your computer using the <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "This share will not auto-stop.<br><br>Every subsequent share reuses the address. (To use one-time addresses, turn off \"Use persistent address\" in the settings.)",
+ "gui_url_label_stay_open": "This share will not auto-stop.",
+ "gui_url_label_onetime": "This share will stop after first completion.",
+ "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",
+ "history_requests_tooltip": "{} web requests",
+ "error_cannot_create_data_dir": "Could not create OnionShare data folder: {}",
+ "gui_receive_mode_warning": "Receive mode lets people upload files to your computer.<br><br><b>Some files can potentially take control of your computer if you open them. Only open things from people you trust, or if you know what you are doing.</b>",
+ "gui_open_folder_error": "Failed to open folder with xdg-open. The file is here: {}",
+ "gui_settings_language_label": "Preferred language",
+ "gui_settings_language_changed_notice": "Restart OnionShare for the new language to be applied.",
+ "systray_menu_exit": "Quit",
+ "systray_page_loaded_title": "Page Loaded",
+ "systray_page_loaded_message": "OnionShare address loaded",
+ "systray_share_started_title": "Sharing Started",
+ "systray_share_started_message": "Starting to send files to someone",
+ "systray_share_completed_title": "Sharing Complete",
+ "systray_share_completed_message": "Finished sending files",
+ "systray_share_canceled_title": "Sharing Canceled",
+ "systray_share_canceled_message": "Someone canceled receiving your files",
+ "systray_receive_started_title": "Receiving Started",
+ "systray_receive_started_message": "Someone is sending files to you",
+ "gui_all_modes_history": "History",
+ "gui_all_modes_clear_history": "Clear All",
+ "gui_all_modes_transfer_started": "Started {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} elapsed.",
+ "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_autostop_timer_waiting": "Waiting to finish sending",
+ "gui_website_mode_no_files": "No Website Shared Yet",
+ "gui_receive_mode_no_files": "No Files Received Yet",
+ "gui_receive_mode_autostop_timer_waiting": "Waiting to finish receiving",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s",
+ "gui_new_tab": "New Tab",
+ "gui_new_tab_tooltip": "Open a new tab",
+ "gui_new_tab_share_button": "Share Files",
+ "gui_new_tab_receive_button": "Receive Files",
+ "gui_new_tab_website_button": "Host a Website",
+ "gui_new_tab_chat_button": "Chat Anonymously",
+ "gui_main_page_share_button": "Start Sharing",
+ "gui_main_page_receive_button": "Start Receiving",
+ "gui_main_page_website_button": "Start Hosting",
+ "gui_main_page_chat_button": "Start Chatting",
+ "gui_tab_name_share": "Share",
+ "gui_tab_name_receive": "Receive",
+ "gui_tab_name_website": "Website",
+ "gui_tab_name_chat": "Chat",
+ "gui_close_tab_warning_title": "Are you sure?",
+ "gui_close_tab_warning_persistent_description": "This tab is persistent. If you close it you'll lose the onion address that it's using. Are you sure you want to close it?",
+ "gui_close_tab_warning_share_description": "You're in the process of sending files. Are you sure you want to close this tab?",
+ "gui_close_tab_warning_receive_description": "You're in the process of receiving files. Are you sure you want to close this tab?",
+ "gui_close_tab_warning_website_description": "You're actively hosting a website. Are you sure you want to close this tab?",
+ "gui_close_tab_warning_close": "Close",
+ "gui_close_tab_warning_cancel": "Cancel",
+ "gui_quit_warning_title": "Are you sure?",
+ "gui_quit_warning_description": "Sharing is active in some of your tabs. If you quit, all of your tabs will close. Are you sure you want to quit?",
+ "gui_quit_warning_quit": "Quit",
+ "gui_quit_warning_cancel": "Cancel",
+ "mode_settings_advanced_toggle_show": "Show advanced settings",
+ "mode_settings_advanced_toggle_hide": "Hide advanced settings",
+ "mode_settings_persistent_checkbox": "Save this tab, and automatically open it when I open OnionShare",
+ "mode_settings_public_checkbox": "Don't use a password",
+ "mode_settings_autostart_timer_checkbox": "Start onion service at scheduled time",
+ "mode_settings_autostop_timer_checkbox": "Stop onion service at scheduled time",
+ "mode_settings_legacy_checkbox": "Use a legacy address (v2 onion service, not recommended)",
+ "mode_settings_client_auth_checkbox": "Use client authorization",
+ "mode_settings_share_autostop_sharing_checkbox": "Stop sharing after files have been sent (uncheck to allow downloading individual files)",
+ "mode_settings_receive_data_dir_label": "Save files to",
+ "mode_settings_receive_data_dir_browse_button": "Browse",
+ "mode_settings_website_disable_csp_checkbox": "Don't send Content Security Policy header (allows your website to use third-party resources)",
+ "gui_all_modes_transfer_finished_range": "Transferred {} - {}",
+ "gui_all_modes_transfer_finished": "Transferred {}",
+ "gui_all_modes_transfer_canceled_range": "Canceled {} - {}",
+ "gui_all_modes_transfer_canceled": "Canceled {}",
+ "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 {}:{}.",
+ "settings_error_socket_file": "Can't connect to the Tor controller using socket file {}.",
+ "settings_error_auth": "Connected to {}:{}, but can't authenticate. Maybe this isn't a Tor controller?",
+ "settings_error_missing_password": "Connected to Tor controller, but it requires a password to authenticate.",
+ "settings_error_unreadable_cookie_file": "Connected to the Tor controller, but password may be wrong, or your user is not permitted to read the cookie file.",
+ "settings_error_bundled_tor_not_supported": "Using the Tor version that comes with OnionShare does not work in developer mode on Windows or macOS.",
+ "settings_error_bundled_tor_timeout": "Taking too long to connect to Tor. Maybe you aren't connected to the Internet, or have an inaccurate system clock?",
+ "settings_error_bundled_tor_broken": "OnionShare could not connect to Tor:\n{}"
+} \ No newline at end of file
diff --git a/desktop/share/locale/eo.json b/desktop/share/locale/eo.json
new file mode 100644
index 00000000..ea3cef9c
--- /dev/null
+++ b/desktop/share/locale/eo.json
@@ -0,0 +1,63 @@
+{
+ "config_onion_service": "Agordas onion service je pordo {0:d}.",
+ "preparing_files": "Preparas dosierojn por kundivido.",
+ "give_this_url": "Donu ĉi tiun URL al la persono al kiu vi sendas la dosieron:",
+ "give_this_url_stealth": "Give this URL and HidServAuth line to the person you're sending the file to:",
+ "ctrlc_to_stop": "Presu Ctrl-C por halti la servilon",
+ "not_a_file": "{0:s} ne estas dosiero.",
+ "other_page_loaded": "",
+ "closing_automatically": "Haltas aŭtomate ĉar la elŝuto finiĝis",
+ "large_filesize": "Atentigo: Sendado de grandaj dosieroj povas daŭri horojn",
+ "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_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",
+ "gui_delete": "Forviŝi",
+ "gui_choose_items": "Elekti",
+ "gui_share_start_server": "Komenci kundividon",
+ "gui_share_stop_server": "Ĉesigi kundividon",
+ "gui_copy_url": "Kopii URL",
+ "gui_copy_hidservauth": "Kopii HidServAuth",
+ "gui_downloads": "Elŝutoj:",
+ "gui_canceled": "Nuligita",
+ "gui_copied_url": "URL kopiita en tondujon",
+ "gui_copied_hidservauth": "Copied HidServAuth line to clipboard",
+ "gui_please_wait": "Bonvolu atendi...",
+ "gui_download_upload_progress_complete": "%p%, Tempo pasinta: {0:s}",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (Computing ETA)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "version_string": "Onionshare {0:s} | https://onionshare.org/",
+ "gui_share_quit_warning": "Ĉu vi certas ke vi volas foriri?\nLa URL, kiun vi kundividas ne plu ekzistos.",
+ "gui_quit_warning_quit": "Foriri",
+ "gui_quit_warning_dont_quit": "Ne foriri",
+ "error_rate_limit": "Iu atankanto povas provi diveni vian URL. Por eviti tion, OnionShare aŭtomate haltis la servilon. Por kundividi la dosierojn vi devas starti ĝin denove kaj kundividi la novan URL.",
+ "zip_progress_bar_format": "Compressing files: %p%",
+ "error_stealth_not_supported": "To create stealth onion services, you need at least Tor 0.2.9.1-alpha (or Tor Browser 6.5) and at least python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare postulas almenaŭ Tor 0.2.7.1 kaj almenaŭ python3-stem 1.4.0.",
+ "gui_settings_window_title": "",
+ "gui_settings_connection_type_label": "Kiel OnionShare devus konektiĝi al Tor?",
+ "gui_settings_connection_type_automatic_option": "Provi aŭtomate agordi kun Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Konekti per kontrolpordo",
+ "gui_settings_connection_type_socket_file_option": "Konekti per socket-dosiero",
+ "gui_settings_control_port_label": "Kontrolpordo",
+ "gui_settings_socket_file_label": "Socket-dosiero",
+ "gui_settings_authenticate_label": "Tor authentication options",
+ "gui_settings_authenticate_no_auth_option": "",
+ "gui_settings_authenticate_password_option": "Pasvorto",
+ "gui_settings_password_label": "Pasvorto",
+ "gui_settings_button_save": "Konservi",
+ "gui_settings_button_cancel": "Nuligi",
+ "settings_saved": "Agordoj konservitaj en {}",
+ "settings_error_unknown": "Ne eblas konektiĝi al Tor-kontrolilo, ĉar la agordoj ne havas sencon.",
+ "settings_error_automatic": "Ne eblas konektiĝi al Tor-kontrolilo. Ĉu Tor Browser funkcias en la fono? Se vi ne havas ĝin, vi povas ekhavi ĝin je:\nhttps://www.torproject.org/.",
+ "settings_error_socket_port": "Ne eblas konektiĝi al Tor-kontrolilo je {}:{}.",
+ "settings_error_socket_file": "Ne eblas konektiĝi al Tor-kontrolilo per socket-dosiero {}.",
+ "settings_error_auth": "",
+ "settings_error_missing_password": "",
+ "settings_error_unreadable_cookie_file": "Connected to Tor controller, but can't authenticate because your password may be wrong, and your user doesn't have permission to read the cookie file.",
+ "settings_test_success": "Congratulations, OnionShare can connect to the Tor controller.\n\nTor version: {}\nSupports ephemeral onion services: {}\nSupports stealth onion services: {}",
+ "error_tor_protocol_error": "Error talking to the Tor controller.\nIf you're using Whonix, check out https://www.whonix.org/wiki/onionshare to make OnionShare work."
+}
diff --git a/desktop/share/locale/es.json b/desktop/share/locale/es.json
new file mode 100644
index 00000000..e101ae5b
--- /dev/null
+++ b/desktop/share/locale/es.json
@@ -0,0 +1,299 @@
+{
+ "preparing_files": "Comprimiendo los archivos.",
+ "give_this_url": "Entrega esta URL al receptor:",
+ "ctrlc_to_stop": "Pulsa Ctrl-C para detener el servidor",
+ "not_a_file": "{0:s} no es un archivo válido.",
+ "other_page_loaded": "Dirección cargada",
+ "closing_automatically": "Detenido porque ya se completó la transferencia",
+ "help_local_only": "No usar Tor (sólo para desarrollo)",
+ "help_stay_open": "Continuar compartiendo luego que los archivos hayan sido enviados",
+ "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 para comenzar a compartir",
+ "gui_add": "Añadir",
+ "gui_delete": "Eliminar",
+ "gui_choose_items": "Elegir",
+ "gui_share_start_server": "Comienza a compartir",
+ "gui_share_stop_server": "Deja de compartir",
+ "gui_copy_url": "Copiar Dirección",
+ "gui_downloads": "Historial de descargas",
+ "gui_copied_url": "Dirección OnionShare copiada al portapapeles",
+ "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 encontrar un puerto disponible para iniciar el servicio cebolla",
+ "close_on_autostop_timer": "Detenido porque el temporizador de parada automática expiró",
+ "timeout_download_still_running": "Esperando a que se complete la descarga",
+ "large_filesize": "Advertencia: Enviar un recurso compartido grande podría llevar horas",
+ "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 OnionShare Copiada",
+ "gui_copied_hidservauth": "Línea HidServAuth copiada al portapapeles",
+ "gui_please_wait": "Comenzando… Clic para cancelar.",
+ "gui_quit_title": "No tan rápido",
+ "error_rate_limit": "Alguien ha intentado adivinar tu contraseña demasiadas veces, por lo que OnionShare ha detenido al servidor. Inicia la compartición de nuevo y envía una dirección nueva al receptor.",
+ "zip_progress_bar_format": "Comprimiendo: %p%",
+ "error_stealth_not_supported": "Para utilizar autorización de cliente, necesitas al menos Tor 0.2.9.1-alpha (o Navegador Tor 6.5) y python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare necesita por lo menos Tor 0.2.7.1 y python3-stem 1.4.0.",
+ "gui_settings_window_title": "Configuración",
+ "gui_settings_stealth_option": "Utilizar autorización de cliente",
+ "gui_settings_stealth_hidservauth_string": "Habiendo guardado tu clave privada para reutilizarla, ahora puedes hacer clic para copiar tu HidServAuth.",
+ "gui_settings_autoupdate_label": "Comprobar nuevas versiones",
+ "gui_settings_autoupdate_option": "Notifícame cuando haya una versión nueva disponible",
+ "gui_settings_autoupdate_check_button": "Comprobar Nueva Versión",
+ "gui_settings_connection_type_bundled_option": "Usa la versión de Tor incorporada en OnionShare",
+ "gui_settings_connection_type_automatic_option": "Intentar la configuración automática con el Navegador Tor",
+ "gui_settings_connection_type_test_button": "Probar la conexión a Tor",
+ "gui_settings_tor_bridges": "Soporte para puentes Tor",
+ "gui_settings_tor_bridges_invalid": "No funciona ninguno de los puentes agregados.\nVuelve a comprobarlos o añade otros.",
+ "settings_saved": "Ajustes guardados en {}",
+ "give_this_url_receive": "Dele esta dirección al remitente:",
+ "give_this_url_receive_stealth": "Entrega esta dirección y HidServAuth al remitente:",
+ "not_a_readable_file": "{0:s} no es un archivo legible.",
+ "systray_menu_exit": "Salir",
+ "systray_download_started_title": "Iniciada la descarga de OnionShare",
+ "systray_download_started_message": "Alguien comenzó a descargar tus archivos",
+ "systray_download_completed_title": "Descarga de OnionShare finalizada",
+ "systray_download_completed_message": "Alguien ha terminado de descargar tus archivos",
+ "systray_download_canceled_title": "Descarga de OnionShare Cancelada",
+ "systray_download_canceled_message": "El usuario canceló la descarga",
+ "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_autostop_timer": "Deja de compartir ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "El temporizador de parada automática termina en {}",
+ "gui_receive_start_server": "Iniciar Modo de Recepción",
+ "gui_receive_stop_server": "Detener Modo de Recepción",
+ "gui_receive_stop_server_autostop_timer": "Detener Modo de Recepción (quedan {})",
+ "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",
+ "gui_copied_hidservauth_title": "HidServAuth Copiada",
+ "settings_error_unknown": "No se puede conectar al controlador Tor porque tu configuración no tiene sentido.",
+ "settings_error_automatic": "No se puede conectar al controlador Tor. ¿Se está ejecutando el Navegador Tor (disponible en torproject.org) en segundo plano?",
+ "settings_error_socket_port": "No se puede conectar al controlador Tor en {}:{}.",
+ "settings_error_socket_file": "No se puede conectar al controlador Tor usando el archivo de socket {}.",
+ "settings_error_auth": "Conectado con {}:{}, pero no se puede autenticar. ¿Quizás este no sea un controlador Tor?",
+ "settings_error_missing_password": "Conectado al controlador Tor, pero se requiere una contraseña para autenticar.",
+ "settings_error_unreadable_cookie_file": "Conectado al controlador Tor, pero la contraseña puede ser errónea, o a tu usuario no le es permitido leer el archivo cookie.",
+ "settings_error_bundled_tor_not_supported": "La versión de Tor que viene con OnionShare no funciona en el modo de desarrollador en Windows o macOS.",
+ "settings_error_bundled_tor_timeout": "La conexión con Tor está demorando demasiado. ¿Quizás el equipo está desconectado de Internet o el reloj no está en hora?",
+ "settings_error_bundled_tor_broken": "OnionShare no pudo conectarse a Tor:\n{}",
+ "settings_test_success": "Se conectó con el controlador Tor.\n\nVersión de Tor: {}.\nAdmite servicios cebolla efímeros: {}.\nAdmite autenticación de cliente: {}.\nAdmite direcciones .onion de nueva generación: {}.",
+ "error_tor_protocol_error": "Hubo un error con Tor: {}",
+ "error_tor_protocol_error_unknown": "Hubo un error desconocido con Tor",
+ "error_invalid_private_key": "Este tipo de clave privada no está soportado",
+ "connecting_to_tor": "Conectar a la red Tor",
+ "update_available": "Salió un OnionShare nuevo. <a href='{}'>Haz clic aquí</a> para obtenerlo.<br><br>Estás usando {} y el más reciente es {}.",
+ "update_error_check_error": "No se pudo comprobar si hay versiones nuevas: ¿Tal vez no estás conectado a Tor, o el sitio web de OnionShare está caído?",
+ "update_error_invalid_latest_version": "No se pudo comprobar si hay versiones nuevas: El sitio web de OnionShare dice que la última versión es la '{}', pero eso es irreconocible…",
+ "update_not_available": "Estás usando la versión más reciente de OnionShare.",
+ "gui_tor_connection_ask": "¿Abrir la configuración para arreglar la conexión a Tor?",
+ "gui_tor_connection_ask_open_settings": "Sí",
+ "gui_tor_connection_ask_quit": "Salir",
+ "gui_tor_connection_error_settings": "Prueba cambiar la forma en que OnionShare se conecta a la red Tor en la configuración.",
+ "gui_tor_connection_canceled": "No se pudo conectar a Tor.\n\nAsegúrate de haber conectado a Internet, vuelve a abrir OnionShare y configura su conexión a Tor.",
+ "gui_tor_connection_lost": "Se desconectó de Tor.",
+ "gui_server_started_after_autostop_timer": "El temporizador de parada automática expiró antes de que se iniciara el servidor. Por favor crea un recurso compartido nuevo.",
+ "gui_server_autostop_timer_expired": "El temporizador de parada automática ya expiró. Por favor ajústalo para comenzar a compartir.",
+ "share_via_onionshare": "Compartir con OnionShare",
+ "gui_use_legacy_v2_onions_checkbox": "Usar direcciones obsoletas",
+ "gui_save_private_key_checkbox": "Usar una dirección persistente",
+ "gui_share_url_description": "<b>Cualquiera</b> con esta dirección OnionShare puede <b>descargar</b> tus archivos usando el <b>Navegador Tor</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Cualquiera</b> con esta dirección OnionShare puede <b>cargar</b> archivos a tu equipo usando el <b>Navegador Tor</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Este recurso compartido no se detendrá automáticamente.<br><br>Cada recurso compartido subsiguiente reutilizará la dirección. (Para usar direcciones una sola vez, desactiva la opción «Usar dirección persistente» en la configuración.)",
+ "gui_url_label_stay_open": "Este recurso compartido no se detendrá automáticamente.",
+ "gui_url_label_onetime": "Este recurso compartido se detendrá después de la primera operación completada.",
+ "gui_url_label_onetime_and_persistent": "Este recurso compartido no se detendrá automáticamente.<br><br>Cada recurso compartido subsiguiente reutilizará la dirección. (Para usar direcciones una sola vez, desactiva la opción «Usar dirección persistente» en la configuración.)",
+ "gui_status_indicator_share_stopped": "Listo para compartir",
+ "gui_status_indicator_share_working": "Comenzando.…",
+ "gui_status_indicator_share_started": "Compartiendo",
+ "gui_status_indicator_receive_stopped": "Listo para recibir",
+ "gui_status_indicator_receive_working": "Comenzando.…",
+ "gui_status_indicator_receive_started": "Recibiendo",
+ "gui_file_info": "{} archivos, {}",
+ "gui_file_info_single": "{} archivo, {}",
+ "info_in_progress_downloads_tooltip": "{} descarga(s) en curso",
+ "info_completed_downloads_tooltip": "{} descarga(s) completada(s)",
+ "info_in_progress_uploads_tooltip": "{} subida(s) en curso",
+ "info_completed_uploads_tooltip": "{} subida(s) completada(s)",
+ "receive_mode_downloads_dir": "Los archivos que te envíen aparecerán en esta carpeta: {}",
+ "receive_mode_warning": "Advertencia: El modo de recepción permite a la gente subir archivos a tu ordenador. Algunos archivos, si los abres, podrían tomar el control de tu ordenador. Abre sólo cosas de personas en las que confíe, o si sabes lo que estás haciendo.",
+ "gui_download_upload_progress_complete": "%p%, {0:s} transcurrido.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (calculando)",
+ "gui_download_upload_progress_eta": "{0:s}, tiempo restante estimado: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_share_quit_warning": "Aún está enviando archivos. ¿Confirma que quiere salir de OnionShare?",
+ "gui_quit_warning_quit": "Salir",
+ "gui_quit_warning_dont_quit": "Cancelar",
+ "gui_settings_whats_this": "<a href='{0:s}'>¿Qué es esto?</a>",
+ "gui_settings_autoupdate_timestamp": "Última comprobación: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nunca",
+ "gui_settings_general_label": "Configuración general",
+ "gui_settings_sharing_label": "Configuración de compartición",
+ "gui_settings_close_after_first_download_option": "Dejar de compartir luego que los archivos hayan sido enviados",
+ "gui_settings_connection_type_label": "¿Cómo debería conectarse OnionShare a Tor?",
+ "gui_settings_connection_type_control_port_option": "Conectar usando el puerto de control",
+ "gui_settings_connection_type_socket_file_option": "Conectar usando un archivo de socket",
+ "gui_settings_control_port_label": "Puerto de control",
+ "gui_settings_socket_file_label": "Archivo socket",
+ "gui_settings_socks_label": "Puerto SOCKS",
+ "gui_settings_authenticate_label": "Configuración de autenticación de Tor",
+ "gui_settings_authenticate_no_auth_option": "Sin autenticación, o autenticación por cookies",
+ "gui_settings_authenticate_password_option": "Contraseña",
+ "gui_settings_password_label": "Contraseña",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "No usar puentes",
+ "gui_receive_quit_warning": "Aún está recibiendo archivos. ¿Confirma que quiere salir de OnionShare?",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Usar transportes conectables obfs4 incorporados",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Usar transportes conectables obfs4 incorporados (requiere obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Usar transportes conectables incorporados meek_lite (Azure)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Usar transportes conectables meek_lite (Azure) incorporados (requiere obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Advertencia: Los puentes meek_lite son muy costosos de correr para el Proyecto Tor.<br><br>Utilízalos solo si no puedes conectarte a Tor directamente, a través de transportes obfs4 u otros puentes normales.",
+ "gui_settings_tor_bridges_custom_radio_option": "Usar puentes personalizados",
+ "gui_settings_tor_bridges_custom_label": "Puedes obtener puentes en <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_button_save": "Guardar",
+ "gui_settings_button_cancel": "Cancelar",
+ "gui_settings_button_help": "Ayuda",
+ "gui_settings_autostop_timer_checkbox": "Utilizar temporizador de parada automática",
+ "gui_settings_autostop_timer": "Detener compartición a las:",
+ "history_in_progress_tooltip": "{} en curso",
+ "history_completed_tooltip": "{} completado",
+ "error_cannot_create_downloads_dir": "No se ha podido crear la carpeta en modo de recepción: {}",
+ "error_downloads_dir_not_writable": "La carpeta del modo de recepción está protegida contra escritura: {}",
+ "gui_receive_mode_warning": "El modo de recepción permite que otras personas suban archivos a tu computadora.<br><br><b>Algunos archivos, potencialmente, podrían tomar control de tu computadora si los abres. Abre solo cosas de personas en las que confías, o si sabes lo que estás haciendo.</b>",
+ "receive_mode_upload_starting": "Ha comenzado la carga. Total: {}",
+ "receive_mode_received_file": "Recibido: {}",
+ "gui_mode_share_button": "Compartir archivos",
+ "gui_mode_receive_button": "Recibir archivos",
+ "gui_settings_receiving_label": "Ajustes de recepción",
+ "gui_settings_downloads_label": "Guardar archivos en",
+ "gui_settings_downloads_button": "Examinar",
+ "gui_settings_public_mode_checkbox": "Modo público",
+ "systray_close_server_title": "Servidor OnionShare cerrado",
+ "systray_close_server_message": "Un usuario cerró el servidor",
+ "systray_page_loaded_title": "Página Cargada",
+ "systray_download_page_loaded_message": "Un usuario cargó la página de descarga",
+ "systray_upload_page_loaded_message": "Un usuario cargó la página de carga",
+ "gui_uploads": "Historial de carga",
+ "gui_no_uploads": "No hay subidas todavía",
+ "gui_clear_history": "Limpiar todo",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "El modo de recepción puede ser detenido por el remitente",
+ "gui_upload_in_progress": "Subida Iniciada {}",
+ "gui_upload_finished": "Subido {}",
+ "gui_download_in_progress": "Descarga iniciada {}",
+ "gui_open_folder_error_nautilus": "No se puede abrir la carpeta porque nautilus no está disponible. El archivo está aquí: {}",
+ "gui_settings_language_label": "Idioma preferido",
+ "gui_settings_language_changed_notice": "Reinicia OnionShare para que se aplique el idioma nuevo.",
+ "gui_upload_finished_range": "Cargado {} a {}",
+ "timeout_upload_still_running": "Esperando a que se complete la subida",
+ "gui_add_files": "Añadir Archivos",
+ "gui_add_folder": "Añadir Carpeta",
+ "gui_connect_to_tor_for_onion_settings": "Conectarse a Tor para ver configuraciones de servicio cebolla",
+ "error_cannot_create_data_dir": "No se pudo crear carpeta de datos OnionShare: {}",
+ "receive_mode_data_dir": "Archivos enviados a usted aparecen en esta carpeta: {}",
+ "gui_settings_data_dir_label": "Guardar archivos en",
+ "gui_settings_data_dir_browse_button": "Navegar",
+ "systray_page_loaded_message": "Dirección OnionShare cargada",
+ "systray_share_started_title": "Compartición iniciada",
+ "systray_share_started_message": "Se empezó a enviar archivos a alguien",
+ "systray_share_completed_title": "Compartición completada",
+ "systray_share_completed_message": "Finalizó envío de archivos",
+ "systray_share_canceled_title": "Compartición cancelada",
+ "systray_share_canceled_message": "Alguien canceló la recepción de tus archivos",
+ "systray_receive_started_title": "Recepción iniciada",
+ "systray_receive_started_message": "Alguien te está enviando archivos",
+ "gui_all_modes_history": "Historial",
+ "gui_all_modes_clear_history": "Limpiar todo",
+ "gui_all_modes_transfer_started": "Iniciado {}",
+ "gui_all_modes_transfer_finished_range": "Transferido {} - {}",
+ "gui_all_modes_transfer_finished": "Transferido {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} transcurridos.",
+ "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_autostop_timer_waiting": "Esperando a que termine el envío",
+ "gui_receive_mode_no_files": "Todavía no se ha recibido ningún archivo",
+ "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 Onion",
+ "gui_stop_server_autostop_timer_tooltip": "El temporizador de parada automática finaliza a las {}",
+ "gui_start_server_autostart_timer_tooltip": "El temporizador de inicio automático finaliza a las {}",
+ "gui_waiting_to_start": "Inicio programado en {}. Clic para cancelar.",
+ "gui_settings_autostart_timer_checkbox": "Utilizar temporizador de inicio automático",
+ "gui_settings_autostart_timer": "Iniciar compartición a las:",
+ "gui_server_autostart_timer_expired": "La hora programada ya ha pasado. Modifícala para comenzar a compartir.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "La hora de inicio automático no puede ser igual ni anterior a la de parada automática. Ajústala para comenzar a compartir.",
+ "gui_status_indicator_share_scheduled": "Programado…",
+ "gui_status_indicator_receive_scheduled": "Programado…",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s",
+ "invalid_password_guess": "Intento de contraseña incorrecto",
+ "gui_website_url_description": "<b>Cualquiera</b> con esta dirección OnionShare puede <b>visitar</b> tu sitio web usando el <b>Navegador Tor</b>: <img src='{}' />",
+ "gui_mode_website_button": "Publicar sitio web",
+ "systray_site_loaded_title": "Sitio web cargado",
+ "systray_site_loaded_message": "Sitio web de OnionShare cargado",
+ "systray_website_started_title": "Se comenzó a compartir el sitio web",
+ "systray_website_started_message": "Alguien está visitando su sitio web",
+ "gui_website_mode_no_files": "Aún no se han compartido sitios web",
+ "gui_visit_started": "Alguien ha visitado su sitio web {}",
+ "incorrect_password": "Contraseña incorrecta",
+ "gui_settings_individual_downloads_label": "Desmarca para permitir descargar archivos individuales",
+ "history_requests_tooltip": "{} solicitudes web",
+ "systray_individual_file_downloaded_title": "Archivo individual cargado",
+ "systray_individual_file_downloaded_message": "Archivo individual {} visto",
+ "gui_settings_csp_header_disabled_option": "Deshabilitar encabezado de Política de Seguridad de Contenido",
+ "gui_settings_website_label": "Configuración de sitio web",
+ "mode_settings_client_auth_checkbox": "Utilizar autorización de cliente",
+ "mode_settings_legacy_checkbox": "Usar una dirección obsoleta (servicio cebolla v2, no recomendado)",
+ "mode_settings_autostop_timer_checkbox": "Detener el servicio cebolla a una hora determinada",
+ "mode_settings_autostart_timer_checkbox": "Iniciar el servicio cebolla a una hora determinada",
+ "mode_settings_public_checkbox": "No usar contraseña",
+ "mode_settings_persistent_checkbox": "Guardar esta pestaña, y abrirla automáticamente cuando abra OnionShare",
+ "mode_settings_advanced_toggle_hide": "Ocultar la configuración avanzada",
+ "mode_settings_advanced_toggle_show": "Mostrar configuración avanzada",
+ "gui_quit_warning_cancel": "Cancelar",
+ "gui_quit_warning_description": "Compartir está activo en algunas de tus pestañas. Si sales, todas tus pestañas se cerrarán. ¿Estás seguro/a de que quieres salir?",
+ "gui_quit_warning_title": "¿Estás seguro/a?",
+ "gui_close_tab_warning_cancel": "Cancelar",
+ "gui_close_tab_warning_close": "Cerrar",
+ "gui_close_tab_warning_website_description": "Estás alojando un sitio web. ¿Estás seguro/a de que quieres cerrar esta pestaña?",
+ "gui_close_tab_warning_receive_description": "Estás en el proceso de recibir archivos. ¿Estás seguro/a de que quieres cerrar esta pestaña?",
+ "gui_close_tab_warning_share_description": "Estás en el proceso de enviar archivos. ¿Estás seguro/a de que quieres cerrar esta pestaña?",
+ "gui_close_tab_warning_persistent_description": "Esta pestaña es persistente. Si la cierras, perderás la dirección cebolla que usa. ¿Estás seguro/a de que quieres cerrarla?",
+ "gui_close_tab_warning_title": "¿Seguro?",
+ "gui_new_tab_website_description": "Hospedar un sitio cebolla HTML estático desde tu computadora.",
+ "gui_new_tab_website_button": "Alojar un sitio web",
+ "gui_new_tab_receive_description": "Convierte tu computadora en un buzón en línea. La gente podrá usar el Tor Browser para enviar archivos a tu ordenador.",
+ "gui_new_tab_receive_button": "Recibir archivos",
+ "gui_new_tab_share_button": "Compartir archivos",
+ "gui_new_tab_tooltip": "Abrir una pestaña nueva",
+ "gui_new_tab": "Nueva pestaña",
+ "gui_new_tab_share_description": "Elige los archivos de tu ordenador para enviarlos a otra persona. La persona o personas a las que quieras enviar los archivos tendrán que usar el Tor Browser para descargarlos de ti.",
+ "mode_settings_website_disable_csp_checkbox": "No enviar encabezado de Política de Seguridad de Contenido (permite que tu sitio web utilice recursos de terceros)",
+ "mode_settings_receive_data_dir_browse_button": "Navegar",
+ "mode_settings_receive_data_dir_label": "Guardar archivos en",
+ "mode_settings_share_autostop_sharing_checkbox": "Dejar de compartir después de haber enviado archivos (desmarcar para permitir la descarga de archivos individuales)",
+ "gui_tab_name_chat": "Chat",
+ "gui_tab_name_website": "Sitio web",
+ "gui_tab_name_receive": "Recibir",
+ "gui_tab_name_share": "Compartir",
+ "gui_new_tab_chat_button": "Chatear Anónimamente",
+ "gui_open_folder_error": "Fallo al abrir carpeta con xdg-open. El archivo está aquí: {}",
+ "gui_qr_code_description": "Escanea este código QR con un lector QR, como la cámara de tu teléfono para compartir la dirección OnionShare.",
+ "gui_qr_code_dialog_title": "Código QR de OnionShare",
+ "gui_show_url_qr_code": "Mostrar Código QR",
+ "gui_receive_flatpak_data_dir": "Al instalar OnionShare usando Flatpak, debes guardar los archivos en una carpeta en ~/OnionShare.",
+ "gui_chat_stop_server": "Detener servidor de chat",
+ "gui_chat_start_server": "Iniciar servidor de chat",
+ "gui_chat_stop_server_autostop_timer": "Detener Servidor de Chat ({})",
+ "gui_file_selection_remove_all": "Remover Todo",
+ "gui_remove": "Remover",
+ "gui_main_page_chat_button": "Empezar a charlar",
+ "gui_main_page_website_button": "Empezar a alojar",
+ "gui_main_page_receive_button": "Empezar a recibir",
+ "gui_main_page_share_button": "Empezar a compartir"
+}
diff --git a/desktop/share/locale/fa.json b/desktop/share/locale/fa.json
new file mode 100644
index 00000000..5fe578e0
--- /dev/null
+++ b/desktop/share/locale/fa.json
@@ -0,0 +1,239 @@
+{
+ "config_onion_service": "آماده سازی سرویس onion روی پورت {0:d}.",
+ "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": "هشدار: یک هم‌رسانی بزرگ ممکن است ساعت‌ها طول بکشد",
+ "systray_menu_exit": "خروج",
+ "systray_download_started_title": "دانلود OnionShare آغاز شد",
+ "systray_download_started_message": "یک کاربر شروع به دانلود فایل های شما کرد",
+ "systray_download_completed_title": "دانلود OnionShare به پایان رسید",
+ "systray_download_completed_message": "دانلود فایل های شما توسط کاربر به پایان رسید",
+ "systray_download_canceled_title": "دانلود OnionShare لغو شد",
+ "systray_download_canceled_message": "کاربر دانلود را لغو کرد",
+ "systray_upload_started_title": "آپلود OnionShare آغاز شد",
+ "systray_upload_started_message": "یک کاربر شروع به آپلود فایل بر روی کامپیوتر شما کرده است",
+ "help_local_only": "عدم استفاده از Tor (فقط برای توسعه)",
+ "help_stay_open": "ادامه اشتراک گذاری پس از ارسال دانلود ها",
+ "help_autostop_timer": "توقف به اشتراک گذاری پس از میزان ثانیه ای مشخص",
+ "help_stealth": "استفاده از احراز هویت کلاینت (پیشرفته)",
+ "help_receive": "دریافت اشتراک به جای ارسال آن",
+ "help_verbose": "لاگ کردن خطاهای OnionShare روی stdout، و خطاهای وب بر روی دیسک",
+ "help_filename": "لیست فایل ها یا فولدر ها برای به اشتراک گذاری",
+ "help_config": "مکان فایل کانفیگ JSON کاستوم (اختیاری)",
+ "gui_drag_and_drop": "پرونده‌ها و پوشه‌ها را بکشید و رها کنید\nتا هم‌رسانی آغاز شود",
+ "gui_add": "افزودن",
+ "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": "کپی 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_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "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 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_sharing_label": "تنظیمات هم‌رسانی",
+ "gui_settings_close_after_first_download_option": "توقف هم‌رسانی پس از اولین ارسال",
+ "gui_settings_connection_type_label": "OnionShare چگونه به Tor باید متصل شود؟",
+ "gui_settings_connection_type_bundled_option": "استفاده از نسخه Tor قرار گرفته در OnionShare",
+ "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": "هشدار: پل‌های 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?lang=fa\">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": "توقف هم‌رسانی در:",
+ "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": "اتصال به کنترل کننده Tor برقرار است، اما رمز عبور ممکن است اشتباه باشد، یا کاربری شما اجازه خواندن پرونده کوکی را ندارد.",
+ "settings_error_bundled_tor_not_supported": "استفاده از نسخه Tor که با OnionShare می‌آید در حالت توسعه روی ویندوز یا مک کار نمی‌کند.",
+ "settings_error_bundled_tor_timeout": "اتصال به Tor زمان زیادی می‌برد. شاید شما به اینترنت متصل نیستید، یا ساعت سیستم شما دقیق نیست؟",
+ "settings_error_bundled_tor_broken": "OnionShare نمی‌تواند در پس زمینه به Tor متصل شود:\n{}",
+ "settings_test_success": "اتصال به کنترل کننده Tor برقرار است.\n\nنسخه Tor: {}\nسرویس‌های onion ناپایدار پشتیبانی شده: {}.\nاحراز هویت کلاینت پشتیبانی شده: {}.\nپشتیبانی از آدرس‌های .onion نسل بعدی: {}.",
+ "error_tor_protocol_error": "خطایی با Tor وجود داشت: {}",
+ "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": "زمان‌سنج توقف خودکار، قبل از آغاز کارساز به پایان رسید. لطفا یک هم‌رسانی جدید درست کنید.",
+ "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>بارگیری</b> کند از طریق <b>مرورگر تور</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>هرکس</b> با این آدرس OnionShare می‌تواند روی کامپیوتر شما پرونده <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_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": "حالت دریافت به سایر افراد اجازه می‌دهد تا روی کامپیوتر شما پرونده بارگذاری کنند.<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": "حالت عمومی",
+ "systray_close_server_title": "سرور OnionShare بسته شد",
+ "systray_close_server_message": "یک کاربر سرور را بست",
+ "systray_page_loaded_title": "صفحه بارگذاری شد",
+ "systray_download_page_loaded_message": "یک کاربر صفحه دانلود را بارگذاری کرد",
+ "systray_upload_page_loaded_message": "یک کاربر صفحه آپلود را بارگذاری کرد",
+ "gui_uploads": "تاریخچه آپلود",
+ "gui_no_uploads": "هیچ آپلودی هنوز وجود ندارد",
+ "gui_clear_history": "پاکسازی همه",
+ "gui_upload_in_progress": "آپلود آغاز شد {}",
+ "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": "برای اعمال شدن زبان جدید، OnionShare را از نو راه‌اندازی کنید.",
+ "timeout_upload_still_running": "انتظار برای تکمیل آپلود",
+ "gui_add_files": "افزودن پرونده‌ها",
+ "gui_add_folder": "افزودن پوشه",
+ "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_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_all_modes_transfer_canceled_range": "{} - {} لغو شد",
+ "gui_all_modes_transfer_canceled": "{} لغو شد",
+ "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": "ث",
+ "gui_website_url_description": "<b>هرکسی</b> با این نشانی OnionShare می‌تواند <b>با استفاده از مرورگر تور</b> سایت شما را <b>بازدید</b> کند: <img src='{}' />",
+ "gui_mode_website_button": "انتشار سایت",
+ "gui_website_mode_no_files": "هنوز سایتی هم‌رسانی نشده است",
+ "incorrect_password": "گذرواژه نادرست",
+ "gui_settings_individual_downloads_label": "برای دادن اجازه بارگیری پرونده‌ها مجزا، از انتخاب خارج کنید",
+ "history_requests_tooltip": "{} درخواست وب",
+ "gui_settings_csp_header_disabled_option": "غیرفعال‌سازی سرایند سیاست امنیت محتوا",
+ "gui_settings_website_label": "تنظیمات سایت",
+ "gui_new_tab_share_button": "اشتراک‌‌گذاری فایل‌ها"
+}
diff --git a/desktop/share/locale/fi.json b/desktop/share/locale/fi.json
new file mode 100644
index 00000000..c0a6f098
--- /dev/null
+++ b/desktop/share/locale/fi.json
@@ -0,0 +1,236 @@
+{
+ "preparing_files": "Pakataan tiedostoja.",
+ "give_this_url": "Anna tämä URL-osoite vastaanottajalle:",
+ "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": "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": "Aloita jakaminen",
+ "gui_share_stop_server": "Pysäytä jakaminen",
+ "gui_copy_url": "Kopioi URL-osoite",
+ "gui_downloads": "Lataukset:",
+ "gui_canceled": "Peruutettu",
+ "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": "Automaattinen lopetusajastin pysäytti toiminnon",
+ "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 vastaanottotila",
+ "gui_receive_stop_server": "Lopeta vastaanottotila",
+ "gui_receive_stop_server_autostop_timer": "Lopeta vastaanottotila ({} 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 yrittänyt arvata salasanasi väärin liian monta kertaa, joten OnionShare on pysäyttänyt palvelimen. Aloita jakaminen uudelleen ja lähetä vastaanottajalle uusi osoite jatkaaksesi jakamista.",
+ "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": "Jakoasetukset",
+ "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-todennusasetukset",
+ "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-siltojen 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-solmuja osoitteesta <a href=\"https://bridges.torproject.org/options?lang=fi\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Mikään lisäämistäsi silta-solmuista ei toiminut\nTarkista ne uudelleen tai lisää muita.",
+ "gui_settings_button_save": "Tallenna",
+ "gui_settings_button_cancel": "Peruuta",
+ "gui_settings_button_help": "Ohje",
+ "gui_settings_autostop_timer_checkbox": "Käytä automaattista lopetusajastinta",
+ "gui_settings_autostop_timer": "Lopeta jako aikaan:",
+ "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\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 versio on julkaistu. <a href='{}'>Paina tästä</a> ladataksesi sen.<br><br>Käytät versiota {} ja uusin versio on {}.",
+ "update_error_check_error": "Ei pystytty tarkistamaan päivityksiä: Ehkä et ole yhteydessä Tor-verkkoon, tai OnionShare-nettisivu on kaatunut?",
+ "update_error_invalid_latest_version": "Päivityksien tarkistaminen epäonnistui: OnionShare-sivuston mukaan uusin versio on tuntematon '{}'…",
+ "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 avaa OnionShare uudelleen ja ota käyttöön sen Tor-yhteys.",
+ "gui_tor_connection_lost": "Tor-yhteys katkaistu.",
+ "gui_server_started_after_autostop_timer": "Automaattinen lopeutusajastin pysäytti toiminnon ennen palvelimen käynnistymistä.\nLuo uusi jako.",
+ "gui_server_autostop_timer_expired": "Automaattinen pysäytysajastin päättyi jo.\nSäädä se jaon aloittamiseksi.",
+ "share_via_onionshare": "Jaa OnionSharella",
+ "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 ottaaksesi uuden kielen käyttöön.",
+ "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ä kaikki",
+ "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ähetyksen 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": "Automaattinen pysäytysajastin loppuu {} kuluttua",
+ "gui_start_server_autostart_timer_tooltip": "Automaattinen aloitusajastin loppuu {} kuluttua",
+ "gui_waiting_to_start": "Ajastettu aloitus {} kuluttua. Peruuta napsauttamalla.",
+ "gui_settings_autostart_timer_checkbox": "Käytä automaattista aloitusajastinta",
+ "gui_settings_autostart_timer": "Aloita jakaminen:",
+ "gui_server_autostart_timer_expired": "Ajastettu aika on jo mennyt. Säädä se aloittaaksesi jakamisen.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Automaattinen pysätysaika ei voi olla sama tai aikaisempi kuin automaattinen aloitusaika. Säädä 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",
+ "gui_website_url_description": "<b>Kaikki</b> voivat käyttää tätä OnionShare-osoitetta <b>vieraillakseen</b> verkkosivullasi käyttäen <b>Tor Browser-verkkoselainta</b>: <img src='{}' />",
+ "gui_mode_website_button": "Julkaise verkkosivu",
+ "gui_website_mode_no_files": "Yhtäkään verkkosivustoa ei ole vielä jaettu",
+ "incorrect_password": "väärä salasana",
+ "gui_settings_individual_downloads_label": "Poista rasti ruudusta salliaksesi yksittäisten tiedostojen lataamisen",
+ "history_requests_tooltip": "{} verkkopyyntöä",
+ "gui_settings_csp_header_disabled_option": "Poista Content Security Policy -otsake käytöstä",
+ "gui_settings_website_label": "Verkkosivun asetukset",
+ "mode_settings_receive_data_dir_browse_button": "Selaa",
+ "mode_settings_receive_data_dir_label": "Tallenna tiedostot",
+ "mode_settings_share_autostop_sharing_checkbox": "Lopeta jakaminen kun tiedostot on lähetetty (poista valinta malhdollistaaksesi yksittäisten tiedostojen jakamisen)",
+ "mode_settings_public_checkbox": "Älä käytä salasanaa",
+ "mode_settings_persistent_checkbox": "Tallenna tämä välilehti ja avaa se automaattisesti kun käynnistän OnionSharen",
+ "mode_settings_advanced_toggle_hide": "Piilota edistyneet asetukset",
+ "mode_settings_advanced_toggle_show": "Näytä edistyneet asetukset",
+ "gui_quit_warning_cancel": "Peruuta",
+ "gui_quit_warning_title": "Oletko varma?",
+ "gui_close_tab_warning_cancel": "Peruuta",
+ "gui_close_tab_warning_close": "Sulje",
+ "gui_close_tab_warning_title": "Oletko varma?",
+ "gui_new_tab_website_button": "Julkaise nettisivu",
+ "gui_new_tab_receive_button": "Vastaanota tiedostoja",
+ "gui_new_tab_share_description": "Valitse tietokoneeltasi tiedostot jotka haluat lähettää jollekin. Vastaanottajan pitää käyttää Tor-selainta ladatakseen tiedostot sinulta.",
+ "gui_new_tab_share_button": "Jaa tiedostoja",
+ "gui_new_tab_tooltip": "Avaa uusi välilehti",
+ "gui_new_tab": "Uusi välilehti",
+ "mode_settings_website_disable_csp_checkbox": "Poista 'Sisällön suojauskäytännön' otsikko käytöstä (mahdollistaa kolmansien osapuolien resurssien käytön nettisivussasi)",
+ "mode_settings_client_auth_checkbox": "Käytä asiakkaan valtuutusta",
+ "mode_settings_legacy_checkbox": "Käytä vanhaa osoitetta (v2 onion-palvelu, ei suositella)",
+ "mode_settings_autostop_timer_checkbox": "Lopeta onion-palvelu tiettyyn kellon aikaan",
+ "mode_settings_autostart_timer_checkbox": "Aloita onion-palvelu tiettyyn kellon aikaan",
+ "gui_quit_warning_description": "Jakaminen on päällä jollain välilehdillä. Jos lopetat, kaikki välilehtesi suljetaan. Oletko varma, että haluat lopettaa jakamisen?",
+ "gui_close_tab_warning_website_description": "Isännöit tällä hetkellä nettisivua. Oletko varma, että haluat sulkea tämän välilehden?",
+ "gui_close_tab_warning_receive_description": "Olet saamassa tiedostoja. Oletko varma, että haluat sulkea tämän välilehden?",
+ "gui_close_tab_warning_share_description": "Olet lähettämässä tiedostoja. Oletko varma, että haluat sulkea tämän välilehden?",
+ "gui_close_tab_warning_persistent_description": "Tämä välilehti on pysyvä. Jos suljet sen, menetät sen käyttämän onion-osoitteen. Oletko varma, että haluat sulkea tämän välilehden?",
+ "gui_new_tab_website_description": "Isännöi staattinen HTML-onion-nettisivu tietokoneestasi.",
+ "gui_new_tab_receive_description": "Tee tietokoneestasi online-pudotuslaatikko. Tor-selainta voidaan käyttää tiedostojen lähettämiseen koneellesi."
+}
diff --git a/desktop/share/locale/fr.json b/desktop/share/locale/fr.json
new file mode 100644
index 00000000..6f356121
--- /dev/null
+++ b/desktop/share/locale/fr.json
@@ -0,0 +1,294 @@
+{
+ "preparing_files": "Compression des fichiers.",
+ "give_this_url": "Donnez cette adresse au destinataire :",
+ "ctrlc_to_stop": "Appuyez sur Ctrl+c pour arrêter le serveur",
+ "not_a_file": "{0:s} n’est pas un fichier valide.",
+ "other_page_loaded": "L’adresse a été chargée",
+ "closing_automatically": "Arrêté, car le transfert est fini",
+ "systray_menu_exit": "Quitter",
+ "systray_download_started_title": "Téléchargement OnionShare démarré",
+ "systray_download_started_message": "Une personne télécharge vos fichiers",
+ "systray_download_completed_title": "Téléchargement OnionShare terminé",
+ "systray_download_canceled_title": "Téléchargement OnionShare annulé",
+ "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_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 pour commencer le partage",
+ "gui_add": "Ajouter",
+ "gui_delete": "Supprimer",
+ "gui_choose_items": "Sélectionner",
+ "gui_share_start_server": "Commencer le partage",
+ "gui_share_stop_server": "Arrêter le partage",
+ "gui_copy_url": "Copier l’adresse",
+ "gui_copy_hidservauth": "Copier HidServAuth",
+ "gui_downloads": "Historique de téléchargement",
+ "gui_canceled": "Annulé",
+ "gui_copied_url": "L’adresse OnionShare a été copiée dans le presse-papiers",
+ "gui_please_wait": "Démarrage… Cliquez pour annuler.",
+ "gui_quit_warning_quit": "Quitter",
+ "gui_quit_warning_dont_quit": "Annuler",
+ "gui_settings_autoupdate_timestamp_never": "Jamais",
+ "gui_settings_language_changed_notice": "Redémarrez OnionShare afin que la nouvelle langue soit appliquée.",
+ "config_onion_service": "Mise en place du service oignon sur le port {0:d}.",
+ "give_this_url_stealth": "Donnez cette adresse et cette ligne HidServAuth au destinataire :",
+ "give_this_url_receive": "Donnez cette adresse à l’expéditeur :",
+ "give_this_url_receive_stealth": "Donnez cette adresse et cette ligne HidServAuth à l'expéditeur :",
+ "not_a_readable_file": "{0:s} n’est pas un fichier lisible.",
+ "timeout_download_still_running": "En attente de la fin du téléchargement",
+ "systray_download_completed_message": "La personne a terminé de télécharger vos fichiers",
+ "gui_copied_hidservauth_title": "HidServAuth a été copié",
+ "gui_settings_window_title": "Paramètres",
+ "gui_settings_autoupdate_timestamp": "Dernière vérification : {}",
+ "gui_settings_close_after_first_download_option": "Arrêter le partage après l’envoi des fichiers",
+ "gui_settings_connection_type_label": "Comment OnionShare devrait-il se connecter à Tor ?",
+ "gui_settings_connection_type_control_port_option": "Se connecter en utilisant le port de contrôle",
+ "gui_settings_connection_type_socket_file_option": "Se connecter en utilisant un fichier d’interface de connexion",
+ "gui_settings_socket_file_label": "Fichier d’interface de connexion",
+ "gui_settings_socks_label": "Port SOCKS",
+ "gui_settings_authenticate_no_auth_option": "Pas d’authentification ou authentification par témoin",
+ "gui_settings_authenticate_password_option": "Mot de passe",
+ "gui_settings_password_label": "Mot de passe",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Ne pas utiliser de pont",
+ "gui_settings_button_save": "Enregistrer",
+ "gui_settings_button_cancel": "Annuler",
+ "gui_settings_button_help": "Aide",
+ "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 partage volumineux 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%",
+ "error_ephemeral_not_supported": "OnionShare exige au moins et Tor 0.2.7.1 et python3-stem 1.4.0.",
+ "help_autostop_timer": "Arrêter le partage après un certain nombre de secondes",
+ "gui_tor_connection_error_settings": "Dans les paramètres, essayez de changer 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 onion",
+ "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",
+ "gui_copied_url_title": "L’adresse OnionShare a été copiée",
+ "gui_quit_title": "Pas si vite",
+ "gui_share_quit_warning": "Des fichiers sont en cours d’envoi. Voulez-vous vraiment quitter OnionShare ?",
+ "gui_receive_quit_warning": "Des fichiers sont en cours de réception. Voulez-vous vraiment quitter OnionShare ?",
+ "gui_settings_whats_this": "<a href='{0:s}'>Qu’est-ce que ceci ?</a>",
+ "gui_settings_autoupdate_label": "Vérifier la présence d’une nouvelle",
+ "gui_settings_autoupdate_option": "Me signaler toute nouvelle version",
+ "gui_settings_general_label": "Paramètres généraux",
+ "gui_settings_sharing_label": "Paramètres de partage",
+ "gui_settings_connection_type_bundled_option": "Utiliser la version de Tor intégrée dans OnionShare",
+ "gui_settings_connection_type_automatic_option": "Essayer la configuration automatique avec le Navigateur Tor",
+ "gui_settings_connection_type_test_button": "Tester la connexion à Tor",
+ "gui_settings_control_port_label": "Port de contrôle",
+ "gui_settings_authenticate_label": "Paramètres d’authentification de Tor",
+ "gui_settings_tor_bridges": "Prise en charge des ponts de Tor",
+ "gui_settings_tor_bridges_custom_radio_option": "Utiliser des ponts personnalisés",
+ "gui_settings_tor_bridges_custom_label": "Vous pouvez obtenir des ponts sur <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Aucun des ponts que vous avez ajoutés ne fonctionne.\nVérifiez-les de nouveau ou ajoutez-en d’autres.",
+ "settings_error_unknown": "Impossible de se connecter au contrôleur Tor, car vos paramètres sont incorrects.",
+ "settings_error_automatic": "Impossible de se connecter au contrôleur Tor. Le Navigateur Tor (téléchargeable sur torproject.org) fonctionne-t-il en arrière-plan ?",
+ "settings_error_socket_port": "Impossible de se connecter au contrôleur Tor à {}:{}.",
+ "settings_error_socket_file": "Impossible de se connecter au contrôleur Tor en utilisant le fichier d’interface de connexion {}.",
+ "settings_error_auth": "Vous êtes connecté à {}:{}, mais il est impossible de s’authentifier. Est-ce bien un contrôleur Tor ?",
+ "settings_error_missing_password": "Vous êtes connecté au contrôleur Tor, mais un mot de passe d’authentification est exigé.",
+ "settings_error_unreadable_cookie_file": "Vous êtes connecté au contrôleur Tor, mais le mot de passe est peut-être erroné ou votre utilisateur n’est pas autorisé à lire le fichier témoin.",
+ "settings_error_bundled_tor_not_supported": "La version de Tor intégrée dans OnionShare ne fonctionne pas en mode développeur sous Windows ou macOS.",
+ "settings_error_bundled_tor_timeout": "La connexion à Tor prend trop de temps. Êtes-vous connecté à Internet ? Votre horloge système est-elle mal réglée ?",
+ "settings_error_bundled_tor_broken": "OnionShare n’a pas réussi à se connecter à Tor :\n{}",
+ "error_tor_protocol_error": "Une erreur est survenue avec Tor : {}",
+ "error_tor_protocol_error_unknown": "Une erreur inconnue est survenue avec Tor",
+ "error_invalid_private_key": "Ce type de clé privée n’est pas pris en charge",
+ "update_available": "Une nouvelle version d’OnionShare est proposée. <a href='{}'>Cliquez ici</a> pour l’obtenir.<br><br>Vous utilisez la version {} et {} est la dernière version.",
+ "update_not_available": "Vous utilisez la dernière version d’OnionShare.",
+ "gui_tor_connection_ask_open_settings": "Oui",
+ "gui_tor_connection_ask_quit": "Quitter",
+ "gui_tor_connection_lost": "Vous êtes déconnecté de Tor.",
+ "share_via_onionshare": "Partager avec OnionShare",
+ "gui_save_private_key_checkbox": "Utiliser une adresse persistante",
+ "gui_share_url_description": "<b>Quiconque</b> possède cette adresse OnionShare peut <b>télécharger</b> vos fichiers en utilisant le <b>Navigateur Tor</b> : <img src='{}' />",
+ "gui_receive_url_description": "<b>Quiconque</b> possède cette adresse OnionShare peut <b>téléverser</b> des fichiers vers votre ordinateur en utilisant le <b>Navigateur Tor</b> : <img src='{}' />",
+ "gui_url_label_persistent": "Ce partage ne s’arrêtera pas automatiquement.<br><br>Tout partage subséquent réutilisera l’adresse. (Pour des adresses qui ne peuvent être utilisées qu’une fois, désactivez « Utiliser une adresse persistante » dans les paramètres.)",
+ "gui_url_label_stay_open": "Ce partage ne s’arrêtera pas automatiquement.",
+ "gui_url_label_onetime": "Ce partage s’arrêtera une fois que le premier téléchargement sera terminé.",
+ "gui_url_label_onetime_and_persistent": "Ce partage ne s’arrêtera pas automatiquement.<br><br>Tout partage subséquent réutilisera l’adresse. (Pour des adresses qui ne peuvent être utilisées qu’une fois, désactivez « Utiliser une adresse persistante » dans les paramètres.)",
+ "gui_status_indicator_share_stopped": "Prêt à partager",
+ "gui_status_indicator_share_working": "Démarrage…",
+ "gui_status_indicator_share_started": "Partage en cours",
+ "gui_status_indicator_receive_stopped": "Prêt à recevoir",
+ "gui_status_indicator_receive_working": "Démarrage…",
+ "gui_status_indicator_receive_started": "Réception en cours",
+ "gui_file_info": "{} fichiers, {}",
+ "gui_file_info_single": "{} fichier, {}",
+ "history_in_progress_tooltip": "{} en cours",
+ "history_completed_tooltip": "{} terminé",
+ "receive_mode_downloads_dir": "Les fichiers qui vous sont envoyés apparaissent dans ce dossier : {}",
+ "receive_mode_warning": "Avertissement : Le mode réception permet à d’autres de téléverser des fichiers vers votre ordinateur. Certains fichiers pourraient prendre le contrôle de votre ordinateur si vous les ouvrez. N’ouvrez que des fichiers provenant de personnes de confiance ou si vous savez ce que vous faites.",
+ "gui_receive_mode_warning": "Le mode réception permet à d’autres de téléverser des fichiers vers votre ordinateur.<br><br><b>Certains fichiers pourraient prendre le contrôle de votre ordinateur si vous les ouvrez. N’ouvrez que des fichiers provenant de personnes de confiance ou si vous savez ce que vous faites.</b>",
+ "receive_mode_received_file": "Reçu : {}",
+ "gui_mode_share_button": "Partager des fichiers",
+ "gui_mode_receive_button": "Recevoir des fichiers",
+ "gui_settings_receiving_label": "Paramètres de réception",
+ "gui_settings_downloads_label": "Enregistrer les fichiers sous",
+ "gui_settings_downloads_button": "Parcourir",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "Le mode réception peut-être arrêté par l'expéditeur",
+ "gui_settings_public_mode_checkbox": "Mode public",
+ "systray_close_server_title": "Serveur OnionShare arrêté",
+ "gui_uploads": "Historique d'envoi",
+ "gui_no_uploads": "Pas encore d'envoi",
+ "gui_clear_history": "Tout effacer",
+ "gui_upload_in_progress": "Envoi démarré {}",
+ "gui_upload_finished_range": "Envoyé {} de {}",
+ "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 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_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%",
+ "error_rate_limit": "Quelqu’un a effectué trop de tentatives échouées pour deviner votre mot de passe, c’est pourquoi OnionShare a arrêté le serveur. Redémarrez le partage et envoyez au destinataire une nouvelle adresse pour partager.",
+ "error_stealth_not_supported": "Pour utiliser l’autorisation client, Tor 0.2.9.1-alpha (ou le Navigateur Tor 6.5) et python3-stem 1.5.0 ou versions ultérieures sont exigés.",
+ "gui_settings_stealth_option": "Utiliser l’autorisation du client",
+ "timeout_upload_still_running": "En attente de la fin de l'envoi",
+ "gui_settings_stealth_hidservauth_string": "L’enregistrement de votre clé privée pour réutilisation signifie que vous pouvez maintenant cliquer pour copier votre HidServAuth.",
+ "gui_settings_autoupdate_check_button": "Vérifier la présence d’une nouvelle version",
+ "settings_test_success": "Vous êtes connecté au contrôleur Tor.\n\nVersion de Tor : {}\nPrend en charge les services onion éphémères : {}.\nPrend en charge l’authentification client : {}.\nPrend en charge la nouvelle génération d’adresses .onion : {}.",
+ "update_error_check_error": "Impossible de vérifier l’existence d’une mise à jour : vous n’êtes peut-être pas connecté à Tor ou le site Web d’OnionShare est hors service ?",
+ "update_error_invalid_latest_version": "Impossible de vérifier la présence d’une mise à jour : le site Web d’OnionShare indique que la version la plus récente est la méconnaissable '{}'…",
+ "gui_tor_connection_ask": "Ouvrir les paramètres pour résoudre le problème de connexion à Tor ?",
+ "gui_tor_connection_canceled": "Impossible de se connecter à Tor.\n\nAssurez-vous d’être connecté à Internet, puis rouvrez OnionShare et configurez sa connexion à Tor.",
+ "gui_use_legacy_v2_onions_checkbox": "Utiliser les adresses héritées",
+ "info_in_progress_uploads_tooltip": "{} envoi(s) en cours",
+ "info_completed_uploads_tooltip": "{} envoi(s) terminé(s)",
+ "error_cannot_create_downloads_dir": "Impossible de créer le dossier du mode réception : {}",
+ "receive_mode_upload_starting": "Un téléversement d’une taille totale de {} commence",
+ "systray_close_server_message": "Une personne a arrêté le serveur",
+ "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_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_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. Veuillez 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. Veuillez 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 : {}",
+ "receive_mode_data_dir": "Les fichiers qui vous sont envoyés apparaissent dans ce dossier : {}",
+ "gui_settings_data_dir_label": "Enregistrer les fichiers dans",
+ "gui_settings_data_dir_browse_button": "Parcourir",
+ "systray_page_loaded_message": "L’adresse OnionShare a été chargée",
+ "systray_share_started_title": "Le partage est commencé",
+ "systray_share_started_message": "L’envoi de fichiers à quelqu’un est commencé",
+ "systray_share_completed_title": "Le partage est terminé",
+ "systray_share_canceled_title": "Le partage a été annulé",
+ "systray_share_canceled_message": "Quelqu’un a annulé la réception de vos fichiers",
+ "systray_receive_started_title": "La réception est commencée",
+ "systray_receive_started_message": "Quelqu’un vous envoie des fichiers",
+ "gui_all_modes_history": "Historique",
+ "gui_all_modes_clear_history": "Tout effacer",
+ "gui_all_modes_transfer_started": "Démarré le {}",
+ "gui_all_modes_transfer_finished_range": "Transféré le {} à {}",
+ "gui_all_modes_transfer_finished": "Transféré le {}",
+ "gui_all_modes_progress_complete": "%p %, {0:s} écoulé.",
+ "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_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_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_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",
+ "gui_website_url_description": "<b>Quiconque</b> aura cette adresse OnionShare pourra <b>visiter</b> votre site Web en utilisant le <b>Navigateur Tor</b> : <img src='{}' />",
+ "systray_site_loaded_title": "Le site Web a été chargé",
+ "systray_site_loaded_message": "Le site Web OnionShare a été chargé",
+ "systray_website_started_title": "Début du partage du site Web",
+ "systray_website_started_message": "Quelqu’un visite votre site Web",
+ "gui_website_mode_no_files": "Aucun site Web n’a encore été partagé",
+ "invalid_password_guess": "La tentative de mot de passe est invalide",
+ "gui_mode_website_button": "Publier un site Web",
+ "incorrect_password": "Le mot de passe est erroné",
+ "gui_settings_individual_downloads_label": "Décocher pour permettre le téléchargement de fichiers individuels",
+ "history_requests_tooltip": "{} Requêtes Web",
+ "systray_individual_file_downloaded_title": "Le fichier individuel a été chargé",
+ "systray_individual_file_downloaded_message": "Le fichier individuel {} a été visualisé",
+ "gui_settings_csp_header_disabled_option": "Désactiver l’en-tête Politique de sécurité de contenu",
+ "gui_settings_website_label": "Paramètres des sites Web",
+ "gui_close_tab_warning_title": "Confirmez-vous ?",
+ "gui_new_tab_website_description": "Hébergez un site Web onion statique HTML à partir de votre ordinateur.",
+ "gui_new_tab_website_button": "Publier des sites Web",
+ "gui_new_tab_receive_description": "Transformez votre ordinateur en service de stockage fichiers. Les gens pourront utiliser le Navigateur Tor pour envoyer des fichiers vers votre ordinateur.",
+ "gui_new_tab_receive_button": "Recevoir des fichiers",
+ "gui_new_tab_share_description": "Choisissez sur votre ordinateur des fichiers à envoyer à quelqu’un d’autre. La ou les personnes à qui vous souhaitez envoyer des fichiers devront utiliser le Navigateur Tor pour les télécharger de vous.",
+ "gui_new_tab_share_button": "Partager des fichiers",
+ "gui_new_tab_tooltip": "Ouvrir un nouvel onglet",
+ "gui_new_tab": "Nouvel onglet",
+ "gui_close_tab_warning_persistent_description": "Cet onglet est persistant. Si vous le fermez, vous perdrez l’adresse onion qu’il utilise. Voulez-vous vraiment le fermer ?",
+ "mode_settings_autostop_timer_checkbox": "Arrêter un service onion à une heure prédéterminée",
+ "mode_settings_autostart_timer_checkbox": "Démarrer un service onion à une heure prédéterminée",
+ "mode_settings_website_disable_csp_checkbox": "Ne pas envoyer d’en-tête Politique de sécurité de contenu (permet à votre site Web d’utiliser des ressources tierces)",
+ "mode_settings_receive_data_dir_browse_button": "Parcourir",
+ "mode_settings_receive_data_dir_label": "Enregistrer les fichiers dans",
+ "mode_settings_share_autostop_sharing_checkbox": "Cesser le partage une fois que les fichiers ont été envoyés (décocher afin de permettre le téléchargement de fichiers individuels)",
+ "mode_settings_client_auth_checkbox": "Utiliser l’autorisation du client",
+ "mode_settings_legacy_checkbox": "Utiliser une ancienne adresse (service onion v2, non recommandée)",
+ "mode_settings_public_checkbox": "Ne pas utiliser un mot de passe",
+ "mode_settings_persistent_checkbox": "Enregistrer cet onglet et l’ouvrir automatiquement quand j’ouvre OnionShare",
+ "mode_settings_advanced_toggle_hide": "Cacher les paramètres avancés",
+ "mode_settings_advanced_toggle_show": "Afficher les paramètres avancés",
+ "gui_quit_warning_cancel": "Annuler",
+ "gui_quit_warning_description": "Le partage est actif dans certains de vos onglets. Si vous sortez, tous vos onglets seront fermés. Voulez-vous vraiment sortir ?",
+ "gui_quit_warning_title": "Confirmez-vous ?",
+ "gui_close_tab_warning_cancel": "Annuler",
+ "gui_close_tab_warning_close": "Fermer",
+ "gui_close_tab_warning_website_description": "Vous hébergez activement un site Web. Voulez-vous vraiment fermer cet onglet ?",
+ "gui_close_tab_warning_receive_description": "Vous êtes en train de recevoir des fichiers. Voulez-vous vraiment fermer cet onglet ?",
+ "gui_close_tab_warning_share_description": "Vous êtes en train d’envoyer des fichiers. Voulez-vous vraiment fermer cet onglet ?",
+ "gui_tab_name_chat": "Dialogue en ligne",
+ "gui_tab_name_website": "Site Web",
+ "gui_tab_name_receive": "Recevoir",
+ "gui_tab_name_share": "Partager",
+ "gui_new_tab_chat_button": "Dialoguer anonymement",
+ "gui_open_folder_error": "Échec d’ouverture du dossier avec xdg-open. Le fichier est ici : {}",
+ "gui_qr_code_description": "Balayez ce code QR avec un lecteur de code QR, tel que l’appareil photo votre appareil, afin de partager plus facilement l’adresse OnionShare avec quelqu’un.",
+ "gui_qr_code_dialog_title": "Code QR d’OnionShare",
+ "gui_show_url_qr_code": "Afficher le code QR",
+ "gui_receive_flatpak_data_dir": "Comme vous avez installé OnionShare grâce à Flatpak, vous devez enregistrer vos fichiers dans un sous-dossier de ~/OnionShare.",
+ "gui_chat_stop_server": "Arrêter le serveur de dialogue en ligne",
+ "gui_chat_start_server": "Démarrer le serveur de dialogue en ligne",
+ "gui_chat_stop_server_autostop_timer": "Arrêter le serveur de dialogue en ligne ({})",
+ "gui_file_selection_remove_all": "Tout supprimer",
+ "gui_remove": "Supprimer",
+ "gui_main_page_chat_button": "Lancer le dialogue en ligne",
+ "gui_main_page_website_button": "Lancer l’hébergement",
+ "gui_main_page_receive_button": "Lancer la réception",
+ "gui_main_page_share_button": "Lancer le partage"
+}
diff --git a/desktop/share/locale/ga.json b/desktop/share/locale/ga.json
new file mode 100644
index 00000000..76e9d64a
--- /dev/null
+++ b/desktop/share/locale/ga.json
@@ -0,0 +1,227 @@
+{
+ "config_onion_service": "Seirbhís onion á shocrú ar phort {0:d}.",
+ "preparing_files": "Comhaid á gcomhbhrú.",
+ "give_this_url": "Tabhair an seoladh seo don fhaighteoir:",
+ "give_this_url_stealth": "Tabhair an seoladh seo agus an líne HidServAuth seo don fhaighteoir:",
+ "give_this_url_receive": "Tabhair an seoladh seo don seoltóir:",
+ "give_this_url_receive_stealth": "Tabhair an seoladh seo agus an líne HidServAuth seo don seoltóir:",
+ "ctrlc_to_stop": "Brúigh Ctrl+C chun stop a chur leis an bhfreastalaí",
+ "not_a_file": "Ní comhad bailí é {0:s}.",
+ "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_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",
+ "systray_download_started_title": "Tosaíodh Íoslódáil OnionShare",
+ "systray_download_started_message": "Thosaigh úsáideoir ag íoslódáil do chuid comhad",
+ "systray_download_completed_title": "Críochnaíodh Íoslódáil OnionShare",
+ "systray_download_completed_message": "Tá do chuid comhad íoslódáilte ag an úsáideoir",
+ "systray_download_canceled_title": "Cuireadh Íoslódáil OnionShare ar ceal",
+ "systray_download_canceled_message": "Chuir an t-úsáideoir an íoslódáil ar ceal",
+ "systray_upload_started_title": "Tosaíodh Uaslódáil OnionShare",
+ "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_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_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",
+ "gui_add": "Cuir Leis",
+ "gui_delete": "Scrios",
+ "gui_choose_items": "Roghnaigh",
+ "gui_share_start_server": "Comhroinn",
+ "gui_share_stop_server": "Stop ag comhroinnt",
+ "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_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",
+ "gui_no_downloads": "Níl aon rud íoslódáilte agat fós",
+ "gui_canceled": "Curtha ar ceal",
+ "gui_copied_url_title": "Cóipeáladh an Seoladh OnionShare",
+ "gui_copied_url": "Cóipeáladh an seoladh OnionShare go dtí an ghearrthaisce",
+ "gui_copied_hidservauth_title": "Cóipeáladh HidServAuth",
+ "gui_copied_hidservauth": "Cóipeáladh an líne HidServAuth go dtí an ghearrthaisce",
+ "gui_please_wait": "Ag tosú... Cliceáil lena chur ar ceal.",
+ "gui_download_upload_progress_complete": "%[%, {0:s} caite.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (á áireamh)",
+ "gui_download_upload_progress_eta": "{0:s}, am teachta measta: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Fan soic",
+ "gui_share_quit_warning": "Tá tú le linn roinnt comhad a sheoladh. An bhfuil tú cinnte gur mhaith leat OnionShare a scor?",
+ "gui_receive_quit_warning": "Tá tú le linn roinnt comhad a íoslódáil. An bhfuil tú cinnte gur mhaith leat OnionShare a scor?",
+ "gui_quit_warning_quit": "Scoir",
+ "gui_quit_warning_dont_quit": "Cealaigh",
+ "error_rate_limit": "Rinne duine éigin an iomarca iarrachtaí míchearta ar d'fhocal faire, agus dá bharr sin stop OnionShare an freastalaí. Tosaigh ag comhroinnt arís agus cuir seoladh nua chuig an bhfaighteoir.",
+ "zip_progress_bar_format": "Á chomhbhrú: %p%",
+ "error_stealth_not_supported": "Chun údarú cliaint a úsáid, teastaíonn uait Tor 0.2.9.1-alpha (nó Brabhsálaí 6.5) agus python3-stem 1.5.0.",
+ "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",
+ "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: {}",
+ "gui_settings_autoupdate_timestamp_never": "Níor seiceáladh riamh",
+ "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 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",
+ "gui_settings_connection_type_control_port_option": "Ceangal trí phort rialaithe",
+ "gui_settings_connection_type_socket_file_option": "Ceangal trí chomhad soicéid",
+ "gui_settings_connection_type_test_button": "Tástáil an Ceangal le Tor",
+ "gui_settings_control_port_label": "Port rialaithe",
+ "gui_settings_socket_file_label": "Comhad soicéid",
+ "gui_settings_socks_label": "Port SOCKS",
+ "gui_settings_authenticate_label": "Socruithe fíordheimhnithe Tor",
+ "gui_settings_authenticate_no_auth_option": "Gan fíordheimhniú, nó fíordheimhniú le fianán",
+ "gui_settings_authenticate_password_option": "Focal faire",
+ "gui_settings_password_label": "Focal faire",
+ "gui_settings_tor_bridges": "Tacaíocht do dhroichid Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Ná húsáid droichid",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Bain úsáid as córais iompair ionphlugáilte ionsuite obfs4",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Bain úsáid as córais iompair ionphlugáilte ionsuite obfs4 (obfs4proxy de dhíth)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Bain úsáid as córais iompair ionphlugáilte ionsuite meek_lite(Azure)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Bain úsáid as córais iompair ionphlugáilte ionsuite meek_lite (Azure) (obfs4proxy de dhíth)",
+ "gui_settings_meek_lite_expensive_warning": "Rabhadh: Tá sé an-chostasach ar Thionscadal Tor na droichid meek_lite a chur ar fáil.<br><br>Iarraimid ort gan iad a úsáid má tá tú in ann ceangal díreach a bhunú le Tor, nó trí chóras iompair obfs4, nó trí dhroichead eile.",
+ "gui_settings_tor_bridges_custom_radio_option": "Úsáid droichid shaincheaptha",
+ "gui_settings_tor_bridges_custom_label": "Is féidir leat droichid a fháil ó <a href=\"https://bridges.torproject.org/options?lang=ga\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Níl aon cheann de na droichid ag obair.\nSeiceáil arís iad, nó bain triail as droichid eile.",
+ "gui_settings_button_save": "Sábháil",
+ "gui_settings_button_cancel": "Cealaigh",
+ "gui_settings_button_help": "Cabhair",
+ "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 {}:{}.",
+ "settings_error_socket_file": "Ní féidir ceangal a bhunú leis an rialaitheoir Tor trí chomhad soicéid {}.",
+ "settings_error_auth": "Ceangailte le {}:{}, ach ní féidir an ceangal a fhíordheimhniú. B'fhéidir nach rialaitheoir Tor é seo?",
+ "settings_error_missing_password": "Ceangailte le rialaitheoir Tor, ach teastaíonn focal faire uaidh.",
+ "settings_error_unreadable_cookie_file": "Ceangailte le rialaitheoir Tor, ach seans go bhfuil an focal faire mícheart, nó níl cead ag an úsáideoir an comhad ina bhfuil na fianáin a léamh.",
+ "settings_error_bundled_tor_not_supported": "Ní féidir an leagan de Tor a thagann le OnionShare a úsáid sa mód forbartha ar Windows nó ar macOS.",
+ "settings_error_bundled_tor_timeout": "An iomarca ama ag ceangal le Tor. B'fhéidir nach bhfuil ceangailte leis an Idirlíon, nó nach bhfuil clog do chórais socraithe mar is ceart?",
+ "settings_error_bundled_tor_broken": "Níorbh fhéidir le OnionShare ceangal le Tor sa gcúlra:\n{}",
+ "settings_test_success": "Ceangailte leis an rialaitheoir Tor.\n\nLeagan de Tor: {}\nTacaíonn sé le seirbhísí onion gearrshaolacha: {}.\nTacaíonn sé le fíordheimhniú cliaint: {}.\nTacaíonn sé le seoltaí .onion den chéad ghlúin eile: {}.",
+ "error_tor_protocol_error": "Tharla earráid le Tor: {}",
+ "error_tor_protocol_error_unknown": "Tharla earráid anaithnid le Tor",
+ "error_invalid_private_key": "Ní thacaítear le heochair phríobháideach den sórt seo",
+ "connecting_to_tor": "Ag ceangal le líonra Tor",
+ "update_available": "Leagan nua de OnionShare ar fáil. <a href='{}'>Cliceáil anseo</a> lena íoslódáil.<br><br>Tá {} agat agus is é {} an leagan is déanaí.",
+ "update_error_check_error": "Theip orainn nuashonrú a lorg: Deir suíomh Gréasáin OnionShare gurb é '{}' an leagan is déanaí, leagan nach n-aithnímid…",
+ "update_error_invalid_latest_version": "Theip orainn nuashonruithe a lorg: B'fhéidir nach bhfuil ceangailte le Tor, nó nach bhfuil suíomh OnionShare ag obair faoi láthair?",
+ "update_not_available": "Tá an leagan is déanaí de OnionShare agat cheana.",
+ "gui_tor_connection_ask": "An bhfuil fonn ort na socruithe líonra a oscailt chun an fhadhb a réiteach?",
+ "gui_tor_connection_ask_open_settings": "Tá",
+ "gui_tor_connection_ask_quit": "Scoir",
+ "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_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",
+ "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.)",
+ "gui_url_label_stay_open": "Ní stopfaidh an chomhroinnt seo go huathoibríoch.",
+ "gui_url_label_onetime": "Stopfaidh an chomhroinnt seo nuair a chríochnóidh sé den chéad uair.",
+ "gui_url_label_onetime_and_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.)",
+ "gui_status_indicator_share_stopped": "Réidh le comhroinnt",
+ "gui_status_indicator_share_working": "Á thosú…",
+ "gui_status_indicator_share_started": "Comhroinnt",
+ "gui_status_indicator_receive_stopped": "Réidh le glacadh le comhaid",
+ "gui_status_indicator_receive_working": "Á thosú…",
+ "gui_status_indicator_receive_started": "Glacadh",
+ "gui_file_info": "{} comhad, {}",
+ "gui_file_info_single": "{} chomhad, {}",
+ "history_in_progress_tooltip": "{} ar siúl",
+ "history_completed_tooltip": "{} críochnaithe",
+ "info_in_progress_uploads_tooltip": "{} uaslódáil ar siúl faoi láthair",
+ "info_completed_uploads_tooltip": "{} uaslódáil críochnaithe",
+ "error_cannot_create_downloads_dir": "Níorbh fhéidir fillteán a chruthú do chomhaid a nglacann tú leo: {}",
+ "receive_mode_downloads_dir": "Cuirfear comhaid a sheoltar chugat san fhillteán seo: {}",
+ "receive_mode_warning": "Rabhadh: Sa mód glactha, beidh daoine in ann comhaid a uaslódáil ar do ríomhaire, fiú comhaid chontúirteacha a dhéanfadh dochar do do ríomhaire dá n-osclófá iad. Ná hoscail ach comhaid ó dhaoine iontaofa mura bhfuil tú i do shaineolaí cruthanta slándála.",
+ "gui_receive_mode_warning": "Sa mód glactha, beidh daoine in ann comhaid a uaslódáil ar do ríomhaire.<br><br><b>Tá comhaid áirithe an-chontúirteach agus dhéanfaidís dochar do do ríomhaire dá n-osclófá iad. Ná hoscail ach comhaid ó dhaoine iontaofa mura bhfuil tú i do shaineolaí cruthanta slándála.</b>",
+ "receive_mode_upload_starting": "Uaslódáil, méid iomlán {}, á tosú",
+ "receive_mode_received_file": "Faighte: {}",
+ "gui_mode_share_button": "Comhroinn Comhaid",
+ "gui_mode_receive_button": "Glac le Comhaid",
+ "gui_settings_receiving_label": "Socruithe glactha",
+ "gui_settings_downloads_label": "Sábháil comhaid i",
+ "gui_settings_downloads_button": "Brabhsáil",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "Tá cead ag an seoltóir stop a chur leis an mód glactha",
+ "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 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",
+ "gui_no_uploads": "Níl aon rud uaslódáilte agat fós",
+ "gui_clear_history": "Glan Uile",
+ "gui_upload_in_progress": "Tosaíodh an Uaslódáil {}",
+ "gui_upload_finished_range": "Uaslódáladh {} go {}",
+ "gui_upload_finished": "Uaslódáladh {}",
+ "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_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 {}",
+ "systray_share_completed_message": "Seoladh na comhaid",
+ "systray_share_canceled_title": "Cealaíodh an Chomhroinnt",
+ "systray_share_canceled_message": "Chealaigh duine éigin an chomhroinnt",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (á áireamh)",
+ "gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "gui_share_mode_no_files": "Níl aon chomhaid seolta fós",
+ "days_first_letter": "l",
+ "hours_first_letter": "u",
+ "minutes_first_letter": "n",
+ "seconds_first_letter": "s",
+ "gui_mode_website_button": "Foilsigh an Suíomh",
+ "incorrect_password": "Focal faire mícheart",
+ "history_requests_tooltip": "{} iarratas gréasáin",
+ "gui_settings_csp_header_disabled_option": "Díchumasaigh an ceanntásc Content Security Policy",
+ "gui_settings_website_label": "Socruithe an tsuímh"
+}
diff --git a/desktop/share/locale/gu.json b/desktop/share/locale/gu.json
new file mode 100644
index 00000000..15c7790d
--- /dev/null
+++ b/desktop/share/locale/gu.json
@@ -0,0 +1,188 @@
+{
+ "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": "{0: s} એ વાંચી શકાય તેવી ફાઇલ નથી.",
+ "no_available_port": "Onion સેવા શરૂ કરવા માટે ઉપલબ્ધ બંદર શોધી શકાયું નહીં",
+ "other_page_loaded": "સરનામું લોડ થયું",
+ "close_on_autostop_timer": "બંધ થયું કારણ કે સ્વત stop-સ્ટોપ ટાઇમર સમાપ્ત થઈ ગયો છે",
+ "closing_automatically": "અટક્યું કારણ કે સ્થાનાંતરણ પૂર્ણ છે",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "ચેતવણી: મોટો શેર મોકલવામાં કલાકો લાગી શકે છે",
+ "systray_menu_exit": "",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "help_local_only": "",
+ "help_stay_open": "",
+ "help_autostop_timer": "",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "",
+ "help_config": "",
+ "gui_drag_and_drop": "ફાઇલો અને ફોલ્ડર્સ ખેંચો અને છોડો\nવહેંચણી શરૂ કરવા માટે",
+ "gui_add": "ઉમેરો",
+ "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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_add_files": "ફાઇલો ઉમેરો",
+ "gui_add_folder": "ફોલ્ડર ઉમેરો",
+ "incorrect_password": "ખોટો પાસવર્ડ"
+}
diff --git a/desktop/share/locale/he.json b/desktop/share/locale/he.json
new file mode 100644
index 00000000..c0965d19
--- /dev/null
+++ b/desktop/share/locale/he.json
@@ -0,0 +1,191 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "יציאה",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "מבוטל",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_settings_data_dir_browse_button": "עיין",
+ "gui_all_modes_history": "היסטוריה",
+ "gui_all_modes_clear_history": "למחוק הכול"
+}
diff --git a/desktop/share/locale/hi.json b/desktop/share/locale/hi.json
new file mode 100644
index 00000000..9cfc310d
--- /dev/null
+++ b/desktop/share/locale/hi.json
@@ -0,0 +1,190 @@
+{
+ "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": "{0:s} रीड होने योग्य फाइल नहीं है।",
+ "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": "साझा शुरू करने के लिए\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_share_stop_server_autostop_timer_tooltip": "",
+ "gui_receive_start_server": "रिसीव मोड चालू करें",
+ "gui_receive_stop_server": "रिसीव मोड बंद करें",
+ "gui_receive_stop_server_autostop_timer": "रिसीव मोड बंद करें ({} remaining)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "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_please_wait": "शुरू हो रहा है... रद्द करने के लिए क्लिक करें।",
+ "version_string": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "gui_stop_server_autostop_timer_tooltip": "ऑटो-स्टॉप टाइमर {} पर बंद होगा",
+ "gui_start_server_autostart_timer_tooltip": "ऑटो-स्टार्ट टाइमर {} पर बंद होगा",
+ "gui_waiting_to_start": "{} में शुरू होने के लिए शेडयूल है। रद्द करने के लिए क्लिक करें।",
+ "incorrect_password": "पासवर्ड गलत है",
+ "gui_settings_individual_downloads_label": "विशिष्ट फाइलों के डाउनलोड को मंजूरी देने के लिए अचिन्हित करें",
+ "gui_settings_csp_header_disabled_option": "सामग्री सुरक्षा नियम हेडर को अक्षम करें"
+}
diff --git a/desktop/share/locale/hr.json b/desktop/share/locale/hr.json
new file mode 100644
index 00000000..a5f56283
--- /dev/null
+++ b/desktop/share/locale/hr.json
@@ -0,0 +1,232 @@
+{
+ "preparing_files": "Komprimiranje datoteka.",
+ "not_a_readable_file": "{0:s} nije čitljiva datoteka.",
+ "no_available_port": "Priključak za pokretanje Onion usluge nije pronađen",
+ "other_page_loaded": "Adresa učitana",
+ "incorrect_password": "Neispravna lozinka",
+ "close_on_autostop_timer": "Zaustavljeno, jer je vrijeme timera za automatsko zaustavljanje isteklo",
+ "closing_automatically": "Zaustavljeno, jer je prijenos završen",
+ "large_filesize": "Upozorenje: Slanje velike količine podataka može trajati satima",
+ "gui_drag_and_drop": "Povuci i ispusti datoteke i mape koje želiš dijeliti",
+ "gui_add": "Dodaj",
+ "gui_add_files": "Dodaj datoteke",
+ "gui_add_folder": "Dodaj mapu",
+ "gui_delete": "Izbriši",
+ "gui_choose_items": "Odaberi",
+ "gui_share_start_server": "Pokreni dijeljenje",
+ "gui_share_stop_server": "Zaustavi dijeljenje",
+ "gui_share_stop_server_autostop_timer": "Zaustavi dijeljenje ({})",
+ "gui_stop_server_autostop_timer_tooltip": "Timer za automatsko zaustavljanje završava pri {}",
+ "gui_start_server_autostart_timer_tooltip": "Timer za automatsko pokretanje završava u {}",
+ "gui_receive_start_server": "Pokreni modus primanja",
+ "gui_receive_stop_server": "Zaustavi modus primanja",
+ "gui_receive_stop_server_autostop_timer": "Zaustavi modus primanja ({} preostalo)",
+ "gui_copy_url": "Kopiraj adresu",
+ "gui_copy_hidservauth": "Kopiraj HidServAuth",
+ "gui_canceled": "Prekinuto",
+ "gui_copied_url_title": "OnionShare adresa je kopirana",
+ "gui_copied_url": "OnionShare adresa je kopirana u međuspremnik",
+ "gui_copied_hidservauth_title": "HidServAuth kopirano",
+ "gui_copied_hidservauth": "HidServAuth redak je kopiran u međuspremnik",
+ "gui_waiting_to_start": "Planirano pokretanje za {}. Pritisni za prekid.",
+ "gui_please_wait": "Pokretanje … Pritisni za prekid.",
+ "gui_quit_title": "Ne tako brzo",
+ "gui_share_quit_warning": "Proces slanja datoteka je u tijeku. Zaista želiš zatvoriti OnionShare?",
+ "gui_receive_quit_warning": "Proces primanja datoteka je u tijeku. Zaista želiš zatvoriti OnionShare?",
+ "gui_quit_warning_quit": "Izađi",
+ "gui_quit_warning_dont_quit": "Odustani",
+ "error_rate_limit": "Netko je prečesto pokušao pogoditi tvoju lozinku, pa je OnionShare zaustavio poslužitelja. Ponovo pokreni dijeljenje i primatelju pošalji novu adresu za dijeljenje.",
+ "zip_progress_bar_format": "Komprimiranje: %p %",
+ "error_stealth_not_supported": "Za korištenje autorizacije klijenta, potrebni su barem Tor 0.2.9.1-alpha (ili Tor Browser 6.5) i python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare zahtijeva barem Tor 0.2.7.1 i python3-stem 1.4.0.",
+ "gui_settings_window_title": "Postavke",
+ "gui_settings_whats_this": "<a href='{0:s}'>Što je ovo?</a>",
+ "gui_settings_stealth_option": "Koristi autorizaciju klijenta",
+ "gui_settings_stealth_hidservauth_string": "Budući da je privatni ključ spremljen za ponovnu upotrebu, znači da sada možeš kopirati tvoj HidServAuth.",
+ "gui_settings_autoupdate_label": "Traži nove verzije",
+ "gui_settings_autoupdate_option": "Obavijesti me o novim verzijama",
+ "gui_settings_autoupdate_timestamp": "Zadnja provjera: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nikada",
+ "gui_settings_autoupdate_check_button": "Traži nove verzije",
+ "gui_settings_general_label": "Opće postavke",
+ "gui_settings_onion_label": "Onion postavke",
+ "gui_settings_sharing_label": "Postavke za dijeljenje",
+ "gui_settings_close_after_first_download_option": "Zaustavi dijeljenje nakon što se datoteke pošalju",
+ "gui_settings_csp_header_disabled_option": "Isključi zaglavlje za politike sigurnosti sadržaja",
+ "gui_settings_individual_downloads_label": "Odznači, za preuzimanje pojedinačnih datoteka",
+ "gui_settings_connection_type_label": "Kako se OnionShare treba povezati s Torom?",
+ "gui_settings_connection_type_bundled_option": "Koristi verziju Tora koja je ugrađena u OnionShareu",
+ "gui_settings_connection_type_automatic_option": "Pokušaj automatsku konfiguraciju s Tor preglednikom",
+ "gui_settings_connection_type_control_port_option": "Poveži se koristeći kontrolni priključak",
+ "gui_settings_connection_type_socket_file_option": "Poveži se koristeći socket datoteku",
+ "gui_settings_connection_type_test_button": "Ispitaj vezu s Torom",
+ "gui_settings_control_port_label": "Kontrolni priključak",
+ "gui_settings_socket_file_label": "Socket datoteka",
+ "gui_settings_socks_label": "SOCKS priključak",
+ "gui_settings_authenticate_label": "Postavke za autentifikaciju na Tor",
+ "gui_settings_authenticate_no_auth_option": "Bez autentifikacije ili autentifikacija kolačićem",
+ "gui_settings_authenticate_password_option": "Lozinka",
+ "gui_settings_password_label": "Lozinka",
+ "gui_settings_tor_bridges": "Torova podrška za mostove",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Ne koristi mostove",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Koristi ugrađene obfs4 uključive prijenose",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Koristi ugrađene obfs4 uključive prijenose (potreban je obfs4proksi)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Koristi ugrađene meek_lite (Azure) uključive prijenose",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Koristi ugrađene meek_lite (Azure) uključive prijenose (potreban je obfs4proksi)",
+ "gui_settings_meek_lite_expensive_warning": "Upozorenje: meek_lite mostovi troše velike količine resursa za pokretanje Tor projekta.<br><br>Koristi ih samo ako se ne možeš povezati s Torom direktno putem obfs4 prijenosa ili drugih normalnih mostova.",
+ "gui_settings_tor_bridges_custom_radio_option": "Koristi prilagođene mostove",
+ "gui_settings_tor_bridges_custom_label": "Mostove možeš dobiti na <a href=\"https://bridges.torproject.org/options?lang=hr\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Nijedan od dodanih mostova ne funkcionira.\nProvjeri ih ili dodaj druge.",
+ "gui_settings_button_save": "Spremi",
+ "gui_settings_button_cancel": "Odustani",
+ "gui_settings_button_help": "Pomoć",
+ "gui_settings_autostop_timer_checkbox": "Koristi timer za automatsko zaustavljanje",
+ "gui_settings_autostop_timer": "Zaustavi dijeljenje pri:",
+ "gui_settings_autostart_timer_checkbox": "Koristi timer za automatsko pokretanje",
+ "gui_settings_autostart_timer": "Pokreni dijeljenje pri:",
+ "settings_error_unknown": "Nije moguće povezivanje s Tor kontrolerom, jer tvoje postavke nemaju smisla.",
+ "settings_error_automatic": "Neuspjelo povezivanje s Tor kontrolerom. Radi li Tor preglednik (dostupan na torproject.org) u pozadini?",
+ "settings_error_socket_port": "Nije moguće povezivanje s Tor kontrolerom pri {}:{}.",
+ "settings_error_socket_file": "Nije moguće povezivanje s Tor kontrolerom pomoću socket datoteke {}.",
+ "settings_error_auth": "Povezan s {}:{}, ali autentifikacija nije moguća. Možda ovo nije Tor kontroler?",
+ "settings_error_missing_password": "Povezan s Tor kontrolerom, ali zahtijeva lozinku za autentifikaciju.",
+ "settings_error_unreadable_cookie_file": "Povezan s Tor kontrolerom, ali je lozinka možda pogrešna ili tvom korisniku nije dozvoljeno čitati datoteku kolačića.",
+ "settings_error_bundled_tor_not_supported": "Tor verzija koja se isporučuje s OnionShare ne radi u razvojnom modusu operacijskih sustava Windows ili macOS.",
+ "settings_error_bundled_tor_timeout": "Povezivanje s Torom traje predugo. Možda nemaš vezu s internetom ili imaš netočno postavljen sat sustava?",
+ "settings_error_bundled_tor_broken": "Neuspjelo povezivanje OnionShare-a s Torom:\n{}",
+ "settings_test_success": "Povezan s Tor kontrolerom.\n\nTor verzija: {}\nPodržava kratkotrajne Onion usluge: {}.\nPodržava autentifikaciju klijenta: {}.\nPodržava .onion adrese sljedeće generacije: {}.",
+ "error_tor_protocol_error": "Greška s Torom: {}",
+ "error_tor_protocol_error_unknown": "Nepoznata greška s Torom",
+ "connecting_to_tor": "Povezivanje s Tor mrežom",
+ "update_available": "Objavljen je novi OnionShare. <a href='{}'>Pritisni ovdje</a> za preuzimanje.<br><br>Trenutačno koristiš verziju {}, a najnovija verzija je {}.",
+ "update_error_check_error": "Neuspjela pretraga za novom verzijom: možda nemaš vezu s Torom ili OnionShare web-stranica ne radi?",
+ "update_error_invalid_latest_version": "Neuspjela pretraga za novom verzijom: OnionShare web-stranica kaže, da je zadnja verzija neprepoznatljiva „{}” …",
+ "update_not_available": "Koristiš najnoviji OnionShare.",
+ "gui_tor_connection_ask": "Otvoriti postavke za podešavanje veze s Torom?",
+ "gui_tor_connection_ask_open_settings": "Da",
+ "gui_tor_connection_ask_quit": "Zatvori",
+ "gui_tor_connection_error_settings": "U postavkama promijeni način na koji se OnionShare povezuje s Tor mrežom.",
+ "gui_tor_connection_canceled": "Neuspjelo povezivanje s Torom.\n\nProvjeri vezu s internetom, a zatim ponovo pokreni OnionShare i postavi njegovu vezu s Torom.",
+ "gui_tor_connection_lost": "Prekinuta veza s Torom.",
+ "gui_server_started_after_autostop_timer": "Vrijeme timera za automatsko zaustavljanje je isteklo prije nego što je poslužitelj započeo. Izradi novo dijeljenje.",
+ "gui_server_autostop_timer_expired": "Vrijeme timera za automatsko zaustavljanje je već isteklo. Za pokretanje dijeljenja, podesi vrijeme.",
+ "gui_server_autostart_timer_expired": "Planirano vrijeme je već prošlo. Za pokretanje dijeljenja, podesi vrijeme.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Vrijeme za automatsko zaustavljanje ne može biti isto kao vrijeme za automatsko pokretanje ili ranije. Za pokretanje dijeljenja, podesi vrijeme.",
+ "share_via_onionshare": "Dijeli putem OnionSharea",
+ "gui_connect_to_tor_for_onion_settings": "Poveži se s Torom za prikaz postavki Onion usluge",
+ "gui_use_legacy_v2_onions_checkbox": "Koristi stare adrese",
+ "gui_save_private_key_checkbox": "Koristi trajnu adresu",
+ "gui_share_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>preuzeti</b> tvoje datoteke koristeći <b>Tor preglednik</b>: <img src='{}' />",
+ "gui_website_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>posjetiti</b> tvoju web-stranicu koristeći <b>Tor preglednik</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>prenijeti</b> datoteke na tvoje računalo koristeći <b>Tor preglednik</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Ovo se dijeljenje neće automatski zaustaviti.<br><br>Svako naredno dijeljenje ponovo koristi istu adresu. (Za korištenje jednokratne adrese, u postavkama isključi opciju „Koristi trajnu adresu”.)",
+ "gui_url_label_stay_open": "Ovo se dijeljenje neće automatski zaustaviti.",
+ "gui_url_label_onetime": "Ovo će se dijeljenje zaustaviti nakon prvog završavanja.",
+ "gui_url_label_onetime_and_persistent": "Ovo se dijeljenje neće automatski zaustaviti.<br><br>Svako naredno dijeljenje ponovo će koristiti istu adresu. (Za korištenje jednokratne adrese, u postavkama isključi opciju „Koristi trajnu adresu”.)",
+ "gui_status_indicator_share_stopped": "Spremno za dijeljenje",
+ "gui_status_indicator_share_working": "Pokretanje …",
+ "gui_status_indicator_share_scheduled": "Planirano …",
+ "gui_status_indicator_share_started": "Dijeljenje",
+ "gui_status_indicator_receive_stopped": "Spremno za primanje",
+ "gui_status_indicator_receive_working": "Pokretanje …",
+ "gui_status_indicator_receive_scheduled": "Planirano …",
+ "gui_status_indicator_receive_started": "Primanje",
+ "gui_file_info": "{} datoteke, {}",
+ "gui_file_info_single": "{} datoteka, {}",
+ "history_in_progress_tooltip": "{} u tijeku",
+ "history_completed_tooltip": "{} završeno",
+ "history_requests_tooltip": "{} web zahtjeva",
+ "error_cannot_create_data_dir": "Neuspjelo stvaranje mape za OnionShare podatke: {}",
+ "gui_receive_mode_warning": "Modus primanja dozvoljava korisnicima prenijeti datoteke na tvoje računalo.<br><br><b>Pri tome neke datoteke mogu preuzeti kontrolu nad tvojim računalom, ako ih otvoriš. Otvaraj samo stvari od ljudi kojima vjeruješ ili ako znaš što radiš.</b>",
+ "gui_mode_share_button": "Dijeli datoteke",
+ "gui_mode_receive_button": "Primaj datoteke",
+ "gui_mode_website_button": "Objavi web-stranicu",
+ "gui_settings_receiving_label": "Postavke za primanje",
+ "gui_settings_website_label": "Postavke za web-stranicu",
+ "gui_settings_data_dir_label": "Spremi datoteke u",
+ "gui_settings_data_dir_browse_button": "Pretraži",
+ "gui_settings_public_mode_checkbox": "Javni modus",
+ "gui_open_folder_error_nautilus": "Nije moguće otvoriti mapu, jer Nautilus nije dostupan. Datoteka je ovdje: {}",
+ "gui_settings_language_label": "Željeni jezik",
+ "gui_settings_language_changed_notice": "Za primjenu novog jezika, ponovo pokreni OnionShare.",
+ "systray_menu_exit": "Izađi",
+ "systray_page_loaded_title": "Stranica učitana",
+ "systray_page_loaded_message": "OnionShare adresa učitana",
+ "systray_share_started_title": "Dijeljenje pokrenuto",
+ "systray_share_started_message": "Počinje slanja datoteka nekome",
+ "systray_share_completed_title": "Dijeljenje završeno",
+ "systray_share_completed_message": "Završeno je slanje datoteka",
+ "systray_share_canceled_title": "Dijeljenje prekinuto",
+ "systray_share_canceled_message": "Netko je prekinuo primanje tvojih datoteka",
+ "systray_receive_started_title": "Primanje pokrenuto",
+ "systray_receive_started_message": "Netko ti šalje datoteke",
+ "gui_all_modes_history": "Kronologija",
+ "gui_all_modes_clear_history": "Izbriši sve",
+ "gui_all_modes_transfer_started": "Pokrenuto {}",
+ "gui_all_modes_transfer_finished_range": "Preneseno {} – {}",
+ "gui_all_modes_transfer_finished": "Preneseno {}",
+ "gui_all_modes_transfer_canceled_range": "Prekinuto {} – {}",
+ "gui_all_modes_transfer_canceled": "Prekinuto {}",
+ "gui_all_modes_progress_complete": "%p %, {0:s} proteklo.",
+ "gui_all_modes_progress_starting": "{0:s}, %p % (izračunavanje)",
+ "gui_all_modes_progress_eta": "{0:s}, procijenjeno: {1:s}, %p %",
+ "gui_share_mode_no_files": "Nijedna datoteka još nije poslana",
+ "gui_share_mode_autostop_timer_waiting": "Čeka se na završetak slanja",
+ "gui_website_mode_no_files": "Nijedna web-stranica još nije dijeljena",
+ "gui_receive_mode_no_files": "Nijedna datoteka još nije primljena",
+ "gui_receive_mode_autostop_timer_waiting": "Čeka se na završetak primanja",
+ "receive_mode_upload_starting": "Započinje prijenos ukupne veličine od {}",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s",
+ "mode_settings_website_disable_csp_checkbox": "Ne šalji zaglavlja politike sigurnosti sadržaja (omogućuje tvojim web-stranicama koristiti strane resurse)",
+ "mode_settings_receive_data_dir_browse_button": "Pregledaj",
+ "mode_settings_receive_data_dir_label": "Spremi datoteke u",
+ "mode_settings_share_autostop_sharing_checkbox": "Zaustavi dijeljenje nakon što se datoteke pošalju (deaktiviraj za preuzimanje pojedinačnih datoteka)",
+ "mode_settings_client_auth_checkbox": "Koristi autorizaciju klijenta",
+ "mode_settings_legacy_checkbox": "Koristi stare adrese (v2 onion usluge, ne preporučuje se)",
+ "mode_settings_autostop_timer_checkbox": "Zaustavi onion uslugu u planirano vrijeme",
+ "mode_settings_autostart_timer_checkbox": "Pokreni onion uslugu u planirano vrijeme",
+ "mode_settings_public_checkbox": "Nemoj koristiti lozinku",
+ "mode_settings_persistent_checkbox": "Spremi ovu karticu i automatski je otvori kad otvorim OnionShare",
+ "mode_settings_advanced_toggle_hide": "Sakrij napredne postavke",
+ "mode_settings_advanced_toggle_show": "Prikaži napredne postavke",
+ "gui_quit_warning_cancel": "Odustani",
+ "gui_quit_warning_description": "Na nekim tvojim karticama je dijeljenje aktivno. Ako zatvoriš program, zatvorit će se sve kartice. Stvarno želiš zatvoriti program?",
+ "gui_quit_warning_title": "Stvarno?",
+ "gui_close_tab_warning_cancel": "Odustani",
+ "gui_close_tab_warning_close": "Zatvori",
+ "gui_close_tab_warning_website_description": "Imaš aktivni hosting za web-stranicu. Stvarno želiš zatvoriti ovu karticu?",
+ "gui_close_tab_warning_receive_description": "Trenutačno primaš datoteke. Stvarno želiš zatvoriti ovu karticu?",
+ "gui_close_tab_warning_share_description": "Trenutačno šalješ datoteke. Stvarno želiš zatvoriti ovu karticu?",
+ "gui_close_tab_warning_persistent_description": "Ovo je trajna kartica. Ako je zatvoriš, izgubit ćeš onion adresu koju koristi. Stvarno je želiš zatvoriti?",
+ "gui_close_tab_warning_title": "Stvarno?",
+ "gui_new_tab_website_description": "Postavi hosting za statičku HTML onion web-stranicu na tvom računalu.",
+ "gui_new_tab_website_button": "Objavi web-stranicu",
+ "gui_new_tab_share_description": "Odaberi datoteke na računalu koje nekome želiš poslati. Za preuzimanje tih datoteka, osoba ili ljudi kojima šalješ datoteke moraju koristiti Tor preglednik.",
+ "gui_new_tab_receive_description": "Pretvori svoje računalo u internetski dropbox. Ljudi će moći koristiti Tor preglednik za slanje datoteka na tvoje računalo.",
+ "gui_new_tab_receive_button": "Primaj datoteke",
+ "gui_new_tab_share_button": "Dijeli datoteke",
+ "gui_new_tab_tooltip": "Otvori novu karticu",
+ "gui_new_tab": "Nova kartica",
+ "gui_qr_code_description": "Skeniraj ovaj QR kȏd pomoću QR čitača, kao što je kamera na tvom telefonu, za lakše dijeljenje adrese OnionSharea.",
+ "gui_receive_flatpak_data_dir": "Budući da je tvoj OnionShare instaliran pomoću Flatpak-a, datoteke moraš spremiti u jednu mapu u ~/OnionShare.",
+ "gui_tab_name_chat": "Chat",
+ "gui_new_tab_chat_button": "Anonimni chat",
+ "gui_chat_start_server": "Pokreni poslužitelja za chat",
+ "gui_chat_stop_server": "Zaustavi poslužitelja za chat",
+ "gui_chat_stop_server_autostop_timer": "Zaustavi poslužitelja za chat ({})",
+ "gui_tab_name_receive": "Primi",
+ "gui_open_folder_error": "Otvaranje mape s xdg-open nije uspjelo. Datoteka je ovdje: {}",
+ "gui_tab_name_website": "Web-stranica",
+ "gui_tab_name_share": "Dijeli",
+ "gui_qr_code_dialog_title": "OnionShare QR-kod",
+ "gui_show_url_qr_code": "Prikaži QR-kod",
+ "gui_file_selection_remove_all": "Ukloni sve",
+ "gui_remove": "Ukloni",
+ "gui_main_page_chat_button": "Pokreni chat",
+ "gui_main_page_website_button": "Pokreni hosting",
+ "gui_main_page_receive_button": "Pokreni primanje",
+ "gui_main_page_share_button": "Pokreni dijeljenje"
+}
diff --git a/desktop/share/locale/hu.json b/desktop/share/locale/hu.json
new file mode 100644
index 00000000..7d0f6766
--- /dev/null
+++ b/desktop/share/locale/hu.json
@@ -0,0 +1,196 @@
+{
+ "config_onion_service": "",
+ "preparing_files": "Fájlok tömörítése.",
+ "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": "{0:s} nem egy olvasható fájl.",
+ "no_available_port": "Nem található elérhető port az onion szolgáltatás indításához",
+ "other_page_loaded": "Cím betöltve",
+ "close_on_autostop_timer": "Leállítva, mert az auto-sop időzítő lejárt",
+ "closing_automatically": "Leállítva, mert az átvitel véget ért",
+ "timeout_download_still_running": "",
+ "large_filesize": "Figyelem: A nagyobb fájlok elküldése órákat vehet igénybe",
+ "systray_menu_exit": "Kilépés",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "help_local_only": "",
+ "help_stay_open": "",
+ "help_autostop_timer": "",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "",
+ "help_config": "",
+ "gui_drag_and_drop": "Húzzon ide fájlt vagy mappát\na megosztás megkezdéséhez",
+ "gui_add": "Hozzáadás",
+ "gui_delete": "Törlés",
+ "gui_choose_items": "Kiválaszt",
+ "gui_share_start_server": "Megosztás kezdése",
+ "gui_share_stop_server": "Megosztás leállítása",
+ "gui_share_stop_server_autostop_timer": "Megosztás leállítása ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
+ "gui_receive_start_server": "Fogadó mód indítása",
+ "gui_receive_stop_server": "Fogadó mód leállítása",
+ "gui_receive_stop_server_autostop_timer": "Fogadó mód leállítása ({} van hátra)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "gui_copy_url": "Cím másolása",
+ "gui_copy_hidservauth": "HidServAuth másolása",
+ "gui_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "Megszakítva",
+ "gui_copied_url_title": "OnionShare-cím másolva",
+ "gui_copied_url": "OnionShare-cím a vágólapra másolva",
+ "gui_copied_hidservauth_title": "HidServAuth másolva",
+ "gui_copied_hidservauth": "HidServAuth-sor a vágólapra másolva",
+ "gui_please_wait": "Indítás... Kattints a megszakításhoz.",
+ "gui_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "version_string": "",
+ "gui_quit_title": "Állj csak meg",
+ "gui_share_quit_warning": "A fájlküldés folyamatban van. Biztosan kilépsz az OnionShare-ből?",
+ "gui_receive_quit_warning": "A fájlok fogadása folyamatban van. Biztosan kilépsz az OnionShare-ből?",
+ "gui_quit_warning_quit": "Kilépés",
+ "gui_quit_warning_dont_quit": "Mégse",
+ "error_rate_limit": "Valaki túl sokszor próbálta meg beírni a jelszavad, ezért az OnionShare leállította a szervert. Kezdj el újra megosztani és küldj új megosztási címet a fogadó félnek.",
+ "zip_progress_bar_format": "Tömörítés: %p%",
+ "error_stealth_not_supported": "A kliens-hitelesítés használatához szükséged van legalább ezekre: Tor 0.2.9.1-alpha (vagy Tor Browser 6.5) és python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "Az OnionShare minimális követelményei: Tor 0.2.7.1 és python3-stem 1.4.0.",
+ "gui_settings_window_title": "Beállítások",
+ "gui_settings_whats_this": "<a href='{0:s}'>Mi ez?</a>",
+ "gui_settings_stealth_option": "Kliens-hitelesítés használata",
+ "gui_settings_stealth_hidservauth_string": "Mivel elmentetted a titkos kulcsodat, mostantól kattintással másolhatod a HivServAuth-odat.",
+ "gui_settings_autoupdate_label": "Új verzió keresése",
+ "gui_settings_autoupdate_option": "Értesítést kérek, ha új verzió érhető el",
+ "gui_settings_autoupdate_timestamp": "Utoljára ellenőrizve: {}",
+ "gui_settings_autoupdate_timestamp_never": "Soha",
+ "gui_settings_autoupdate_check_button": "Új Verzió keresése",
+ "gui_settings_general_label": "Általános beállítások",
+ "gui_settings_sharing_label": "Megosztás beállításai",
+ "gui_settings_close_after_first_download_option": "Fejezze be a megosztást, ha a fájlokat elküldte",
+ "gui_settings_connection_type_label": "Hogyan csatlakozzon az OnionShare a Tor-hoz?",
+ "gui_settings_connection_type_bundled_option": "Beépített Tor-verzió használata",
+ "gui_settings_connection_type_automatic_option": "Automatikus konfiguráció a Tor-ral",
+ "gui_settings_connection_type_control_port_option": "Csatlakozás kontroll port által",
+ "gui_settings_connection_type_socket_file_option": "Szokettfájl használata",
+ "gui_settings_connection_type_test_button": "Tor-kapcsolat tesztelése",
+ "gui_settings_control_port_label": "Kontroll port",
+ "gui_settings_socket_file_label": "Szokettfájl",
+ "gui_settings_socks_label": "SOCKS port",
+ "gui_settings_authenticate_label": "Tor hitelesítési beállítások",
+ "gui_settings_authenticate_no_auth_option": "Nincs hitelesítés, vagy sütik általi hitelesítés",
+ "gui_settings_authenticate_password_option": "Jelszó",
+ "gui_settings_password_label": "Jelszó",
+ "gui_settings_tor_bridges": "Tor híd támogatása",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Ne használjon hidakat",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Beépített obfs4 pluggable transports használata",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Beépített obfs4 pluggable transports használata (obfs4proxy szükséges)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Beépített meek_lite (Azure) pluggable transports használata",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Beépített meek_lite (Azure) pluggable transports használata (obfs4proxy szükséges)",
+ "gui_settings_meek_lite_expensive_warning": "Figyelem: A meek_lite hidak fenntartása nagyon költséges a Tor Project számára.<br><br>Csak akkor használd őket, ha nem tudsz közetlenül a Tor-hoz csatlakozni az obfs4 vagy más hidak által.",
+ "gui_settings_tor_bridges_custom_radio_option": "Egyéb hidak használata",
+ "gui_settings_tor_bridges_custom_label": "Hidakat innen szerezhetsz: <a href=\"https://bridges.torproject.org/options?lang=hu\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Egyetlen híd sem működik.\nEllenőrizd őket, vagy adj hozzá újakat.",
+ "gui_settings_button_save": "Mentés",
+ "gui_settings_button_cancel": "Mégse",
+ "gui_settings_button_help": "Súgó",
+ "gui_settings_autostop_timer_checkbox": "Leállítás automata időzítővel",
+ "gui_settings_autostop_timer": "Megosztás leállítása ekkor:",
+ "settings_error_unknown": "Nem lehet csatlakozni a Tor-kontrollerhez, mert értelmetlenek a beállításaid.",
+ "settings_error_automatic": "Nem lehet csatlakozni a Tor-kontrollerhez. Fut-e a Tor böngésző (letölthető innen: torproject.org) a háttérben?",
+ "settings_error_socket_port": "Nem lehet csatlakozni a Tor-kontrollerhez itt: {}:{}.",
+ "settings_error_socket_file": "Nem lehet csatlakozni a Tor-kontrollerhez az alábbi szokettfájl használatával: {}.",
+ "settings_error_auth": "Csatlakozva itt: {}:{}, de nem hitelesíthető. Biztos, hogy ez egy Tor-kontroller?",
+ "settings_error_missing_password": "Csatlakozva a Tor-kontrollerhez, de a hitelesítéshez jelszó szükséges.",
+ "settings_error_unreadable_cookie_file": "Csatlakozva a Tor-kontrollerhez, de vagy a jelszó hibás, vagy a felhasználó nem jogosult a süti fájl olvasására.",
+ "settings_error_bundled_tor_not_supported": "Az OnionShare beépített Tor-verziója nem használható fejlesztői módban Windows ill. macOS alatt.",
+ "settings_error_bundled_tor_timeout": "Túl sok időbe telik csatlakozni a Tor-hoz. Lehet hogy nincs internetkapcsolatod, vagy a rendszer órája pontatlan?",
+ "settings_error_bundled_tor_broken": "Az OnionShare nem tudott a háttérben a Tor-hoz csatlakozni:\n{}",
+ "settings_test_success": "Csatlakozva a Tor-kontrollerhez.\n\nTor-verziószám: {}\nTámogatott ideiglenes Onion szolgáltatások: {}.\nTámogatott kliens-hitelesítés: {}.\nTámogatott újgenerációs .onion címek: {}.",
+ "error_tor_protocol_error": "Hiba a Tor-ral: {}",
+ "error_tor_protocol_error_unknown": "Ismeretlen hiba a Tor-ral",
+ "error_invalid_private_key": "",
+ "connecting_to_tor": "Csatlakozás a Tor-hálózathoz",
+ "update_available": "Új OnionShare-verzió érhető el. <a href='{}'>Kattints ide</a> a letöltéshez.<br><br>A te verziód {}, a mostani pedig {}.",
+ "update_error_check_error": "Nem sikerült az új verzió keresése: Az OnionShare weboldal szerint az új verzió '{}' ám az felismerhetetlen…",
+ "update_error_invalid_latest_version": "Nem sikerült az új verzió keresése: Lehet, hogy nem csatlakoztál a Tor-hoz, vagy az OnionShare oldal nem elérhető?",
+ "update_not_available": "A legújabb OnionShare-verziót használod.",
+ "gui_tor_connection_ask": "",
+ "gui_tor_connection_ask_open_settings": "Igen",
+ "gui_tor_connection_ask_quit": "Kilépés",
+ "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_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": "Megosztás",
+ "gui_status_indicator_receive_stopped": "",
+ "gui_status_indicator_receive_working": "",
+ "gui_status_indicator_receive_started": "Bevétel",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "Tallózás",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "Az összes törlése",
+ "gui_upload_in_progress": "",
+ "gui_upload_finished_range": "",
+ "gui_upload_finished": "",
+ "gui_download_in_progress": "",
+ "gui_open_folder_error_nautilus": "",
+ "gui_settings_language_label": "Előnyben részesített nyelv",
+ "gui_settings_language_changed_notice": "",
+ "gui_add_files": "Fájlok hozzáadása",
+ "gui_add_folder": "Mappák hozzáadása",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop időzítő megáll: {}",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start időzítő megáll: {}",
+ "incorrect_password": "Rossz jelszó",
+ "gui_settings_autostart_timer": "Megosztás indítása ekkor:",
+ "gui_settings_autostart_timer_checkbox": "Indítás automata időzítővel",
+ "gui_settings_individual_downloads_label": "Ne pipáld be az egyenkénti fájlletöltés engedélyezéséhez",
+ "gui_settings_csp_header_disabled_option": "Tartalombiztonsági Irányelvek-fejléc tiltása",
+ "gui_settings_onion_label": "Onion-beállítások",
+ "gui_waiting_to_start": "Indulás ütemezve: {}. Kattints a megszakításhoz."
+}
diff --git a/desktop/share/locale/id.json b/desktop/share/locale/id.json
new file mode 100644
index 00000000..44adac8b
--- /dev/null
+++ b/desktop/share/locale/id.json
@@ -0,0 +1,192 @@
+{
+ "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": "Peringatan: Mengirim dalam jumlah besar dapat memakan waktu berjam-jam",
+ "systray_menu_exit": "Keluar",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_verbose": "Catat kesalahan OnionShare ke stdout, dan kesalahan web ke disk",
+ "help_filename": "Daftar berkas atau folder untuk dibagikan",
+ "help_config": "",
+ "gui_drag_and_drop": "Seret dan lepas berkas dan folder\nuntuk mulai berbagi",
+ "gui_add": "Tambahkan",
+ "gui_delete": "Hapus",
+ "gui_choose_items": "Pilih",
+ "gui_share_start_server": "Mulai berbagi",
+ "gui_share_stop_server": "Berhenti berbagi",
+ "gui_share_stop_server_autostop_timer": "Berhenti berbagi ({})",
+ "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 ({}d 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": "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": "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": "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": "<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": "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": "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": "Menguji sambungan ke Tor",
+ "gui_settings_control_port_label": "Port kontrol",
+ "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": "",
+ "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": "Simpan",
+ "gui_settings_button_cancel": "Batal",
+ "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": "Ya",
+ "gui_tor_connection_ask_quit": "Keluar",
+ "gui_tor_connection_error_settings": "",
+ "gui_tor_connection_canceled": "",
+ "gui_tor_connection_lost": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
+ "share_via_onionshare": "",
+ "gui_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "Jelajahi",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_add_files": "Tambahkan berkas",
+ "gui_add_folder": "Tambahkan Folder",
+ "gui_settings_onion_label": "Pengaturan Onion",
+ "incorrect_password": "Password salah",
+ "gui_waiting_to_start": "Dijadwalkan akan dimulai pada {}. Klik untuk membatalkan.",
+ "gui_start_server_autostart_timer_tooltip": "Timer mulai otomatis berakhir pada {}",
+ "gui_stop_server_autostop_timer_tooltip": "Timer berhenti otomatis berakhir pada {}"
+}
diff --git a/desktop/share/locale/is.json b/desktop/share/locale/is.json
new file mode 100644
index 00000000..5a04b251
--- /dev/null
+++ b/desktop/share/locale/is.json
@@ -0,0 +1,287 @@
+{
+ "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": "Aðvörun: að senda stóra skrá getur tekið klukkustundir",
+ "systray_menu_exit": "Hætta",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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 til 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": "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": "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": "Hætta við",
+ "error_rate_limit": "Einhver hefur gert of margar rangar tilraunir til að giska á lykilorðið þitt, þ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": "Athuga með nýjar útgáfur",
+ "gui_settings_general_label": "Almennar stillingar",
+ "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?lang=is\">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:\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: mögulega ertu ekki tengd(ur) við Tor eða að vefsvæði OnionShare sé óvirkt í augnablikinu?",
+ "update_error_invalid_latest_version": "Gat ekki athugað með nýjar uppfærslu: vefsvæði OnionShare tilkynnir að nýjasta útgáfan sé hin óskiljanlega '{}'…",
+ "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": "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 tengd/ur 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ð. Lagaðu hana til að hefja deilingu.",
+ "share_via_onionshare": "Deila 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": "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": "Opinber hamur",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "Síða lesin inn",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "gui_upload_finished_range": "",
+ "gui_upload_finished": "",
+ "gui_download_in_progress": "",
+ "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ð nýtt tungumál 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ð. Lagað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. Lagað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",
+ "invalid_password_guess": "Ógilt lykilorð",
+ "gui_website_url_description": "<b>Hver sem er</b> með þetta OnionShare vistfang getur <b>skoðað</b> vefsvæðið þitt með því að nota <b>Tor-vafrann</b>: <img src='{}' />",
+ "gui_mode_website_button": "Birta vefsvæði",
+ "gui_website_mode_no_files": "Ennþá hefur engu vefsvæði verið deilt",
+ "incorrect_password": "Rangt lykilorð",
+ "gui_settings_individual_downloads_label": "Taktu merkið úr til að leyfa niðurhal á stökum skrám",
+ "history_requests_tooltip": "{} vefbeiðnir",
+ "gui_settings_csp_header_disabled_option": "Gera haus fyrir öryggisstefnu efnis (Content Security Policy) óvirkan",
+ "gui_settings_website_label": "Stillingar vefsvæðis",
+ "gui_new_tab_share_description": "Veldu skrár á tölvunni til að senda einhverjum öðrum. Sá eða þau sem þú ætlar að senda skrárnar þarf að nota Tor-vafrann til að sækja þær frá þér.",
+ "gui_new_tab_receive_description": "Breyttu tölvunni þinni í nettengt afhendingarhólf (dropbox). Fólk getur þá notað Tor-vafrann til að senda skrár inn á tölvuna þína.",
+ "mode_settings_persistent_checkbox": "Vista þennan flipa og opna hann sjálfkrafa þegar ég opna OnionShare",
+ "gui_close_tab_warning_persistent_description": "Þessi flipi er viðvarandi. Ef þú lokar honum muntu tapa onion-vistfanginu sem hann er að nota. Ertu viss að þú viljir loka honum?",
+ "gui_quit_warning_description": "Deiling er virk í sumum flipanna þinna. Ef þú hættir núna, lokast allir fliparnir. Ertu viss um að þú viljir hætta?",
+ "mode_settings_share_autostop_sharing_checkbox": "Hætta að deila eftir að skrár hafa verið sendar (taka merkið úr reitnum til að leyfa niðurhal á stökum skrám)",
+ "mode_settings_website_disable_csp_checkbox": "Gera haus fyrir öryggisstefnu efnis (Content Security Policy) óvirkan (gerir vefsvæðinu þínu kleift að nota tilföng frá utanaðkomandi aðilum)",
+ "gui_close_tab_warning_share_description": "Þú ert að senda skrár. Ertu viss um að þú viljir loka þessum flipa?",
+ "mode_settings_legacy_checkbox": "Nota eldri gerð vistfangs (onion-þjónusta af útgáfu 2, ekki mælt með því)",
+ "gui_close_tab_warning_website_description": "Þú ert að hýsa vefsvæði. Ertu viss um að þú viljir loka þessum flipa?",
+ "gui_close_tab_warning_receive_description": "Þú ert að taka á móti skrám. Ertu viss um að þú viljir loka þessum flipa?",
+ "gui_new_tab_website_description": "Hýstu statskt HTML onion-vefsvæði frá tölvunni þinni.",
+ "mode_settings_receive_data_dir_browse_button": "Skoða",
+ "mode_settings_public_checkbox": "Ekki nota lykilorð",
+ "mode_settings_receive_data_dir_label": "Vista skrár í",
+ "mode_settings_autostart_timer_checkbox": "Ræsa onion-þjónustu á áætluðum tíma",
+ "gui_quit_warning_title": "Ertu viss?",
+ "gui_new_tab_share_button": "Deila skrám",
+ "mode_settings_advanced_toggle_show": "Birta ítarlegar stillingar",
+ "gui_new_tab_tooltip": "Opna nýjan flipa",
+ "gui_new_tab_receive_button": "Taka á móti skrám",
+ "mode_settings_client_auth_checkbox": "Nota auðkenningu biðlaraforrits",
+ "mode_settings_advanced_toggle_hide": "Fela ítarlegar stillingar",
+ "gui_quit_warning_cancel": "Hætta við",
+ "gui_close_tab_warning_title": "Ertu viss?",
+ "gui_new_tab_website_button": "Hýsa vefsvæði",
+ "gui_new_tab": "Nýr flipi",
+ "gui_close_tab_warning_close": "Loka",
+ "gui_close_tab_warning_cancel": "Hætta við",
+ "mode_settings_autostop_timer_checkbox": "Stöðva onion-þjónustu á áætluðum tíma",
+ "gui_receive_flatpak_data_dir": "Þar sem þú settir OnionShare upp með því að nota Flatpak, þá verður þú að vista skrár í möppu undir ~/OnionShare.",
+ "gui_tab_name_receive": "Taka á móti",
+ "gui_chat_stop_server": "Stöðva spjallþjón",
+ "gui_chat_start_server": "Ræsa spjallþjón",
+ "gui_tab_name_chat": "Spjall",
+ "gui_tab_name_website": "Vefsvæði",
+ "gui_tab_name_share": "Deila",
+ "gui_open_folder_error": "Mistókst að opna möppu með xdg-open. Skráin er hér: {}",
+ "gui_qr_code_description": "Skannaðu þennan QR-kóða með QR-kóðalesara, svo sem eins og með myndavélinni á símanum þínum, svo auðveldara sé fyrir þig að deila OnionShare-vistfanginu með öðrum.",
+ "gui_remove": "Fjarlægja",
+ "gui_chat_stop_server_autostop_timer": "Stöðva spjallþjón ({})",
+ "gui_qr_code_dialog_title": "QR-kóði OnionShare",
+ "gui_file_selection_remove_all": "Fjarlægja allt",
+ "gui_show_url_qr_code": "Birta QR-kóða",
+ "gui_new_tab_chat_button": "Spjalla nafnlaust",
+ "gui_main_page_chat_button": "Hefja spjall",
+ "gui_main_page_website_button": "Hefja hýsingu",
+ "gui_main_page_receive_button": "Hefja móttöku",
+ "gui_main_page_share_button": "Hefja deilingu"
+}
diff --git a/desktop/share/locale/it.json b/desktop/share/locale/it.json
new file mode 100644
index 00000000..f6e25927
--- /dev/null
+++ b/desktop/share/locale/it.json
@@ -0,0 +1,237 @@
+{
+ "preparing_files": "Compressione dei file in corso.",
+ "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",
+ "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_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",
+ "gui_delete": "Cancella",
+ "gui_choose_items": "Scegli",
+ "gui_share_start_server": "Inizia la condivisione",
+ "gui_share_stop_server": "Arresta la condivisione",
+ "gui_copy_url": "Copia Indirizzo",
+ "gui_downloads": "Cronologia dei Download",
+ "gui_canceled": "Annullato",
+ "gui_copied_url": "Indirizzo OnionShare copiato negli appunti",
+ "gui_please_wait": "Avviato... Cliccare per annullare.",
+ "zip_progress_bar_format": "Compressione al: %p%",
+ "config_onion_service": "Preparando il servizio onion sulla porta {0:d}.",
+ "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_autostop_timer": "Arrestato per tempo scaduto",
+ "timeout_download_still_running": "download in corso, attendere",
+ "systray_menu_exit": "Termina",
+ "systray_download_started_title": "Download con OnionShare avviato",
+ "systray_download_started_message": "Un utente ha iniziato il download dei tuoi file",
+ "systray_download_completed_title": "Download completato",
+ "systray_download_completed_message": "L'utente ha terminato il download dei tuoi file",
+ "systray_download_canceled_title": "OnionShare Download cancellato",
+ "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_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_autostop_timer": "Arresta la condivisione ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Il timer si arresterà tra {}",
+ "gui_receive_start_server": "Avvia modalità Ricezione",
+ "gui_receive_stop_server": "Arresta modalità Ricezione",
+ "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",
+ "gui_copied_hidservauth_title": "HidServAuth copiato",
+ "gui_copied_hidservauth": "Linea HidServAuth copiata negli appunti",
+ "gui_download_upload_progress_complete": "%p%, {0:s} trascorsi.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (calcolato)",
+ "gui_download_upload_progress_eta": "{0:s}, Terminando in: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org",
+ "gui_quit_title": "Non così in fretta",
+ "gui_share_quit_warning": "Stai inviando dei file. Sei sicuro di voler uscire da OnionShare?",
+ "gui_receive_quit_warning": "Stai ricevendo dei file, vuoi davvero terminare OnionShare?",
+ "gui_quit_warning_quit": "Esci",
+ "gui_quit_warning_dont_quit": "Annulla",
+ "error_rate_limit": "Qualcuno ha tentato troppe volte di indovinare la tua password. OnionShare ha fermato il server. Riavvia la condivisione e invia al tuo contatto il nuovo indirizzo.",
+ "error_stealth_not_supported": "Per usare l'opzione \"client auth\" hai bisogno almeno della versione di Tor 0.2.9.1-alpha (o Tor Browser 6.5) con python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare richiede almeno Tor 0.2.7.1 e python3-stem 1.4.0.",
+ "gui_settings_window_title": "Impostazioni",
+ "gui_settings_whats_this": "<a href='{0:s}'>Cos'è questo?</a>",
+ "help_receive": "Ricevi le condivisioni invece di inviarle",
+ "gui_settings_stealth_option": "Usa l'autorizzazione client (legacy)",
+ "gui_settings_stealth_hidservauth_string": "Avendo salvato la tua chiave privata per il riutilizzo, puoi cliccare per copiare il tuo HidServAuth.",
+ "gui_settings_autoupdate_label": "Controlla se vi sono nuove versioni",
+ "gui_settings_autoupdate_option": "Avvisami quando è disponibile una nuova versione",
+ "gui_settings_autoupdate_timestamp": "Ultimo controllo: {}",
+ "gui_settings_autoupdate_timestamp_never": "Mai",
+ "gui_settings_autoupdate_check_button": "Controlla se esiste una nuova versione",
+ "gui_settings_general_label": "Impostazioni generali",
+ "gui_settings_sharing_label": "Impostazioni di condivisione",
+ "gui_settings_close_after_first_download_option": "Interrompe la condivisione dopo che i file sono stati inviati",
+ "gui_settings_connection_type_label": "Come si dovrebbe connettere OnionShare a Tor?",
+ "gui_settings_connection_type_bundled_option": "Usa la versione Tor integrata in OnionShare",
+ "gui_settings_connection_type_automatic_option": "Tentativo di auto-configurazione con Tor Browser",
+ "gui_settings_language_label": "Lingua preferita",
+ "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 File",
+ "gui_add_folder": "Aggiungi cartella",
+ "gui_settings_connection_type_control_port_option": "Connetti usando la porta di controllo",
+ "gui_settings_connection_type_socket_file_option": "Connetti usando il file di socket",
+ "gui_settings_connection_type_test_button": "Verifica la connessione a Tor",
+ "gui_settings_socket_file_label": "File di socket",
+ "gui_settings_socks_label": "Porta SOCKS",
+ "gui_settings_authenticate_label": "Impostazioni di autenticazione Tor",
+ "gui_settings_authenticate_password_option": "Password",
+ "gui_settings_password_label": "Password",
+ "gui_settings_control_port_label": "Porta di controllo",
+ "gui_settings_authenticate_no_auth_option": "Nessuna autenticazione o cookie di autenticazione",
+ "gui_settings_tor_bridges": "Supporto bridge Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Non usare i bridge",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Usare il trasporto attivabile obfs4 integrato",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Usare i trasporti collegabile obfs4 integrati (richiede obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Usare i trasporti integrati meek_lite (Azure) selezionabili",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Usare i trasporti integrati meek_lite (Azure) selezionabili (richiede obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Attenzione: i bridge meek_lite sono molto pesanti per l'esecuzione del progetto Tor.<br><br>Da usare solo se impossibile connettersi a Tor direttamente, con obfs4, o altri bridge normali.",
+ "gui_settings_tor_bridges_custom_label": "Puoi prendere i bridge da <a href=\"https://bridges.torproject.org/options?lang=it\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Nessuno dei bridge che hai aggiunto funzionano\nControllali nuovamente o aggiungine altri.",
+ "gui_settings_button_save": "Salva",
+ "gui_settings_button_cancel": "Cancella",
+ "gui_settings_button_help": "Aiuto",
+ "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 {}: {}.",
+ "settings_error_socket_file": "Impossibile connettersi al controller Tor utilizzando il file socket {}.",
+ "settings_error_auth": "Connesso a {}: {}, ma non può autenticarsi. Forse questo non è un controller Tor?",
+ "settings_error_missing_password": "Collegato al controller Tor, ma richiede una password per l'autenticazione.",
+ "settings_error_unreadable_cookie_file": "Collegato al controller Tor, ma la password potrebbe essere errata o l'utente non è autorizzato a leggere il file cookie.",
+ "settings_error_bundled_tor_not_supported": "L'uso della versione Tor fornita con OnionShare non funziona in modalità sviluppatore su Windows o macOS.",
+ "settings_error_bundled_tor_timeout": "Prendendo troppo tempo per connettersi a Tor. Forse non sei connesso a Internet o hai un orologio di sistema impreciso?",
+ "settings_error_bundled_tor_broken": "OnionShare non è riuscito a connettersi a Tor in background:\n{}",
+ "settings_test_success": "Collegato al controller Tor.\n\nVersione Tor: {}\nSupporta servizi onion effimeri: {}.\nSupporta l'autenticazione del client: {}.\nSupporta indirizzi .onion next-gen: {}.",
+ "error_tor_protocol_error": "Si è verificato un errore con Tor: {}",
+ "error_tor_protocol_error_unknown": "Si è verificato un errore sconosciuto con Tor",
+ "error_invalid_private_key": "Questo tipo di chiave privata non è supportato",
+ "connecting_to_tor": "In connessione alla rete Tor",
+ "update_available": "E' disponibile una nuova versione di OnionShare. <a href='{}'>Clicca qui</a> per scaricarla.<br><br>Stai usando {} e l'ultima versione è {}.",
+ "update_error_check_error": "Non è possibile verificare per la nuova versione: il sito OnionShare dice che l'ultima versione non è riconoscibile '{}'…",
+ "update_error_invalid_latest_version": "Non è possibile controllare per una nuova versione: Magari non sei connesso a Tor, o il sito OnionShare non funziona?",
+ "update_not_available": "Stai usando la ultima versione di OnionShare.",
+ "gui_tor_connection_ask": "Apri le impostazione per trovare la connessione a Tor?",
+ "gui_tor_connection_ask_open_settings": "Sì",
+ "gui_tor_connection_ask_quit": "Esci",
+ "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\nAssicurati di essere connesso a Internet, dopo prova a riaprire OnionShare e configurare la connessione a Tor.",
+ "gui_tor_connection_lost": "Disconnesso da Tor.",
+ "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 modificarlo per iniziare la condivisione.",
+ "share_via_onionshare": "Condividi via 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",
+ "gui_save_private_key_checkbox": "Usa un indirizzo persistente",
+ "gui_share_url_description": "<b>1 Tutti</b>2 con questo l'indirizzo di OnionShare possono <b>3 scaricare</b>4 i tuoi file usando <b>5 il Browser Tor</b>6: <img src='{}' />7",
+ "gui_receive_url_description": "<b>1 Tutti</b>2 con questo indirizzo OnionShare possono <b>3 caricare</b>4 file nel tuo computer usando <b>5 Tor Browser</b>6: <img src='{}' />7",
+ "gui_url_label_persistent": "Questa condivisione non si arresterà automaticamente. <br> <br> Ogni successiva condivisione riutilizza l'indirizzo. (Per utilizzare indirizzi monouso, disattivare \"Usa indirizzo persistente\" nelle impostazioni.)",
+ "gui_url_label_stay_open": "Questa condivisione non si arresterà automaticamente.",
+ "gui_url_label_onetime": "Questa condivisione verrà interrotta dopo il primo completamento.",
+ "gui_url_label_onetime_and_persistent": "Questa condivisione non si arresterà automaticamente. <br> <br> Ogni condivisione successiva riutilizzerà l'indirizzo. (Per utilizzare indirizzi monouso, disattivare \"Usa indirizzo persistente\" nelle impostazioni.)",
+ "gui_status_indicator_share_stopped": "Pronto per condividere",
+ "gui_status_indicator_share_working": "Iniziando…",
+ "gui_status_indicator_share_started": "Condividendo",
+ "gui_status_indicator_receive_stopped": "Pronto per ricevere",
+ "gui_status_indicator_receive_working": "Iniziando…",
+ "gui_status_indicator_receive_started": "Ricevendo",
+ "gui_file_info": "{} file, {}",
+ "gui_file_info_single": "{} file, {}",
+ "history_in_progress_tooltip": "{} in avanzamento",
+ "history_completed_tooltip": "{} completato",
+ "info_in_progress_uploads_tooltip": "{} upload(s) in avanzamento",
+ "info_completed_uploads_tooltip": "{} upload(s) completati",
+ "error_cannot_create_downloads_dir": "Non è stato possibile creare la cartella in modalità ricezione: {}",
+ "receive_mode_downloads_dir": "I file a te mandati appariranno in questa cartella: {}",
+ "receive_mode_warning": "Attenzione: La modalità ricezione permette alla gente di fare l'upload di file nel tuo computer. Alcuni file possono potenzialmente prendere il controllo del tuo computer se aperti. Apri solamente file inviati da persone di cui ti fidi, o se sai quello che stai facendo.",
+ "gui_receive_mode_warning": "La modalità ricezione permette alle persone di fare l'upload di file nel tuo computer.<br><br><b>Alcuni file possono potenzialmente prendere il controllo del tuo computer se li apri. Apri solamente file di persone di cui ti fidi, o se sai quello che stai facendo.</b>",
+ "receive_mode_upload_starting": "Upload di dimensione totale {} sta partendo",
+ "receive_mode_received_file": "Ricevuto: {}",
+ "gui_mode_share_button": "Condividi File",
+ "gui_mode_receive_button": "Ricevi File",
+ "gui_settings_receiving_label": "Impostazioni di Ricezione",
+ "gui_settings_downloads_label": "Salva i file in",
+ "gui_settings_downloads_button": "Navigare",
+ "gui_settings_public_mode_checkbox": "Modalità pubblica",
+ "systray_close_server_title": "Il server OnionShare è inattivo",
+ "systray_close_server_message": "Un utente ha disattivato il Server",
+ "systray_page_loaded_title": "Pagina caricata",
+ "systray_download_page_loaded_message": "Un utente ha caricato la pagina di Download",
+ "systray_upload_page_loaded_message": "Un utente ha caricato la pagina di Upload",
+ "gui_uploads": "Storia degli Upload",
+ "gui_no_uploads": "Nessun Upload ancora",
+ "gui_clear_history": "Pulisci tutto",
+ "gui_upload_in_progress": "Upload iniziato {}",
+ "gui_upload_finished_range": "Upload eseguito {} a {}",
+ "gui_upload_finished": "Caricato {}",
+ "gui_download_in_progress": "Download iniziato {}",
+ "gui_open_folder_error_nautilus": "Impossibile aprire la cartella perché Nautilus non è disponibile. Il file è qui: {}",
+ "gui_settings_onion_label": "Impostazioni Onion",
+ "error_cannot_create_data_dir": "Non è possibile creare la cartella dati OnionShare: {}",
+ "receive_mode_data_dir": "I file inviati a te appariranno in questa cartella: {}",
+ "gui_settings_data_dir_label": "Salva i file in",
+ "gui_settings_data_dir_browse_button": "Naviga",
+ "systray_page_loaded_message": "Indirizzo OnionShare caricato",
+ "systray_share_started_title": "Condivisione iniziata",
+ "systray_share_started_message": "Inizio dell'invio dei file a qualcuno",
+ "systray_share_completed_title": "Condivisione completata",
+ "systray_share_completed_message": "Completato l'invio dei file",
+ "systray_share_canceled_title": "Condivisione annullata",
+ "systray_share_canceled_message": "Qualcuno ha annullato la ricezione dei file",
+ "systray_receive_started_title": "Inizio ricezione",
+ "systray_receive_started_message": "Qualcuno ti sta inviando dei file",
+ "gui_all_modes_history": "Storico",
+ "gui_all_modes_clear_history": "Pulisci tutto",
+ "gui_all_modes_transfer_started": "Iniziato {}",
+ "gui_all_modes_transfer_finished_range": "Trasferito {} - {}",
+ "gui_all_modes_transfer_finished": "Trasferito {}",
+ "gui_all_modes_transfer_canceled_range": "Annullato {} - {}",
+ "gui_all_modes_transfer_canceled": "Annullato {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} trascorsi.",
+ "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_autostop_timer_waiting": "In attesa di finire l'invio",
+ "gui_receive_mode_no_files": "Nessun file ricevuto ancora",
+ "gui_receive_mode_autostop_timer_waiting": "In attesa di finire la ricezione",
+ "gui_stop_server_autostop_timer_tooltip": "Il timer Auto-stop terminerà alle {}",
+ "gui_start_server_autostart_timer_tooltip": "Il timer Auto-start termina alle {}",
+ "gui_waiting_to_start": "Programmato per avviarsi in {}. Clicca per annullare.",
+ "gui_settings_autostart_timer_checkbox": "Usa il timer a partenza automatica",
+ "gui_settings_autostart_timer": "Inizia la condivisione a:",
+ "gui_server_autostart_timer_expired": "L'ora pianificata è già passata. Si prega di modificarla 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 modificarlo 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",
+ "incorrect_password": "Password non corretta",
+ "gui_settings_individual_downloads_label": "Disabilita per consentire il download di file singoli",
+ "gui_website_url_description": "<b>Chiunque</b>, con questo indirizzo di OnionShare, può <b>visitare</b> il tuo sito web utilizzando il <b>Browser Tor</b>: <img src='{}' />",
+ "gui_mode_website_button": "Pubblica sito web",
+ "gui_website_mode_no_files": "Nessun sito web condiviso al momento",
+ "history_requests_tooltip": "{} richieste web",
+ "gui_settings_csp_header_disabled_option": "Disabilita header dei criteri di sicurezza dei contenuti",
+ "gui_settings_website_label": "Impostazioni sito web"
+}
diff --git a/desktop/share/locale/ja.json b/desktop/share/locale/ja.json
new file mode 100644
index 00000000..95ee43b7
--- /dev/null
+++ b/desktop/share/locale/ja.json
@@ -0,0 +1,237 @@
+{
+ "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": "ダウンロード完了待ち",
+ "timeout_upload_still_running": "アップロード完了待ち",
+ "large_filesize": "注意:大きいなファイルを送信するに数時間かかるかもしれない",
+ "systray_menu_exit": "終了",
+ "systray_download_started_title": "OnionShareダウンロードは開始されました",
+ "systray_download_started_message": "ユーザーがダウンロードを開始しました",
+ "systray_download_completed_title": "OnionShareダウンロード完了",
+ "systray_download_completed_message": "ユーザーがダウンロードし終えました",
+ "systray_download_canceled_title": "OnionShareダウンロードは中止されました",
+ "systray_download_canceled_message": "ユーザーがダウンロードを中止しました",
+ "systray_upload_started_title": "OnionShareアップロードは開始されました",
+ "systray_upload_started_message": "ユーザーがファイルをアップロードし始めました",
+ "help_local_only": "Torを使わない(開発利用のみ)",
+ "help_stay_open": "ファイルが送信された後に共有し続けます",
+ "help_autostop_timer": "数秒後に共有が停止されます",
+ "help_stealth": "クライアント認証を使う(上級者向け)",
+ "help_receive": "共有を送信する代わりに受信する",
+ "help_verbose": "OnionShareのエラーを標準出力に、Webのエラーをディスクに記録する",
+ "help_filename": "共有するファイルとフォルダの一覧",
+ "help_config": "カスタムJSON設定ファイルの位置(任意)",
+ "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": "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_download_upload_progress_complete": "%p%、 経過時間 ({0:s})。",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (計算中)",
+ "gui_download_upload_progress_eta": "{0:s} 終了予定:{1:s}、%p%",
+ "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": "<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_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": "組み込みのobs4 pluggable transportを使用する",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "組み込みのobs4 pluggable transportを使用する(obsf4proxy必要)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "組み込みのmeek_lite (Azure) pluggable transportを使用する",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "組み込みのmeek_lite (Azure) pluggable transportを使用する(obsf4proxy必要)",
+ "gui_settings_meek_lite_expensive_warning": "警告:meek_liteブリッジはTor Projectにとって維持費がかさむ<br><br>直接にTorと接続できない場合、あるいはobsf4ブリッジや他のブリッジが使用できない場合のみに使って下さい。",
+ "gui_settings_tor_bridges_custom_radio_option": "カスタムブリッジを使用する",
+ "gui_settings_tor_bridges_custom_label": "<a href=\"https://bridges.torproject.org/options?lang=ja\">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": "共有を停止する時間:",
+ "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": "Torコントローラーと接続できましたが、パスワードが診違っているあるいはクッキーファイルの読み出し許可がないかもしれない。",
+ "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クライアント認証をサポートする:{}\nnext-gen .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": "設定で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": "自動停止タイマーはすでにタイムアウトしています。共有し始めるにはタイマーを調整して下さい。",
+ "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>を利用してこのPCにファイルを<b>アップロードできます</b>:<img src='{}' />",
+ "gui_url_label_persistent": "このファイル共有には自動停止はありません。<br><br>その次の共有は同じアドレスを再利用します。(1回限りのアドレスには、設定で「永続的アドレス」を無効にして下さい。)",
+ "gui_url_label_stay_open": "このファイル共有には自動停止はありません。",
+ "gui_url_label_onetime": "このファイル共有は最初の完了後に停止されます。",
+ "gui_url_label_onetime_and_persistent": "このファイル共有には自動停止はありません。<br><br>その次の共有は同じアドレスを再利用します。(1回限りのアドレスには、設定で「永続的アドレス」を無効にして下さい。)",
+ "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": "警告:受信モードで他の人はあなたのPCへファイルをアップロードできるようにします。悪意なファイルを開いたら、PCは感染される可能性があります。ファイル内容を完全に理解しない場合、信用している人のみからのファイルを開いて下さい。",
+ "gui_receive_mode_warning": "受信モードで他の人はあなたのPCへファイルをアップロードできるようにします。<br><br><b>悪意なファイルを開いたら、PCは感染される可能性があります。ファイル内容を完全に理解しない場合、信用している人のみからのファイルを開いて下さい。</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_public_mode_checkbox": "公開モード",
+ "systray_close_server_title": "OnionShareサーバーは閉鎖されました",
+ "systray_close_server_message": "ユーザーがサーバーを閉鎖しました",
+ "systray_page_loaded_title": "ページはロードされました",
+ "systray_download_page_loaded_message": "ユーザーがダウンロードページをロードしました",
+ "systray_upload_page_loaded_message": "ユーザーがアップロードページをロードしました",
+ "gui_uploads": "アップロード履歴",
+ "gui_no_uploads": "アップロードはまだありません",
+ "gui_clear_history": "全てをクリアする",
+ "gui_upload_in_progress": "アップロード開始しました {}",
+ "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を再起動して下さい。",
+ "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_autostop_timer_waiting": "送信完了を待機しています",
+ "gui_receive_mode_no_files": "受信されたファイルがまだありません",
+ "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": "秒",
+ "gui_website_url_description": "<b>誰でも</b> このOnionShareアドレスを知る限り、<b>Torブラウザで</b> サイトを<b>訪れることができます</b>: <img src='{}' />",
+ "gui_mode_website_button": "ウェブサイトを発行する",
+ "gui_website_mode_no_files": "共有されたウェブサイトは未だありません",
+ "incorrect_password": "不正なパスワード",
+ "gui_settings_individual_downloads_label": "個別ファイルのダウンロード許可を与えるのにチェックを外す",
+ "history_requests_tooltip": "{} ウェブリクエスト",
+ "gui_settings_csp_header_disabled_option": "コンテンツセキュリティポリシーヘッダーを無効にする",
+ "gui_settings_website_label": "ウェブサイト設定"
+}
diff --git a/desktop/share/locale/ka.json b/desktop/share/locale/ka.json
new file mode 100644
index 00000000..9c41ed9f
--- /dev/null
+++ b/desktop/share/locale/ka.json
@@ -0,0 +1,187 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "პროგრამის დატოვება",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "არჩევა",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_settings_data_dir_browse_button": "არჩევა",
+ "gui_all_modes_history": ""
+}
diff --git a/desktop/share/locale/km.json b/desktop/share/locale/km.json
new file mode 100644
index 00000000..44dfde5a
--- /dev/null
+++ b/desktop/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/desktop/share/locale/ko.json b/desktop/share/locale/ko.json
new file mode 100644
index 00000000..adda3a69
--- /dev/null
+++ b/desktop/share/locale/ko.json
@@ -0,0 +1,185 @@
+{
+ "config_onion_service": "어니언 서비스를 포트{0:d} 에서 설정하기.",
+ "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": "어니언 서비스를 시작하기 위한 사용 가능한 포트를 찾을수 없었습니다",
+ "other_page_loaded": "주소가 로드되다",
+ "close_on_autostop_timer": "자동멈춤 타이머가 끝났기 때문에 정지되다",
+ "closing_automatically": "다운로드가 완료되었기 때문에 정지되다",
+ "timeout_download_still_running": "다운로드가 완료되기를 기다리는 중입니다",
+ "timeout_upload_still_running": "업로드가 완료되기를 기다리는 중입니다",
+ "large_filesize": "경고: 대용량의 자료를 보내는것은 오래 걸릴수 있습니다",
+ "systray_menu_exit": "종료",
+ "systray_download_started_title": "어니언쉐어 다운로드가 시작됨",
+ "systray_download_started_message": "사용자가 당신의 파일들을 다운로딩 하기 시작했습니다",
+ "systray_download_completed_title": "어니언쉐어 다운로드가 완료됨",
+ "systray_download_completed_message": "사용자가 당신의 파일들을 다운로딩 하는것을 완료했습니다",
+ "systray_download_canceled_title": "어니언쉐어 다운로드가 취소됨",
+ "systray_download_canceled_message": "사용자가 다운로드를 취소했습니다",
+ "systray_upload_started_title": "어니언쉐어 업로드가 시작됨",
+ "systray_upload_started_message": "사용자가 파일들을 당신의 컴퓨터로 업로딩 하는것을 시작했습니다",
+ "help_local_only": "Tor를 사용하지 마시오 (오직 개발자용)",
+ "help_stay_open": "첫 다운로드 후 계속 공유하시오",
+ "help_autostop_timer": "정해진 초단위의 시간이 지난후 공유하는 것을 멈추시오",
+ "help_stealth": "고객 허가를 사용 (고급 수준의)",
+ "help_receive": "그것들을 보내는것 대신 공유를 받으시오",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "취소 된",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "보기",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "모두 삭제",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/lg.json b/desktop/share/locale/lg.json
new file mode 100644
index 00000000..96b5a0d1
--- /dev/null
+++ b/desktop/share/locale/lg.json
@@ -0,0 +1,185 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/lt.json b/desktop/share/locale/lt.json
new file mode 100644
index 00000000..c1493f77
--- /dev/null
+++ b/desktop/share/locale/lt.json
@@ -0,0 +1,208 @@
+{
+ "preparing_files": "Glaudinami failai.",
+ "not_a_readable_file": "{0:s} nėra perskaitomas failas.",
+ "no_available_port": "",
+ "other_page_loaded": "Adresas įkeltas",
+ "incorrect_password": "Neteisingas slaptažodis",
+ "close_on_autostop_timer": "",
+ "closing_automatically": "Sustabdyta, nes perdavimas yra užbaigtas",
+ "large_filesize": "Įspėjimas: Didelio viešinio siuntimas gali užtrukti ilgą laiką (kelias valandas)",
+ "gui_drag_and_drop": "Norėdami bendrinti,\ntempkite čia failus ir aplankus",
+ "gui_add": "Pridėti",
+ "gui_add_files": "Pridėti failus",
+ "gui_add_folder": "Pridėti aplanką",
+ "gui_delete": "Ištrinti",
+ "gui_choose_items": "Pasirinkti",
+ "gui_share_start_server": "Pradėti bendrinti",
+ "gui_share_stop_server": "Nustoti bendrinti",
+ "gui_share_stop_server_autostop_timer": "Nustoti bendrinti ({})",
+ "gui_stop_server_autostop_timer_tooltip": "",
+ "gui_start_server_autostart_timer_tooltip": "",
+ "gui_receive_start_server": "Įjungti gavimo veikseną",
+ "gui_receive_stop_server": "Išjungti gavimo veikseną",
+ "gui_receive_stop_server_autostop_timer": "Išjungti gavimo veikseną (Liko {})",
+ "gui_copy_url": "Kopijuoti adresą",
+ "gui_copy_hidservauth": "",
+ "gui_canceled": "Atsisakyta",
+ "gui_copied_url_title": "OnionShare adresas nukopijuotas",
+ "gui_copied_url": "OnionShare adresas nukopijuotas į iškarpinę",
+ "gui_copied_hidservauth_title": "",
+ "gui_copied_hidservauth": "",
+ "gui_waiting_to_start": "",
+ "gui_please_wait": "Pradedama… Spustelėkite norėdami atsisakyti.",
+ "error_rate_limit": "",
+ "zip_progress_bar_format": "Glaudinama: %p%",
+ "error_stealth_not_supported": "",
+ "error_ephemeral_not_supported": "",
+ "gui_settings_window_title": "Nustatymai",
+ "gui_settings_whats_this": "<a href='{0:s}'>Kas tai?</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_timestamp_never": "Niekada",
+ "gui_settings_autoupdate_check_button": "",
+ "gui_settings_general_label": "Bendri nustatymai",
+ "gui_settings_onion_label": "",
+ "gui_settings_sharing_label": "",
+ "gui_settings_close_after_first_download_option": "",
+ "gui_settings_csp_header_disabled_option": "",
+ "gui_settings_individual_downloads_label": "",
+ "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": "Įrašyti",
+ "gui_settings_button_cancel": "Atsisakyti",
+ "gui_settings_button_help": "Žinynas",
+ "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_invalid_latest_version": "",
+ "update_error_check_error": "",
+ "update_not_available": "",
+ "gui_tor_connection_ask": "",
+ "gui_tor_connection_ask_open_settings": "Taip",
+ "gui_tor_connection_ask_quit": "Išeiti",
+ "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_website_url_description": "",
+ "gui_receive_url_description": "",
+ "gui_url_label_persistent": "",
+ "gui_url_label_stay_open": "",
+ "gui_url_label_onetime": "",
+ "gui_url_label_onetime_and_persistent": "",
+ "gui_status_indicator_share_stopped": "",
+ "gui_status_indicator_share_working": "",
+ "gui_status_indicator_share_scheduled": "",
+ "gui_status_indicator_share_started": "",
+ "gui_status_indicator_receive_stopped": "",
+ "gui_status_indicator_receive_working": "",
+ "gui_status_indicator_receive_scheduled": "",
+ "gui_status_indicator_receive_started": "",
+ "gui_file_info": "",
+ "gui_file_info_single": "",
+ "history_in_progress_tooltip": "",
+ "history_completed_tooltip": "",
+ "history_requests_tooltip": "",
+ "error_cannot_create_data_dir": "",
+ "gui_receive_mode_warning": "",
+ "gui_mode_share_button": "",
+ "gui_mode_receive_button": "",
+ "gui_mode_website_button": "",
+ "gui_settings_receiving_label": "",
+ "gui_settings_website_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_website_mode_no_files": "",
+ "gui_receive_mode_no_files": "",
+ "gui_receive_mode_autostop_timer_waiting": "",
+ "days_first_letter": "",
+ "hours_first_letter": "",
+ "minutes_first_letter": "",
+ "seconds_first_letter": "",
+ "gui_new_tab": "",
+ "gui_new_tab_tooltip": "",
+ "gui_new_tab_share_button": "",
+ "gui_new_tab_share_description": "",
+ "gui_new_tab_receive_button": "",
+ "gui_new_tab_receive_description": "",
+ "gui_new_tab_website_button": "",
+ "gui_new_tab_website_description": "",
+ "gui_close_tab_warning_title": "",
+ "gui_close_tab_warning_persistent_description": "",
+ "gui_close_tab_warning_share_description": "",
+ "gui_close_tab_warning_receive_description": "",
+ "gui_close_tab_warning_website_description": "",
+ "gui_close_tab_warning_close": "",
+ "gui_close_tab_warning_cancel": "",
+ "gui_quit_warning_title": "",
+ "gui_quit_warning_description": "",
+ "gui_quit_warning_quit": "",
+ "gui_quit_warning_cancel": "",
+ "mode_settings_advanced_toggle_show": "",
+ "mode_settings_advanced_toggle_hide": "",
+ "mode_settings_persistent_checkbox": "",
+ "mode_settings_public_checkbox": "",
+ "mode_settings_autostart_timer_checkbox": "",
+ "mode_settings_autostop_timer_checkbox": "",
+ "mode_settings_legacy_checkbox": "",
+ "mode_settings_client_auth_checkbox": "",
+ "mode_settings_share_autostop_sharing_checkbox": "",
+ "mode_settings_receive_data_dir_label": "",
+ "mode_settings_receive_data_dir_browse_button": "",
+ "mode_settings_website_disable_csp_checkbox": ""
+}
diff --git a/desktop/share/locale/mk.json b/desktop/share/locale/mk.json
new file mode 100644
index 00000000..b389c2a0
--- /dev/null
+++ b/desktop/share/locale/mk.json
@@ -0,0 +1,185 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "Излези",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "Преглед",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/ms.json b/desktop/share/locale/ms.json
new file mode 100644
index 00000000..8fda843a
--- /dev/null
+++ b/desktop/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": "Tambah",
+ "gui_add_files": "",
+ "gui_add_folder": "",
+ "gui_delete": "Padam",
+ "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": "Keluar",
+ "gui_quit_warning_dont_quit": "Batal",
+ "error_rate_limit": "",
+ "zip_progress_bar_format": "",
+ "error_stealth_not_supported": "",
+ "error_ephemeral_not_supported": "",
+ "gui_settings_window_title": "Tetapan",
+ "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": "Tidak pernah",
+ "gui_settings_autoupdate_check_button": "",
+ "gui_settings_general_label": "Tetapan umum",
+ "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": "Kara laluan",
+ "gui_settings_password_label": "Kara laluan",
+ "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": "Simpan",
+ "gui_settings_button_cancel": "Batal",
+ "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": "Ya",
+ "gui_tor_connection_ask_quit": "Keluar",
+ "gui_tor_connection_error_settings": "",
+ "gui_tor_connection_canceled": "",
+ "gui_tor_connection_lost": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
+ "share_via_onionshare": "",
+ "gui_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": "Penerimaan",
+ "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": "Lungsur",
+ "gui_settings_public_mode_checkbox": "",
+ "gui_open_folder_error_nautilus": "",
+ "gui_settings_language_label": "",
+ "gui_settings_language_changed_notice": "",
+ "systray_menu_exit": "Keluar",
+ "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": "Sejarah",
+ "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/desktop/share/locale/nb_NO.json b/desktop/share/locale/nb_NO.json
new file mode 100644
index 00000000..51a2ee76
--- /dev/null
+++ b/desktop/share/locale/nb_NO.json
@@ -0,0 +1,295 @@
+{
+ "give_this_url": "Gi denne adressen til mottakeren:",
+ "ctrlc_to_stop": "Trykk Ctrl+C for å stoppe tjeneren",
+ "not_a_file": "{0:s} er ikke en fil.",
+ "gui_copied_url": "OnionShare-adresse kopiert til utklippstavle",
+ "other_page_loaded": "Adresse innlastet",
+ "config_onion_service": "Setter opp løk-tjeneste på port {0:d}.",
+ "preparing_files": "Pakker filer.",
+ "give_this_url_stealth": "Gi denne adressen og HidServAuth-linjen til mottakeren:",
+ "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ø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 flere timer",
+ "systray_menu_exit": "Avslutt",
+ "systray_download_started_title": "OnionShare-nedlasting startet",
+ "systray_download_started_message": "En bruker startet nedlasting av filene dine",
+ "systray_download_completed_title": "OnionShare-nedlasting fullført",
+ "systray_download_completed_message": "Brukeren fullførte nedlasting av filene dine",
+ "systray_download_canceled_title": "OnionShare-nedlasting avbrutt",
+ "systray_download_canceled_message": "Brukeren avbrøt nedlastingen",
+ "systray_upload_started_title": "OnionShare-opplasting startet",
+ "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_autostop_timer": "Stopp deling etter et gitt antall sekunder",
+ "help_stealth": "Bruk klientidentifisering (avansert)",
+ "help_receive": "Motta delinger istedenfor å sende dem",
+ "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 for å starte deling",
+ "gui_add": "Legg til",
+ "gui_delete": "Slett",
+ "gui_choose_items": "Velg",
+ "gui_share_start_server": "Start deling",
+ "gui_share_stop_server": "Stopp deling",
+ "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_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",
+ "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.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (regner ut)",
+ "gui_download_upload_progress_eta": "{0:s}, anslått ferdigstilt: {1:s}, %p%",
+ "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 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 å gjette passordet ditt for mange ganger, så 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-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å 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": "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 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",
+ "gui_settings_control_port_label": "Kontrollport",
+ "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 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_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",
+ "gui_settings_tor_bridges_custom_label": "Du kan hente broer fra <a href=\"https://bridges.torproject.org/options?lang=nb\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Ingen av broene du la til virker.\nDobbeltsjekk dem eller legg til andre.",
+ "gui_settings_button_save": "Lagre",
+ "gui_settings_button_cancel": "Avbryt",
+ "gui_settings_button_help": "Hjelp",
+ "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 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": "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": "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ø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-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 ny versjon: Kanskje du ikke er tilknyttet Tor, eller OnionShare-nettsiden er nede?",
+ "update_error_invalid_latest_version": "Kunne ikke sjekke etter ny versjon: OnionShare-nettsiden melder at siste versjon er det ugjenkjennelige «{}»…",
+ "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_autostop_timer": "Tidsavbruddsuret gikk ut før tjeneren startet. Lag en ny deling.",
+ "gui_server_autostop_timer_expired": "Tidsavbruddsuret har gått ut allerede. Juster det for å starte deling.",
+ "share_via_onionshare": "Del via OnionShare",
+ "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-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.",
+ "gui_url_label_onetime_and_persistent": "Delingen vil ikke stoppe automatisk.<br><br>Hver påfølgende deling vil gjenbruke adressen. (For å bruke engangsadresser, skru av \"Bruk vedvarende adresse\" i innstillingene.)",
+ "gui_status_indicator_share_stopped": "Klar til å dele",
+ "gui_status_indicator_share_working": "Starter…",
+ "gui_status_indicator_share_started": "Deler",
+ "gui_status_indicator_receive_stopped": "Klar til mottak",
+ "gui_status_indicator_receive_working": "Starter…",
+ "gui_status_indicator_receive_started": "Mottar",
+ "gui_file_info": "{} filer, {}",
+ "gui_file_info_single": "{} fil, {}",
+ "info_in_progress_downloads_tooltip": "{} nedlasting(er) underveis",
+ "info_completed_downloads_tooltip": "{} nedlasting(er) fullført",
+ "info_in_progress_uploads_tooltip": "{} opplasting(er) underveis",
+ "info_completed_uploads_tooltip": "{} nedlasting(er) fullført",
+ "error_cannot_create_downloads_dir": "Kunne ikke opprette mottaksmodusmappe: {}",
+ "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. Å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",
+ "gui_mode_receive_button": "Motta filer",
+ "gui_settings_receiving_label": "Mottaksinnstillinger",
+ "gui_settings_downloads_label": "Lagre filer i",
+ "gui_settings_downloads_button": "Utforstk",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "Mottaksmodus kan stoppes av avsenderen",
+ "gui_settings_public_mode_checkbox": "Offentlig modus",
+ "systray_close_server_title": "OnionShare-tjener lukket",
+ "systray_close_server_message": "En bruker stengte tjeneren",
+ "systray_page_loaded_title": "Side innlastet",
+ "systray_download_page_loaded_message": "En bruker lastet inn nedlastingssiden",
+ "systray_upload_page_loaded_message": "En bruker lastet inn opplastingssiden",
+ "gui_uploads": "Opplastingshistorikk",
+ "gui_no_uploads": "Ingen opplastinger enda.",
+ "gui_clear_history": "Tøm alt",
+ "gui_upload_in_progress": "Opplasting startet {}",
+ "gui_upload_finished_range": "Lastet opp {} til {}",
+ "gui_upload_finished": "Lastet opp {}",
+ "gui_open_folder_error_nautilus": "Kan ikke åpne mappe fordi nautilus ikke er tilgjengelig. Filen er her: {}",
+ "history_in_progress_tooltip": "{} underveis",
+ "history_completed_tooltip": "{} fullført",
+ "gui_download_in_progress": "Nedlasting startet {}",
+ "gui_settings_language_label": "Foretrukket språk",
+ "gui_settings_language_changed_notice": "Start OnionShare på ny for å se nytt språkvalg.",
+ "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 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 lastet",
+ "systray_share_started_title": "Deling startet",
+ "systray_share_started_message": "Begynner å sende filer til noen",
+ "systray_share_completed_title": "Deling fullført",
+ "systray_share_completed_message": "Forsendelse av filer utført",
+ "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 deg filer",
+ "gui_all_modes_history": "Historikk",
+ "gui_all_modes_clear_history": "Tøm alt",
+ "gui_all_modes_transfer_started": "Startet {}",
+ "gui_all_modes_transfer_finished_range": "Overført {} - {}",
+ "gui_all_modes_transfer_finished": "Overført {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} forløpt.",
+ "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_autostop_timer_waiting": "Venter på fullføring av forsendelse",
+ "gui_receive_mode_no_files": "Ingen filer mottatt enda",
+ "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_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. Juster det for å starte deling.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Automatisk tidsavbruddsur kan ikke være likt eller predatere auomatisk starttid. Juster 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",
+ "gui_website_url_description": "<b>Hvem som helst</b> med denne OnionShare-adressen kan <b>besøke</b> din nettside ved bruk av <b>Tor-nettleseren</b>: <img src='{}' />",
+ "gui_mode_website_button": "Publiser nettside",
+ "systray_site_loaded_title": "Nettside innlastet",
+ "systray_site_loaded_message": "OnionShare-nettside innlastet",
+ "systray_website_started_title": "Starter deling av nettside",
+ "systray_website_started_message": "Noen besøker din nettside",
+ "gui_website_mode_no_files": "Ingen nettside delt enda",
+ "invalid_password_guess": "Feil passord",
+ "incorrect_password": "Feil passord",
+ "gui_settings_individual_downloads_label": "Forby nedlasting av enkeltfiler",
+ "history_requests_tooltip": "{} vevforespørsler",
+ "systray_individual_file_downloaded_title": "Enkeltfil innlastet",
+ "systray_individual_file_downloaded_message": "Enkeltfil {} sett",
+ "mode_settings_advanced_toggle_hide": "Skjul avanserte innstillinger",
+ "mode_settings_advanced_toggle_show": "Vis avanserte innstillinger",
+ "gui_quit_warning_cancel": "Avbryt",
+ "gui_quit_warning_title": "Er du sikker?",
+ "gui_close_tab_warning_cancel": "Avbryt",
+ "gui_close_tab_warning_close": "Lukk",
+ "gui_close_tab_warning_title": "Er du sikker?",
+ "gui_new_tab_website_button": "Offentliggjør nettside",
+ "gui_new_tab_share_button": "Del filer",
+ "gui_new_tab_tooltip": "Åpne en ny fane",
+ "gui_new_tab": "Ny fane",
+ "gui_settings_website_label": "Nettsideinnstillinger",
+ "mode_settings_receive_data_dir_browse_button": "Utforsk",
+ "mode_settings_receive_data_dir_label": "Lagre filer i",
+ "gui_new_tab_receive_button": "Motta filer",
+ "mode_settings_autostop_timer_checkbox": "Stopp løktjeneste ved planlagt tidspunkt",
+ "mode_settings_autostart_timer_checkbox": "Start løktjeneste ved planlagt tidspunkt",
+ "mode_settings_public_checkbox": "Ikke bruk passord",
+ "gui_close_tab_warning_receive_description": "Du mottar filer. Er du sikker på at du vil lukke denne fanen?",
+ "gui_close_tab_warning_share_description": "Du sender filer. Er du sikker på at du vil lukke denne fanen?",
+ "gui_chat_stop_server": "Stopp sludringstjener",
+ "gui_chat_start_server": "Start sludringstjener",
+ "gui_chat_stop_server_autostop_timer": "Stopp sludringstjener ({})",
+ "gui_file_selection_remove_all": "Fjern alle",
+ "gui_remove": "Fjern",
+ "gui_quit_warning_description": "Deling er aktiv i noen av fanene dine. Hvis du avslutter, vil alle fanene dine lukkes. Er du sikker på at du vil avslutte?",
+ "gui_close_tab_warning_website_description": "Du deler en nettside akkurat nå. Er du sikker på at du vil lukke denne fanen?",
+ "gui_settings_csp_header_disabled_option": "Ikke send hode for innholdssikkerhetspraksis",
+ "mode_settings_website_disable_csp_checkbox": "Ikke send hode for innholdssikkerhetspraksis (tillater nettsiden din å bruke tredjepartsressurser)",
+ "mode_settings_legacy_checkbox": "Bruk en gammeldags adresse (v2-løktjeneste, anbefales ikke)",
+ "mode_settings_persistent_checkbox": "Del denne fanen og åpne den automatisk sammen med OnionShare",
+ "gui_open_folder_error": "Klarte ikke å åpne mappe med xdg-open. Filen er her: {}",
+ "gui_receive_flatpak_data_dir": "Fordi du har installert OnionShare som Flatpak må du lagre filer til en mappe i ~/OnionShare.",
+ "mode_settings_share_autostop_sharing_checkbox": "Stopp deling etter at filer er sendt (fravelg for å tillate nedlasting av individuelle filer)",
+ "mode_settings_client_auth_checkbox": "Bruk klient-identitetsgodkjennelse",
+ "gui_close_tab_warning_persistent_description": "Denne fanen er vedvarende. Hvis du lukker den vil du miste løk-adressen den bruker. Er du sikker på at du vil lukke den?",
+ "gui_tab_name_chat": "Sludring",
+ "gui_tab_name_website": "Nettside",
+ "gui_tab_name_receive": "Motta",
+ "gui_tab_name_share": "Del",
+ "gui_new_tab_chat_button": "Sludre anonymt",
+ "gui_qr_code_description": "Skann denne QR-koden med en QR-kodeleser (f.eks. kameraprogrammet på enheten din) for enklere deling av OnionShare-adressen med noen.",
+ "gui_qr_code_dialog_title": "OnionShare-QR-kode",
+ "gui_show_url_qr_code": "Vis QR-kode",
+ "gui_main_page_chat_button": "Start sludring",
+ "gui_main_page_website_button": "Start vertsjening",
+ "gui_main_page_receive_button": "Start mottak",
+ "gui_main_page_share_button": "Start deling"
+}
diff --git a/desktop/share/locale/nl.json b/desktop/share/locale/nl.json
new file mode 100644
index 00000000..352e282f
--- /dev/null
+++ b/desktop/share/locale/nl.json
@@ -0,0 +1,259 @@
+{
+ "config_onion_service": "Onion-dienst configureren op poort {0:d}.",
+ "preparing_files": "Bezig met comprimeren van bestanden.",
+ "give_this_url": "Geef dit adres aan de ontvanger:",
+ "give_this_url_stealth": "Geef dit adres en de HidServAuth-regel aan de ontvanger:",
+ "ctrlc_to_stop": "Druk op Ctrl+C om de server te stoppen",
+ "not_a_file": "{0:s} is geen geldig bestand.",
+ "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_autostop_timer": "Gestopt omdat de automatische stop-timer afgelopen was",
+ "closing_automatically": "Gestopt omdat de overdracht klaar is",
+ "timeout_download_still_running": "Bezig met wachten op afronden van download",
+ "large_filesize": "Waarschuwing: het versturen van grote bestanden kan uren duren",
+ "systray_menu_exit": "Afsluiten",
+ "systray_download_started_title": "OnionShare-download gestart",
+ "systray_download_started_message": "Een gebruiker is begonnen met downloaden van je bestanden",
+ "systray_download_completed_title": "OnionShare-download afgerond",
+ "systray_download_completed_message": "De gebruiker is klaar met downloaden",
+ "systray_download_canceled_title": "OnionShare-download afgebroken",
+ "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_autostop_timer": "Stoppen met delen na het opgegeven aantal seconden",
+ "help_stealth": "Client-authorisatie gebruiken (geavanceerd)",
+ "help_verbose": "Log OnionShare fouten naar stdout, en web fouten naar disk",
+ "help_filename": "Lijst van bestanden of mappen om te delen",
+ "help_config": "Instelbaar pad naar JSON configuratie bestand (optioneel)",
+ "gui_drag_and_drop": "Sleep en zet\nbestanden hier neer om het delen te starten",
+ "gui_add": "Toevoegen",
+ "gui_delete": "Verwijder",
+ "gui_choose_items": "Kies",
+ "gui_copy_url": "Kopieer URL",
+ "gui_copy_hidservauth": "Kopieer HidServAuth",
+ "gui_downloads": "Download Geschiedenis",
+ "gui_canceled": "Afgebroken",
+ "gui_copied_url": "OnionShare adres gekopieerd naar klembord",
+ "gui_copied_hidservauth": "HidServAuth regel gekopieerd naar klembord",
+ "gui_please_wait": "Aan het starten... Klik om te annuleren.",
+ "gui_download_upload_progress_complete": "%p%, {0:s} verstreken.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (berekenen)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_share_quit_warning": "Je bent in het proces van bestanden versturen. Weet je zeker dat je OnionShare af wilt sluiten?",
+ "gui_quit_warning_quit": "Afsluiten",
+ "gui_quit_warning_dont_quit": "Annuleren",
+ "error_rate_limit": "Iemand heeft teveel incorrecte pogingen gedaan om je wachwoord te raden. Daarom heeft OnionShare de server gestopt. Herstart het delen en stuur de ontvanger een nieuw adres.",
+ "zip_progress_bar_format": "Comprimeren: %p%",
+ "error_stealth_not_supported": "Om client authorization te gebruiken heb je op zijn minst zowel Tor 0.2.9.1-alpha (of Tor Browser 6.5) en python3-stem 1.5.0 nodig.",
+ "error_ephemeral_not_supported": "OnionShare vereist minstens zowel Tor 0.2.7.1 als python3-stem 1.4.0.",
+ "gui_settings_window_title": "Instellingen",
+ "gui_settings_stealth_option": "Gebruik cliëntautorisatie",
+ "gui_settings_autoupdate_label": "Controleer op nieuwe versies",
+ "gui_settings_autoupdate_option": "Laat me weten als er een nieuwe versie beschikbaar is",
+ "gui_settings_autoupdate_timestamp": "Laatste controle: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nooit",
+ "gui_settings_autoupdate_check_button": "Controleer op een Nieuwe Versie",
+ "gui_settings_sharing_label": "Instelling voor delen",
+ "gui_settings_close_after_first_download_option": "Stop met delen, nadat de bestanden verstuurd zijn",
+ "gui_settings_connection_type_label": "Hoe moet OnionShare verbinden met Tor?",
+ "gui_settings_connection_type_bundled_option": "Gebruik de Tor versie die is ingebouwd in OnionShare",
+ "gui_settings_connection_type_automatic_option": "Probeer auto-configuratie met Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Verbinden via controle poort",
+ "gui_settings_connection_type_socket_file_option": "Verbinden via socket bestand",
+ "gui_settings_connection_type_test_button": "Test Connectie naar Tor",
+ "gui_settings_control_port_label": "Controle poort",
+ "gui_settings_socket_file_label": "Socket bestand",
+ "gui_settings_socks_label": "SOCKS poort",
+ "gui_settings_authenticate_label": "Tor authenticatie instellingen",
+ "gui_settings_authenticate_no_auth_option": "Geen authenticatie, of cookie authenticatie",
+ "gui_settings_authenticate_password_option": "Wachtwoord",
+ "gui_settings_password_label": "Wachtwoord",
+ "gui_settings_button_save": "Opslaan",
+ "gui_settings_button_cancel": "Annuleren",
+ "gui_settings_button_help": "Help",
+ "gui_settings_autostop_timer": "Stop het delen om:",
+ "settings_saved": "Instellingen opgeslagen in {}",
+ "settings_error_unknown": "Kan geen verbinding maken met de Tor controller omdat je instellingen nergens op slaan.",
+ "settings_error_automatic": "Kon geen verbinding maken met de Tor controller. Draait Tor Browser (beschikbaar via torproject.org) in de achtergrond?",
+ "settings_error_socket_port": "Kan geen verbinding maken met de Tor controller op {}:{}.",
+ "settings_error_socket_file": "Kan geen verbinding maken met de Tor controller via socket bestand {}.",
+ "settings_error_auth": "Verbonden met {}:{}, maar kan niet authenticeren. Misschien is het geen Tor controller?",
+ "settings_error_missing_password": "Verbonden met Tor controller, maar het heeft een wachtwoord nodig voor authenticatie.",
+ "settings_error_unreadable_cookie_file": "Verbonden met de Tor controller, maar het wachtwoord kan onjuist zijn, of je gebruiker heeft geen toestemming om het cookie bestand te lezen.",
+ "settings_error_bundled_tor_not_supported": "De Tor versie die is meegeleverd bij OnionShare werkt niet in de ontwikkelaarsmodus op Windows of macOS.",
+ "settings_error_bundled_tor_timeout": "Verbinden met Tor duurt te lang. Misschien is je computer niet verbonden met internet, of je hebt een inaccurate systeemklok?",
+ "settings_error_bundled_tor_broken": "OnionShare kan geen verbinding maken met Tor:\n{}",
+ "settings_test_success": "Verbonden met de Tor controller.\n\nTor versie: {}\nOndersteunt ephemeral onion services: {}.\nOndersteunt client authentication: {}.\nOndersteunt next-gen .onion addresses: {}.",
+ "error_tor_protocol_error": "Er was een fout met Tor: {}",
+ "connecting_to_tor": "Verbinden met het Tor netwerk",
+ "update_available": "Nieuwe OnionShare is uitgekomen. <a href='{}'>Klik hier</a> om hem te krijgen.<br><br>Jij gebruikt {} and de laatste is {}.",
+ "update_error_check_error": "Kon niet controleren op een nieuwe versie: de OnionShare website meldt dat de laatste versie de onherkenbare is '{}' is…",
+ "update_error_invalid_latest_version": "Kon niet controleren op een nieuwe versie: Wellicht ben je niet met Tor verbonden, of de OnionShare website is niet beschikbaar?",
+ "update_not_available": "Je draait de laatst beschikbare OnionShare.",
+ "gui_tor_connection_ask": "Open de instellingen om het verbindingsprobleem met Tor op te lossen?",
+ "gui_tor_connection_ask_open_settings": "Ja",
+ "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\nZorg dat je met het internet verbonden bent, herstart OnionShare en configureer de verbinding met Tor.",
+ "gui_server_started_after_autostop_timer": "De auto-stop timer verliep, voordat de server startte. Maak een nieuwe share aan.",
+ "gui_server_autostop_timer_expired": "De auto-stop timer is al verlopen. Stel 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:",
+ "systray_upload_started_title": "OnionShare-upload gestart",
+ "systray_upload_started_message": "Een gebruiker is begonnen met uploaden van bestanden naar je computer",
+ "help_receive": "Bestanden ontvangen in plaats van ze versturen",
+ "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_autostop_timer": "Stop met Delen ({})",
+ "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_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",
+ "gui_quit_title": "Niet zo snel",
+ "gui_receive_quit_warning": "Je bent in het proces van bestanden ontvangen. Weet je zeker dat je OnionShare af wilt sluiten?",
+ "gui_settings_whats_this": "<a href='{0:s}'>1Wat is dit?</a>2",
+ "gui_settings_stealth_hidservauth_string": "Je privésleutel is voor hergebruik opgeslagen. Je kunt nu klikken om je HidServAuth te kopiëren.",
+ "gui_settings_general_label": "Algemene instellingen",
+ "gui_settings_tor_bridges": "Tor bridge ondersteuning",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Gebruik geen bridges",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Gebruik ingebouwde obfs4 pluggable transports",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Gebruik ingebouwde pluggable transports (vereist obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Gebruik ingebouwde meek_lite (Azure) pluggable transports",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Gebruik ingebouwde meek_lite (Azure) pluggable transports (vereist obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Waarschuwing: De meek_lite bridges zijn erg kostbaar voor het Tor Project om uit te voeren. <br><br> Gebruik ze alleen als je niet direct met Tor kan verbinden, via obfs4 transports, of andere normale bridges.",
+ "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?lang=nl\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Geen van de bridges die je hebt toegevoegd werken. \nControleer ze of voeg andere toe.",
+ "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.",
+ "gui_use_legacy_v2_onions_checkbox": "Gebruik ouderwetse adressen",
+ "gui_save_private_key_checkbox": "Gebruik een vast adres",
+ "gui_share_url_description": "<b>1Iedereen</b>2 met dit OnionShare-adres kan je bestanden <b>3binnenhalen</b>4 met de <b>5Tor Browser</b>6: <img src='{}' />",
+ "gui_receive_url_description": "<b>1Iedereen</b>2 met dit OnionShare adres kan bestanden op je computer <b>3plaatsen</b>4 met de <b>5Tor Browser</b>6: <img src='{}' />7",
+ "gui_url_label_persistent": "Deze share stopt niet vanzelf. <br><br>Elke volgende share zal het adres hergebruiken. (Om eenmalige adressen te gebruiken, zet \"Gebruik vast adres\" uit in de settings.)",
+ "gui_url_label_stay_open": "Deze share stopt niet automatisch.",
+ "gui_url_label_onetime": "Deze share stopt na de eerste voltooiïng.",
+ "gui_url_label_onetime_and_persistent": "Deze share stopt niet vanzelf. <br><br>Elke volgende share zal het adres hergebruiken. (Om eenmalige adressen te gebruiken, zet \"Gebruik vast adres\" uit in de settings.)",
+ "gui_status_indicator_share_stopped": "Klaar om te delen",
+ "gui_status_indicator_share_working": "Starten…",
+ "gui_status_indicator_share_started": "Aan het delen",
+ "gui_status_indicator_receive_stopped": "Klaar om te ontvangen",
+ "gui_status_indicator_receive_working": "Starten…",
+ "gui_status_indicator_receive_started": "Ontvangen",
+ "gui_file_info": "{} bestanden, {}",
+ "gui_file_info_single": "{} bestand, {}",
+ "history_in_progress_tooltip": "{} bezig",
+ "history_completed_tooltip": "{} klaar",
+ "info_in_progress_uploads_tooltip": "{} upload(s) zijn bezig",
+ "info_completed_uploads_tooltip": "de {} upload(s) zijn klaar",
+ "error_cannot_create_downloads_dir": "Kon de ontvangst modus map niet aanmaken: {}",
+ "receive_mode_downloads_dir": "De naar je verstuurde bestanden verschijnen in deze map: {}",
+ "receive_mode_warning": "Waarschuwing: Ontvangst mode laat het toe dat mensen bestanden op je computer zetten. Sommige bestanden kunnen mogelijk de controle over je computer overnemen als je ze opent. Open alleen dingen van mensen die je vertrouwd of als je weet wat je aan het doen bent.",
+ "gui_receive_mode_warning": "Ontvangstmodus laat anderen bestanden op je computer zetten. <br><br><b>Sommige van die bestanden kunnen mogelijk je computer overnemen, als je ze opent. Open alleen dingen van mensen die je vertrouwt, of als je heel zeker weet wat je doet.</b>",
+ "receive_mode_upload_starting": "Upload met totale grootte {} is aan het starten",
+ "receive_mode_received_file": "Ontvangen: {}",
+ "gui_mode_share_button": "Deel Bestanden",
+ "gui_mode_receive_button": "Ontvang Bestanden",
+ "gui_settings_receiving_label": "Instellingen voor Ontvangen",
+ "gui_settings_downloads_label": "Sla bestanden op naar",
+ "gui_settings_downloads_button": "Surf",
+ "gui_settings_public_mode_checkbox": "Openbare modus",
+ "systray_close_server_title": "OnionShare Server Afgesloten",
+ "systray_close_server_message": "Een gebruiker heeft de server gestopt",
+ "systray_page_loaded_title": "Pagina Geladen",
+ "systray_download_page_loaded_message": "Een gebruiker heeft de download pagina geladen",
+ "systray_upload_page_loaded_message": "Een gebruiker heeft de upload pagina geladen",
+ "gui_uploads": "Upload Geschiedenis",
+ "gui_no_uploads": "Er Zijn Nog Geen Uploads",
+ "gui_clear_history": "Wis Alles",
+ "gui_upload_in_progress": "Upload Is Gestart{}",
+ "gui_upload_finished_range": "{} is naar {} gestuurd",
+ "gui_upload_finished": "Verzonden {}",
+ "gui_download_in_progress": "Downloaden Gestart {}",
+ "gui_open_folder_error_nautilus": "Kan de map niet openen, omdat nautilus niet beschikbaar is. Het bestand staat hier: {}",
+ "gui_settings_language_label": "Voorkeurstaal",
+ "gui_settings_language_changed_notice": "Herstart OnionShare om de nieuwe taal te gebruiken.",
+ "gui_add_files": "Voeg bestanden toe",
+ "gui_add_folder": "Voeg map toe",
+ "gui_connect_to_tor_for_onion_settings": "Verbind met Tor om de instellingen van onion-diensten te zien",
+ "gui_settings_data_dir_label": "Bewaar bestanden naar",
+ "gui_settings_data_dir_browse_button": "Surf",
+ "systray_page_loaded_message": "OnionShare adres geladen",
+ "systray_share_started_title": "Delen Begonnen",
+ "systray_share_started_message": "Begint bestanden aan iemand te sturen",
+ "systray_share_completed_title": "Delen Afgerond",
+ "systray_share_completed_message": "Klaar met versturen van bestanden",
+ "systray_share_canceled_title": "Delen geannulleerd",
+ "systray_share_canceled_message": "Iemand heeft het ontvangen van je bestanden geannulleerd",
+ "systray_receive_started_title": "Ontvangen Begonnen",
+ "systray_receive_started_message": "Iemand stuurt bestanden naar je",
+ "gui_all_modes_history": "Geschiedenis",
+ "gui_all_modes_clear_history": "Wis Alles",
+ "gui_all_modes_transfer_started": "Begonnen {}",
+ "gui_all_modes_transfer_finished_range": "Overgezet {} - {}",
+ "gui_all_modes_transfer_finished": "Overgezet {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} verlopen.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (aan het berekenen)",
+ "gui_share_mode_no_files": "Nog Geen Bestanden Verzonden",
+ "gui_receive_mode_no_files": "Nog Geen Bestanden Ontvangen",
+ "gui_all_modes_transfer_canceled_range": "Geannuleerd {} - {}",
+ "gui_all_modes_transfer_canceled": "Geannuleerd {}",
+ "gui_settings_onion_label": "Onion instellingen",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop timer stopt om {}",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start timer stopt om {}",
+ "gui_waiting_to_start": "Gepland te beginnen in {}. Klik om af te breken.",
+ "gui_settings_autostart_timer_checkbox": "Gebruik auto-start timer",
+ "gui_settings_autostart_timer": "Begin het delen om:",
+ "gui_server_autostart_timer_expired": "De geplande timer is al verlopen. Stel een nieuwe in om te beginnen met delen.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "De auto-stop tijd mag niet identiek of vroeger zijn dan de auto-start tijd. Stel hem opnieuw in om te beginnen met delen.",
+ "gui_status_indicator_share_scheduled": "Gepland…",
+ "gui_status_indicator_receive_scheduled": "Gepland…",
+ "gui_share_mode_autostop_timer_waiting": "Wachten tot verzenden klaar is",
+ "gui_receive_mode_autostop_timer_waiting": "Wachten tot ontvangen klaar is",
+ "gui_website_url_description": "<b>1Iedereen</b>2 met dit OnionShare-adres kan je bestanden <b>3bezoeken</b>4 met de <b>5Tor Browser</b>6: <img src='{}' />",
+ "gui_mode_website_button": "Zet website online",
+ "systray_site_loaded_title": "Website geladen",
+ "systray_site_loaded_message": "OnionShare website geladen",
+ "systray_website_started_title": "Delen van website begint",
+ "systray_website_started_message": "Iemand bezoekt je website nu",
+ "gui_website_mode_no_files": "Nog Geen Website Gedeeld",
+ "gui_visit_started": "Iemand heeft je website bezocht {}",
+ "incorrect_password": "Foutief wachtwoord",
+ "gui_settings_individual_downloads_label": "Klik uit om het downloaden van individuele bestanden toe te staan",
+ "systray_individual_file_downloaded_title": "Individueel bestand geladen",
+ "systray_individual_file_downloaded_message": "Individueel bestand {} bekeken",
+ "gui_settings_website_label": "Instellingen voor website",
+ "error_cannot_create_data_dir": "Kon geen OnionShare datamap aanmaken: {}",
+ "gui_all_modes_progress_eta": " {0:s}, Verwachte aankomsttijd: {1:s}, %p%",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s",
+ "history_requests_tooltip": "{} webverzoeken",
+ "gui_settings_csp_header_disabled_option": "Schakel Content Security Policy header uit",
+ "mode_settings_share_autostop_sharing_checkbox": "Stop met het delen van bestanden nadat ze verzonden zijn (afvinken om het downloaden van individuele bestanden toe te staan)",
+ "mode_settings_legacy_checkbox": "Gebruik een verouderd adres (v2 onion service, niet aanbevolen)",
+ "mode_settings_public_checkbox": "Geen wachtwoord gebruiken",
+ "mode_settings_advanced_toggle_hide": "Verberg geavanceerde instellingen",
+ "mode_settings_advanced_toggle_show": "Toon geavanceerde instellingen",
+ "gui_quit_warning_cancel": "Annuleren",
+ "gui_quit_warning_title": "Weet je het zeker?",
+ "gui_close_tab_warning_cancel": "Annuleren",
+ "gui_close_tab_warning_close": "Afsluiten",
+ "gui_close_tab_warning_receive_description": "Je bent bezig met bestanden ontvangen. Weet je zeker dat je dit tabblad wilt sluiten?",
+ "gui_close_tab_warning_share_description": "Je bent bezig bestanden te sturen. Weet je zeker dat je dit tabblad wilt sluiten?",
+ "gui_close_tab_warning_title": "Weet je het zeker?",
+ "gui_new_tab_website_description": "Host een statische HTML onion website vanaf je computer.",
+ "gui_new_tab_receive_button": "Bestanden ontvangen",
+ "gui_new_tab_share_description": "Kies bestanden op jouw computer om naar iemand anders te sturen. De persoon of personen waar je de bestanden naar wilt sturen moeten de Tor Browser gebruiken om jouw bestanden te downloaden."
+}
diff --git a/desktop/share/locale/pa.json b/desktop/share/locale/pa.json
new file mode 100644
index 00000000..165e297b
--- /dev/null
+++ b/desktop/share/locale/pa.json
@@ -0,0 +1,185 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "ਬਾਹਰ",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/pl.json b/desktop/share/locale/pl.json
new file mode 100644
index 00000000..cced6241
--- /dev/null
+++ b/desktop/share/locale/pl.json
@@ -0,0 +1,237 @@
+{
+ "config_onion_service": "Konfiguruję usługę onion na porcie {0:d}.",
+ "preparing_files": "Kompresuję pliki.",
+ "give_this_url": "Przekaż ten adres odbiorcy:",
+ "give_this_url_stealth": "Przekaż ten adres i linijkę HidServAuth odbiorcy:",
+ "give_this_url_receive": "Przekaż ten adres do nadawcy:",
+ "give_this_url_receive_stealth": "Przekaż ten adres i linijkę HidServAuth do nadawcy:",
+ "ctrlc_to_stop": "Przyciśnij kombinację klawiszy Ctrl i C aby zatrzymać serwer",
+ "not_a_file": "{0:s} nie jest prawidłowym plikiem.",
+ "not_a_readable_file": "{0:s} nie jest plikiem do odczytu.",
+ "no_available_port": "Nie można znaleźć dostępnego portu aby włączyć usługę onion",
+ "other_page_loaded": "Adres został wczytany",
+ "close_on_autostop_timer": "Zatrzymano, ponieważ czasomierz automatycznego zatrzymania wygasł",
+ "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",
+ "systray_download_started_title": "Pobieranie OnionShare zostało rozpoczęte",
+ "systray_download_started_message": "Użytkownik rozpoczął ściąganie Twoich plików",
+ "systray_download_completed_title": "Pobieranie OnionShare skończone",
+ "systray_download_completed_message": "Użytkownik ukończył ściąganie Twoich plików",
+ "systray_download_canceled_title": "Pobieranie OnionShare zostało anulowane",
+ "systray_download_canceled_message": "Użytkownik anulował pobieranie",
+ "systray_upload_started_title": "Wysyłanie OnionShare rozpoczęte",
+ "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_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_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ć",
+ "gui_add": "Dodaj",
+ "gui_delete": "Usuń",
+ "gui_choose_items": "Wybierz",
+ "gui_share_start_server": "Rozpocznij udostępnianie",
+ "gui_share_stop_server": "Zatrzymaj udostępnianie",
+ "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_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",
+ "gui_no_downloads": "Nie pobrano jeszcze niczego",
+ "gui_canceled": "Anulowano",
+ "gui_copied_url_title": "Skopiowano adres URL OnionShare",
+ "gui_copied_url": "Adres URL OnionShare został skopiowany do schowka",
+ "gui_copied_hidservauth_title": "Skopiowano HidServAuth",
+ "gui_copied_hidservauth": "Linijka HidServAuth została skopiowana do schowka",
+ "gui_please_wait": "Rozpoczynam... Kliknij, aby zatrzymać.",
+ "gui_download_upload_progress_complete": "%p%, {0:s} upłynęło.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (obliczam)",
+ "gui_download_upload_progress_eta": "{0:s}, pozostało: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Nie tak szybko",
+ "gui_share_quit_warning": "Jesteś w trakcie wysyłania plików. Jesteś pewien, że chcesz wyjść z OnionShare?",
+ "gui_receive_quit_warning": "Odbierasz teraz pliki. Jesteś pewien, że chcesz wyjść z OnionShare?",
+ "gui_quit_warning_quit": "Wyjście",
+ "gui_quit_warning_dont_quit": "Anuluj",
+ "error_rate_limit": "Ktoś zbyt często próbował odczytać Twój adres, co może oznaczać, że ktoś próbuje go odgadnąć, zatem OnionShare zatrzymał serwer. Rozpocznij udostępnianie ponownie i wyślij odbiorcy nowy adres aby udostępniać Twoje pliki.",
+ "zip_progress_bar_format": "Kompresuję: %p%",
+ "error_stealth_not_supported": "Aby skorzystać z autoryzacji klienta wymagana jest wersja programu Tor 0.2.9.1-alpha lub nowsza, bądź Tor Browser w wersji 6.5 lub nowszej oraz python3-stem w wersji 1.5 lub nowszej.",
+ "error_ephemeral_not_supported": "OnionShare wymaga programu Tor w wersji 0.2.7.1 lub nowszej oraz python3-stem w wersji 1.4.0 lub nowszej.",
+ "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": "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: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nigdy",
+ "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": "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": "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",
+ "gui_settings_socket_file_label": "Plik socket",
+ "gui_settings_socks_label": "Port SOCKS",
+ "gui_settings_authenticate_label": "Ustawienia autoryzacji sieci Tor",
+ "gui_settings_authenticate_no_auth_option": "Brak autoryzacji lub autoryzacji ciasteczek",
+ "gui_settings_authenticate_password_option": "Hasło",
+ "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": "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?lang=pl\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Żadne z dodanych przez Ciebie mostków nie działają.\nZweryfikuj je lub dodaj inne.",
+ "gui_settings_button_save": "Zapisz",
+ "gui_settings_button_cancel": "Anuluj",
+ "gui_settings_button_help": "Pomoc",
+ "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 {}:{}.",
+ "settings_error_socket_file": "Nie można połączyć się z kontrolerem Tor używając pliku socket znajdującym się w ścieżce {}.",
+ "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": "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: {}.",
+ "error_tor_protocol_error": "Pojawił się błąd z Tor: {}",
+ "error_tor_protocol_error_unknown": "Pojawił się nieznany błąd z Tor",
+ "error_invalid_private_key": "Ten typ klucza prywatnego jest niewspierany",
+ "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 jest dostępna aktualizacja. Strona programu OnionShare mówi, że ostatnia wersja programu jest nierozpoznawalna '{}'…",
+ "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": "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ł. Dostosuj go, aby rozpocząć udostępnianie.",
+ "share_via_onionshare": "Udostępniaj przez OnionShare",
+ "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": "Gotowy do odbioru",
+ "gui_status_indicator_receive_working": "Rozpoczynanie…",
+ "gui_status_indicator_receive_started": "Otrzymuję",
+ "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": "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": "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": "Tryb publiczny",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "Strona załadowana",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "Wyczyść wszystko",
+ "gui_upload_in_progress": "",
+ "gui_upload_finished_range": "",
+ "gui_upload_finished": "",
+ "gui_download_in_progress": "",
+ "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": "Uruchom ponownie OnionShare, aby zastosować nowy język.",
+ "timeout_upload_still_running": "Czekam na ukończenie wysyłania",
+ "gui_add_files": "Dodaj pliki",
+ "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ął. Dostosuj 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. Dostosuj 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",
+ "incorrect_password": "Niepoprawne hasło",
+ "gui_settings_csp_header_disabled_option": "Wyłącz nagłówek Polityki Bezpieczeństwa Treści",
+ "gui_website_mode_no_files": "Jeszcze niczego nie udostępniłeś",
+ "gui_website_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b>odwiedzić</b> twoją stronę używając przeglądarki <b>Tor Browser</b>: <img src='{}' />\n",
+ "gui_settings_website_label": "Ustawienia Strony",
+ "history_requests_tooltip": "{} żądań z sieci",
+ "gui_mode_website_button": "Opublikuj Stronę",
+ "gui_settings_individual_downloads_label": "Odznacz, aby umożliwić pobieranie pojedynczych plików."
+}
diff --git a/desktop/share/locale/pt_BR.json b/desktop/share/locale/pt_BR.json
new file mode 100644
index 00000000..41d8b6ed
--- /dev/null
+++ b/desktop/share/locale/pt_BR.json
@@ -0,0 +1,268 @@
+{
+ "config_onion_service": "Configurando o serviço onion na porta {0:d}.",
+ "preparing_files": "Comprimindo arquivos.",
+ "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": "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 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": "O endereço carregou",
+ "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",
+ "systray_menu_exit": "Sair",
+ "systray_download_started_title": "O download de OnionShare começou",
+ "systray_download_started_message": "Alguém começou fazer o download dos seus arquivos",
+ "systray_download_completed_title": "O download de OnionShare terminou",
+ "systray_download_completed_message": "Essa pessoa terminou de fazer o download dos seus arquivos",
+ "systray_download_canceled_title": "O download de OnionShare foi cancelado",
+ "systray_download_canceled_message": "Essa pessoa cancelou o download",
+ "systray_upload_started_title": "OnionShare começou a carregar",
+ "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_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_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",
+ "gui_add": "Adicionar",
+ "gui_delete": "Apagar",
+ "gui_choose_items": "Escolher",
+ "gui_share_start_server": "Começar a compartilhar",
+ "gui_share_stop_server": "Parar de compartilhar",
+ "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": "Começar o Modo Recepção",
+ "gui_receive_stop_server": "Parar o Modo Recepção",
+ "gui_receive_stop_server_autostop_timer": "Parar o Modo Recepção ({} 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",
+ "gui_no_downloads": "Nenhum download por enquanto",
+ "gui_canceled": "Cancelado",
+ "gui_copied_url_title": "O endereço OnionShare foi copiado",
+ "gui_copied_url": "O endereço OnionShare foi copiado na área de transferência",
+ "gui_copied_hidservauth_title": "O HidServAuth foi copiado",
+ "gui_copied_hidservauth": "A linha HidServAuth foi copiada na área de transferência",
+ "gui_please_wait": "Começando...Clique para cancelar.",
+ "gui_download_upload_progress_complete": "%p%, {0:s} decorridos.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (calculando)",
+ "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_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",
+ "error_rate_limit": "Alguém tentou por várias vezes adivinhar sua senha. Por isso, OnionShare interrompeu o servidor. Comece o compartilhamento novamente e envie um novo endereço ao seu destinatário para compartilhar.",
+ "zip_progress_bar_format": "Comprimindo: %p%",
+ "error_stealth_not_supported": "Para usar uma autorização de cliente, você precisa ao menos de Tor 0.2.9.1-alpha (ou Navegador Tor 6.5) e de python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare requer ao menos Tor 0.2.7.1 e python3-stem 1.4.0.",
+ "gui_settings_window_title": "Configurações",
+ "gui_settings_whats_this": "<a href='{0:s}'>O que é isso?</a>",
+ "gui_settings_stealth_option": "Usar autorização de cliente",
+ "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 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": "Configurações de compartilhamento",
+ "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": "Usar a versão de Tor já instalada no 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 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 ao Tor",
+ "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": "Senha",
+ "gui_settings_password_label": "Senha",
+ "gui_settings_tor_bridges": "Suporte para 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) já instalados",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Usar transportadores plugáveis meek_lite (Azure) já 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 ao 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?lang=pt_BR\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Nenhuma das ponte adicionadas 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_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 foi possível conectar ao controlador do Tor às {}:{}.",
+ "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 senha esteja incorreta ou o seu usuário não possua 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 ao 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 ao Tor:\n{}",
+ "settings_test_success": "Conectado ao controlador Tor.\n\nVersão do Tor: {}\nPossui suporte para serviços onion efêmeros: {}.\nPossui suporte para autenticação de cliente: {}.\nPossui suporte para a 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 possui suporte",
+ "connecting_to_tor": "Conectando à rede Tor",
+ "update_available": "Atualização de OnionShare disponível. <a href='{}'>Clique aqui</a> para obtê-la.<br><br>Você está usando a versão {} e a última é {}.",
+ "update_error_check_error": "Não foi possível verificar a nova versão: talvez você não esteja conectado ao Tor ou o site OnionShare esteja inativo?",
+ "update_error_invalid_latest_version": "Não foi possível verificar a nova versão: o site OnionShare está dizendo que a versão mais recente é a irreconhecível '{}'…",
+ "update_not_available": "Você está rodando a última versão de OnionShare.",
+ "gui_tor_connection_ask": "Abrir as configurações para consertar a conexão ao Tor?",
+ "gui_tor_connection_ask_open_settings": "Sim",
+ "gui_tor_connection_ask_quit": "Sair",
+ "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 ao Tor.\n\nTenha certeza que você está conectado à Internet, então abra OnionShare novamente e configure sua conexão ao Tor.",
+ "gui_tor_connection_lost": "Desconectado do Tor.",
+ "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, ajuste-o para começar a compartilhar.",
+ "share_via_onionshare": "Compartilhar via 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 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",
+ "gui_status_indicator_share_working": "Começando…",
+ "gui_status_indicator_share_started": "Compartilhando",
+ "gui_status_indicator_receive_stopped": "Pronto para receber",
+ "gui_status_indicator_receive_working": "Começando…",
+ "gui_status_indicator_receive_started": "Recebendo",
+ "gui_file_info": "{} arquivos, {}",
+ "gui_file_info_single": "{} arquivo, {}",
+ "history_in_progress_tooltip": "{} em curso",
+ "history_completed_tooltip": "{} completado",
+ "info_in_progress_uploads_tooltip": "{} upload(s) em progresso",
+ "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ê 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 em quem você confia, ou se 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",
+ "gui_mode_receive_button": "Receber Arquivos",
+ "gui_settings_receiving_label": "Configurações de recepção",
+ "gui_settings_downloads_label": "Armazenar arquivos em",
+ "gui_settings_downloads_button": "Navegar",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Modo público",
+ "systray_close_server_title": "Servidor OnionShare encerrado",
+ "systray_close_server_message": "Um usuário encerrou o servidor",
+ "systray_page_loaded_title": "A página carregou",
+ "systray_download_page_loaded_message": "Um usuário carregou a página de download",
+ "systray_upload_page_loaded_message": "Um usuário carregou a página de upload",
+ "gui_uploads": "Histórico de Uploads",
+ "gui_no_uploads": "Nenhum upload realizado",
+ "gui_clear_history": "Limpar Tudo",
+ "gui_upload_in_progress": "Upload Iniciado {}",
+ "gui_upload_finished_range": "Upload de {} feito para {}",
+ "gui_upload_finished": "Upload realizado de {}",
+ "gui_download_in_progress": "Download Iniciado {}",
+ "gui_open_folder_error_nautilus": "Não foi possível abrir a pasta porque o nautilus não está disponível. O arquivo está aqui: {}",
+ "gui_settings_language_label": "Idioma",
+ "gui_settings_language_changed_notice": "Reinicie OnionShare para que o novo idioma seja aplicado.",
+ "timeout_upload_still_running": "Esperando o término do upload",
+ "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",
+ "error_cannot_create_data_dir": "Pasta de dados OnionShare não foi criada: {}",
+ "receive_mode_data_dir": "Os arquivos que lhe foram enviados estão nesta pasta: {}",
+ "gui_settings_data_dir_label": "Salvar arquivos em",
+ "gui_settings_data_dir_browse_button": "Navegar",
+ "systray_share_started_title": "O compartilhamento iniciou",
+ "systray_share_started_message": "Iniciando o envio de arquivos",
+ "systray_share_completed_title": "O compartilhamento completou-se",
+ "systray_share_completed_message": "O envio de arquivos terminou",
+ "systray_share_canceled_title": "O compartilhamento foi anulado",
+ "systray_share_canceled_message": "Alguém cancelou o recebimento dos seus arquivos",
+ "systray_receive_started_title": "O recebimento iniciou",
+ "systray_receive_started_message": "Alguém está lhe enviando arquivos",
+ "gui_all_modes_history": "Histórico",
+ "gui_all_modes_clear_history": "Apagar Tudo",
+ "gui_all_modes_transfer_started": "Iniciou {}",
+ "gui_all_modes_transfer_finished_range": "Transferido {} - {}",
+ "gui_all_modes_transfer_finished": "Transferido {}",
+ "gui_all_modes_transfer_canceled_range": "Cancelado {} - {}",
+ "gui_all_modes_transfer_canceled": "Cancelado {}",
+ "gui_share_mode_autostop_timer_waiting": "Esperando para completar o envio",
+ "gui_receive_mode_no_files": "Nenhum arquivo recebido",
+ "gui_receive_mode_autostop_timer_waiting": "Esperando para completar o recebimento",
+ "gui_settings_onion_label": "Configurações do Onion",
+ "systray_page_loaded_message": "O endereço OnionShare carregou",
+ "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 de interrupção automática encerra às {}",
+ "gui_start_server_autostart_timer_tooltip": "O cronômetro de iniciação automática 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, ajuste-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)",
+ "incorrect_password": "senha incorreta",
+ "gui_settings_individual_downloads_label": "Desmarque para permitir download de arquivos individuais",
+ "gui_settings_csp_header_disabled_option": "Desabilitar cabeçalho Política de Segurança de Conteúdo",
+ "gui_website_url_description": "<b>Qualquer um</b> com este endereço OnionShare pode <b>visitar</b> seu site usando o <b>navegador Tor</b>: <img src='{}' />",
+ "gui_mode_website_button": "Publicar Website",
+ "gui_website_mode_no_files": "Nenhum website compartilhado ainda",
+ "history_requests_tooltip": "{} solicitações da web",
+ "gui_settings_website_label": "Configurações do Website",
+ "mode_settings_website_disable_csp_checkbox": "Desativar cabeçalho da política de segurança de conteúdo (permite que seu site use recursos de terceiros)",
+ "mode_settings_receive_data_dir_browse_button": "Navegar",
+ "mode_settings_receive_data_dir_label": "Salvar arquivos em",
+ "mode_settings_share_autostop_sharing_checkbox": "Interrompa o compartilhamento após o envio dos arquivos (desmarque para permitir o download de arquivos individuais)",
+ "mode_settings_client_auth_checkbox": "Usar autorização de cliente",
+ "mode_settings_legacy_checkbox": "Usar um endereço herdado (serviço de onion v2, não recomendado)",
+ "mode_settings_autostop_timer_checkbox": "Interromper o serviço de onion na hora programada",
+ "mode_settings_autostart_timer_checkbox": "Iniciar serviço de onion na hora programada",
+ "mode_settings_public_checkbox": "Não usar uma senha",
+ "mode_settings_persistent_checkbox": "Salvar essa guia e abra-a automaticamente quando eu abrir o OnionShare",
+ "mode_settings_advanced_toggle_hide": "Ocultar configurações avançadas",
+ "mode_settings_advanced_toggle_show": "Mostrar configurações avançadas",
+ "gui_quit_warning_cancel": "Cancelar",
+ "gui_quit_warning_description": "O compartilhamento está ativo em algumas de suas guias. Se você sair, todas as suas guias serão fechadas. Você tem certeza que quer sair?",
+ "gui_quit_warning_title": "Você tem certeza?",
+ "gui_close_tab_warning_cancel": "Cancelar",
+ "gui_close_tab_warning_close": "Fechar",
+ "gui_close_tab_warning_website_description": "Você está hospedando ativamente um site. Tem certeza de que deseja fechar esta guia?",
+ "gui_close_tab_warning_receive_description": "Você está recebendo arquivos. Tem certeza de que deseja fechar esta guia?",
+ "gui_close_tab_warning_share_description": "Você está enviando arquivos. Tem certeza de que deseja fechar esta guia?",
+ "gui_close_tab_warning_persistent_description": "Essa guia é persistente. Se você fechá-lo, perderá o endereço de onion que está usando. Tem certeza de que deseja fechá-lo?",
+ "gui_close_tab_warning_title": "Você tem certeza?",
+ "gui_new_tab_website_description": "Hospede um site estático de onion HTML a partir do seu computador.",
+ "gui_new_tab_website_button": "Publicar site",
+ "gui_new_tab_receive_description": "Transforme seu computador em uma caixa de depósito online. As pessoas poderão usar o Navegador Tor para enviar arquivos para o seu computador.",
+ "gui_new_tab_receive_button": "Receber arquivos",
+ "gui_new_tab_share_description": "Escolha os arquivos no seu computador para enviar para outra pessoa. A pessoa ou pessoas para quem você deseja enviar os arquivos precisarão usar o Navegador Tor para fazer o download deles.",
+ "gui_new_tab_share_button": "Compartilhar arquivos",
+ "gui_new_tab_tooltip": "Abrir uma nova aba",
+ "gui_new_tab": "Nova aba"
+}
diff --git a/desktop/share/locale/pt_PT.json b/desktop/share/locale/pt_PT.json
new file mode 100644
index 00000000..2bf59741
--- /dev/null
+++ b/desktop/share/locale/pt_PT.json
@@ -0,0 +1,254 @@
+{
+ "config_onion_service": "A configurar o serviço onion na porta {0:d}.",
+ "preparing_files": "A comprimir os 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 expirou",
+ "closing_automatically": "Parado porque a transferência está concluída",
+ "timeout_download_still_running": "",
+ "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": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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 e largar ficheiros e pastas\npara começar a partilhar",
+ "gui_add": "Adicionar",
+ "gui_delete": "Eliminar",
+ "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": "Iniciar 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": "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 iniciar… Clique para cancelar.",
+ "gui_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "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. Tem a certeza que deseja sair do OnionShare?",
+ "gui_receive_quit_warning": "Ainda não recebeu todos os seus ficheiros. Tem a certeza que que deseja sair do OnionShare?",
+ "gui_quit_warning_quit": "Sair",
+ "gui_quit_warning_dont_quit": "Cancelar",
+ "error_rate_limit": "Alguém tentou por várias vezes adivinhar a sua palavra-passe, por isso OnionShare parou o servidor. Inicie novamente a partilha e envie um novo endereço ao destinatário para partilhar.",
+ "zip_progress_bar_format": "A comprimir: %p%",
+ "error_stealth_not_supported": "Para utilizar 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": "Utilizar autorização de cliente",
+ "gui_settings_stealth_hidservauth_string": "Depois de guardar a sua chave privada para reutilização, pode clicar para copiar o seu HidServAuth.",
+ "gui_settings_autoupdate_label": "Procurar por nova versão",
+ "gui_settings_autoupdate_option": "Notificar-me quando estiver disponível uma nova versão",
+ "gui_settings_autoupdate_timestamp": "Última verificação: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nunca",
+ "gui_settings_autoupdate_check_button": "Procurar por Nova Versão",
+ "gui_settings_general_label": "Configurações gerais",
+ "gui_settings_sharing_label": "Configurações de partilha",
+ "gui_settings_close_after_first_download_option": "Parar partilha depois de terminar o envio dos ficheiros",
+ "gui_settings_connection_type_label": "Como é que o OnionShare deve ligar ao Tor?",
+ "gui_settings_connection_type_bundled_option": "Utilizar a versão do Tor integrada no OnionShare",
+ "gui_settings_connection_type_automatic_option": "Tentar configurar automaticamente com o Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Ligar utilizando a porta de controlo",
+ "gui_settings_connection_type_socket_file_option": "Ligar utilizando um ficheiro socket",
+ "gui_settings_connection_type_test_button": "Testar a Ligaçã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": "Definições de autenticação do Tor",
+ "gui_settings_authenticate_no_auth_option": "Sem autenticação, ou autenticação por cookie",
+ "gui_settings_authenticate_password_option": "Palavra-passe",
+ "gui_settings_password_label": "Palavra-passe",
+ "gui_settings_tor_bridges": "Suporte de ponte do Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Não utilizar pontes",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Utilizar transportes ligáveis obfs4 integrados",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Utilizar transportes ligáveis obfs4 integrados (requer obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Utilizar transportes ligáveis meek_lite (Azure) integrados",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Utilizar transportes ligáveis meek_lite (Azure) integrados (requer obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Aviso: as pontes meek_lite são muito dispendiosas para o Projeto Tor.<br><br>Utilize-as apenas se não conseguir ligar diretamente ao Tor, via transportes obfs4, ou outras pontes normais.",
+ "gui_settings_tor_bridges_custom_radio_option": "Utilizar pontes personalizadas",
+ "gui_settings_tor_bridges_custom_label": "Pode obter pontes em <a href=\"https://bridges.torproject.org/options?lang=pt_PT\">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_autostop_timer_checkbox": "Utilizar cronómetro de paragem automática",
+ "gui_settings_autostop_timer": "Parar a partilha em:",
+ "settings_error_unknown": "Não é possível ligar ao controlador Tor porque as suas definições não fazem sentido.",
+ "settings_error_automatic": "Não foi possível ligar ao controlador Tor. O Tor Browser (disponível em torproject.org) está a ser executado em segundo plano?",
+ "settings_error_socket_port": "Não é possível ligar ao controlador Tor em {}:{}.",
+ "settings_error_socket_file": "Não é possível ligar ao controlador Tor utilizando o ficheiro socket {}.",
+ "settings_error_auth": "Ligado a {}:{}, mas não é possível autenticar. Talvez não seja um controlador Tor?",
+ "settings_error_missing_password": "Ligado ao controlador Tor, mas este requer uma palavra-passe para autenticar.",
+ "settings_error_unreadable_cookie_file": "Ligado ao controlador Tor, mas a palavra-passe pode estar incorreta, ou o seu utilizador não tem autorização para ler o ficheiro do cookie.",
+ "settings_error_bundled_tor_not_supported": "Utilizar a versão do Tor que vem com o OnionShare não funciona no modo de 'programação' no Windows ou macOS.",
+ "settings_error_bundled_tor_timeout": "A ligação ao Tor está a demorar muito. Talvez não esteja ligado à Internet, ou o relógio do sistema está incorreto?",
+ "settings_error_bundled_tor_broken": "OnionShare não pôde se conectar ao Tor:\n{}",
+ "settings_test_success": "Ligado ao controlador Tor.\n\nVersão do Tor: {}\nSuporta serviços onion efémeros: {}.\nSuporta autenticação de cliente: {}.\nSuporta próxima geração de endereços .onion: {}.",
+ "error_tor_protocol_error": "Ocorreu um erro com o Tor: {}",
+ "error_tor_protocol_error_unknown": "Ocorreu um erro desconhecido com o Tor",
+ "error_invalid_private_key": "Este tipo de chave privada não é suportada",
+ "connecting_to_tor": "A ligar à rede Tor",
+ "update_available": "Disponível nova versão do OnionShare. <a href='{}'>Clique aqui</a> para obtê-la.<br><br>Está a utilizar a versão {}, e a versão mais recente é a {}.",
+ "update_error_check_error": "Não foi possível procurar por nova versão: Talvez não esteja ligado ao Tor, ou o ''site'' da Web OnionShare está em baixo?",
+ "update_error_invalid_latest_version": "Não foi possível procurar por nova versão: o ''site'' da Web OnionShare está a dizer que a última versão não é reconhecida '{}'…",
+ "update_not_available": "Está a utilizar a versão mais recente do OnionShare.",
+ "gui_tor_connection_ask": "Abrir as definições para corrigir a ligação ao Tor?",
+ "gui_tor_connection_ask_open_settings": "Sim",
+ "gui_tor_connection_ask_quit": "Sair",
+ "gui_tor_connection_error_settings": "Tente alterar nas definições o modo como o OnionShare liga à rede Tor.",
+ "gui_tor_connection_canceled": "Não foi possível ligar à rede Tor.\n\nCertifique-se se está ligado à Internet, depois reabra o OnionShare e configure a sua ligação ao 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 expirou. Por favor, ajuste-o para começar a partilhar.",
+ "share_via_onionshare": "Partilhar via 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": "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 potencialmente tomar o controlo do seu computador se os abrir. Abra apenas ficheiros enviados por pessoas que confia ou se souber o que está a fazer.</b>",
+ "receive_mode_upload_starting": "A iniciar o 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": "Definições de \"receber\"",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "Navegar",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Modo público",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "Página Carregada",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "gui_upload_finished_range": "",
+ "gui_upload_finished": "",
+ "gui_download_in_progress": "",
+ "gui_open_folder_error_nautilus": "Não é 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 o novo idioma seja aplicado.",
+ "gui_add_files": "Adicionar Ficheiros",
+ "gui_add_folder": "Adicionar Pasta",
+ "gui_settings_onion_label": "Definições do 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": "Explorar",
+ "systray_page_loaded_message": "Endereço do OnionShare carregado",
+ "systray_share_started_title": "Partilha Iniciada",
+ "systray_share_started_message": "A iniciar o envio dos ficheiros para alguém",
+ "systray_share_completed_title": "Partilha Concluída",
+ "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 está a enviar-lhe 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 {} - {}",
+ "gui_all_modes_transfer_finished": "Transferido {}",
+ "gui_all_modes_transfer_canceled_range": "Cancelado {} - {}",
+ "gui_all_modes_transfer_canceled": "Cancelado {}",
+ "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 foram enviados ficheiros",
+ "gui_share_mode_timeout_waiting": "A esperar que termine o envio",
+ "gui_receive_mode_no_files": "Ainda não foram recebidos ficheiros",
+ "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, ajuste-o 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 do início automático. Por favor, ajuste-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 aguardar que o envio termine",
+ "gui_receive_mode_autostop_timer_waiting": "A aguardar que o recebimento termine",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s",
+ "incorrect_password": "Palavra-passe incorreta",
+ "gui_settings_individual_downloads_label": "Desmarque para permitir a transferência de ficheiros individuais",
+ "gui_settings_csp_header_disabled_option": "Desativar cabeçalho da Política de Segurança de Conteúdo",
+ "mode_settings_autostop_timer_checkbox": "Parar serviço Onion na hora agendada",
+ "mode_settings_autostart_timer_checkbox": "Iniciar serviço Onion na hora agendada",
+ "mode_settings_public_checkbox": "Não utilizar uma palavra-passe",
+ "mode_settings_advanced_toggle_hide": "Ocultar definições avançadas",
+ "mode_settings_advanced_toggle_show": "Mostrar definições avançadas",
+ "gui_quit_warning_cancel": "Cancelar",
+ "gui_quit_warning_title": "Tem a certeza?",
+ "gui_close_tab_warning_cancel": "Cancelar",
+ "gui_close_tab_warning_close": "Fechar",
+ "gui_close_tab_warning_title": "Tem a certeza?",
+ "gui_new_tab_website_button": "Publicar Site da Web",
+ "gui_new_tab_receive_button": "Receber Ficheiros",
+ "gui_new_tab_share_button": "Partilhar Ficheiros",
+ "gui_new_tab_tooltip": "Abrir um novo separador",
+ "gui_new_tab": "Novo Separador",
+ "gui_website_mode_no_files": "Ainda Sem Site da Web Partilhado",
+ "gui_settings_website_label": "Definições do ''site'' da Web",
+ "gui_mode_website_button": "Publicar Site da Web",
+ "history_requests_tooltip": "{} pedidos da Web",
+ "gui_website_url_description": "<b>Qualquer</b> pessoa com um endereço do OnionShare pode <b>visitar</b> o sue ''site'' da Web utilizando o <b>Tor Browser</b>: <img src='{}' />"
+}
diff --git a/desktop/share/locale/ro.json b/desktop/share/locale/ro.json
new file mode 100644
index 00000000..d4e43f04
--- /dev/null
+++ b/desktop/share/locale/ro.json
@@ -0,0 +1,236 @@
+{
+ "config_onion_service": "",
+ "preparing_files": "Comprimare fișiere.",
+ "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": "Fișierul {0:s} nu poate fi citit.",
+ "no_available_port": "Nu s-a putut găsi un port liber pentru a porni serviciul onion",
+ "other_page_loaded": "Adresă încărcată",
+ "close_on_autostop_timer": "Oprit deoarece s-a oprit cronometrul automat",
+ "closing_automatically": "Oprit pentru că transferul s-a încheiat cu succes",
+ "timeout_download_still_running": "",
+ "large_filesize": "Avertisment: Transferul unui volum mare de date poate dura ore",
+ "systray_menu_exit": "Închidere",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "help_local_only": "",
+ "help_stay_open": "",
+ "help_autostop_timer": "",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "",
+ "help_config": "",
+ "gui_drag_and_drop": "Tragere și plasare fișiere și directoare\npentru a începe partajarea",
+ "gui_add": "Adaugă",
+ "gui_delete": "Şterge",
+ "gui_choose_items": "Alegeți",
+ "gui_share_start_server": "Începe partajarea",
+ "gui_share_stop_server": "Oprește partajarea",
+ "gui_share_stop_server_autostop_timer": "Oprire partajare ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
+ "gui_receive_start_server": "Începeți modul de primire",
+ "gui_receive_stop_server": "Opriți modul de primire",
+ "gui_receive_stop_server_autostop_timer": "Opriți modul de primire (au rămas {})",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "gui_copy_url": "Copiere adresă",
+ "gui_copy_hidservauth": "Copiere HidServAuth",
+ "gui_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "Anulat",
+ "gui_copied_url_title": "Adresă OnionShare copiată",
+ "gui_copied_url": "Adresa OnionShare a fost copiată în memoria clipboard",
+ "gui_copied_hidservauth_title": "Am copiat HidServAuth",
+ "gui_copied_hidservauth": "Linia HidServAuth a fost copiată în clipboard",
+ "gui_please_wait": "Începem ... Faceți clic pentru a anula.",
+ "gui_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "version_string": "",
+ "gui_quit_title": "Nu atât de repede",
+ "gui_share_quit_warning": "Sunteți în proces de trimitere fișiere. Sigur vreți să închideți OnionShare?",
+ "gui_receive_quit_warning": "Sunteți în proces de primire fișiere. Sigur vreți să închideți OnionShare?",
+ "gui_quit_warning_quit": "Închidere",
+ "gui_quit_warning_dont_quit": "Anulare",
+ "error_rate_limit": "Cineva a făcut prea multe încercări greșite pentru a ghici parola, astfel încât OnionShare a oprit serverul. Începeți partajarea din nou și trimiteți destinatarului o nouă adresă de partajat.",
+ "zip_progress_bar_format": "Compresare: %p%",
+ "error_stealth_not_supported": "Pentru a folosi autorizarea clientului, aveți nevoie de versiunile minim Tor 0.2.9.1-alfa (sau Tor Browser 6.5) cât și de python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare are nevoie de minim versiunea Tor 0.2.7.1 cât și de Python3-stem 1.4.0.",
+ "gui_settings_window_title": "Setari",
+ "gui_settings_whats_this": "<a href='{0:s}'>Ce este asta?</a>",
+ "gui_settings_stealth_option": "Utilizați autorizarea clientului",
+ "gui_settings_stealth_hidservauth_string": "După ce v-ați salvat cheia privată pentru reutilizare, înseamnă că puteți face clic acum pentru a copia HidServAuth.",
+ "gui_settings_autoupdate_label": "Verificați dacă există o versiune nouă",
+ "gui_settings_autoupdate_option": "Anunțați-mă când este disponibilă o nouă versiune",
+ "gui_settings_autoupdate_timestamp": "Ultima verificare: {}",
+ "gui_settings_autoupdate_timestamp_never": "Niciodata",
+ "gui_settings_autoupdate_check_button": "Verificați versiunea nouă",
+ "gui_settings_general_label": "Setări generale",
+ "gui_settings_sharing_label": "Setări de partajare",
+ "gui_settings_close_after_first_download_option": "Opriți partajarea după ce fișierele au fost trimise",
+ "gui_settings_connection_type_label": "Cum ar trebui să se conecteze OnionShare la Tor?",
+ "gui_settings_connection_type_bundled_option": "Utilizați versiunea Tor încorporată în OnionShare",
+ "gui_settings_connection_type_automatic_option": "Încercați configurarea automată cu Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Conectați-vă cu portul de control",
+ "gui_settings_connection_type_socket_file_option": "Conectați-vă cu fișierul socket",
+ "gui_settings_connection_type_test_button": "Testează conexiunea la Tor",
+ "gui_settings_control_port_label": "Port de control",
+ "gui_settings_socket_file_label": "Fișier socket",
+ "gui_settings_socks_label": "Port SOCKS",
+ "gui_settings_authenticate_label": "Setări de autentificare Tor",
+ "gui_settings_authenticate_no_auth_option": "Fără autentificare sau autentificare cookie",
+ "gui_settings_authenticate_password_option": "Parolă",
+ "gui_settings_password_label": "Parolă",
+ "gui_settings_tor_bridges": "Suport pentru Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Nu folosiți poduri",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Folosiți transporturi conectabile obfs4 integrate",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Folosiți transporturi conectabile obfs4 conectate (necesită obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Utilizați transporturi conectabile meek_lite (Azure) încorporate",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Folosiți transporturi conectabile meek_lite (Azure) încorporate (necesită obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Avertisment: podurile meek_lite sunt foarte costisitoare pentru rularea Proiectului Tor. <br> <br> Utilizați-le numai dacă nuvă puteți conecta direct la Tor, prin transporturi obfs4 sau alte poduri normale.",
+ "gui_settings_tor_bridges_custom_radio_option": "Folosiți poduri personalizate",
+ "gui_settings_tor_bridges_custom_label": "Puteți obține poduri de la <a href=\"https://bridges.torproject.org/options?lang=ro\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Niciunul din podurile adăugate nu funcționează.\nVerificați-le încă o dată sau adăugați altele.",
+ "gui_settings_button_save": "Salvare",
+ "gui_settings_button_cancel": "Anulare",
+ "gui_settings_button_help": "Ajutor",
+ "gui_settings_autostop_timer_checkbox": "Folosiți cronometrul auto-stop",
+ "gui_settings_autostop_timer": "Opriți partajarea la:",
+ "settings_error_unknown": "Nu se poate face conectarea la controlerul Tor, deoarece setările dvs. nu au sens.",
+ "settings_error_automatic": "Nu s-a putut face conectarea la controlerul Tor. Tor Browser (disponibil de la torproject.org) rulează în fundal?",
+ "settings_error_socket_port": "Nu se poate face conectarea la controlerul Tor la {}:{}.",
+ "settings_error_socket_file": "Nu se poate face conectarea la controlerul Tor folosind fișierul socket {}.",
+ "settings_error_auth": "Conectat la {}:{}, dar nu se poate face autentificarea. Poate că nu este un controler Tor?",
+ "settings_error_missing_password": "Conectat la controlerul Tor, dar este nevoie de o parolă pentru autentificare.",
+ "settings_error_unreadable_cookie_file": "Conectat la controlerul Tor, dar parola poate fi greșită sau utilizatorului nu i se permite să citească fișierul cookie.",
+ "settings_error_bundled_tor_not_supported": "Utilizarea versiunii Tor care vine cu OnionShare nu funcționează în modul dezvoltator pe Windows sau macOS.",
+ "settings_error_bundled_tor_timeout": "Durează prea mult timp pentru a vă conecta la Tor. Poate nu sunteți conectat la Internet sau aveți un ceas al sistemului setat inexact?",
+ "settings_error_bundled_tor_broken": "OnionShare nu se poate conecta la Tor în fundal:\n{}",
+ "settings_test_success": "Conectat la controlerul Tor.\n\nVersiunea Tor: {}\nSuportă servicii efemere onion: {}.\nSuportă autentificarea clientului: {}.\nSuportă adrese next-gen .onion: {}.",
+ "error_tor_protocol_error": "A apărut o eroare cu Tor: {}",
+ "error_tor_protocol_error_unknown": "A apărut o eroare necunoscută cu Tor",
+ "error_invalid_private_key": "",
+ "connecting_to_tor": "Conectarea la rețeaua Tor",
+ "update_available": "Noua versiune OnionShare. <a href='{}'>Clic aici</a> pentru a o obține.<br><br>Folosiți versiunea {} și ultima versiune este {}.",
+ "update_error_check_error": "Nu s-a putut verifica dacă există o versiune nouă: site-ul OnionShare spune că ultima versiune nu poate fi recunoscută '{}'…",
+ "update_error_invalid_latest_version": "Nu s-a putut verifica dacă există o versiune nouă: Poate nu sunteți conectat la Tor, sau site-ul OnionShare este închis?",
+ "update_not_available": "Rulează ultima versiune OnionShare.",
+ "gui_tor_connection_ask": "Deschideți setările pentru a sorta conexiunea la Tor?",
+ "gui_tor_connection_ask_open_settings": "Da",
+ "gui_tor_connection_ask_quit": "Închidere",
+ "gui_tor_connection_error_settings": "Încercați să schimbați în setări modul în care OnionShare se conectează la rețeaua Tor.",
+ "gui_tor_connection_canceled": "Nu se poate realiza conexiunea la Tor.\n\nVerificați dacă sunteți conectat la Internet, apoi redeschideți OnionShare și setați conexiunea la Tor.",
+ "gui_tor_connection_lost": "Deconectat de la Tor.",
+ "gui_server_started_after_autostop_timer": "Cronometrul de oprire automată a expirat înainte de pornirea serverului. Vă rugăm să faceți o nouă partajare.",
+ "gui_server_autostop_timer_expired": "Timpul pentru cronometrul auto-stop a expirat deja. Vă rugăm să îl modificați pentru a începe distribuirea.",
+ "share_via_onionshare": "Partajați prin OnionShare",
+ "gui_use_legacy_v2_onions_checkbox": "Folosire adrese moștenite",
+ "gui_save_private_key_checkbox": "Folosiți o adresă persistentă",
+ "gui_share_url_description": "<b>Oricine</b> are această adresă OnionShare poate <b>descărca</b> fișierele dvs. folosind <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Oricine</b> are această adresă OnionShare poate <b>încărca</b> fișiere pe computerul dvs. folosind <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Această partajare nu se va opri automat. <br> <br> Fiecare acțiune ulterioară reutilizează adresa. (Pentru a utiliza adrese unice, dezactivați „Utilizați adresa persistentă” din setări.)",
+ "gui_url_label_stay_open": "Această partajare nu se va opri automat.",
+ "gui_url_label_onetime": "Această partajare se va opri după prima finalizare.",
+ "gui_url_label_onetime_and_persistent": "Această partajare nu se va opri automat. <br> <br> Fiecare acțiune ulterioară va reutiliza adresa. (Pentru a utiliza adrese unice, dezactivați „Utilizați adresa persistentă” din setări.)",
+ "gui_status_indicator_share_stopped": "Pregătit pentru partajare",
+ "gui_status_indicator_share_working": "Pornire…",
+ "gui_status_indicator_share_started": "Partajare",
+ "gui_status_indicator_receive_stopped": "Pregătit pentru primire",
+ "gui_status_indicator_receive_working": "Pornire…",
+ "gui_status_indicator_receive_started": "Primire",
+ "gui_file_info": "{} fișiere, {}",
+ "gui_file_info_single": "{} fișier, {}",
+ "history_in_progress_tooltip": "{} în progres",
+ "history_completed_tooltip": "{} complet",
+ "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": "Modul de recepție permite utilizatorilor să încarce fișiere pe computerul dvs. <br> <br> <br> <b> Unele fișiere pot prelua controlul computerului dacă le deschideți. Deschideți doar fișierele de la persoanele de încredere sau dacă știți ce faceți. </b>",
+ "receive_mode_upload_starting": "Începe încărcarea din dimensiunea totală {}",
+ "receive_mode_received_file": "",
+ "gui_mode_share_button": "Partajare fișiere",
+ "gui_mode_receive_button": "Primire fișiere",
+ "gui_settings_receiving_label": "Setări de primire",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "Răsfoiește",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Mod public",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "Pagină încărcată",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "gui_upload_finished_range": "",
+ "gui_upload_finished": "",
+ "gui_download_in_progress": "",
+ "gui_open_folder_error_nautilus": "Nu se poate deschide folderul deoarece nautilus nu este disponibil. Fișierul este aici: {}",
+ "gui_settings_language_label": "Limba preferată",
+ "gui_settings_language_changed_notice": "Reporniți OnionShare pentru a aplica noul limbaj.",
+ "gui_add_files": "Adaugă fișiere",
+ "gui_add_folder": "Adaugă director",
+ "gui_connect_to_tor_for_onion_settings": "Conectați-vă la Tor pentru a vedea setările serviciului onion",
+ "error_cannot_create_data_dir": "Nu s-a putut crea folderul de date OnionShare: {}",
+ "gui_settings_data_dir_label": "Salvare fișiere în",
+ "gui_settings_data_dir_browse_button": "Navigare",
+ "systray_page_loaded_message": "Adresa OnionShare a fost încărcată",
+ "systray_share_started_title": "Partajarea a început",
+ "systray_share_started_message": "Începeți să trimiteți cuiva fișiere",
+ "systray_share_completed_title": "Partajare completă",
+ "systray_share_completed_message": "Am terminat trimiterea fișierelor",
+ "systray_share_canceled_title": "Partajarea a fost anulată",
+ "systray_share_canceled_message": "Cineva a anulat primirea fișierelor",
+ "systray_receive_started_title": "A început primirea",
+ "systray_receive_started_message": "Cineva vă trimite fișiere",
+ "gui_all_modes_history": "Istoric",
+ "gui_all_modes_clear_history": "Ștergere toate",
+ "gui_all_modes_transfer_started": "Pornit {}",
+ "gui_all_modes_transfer_finished_range": "Transferat {} - {}",
+ "gui_all_modes_transfer_finished": "Transferat {}",
+ "gui_all_modes_progress_complete": "au trecut %p%, {0:s}.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (se calculează)",
+ "gui_all_modes_progress_eta": "{0:s}, Timp estimat: {1:s}, %p%",
+ "gui_share_mode_no_files": "Niciun fișier trimis încă",
+ "gui_receive_mode_no_files": "Încă nu au fost primite fișiere",
+ "gui_all_modes_transfer_canceled_range": "Anulat {} - {}",
+ "gui_all_modes_transfer_canceled": "Anulat {}",
+ "gui_settings_onion_label": "Setări Onion",
+ "gui_stop_server_autostop_timer_tooltip": "Cronometrul de oprire automată se oprește la {}",
+ "gui_start_server_autostart_timer_tooltip": "Cronometrul de pornire automată se oprește la {}",
+ "gui_waiting_to_start": "Programat pentru a începe în {}. Click pentru a anula.",
+ "gui_settings_autostart_timer_checkbox": "Folosiți cronometrul de pornire automată",
+ "gui_settings_autostart_timer": "Porniți partajarea la:",
+ "gui_server_autostart_timer_expired": "Ora programată a trecut deja. Vă rugăm să o reajustați pentru a începe distribuirea.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Ora de oprire automată nu poate fi aceeași sau mai devreme decât ora de pornire automată. Vă rugăm să o ajustați pentru a începe distribuirea.",
+ "gui_status_indicator_share_scheduled": "Programat …",
+ "gui_status_indicator_receive_scheduled": "Programat …",
+ "gui_share_mode_autostop_timer_waiting": "Se așteaptă să se termine trimiterea",
+ "gui_receive_mode_autostop_timer_waiting": "Se așteaptă să se termine primirea",
+ "days_first_letter": "zi",
+ "hours_first_letter": "ore",
+ "minutes_first_letter": "min",
+ "seconds_first_letter": "s",
+ "gui_website_url_description": "<b>Oricine</b> are această adresă OnionShare poate <b>vizita</b> website-ul dvs. folosind <b>Tor Browser</b>: <img src='{}' />",
+ "gui_mode_website_button": "Publicare site web",
+ "gui_website_mode_no_files": "Niciun site nu a fost partajat încă",
+ "incorrect_password": "Parolă incorectă",
+ "gui_settings_individual_downloads_label": "Debifează pentru a permite descărcarea fișierelor individuale",
+ "history_requests_tooltip": "{} solicitări web",
+ "gui_settings_csp_header_disabled_option": "Dezactivează antetul Politicii de securitate a conținutului",
+ "gui_settings_website_label": "Setări pentru website"
+}
diff --git a/desktop/share/locale/ru.json b/desktop/share/locale/ru.json
new file mode 100644
index 00000000..4f38ff37
--- /dev/null
+++ b/desktop/share/locale/ru.json
@@ -0,0 +1,237 @@
+{
+ "give_this_url": "Передайте получателю этот адрес:",
+ "ctrlc_to_stop": "Нажмите Ctrl+C, чтобы остановить сервер",
+ "not_a_file": "{0:s} недопустимый файл.",
+ "gui_copied_url": "Ссылка OnionShare скопирована в буфер обмена",
+ "other_page_loaded": "Адрес загружен",
+ "gui_copy_url": "Копировать адрес",
+ "systray_menu_exit": "Выйти",
+ "gui_add": "Добавить",
+ "gui_delete": "Удалить",
+ "gui_choose_items": "Выбрать",
+ "gui_canceled": "Отменена",
+ "gui_quit_warning_quit": "Выход",
+ "gui_quit_warning_dont_quit": "Отмена",
+ "gui_settings_window_title": "Настройки",
+ "gui_settings_autoupdate_timestamp_never": "Никогда",
+ "gui_settings_general_label": "Общие настройки",
+ "gui_settings_control_port_label": "Контрольный порт",
+ "gui_settings_authenticate_password_option": "Пароль",
+ "gui_settings_password_label": "Пароль",
+ "gui_settings_button_save": "Сохранить",
+ "gui_settings_button_cancel": "Отмена",
+ "gui_settings_button_help": "Помощь",
+ "gui_tor_connection_ask_open_settings": "Да",
+ "gui_tor_connection_ask_quit": "Выйти",
+ "gui_status_indicator_share_started": "Идёт отправка",
+ "gui_status_indicator_receive_started": "Идёт получение",
+ "gui_settings_downloads_label": "Путь сохранения файлов: ",
+ "gui_settings_downloads_button": "Выбрать",
+ "gui_clear_history": "Очистить Все",
+ "gui_settings_language_label": "Язык интерфейса",
+ "config_onion_service": "Назначем \"луковому\" сервису порт {:d}.",
+ "preparing_files": "Сжимаем файлы.",
+ "give_this_url_stealth": "Передайте этот адрес и строку HidServAuth получателю:",
+ "give_this_url_receive": "Передайте этот адрес отправителю:",
+ "give_this_url_receive_stealth": "Передайте этот адрес и строку HidServAuth отправителю:",
+ "not_a_readable_file": "{0:s} не читаемый файл.",
+ "no_available_port": "Не удалось найти доступный порт для запуска \"лукового\" сервиса",
+ "close_on_autostop_timer": "Время ожидания таймера истекло, сервис остановлен",
+ "closing_automatically": "Загрузка завершена, сервис остановлен",
+ "timeout_download_still_running": "Ожидаем завершения скачивания",
+ "timeout_upload_still_running": "Ожидаем завершения загрузки",
+ "large_filesize": "Внимание: Отправка данных большого объёма может занять продолжительное время (несколько часов)",
+ "systray_download_started_title": "OnionShare: скачивание началось",
+ "systray_download_started_message": "Пользователь начал загружать Ваши файлы",
+ "systray_download_completed_title": "OnionShare: скачивание завершено",
+ "systray_download_completed_message": "Пользователь завершил скачивание Ваших файлов",
+ "systray_download_canceled_title": "OnionShare: скачивание отменено",
+ "systray_download_canceled_message": "Пользователь отменил скачивание",
+ "systray_upload_started_title": "OnionShare: загрузка началась",
+ "systray_upload_started_message": "Пользователь начал загрузку файлов на Ваш компьютер",
+ "help_local_only": "Не использовать Tor (только для разработки)",
+ "help_stay_open": "Продолжить отправку после первого скачивания",
+ "help_autostop_timer": "Остановить отправку после заданного количества секунд",
+ "help_stealth": "Использовать авторизацию клиента (дополнительно)",
+ "help_receive": "Получать загрузки вместо их отправки",
+ "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_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_hidservauth": "Скопировать строку HidServAuth",
+ "gui_downloads": "История скачиваний",
+ "gui_no_downloads": "Скачиваний пока нет ",
+ "gui_copied_url_title": "Адрес OnionShare скопирован",
+ "gui_copied_hidservauth_title": "Строка HidServAuth скопирована",
+ "gui_copied_hidservauth": "Строка HidServAuth скопирована в буфер обмена",
+ "gui_please_wait": "Запуск... Для отмены нажмите здесь.",
+ "gui_download_upload_progress_complete": "%p%, прошло {0:s}.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (вычисляем)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Не так быстро",
+ "gui_share_quit_warning": "Идёт процесс отправки файлов. Уверены, что хотите завершить работу OnionShare?",
+ "gui_receive_quit_warning": "Идёт процесс получения файлов. Уверены, что хотите завершить работу OnionShare?",
+ "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_whats_this": "<a href='{0:s}'>Что это?</a>",
+ "gui_settings_stealth_option": "Использовать авторизацию клиента",
+ "gui_settings_stealth_hidservauth_string": "Сохранили Ваш приватный ключ для повторного использования.\nНажмите сюда, чтобы скопировать строку HidServAuth.",
+ "gui_settings_autoupdate_label": "Проверить наличие новой версии",
+ "gui_settings_autoupdate_option": "Уведомить меня, когда будет доступна новая версия",
+ "gui_settings_autoupdate_timestamp": "Последняя проверка: {}",
+ "gui_settings_autoupdate_check_button": "Проверить наличие новой версии",
+ "gui_settings_sharing_label": "Настройки отправки",
+ "gui_settings_close_after_first_download_option": "Завершить отправку Ваших файлов\nпосле их первого скачивания",
+ "gui_settings_connection_type_label": "Как OnionShare следует подключаться к сети Tor?",
+ "gui_settings_connection_type_bundled_option": "Использовать версию Tor, встроенную в OnionShare",
+ "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_socket_file_label": "Файл сокет",
+ "gui_settings_socks_label": "Порт SOCKS",
+ "gui_settings_authenticate_label": "Настройки аутентификации Tor",
+ "gui_settings_authenticate_no_auth_option": "Без аутентификации или cookie-аутентификации",
+ "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 Project.<br><br>Используйте их только если не можете подключиться к сети Tor напрямую, через obfs4 транспорты или другие обычные \"мосты\".",
+ "gui_settings_tor_bridges_custom_radio_option": "Использовать пользовательские \"мосты\"",
+ "gui_settings_tor_bridges_custom_label": "Получить настройки \"мостов\" можно здесь: <a href=\"https://bridges.torproject.org/options?lang=ru\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Ни один из добавленных вами \"мостов\" не работает.\nПроверьте их снова или добавьте другие.",
+ "gui_settings_autostop_timer_checkbox": "Использовать стоп-таймер",
+ "gui_settings_autostop_timer": "Остановить отправку в:",
+ "settings_error_unknown": "Невозможно произвести подключение к контроллеру Tor: некорректные настройки.",
+ "settings_error_automatic": "Ошибка подключения к контроллеру Tor. Запущен ли Tor Browser (torproject.org) в фоновом режиме?",
+ "settings_error_socket_port": "Ошибка подключения к контроллеру Tor в {}:{}.",
+ "settings_error_socket_file": "Ошибка подключения к контроллеру Tor с использованием файла-сокета {}.",
+ "settings_error_auth": "Подключено к {}:{}, ошибка проверки подлинности. Возможно, это не контроллер Tor?",
+ "settings_error_missing_password": "Подключено к контроллеру Tor, но для аутентификации нужен пароль.",
+ "settings_error_unreadable_cookie_file": "Подключено к контроллеру Tor, но возможна ошибка пароля, или пользователю запрещено чтение файла cookie.",
+ "settings_error_bundled_tor_not_supported": "Версия Tor, которая поставляется вместе с OnionShare, не подходит для разработчика в Windows и macOS.",
+ "settings_error_bundled_tor_timeout": "Подключение к Tor занимает слишком много времени. Возможно, отсутствует подключение к сети Интернет, или у вас неточно настроено системное время?",
+ "settings_error_bundled_tor_broken": "Ошибка подключения OnionShare к Tor в фоновом режиме:\n{}",
+ "settings_test_success": "Подключено к контроллеру Tor.\n\nВерсия Tor: {}\nПоддержка временных \"луковых\" сервисов: {}.\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_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> c этим адресом OnionShare может <b>скачать</b> Ваши файлы при помощи <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Кто угодно</b> c этим адресом OnionShare может <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_receive_stopped": "Данные готовы к получению",
+ "gui_status_indicator_receive_working": "Ожидайте…",
+ "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": "Начинается загрузка общим объёмом {}",
+ "receive_mode_received_file": "Получено: {}",
+ "gui_mode_share_button": "Отправка файлов",
+ "gui_mode_receive_button": "Получение файлов",
+ "gui_settings_receiving_label": "Настройки получения",
+ "gui_settings_public_mode_checkbox": "Публичный режим",
+ "systray_close_server_title": "Сервер OnionShare отключен",
+ "systray_close_server_message": "Пользователь отключил сервер",
+ "systray_page_loaded_title": "Страница загружена",
+ "systray_download_page_loaded_message": "Пользователь находится на странице скачивания",
+ "systray_upload_page_loaded_message": "Пользователь посетил странцу загрузки",
+ "gui_uploads": "История загрузок",
+ "gui_no_uploads": "Загрузок пока нет",
+ "gui_upload_in_progress": "Загрузка началась {}",
+ "gui_upload_finished_range": "Загружено {} в {}",
+ "gui_upload_finished": "Загружено {}",
+ "gui_download_in_progress": "Загрузка началась {}",
+ "gui_open_folder_error_nautilus": "Не удаётся открыть папку без файлового менеджера Nautilus. Файл находится здесь: {}",
+ "gui_settings_language_changed_notice": "Перезапустите OnionShare, чтобы изменения языковых настроек вступили в силу.",
+ "gui_add_files": "Добавить файлы",
+ "gui_add_folder": "Добавить папку",
+ "error_cannot_create_data_dir": "Не удалось создать папку данных OnionShare: {}",
+ "gui_settings_onion_label": "Настройки \"лукового\" сервиса",
+ "gui_connect_to_tor_for_onion_settings": "Подключитесь к Tor, чтобы видеть настройки \"лукового\" сервиса",
+ "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}, ETA: {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_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": "с",
+ "gui_website_url_description": "<b>Любой</b> у кого есть этот адрес OnionShare может <b>посетить</b> ваш сайт при помощи <b>Tor Browser</b>: <img src='{}' />",
+ "gui_mode_website_button": "Опубликовать Веб-сайт",
+ "gui_website_mode_no_files": "Нет опубликованных Веб-сайтов",
+ "incorrect_password": "Неверный пароль",
+ "gui_settings_individual_downloads_label": "Снимите флажок чтобы разрешить скачивание отдельных файлов",
+ "history_requests_tooltip": "{} веб запросы",
+ "gui_settings_csp_header_disabled_option": "Отключить проверку Политики Безопасности Содержимого",
+ "gui_settings_website_label": "Настройки Веб-сайта"
+}
diff --git a/desktop/share/locale/sl.json b/desktop/share/locale/sl.json
new file mode 100644
index 00000000..70e04baa
--- /dev/null
+++ b/desktop/share/locale/sl.json
@@ -0,0 +1,193 @@
+{
+ "config_onion_service": "",
+ "preparing_files": "Stiskanje datotek.",
+ "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": "{0:s} ni mogoče prebrati.",
+ "no_available_port": "Ni mogoče najti prostega vhoda, da bi lahko zagnali onion service",
+ "other_page_loaded": "Naslov naložen",
+ "close_on_autostop_timer": "Prenehal, ker je auto-stop timer pretekel",
+ "closing_automatically": "Prenehal, ker se je prenos končal",
+ "timeout_download_still_running": "",
+ "large_filesize": "Opozorilo: Pošiljanje prevelikih deležel lahko traja ure",
+ "systray_menu_exit": "Izhod",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "help_local_only": "",
+ "help_stay_open": "",
+ "help_autostop_timer": "",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "",
+ "help_config": "",
+ "gui_drag_and_drop": "Povleci in spusti datoteke in mape\nza začetek skupne rabe",
+ "gui_add": "Dodaj",
+ "gui_delete": "Zbriši",
+ "gui_choose_items": "Izberi",
+ "gui_share_start_server": "Začni deliti",
+ "gui_share_stop_server": "Zaustavi deljenje",
+ "gui_share_stop_server_autostop_timer": "Zaustavi deljenje ({})",
+ "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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "Odpovedan",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "gui_quit_title": "",
+ "gui_share_quit_warning": "",
+ "gui_receive_quit_warning": "",
+ "gui_quit_warning_quit": "Izhod",
+ "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": "Nikoli",
+ "gui_settings_autoupdate_check_button": "",
+ "gui_settings_general_label": "Splošne nastavitve",
+ "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": "Krmilna vrata",
+ "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": "Pomoč",
+ "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": "Da",
+ "gui_tor_connection_ask_quit": "Izhod",
+ "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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "Brskanje",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_add_files": "Dodaj Datoteke",
+ "gui_add_folder": "Dodaj Mapo",
+ "gui_stop_server_autostop_timer_tooltip": "Samodejno zaustavi timer, ki se konča ob{}",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s",
+ "incorrect_password": "Napačno geslo"
+}
diff --git a/desktop/share/locale/sn.json b/desktop/share/locale/sn.json
new file mode 100644
index 00000000..4ee1a03b
--- /dev/null
+++ b/desktop/share/locale/sn.json
@@ -0,0 +1,188 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/sr_Latn.json b/desktop/share/locale/sr_Latn.json
new file mode 100644
index 00000000..18dfad44
--- /dev/null
+++ b/desktop/share/locale/sr_Latn.json
@@ -0,0 +1,183 @@
+{
+ "preparing_files": "Komprimujem fajlove.",
+ "not_a_readable_file": "(0:s) nije čitljiv fajl.",
+ "no_available_port": "Ne mogu da pronađem raspoloživi port da bih počeo onion servis",
+ "other_page_loaded": "Adresa učitana",
+ "incorrect_password": "Pogrešna lozinka",
+ "close_on_autostop_timer": "Prekid rada zato što je isteklo vreme na auto-stop tajmeru",
+ "closing_automatically": "Prekid rada zato što je prenos završen",
+ "large_filesize": "Upozorenje: Slanje velikih fajlova može trajati satima",
+ "gui_drag_and_drop": "Prevuci i otpusti datoteke i fascikle\nda bi započeo deljenje",
+ "gui_add": "Dodaj",
+ "gui_add_files": "Dodaj datoteke",
+ "gui_add_folder": "Dodat fascikle",
+ "gui_delete": "Obriši",
+ "gui_choose_items": "Odaberi",
+ "gui_share_start_server": "Započni deljenje",
+ "gui_share_stop_server": "Prekini deljenje",
+ "gui_share_stop_server_autostop_timer": "Prekini deljenje ({})",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop tajmer se zaustavlja na {}",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start tajmer se zaustavlja na {}",
+ "gui_receive_start_server": "Započni režim primanja",
+ "gui_receive_stop_server": "Prekini režim primanja",
+ "gui_receive_stop_server_autostop_timer": "Prekini režim primanja ({} preostalo)",
+ "gui_copy_url": "Kopiraj adresu",
+ "gui_copy_hidservauth": "Kopiraj HidServAuth",
+ "gui_canceled": "Obustavljeno",
+ "gui_copied_url_title": "Kopirana OnionShare adresa",
+ "gui_copied_url": "OnionShare adresa kopirana u privremenu memoriju",
+ "gui_copied_hidservauth_title": "Kopiran HidServAuth",
+ "gui_copied_hidservauth": "HidServAuth linija kopirana u privremenu memoriju",
+ "gui_waiting_to_start": "Planirano da počne u {}. Klikni da obustaviš.",
+ "gui_please_wait": "Počinje… Klikni da obustaviš.",
+ "gui_quit_title": "Ne tako brzo",
+ "gui_share_quit_warning": "Proces slanja datoteka u toku. Jeste li sigurni da želite da zaustavite OnionShare?",
+ "gui_receive_quit_warning": "Proces primanja datoteka u toku. Jeste li sigurni da želite da zaustavite OnionShare?",
+ "gui_quit_warning_quit": "Izađi",
+ "gui_quit_warning_dont_quit": "Odustani",
+ "error_rate_limit": "Neko je načinio suviše pogrešnih pokušaja da pogodi tvoju lozinku, tako da je OnionShare zaustavio server. Počni deljenje ponovo i pošalji primaocu novu adresu za deljenje.",
+ "zip_progress_bar_format": "Komprimujem: %p%",
+ "error_stealth_not_supported": "Da bi koristion klijen autorizaciju, potrebni su ti barem Tor 0.2.9.1-alpha (ili Tor Browser 6.5) i python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare zahteva barem Tor 0.2.7.1 i python3-stem 1.4.0.",
+ "gui_settings_window_title": "Podešavanja",
+ "gui_settings_whats_this": "<a href='{0:s}'>Šta je ovo?</a>",
+ "gui_settings_stealth_option": "Koristi klijent autorizaciju",
+ "gui_settings_stealth_hidservauth_string": "Ako si sačuvao svoj privatni ključ za ponovnu upotrenu, sada možeš kliknuti da iskopiraš svoj HidServAuth.",
+ "gui_settings_autoupdate_label": "Proveri da li postoji nova verzija",
+ "gui_settings_autoupdate_option": "Obavesti me kada nova verzija bude na raspolaganju",
+ "gui_settings_autoupdate_timestamp": "Poslednja provera: {}",
+ "gui_settings_autoupdate_timestamp_never": "Nikada",
+ "gui_settings_autoupdate_check_button": "Proveri da li postoji nova verzija",
+ "gui_settings_general_label": "Generalna podešavanja",
+ "gui_settings_onion_label": "Onion podešavanja",
+ "gui_settings_sharing_label": "Podešavanja deljenja",
+ "gui_settings_close_after_first_download_option": "Prekini deljenje kada datoteke budu poslate",
+ "gui_settings_csp_header_disabled_option": "Onemogući zaglavlje Pravilnika o sigurnosti sadržaja",
+ "gui_settings_individual_downloads_label": "Poništi izbor da bi dozvolio preuzimanje pojedinačnih datoteka",
+ "gui_settings_connection_type_label": "Kako bi OnionShare trebalo povezati sa Torom?",
+ "gui_settings_connection_type_bundled_option": "Koristi verziju Tora ugrađenu u OnionShare",
+ "gui_settings_connection_type_automatic_option": "Pokušaj automatsku konfiguraciju pomoću Tor pretraživača",
+ "gui_settings_connection_type_control_port_option": "Poveži se koristeći kontrolni port",
+ "gui_settings_connection_type_socket_file_option": "Poveži se koristeći datoteku priključka",
+ "gui_settings_connection_type_test_button": "Testiranje veze sa Torom",
+ "gui_settings_control_port_label": "Kontrolni port",
+ "gui_settings_socket_file_label": "Datoteka priključka",
+ "gui_settings_socks_label": "SOCKS priključak",
+ "gui_settings_authenticate_label": "Podešavanje autentifikacije Tora",
+ "gui_settings_authenticate_no_auth_option": "Bez autentifikacije ili autentifikacija kolačićem",
+ "gui_settings_authenticate_password_option": "Lozinka",
+ "gui_settings_password_label": "Lozinka",
+ "gui_settings_tor_bridges": "Most podrška za Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Ne koristi mostove",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Koristi ugrađene obfs4 dodatne prenose",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Koristi ugrađene obfs4 dodatne prenose (potreban obfs4proksi)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Koristi ugrađene meek_lite (Azure) dodatne prenose",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Koristi ugrađene meek_lite (Azure) dodatne prenose (potreban obfs4proksi)",
+ "gui_settings_meek_lite_expensive_warning": "Upozorenje: meek_lite mostovi su vrlo skupi za Tor projekat da ih koristi.<br><br>Koristi ih samo ako ne možeš da se povežeš na Tor direktno, preko obfs4 transporta ili drugih redovnih mostova.",
+ "gui_settings_tor_bridges_custom_radio_option": "Koristi prilagođene mostove",
+ "gui_settings_tor_bridges_custom_label": "Mostove možeš dobiti od <a href=\"https://bridges.torproject.org/options?lang=sr_Latn\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Nijedan od mostova koje si dodao ne funkcioniše.\nProveri ih ponovo ili dodaj druge.",
+ "gui_settings_button_save": "Sačuvaj",
+ "gui_settings_button_cancel": "Odustani",
+ "gui_settings_button_help": "Pomoć",
+ "gui_settings_autostop_timer_checkbox": "Koristi tajmer za automatsko zaustavljanje",
+ "gui_settings_autostop_timer": "Zaustavi deljenje na:",
+ "gui_settings_autostart_timer_checkbox": "Koristi tajmer automatskog pokretanja",
+ "gui_settings_autostart_timer": "Započni deljenje na:",
+ "settings_error_unknown": "Nije moguće povezati se sa Tor kontrolerom jer tvoje postavke nemaju smisla.",
+ "settings_error_automatic": "Nije moguće povezati se sa Tor kontrolerom. Da li Tor pregledač (dostupan na torproject.org) radi u pozadini?",
+ "settings_error_socket_port": "Nije moguće povezati se sa Tor kontrolerom na {}: {}.",
+ "settings_error_socket_file": "Nije moguće povezati se na Tor kontroler pomoću datoteke priključka {}.",
+ "settings_error_auth": "Povezan na {}: {}, ali nije moguća autentifikacija. Možda ovo nije Tor kontroler?",
+ "settings_error_missing_password": "Povezan sa Tor kontrolerom, ali on zahteva lozinku za autentifikaciju.",
+ "settings_error_unreadable_cookie_file": "Povezan sa Tor kontrolerom, ali je lozinka možda pogrešna ili tvomj korisniku nije dozvoljeno da pročita datoteku kolačića.",
+ "settings_error_bundled_tor_not_supported": "Korišćenje verzije Tora koja se isporučuje sa OnionShare ne radi u razvojnom režimu u operativnom sistemu Windows ili macOS.",
+ "settings_error_bundled_tor_timeout": "Predugo traje povezivanje sa Torom. Možda nisi povezan sa Internetom ili imaš netačan sistemski sat?",
+ "settings_error_bundled_tor_broken": "OnionShare ne može da se poveže sa Torom u pozadini:\n{}",
+ "settings_test_success": "Povezan sa Tor kontrolerom.\n\nTor verzija: {}\nPodržava povremene onion usluge: {}.\nPodržava autentifikaciju klijenta: {}.\nPodržava next-gen .onion adrese: {}.",
+ "error_tor_protocol_error": "Došlo je do greške sa Torom: {}",
+ "error_tor_protocol_error_unknown": "Došlo je do nepoznate greške sa Torom",
+ "connecting_to_tor": "Povezivanje sa Tor mrežom",
+ "update_available": "Novi OnionShare objavljen. <a href='{}'>Klikni ovde</a> da bi ga dobio.<br><br>Trenutno koristiš {} a najnoviji je {}.",
+ "update_error_check_error": "Nije moguće proveriti novu verziju: na sajtu OnionShare piše da je najnovija verzija neprepoznatljiva ' {} '…",
+ "update_error_invalid_latest_version": "Nije moguće proveriti novu verziju: možda niste povezani sa Torom ili je sajt OnionShare oboren?",
+ "update_not_available": "Da li koristite najnoviji OnionShare.",
+ "gui_tor_connection_ask": "Da li otvoriti podešavanja da biste podesili vezu sa Torom?",
+ "gui_tor_connection_ask_open_settings": "Da",
+ "gui_tor_connection_ask_quit": "Odustani",
+ "gui_tor_connection_error_settings": "Pokušaj da u podešavanjima promeniš način na koji se OnionShare povezuje sa Tor mrežom.",
+ "gui_tor_connection_canceled": "Nije moguće povezati se sa Torom.\n\nProveri da li si povezan sa Internetom, a zatim ponovo pokreni OnionShare i podesi vezu sa Torom.",
+ "gui_tor_connection_lost": "Prekinuta veza sa Torom.",
+ "gui_server_started_after_autostop_timer": "Tajmer automatskog zaustavljanja je odbrojao pre početka rada servera. Unesi novi deo.",
+ "gui_server_autostop_timer_expired": "Tajmer automatskog zaustavljanja je već odbrojao. Podesi ga da bi započelo deljenje.",
+ "gui_server_autostart_timer_expired": "Predviđeno vreme je već prošlo. Podesi ga da bi započelo deljenje.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Vreme automatskog zaustavljanja ne može biti isto ili ranije od vremena početka automatskog pokretanja. Podesi ga da bi započelo deljenje.",
+ "share_via_onionshare": "Deljenje pomoću OnionShare",
+ "gui_connect_to_tor_for_onion_settings": "Poveži se sa Torom da bi video postavke onion servisa",
+ "gui_use_legacy_v2_onions_checkbox": "Koristi nasleđene adrese",
+ "gui_save_private_key_checkbox": "Koristi trajnu adresu",
+ "gui_share_url_description": "<b>Svako</b> sa ovom OnionShare sdresom može <b>preuzeti</b> tvoje datoteke koristeći <b>Tor Browser</b>: <img src='{}' />",
+ "gui_website_url_description": "<b>Svako</b> sa ovom OnionShare adresom može <b>posetiti</b> tvoju veb-stranicu koristeći <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Svako</b> sa ovom OnionShare adresom može <b>poslati</b> datoteke na tvoj računar koristeći <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Ovo deljenje neće se automatski zaustaviti. <br> <br>Svako sledeće deljenje ponovo koristi istu adresu. (Da bi koristio jednokratnu adresu, isključi opciju \"koristi trajnu adresu\" u podešavanjima.)",
+ "gui_url_label_stay_open": "Ovaj deljenje neće se automatski zaustaviti.",
+ "gui_url_label_onetime": "Ovaj deljenje će se zaustaviti nakon prvog dovršenja.",
+ "gui_url_label_onetime_and_persistent": "Ovaj deljenje neće se automatski zaustaviti. <br> <br>Svako naredno deljenje ponovo će koristiti istu adresu. (Da bi koristio jednokratnu adresu, isključi opciju \"Koristi trajnu adresu\" u podešavanjima.)",
+ "gui_status_indicator_share_stopped": "Spremno za deljenje",
+ "gui_status_indicator_share_working": "Počinje…",
+ "gui_status_indicator_share_scheduled": "Planirano…",
+ "gui_status_indicator_share_started": "Deljenje",
+ "gui_status_indicator_receive_stopped": "Spremno za prijem",
+ "gui_status_indicator_receive_working": "Počinje…",
+ "gui_status_indicator_receive_scheduled": "Planirano…",
+ "gui_status_indicator_receive_started": "Primanje",
+ "gui_file_info": "{} datoteke, {}",
+ "gui_file_info_single": "{} datoteka, {}",
+ "history_in_progress_tooltip": "{} u toku",
+ "history_completed_tooltip": "{} završeno",
+ "history_requests_tooltip": "{} web zahtevi",
+ "error_cannot_create_data_dir": "Nije moguće kreirati OnionShare fasciklu sa podacima: {}",
+ "gui_receive_mode_warning": "Režim prijema dozvoljava korisnicima da šalju datoteke na tvoj računar. <br> <br> <b>Neke datoteke mogu da preuzmu kontrolu nad tvojim računarom ako ih otvoriš. Otvaraj samo stvari od ljudi kojima veruješ ili ako znaš šta radiš. </b>",
+ "gui_mode_share_button": "Podeli datoteke",
+ "gui_mode_receive_button": "Prijem datoteka",
+ "gui_mode_website_button": "Objavljivanje web stranice",
+ "gui_settings_receiving_label": "Podešavanja prijema",
+ "gui_settings_website_label": "Podešavanja web lokacije",
+ "gui_settings_data_dir_label": "Snimi datoteke u",
+ "gui_settings_data_dir_browse_button": "Potraži",
+ "gui_settings_public_mode_checkbox": "Javni režim",
+ "gui_open_folder_error_nautilus": "Nije moguće otvoriti fasciklu jer Nautilus nije dostupan. Datoteka je ovde: {}",
+ "gui_settings_language_label": "Željeni jezik",
+ "gui_settings_language_changed_notice": "Ponovo pokreni OnionShare da bi novi jezik bio primenjen.",
+ "systray_menu_exit": "Izađi",
+ "systray_page_loaded_title": "Stranica učitana",
+ "systray_page_loaded_message": "OnionShare adresa učitana",
+ "systray_share_started_title": "Deljenje započeto",
+ "systray_share_started_message": "Početak slanja datoteka nekome",
+ "systray_share_completed_title": "Deljenje završeno",
+ "systray_share_completed_message": "Slanje datoteka završeno",
+ "systray_share_canceled_title": "Deljenje otkazano",
+ "systray_share_canceled_message": "Neko je otkazao primanje tvojih datoteka",
+ "systray_receive_started_title": "Prijem započet",
+ "systray_receive_started_message": "Neko ti šalje datoteke",
+ "gui_all_modes_history": "Istorija",
+ "gui_all_modes_clear_history": "Izbriši sve",
+ "gui_all_modes_transfer_started": "Započeto {}",
+ "gui_all_modes_transfer_finished_range": "Preneto {}-{}",
+ "gui_all_modes_transfer_finished": "Preneto {}",
+ "gui_all_modes_transfer_canceled_range": "Otkazano {}-{}",
+ "gui_all_modes_transfer_canceled": "Otkazano {}",
+ "gui_all_modes_progress_complete": "% p%, {0: s} je proteklo.",
+ "gui_all_modes_progress_starting": "{0: s},% p% (proračunavam)",
+ "gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "gui_share_mode_no_files": "Nijedna datoteka još nije poslata",
+ "gui_share_mode_autostop_timer_waiting": "Čekam na završetak slanja",
+ "gui_website_mode_no_files": "Još nijedna web stranica nije podeljena",
+ "gui_receive_mode_no_files": "Još nijedna datoteka nije primljena",
+ "gui_receive_mode_autostop_timer_waiting": "Čekam na završetak prijema",
+ "receive_mode_upload_starting": "Slanje ukupne veličine od {} počinje",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
+}
diff --git a/desktop/share/locale/sv.json b/desktop/share/locale/sv.json
new file mode 100644
index 00000000..0015652a
--- /dev/null
+++ b/desktop/share/locale/sv.json
@@ -0,0 +1,275 @@
+{
+ "config_onion_service": "Förbereder onion-tjänsten på port {0:d}.",
+ "preparing_files": "Komprimera filer.",
+ "give_this_url": "Ge den här adressen till mottagaren:",
+ "give_this_url_stealth": "Ge den här adressen och HidServAuth-raden till mottagaren:",
+ "give_this_url_receive": "Ge denna adress till avsändaren:",
+ "give_this_url_receive_stealth": "Ge denna adress och HidServAuth till avsändaren:",
+ "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 port för att starta onion-tjänsten",
+ "other_page_loaded": "Adress inläst",
+ "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",
+ "large_filesize": "Varning: Att skicka en stor fil kan ta timmar",
+ "systray_menu_exit": "Avsluta",
+ "systray_download_started_title": "OnionShare Nedladdning Startad",
+ "systray_download_started_message": "En användare började ladda ner dina filer",
+ "systray_download_completed_title": "OnionShare Nedladdning Klar",
+ "systray_download_completed_message": "Användaren har laddat ner dina filer",
+ "systray_download_canceled_title": "OnionShare Nedladdning Avbruten",
+ "systray_download_canceled_message": "Användaren avbröt nedladdningen",
+ "systray_upload_started_title": "OnionShare Uppladdning Påbörjad",
+ "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_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_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 starta delning",
+ "gui_add": "Lägg till",
+ "gui_delete": "Ta bort",
+ "gui_choose_items": "Välj",
+ "gui_share_start_server": "Starta delning",
+ "gui_share_stop_server": "Avbryt delning",
+ "gui_share_stop_server_autostop_timer": "Stoppa delning ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Automatiska stopp-tidtagaren avslutar vid {}",
+ "gui_receive_start_server": "Starta mottagningsläge",
+ "gui_receive_stop_server": "Stoppa mottagningsläge",
+ "gui_receive_stop_server_autostop_timer": "Avsluta mottagningslä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",
+ "gui_no_downloads": "Inga Nedladdningar Än",
+ "gui_canceled": "Avbruten",
+ "gui_copied_url_title": "OnionShare-adress kopierad",
+ "gui_copied_url": "OnionShare-adress kopierad till urklipp",
+ "gui_copied_hidservauth_title": "HidServAuth Kopierad",
+ "gui_copied_hidservauth": "HidServAuth-rad kopierad till urklipp",
+ "gui_please_wait": "Startar... klicka för att avbryta.",
+ "gui_download_upload_progress_complete": "%p%, {0:s} förflutit.",
+ "gui_download_upload_progress_starting": "{0:s}, %p% (beräknar)",
+ "gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Inte så fort",
+ "gui_share_quit_warning": "Du håller på att skicka filer. Är du säker på att du vill avsluta OnionShare?",
+ "gui_receive_quit_warning": "Du håller på att ta emot filer. Är du säker på att du vill avsluta OnionShare?",
+ "gui_quit_warning_quit": "Avsluta",
+ "gui_quit_warning_dont_quit": "Avbryt",
+ "error_rate_limit": "Någon har gjort för många felaktiga försök att gissa ditt lösenord, därför har OnionShare stoppat servern. Starta delning igen och skicka mottagaren en ny adress att dela.",
+ "zip_progress_bar_format": "Komprimerar: %p%",
+ "error_stealth_not_supported": "För att använda klientauktorisering behöver du minst både Tor 0.2.9.1-alpha (eller Tor Browser 6.5) och python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare kräver minst både Tor 0.2.7.1 och python3-stem 1.4.0.",
+ "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 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: {}",
+ "gui_settings_autoupdate_timestamp_never": "Aldrig",
+ "gui_settings_autoupdate_check_button": "Sök efter ny version",
+ "gui_settings_general_label": "Allmänna inställningar",
+ "gui_settings_sharing_label": "Delningsinställningar",
+ "gui_settings_close_after_first_download_option": "Avbryt delning efter att filer har skickats",
+ "gui_settings_connection_type_label": "Hur ska OnionShare ansluta till Tor?",
+ "gui_settings_connection_type_bundled_option": "Använd Tor-versionen som är inbyggd i OnionShare",
+ "gui_settings_connection_type_automatic_option": "Försök automatisk konfiguration med Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Anslut med kontrollporten",
+ "gui_settings_connection_type_socket_file_option": "Anslut med socket-filen",
+ "gui_settings_connection_type_test_button": "Testa anslutning till Tor",
+ "gui_settings_control_port_label": "Kontrollport",
+ "gui_settings_socket_file_label": "Socket-fil",
+ "gui_settings_socks_label": "SOCKS-port",
+ "gui_settings_authenticate_label": "Tor-autentiseringsinställningar",
+ "gui_settings_authenticate_no_auth_option": "Ingen autentisering eller kak-autentisering",
+ "gui_settings_authenticate_password_option": "Lösenord",
+ "gui_settings_password_label": "Lösenord",
+ "gui_settings_tor_bridges": "Stöd för Tor-broar",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Använd inte broar",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Använd inbyggda obfs4 pluggbara transporter",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Använd inbyggda obfs4 pluggbara transporter (kräver obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Använd inbyggda meek_lite (Azure) pluggbara transporter",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Använd inbyggda meek_lite (Azure) pluggbara transporter (kräver obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Varning: meek_lite-broarna är mycket kostsamma för att Tor-projektet ska kunna köras.<br><br> Använd dem endast om det inte går att ansluta till Tor direkt, via obfs4-transporter eller andra normala broar.",
+ "gui_settings_tor_bridges_custom_radio_option": "Använd anpassade broar",
+ "gui_settings_tor_bridges_custom_label": "Du kan få broar från <a href=\"https://bridges.torproject.org/options?lang=sv\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Ingen av broarna du lagt till arbete.\nDubbelkolla dem eller lägga till andra.",
+ "gui_settings_button_save": "Spara",
+ "gui_settings_button_cancel": "Avbryt",
+ "gui_settings_button_help": "Hjälp",
+ "gui_settings_autostop_timer_checkbox": "Använd automatisk stopp-tidtagare",
+ "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å {}:{}.",
+ "settings_error_socket_file": "Det går inte att ansluta till Tor-regulatorn med socket-filen {}.",
+ "settings_error_auth": "Ansluten till {}:{}, men kan inte autentisera. Kanske är det här inte en Tor-regulator?",
+ "settings_error_missing_password": "Ansluten till Tor-regulatorn, men den kräver ett lösenord för att autentisera.",
+ "settings_error_unreadable_cookie_file": "Ansluten till Tor-regulatorn, men lösenordet kan vara fel, eller din användare är inte tillåtet att läsa kakfilen.",
+ "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:\n{}",
+ "settings_test_success": "Ansluten till Tor-regulatorn.\n\nTor-version: {}\nStöder efemära onion-tjänster: {}.\nStöder klientautentisering: {}.\nStöder nästa generations .onion-adresser: {}.",
+ "error_tor_protocol_error": "Det fanns ett fel med Tor: {}",
+ "error_tor_protocol_error_unknown": "Det fanns ett okänt fel med Tor",
+ "error_invalid_private_key": "Denna privata nyckeltyp stöds inte",
+ "connecting_to_tor": "Ansluter till Tor-nätverket",
+ "update_available": "Ny OnionShare utgiven. <a href='{}'>Klicka här</a> för att få den.<br><br>Du använder {} och den senaste är {}.",
+ "update_error_check_error": "Det gick inte att söka efter ny version: Kanske är du inte ansluten till Tor eller OnionShare-webbplatsen är nere?",
+ "update_error_invalid_latest_version": "Det gick inte att söka efter ny version: OnionShare-webbplatsen säger att den senaste versionen är den oigenkännliga \"{}\"…",
+ "update_not_available": "Du kör den senaste OnionShare.",
+ "gui_tor_connection_ask": "Öppna inställningarna för att sortera ut anslutning till Tor?",
+ "gui_tor_connection_ask_open_settings": "Ja",
+ "gui_tor_connection_ask_quit": "Avsluta",
+ "gui_tor_connection_error_settings": "Försök att ändra hur OnionShare ansluter till Tor-nätverket i inställningarna.",
+ "gui_tor_connection_canceled": "Kunde inte ansluta till Tor.\n\nSe till att du är ansluten till Internet, öppna sedan OnionShare igen och ställ in anslutningen till Tor.",
+ "gui_tor_connection_lost": "Frånkopplad från Tor.",
+ "gui_server_started_after_autostop_timer": "Tiden för den automatiska stopp-tidtagaren löpte ut innan servern startades.\nVänligen gör en ny delning.",
+ "gui_server_autostop_timer_expired": "Den automatiska stopp-tidtagaren har redan löpt ut. Vänligen justera den för att starta delning.",
+ "share_via_onionshare": "Dela 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='{}' />",
+ "gui_receive_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>skicka</b> filer till din dator med hjälp av <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Den här delningen kommer inte automatiskt att avslutas.<br>< br>Varje efterföljande delning återanvänder adressen. (För att använda engångsadresser, stäng av \"Använd beständig adress\" i inställningarna.)",
+ "gui_url_label_stay_open": "Denna delning kommer inte automatiskt att avslutas.",
+ "gui_url_label_onetime": "Denna delning kommer att sluta efter första slutförandet.",
+ "gui_url_label_onetime_and_persistent": "Den här delningen kommer inte automatiskt att avslutas.<br>< br>Varje efterföljande delning kommer att återanvända adressen. (För att använda engångsadresser, stäng av \"Använd beständig adress\" i inställningarna.)",
+ "gui_status_indicator_share_stopped": "Redo att dela",
+ "gui_status_indicator_share_working": "Startar…",
+ "gui_status_indicator_share_started": "Delar",
+ "gui_status_indicator_receive_stopped": "Redo att ta emot",
+ "gui_status_indicator_receive_working": "Startar…",
+ "gui_status_indicator_receive_started": "Tar emot",
+ "gui_file_info": "{} filer, {}",
+ "gui_file_info_single": "{} fil, {}",
+ "history_in_progress_tooltip": "{} pågår",
+ "history_completed_tooltip": "{} slutförda",
+ "info_in_progress_uploads_tooltip": "{} pågående sändning(ar)",
+ "info_completed_uploads_tooltip": "{} sändning(ar) slutförd(a)",
+ "error_cannot_create_downloads_dir": "Det gick inte att skapa mappen mottagningsläge: {}",
+ "receive_mode_downloads_dir": "Filer som skickas till dig visas i den här mappen: {}",
+ "receive_mode_warning": "Varning: Mottagningsläge låter personer skicka filer till din dator. Vissa filer kan potentiellt ta kontroll över din dator om du öppnar dem. Bara öppna saker från personer du litar på, eller om du vet vad du gör.",
+ "gui_receive_mode_warning": "Mottagningsläget låter personer skicka filer till din dator.<br><br><b>Vissa filer kan potentiellt ta kontroll över din dator om du öppnar dem. Öppna endast saker från personer du litar på eller om du vet vad du gör.</h>",
+ "receive_mode_upload_starting": "Sändning av total storlek {} börjar",
+ "receive_mode_received_file": "Mottaget: {}",
+ "gui_mode_share_button": "Dela filer",
+ "gui_mode_receive_button": "Ta emot filer",
+ "gui_settings_receiving_label": "Mottagningsinställningar",
+ "gui_settings_downloads_label": "Spara filer till",
+ "gui_settings_downloads_button": "Bläddra",
+ "gui_settings_public_mode_checkbox": "Offentligt läge",
+ "systray_close_server_title": "OnionShare-servern stängd",
+ "systray_close_server_message": "En användare stängde servern",
+ "systray_page_loaded_title": "Sidan lästes in",
+ "systray_download_page_loaded_message": "En användare läste in hämtningssidan",
+ "systray_upload_page_loaded_message": "En användare läste in sändningssidan",
+ "gui_uploads": "Sändningshistoriken",
+ "gui_no_uploads": "Inga sändningar ännu",
+ "gui_clear_history": "Rensa alla",
+ "gui_upload_in_progress": "Sändning påbörjad {}",
+ "gui_upload_finished_range": "Skickade {} till {}",
+ "gui_upload_finished": "Skickade {}",
+ "gui_download_in_progress": "Hämtning påbörjad {}",
+ "gui_open_folder_error_nautilus": "Det går inte att öppna mappen eftersom nautilus inte är tillgänglig. Filen är här: {}",
+ "gui_settings_language_label": "Föredraget språk",
+ "gui_settings_language_changed_notice": "Starta om OnionShare för att din språkändring ska träda i kraft.",
+ "gui_add_files": "Lägg till filer",
+ "gui_add_folder": "Lägg till mapp",
+ "gui_connect_to_tor_for_onion_settings": "Anslut till Tor för att se onion-tjänst-inställningar",
+ "error_cannot_create_data_dir": "Det gick inte att skapa OnionShare-datamapp: {}",
+ "receive_mode_data_dir": "Filer som skickas till dig visas i den här mappen: {}",
+ "gui_settings_data_dir_label": "Spara filer i",
+ "gui_settings_data_dir_browse_button": "Bläddra",
+ "systray_page_loaded_message": "OnionShare-adress lästes in",
+ "systray_share_started_title": "Delningen startades",
+ "systray_share_started_message": "Startar sändning av filer till någon",
+ "systray_share_completed_title": "Delning klar",
+ "systray_share_completed_message": "Filerna skickades",
+ "systray_share_canceled_title": "Delning avbruten",
+ "systray_share_canceled_message": "Någon har avbrutit att ta emot dina filer",
+ "systray_receive_started_title": "Mottagning startad",
+ "systray_receive_started_message": "Någon skickar filer till dig",
+ "gui_all_modes_history": "Historik",
+ "gui_all_modes_clear_history": "Rensa alla",
+ "gui_all_modes_transfer_started": "Startades {}",
+ "gui_all_modes_transfer_finished_range": "Överförd {} - {}",
+ "gui_all_modes_transfer_finished": "Överförd {}",
+ "gui_all_modes_progress_complete": "%p%, {0} förflutit.",
+ "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_autostop_timer_waiting": "Väntar på att avsluta sändningen",
+ "gui_receive_mode_no_files": "Inga filer har mottagits ännu",
+ "gui_receive_mode_autostop_timer_waiting": "Väntar på att ta emot mottagningen",
+ "gui_all_modes_transfer_canceled_range": "Avbröt {} - {}",
+ "gui_all_modes_transfer_canceled": "Avbröt {}",
+ "gui_settings_onion_label": "Inställningar för Onion",
+ "gui_stop_server_autostop_timer_tooltip": "Automatisk stopp-tidtagare slutar vid {}",
+ "gui_start_server_autostart_timer_tooltip": "Automatisk start-tidtagare slutar vid {}",
+ "gui_waiting_to_start": "Planerad för att starta i {}. Klicka för att avbryta.",
+ "gui_settings_autostart_timer_checkbox": "Använd automatisk start-tidtagare",
+ "gui_settings_autostart_timer": "Starta delning vid:",
+ "gui_server_autostart_timer_expired": "Den schemalagda tiden har redan passerat. Vänligen justera den för att starta delning.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Den automatiska stopp-tiden kan inte vara samma eller tidigare än den automatiska starttiden. Vänligen justera den för att starta delning.",
+ "gui_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",
+ "invalid_password_guess": "Ogiltig lösenordsgissning",
+ "gui_website_url_description": "<b>Någon</b> med denna OnionShare-adress kan <b>besöka</b> din webbplats med hjälp av <b>Tor Browser</b>: <img src='{}' />",
+ "gui_mode_website_button": "Publicera webbplats",
+ "systray_site_loaded_title": "Webbplats inläst",
+ "systray_site_loaded_message": "OnionShare-webbplats inläst",
+ "systray_website_started_title": "Börjar dela webbplats",
+ "systray_website_started_message": "Någon besöker din webbplats",
+ "gui_website_mode_no_files": "Ingen webbplats delas ännu",
+ "gui_visit_started": "Någon har besökt din webbplats {}",
+ "incorrect_password": "Felaktigt lösenord",
+ "gui_settings_individual_downloads_label": "Avmarkera för att tillåta hämtning av enskilda filer",
+ "history_requests_tooltip": "{} webbförfrågningar",
+ "systray_individual_file_downloaded_title": "Enskild fil inläst",
+ "systray_individual_file_downloaded_message": "Individuell fil {} visad",
+ "gui_settings_website_label": "Webbplatsinställningar",
+ "gui_settings_csp_header_disabled_option": "Inaktivera rubriken för innehållssäkerhetspolicy",
+ "gui_close_tab_warning_persistent_description": "Den här fliken är beständig. Om du stänger den förlorar du onion-adressen som den använder. Är du säker på att du vill stänga den?",
+ "mode_settings_website_disable_csp_checkbox": "Inaktivera rubriken för innehållssäkerhetspolicy (tillåter din webbplats att använda resurser från tredje part)",
+ "mode_settings_receive_data_dir_browse_button": "Bläddra",
+ "mode_settings_receive_data_dir_label": "Spara filer till",
+ "mode_settings_share_autostop_sharing_checkbox": "Stoppa delning efter att filer har skickats (avmarkera för att tillåta hämtning av enskilda filer)",
+ "mode_settings_client_auth_checkbox": "Använd klientauktorisering",
+ "mode_settings_legacy_checkbox": "Använd en äldre adress (v2 oniontjänst, rekommenderas inte)",
+ "mode_settings_autostart_timer_checkbox": "Starta oniontjänsten vid schemalagd tid",
+ "mode_settings_autostop_timer_checkbox": "Stoppa oniontjänsten vid schemalagd tid",
+ "mode_settings_public_checkbox": "Använd inte ett lösenord",
+ "mode_settings_persistent_checkbox": "Spara den här fliken och öppna den automatiskt när jag öppnar OnionShare",
+ "mode_settings_advanced_toggle_hide": "Dölj avancerade inställningar",
+ "mode_settings_advanced_toggle_show": "Visa avancerade inställningar",
+ "gui_quit_warning_cancel": "Avbryt",
+ "gui_quit_warning_description": "Delning är aktiv i några av dina flikar. Om du avslutar stängs alla dina flikar. Är du säker på att du vill avsluta?",
+ "gui_quit_warning_title": "Är du säker?",
+ "gui_close_tab_warning_cancel": "Avbryt",
+ "gui_close_tab_warning_close": "Stäng",
+ "gui_close_tab_warning_website_description": "Du är aktivt värd för en webbplats. Är du säker på att du vill stänga den här fliken?",
+ "gui_close_tab_warning_receive_description": "Du håller på att ta emot filer. Är du säker på att du vill stänga den här fliken?",
+ "gui_close_tab_warning_share_description": "Du håller på att skicka filer. Är du säker på att du vill stänga den här fliken?",
+ "gui_close_tab_warning_title": "Är du säker?",
+ "gui_new_tab_website_description": "Var värd till en statisk HTML-onionwebbplats från din dator.",
+ "gui_new_tab_website_button": "Publicera webbplats",
+ "gui_new_tab_receive_description": "Förvandla din dator till en dropbox på nätet. Personer kommer att kunna använda Tor Browser för att skicka filer till din dator.",
+ "gui_new_tab_receive_button": "Ta emot filer",
+ "gui_new_tab_share_description": "Välj filer på din dator för att skicka till någon annan. Den eller de personer som du vill skicka filer till måste använda Tor Browser för att hämta dem från dig.",
+ "gui_new_tab_share_button": "Dela filer",
+ "gui_new_tab_tooltip": "Öppna en ny flik",
+ "gui_new_tab": "Ny flik"
+}
diff --git a/desktop/share/locale/sw.json b/desktop/share/locale/sw.json
new file mode 100644
index 00000000..74707f3c
--- /dev/null
+++ b/desktop/share/locale/sw.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": "Mipangilio ya kawaida",
+ "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": "Ndio",
+ "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": "Vinjari",
+ "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/desktop/share/locale/te.json b/desktop/share/locale/te.json
new file mode 100644
index 00000000..9f738318
--- /dev/null
+++ b/desktop/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": "స్వీకరించు రీతిని ఆపివేయి ({} మిగిలినది)",
+ "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/desktop/share/locale/tr.json b/desktop/share/locale/tr.json
new file mode 100644
index 00000000..ac652abf
--- /dev/null
+++ b/desktop/share/locale/tr.json
@@ -0,0 +1,257 @@
+{
+ "preparing_files": "Dosyalar sıkıştırılıyor.",
+ "give_this_url": "Bu adresi alıcıya verin:",
+ "ctrlc_to_stop": "Sunucuyu durdurmak için, Ctrl+C'ye basın",
+ "not_a_file": "{0:s} dosya değil.",
+ "other_page_loaded": "Adres yüklendi",
+ "closing_automatically": "Aktarım tamamlandığından durduruldu",
+ "large_filesize": "Uyarı: Büyük bir paylaşı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": "Paylaşmaya başlamak için dosya ve klasörleri sürükleyip bırakın",
+ "gui_add": "Ekle",
+ "gui_delete": "Sil",
+ "gui_choose_items": "Seçin",
+ "gui_share_start_server": "Paylaşımı başlat",
+ "gui_share_stop_server": "Paylaşımı durdur",
+ "gui_copy_url": "Adresi Kopyala",
+ "gui_downloads": "İndirilenler:",
+ "gui_canceled": "İptal edilen",
+ "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 hizmetinin başlatılacağı uygun bir kapı numarası bulunamadı",
+ "close_on_autostop_timer": "Otomatik durdurma sayacı sona erdiğinden durduruldu",
+ "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": "Klasör 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 Kipini 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önderiyorsunuz. OnionShare uygulamasından çıkmak istediğinize emin misiniz?",
+ "gui_receive_quit_warning": "Dosya alıyorsunuz. OnionShare uygulamasından çıkmak istediğinize emin misiniz?",
+ "gui_quit_warning_quit": "Çık",
+ "gui_quit_warning_dont_quit": "İptal",
+ "error_rate_limit": "Birisi şifrenizi tahmin etmek için çok fazla yanlış girişimde bulundu, bu yüzden 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 kimlik doğrulamasını kullanmak için, en az Tor 0.2.9.1-alpha (ya da Tor Browser 6.5) ve python3-stem 1.5.0 sürümleri gereklidir.",
+ "error_ephemeral_not_supported": "OnionShare için en az Tor 0.2.7.1 ve python3-stem 1.4.0 sürümleri gereklidir.",
+ "gui_settings_window_title": "Ayarlar",
+ "gui_settings_whats_this": "<a href='{0:s}'>Bu nedir?</a>",
+ "gui_settings_stealth_option": "İstemci kimlik doğrulaması kullanılsın",
+ "gui_settings_stealth_hidservauth_string": "Özel anahtarınızı yeniden kullanmak üzere kaydettiğinizden, tıklayarak HidServAuth verinizi kopyalabilirsiniz.",
+ "gui_settings_autoupdate_label": "Yeni sürümü denetle",
+ "gui_settings_autoupdate_option": "Yeni yayınlanan sürümler bildirilsin",
+ "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 durdurulsun",
+ "gui_settings_connection_type_label": "OnionShare, Tor ile nasıl bağlanmalı?",
+ "gui_settings_connection_type_bundled_option": "OnionShare üzerindeki 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": "Denetim kapı numarası ile bağlan",
+ "gui_settings_connection_type_socket_file_option": "Socket dosyasını kullanarak bağlan",
+ "gui_settings_connection_type_test_button": "Tor Bağlantısını Sına",
+ "gui_settings_control_port_label": "Denetim kapı numarası",
+ "gui_settings_socket_file_label": "Socket dosyası",
+ "gui_settings_socks_label": "SOCKS kapı numarası",
+ "gui_settings_authenticate_label": "Tor kimlik doğrulama ayarları",
+ "gui_settings_authenticate_no_auth_option": "Kimlik doğrulama ya da çerez doğrulaması yok",
+ "gui_settings_authenticate_password_option": "Parola",
+ "gui_settings_password_label": "Parola",
+ "gui_settings_tor_bridges": "Tor köprü desteği",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Köprüler kullanılmasın",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Hazır obfs4 değiştirilebilir taşıyıcıları kullanılsın",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Hazır obfs4 değiştirilebilir taşıyıcıları kullanılsın (obfs4proxy gerektirir)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Hazır meek_lite (Azure) değiştirilebilir taşıyıcıları kullanılsın",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Hazır meek_lite (Azure) değiştirilebilir taşıyıcıları kullanılsın (obfs4proxy gerektirir)",
+ "gui_settings_meek_lite_expensive_warning": "Uyarı: meek_lit köprülerini çalıştırmak Tor Projesine pahalıya patlıyor.<br><br>Bu köprüleri yalnız Tor ile doğrudan ya da obfs4 ve diğer normal köprüler üzerinden bağlantı kuramıyorsanız kullanın.",
+ "gui_settings_tor_bridges_custom_radio_option": "Özel köprüler kullanılsın",
+ "gui_settings_tor_bridges_custom_label": "Köprüleri <a href=\"https://bridges.torproject.org/options?lang=tr\">https://bridges.torproject.org</a> adresinden alabilirsiniz",
+ "gui_settings_tor_bridges_invalid": "Eklediğiniz köprülerin hiçbiri çalışmıyor.\nİki kez denetleyin ya da başka köprüler ekleyin.",
+ "gui_settings_button_save": "Kaydet",
+ "gui_settings_button_cancel": "İptal",
+ "gui_settings_button_help": "Yardım",
+ "gui_settings_autostop_timer_checkbox": "Otomatik durdurma sayacı kullanılsın",
+ "gui_settings_autostop_timer": "Paylaşımı durdurma zamanı:",
+ "settings_error_unknown": "Ayarlarınız mantıklı olmadığından Tor denetleyicisine bağlanılamıyor.",
+ "settings_error_automatic": "Tor denetleyicisi ile bağlantı kurulamadı. Arka planda Tor Browser (torproject.org adresinden temin edilebilir) çalışıyor olabilir mi?",
+ "settings_error_socket_port": "{}:{} adresinden Tor denetleyicisi ile bağlantı kurulamadı.",
+ "settings_error_socket_file": "{} socket dosyası kullanılarak Tor denetleyicisi ile bağlantı kurulamadı.",
+ "settings_error_auth": "{}:{} bağlantısı kuruldu, ancak kimlik doğrulaması yapılamadı. Bu bir Tor denetleyicisi olmayabilir mi?",
+ "settings_error_missing_password": "Tor denetleyicisi ile bağlantı kuruldu, ancak kimlik doğrulaması için parola gerekiyor.",
+ "settings_error_unreadable_cookie_file": "Tor denetleyicisi ile bağlantı kuruldu, ancak parola yanlış ya da kullanıcının çerez dosyasını okumasına izin verilmiyor.",
+ "settings_error_bundled_tor_not_supported": "OnionShare üzerinde gelen Tor sürümü, Windows ya da macOS üzerinde geliştirici kipinde çalışmaz.",
+ "settings_error_bundled_tor_timeout": "Tor bağlantısının kurulması gecikiyor. İnternet bağlantınız kesik ya da sistem saatiniz hatalı olabilir mi?",
+ "settings_error_bundled_tor_broken": "OnionShare, Tor ile bağlantı kuramadı:\n{}",
+ "settings_test_success": "Tor denetleyicisi ile bağlantı kuruldu.\n\nTor sürümü: {}\nGeçici onion hizmetleri desteği: {}.\nİstemci kimlik doğrulaması desteği: {}.\nYeni nesil .onion adresleri desteği: {}.",
+ "error_tor_protocol_error": "Tor ile ilgili bir sorun çıktı: {}",
+ "error_tor_protocol_error_unknown": "Tor ile ilgili bilinmeyen bir sorun çıktı",
+ "error_invalid_private_key": "Bu özel anahtar türü desteklenmiyor",
+ "connecting_to_tor": "Tor ağı ile bağlantı kuruluyor",
+ "update_available": "Yeni bir OnionShare sürümü yayınlanmış. Almak için <a href='{}'>buraya tıklayın</a>.<br><br>Kullandığınız sürüm {}, Son sürüm {}.",
+ "update_error_check_error": "Yeni sürüm denetlenemedi: Tor bağlantınız kesik ya da OnionShare web sitesi kapalı olabilir mi?",
+ "update_error_invalid_latest_version": "Yeni sürüm denetlenemedi: OnionShare web sitesi en son sürümün anlaşılamayan '{}' olduğunu bildiriyor…",
+ "update_not_available": "En son OnionShare sürümünü kullanıyorsunuz.",
+ "gui_tor_connection_ask": "Tor bağlantı sorunlarını çö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 ayarlarından Tor ağı ile bağlantı kurma yöntemini değiştirmeyi deneyin.",
+ "gui_tor_connection_canceled": "Tor bağlantısı kurulamadı.\n\nİnternet bağlantınızın çalıştığından emin olduktan sonra OnionShare uygulamasını yeniden açın ve Tor bağlantısını kurun.",
+ "gui_tor_connection_lost": "Tor bağlantısı kesildi.",
+ "gui_server_started_after_autostop_timer": "Otomatik durdurma sayacı, sunucu başlamadan önce sona erdi. Lütfen yeni bir paylaşım yapın.",
+ "gui_server_autostop_timer_expired": "Otomatik durma sayacı zaten sona ermiş. Paylaşmaya başlamak için sayacı ayarlayın.",
+ "share_via_onionshare": "OnionShare ile paylaş",
+ "gui_connect_to_tor_for_onion_settings": "Onion hizmet ayarlarını görmek için Tor bağlantısı kurun",
+ "gui_use_legacy_v2_onions_checkbox": "Eski adresler kullanılsın",
+ "gui_save_private_key_checkbox": "Kalıcı bir adres kullanılsı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 durdurulmayacak.<br><br>Sonraki her paylaşım adresi yeniden kullanır (Bir kerelik adresleri kullanmak için, ayarlardan \"Kalıcı adres kullanılsın\" seçeneğini devre dışı bırakın.)",
+ "gui_url_label_stay_open": "Bu paylaşım otomatik olarak durdurulmayacak.",
+ "gui_url_label_onetime": "Bu paylaşım bir kez tamamlandıktan sonra durdurulur.",
+ "gui_url_label_onetime_and_persistent": "Bu paylaşım otomatik olarak durdurulmayacak.<br><br>Sonraki her paylaşım adresi yeniden kullanır (Bir kerelik adresleri kullanmak için, ayarlardan \"Kalıcı adres kullanılsın\" seçeneğini devre dışı bırakın.)",
+ "gui_status_indicator_share_stopped": "Paylaşmaya hazır",
+ "gui_status_indicator_share_working": "Başlatılıyor…",
+ "gui_status_indicator_share_started": "Paylaşılıyor",
+ "gui_status_indicator_receive_stopped": "Almaya hazır",
+ "gui_status_indicator_receive_working": "Başlatılıyor…",
+ "gui_status_indicator_receive_started": "Alınıyor",
+ "gui_file_info": "{} dosya, {}",
+ "gui_file_info_single": "{} dosya, {}",
+ "history_in_progress_tooltip": "{} sürüyor",
+ "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 başkalarının bilgisayarınıza dosya yüklemesini sağlar.<br><br><b>Bazı dosyalar, açtığınızda bilgisayarınızın denetimini ele geçirebilir. Yükleme paylaşımını yalnız güvendiğiniz kişilere ya da ne yaptığınızdan eminseniz herkese açın.</b>",
+ "receive_mode_upload_starting": "Toplam boyutu {} olan karşıya yükleme başlatı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öz at",
+ "gui_settings_public_mode_checkbox": "Herkese açık kip",
+ "gui_open_folder_error_nautilus": "Nautilus kullanılamadığından klasör açılamıyor. Dosya burada: {}",
+ "gui_settings_language_label": "Kullanılacak dil",
+ "gui_settings_language_changed_notice": "Dil değişikliğinin uygulanabilmesi için OnionShare uygulamasını 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şım Başlatıldı",
+ "systray_share_started_message": "Birine dosya gönderilmeye başlanıyor",
+ "systray_share_completed_title": "Paylaşım Tamamlandı",
+ "systray_share_completed_message": "Dosyalar gönderildi",
+ "systray_share_canceled_title": "Paylaşım İptal Edildi",
+ "systray_share_canceled_message": "Birisi dosyalarınızı almayı iptal etti",
+ "systray_receive_started_title": "Alma Başlatıldı",
+ "systray_receive_started_message": "Birisi size dosyalar gönderiyor",
+ "gui_all_modes_history": "Geçmiş",
+ "gui_all_modes_clear_history": "Tümünü Temizle",
+ "gui_all_modes_transfer_started": "Başlatıldı {}",
+ "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}, Öngörülen yükleme zamanı: {1:s}, %p%",
+ "gui_share_mode_no_files": "Henüz Bir 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 sayacı bitişi {}",
+ "gui_start_server_autostart_timer_tooltip": "Otomatik başlatma sayacı bitişi {}",
+ "gui_waiting_to_start": "{} içinde başlamaya zamanlanmış. İptal etmek için tıklayın.",
+ "gui_settings_autostart_timer_checkbox": "Otomatik başlatma sayacı kullanılsın",
+ "gui_settings_autostart_timer": "Paylaşımı başlatma zamanı:",
+ "gui_server_autostart_timer_expired": "Zamanlanan süre zaten geçti. Paylaşmaya başlamak için ayarlayın.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Otomatik durdurma zamanı, otomatik başlatma zamanı ile aynı veya daha önce olamaz. Paylaşmaya başlamak için ayarlayın.",
+ "gui_status_indicator_share_scheduled": "Zamanlanmış…",
+ "gui_status_indicator_receive_scheduled": "Zamanlanmış…",
+ "gui_share_mode_autostop_timer_waiting": "Gönderme işleminin bitmesi bekleniyor",
+ "gui_receive_mode_autostop_timer_waiting": "Alma işleminin bitmesi bekleniyor",
+ "days_first_letter": "g",
+ "hours_first_letter": "s",
+ "minutes_first_letter": "d",
+ "seconds_first_letter": "sn",
+ "invalid_password_guess": "Geçersiz parola tahmini",
+ "gui_website_url_description": "Bu OnionShare adresi olan <b>herkes</b>, <b>Tor Browser</b>'ı kullanarak web sitenizi <b>ziyaret</b> edebilir: <img src='{}' />",
+ "gui_mode_website_button": "Web Sitesini Yayınla",
+ "gui_website_mode_no_files": "Henüz Paylaşılan Web Sitesi Yok",
+ "incorrect_password": "Hatalı Parola",
+ "gui_settings_individual_downloads_label": "Dosyaların tek tek indirilmesine izin vermek için işareti kaldırın",
+ "history_requests_tooltip": "{} web isteği",
+ "gui_settings_csp_header_disabled_option": "İçerik Güvenlik Politikası başlığını devre dışı bırak",
+ "gui_settings_website_label": "Website ayarları",
+ "mode_settings_website_disable_csp_checkbox": "İçerik Güvenlik Politikası başlığını devre dışı bırak (web sitenizin üçüncü taraf kaynaklarını kullanmasına izin verir)",
+ "mode_settings_receive_data_dir_browse_button": "Göz at",
+ "mode_settings_receive_data_dir_label": "Dosyaları şuraya kaydet",
+ "mode_settings_share_autostop_sharing_checkbox": "Dosyalar gönderildikten sonra paylaşımı durdur (dosyaların tek tek indirilmesine izin vermek için işareti kaldırın)",
+ "mode_settings_client_auth_checkbox": "İstemci kimlik doğrulaması kullanılsın",
+ "mode_settings_legacy_checkbox": "Eski bir adres kullan (v2 onion hizmeti, tavsiye edilmez)",
+ "mode_settings_autostop_timer_checkbox": "Onion hizmetini planlanan zamanda durdur",
+ "mode_settings_autostart_timer_checkbox": "Onion hizmetini planlanan zamanda başlat",
+ "mode_settings_public_checkbox": "Parola kullanma",
+ "mode_settings_persistent_checkbox": "Bu sekmeyi kaydet ve OnionShare'i açtığımda otomatik olarak aç",
+ "mode_settings_advanced_toggle_hide": "Gelişmiş ayarları gizle",
+ "mode_settings_advanced_toggle_show": "Gelişmiş ayarları göster",
+ "gui_quit_warning_cancel": "İptal",
+ "gui_quit_warning_description": "Bazı sekmelerinizde paylaşım etkin. Çıkarsanız tüm sekmeleriniz kapanacaktır. Çıkmak istediğinizden emin misiniz?",
+ "gui_quit_warning_title": "Emin misiniz?",
+ "gui_close_tab_warning_cancel": "İptal",
+ "gui_close_tab_warning_close": "Kapat",
+ "gui_close_tab_warning_website_description": "Aktif olarak bir web sitesi barındırıyorsunuz. Bu sekmeyi kapatmak istediğinizden emin misiniz?",
+ "gui_close_tab_warning_receive_description": "Dosya alma işlemi devam ediyor. Bu sekmeyi kapatmak istediğinizden emin misiniz?",
+ "gui_close_tab_warning_share_description": "Dosya gönderme işlemi devam ediyor. Bu sekmeyi kapatmak istediğinizden emin misiniz?",
+ "gui_close_tab_warning_persistent_description": "Bu sekme kalıcıdır. Kapatırsanız, kullandığı onion adresini kaybedeceksiniz. Kapatmak istediğinizden emin misiniz?",
+ "gui_new_tab_website_description": "Bilgisayarınızda statik bir HTML onion web sitesi barındırın.",
+ "gui_new_tab_website_button": "Web Sitesi Yayınla",
+ "gui_new_tab_receive_description": "Bilgisayarınızı çevrim içi bir dropbox'a dönüştürün. İnsanlar bilgisayarınıza dosya göndermek için Tor Browser kullanabilecekler.",
+ "gui_new_tab_receive_button": "Alınan Dosyalar",
+ "gui_new_tab_share_description": "Başka birine göndermek için bilgisayarınızdaki dosyaları seçin. Dosya göndermek istediğiniz kişi veya kişilerin sizden indirmek için Tor Browser kullanması gerekecektir.",
+ "gui_new_tab_share_button": "Paylaşılan Dosyalar",
+ "gui_close_tab_warning_title": "Emin misiniz?",
+ "gui_new_tab_tooltip": "Yeni bir sekme aç",
+ "gui_new_tab": "Yeni Sekme",
+ "gui_remove": "Kaldır",
+ "gui_file_selection_remove_all": "Tümünü Kaldır",
+ "gui_chat_start_server": "Sohbet sunucusu başlat",
+ "gui_chat_stop_server": "Sohbet sunucusunu durdur",
+ "gui_receive_flatpak_data_dir": "OnionShare'i Flatpak kullanarak kurduğunuz için, dosyaları ~/OnionShare içindeki bir klasöre kaydetmelisiniz.",
+ "gui_show_url_qr_code": "QR Kodu Göster",
+ "gui_qr_code_dialog_title": "OnionShare QR Kodu",
+ "gui_qr_code_description": "OnionShare adresini bir başkasıyla daha kolay paylaşmak için bu QR kodunu telefonunuzdaki kamera gibi bir QR okuyucuyla tarayın.",
+ "gui_open_folder_error": "Klasör xdg-open ile açılamadı. Dosya burada: {}",
+ "gui_new_tab_chat_button": "Anonim Sohbet",
+ "gui_main_page_share_button": "Paylaşımı Başlat",
+ "gui_main_page_receive_button": "Almayı Başlat",
+ "gui_main_page_website_button": "Barındırmayı Başlat",
+ "gui_main_page_chat_button": "Sohbeti Başlat",
+ "gui_tab_name_share": "Paylaş",
+ "gui_tab_name_receive": "Al",
+ "gui_tab_name_website": "Web Sitesi",
+ "gui_tab_name_chat": "Sohbet"
+}
diff --git a/desktop/share/locale/uk.json b/desktop/share/locale/uk.json
new file mode 100644
index 00000000..418b3f47
--- /dev/null
+++ b/desktop/share/locale/uk.json
@@ -0,0 +1,232 @@
+{
+ "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": "Перетягніть файли та теки для надсилання",
+ "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 Project. <br> <br>Користуйтеся ними лише якщо не вдається з'єднатися з Tor безпосередньо, через obfs4 транспорти або інші звичайні мости.",
+ "gui_settings_tor_bridges_custom_radio_option": "Застосовувати власні мости",
+ "gui_settings_tor_bridges_custom_label": "Ви можете отримати мости з <a href=\"https://bridges.torproject.org/options?lang=uk\">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": "Не вдалося перевірити наявність нових версій: можливо, ви не під'єднані до Tor або вебсайт OnionShare не працює?",
+ "update_error_invalid_latest_version": "Не вдалося перевірити наявність нової версії: вебсайт OnionShare повідомляє, що не вдалося розпізнати найновішу версію '{}'…",
+ "update_not_available": "У вас найновіша версія OnionShare.",
+ "gui_tor_connection_ask": "Відкрити параметри для перевірки з'єднання з Tor?",
+ "gui_tor_connection_ask_open_settings": "Так",
+ "gui_tor_connection_ask_quit": "Вийти",
+ "gui_tor_connection_error_settings": "Спробуйте змінити в параметрах, як OnionShare з'єднується з мережею Tor.",
+ "gui_tor_connection_canceled": "Не вдалося під'єднатися до Tor. \n\nПереконайтеся, що ви під'єднані до мережі Інтернет, відкрийте OnionShare знову і налаштуйте з'єднання з Tor.",
+ "gui_tor_connection_lost": "Від'єднано від Tor.",
+ "gui_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}, ETA: {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": "с",
+ "gui_website_url_description": "<b>Будь-хто</b> за допомогою цієї адреси OnionShare може <b>відвідати</b> ваш вебсайт через <b>Tor Browser</b>: <img src='{}' />",
+ "gui_mode_website_button": "Опублікувати вебсайт",
+ "gui_website_mode_no_files": "Немає опублікованих вебсайтів",
+ "incorrect_password": "Неправильний пароль",
+ "gui_settings_individual_downloads_label": "Приберіть позначку, щоб дозволити завантаження окремих файлів",
+ "history_requests_tooltip": "{} вебзапити",
+ "gui_settings_csp_header_disabled_option": "Відключити заголовок Політики захисту вмісту (CSP)",
+ "gui_settings_website_label": "Налаштування вебсайту",
+ "gui_close_tab_warning_persistent_description": "Це усталена вкладка. Якщо ви закриєте її, ви втратите onion-адресу, яку вона використовує. Ви впевнені, що хочете закрити її?",
+ "gui_close_tab_warning_website_description": "Ви маєте активний розміщений вебсайт. Ви впевнені, що хочете закрити цю вкладку?",
+ "gui_new_tab_website_description": "Розмістіть статичний onion HTML-вебсайт на вашому комп'ютері.",
+ "mode_settings_receive_data_dir_browse_button": "Вибрати",
+ "mode_settings_website_disable_csp_checkbox": "Не надсилати заголовок політики безпеки вмісту (дозволяє вебсайту застосовувати сторонні ресурси)",
+ "mode_settings_receive_data_dir_label": "Зберігати файли до",
+ "mode_settings_share_autostop_sharing_checkbox": "Закрити доступ, коли файли надіслано (приберіть позначку, щоб дозволити завантаження окремих файлів)",
+ "mode_settings_client_auth_checkbox": "Застосовувати авторизацію клієнта",
+ "mode_settings_legacy_checkbox": "Користуватися застарілою адресою (служба onion v2, не рекомендовано)",
+ "mode_settings_autostop_timer_checkbox": "Зупинити службу onion у запланований час",
+ "mode_settings_autostart_timer_checkbox": "Запускати службу onion у запланований час",
+ "mode_settings_public_checkbox": "Не використовувати пароль",
+ "mode_settings_persistent_checkbox": "Зберегти цю вкладку та автоматично відкривати її, коли я відкриваю OnionShare",
+ "mode_settings_advanced_toggle_hide": "Сховати розширені налаштування",
+ "mode_settings_advanced_toggle_show": "Показати розширені налаштування",
+ "gui_quit_warning_description": "На деяких ваших вкладках триває обмін файлами. Якщо ви вийдете, це призведе до закриття всіх вкладок. Ви справді хочете вийти?",
+ "gui_close_tab_warning_receive_description": "Триває отримання файлів. Ви впевнені, що хочете закрити цю вкладку?",
+ "gui_close_tab_warning_share_description": "Триває надсилання ваших файлів. Ви впевнені, що хочете закрити цю вкладку?",
+ "gui_new_tab_website_button": "Опублікувати вебсайт",
+ "gui_new_tab_receive_description": "Перетворіть ваш комп’ютер на онлайн-обмінник. Люди зможуть надсилати файли на ваш комп’ютер за допомогою браузера Tor.",
+ "gui_new_tab_receive_button": "Отримання файлів",
+ "gui_new_tab_share_button": "Надсилання файлів",
+ "gui_new_tab_share_description": "Виберіть файли на вашому комп'ютері, щоб надіслати їх іншому користувачу. Особа або люди, яким ви хочете надіслати файли, повинні скористатись переглядачем Tor для їхнього отримання.",
+ "gui_quit_warning_cancel": "Скасувати",
+ "gui_quit_warning_title": "Ви впевнені?",
+ "gui_close_tab_warning_cancel": "Скасувати",
+ "gui_close_tab_warning_close": "Закрити",
+ "gui_close_tab_warning_title": "Ви впевнені?",
+ "gui_new_tab_tooltip": "Відкрити нову вкладку",
+ "gui_new_tab": "Нова вкладка",
+ "gui_file_selection_remove_all": "Вилучити всі",
+ "gui_remove": "Вилучити",
+ "gui_new_tab_chat_button": "Анонімне спілкування",
+ "gui_open_folder_error": "Не вдалося відкрити теку за допомогою xdg- open. Файл тут: {}",
+ "gui_tab_name_chat": "Спілкування",
+ "gui_tab_name_website": "Вебсайт",
+ "gui_tab_name_receive": "Отримати",
+ "gui_tab_name_share": "Поділитися",
+ "gui_qr_code_description": "Скануйте цей QR-код за допомогою зчитувача QR, наприклад камери на телефоні, щоб простіше надіслати комусь адресу OnionShare.",
+ "gui_receive_flatpak_data_dir": "Оскільки ви встановили OnionShare за допомогою Flatpak, ви повинні зберігати файли в теці ~/OnionShare.",
+ "gui_chat_stop_server": "Зупинити сервер чату",
+ "gui_chat_start_server": "Запустити сервер чату",
+ "gui_chat_stop_server_autostop_timer": "Зупинити сервер чату ({})",
+ "gui_qr_code_dialog_title": "QR-код OnionShare",
+ "gui_show_url_qr_code": "Показати QR-код",
+ "gui_main_page_share_button": "Почати надсилання",
+ "gui_main_page_chat_button": "Почати спілкуватися в чаті",
+ "gui_main_page_website_button": "Почати хостинг",
+ "gui_main_page_receive_button": "Почати отримання"
+}
diff --git a/desktop/share/locale/wo.json b/desktop/share/locale/wo.json
new file mode 100644
index 00000000..89d732b3
--- /dev/null
+++ b/desktop/share/locale/wo.json
@@ -0,0 +1,185 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_receive_allow_receiver_shutdown_checkbox": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/yo.json b/desktop/share/locale/yo.json
new file mode 100644
index 00000000..96b5a0d1
--- /dev/null
+++ b/desktop/share/locale/yo.json
@@ -0,0 +1,185 @@
+{
+ "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": "",
+ "timeout_download_still_running": "",
+ "timeout_upload_still_running": "",
+ "large_filesize": "",
+ "systray_menu_exit": "",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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_downloads": "",
+ "gui_no_downloads": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "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": "",
+ "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_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_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": "",
+ "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": "",
+ "gui_settings_downloads_label": "",
+ "gui_settings_downloads_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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": ""
+}
diff --git a/desktop/share/locale/zh_Hans.json b/desktop/share/locale/zh_Hans.json
new file mode 100644
index 00000000..072499a1
--- /dev/null
+++ b/desktop/share/locale/zh_Hans.json
@@ -0,0 +1,273 @@
+{
+ "config_onion_service": "在端口{0:d}上设置洋葱服务。",
+ "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": "警告:发送大的共享文件可能会花费数小时",
+ "systray_menu_exit": "退出",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "help_local_only": "不使用Tor(仅开发测试)",
+ "help_stay_open": "文件传输完成后继续分享",
+ "help_autostop_timer": "超过给定时间(秒)后终止分享",
+ "help_stealth": "使用服务端认证(高级选项)",
+ "help_receive": "仅接收分享的文件,不发送",
+ "help_verbose": "将OnionShare错误日志记录到stdout,将web错误日志记录到磁盘",
+ "help_filename": "要分享的文件或文件夹的列表",
+ "help_config": "自定义JSON配置文件的路径(可选)",
+ "gui_drag_and_drop": "拖动文件或文件夹\n以开始共享",
+ "gui_add": "添加",
+ "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": "复制 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_download_upload_progress_complete": "",
+ "gui_download_upload_progress_starting": "",
+ "gui_download_upload_progress_eta": "",
+ "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": "有人发出了过多错误请求来猜测您的地址,因此 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": "已保存您的私钥用于重复使用,这意味着您现在可以点击以复制您的 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_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_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 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?lang=zh_CN\">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": "在此时间停止共享:",
+ "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": "无法检查更新:可能是您没有连接到Tor,或者OnionShare瘫痪了?",
+ "update_error_invalid_latest_version": "无法检查更新:OnionShare 网站说最新版本无法识别'{}'…",
+ "update_not_available": "您正在运行最新版本的 OnionShare。",
+ "gui_tor_connection_ask": "打开设置以整理与 Tor 的连接?",
+ "gui_tor_connection_ask_open_settings": "好",
+ "gui_tor_connection_ask_quit": "退出",
+ "gui_tor_connection_error_settings": "请尝试在设置中改变 OnionShare 连接至 Tor 的方式。",
+ "gui_tor_connection_canceled": "无法连接至 Tor。\n\n请确保您已连接至互联网,然后重启 OnionShare 并设置与 Tor 的连接。",
+ "gui_tor_connection_lost": "已断开与 Tor 的连接。",
+ "gui_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 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": "{} 已完成",
+ "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": "上传的文件总大小为 {},正在开始",
+ "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": "公共模式",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "页面已加载",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "清除所有",
+ "gui_upload_in_progress": "",
+ "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_add_files": "添加文件",
+ "gui_add_folder": "添加文件夹",
+ "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_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": "秒",
+ "gui_website_url_description": "<b>任何</b>使用此 OnionShare 地址的人可以使用 <b>Tor 浏览器</b>来<b>访问</b>你的网站:<img src='{}' />",
+ "gui_mode_website_button": "发布网站",
+ "gui_website_mode_no_files": "尚未分享网站",
+ "incorrect_password": "密码错误",
+ "gui_settings_individual_downloads_label": "取消选择来允许下载单独的文件",
+ "history_requests_tooltip": "{}个网络请求",
+ "gui_settings_csp_header_disabled_option": "禁用内容安全策略标题",
+ "gui_settings_website_label": "网站设置",
+ "mode_settings_website_disable_csp_checkbox": "取消Content Security Policy头(允许您的网站使用三方资源)",
+ "mode_settings_receive_data_dir_browse_button": "浏览",
+ "mode_settings_receive_data_dir_label": "保存文件到",
+ "mode_settings_share_autostop_sharing_checkbox": "文件传送完后停止共享(取消选中可允许下载单个文件)",
+ "mode_settings_client_auth_checkbox": "使用客户端认证",
+ "mode_settings_legacy_checkbox": "使用旧地址(v2 onion服务,不推荐)",
+ "mode_settings_autostop_timer_checkbox": "定时停止onion服务",
+ "mode_settings_autostart_timer_checkbox": "定时起动onion服务",
+ "mode_settings_public_checkbox": "不使用密码",
+ "mode_settings_persistent_checkbox": "保存此标签,并在打开OnionShare时自动打开它。",
+ "mode_settings_advanced_toggle_hide": "隐藏高级选项",
+ "mode_settings_advanced_toggle_show": "显示高级选项",
+ "gui_quit_warning_cancel": "取消",
+ "gui_quit_warning_description": "有的标签中有激活的共享,如果退出,所有的标签将关闭。您确定要退出吗?",
+ "gui_quit_warning_title": "您确定吗?",
+ "gui_close_tab_warning_cancel": "取消",
+ "gui_close_tab_warning_close": "关闭",
+ "gui_close_tab_warning_website_description": "您正在托管一个网站,确定要关闭此标签吗?",
+ "gui_close_tab_warning_receive_description": "您正在接收文件,确定要关闭此标签吗?",
+ "gui_close_tab_warning_share_description": "您正在发送文件,确定要关闭此标签吗?",
+ "gui_close_tab_warning_persistent_description": "此标签是持久的, 如果关闭它,将会丢失它正在使用的onion地址。 您确定要关闭它吗?",
+ "gui_close_tab_warning_title": "您确定吗?",
+ "gui_new_tab_website_description": "从您的计算机托管一个静态HTML的onion网站。",
+ "gui_new_tab_website_button": "发布网站",
+ "gui_new_tab_receive_description": "将您的计算机变成一个在线的dropbox。 人们将能够使用Tor浏览器将文件发送到您的计算机。",
+ "gui_new_tab_receive_button": "接收文件",
+ "gui_new_tab_share_description": "选择计算机上的文件发送给别人。 您要将文件发送给的那些人需要使用Tor浏览器来从您这里下载文件。",
+ "gui_new_tab_share_button": "共享文件",
+ "gui_new_tab_tooltip": "打开一个新标签",
+ "gui_new_tab": "新建标签",
+ "gui_show_url_qr_code": "显示二维码",
+ "gui_receive_flatpak_data_dir": "因为你用Flatpack安装的OnionShare,你需要把文件储存到在~/OnionShare里的一个文件夹里。",
+ "gui_chat_stop_server": "停止言论服务器",
+ "gui_chat_start_server": "开始言论服务器",
+ "gui_file_selection_remove_all": "删除所有",
+ "gui_remove": "删除"
+}
diff --git a/desktop/share/locale/zh_Hant.json b/desktop/share/locale/zh_Hant.json
new file mode 100644
index 00000000..20fd1a90
--- /dev/null
+++ b/desktop/share/locale/zh_Hant.json
@@ -0,0 +1,253 @@
+{
+ "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": "警告:傳輸巨大的檔案將有可能耗時數小時以上",
+ "systray_menu_exit": "離開",
+ "systray_download_started_title": "",
+ "systray_download_started_message": "",
+ "systray_download_completed_title": "",
+ "systray_download_completed_message": "",
+ "systray_download_canceled_title": "",
+ "systray_download_canceled_message": "",
+ "systray_upload_started_title": "",
+ "systray_upload_started_message": "",
+ "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_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": "已複製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/",
+ "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": "已經將您的私鑰存起來以便使用,代表您現在可以點選以複製您的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_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": "嘗試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?lang=zh_TW\">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_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": "自動停止計時器時間已到。請調整它來開始分享。",
+ "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": "警告:接收模式將使其他人上傳檔案到您的電腦。<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": "公開模式",
+ "systray_close_server_title": "",
+ "systray_close_server_message": "",
+ "systray_page_loaded_title": "頁面已載入",
+ "systray_download_page_loaded_message": "",
+ "systray_upload_page_loaded_message": "",
+ "gui_uploads": "",
+ "gui_no_uploads": "",
+ "gui_clear_history": "",
+ "gui_upload_in_progress": "",
+ "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_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": "秒",
+ "incorrect_password": "密碼錯誤",
+ "gui_settings_csp_header_disabled_option": "停用Content Security Policy標頭",
+ "gui_website_url_description": "有OnionShare位址的<b>任何人</b>都可以使用<b>Tor瀏覽器</b>來<b>造訪</b>你的網站: : <img src='{}' />",
+ "gui_mode_website_button": "發佈網站",
+ "gui_website_mode_no_files": "尚未分享網站",
+ "gui_settings_individual_downloads_label": "取消選取以允許下載個別的檔案",
+ "history_requests_tooltip": "{}個網頁請求",
+ "gui_settings_website_label": "網站設定",
+ "mode_settings_receive_data_dir_browse_button": "瀏覽",
+ "mode_settings_receive_data_dir_label": "儲存檔案至",
+ "mode_settings_public_checkbox": "不要使用密碼",
+ "mode_settings_advanced_toggle_hide": "隱藏進階設定",
+ "gui_close_tab_warning_title": "您確定?",
+ "gui_quit_warning_cancel": "取消",
+ "gui_quit_warning_title": "您確定?",
+ "gui_close_tab_warning_cancel": "取消",
+ "gui_close_tab_warning_close": "關閉",
+ "gui_new_tab_share_description": "選擇要寄送給他人的檔案。接收您傳送檔案的人需要使用Tor 瀏覽器才能下載檔案。",
+ "gui_new_tab_receive_button": "接收檔案",
+ "gui_new_tab": "新分頁",
+ "gui_new_tab_tooltip": "開啟新分頁",
+ "gui_new_tab_share_button": "分享檔案"
+}
diff --git a/desktop/share/static/css/style.css b/desktop/share/static/css/style.css
new file mode 100644
index 00000000..88d9cb79
--- /dev/null
+++ b/desktop/share/static/css/style.css
@@ -0,0 +1,393 @@
+.clearfix:after {
+ content: ".";
+ display: block;
+ clear: both;
+ visibility: hidden;
+ line-height: 0;
+ height: 0;
+}
+
+body {
+ margin: 0;
+ font-family: Helvetica, sans-serif;
+}
+
+.d-flex {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ align-items: center;
+}
+
+header {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+ background: #fcfcfc;
+ background: -webkit-linear-gradient(top, #fcfcfc 0%, #f2f2f2 100%);
+ padding: 0.8rem;
+}
+
+header .logo {
+ vertical-align: middle;
+ width: 45px;
+ height: 45px;
+}
+
+header h1 {
+ display: inline-block;
+ margin: 0 0 0 0.5rem;
+ vertical-align: middle;
+ font-weight: normal;
+ font-size: 1.5rem;
+ color: #666666;
+}
+
+header .information {
+ font-size: 1rem;
+}
+
+.button {
+ color: #ffffff;
+ background-color: #4e064f;
+ padding: 10px;
+ border: 0;
+ border-radius: 5px;
+ text-decoration: none;
+ margin-left: 1rem;
+ cursor: pointer;
+}
+
+a.button:visited {
+ color: #ffffff;
+}
+
+.close-button {
+ color: #ffffff;
+ background-color: #c90c0c;
+ padding: 10px;
+ border: 0;
+ border-radius: 5px;
+ text-decoration: none;
+ margin-left: 1rem;
+ cursor: pointer;
+ position: absolute;
+ right: 10px;
+ bottom: 10px;
+}
+
+ul.breadcrumbs {
+ display: block;
+ list-style: none;
+ margin: 10px 0;
+ padding: 0;
+}
+
+ul.breadcrumbs li {
+ display: inline-block;
+ list-style: none;
+ margin: 0;
+ padding: 5px;
+ color: #999999;
+}
+
+ul.breadcrumbs li span.sep {
+ padding-left: 5px;
+}
+
+ul.breadcrumbs li a:link, ul.breadcrumbs li a:visited {
+ color: #666666;
+ border-bottom: 1px solid #666666;
+}
+
+.file-list {
+ width: 100%;
+ margin: 0 auto;
+ border-collapse: collapse;
+}
+
+.file-list .heading {
+ text-align: left;
+ text-transform: uppercase;
+ font-weight: normal;
+ color: #666666;
+ padding: 0.5rem;
+}
+
+.file-list div.d-flex {
+ border-bottom: 1px solid #e0e0e0;
+ justify-content: flex-start;
+}
+
+.file-list div.d-flex div {
+ white-space: nowrap;
+ padding: 0.5rem 0.8rem 0.5rem 0.8rem;
+}
+
+.file-list div.d-flex div img {
+ vertical-align: middle;
+ margin-right: 0.5rem;
+}
+
+.file-list div.d-flex div:last-child {
+ padding-right: 0.8rem;
+ flex-basis: 0;
+ flex-grow: 1;
+}
+
+.file-list div.d-flex div:first-child {
+ flex-basis: 0;
+ flex-grow: 2;
+}
+
+@media (max-width: 950px) {
+ .file-list div.d-flex div:last-child {
+ flex-basis: auto;
+ flex-grow: 0;
+ }
+}
+
+@media (max-width: 655px) {
+ .file-list div.d-flex {
+ display: block;
+ }
+ .file-list div.d-flex span {
+ max-width: 100%;
+ word-break: break-all;
+ white-space: normal;
+ }
+ .file-list div.d-flex #size-header {
+ display: none;
+ }
+ .file-list div.d-flex div:last-child {
+ padding-left: 3.5rem;
+ font-size: 0.85rem;
+ padding-top: 0;
+ }
+ header .information {
+ padding: 1rem 0;
+ }
+}
+
+.chat-container {
+ display: flex;
+ font-family: monospace;
+}
+
+.chat-users {
+ width: 20%;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 2px;
+ overflow: auto;
+ background: #f2f2f2;
+ margin: 1rem 0 1rem 1rem;
+}
+
+.chat-users .editable-username {
+ display: flex;
+ padding: 1rem;
+ flex-direction: column;
+}
+
+.chat-users .editable-username input {
+ font-family: monospace;
+ font-size: 1em;
+}
+
+.chat-users .editable-username #username-error {
+ color: #c90c0c;
+ margin: 0.5rem;
+}
+
+.chat-users #user-list li {
+ margin-bottom: 1em;
+}
+
+.chat-wrapper {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ margin: 1rem 1rem 0 1rem;
+ height: calc(100vh - (65px + 2em));
+}
+
+.chat-wrapper #chat {
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 2px;
+ flex: 1;
+ overflow: auto;
+ background: #f2f2f2;
+ padding: 0 1rem;
+}
+
+.chat-wrapper .status {
+ font-style: italic;
+ font-size: 0.8em;
+ color: #666666;
+}
+
+.chat-wrapper .username {
+ font-weight: bold;
+ display: block;
+}
+.chat-wrapper .message {
+ font-weight: normal;
+ display: block;
+ margin-bottom: 0.3em;
+}
+
+.chat-wrapper .chat-form {
+ display: block;
+ margin: 0.2rem 1rem 1rem 0;
+ padding: -0.5em;
+}
+
+.chat-wrapper input#new-message {
+ height: 100%;
+ width: 100%;
+ font-family: monospace;
+ font-size: 1em;
+}
+
+@media (max-width: 992px) {
+ .chat-users .editable-username {
+ display: block;
+ }
+
+ .chat-users input#username {
+ width: 90%;
+ }
+}
+
+.no-js {
+ display: none;
+}
+
+.upload-wrapper {
+ align-items: center;
+ justify-content: center;
+ min-height: 400px;
+ text-align: center;
+}
+
+.upload-wrapper img.logo {
+ width: 120px;
+ height: 120px;
+}
+
+.upload-wrapper .upload-header {
+ font-size: 30px;
+ font-weight: normal;
+ color: #666666;
+ margin: 0 0 10px 0;
+}
+
+.upload-wrapper .upload-description {
+ color: #666666;
+ margin: 0 0 20px 0;
+}
+
+div#uploads {
+ width: 800px;
+ max-width: 90%;
+ margin: 0 auto;
+}
+
+div#uploads .upload {
+ border: 1px solid #DDDDDD;
+ margin: 20px 0;
+ padding: 10px;
+ text-align: left;
+}
+
+div#uploads .upload .upload-filename {
+ font-weight: bold;
+ font-family: monospace;
+ font-size: 1.1em;
+ margin-bottom: 5px;
+}
+
+div#uploads .upload .upload-status {
+ color: #999999;
+ font-size: 0.9em;
+ margin-bottom: 5px;
+}
+
+div#uploads .upload input.cancel {
+ color: #d0011b;
+ border: 0;
+ background: none;
+ box-shadow: none;
+ border-radius: 0px;
+ cursor: pointer;
+ font-family: sans-serif;
+ font-size: 12px;
+ text-decoration: none;
+ display: inline-block;
+ float:right;
+}
+
+div#uploads .upload progress {
+ width: 100%;
+ height: 20px;
+}
+
+ul.flashes {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ width: 800px;
+ max-width: 100%;
+ margin: 0 auto;
+}
+
+ul.flashes li {
+ margin: 0 0 5px 0;
+ padding: 5px;
+ list-style: none;
+ text-align: center;
+ word-break: break-word;
+}
+
+li.error {
+ color: #d0011b;
+}
+
+li.info {
+ color: #5fa416;
+}
+
+.closed-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 400px;
+}
+
+.info {
+ text-align: center;
+}
+
+.info img {
+ width: 120px;
+ height: 120px;
+}
+
+.info .info-header {
+ font-size: 30px;
+ font-weight: normal;
+ color: #666666;
+ margin: 0 0 10px 0;
+}
+
+.info .info-description {
+ color: #666666;
+ margin: 0 0 20px 0;
+}
+
+a {
+ text-decoration: none;
+ color: #1c1ca0;
+}
+
+a:visited {
+ color: #601ca0;
+} \ No newline at end of file
diff --git a/desktop/share/static/img/ajax.gif b/desktop/share/static/img/ajax.gif
new file mode 100644
index 00000000..01d955aa
--- /dev/null
+++ b/desktop/share/static/img/ajax.gif
Binary files differ
diff --git a/desktop/share/static/img/favicon.ico b/desktop/share/static/img/favicon.ico
new file mode 100644
index 00000000..63e65d8b
--- /dev/null
+++ b/desktop/share/static/img/favicon.ico
Binary files differ
diff --git a/desktop/share/static/img/logo.png b/desktop/share/static/img/logo.png
new file mode 100644
index 00000000..43884c1f
--- /dev/null
+++ b/desktop/share/static/img/logo.png
Binary files differ
diff --git a/desktop/share/static/img/logo_large.png b/desktop/share/static/img/logo_large.png
new file mode 100644
index 00000000..ee8f26ac
--- /dev/null
+++ b/desktop/share/static/img/logo_large.png
Binary files differ
diff --git a/desktop/share/static/img/web_file.png b/desktop/share/static/img/web_file.png
new file mode 100644
index 00000000..1931aff0
--- /dev/null
+++ b/desktop/share/static/img/web_file.png
Binary files differ
diff --git a/desktop/share/static/img/web_folder.png b/desktop/share/static/img/web_folder.png
new file mode 100644
index 00000000..3ca5df21
--- /dev/null
+++ b/desktop/share/static/img/web_folder.png
Binary files differ
diff --git a/desktop/share/static/js/chat.js b/desktop/share/static/js/chat.js
new file mode 100644
index 00000000..39547725
--- /dev/null
+++ b/desktop/share/static/js/chat.js
@@ -0,0 +1,165 @@
+$(function () {
+ $(document).ready(function () {
+ $('.chat-container').removeClass('no-js');
+ var socket = io.connect('http://' + document.domain + ':' + location.port + '/chat');
+
+ // Store current username received from app context
+ var current_username = $('#username').val();
+
+ // On browser connect, emit a socket event to be added to
+ // room and assigned random username
+ socket.on('connect', function () {
+ socket.emit('joined', {});
+ });
+
+ // Triggered on any status change by any user, such as some
+ // user joined, or changed username, or left, etc.
+ socket.on('status', function (data) {
+ addMessageToRoom(data, current_username, 'status');
+ console.log(data, current_username);
+ });
+
+ // Triggered when message is received from a user. Even when sent
+ // by self, it get triggered after the server sends back the emit.
+ socket.on('message', function (data) {
+ addMessageToRoom(data, current_username, 'chat');
+ console.log(data, current_username);
+ });
+
+ // Triggered when disconnected either by server stop or timeout
+ socket.on('disconnect', function (data) {
+ addMessageToRoom({ 'msg': 'The chat server is disconnected.' }, current_username, 'status');
+ })
+ socket.on('connect_error', function (error) {
+ console.log("error");
+ })
+
+ // Trigger new message on enter or click of send message button.
+ $('#new-message').on('keypress', function (e) {
+ var code = e.keyCode || e.which;
+ if (code == 13) {
+ emitMessage(socket);
+ }
+ });
+
+ // Keep buttons disabled unless changed or not empty
+ $('#username').on('keyup', function (event) {
+ if ($('#username').val() !== '' && $('#username').val() !== current_username) {
+ if (event.keyCode == 13) {
+ current_username = updateUsername(socket) || current_username;
+ }
+ }
+ });
+
+ // Show warning of losing data
+ $(window).on('beforeunload', function (e) {
+ e.preventDefault();
+ e.returnValue = '';
+ return '';
+ });
+ });
+});
+
+var addMessageToRoom = function (data, current_username, messageType) {
+ var scrollDiff = getScrollDiffBefore();
+ if (messageType === 'status') {
+ addStatusMessage(data.msg);
+ if (data.connected_users) {
+ addUserList(data.connected_users, current_username);
+ }
+ } else if (messageType === 'chat') {
+ addChatMessage(data.username, data.msg)
+ }
+ scrollBottomMaybe(scrollDiff);
+}
+
+var emitMessage = function (socket) {
+ var text = $('#new-message').val();
+ $('#new-message').val('');
+ $('#chat').scrollTop($('#chat')[0].scrollHeight);
+ socket.emit('text', { msg: text });
+}
+
+var updateUsername = function (socket) {
+ var username = $('#username').val();
+ if (!checkUsernameExists(username)) {
+ socket.emit('update_username', { username: username });
+ $.ajax({
+ method: 'POST',
+ url: `http://${document.domain}:${location.port}/update-session-username`,
+ contentType: 'application/json',
+ dataType: 'json',
+ data: JSON.stringify({ 'username': username })
+ }).done(function (response) {
+ console.log(response);
+ });
+ return username;
+ }
+ return false;
+}
+
+/************************************/
+/********* Util Functions ***********/
+/************************************/
+
+var createUserListHTML = function (connected_users, current_user) {
+ var userListHTML = '';
+ connected_users.sort();
+ connected_users.forEach(function (username) {
+ if (username !== current_user) {
+ userListHTML += `<li>${sanitizeHTML(username)}</li>`;
+ }
+ });
+ return userListHTML;
+}
+
+var checkUsernameExists = function (username) {
+ $('#username-error').text('');
+ var userMatches = $('#user-list li').filter(function () {
+ return $(this).text() === username;
+ });
+ if (userMatches.length) {
+ $('#username-error').text('User with that username exists!');
+ return true;
+ }
+ return false;
+}
+
+var getScrollDiffBefore = function () {
+ return $('#chat').scrollTop() - ($('#chat')[0].scrollHeight - $('#chat')[0].offsetHeight);
+}
+
+var scrollBottomMaybe = function (scrollDiff) {
+ // Scrolls to bottom if the user is scrolled at bottom
+ // if the user has scrolled upp, it wont scroll at bottom.
+ // Note: when a user themselves send a message, it will still
+ // scroll to the bottom even if they had scrolled up before.
+ if (scrollDiff > 0) {
+ $('#chat').scrollTop($('#chat')[0].scrollHeight);
+ }
+}
+
+var addStatusMessage = function (message) {
+ $('#chat').append(
+ `<p class="status">${sanitizeHTML(message)}</p>`
+ );
+}
+
+var addChatMessage = function (username, message) {
+ $('#chat').append(`<p><span class="username">${sanitizeHTML(username)}</span><span class="message">${sanitizeHTML(message)}</span></p>`);
+}
+
+var addUserList = function (connected_users, current_username) {
+ $('#user-list').html(
+ createUserListHTML(
+ connected_users,
+ current_username
+ )
+ );
+}
+
+var sanitizeHTML = function (str) {
+ var temp = document.createElement('span');
+ temp.textContent = str;
+ return temp.innerHTML;
+};
diff --git a/desktop/share/static/js/jquery-3.5.1.min.js b/desktop/share/static/js/jquery-3.5.1.min.js
new file mode 100644
index 00000000..b0614034
--- /dev/null
+++ b/desktop/share/static/js/jquery-3.5.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.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(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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},E=C.document,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.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(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)}S.fn=S.prototype={jquery:f,constructor:S,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=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.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)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},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},S.extend=S.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&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.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,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(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},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.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(p(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(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=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="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),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-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|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(p.childNodes),p.childNodes),t[p.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&&(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)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$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[S]=!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:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),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=S,!C.getElementsByName||!C.getElementsByName(S).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){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\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~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),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("!=",F)}),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==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,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]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(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=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(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(B," ")+" ").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)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&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]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&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[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,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[S]?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($,"$1"));return s[S]?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=[k,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[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&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[S]&&(v=Ce(v)),y&&!y[S]&&(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))[S]){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($,"$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($," ")}),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]))[S]?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=k+=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&&(k=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&&(k=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=S.split("").sort(D).join("")===S,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);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.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 S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.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(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.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&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(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(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(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])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.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){S.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 S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.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},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.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 S.Deferred(function(r){S.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,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.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=S.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&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.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(S(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},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(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[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(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(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.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&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.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=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.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=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.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 ue={};function le(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]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={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&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);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"===w(o))S.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]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.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<S.inArray(o,r))i&&i.push(o);else if(l=ie(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}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(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)ke(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=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.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),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.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)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.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<S(i,this).index(l):S.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(S.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[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,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&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.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&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(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=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(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&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.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++)Oe(o[r],a[r]);else Oe(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=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.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 Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(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&&(S.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 S.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&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.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 Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.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}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(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+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[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 Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(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=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.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=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.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=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.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):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.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=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),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:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.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=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.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=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,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),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.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&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._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--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.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]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.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=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(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?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.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&&S.dequeue(this,r.queue)},r},S.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(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.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&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.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||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.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})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.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)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.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=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(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(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.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=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.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)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(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){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(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){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.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,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.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||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.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&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.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]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.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=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(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)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.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||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.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&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];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 Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.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 $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,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":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),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=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.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=Ht.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||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.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]?", "+It+"; 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=Bt(Mt,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)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),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"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.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]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(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){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!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(_t[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()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.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 S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<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 Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.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(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.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?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.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=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.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,S.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):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.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"===S.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"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.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)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.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?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.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)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.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){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.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||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/desktop/share/static/js/receive.js b/desktop/share/static/js/receive.js
new file mode 100644
index 00000000..eac67412
--- /dev/null
+++ b/desktop/share/static/js/receive.js
@@ -0,0 +1,130 @@
+$(function(){
+ // Add a flash message
+ var flash = function(category, message) {
+ $('#flashes').append($('<li>').addClass(category).text(message));
+ };
+
+ var scriptSrc = document.getElementById('receive-script').src;
+ var staticImgPath = scriptSrc.substr(0, scriptSrc.lastIndexOf( '/' )+1).replace('js', 'img');
+
+ // Intercept submitting the form
+ $('#send').submit(function(event){
+ event.preventDefault();
+
+ // Create form data, and list of filenames
+ var files = $('#file-select').get(0).files;
+ var filenames = [];
+ var formData = new FormData();
+ for(var i = 0; i < files.length; i++) {
+ var file = files[i];
+ filenames.push(file.name);
+ formData.append('file[]', file, file.name);
+ }
+
+ // Reset the upload form
+ $('#send').get(0).reset();
+
+ // Don't use jQuery for ajax request, because the upload progress event doesn't
+ // have access to the the XMLHttpRequest object
+ var ajax = new XMLHttpRequest();
+
+ ajax.upload.addEventListener('progress', function(event){
+ // Update progress bar for this specific upload
+ if(event.lengthComputable) {
+ $('progress', ajax.$upload_div).attr({
+ value: event.loaded,
+ max: event.total,
+ });
+ }
+
+ // If it's finished sending all data to the first Tor node, remove cancel button
+ // and update the status
+ if(event.loaded == event.total) {
+ $('.cancel', ajax.$upload_div).remove();
+ $('.upload-status', ajax.$upload_div).html('<img src="' + staticImgPath + '/ajax.gif" alt="" /> Waiting for data to finish traversing Tor network ...');
+ }
+ }, false);
+
+ ajax.addEventListener('load', function(event){
+ // Remove the upload div
+ ajax.$upload_div.remove();
+
+ // Parse response
+ try {
+ var response = JSON.parse(ajax.response);
+
+ // The 'new_body' response replaces the whole HTML document and ends
+ if('new_body' in response) {
+ $('body').html(response['new_body']);
+ return;
+ }
+
+ // Show error flashes
+ if('error_flashes' in response) {
+ for(var i=0; i<response['error_flashes'].length; i++) {
+ flash('error', response['error_flashes'][i]);
+ }
+ }
+
+ // Show info flashes
+ if('info_flashes' in response) {
+ for(var i=0; i<response['info_flashes'].length; i++) {
+ flash('info', response['info_flashes'][i]);
+ }
+ }
+ } catch(e) {
+ flash('error', 'Invalid response from server: '+data);
+ }
+ }, false);
+
+ ajax.addEventListener('error', function(event){
+ flash('error', 'Error uploading: '+filenames.join(', '));
+
+ // Remove the upload div
+ ajax.$upload_div.remove()
+ }, false);
+
+ ajax.addEventListener('abort', function(event){
+ flash('error', 'Upload aborted: '+filenames.join(', '));
+ }, false);
+
+ // Make the upload div
+
+ /* The DOM for an upload looks something like this:
+ <div class="upload">
+ <div class="upload-meta">
+ <input class="cancel" type="button" value="Cancel" />
+ <div class="upload-filename">educational-video.mp4, secret-plans.pdf</div>
+ <div class="upload-status">Sending to first Tor node ...</div>
+ </div>
+ <progress value="25" max="100"></progress>
+ </div> */
+ var $progress = $('<progress>').attr({ value: '0', max: 100 });
+ var $cancel_button = $('<input>').addClass('cancel').attr({ type: 'button', value: 'Cancel' });
+ var $upload_filename = $('<div>').addClass('upload-filename').text(filenames.join(', '));
+ var $upload_status = $('<div>').addClass('upload-status').text('Sending data to initial Tor node ...');
+
+ var $upload_div = $('<div>')
+ .addClass('upload')
+ .append(
+ $('<div>').addClass('upload-meta')
+ .append($cancel_button)
+ .append($upload_filename)
+ .append($upload_status)
+ )
+ .append($progress);
+
+ $cancel_button.click(function(){
+ // Abort the upload, and remove the upload div
+ ajax.abort();
+ $upload_div.remove()
+ });
+
+ ajax.$upload_div = $upload_div;
+ $('#uploads').append($upload_div);
+
+ // Send the request
+ ajax.open('POST', '/upload-ajax', true);
+ ajax.send(formData);
+ });
+});
diff --git a/desktop/share/static/js/send.js b/desktop/share/static/js/send.js
new file mode 100644
index 00000000..43e9892d
--- /dev/null
+++ b/desktop/share/static/js/send.js
@@ -0,0 +1,75 @@
+// Function to convert human-readable sizes back to bytes, for sorting
+function unhumanize(text) {
+ var powers = {'b': 0, 'k': 1, 'm': 2, 'g': 3, 't': 4};
+ var regex = /(\d+(?:\.\d+)?)\s?(B|K|M|G|T)?/i;
+ var res = regex.exec(text);
+ if(res[2] === undefined) {
+ // Account for alphabetical words (file/dir names)
+ return text;
+ } else {
+ return res[1] * Math.pow(1024, powers[res[2].toLowerCase()]);
+ }
+}
+function sortTable(n) {
+ var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
+ table = document.getElementById("file-list");
+ switching = true;
+ // Set the sorting direction to ascending:
+ dir = "asc";
+ /* Make a loop that will continue until
+ no switching has been done: */
+ while (switching) {
+ // Start by saying: no switching is done:
+ switching = false;
+ rows = table.getElementsByTagName("TR");
+ /* Loop through all table rows (except the
+ first, which contains table headers): */
+ for (i = 1; i < (rows.length - 1); i++) {
+ // Start by saying there should be no switching:
+ shouldSwitch = false;
+ /* Get the two elements you want to compare,
+ one from current row and one from the next: */
+ x = rows[i].getElementsByTagName("TD")[n];
+ y = rows[i + 1].getElementsByTagName("TD")[n];
+ /* Check if the two rows should switch place,
+ based on the direction, asc or desc: */
+ if (dir == "asc") {
+ if (unhumanize(x.innerHTML.toLowerCase()) > unhumanize(y.innerHTML.toLowerCase())) {
+ // If so, mark as a switch and break the loop:
+ shouldSwitch= true;
+ break;
+ }
+ } else if (dir == "desc") {
+ if (unhumanize(x.innerHTML.toLowerCase()) < unhumanize(y.innerHTML.toLowerCase())) {
+ // If so, mark as a switch and break the loop:
+ shouldSwitch= true;
+ break;
+ }
+ }
+ }
+ if (shouldSwitch) {
+ /* If a switch has been marked, make the switch
+ and mark that a switch has been done: */
+ rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
+ switching = true;
+ // Each time a switch is done, increase this count by 1:
+ switchcount ++;
+ } else {
+ /* If no switching has been done AND the direction is "asc",
+ set the direction to "desc" and run the while loop again. */
+ if (switchcount == 0 && dir == "asc") {
+ dir = "desc";
+ switching = true;
+ }
+ }
+ }
+}
+
+
+// Set click handlers
+document.getElementById("filename-header").addEventListener("click", function(){
+ sortTable(0);
+});
+document.getElementById("size-header").addEventListener("click", function(){
+ sortTable(1);
+});
diff --git a/desktop/share/static/js/socket.io.min.js b/desktop/share/static/js/socket.io.min.js
new file mode 100644
index 00000000..b622e1b9
--- /dev/null
+++ b/desktop/share/static/js/socket.io.min.js
@@ -0,0 +1,3 @@
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.io=t()}}(function(){var t;return function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(i)return i(s,!0);throw new Error("Cannot find module '"+s+"'")}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return o(n?n:e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(t,e){e.exports=t("./lib/")},{"./lib/":2}],2:[function(t,e,n){function r(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,r=o(t),i=r.source,p=r.id;return e.forceNew||e["force new connection"]||!1===e.multiplex?(a("ignoring socket cache for %s",i),n=s(i,e)):(c[p]||(a("new io instance for %s",i),c[p]=s(i,e)),n=c[p]),n.socket(r.path)}var o=t("./url"),i=t("socket.io-parser"),s=t("./manager"),a=t("debug")("socket.io-client");e.exports=n=r;var c=n.managers={};n.protocol=i.protocol,n.connect=r,n.Manager=t("./manager"),n.Socket=t("./socket")},{"./manager":3,"./socket":5,"./url":6,debug:10,"socket.io-parser":46}],3:[function(t,e){function n(t,e){return this instanceof n?(t&&"object"==typeof t&&(e=t,t=void 0),e=e||{},e.path=e.path||"/socket.io",this.nsps={},this.subs=[],this.opts=e,this.reconnection(e.reconnection!==!1),this.reconnectionAttempts(e.reconnectionAttempts||1/0),this.reconnectionDelay(e.reconnectionDelay||1e3),this.reconnectionDelayMax(e.reconnectionDelayMax||5e3),this.randomizationFactor(e.randomizationFactor||.5),this.backoff=new f({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==e.timeout?2e4:e.timeout),this.readyState="closed",this.uri=t,this.connected=[],this.encoding=!1,this.packetBuffer=[],this.encoder=new s.Encoder,this.decoder=new s.Decoder,this.autoConnect=e.autoConnect!==!1,void(this.autoConnect&&this.open())):new n(t,e)}var r=(t("./url"),t("engine.io-client")),o=t("./socket"),i=t("component-emitter"),s=t("socket.io-parser"),a=t("./on"),c=t("component-bind"),p=(t("object-component"),t("debug")("socket.io-client:manager")),u=t("indexof"),f=t("backo2");e.exports=n,n.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var t in this.nsps)this.nsps[t].emit.apply(this.nsps[t],arguments)},n.prototype.updateSocketIds=function(){for(var t in this.nsps)this.nsps[t].id=this.engine.id},i(n.prototype),n.prototype.reconnection=function(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection},n.prototype.reconnectionAttempts=function(t){return arguments.length?(this._reconnectionAttempts=t,this):this._reconnectionAttempts},n.prototype.reconnectionDelay=function(t){return arguments.length?(this._reconnectionDelay=t,this.backoff&&this.backoff.setMin(t),this):this._reconnectionDelay},n.prototype.randomizationFactor=function(t){return arguments.length?(this._randomizationFactor=t,this.backoff&&this.backoff.setJitter(t),this):this._randomizationFactor},n.prototype.reconnectionDelayMax=function(t){return arguments.length?(this._reconnectionDelayMax=t,this.backoff&&this.backoff.setMax(t),this):this._reconnectionDelayMax},n.prototype.timeout=function(t){return arguments.length?(this._timeout=t,this):this._timeout},n.prototype.maybeReconnectOnOpen=function(){!this.reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()},n.prototype.open=n.prototype.connect=function(t){if(p("readyState %s",this.readyState),~this.readyState.indexOf("open"))return this;p("opening %s",this.uri),this.engine=r(this.uri,this.opts);var e=this.engine,n=this;this.readyState="opening",this.skipReconnect=!1;var o=a(e,"open",function(){n.onopen(),t&&t()}),i=a(e,"error",function(e){if(p("connect_error"),n.cleanup(),n.readyState="closed",n.emitAll("connect_error",e),t){var r=new Error("Connection error");r.data=e,t(r)}else n.maybeReconnectOnOpen()});if(!1!==this._timeout){var s=this._timeout;p("connect attempt will timeout after %d",s);var c=setTimeout(function(){p("connect attempt timed out after %d",s),o.destroy(),e.close(),e.emit("error","timeout"),n.emitAll("connect_timeout",s)},s);this.subs.push({destroy:function(){clearTimeout(c)}})}return this.subs.push(o),this.subs.push(i),this},n.prototype.onopen=function(){p("open"),this.cleanup(),this.readyState="open",this.emit("open");var t=this.engine;this.subs.push(a(t,"data",c(this,"ondata"))),this.subs.push(a(this.decoder,"decoded",c(this,"ondecoded"))),this.subs.push(a(t,"error",c(this,"onerror"))),this.subs.push(a(t,"close",c(this,"onclose")))},n.prototype.ondata=function(t){this.decoder.add(t)},n.prototype.ondecoded=function(t){this.emit("packet",t)},n.prototype.onerror=function(t){p("error",t),this.emitAll("error",t)},n.prototype.socket=function(t){var e=this.nsps[t];if(!e){e=new o(this,t),this.nsps[t]=e;var n=this;e.on("connect",function(){e.id=n.engine.id,~u(n.connected,e)||n.connected.push(e)})}return e},n.prototype.destroy=function(t){var e=u(this.connected,t);~e&&this.connected.splice(e,1),this.connected.length||this.close()},n.prototype.packet=function(t){p("writing packet %j",t);var e=this;e.encoding?e.packetBuffer.push(t):(e.encoding=!0,this.encoder.encode(t,function(t){for(var n=0;n<t.length;n++)e.engine.write(t[n]);e.encoding=!1,e.processPacketQueue()}))},n.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var t=this.packetBuffer.shift();this.packet(t)}},n.prototype.cleanup=function(){for(var t;t=this.subs.shift();)t.destroy();this.packetBuffer=[],this.encoding=!1,this.decoder.destroy()},n.prototype.close=n.prototype.disconnect=function(){this.skipReconnect=!0,this.backoff.reset(),this.readyState="closed",this.engine&&this.engine.close()},n.prototype.onclose=function(t){p("close"),this.cleanup(),this.backoff.reset(),this.readyState="closed",this.emit("close",t),this._reconnection&&!this.skipReconnect&&this.reconnect()},n.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var t=this;if(this.backoff.attempts>=this._reconnectionAttempts)p("reconnect failed"),this.backoff.reset(),this.emitAll("reconnect_failed"),this.reconnecting=!1;else{var e=this.backoff.duration();p("will wait %dms before reconnect attempt",e),this.reconnecting=!0;var n=setTimeout(function(){t.skipReconnect||(p("attempting reconnect"),t.emitAll("reconnect_attempt",t.backoff.attempts),t.emitAll("reconnecting",t.backoff.attempts),t.skipReconnect||t.open(function(e){e?(p("reconnect attempt error"),t.reconnecting=!1,t.reconnect(),t.emitAll("reconnect_error",e.data)):(p("reconnect success"),t.onreconnect())}))},e);this.subs.push({destroy:function(){clearTimeout(n)}})}},n.prototype.onreconnect=function(){var t=this.backoff.attempts;this.reconnecting=!1,this.backoff.reset(),this.updateSocketIds(),this.emitAll("reconnect",t)}},{"./on":4,"./socket":5,"./url":6,backo2:7,"component-bind":8,"component-emitter":9,debug:10,"engine.io-client":11,indexof:42,"object-component":43,"socket.io-parser":46}],4:[function(t,e){function n(t,e,n){return t.on(e,n),{destroy:function(){t.removeListener(e,n)}}}e.exports=n},{}],5:[function(t,e,n){function r(t,e){this.io=t,this.nsp=e,this.json=this,this.ids=0,this.acks={},this.io.autoConnect&&this.open(),this.receiveBuffer=[],this.sendBuffer=[],this.connected=!1,this.disconnected=!0}var o=t("socket.io-parser"),i=t("component-emitter"),s=t("to-array"),a=t("./on"),c=t("component-bind"),p=t("debug")("socket.io-client:socket"),u=t("has-binary");e.exports=n=r;var f={connect:1,connect_error:1,connect_timeout:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1},h=i.prototype.emit;i(r.prototype),r.prototype.subEvents=function(){if(!this.subs){var t=this.io;this.subs=[a(t,"open",c(this,"onopen")),a(t,"packet",c(this,"onpacket")),a(t,"close",c(this,"onclose"))]}},r.prototype.open=r.prototype.connect=function(){return this.connected?this:(this.subEvents(),this.io.open(),"open"==this.io.readyState&&this.onopen(),this)},r.prototype.send=function(){var t=s(arguments);return t.unshift("message"),this.emit.apply(this,t),this},r.prototype.emit=function(t){if(f.hasOwnProperty(t))return h.apply(this,arguments),this;var e=s(arguments),n=o.EVENT;u(e)&&(n=o.BINARY_EVENT);var r={type:n,data:e};return"function"==typeof e[e.length-1]&&(p("emitting packet with ack id %d",this.ids),this.acks[this.ids]=e.pop(),r.id=this.ids++),this.connected?this.packet(r):this.sendBuffer.push(r),this},r.prototype.packet=function(t){t.nsp=this.nsp,this.io.packet(t)},r.prototype.onopen=function(){p("transport is open - connecting"),"/"!=this.nsp&&this.packet({type:o.CONNECT})},r.prototype.onclose=function(t){p("close (%s)",t),this.connected=!1,this.disconnected=!0,delete this.id,this.emit("disconnect",t)},r.prototype.onpacket=function(t){if(t.nsp==this.nsp)switch(t.type){case o.CONNECT:this.onconnect();break;case o.EVENT:this.onevent(t);break;case o.BINARY_EVENT:this.onevent(t);break;case o.ACK:this.onack(t);break;case o.BINARY_ACK:this.onack(t);break;case o.DISCONNECT:this.ondisconnect();break;case o.ERROR:this.emit("error",t.data)}},r.prototype.onevent=function(t){var e=t.data||[];p("emitting event %j",e),null!=t.id&&(p("attaching ack callback to event"),e.push(this.ack(t.id))),this.connected?h.apply(this,e):this.receiveBuffer.push(e)},r.prototype.ack=function(t){var e=this,n=!1;return function(){if(!n){n=!0;var r=s(arguments);p("sending ack %j",r);var i=u(r)?o.BINARY_ACK:o.ACK;e.packet({type:i,id:t,data:r})}}},r.prototype.onack=function(t){p("calling ack %s with %j",t.id,t.data);var e=this.acks[t.id];e.apply(this,t.data),delete this.acks[t.id]},r.prototype.onconnect=function(){this.connected=!0,this.disconnected=!1,this.emit("connect"),this.emitBuffered()},r.prototype.emitBuffered=function(){var t;for(t=0;t<this.receiveBuffer.length;t++)h.apply(this,this.receiveBuffer[t]);for(this.receiveBuffer=[],t=0;t<this.sendBuffer.length;t++)this.packet(this.sendBuffer[t]);this.sendBuffer=[]},r.prototype.ondisconnect=function(){p("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")},r.prototype.destroy=function(){if(this.subs){for(var t=0;t<this.subs.length;t++)this.subs[t].destroy();this.subs=null}this.io.destroy(this)},r.prototype.close=r.prototype.disconnect=function(){return this.connected&&(p("performing disconnect (%s)",this.nsp),this.packet({type:o.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}},{"./on":4,"component-bind":8,"component-emitter":9,debug:10,"has-binary":38,"socket.io-parser":46,"to-array":50}],6:[function(t,e){(function(n){function r(t,e){var r=t,e=e||n.location;return null==t&&(t=e.protocol+"//"+e.host),"string"==typeof t&&("/"==t.charAt(0)&&(t="/"==t.charAt(1)?e.protocol+t:e.hostname+t),/^(https?|wss?):\/\//.test(t)||(i("protocol-less url %s",t),t="undefined"!=typeof e?e.protocol+"//"+t:"https://"+t),i("parse %s",t),r=o(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/",r.id=r.protocol+"://"+r.host+":"+r.port,r.href=r.protocol+"://"+r.host+(e&&e.port==r.port?"":":"+r.port),r}var o=t("parseuri"),i=t("debug")("socket.io-client:url");e.exports=r}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{debug:10,parseuri:44}],7:[function(t,e){function n(t){t=t||{},this.ms=t.min||100,this.max=t.max||1e4,this.factor=t.factor||2,this.jitter=t.jitter>0&&t.jitter<=1?t.jitter:0,this.attempts=0}e.exports=n,n.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},n.prototype.reset=function(){this.attempts=0},n.prototype.setMin=function(t){this.ms=t},n.prototype.setMax=function(t){this.max=t},n.prototype.setJitter=function(t){this.jitter=t}},{}],8:[function(t,e){var n=[].slice;e.exports=function(t,e){if("string"==typeof e&&(e=t[e]),"function"!=typeof e)throw new Error("bind() requires a function");var r=n.call(arguments,2);return function(){return e.apply(t,r.concat(n.call(arguments)))}}},{}],9:[function(t,e){function n(t){return t?r(t):void 0}function r(t){for(var e in n.prototype)t[e]=n.prototype[e];return t}e.exports=n,n.prototype.on=n.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},n.prototype.once=function(t,e){function n(){r.off(t,n),e.apply(this,arguments)}var r=this;return this._callbacks=this._callbacks||{},n.fn=e,this.on(t,n),this},n.prototype.off=n.prototype.removeListener=n.prototype.removeAllListeners=n.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n=this._callbacks[t];if(!n)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var r,o=0;o<n.length;o++)if(r=n[o],r===e||r.fn===e){n.splice(o,1);break}return this},n.prototype.emit=function(t){this._callbacks=this._callbacks||{};var e=[].slice.call(arguments,1),n=this._callbacks[t];if(n){n=n.slice(0);for(var r=0,o=n.length;o>r;++r)n[r].apply(this,e)}return this},n.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},n.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],10:[function(t,e){function n(t){return n.enabled(t)?function(e){e=r(e);var o=new Date,i=o-(n[t]||o);n[t]=o,e=t+" "+e+" +"+n.humanize(i),window.console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}:function(){}}function r(t){return t instanceof Error?t.stack||t.message:t}e.exports=n,n.names=[],n.skips=[],n.enable=function(t){try{localStorage.debug=t}catch(e){}for(var r=(t||"").split(/[\s,]+/),o=r.length,i=0;o>i;i++)t=r[i].replace("*",".*?"),"-"===t[0]?n.skips.push(new RegExp("^"+t.substr(1)+"$")):n.names.push(new RegExp("^"+t+"$"))},n.disable=function(){n.enable("")},n.humanize=function(t){var e=1e3,n=6e4,r=60*n;return t>=r?(t/r).toFixed(1)+"h":t>=n?(t/n).toFixed(1)+"m":t>=e?(t/e|0)+"s":t+"ms"},n.enabled=function(t){for(var e=0,r=n.skips.length;r>e;e++)if(n.skips[e].test(t))return!1;for(var e=0,r=n.names.length;r>e;e++)if(n.names[e].test(t))return!0;return!1};try{window.localStorage&&n.enable(localStorage.debug)}catch(o){}},{}],11:[function(t,e){e.exports=t("./lib/")},{"./lib/":12}],12:[function(t,e){e.exports=t("./socket"),e.exports.parser=t("engine.io-parser")},{"./socket":13,"engine.io-parser":25}],13:[function(t,e){(function(n){function r(t,e){if(!(this instanceof r))return new r(t,e);if(e=e||{},t&&"object"==typeof t&&(e=t,t=null),t&&(t=u(t),e.host=t.host,e.secure="https"==t.protocol||"wss"==t.protocol,e.port=t.port,t.query&&(e.query=t.query)),this.secure=null!=e.secure?e.secure:n.location&&"https:"==location.protocol,e.host){var o=e.host.split(":");e.hostname=o.shift(),o.length?e.port=o.pop():e.port||(e.port=this.secure?"443":"80")}this.agent=e.agent||!1,this.hostname=e.hostname||(n.location?location.hostname:"localhost"),this.port=e.port||(n.location&&location.port?location.port:this.secure?443:80),this.query=e.query||{},"string"==typeof this.query&&(this.query=h.decode(this.query)),this.upgrade=!1!==e.upgrade,this.path=(e.path||"/engine.io").replace(/\/$/,"")+"/",this.forceJSONP=!!e.forceJSONP,this.jsonp=!1!==e.jsonp,this.forceBase64=!!e.forceBase64,this.enablesXDR=!!e.enablesXDR,this.timestampParam=e.timestampParam||"t",this.timestampRequests=e.timestampRequests,this.transports=e.transports||["polling","websocket"],this.readyState="",this.writeBuffer=[],this.callbackBuffer=[],this.policyPort=e.policyPort||843,this.rememberUpgrade=e.rememberUpgrade||!1,this.binaryType=null,this.onlyBinaryUpgrades=e.onlyBinaryUpgrades,this.pfx=e.pfx||null,this.key=e.key||null,this.passphrase=e.passphrase||null,this.cert=e.cert||null,this.ca=e.ca||null,this.ciphers=e.ciphers||null,this.rejectUnauthorized=e.rejectUnauthorized||null,this.open()}function o(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}var i=t("./transports"),s=t("component-emitter"),a=t("debug")("engine.io-client:socket"),c=t("indexof"),p=t("engine.io-parser"),u=t("parseuri"),f=t("parsejson"),h=t("parseqs");e.exports=r,r.priorWebsocketSuccess=!1,s(r.prototype),r.protocol=p.protocol,r.Socket=r,r.Transport=t("./transport"),r.transports=t("./transports"),r.parser=t("engine.io-parser"),r.prototype.createTransport=function(t){a('creating transport "%s"',t);var e=o(this.query);e.EIO=p.protocol,e.transport=t,this.id&&(e.sid=this.id);var n=new i[t]({agent:this.agent,hostname:this.hostname,port:this.port,secure:this.secure,path:this.path,query:e,forceJSONP:this.forceJSONP,jsonp:this.jsonp,forceBase64:this.forceBase64,enablesXDR:this.enablesXDR,timestampRequests:this.timestampRequests,timestampParam:this.timestampParam,policyPort:this.policyPort,socket:this,pfx:this.pfx,key:this.key,passphrase:this.passphrase,cert:this.cert,ca:this.ca,ciphers:this.ciphers,rejectUnauthorized:this.rejectUnauthorized});return n},r.prototype.open=function(){var t;if(this.rememberUpgrade&&r.priorWebsocketSuccess&&-1!=this.transports.indexOf("websocket"))t="websocket";else{if(0==this.transports.length){var e=this;return void setTimeout(function(){e.emit("error","No transports available")},0)}t=this.transports[0]}this.readyState="opening";var t;try{t=this.createTransport(t)}catch(n){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)},r.prototype.setTransport=function(t){a("setting transport %s",t.name);var e=this;this.transport&&(a("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=t,t.on("drain",function(){e.onDrain()}).on("packet",function(t){e.onPacket(t)}).on("error",function(t){e.onError(t)}).on("close",function(){e.onClose("transport close")})},r.prototype.probe=function(t){function e(){if(h.onlyBinaryUpgrades){var e=!this.supportsBinary&&h.transport.supportsBinary;f=f||e}f||(a('probe transport "%s" opened',t),u.send([{type:"ping",data:"probe"}]),u.once("packet",function(e){if(!f)if("pong"==e.type&&"probe"==e.data){if(a('probe transport "%s" pong',t),h.upgrading=!0,h.emit("upgrading",u),!u)return;r.priorWebsocketSuccess="websocket"==u.name,a('pausing current transport "%s"',h.transport.name),h.transport.pause(function(){f||"closed"!=h.readyState&&(a("changing transport and sending upgrade packet"),p(),h.setTransport(u),u.send([{type:"upgrade"}]),h.emit("upgrade",u),u=null,h.upgrading=!1,h.flush())})}else{a('probe transport "%s" failed',t);var n=new Error("probe error");n.transport=u.name,h.emit("upgradeError",n)}}))}function n(){f||(f=!0,p(),u.close(),u=null)}function o(e){var r=new Error("probe error: "+e);r.transport=u.name,n(),a('probe transport "%s" failed because of error: %s',t,e),h.emit("upgradeError",r)}function i(){o("transport closed")}function s(){o("socket closed")}function c(t){u&&t.name!=u.name&&(a('"%s" works - aborting "%s"',t.name,u.name),n())}function p(){u.removeListener("open",e),u.removeListener("error",o),u.removeListener("close",i),h.removeListener("close",s),h.removeListener("upgrading",c)}a('probing transport "%s"',t);var u=this.createTransport(t,{probe:1}),f=!1,h=this;r.priorWebsocketSuccess=!1,u.once("open",e),u.once("error",o),u.once("close",i),this.once("close",s),this.once("upgrading",c),u.open()},r.prototype.onOpen=function(){if(a("socket open"),this.readyState="open",r.priorWebsocketSuccess="websocket"==this.transport.name,this.emit("open"),this.flush(),"open"==this.readyState&&this.upgrade&&this.transport.pause){a("starting upgrade probes");for(var t=0,e=this.upgrades.length;e>t;t++)this.probe(this.upgrades[t])}},r.prototype.onPacket=function(t){if("opening"==this.readyState||"open"==this.readyState)switch(a('socket receive: type "%s", data "%s"',t.type,t.data),this.emit("packet",t),this.emit("heartbeat"),t.type){case"open":this.onHandshake(f(t.data));break;case"pong":this.setPing();break;case"error":var e=new Error("server error");e.code=t.data,this.emit("error",e);break;case"message":this.emit("data",t.data),this.emit("message",t.data)}else a('packet received with socket readyState "%s"',this.readyState)},r.prototype.onHandshake=function(t){this.emit("handshake",t),this.id=t.sid,this.transport.query.sid=t.sid,this.upgrades=this.filterUpgrades(t.upgrades),this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.onOpen(),"closed"!=this.readyState&&(this.setPing(),this.removeListener("heartbeat",this.onHeartbeat),this.on("heartbeat",this.onHeartbeat))},r.prototype.onHeartbeat=function(t){clearTimeout(this.pingTimeoutTimer);var e=this;e.pingTimeoutTimer=setTimeout(function(){"closed"!=e.readyState&&e.onClose("ping timeout")},t||e.pingInterval+e.pingTimeout)},r.prototype.setPing=function(){var t=this;clearTimeout(t.pingIntervalTimer),t.pingIntervalTimer=setTimeout(function(){a("writing ping packet - expecting pong within %sms",t.pingTimeout),t.ping(),t.onHeartbeat(t.pingTimeout)},t.pingInterval)},r.prototype.ping=function(){this.sendPacket("ping")},r.prototype.onDrain=function(){for(var t=0;t<this.prevBufferLen;t++)this.callbackBuffer[t]&&this.callbackBuffer[t]();this.writeBuffer.splice(0,this.prevBufferLen),this.callbackBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0==this.writeBuffer.length?this.emit("drain"):this.flush()},r.prototype.flush=function(){"closed"!=this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length&&(a("flushing %d packets in socket",this.writeBuffer.length),this.transport.send(this.writeBuffer),this.prevBufferLen=this.writeBuffer.length,this.emit("flush"))},r.prototype.write=r.prototype.send=function(t,e){return this.sendPacket("message",t,e),this},r.prototype.sendPacket=function(t,e,n){if("closing"!=this.readyState&&"closed"!=this.readyState){var r={type:t,data:e};this.emit("packetCreate",r),this.writeBuffer.push(r),this.callbackBuffer.push(n),this.flush()}},r.prototype.close=function(){function t(){r.onClose("forced close"),a("socket closing - telling transport to close"),r.transport.close()}function e(){r.removeListener("upgrade",e),r.removeListener("upgradeError",e),t()}function n(){r.once("upgrade",e),r.once("upgradeError",e)}if("opening"==this.readyState||"open"==this.readyState){this.readyState="closing";var r=this;this.writeBuffer.length?this.once("drain",function(){this.upgrading?n():t()}):this.upgrading?n():t()}return this},r.prototype.onError=function(t){a("socket error %j",t),r.priorWebsocketSuccess=!1,this.emit("error",t),this.onClose("transport error",t)},r.prototype.onClose=function(t,e){if("opening"==this.readyState||"open"==this.readyState||"closing"==this.readyState){a('socket close with reason: "%s"',t);var n=this;clearTimeout(this.pingIntervalTimer),clearTimeout(this.pingTimeoutTimer),setTimeout(function(){n.writeBuffer=[],n.callbackBuffer=[],n.prevBufferLen=0},0),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),this.readyState="closed",this.id=null,this.emit("close",t,e)}},r.prototype.filterUpgrades=function(t){for(var e=[],n=0,r=t.length;r>n;n++)~c(this.transports,t[n])&&e.push(t[n]);return e}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./transport":14,"./transports":15,"component-emitter":9,debug:22,"engine.io-parser":25,indexof:42,parsejson:34,parseqs:35,parseuri:36}],14:[function(t,e){function n(t){this.path=t.path,this.hostname=t.hostname,this.port=t.port,this.secure=t.secure,this.query=t.query,this.timestampParam=t.timestampParam,this.timestampRequests=t.timestampRequests,this.readyState="",this.agent=t.agent||!1,this.socket=t.socket,this.enablesXDR=t.enablesXDR,this.pfx=t.pfx,this.key=t.key,this.passphrase=t.passphrase,this.cert=t.cert,this.ca=t.ca,this.ciphers=t.ciphers,this.rejectUnauthorized=t.rejectUnauthorized}var r=t("engine.io-parser"),o=t("component-emitter");e.exports=n,o(n.prototype),n.timestamps=0,n.prototype.onError=function(t,e){var n=new Error(t);return n.type="TransportError",n.description=e,this.emit("error",n),this},n.prototype.open=function(){return("closed"==this.readyState||""==this.readyState)&&(this.readyState="opening",this.doOpen()),this},n.prototype.close=function(){return("opening"==this.readyState||"open"==this.readyState)&&(this.doClose(),this.onClose()),this},n.prototype.send=function(t){if("open"!=this.readyState)throw new Error("Transport not open");this.write(t)},n.prototype.onOpen=function(){this.readyState="open",this.writable=!0,this.emit("open")},n.prototype.onData=function(t){var e=r.decodePacket(t,this.socket.binaryType);this.onPacket(e)},n.prototype.onPacket=function(t){this.emit("packet",t)},n.prototype.onClose=function(){this.readyState="closed",this.emit("close")}},{"component-emitter":9,"engine.io-parser":25}],15:[function(t,e,n){(function(e){function r(t){var n,r=!1,a=!1,c=!1!==t.jsonp;if(e.location){var p="https:"==location.protocol,u=location.port;u||(u=p?443:80),r=t.hostname!=location.hostname||u!=t.port,a=t.secure!=p}if(t.xdomain=r,t.xscheme=a,n=new o(t),"open"in n&&!t.forceJSONP)return new i(t);if(!c)throw new Error("JSONP disabled");return new s(t)}var o=t("xmlhttprequest"),i=t("./polling-xhr"),s=t("./polling-jsonp"),a=t("./websocket");n.polling=r,n.websocket=a}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./polling-jsonp":16,"./polling-xhr":17,"./websocket":19,xmlhttprequest:20}],16:[function(t,e){(function(n){function r(){}function o(t){i.call(this,t),this.query=this.query||{},a||(n.___eio||(n.___eio=[]),a=n.___eio),this.index=a.length;var e=this;a.push(function(t){e.onData(t)}),this.query.j=this.index,n.document&&n.addEventListener&&n.addEventListener("beforeunload",function(){e.script&&(e.script.onerror=r)},!1)}var i=t("./polling"),s=t("component-inherit");e.exports=o;var a,c=/\n/g,p=/\\n/g;s(o,i),o.prototype.supportsBinary=!1,o.prototype.doClose=function(){this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),this.form&&(this.form.parentNode.removeChild(this.form),this.form=null,this.iframe=null),i.prototype.doClose.call(this)},o.prototype.doPoll=function(){var t=this,e=document.createElement("script");this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),e.async=!0,e.src=this.uri(),e.onerror=function(e){t.onError("jsonp poll error",e)};var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(e,n),this.script=e;var r="undefined"!=typeof navigator&&/gecko/i.test(navigator.userAgent);r&&setTimeout(function(){var t=document.createElement("iframe");document.body.appendChild(t),document.body.removeChild(t)},100)},o.prototype.doWrite=function(t,e){function n(){r(),e()}function r(){if(o.iframe)try{o.form.removeChild(o.iframe)}catch(t){o.onError("jsonp polling iframe removal error",t)}try{var e='<iframe src="javascript:0" name="'+o.iframeId+'">';i=document.createElement(e)}catch(t){i=document.createElement("iframe"),i.name=o.iframeId,i.src="javascript:0"}i.id=o.iframeId,o.form.appendChild(i),o.iframe=i}var o=this;if(!this.form){var i,s=document.createElement("form"),a=document.createElement("textarea"),u=this.iframeId="eio_iframe_"+this.index;s.className="socketio",s.style.position="absolute",s.style.top="-1000px",s.style.left="-1000px",s.target=u,s.method="POST",s.setAttribute("accept-charset","utf-8"),a.name="d",s.appendChild(a),document.body.appendChild(s),this.form=s,this.area=a}this.form.action=this.uri(),r(),t=t.replace(p,"\\\n"),this.area.value=t.replace(c,"\\n");try{this.form.submit()}catch(f){}this.iframe.attachEvent?this.iframe.onreadystatechange=function(){"complete"==o.iframe.readyState&&n()}:this.iframe.onload=n}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./polling":18,"component-inherit":21}],17:[function(t,e){(function(n){function r(){}function o(t){if(c.call(this,t),n.location){var e="https:"==location.protocol,r=location.port;r||(r=e?443:80),this.xd=t.hostname!=n.location.hostname||r!=t.port,this.xs=t.secure!=e}}function i(t){this.method=t.method||"GET",this.uri=t.uri,this.xd=!!t.xd,this.xs=!!t.xs,this.async=!1!==t.async,this.data=void 0!=t.data?t.data:null,this.agent=t.agent,this.isBinary=t.isBinary,this.supportsBinary=t.supportsBinary,this.enablesXDR=t.enablesXDR,this.pfx=t.pfx,this.key=t.key,this.passphrase=t.passphrase,this.cert=t.cert,this.ca=t.ca,this.ciphers=t.ciphers,this.rejectUnauthorized=t.rejectUnauthorized,this.create()}function s(){for(var t in i.requests)i.requests.hasOwnProperty(t)&&i.requests[t].abort()}var a=t("xmlhttprequest"),c=t("./polling"),p=t("component-emitter"),u=t("component-inherit"),f=t("debug")("engine.io-client:polling-xhr");e.exports=o,e.exports.Request=i,u(o,c),o.prototype.supportsBinary=!0,o.prototype.request=function(t){return t=t||{},t.uri=this.uri(),t.xd=this.xd,t.xs=this.xs,t.agent=this.agent||!1,t.supportsBinary=this.supportsBinary,t.enablesXDR=this.enablesXDR,t.pfx=this.pfx,t.key=this.key,t.passphrase=this.passphrase,t.cert=this.cert,t.ca=this.ca,t.ciphers=this.ciphers,t.rejectUnauthorized=this.rejectUnauthorized,new i(t)},o.prototype.doWrite=function(t,e){var n="string"!=typeof t&&void 0!==t,r=this.request({method:"POST",data:t,isBinary:n}),o=this;r.on("success",e),r.on("error",function(t){o.onError("xhr post error",t)}),this.sendXhr=r},o.prototype.doPoll=function(){f("xhr poll");var t=this.request(),e=this;t.on("data",function(t){e.onData(t)}),t.on("error",function(t){e.onError("xhr poll error",t)}),this.pollXhr=t},p(i.prototype),i.prototype.create=function(){var t={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};t.pfx=this.pfx,t.key=this.key,t.passphrase=this.passphrase,t.cert=this.cert,t.ca=this.ca,t.ciphers=this.ciphers,t.rejectUnauthorized=this.rejectUnauthorized;var e=this.xhr=new a(t),r=this;try{if(f("xhr open %s: %s",this.method,this.uri),e.open(this.method,this.uri,this.async),this.supportsBinary&&(e.responseType="arraybuffer"),"POST"==this.method)try{this.isBinary?e.setRequestHeader("Content-type","application/octet-stream"):e.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(o){}"withCredentials"in e&&(e.withCredentials=!0),this.hasXDR()?(e.onload=function(){r.onLoad()},e.onerror=function(){r.onError(e.responseText)}):e.onreadystatechange=function(){4==e.readyState&&(200==e.status||1223==e.status?r.onLoad():setTimeout(function(){r.onError(e.status)},0))},f("xhr data %s",this.data),e.send(this.data)}catch(o){return void setTimeout(function(){r.onError(o)},0)}n.document&&(this.index=i.requestsCount++,i.requests[this.index]=this)},i.prototype.onSuccess=function(){this.emit("success"),this.cleanup()},i.prototype.onData=function(t){this.emit("data",t),this.onSuccess()},i.prototype.onError=function(t){this.emit("error",t),this.cleanup(!0)},i.prototype.cleanup=function(t){if("undefined"!=typeof this.xhr&&null!==this.xhr){if(this.hasXDR()?this.xhr.onload=this.xhr.onerror=r:this.xhr.onreadystatechange=r,t)try{this.xhr.abort()}catch(e){}n.document&&delete i.requests[this.index],this.xhr=null}},i.prototype.onLoad=function(){var t;try{var e;try{e=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(n){}t="application/octet-stream"===e?this.xhr.response:this.supportsBinary?"ok":this.xhr.responseText}catch(n){this.onError(n)}null!=t&&this.onData(t)},i.prototype.hasXDR=function(){return"undefined"!=typeof n.XDomainRequest&&!this.xs&&this.enablesXDR},i.prototype.abort=function(){this.cleanup()},n.document&&(i.requestsCount=0,i.requests={},n.attachEvent?n.attachEvent("onunload",s):n.addEventListener&&n.addEventListener("beforeunload",s,!1))}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./polling":18,"component-emitter":9,"component-inherit":21,debug:22,xmlhttprequest:20}],18:[function(t,e){function n(t){var e=t&&t.forceBase64;
+(!c||e)&&(this.supportsBinary=!1),r.call(this,t)}var r=t("../transport"),o=t("parseqs"),i=t("engine.io-parser"),s=t("component-inherit"),a=t("debug")("engine.io-client:polling");e.exports=n;var c=function(){var e=t("xmlhttprequest"),n=new e({xdomain:!1});return null!=n.responseType}();s(n,r),n.prototype.name="polling",n.prototype.doOpen=function(){this.poll()},n.prototype.pause=function(t){function e(){a("paused"),n.readyState="paused",t()}var n=this;if(this.readyState="pausing",this.polling||!this.writable){var r=0;this.polling&&(a("we are currently polling - waiting to pause"),r++,this.once("pollComplete",function(){a("pre-pause polling complete"),--r||e()})),this.writable||(a("we are currently writing - waiting to pause"),r++,this.once("drain",function(){a("pre-pause writing complete"),--r||e()}))}else e()},n.prototype.poll=function(){a("polling"),this.polling=!0,this.doPoll(),this.emit("poll")},n.prototype.onData=function(t){var e=this;a("polling got data %s",t);var n=function(t){return"opening"==e.readyState&&e.onOpen(),"close"==t.type?(e.onClose(),!1):void e.onPacket(t)};i.decodePayload(t,this.socket.binaryType,n),"closed"!=this.readyState&&(this.polling=!1,this.emit("pollComplete"),"open"==this.readyState?this.poll():a('ignoring poll - transport state "%s"',this.readyState))},n.prototype.doClose=function(){function t(){a("writing close packet"),e.write([{type:"close"}])}var e=this;"open"==this.readyState?(a("transport open - closing"),t()):(a("transport not open - deferring close"),this.once("open",t))},n.prototype.write=function(t){var e=this;this.writable=!1;var n=function(){e.writable=!0,e.emit("drain")},e=this;i.encodePayload(t,this.supportsBinary,function(t){e.doWrite(t,n)})},n.prototype.uri=function(){var t=this.query||{},e=this.secure?"https":"http",n="";return!1!==this.timestampRequests&&(t[this.timestampParam]=+new Date+"-"+r.timestamps++),this.supportsBinary||t.sid||(t.b64=1),t=o.encode(t),this.port&&("https"==e&&443!=this.port||"http"==e&&80!=this.port)&&(n=":"+this.port),t.length&&(t="?"+t),e+"://"+this.hostname+n+this.path+t}},{"../transport":14,"component-inherit":21,debug:22,"engine.io-parser":25,parseqs:35,xmlhttprequest:20}],19:[function(t,e){function n(t){var e=t&&t.forceBase64;e&&(this.supportsBinary=!1),r.call(this,t)}var r=t("../transport"),o=t("engine.io-parser"),i=t("parseqs"),s=t("component-inherit"),a=t("debug")("engine.io-client:websocket"),c=t("ws");e.exports=n,s(n,r),n.prototype.name="websocket",n.prototype.supportsBinary=!0,n.prototype.doOpen=function(){if(this.check()){var t=this.uri(),e=void 0,n={agent:this.agent};n.pfx=this.pfx,n.key=this.key,n.passphrase=this.passphrase,n.cert=this.cert,n.ca=this.ca,n.ciphers=this.ciphers,n.rejectUnauthorized=this.rejectUnauthorized,this.ws=new c(t,e,n),void 0===this.ws.binaryType&&(this.supportsBinary=!1),this.ws.binaryType="arraybuffer",this.addEventListeners()}},n.prototype.addEventListeners=function(){var t=this;this.ws.onopen=function(){t.onOpen()},this.ws.onclose=function(){t.onClose()},this.ws.onmessage=function(e){t.onData(e.data)},this.ws.onerror=function(e){t.onError("websocket error",e)}},"undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)&&(n.prototype.onData=function(t){var e=this;setTimeout(function(){r.prototype.onData.call(e,t)},0)}),n.prototype.write=function(t){function e(){n.writable=!0,n.emit("drain")}var n=this;this.writable=!1;for(var r=0,i=t.length;i>r;r++)o.encodePacket(t[r],this.supportsBinary,function(t){try{n.ws.send(t)}catch(e){a("websocket closed before onclose event")}});setTimeout(e,0)},n.prototype.onClose=function(){r.prototype.onClose.call(this)},n.prototype.doClose=function(){"undefined"!=typeof this.ws&&this.ws.close()},n.prototype.uri=function(){var t=this.query||{},e=this.secure?"wss":"ws",n="";return this.port&&("wss"==e&&443!=this.port||"ws"==e&&80!=this.port)&&(n=":"+this.port),this.timestampRequests&&(t[this.timestampParam]=+new Date),this.supportsBinary||(t.b64=1),t=i.encode(t),t.length&&(t="?"+t),e+"://"+this.hostname+n+this.path+t},n.prototype.check=function(){return!(!c||"__initialize"in c&&this.name===n.prototype.name)}},{"../transport":14,"component-inherit":21,debug:22,"engine.io-parser":25,parseqs:35,ws:37}],20:[function(t,e){var n=t("has-cors");e.exports=function(t){var e=t.xdomain,r=t.xscheme,o=t.enablesXDR;try{if("undefined"!=typeof XMLHttpRequest&&(!e||n))return new XMLHttpRequest}catch(i){}try{if("undefined"!=typeof XDomainRequest&&!r&&o)return new XDomainRequest}catch(i){}if(!e)try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}},{"has-cors":40}],21:[function(t,e){e.exports=function(t,e){var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},{}],22:[function(t,e,n){function r(){return"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function o(){var t=arguments,e=this.useColors;if(t[0]=(e?"%c":"")+this.namespace+(e?" %c":" ")+t[0]+(e?"%c ":" ")+"+"+n.humanize(this.diff),!e)return t;var r="color: "+this.color;t=[t[0],r,"color: inherit"].concat(Array.prototype.slice.call(t,1));var o=0,i=0;return t[0].replace(/%[a-z%]/g,function(t){"%"!==t&&(o++,"%c"===t&&(i=o))}),t.splice(i,0,r),t}function i(){return"object"==typeof console&&"function"==typeof console.log&&Function.prototype.apply.call(console.log,console,arguments)}function s(t){try{null==t?localStorage.removeItem("debug"):localStorage.debug=t}catch(e){}}function a(){var t;try{t=localStorage.debug}catch(e){}return t}n=e.exports=t("./debug"),n.log=i,n.formatArgs=o,n.save=s,n.load=a,n.useColors=r,n.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],n.formatters.j=function(t){return JSON.stringify(t)},n.enable(a())},{"./debug":23}],23:[function(t,e,n){function r(){return n.colors[u++%n.colors.length]}function o(t){function e(){}function o(){var t=o,e=+new Date,i=e-(p||e);t.diff=i,t.prev=p,t.curr=e,p=e,null==t.useColors&&(t.useColors=n.useColors()),null==t.color&&t.useColors&&(t.color=r());var s=Array.prototype.slice.call(arguments);s[0]=n.coerce(s[0]),"string"!=typeof s[0]&&(s=["%o"].concat(s));var a=0;s[0]=s[0].replace(/%([a-z%])/g,function(e,r){if("%"===e)return e;a++;var o=n.formatters[r];if("function"==typeof o){var i=s[a];e=o.call(t,i),s.splice(a,1),a--}return e}),"function"==typeof n.formatArgs&&(s=n.formatArgs.apply(t,s));var c=o.log||n.log||console.log.bind(console);c.apply(t,s)}e.enabled=!1,o.enabled=!0;var i=n.enabled(t)?o:e;return i.namespace=t,i}function i(t){n.save(t);for(var e=(t||"").split(/[\s,]+/),r=e.length,o=0;r>o;o++)e[o]&&(t=e[o].replace(/\*/g,".*?"),"-"===t[0]?n.skips.push(new RegExp("^"+t.substr(1)+"$")):n.names.push(new RegExp("^"+t+"$")))}function s(){n.enable("")}function a(t){var e,r;for(e=0,r=n.skips.length;r>e;e++)if(n.skips[e].test(t))return!1;for(e=0,r=n.names.length;r>e;e++)if(n.names[e].test(t))return!0;return!1}function c(t){return t instanceof Error?t.stack||t.message:t}n=e.exports=o,n.coerce=c,n.disable=s,n.enable=i,n.enabled=a,n.humanize=t("ms"),n.names=[],n.skips=[],n.formatters={};var p,u=0},{ms:24}],24:[function(t,e){function n(t){var e=/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(t);if(e){var n=parseFloat(e[1]),r=(e[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"y":return n*u;case"days":case"day":case"d":return n*p;case"hours":case"hour":case"h":return n*c;case"minutes":case"minute":case"m":return n*a;case"seconds":case"second":case"s":return n*s;case"ms":return n}}}function r(t){return t>=p?Math.round(t/p)+"d":t>=c?Math.round(t/c)+"h":t>=a?Math.round(t/a)+"m":t>=s?Math.round(t/s)+"s":t+"ms"}function o(t){return i(t,p,"day")||i(t,c,"hour")||i(t,a,"minute")||i(t,s,"second")||t+" ms"}function i(t,e,n){return e>t?void 0:1.5*e>t?Math.floor(t/e)+" "+n:Math.ceil(t/e)+" "+n+"s"}var s=1e3,a=60*s,c=60*a,p=24*c,u=365.25*p;e.exports=function(t,e){return e=e||{},"string"==typeof t?n(t):e.long?o(t):r(t)}},{}],25:[function(t,e,n){(function(e){function r(t,e){var r="b"+n.packets[t.type]+t.data.data;return e(r)}function o(t,e,r){if(!e)return n.encodeBase64Packet(t,r);var o=t.data,i=new Uint8Array(o),s=new Uint8Array(1+o.byteLength);s[0]=m[t.type];for(var a=0;a<i.length;a++)s[a+1]=i[a];return r(s.buffer)}function i(t,e,r){if(!e)return n.encodeBase64Packet(t,r);var o=new FileReader;return o.onload=function(){t.data=o.result,n.encodePacket(t,e,!0,r)},o.readAsArrayBuffer(t.data)}function s(t,e,r){if(!e)return n.encodeBase64Packet(t,r);if(g)return i(t,e,r);var o=new Uint8Array(1);o[0]=m[t.type];var s=new w([o.buffer,t.data]);return r(s)}function a(t,e,n){for(var r=new Array(t.length),o=h(t.length,n),i=function(t,n,o){e(n,function(e,n){r[t]=n,o(e,r)})},s=0;s<t.length;s++)i(s,t[s],o)}var c=t("./keys"),p=t("has-binary"),u=t("arraybuffer.slice"),f=t("base64-arraybuffer"),h=t("after"),l=t("utf8"),d=navigator.userAgent.match(/Android/i),y=/PhantomJS/i.test(navigator.userAgent),g=d||y;n.protocol=3;var m=n.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6},v=c(m),b={type:"error",data:"parser error"},w=t("blob");n.encodePacket=function(t,n,i,a){"function"==typeof n&&(a=n,n=!1),"function"==typeof i&&(a=i,i=null);var c=void 0===t.data?void 0:t.data.buffer||t.data;if(e.ArrayBuffer&&c instanceof ArrayBuffer)return o(t,n,a);if(w&&c instanceof e.Blob)return s(t,n,a);if(c&&c.base64)return r(t,a);var p=m[t.type];return void 0!==t.data&&(p+=i?l.encode(String(t.data)):String(t.data)),a(""+p)},n.encodeBase64Packet=function(t,r){var o="b"+n.packets[t.type];if(w&&t.data instanceof w){var i=new FileReader;return i.onload=function(){var t=i.result.split(",")[1];r(o+t)},i.readAsDataURL(t.data)}var s;try{s=String.fromCharCode.apply(null,new Uint8Array(t.data))}catch(a){for(var c=new Uint8Array(t.data),p=new Array(c.length),u=0;u<c.length;u++)p[u]=c[u];s=String.fromCharCode.apply(null,p)}return o+=e.btoa(s),r(o)},n.decodePacket=function(t,e,r){if("string"==typeof t||void 0===t){if("b"==t.charAt(0))return n.decodeBase64Packet(t.substr(1),e);if(r)try{t=l.decode(t)}catch(o){return b}var i=t.charAt(0);return Number(i)==i&&v[i]?t.length>1?{type:v[i],data:t.substring(1)}:{type:v[i]}:b}var s=new Uint8Array(t),i=s[0],a=u(t,1);return w&&"blob"===e&&(a=new w([a])),{type:v[i],data:a}},n.decodeBase64Packet=function(t,n){var r=v[t.charAt(0)];if(!e.ArrayBuffer)return{type:r,data:{base64:!0,data:t.substr(1)}};var o=f.decode(t.substr(1));return"blob"===n&&w&&(o=new w([o])),{type:r,data:o}},n.encodePayload=function(t,e,r){function o(t){return t.length+":"+t}function i(t,r){n.encodePacket(t,s?e:!1,!0,function(t){r(null,o(t))})}"function"==typeof e&&(r=e,e=null);var s=p(t);return e&&s?w&&!g?n.encodePayloadAsBlob(t,r):n.encodePayloadAsArrayBuffer(t,r):t.length?void a(t,i,function(t,e){return r(e.join(""))}):r("0:")},n.decodePayload=function(t,e,r){if("string"!=typeof t)return n.decodePayloadAsBinary(t,e,r);"function"==typeof e&&(r=e,e=null);var o;if(""==t)return r(b,0,1);for(var i,s,a="",c=0,p=t.length;p>c;c++){var u=t.charAt(c);if(":"!=u)a+=u;else{if(""==a||a!=(i=Number(a)))return r(b,0,1);if(s=t.substr(c+1,i),a!=s.length)return r(b,0,1);if(s.length){if(o=n.decodePacket(s,e,!0),b.type==o.type&&b.data==o.data)return r(b,0,1);var f=r(o,c+i,p);if(!1===f)return}c+=i,a=""}}return""!=a?r(b,0,1):void 0},n.encodePayloadAsArrayBuffer=function(t,e){function r(t,e){n.encodePacket(t,!0,!0,function(t){return e(null,t)})}return t.length?void a(t,r,function(t,n){var r=n.reduce(function(t,e){var n;return n="string"==typeof e?e.length:e.byteLength,t+n.toString().length+n+2},0),o=new Uint8Array(r),i=0;return n.forEach(function(t){var e="string"==typeof t,n=t;if(e){for(var r=new Uint8Array(t.length),s=0;s<t.length;s++)r[s]=t.charCodeAt(s);n=r.buffer}o[i++]=e?0:1;for(var a=n.byteLength.toString(),s=0;s<a.length;s++)o[i++]=parseInt(a[s]);o[i++]=255;for(var r=new Uint8Array(n),s=0;s<r.length;s++)o[i++]=r[s]}),e(o.buffer)}):e(new ArrayBuffer(0))},n.encodePayloadAsBlob=function(t,e){function r(t,e){n.encodePacket(t,!0,!0,function(t){var n=new Uint8Array(1);if(n[0]=1,"string"==typeof t){for(var r=new Uint8Array(t.length),o=0;o<t.length;o++)r[o]=t.charCodeAt(o);t=r.buffer,n[0]=0}for(var i=t instanceof ArrayBuffer?t.byteLength:t.size,s=i.toString(),a=new Uint8Array(s.length+1),o=0;o<s.length;o++)a[o]=parseInt(s[o]);if(a[s.length]=255,w){var c=new w([n.buffer,a.buffer,t]);e(null,c)}})}a(t,r,function(t,n){return e(new w(n))})},n.decodePayloadAsBinary=function(t,e,r){"function"==typeof e&&(r=e,e=null);for(var o=t,i=[],s=!1;o.byteLength>0;){for(var a=new Uint8Array(o),c=0===a[0],p="",f=1;255!=a[f];f++){if(p.length>310){s=!0;break}p+=a[f]}if(s)return r(b,0,1);o=u(o,2+p.length),p=parseInt(p);var h=u(o,0,p);if(c)try{h=String.fromCharCode.apply(null,new Uint8Array(h))}catch(l){var d=new Uint8Array(h);h="";for(var f=0;f<d.length;f++)h+=String.fromCharCode(d[f])}i.push(h),o=u(o,p)}var y=i.length;i.forEach(function(t,o){r(n.decodePacket(t,e,!0),o,y)})}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./keys":26,after:27,"arraybuffer.slice":28,"base64-arraybuffer":29,blob:30,"has-binary":31,utf8:33}],26:[function(t,e){e.exports=Object.keys||function(t){var e=[],n=Object.prototype.hasOwnProperty;for(var r in t)n.call(t,r)&&e.push(r);return e}},{}],27:[function(t,e){function n(t,e,n){function o(t,r){if(o.count<=0)throw new Error("after called too many times");--o.count,t?(i=!0,e(t),e=n):0!==o.count||i||e(null,r)}var i=!1;return n=n||r,o.count=t,0===t?e():o}function r(){}e.exports=n},{}],28:[function(t,e){e.exports=function(t,e,n){var r=t.byteLength;if(e=e||0,n=n||r,t.slice)return t.slice(e,n);if(0>e&&(e+=r),0>n&&(n+=r),n>r&&(n=r),e>=r||e>=n||0===r)return new ArrayBuffer(0);for(var o=new Uint8Array(t),i=new Uint8Array(n-e),s=e,a=0;n>s;s++,a++)i[a]=o[s];return i.buffer}},{}],29:[function(t,e,n){!function(t){"use strict";n.encode=function(e){var n,r=new Uint8Array(e),o=r.length,i="";for(n=0;o>n;n+=3)i+=t[r[n]>>2],i+=t[(3&r[n])<<4|r[n+1]>>4],i+=t[(15&r[n+1])<<2|r[n+2]>>6],i+=t[63&r[n+2]];return o%3===2?i=i.substring(0,i.length-1)+"=":o%3===1&&(i=i.substring(0,i.length-2)+"=="),i},n.decode=function(e){var n,r,o,i,s,a=.75*e.length,c=e.length,p=0;"="===e[e.length-1]&&(a--,"="===e[e.length-2]&&a--);var u=new ArrayBuffer(a),f=new Uint8Array(u);for(n=0;c>n;n+=4)r=t.indexOf(e[n]),o=t.indexOf(e[n+1]),i=t.indexOf(e[n+2]),s=t.indexOf(e[n+3]),f[p++]=r<<2|o>>4,f[p++]=(15&o)<<4|i>>2,f[p++]=(3&i)<<6|63&s;return u}}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],30:[function(t,e){(function(t){function n(t,e){e=e||{};for(var n=new r,o=0;o<t.length;o++)n.append(t[o]);return e.type?n.getBlob(e.type):n.getBlob()}var r=t.BlobBuilder||t.WebKitBlobBuilder||t.MSBlobBuilder||t.MozBlobBuilder,o=function(){try{var t=new Blob(["hi"]);return 2==t.size}catch(e){return!1}}(),i=r&&r.prototype.append&&r.prototype.getBlob;e.exports=function(){return o?t.Blob:i?n:void 0}()}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],31:[function(t,e){(function(n){function r(t){function e(t){if(!t)return!1;if(n.Buffer&&n.Buffer.isBuffer(t)||n.ArrayBuffer&&t instanceof ArrayBuffer||n.Blob&&t instanceof Blob||n.File&&t instanceof File)return!0;if(o(t)){for(var r=0;r<t.length;r++)if(e(t[r]))return!0}else if(t&&"object"==typeof t){t.toJSON&&(t=t.toJSON());for(var i in t)if(t.hasOwnProperty(i)&&e(t[i]))return!0}return!1}return e(t)}var o=t("isarray");e.exports=r}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{isarray:32}],32:[function(t,e){e.exports=Array.isArray||function(t){return"[object Array]"==Object.prototype.toString.call(t)}},{}],33:[function(e,n,r){(function(e){!function(o){function i(t){for(var e,n,r=[],o=0,i=t.length;i>o;)e=t.charCodeAt(o++),e>=55296&&56319>=e&&i>o?(n=t.charCodeAt(o++),56320==(64512&n)?r.push(((1023&e)<<10)+(1023&n)+65536):(r.push(e),o--)):r.push(e);return r}function s(t){for(var e,n=t.length,r=-1,o="";++r<n;)e=t[r],e>65535&&(e-=65536,o+=b(e>>>10&1023|55296),e=56320|1023&e),o+=b(e);return o}function a(t,e){return b(t>>e&63|128)}function c(t){if(0==(4294967168&t))return b(t);var e="";return 0==(4294965248&t)?e=b(t>>6&31|192):0==(4294901760&t)?(e=b(t>>12&15|224),e+=a(t,6)):0==(4292870144&t)&&(e=b(t>>18&7|240),e+=a(t,12),e+=a(t,6)),e+=b(63&t|128)}function p(t){for(var e,n=i(t),r=n.length,o=-1,s="";++o<r;)e=n[o],s+=c(e);return s}function u(){if(v>=m)throw Error("Invalid byte index");var t=255&g[v];if(v++,128==(192&t))return 63&t;throw Error("Invalid continuation byte")}function f(){var t,e,n,r,o;if(v>m)throw Error("Invalid byte index");if(v==m)return!1;if(t=255&g[v],v++,0==(128&t))return t;if(192==(224&t)){var e=u();if(o=(31&t)<<6|e,o>=128)return o;throw Error("Invalid continuation byte")}if(224==(240&t)){if(e=u(),n=u(),o=(15&t)<<12|e<<6|n,o>=2048)return o;throw Error("Invalid continuation byte")}if(240==(248&t)&&(e=u(),n=u(),r=u(),o=(15&t)<<18|e<<12|n<<6|r,o>=65536&&1114111>=o))return o;throw Error("Invalid UTF-8 detected")}function h(t){g=i(t),m=g.length,v=0;for(var e,n=[];(e=f())!==!1;)n.push(e);return s(n)}var l="object"==typeof r&&r,d="object"==typeof n&&n&&n.exports==l&&n,y="object"==typeof e&&e;(y.global===y||y.window===y)&&(o=y);var g,m,v,b=String.fromCharCode,w={version:"2.0.0",encode:p,decode:h};if("function"==typeof t&&"object"==typeof t.amd&&t.amd)t(function(){return w});else if(l&&!l.nodeType)if(d)d.exports=w;else{var k={},x=k.hasOwnProperty;for(var A in w)x.call(w,A)&&(l[A]=w[A])}else o.utf8=w}(this)}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],34:[function(t,e){(function(t){var n=/^[\],:{}\s]*$/,r=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,o=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,i=/(?:^|:|,)(?:\s*\[)+/g,s=/^\s+/,a=/\s+$/;e.exports=function(e){return"string"==typeof e&&e?(e=e.replace(s,"").replace(a,""),t.JSON&&JSON.parse?JSON.parse(e):n.test(e.replace(r,"@").replace(o,"]").replace(i,""))?new Function("return "+e)():void 0):null}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],35:[function(t,e,n){n.encode=function(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e},n.decode=function(t){for(var e={},n=t.split("&"),r=0,o=n.length;o>r;r++){var i=n[r].split("=");e[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return e}},{}],36:[function(t,e){var n=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,r=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];e.exports=function(t){var e=t,o=t.indexOf("["),i=t.indexOf("]");-1!=o&&-1!=i&&(t=t.substring(0,o)+t.substring(o,i).replace(/:/g,";")+t.substring(i,t.length));for(var s=n.exec(t||""),a={},c=14;c--;)a[r[c]]=s[c]||"";return-1!=o&&-1!=i&&(a.source=e,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,":"),a.authority=a.authority.replace("[","").replace("]","").replace(/;/g,":"),a.ipv6uri=!0),a}},{}],37:[function(t,e){function n(t,e){var n;return n=e?new o(t,e):new o(t)}var r=function(){return this}(),o=r.WebSocket||r.MozWebSocket;e.exports=o?n:null,o&&(n.prototype=o.prototype)},{}],38:[function(t,e){(function(n){function r(t){function e(t){if(!t)return!1;if(n.Buffer&&n.Buffer.isBuffer(t)||n.ArrayBuffer&&t instanceof ArrayBuffer||n.Blob&&t instanceof Blob||n.File&&t instanceof File)return!0;if(o(t)){for(var r=0;r<t.length;r++)if(e(t[r]))return!0}else if(t&&"object"==typeof t){t.toJSON&&(t=t.toJSON());for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&e(t[i]))return!0}return!1}return e(t)}var o=t("isarray");e.exports=r}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{isarray:39}],39:[function(t,e){e.exports=t(32)},{}],40:[function(t,e){var n=t("global");try{e.exports="XMLHttpRequest"in n&&"withCredentials"in new n.XMLHttpRequest}catch(r){e.exports=!1}},{global:41}],41:[function(t,e){e.exports=function(){return this}()},{}],42:[function(t,e){var n=[].indexOf;e.exports=function(t,e){if(n)return t.indexOf(e);for(var r=0;r<t.length;++r)if(t[r]===e)return r;return-1}},{}],43:[function(t,e,n){var r=Object.prototype.hasOwnProperty;n.keys=Object.keys||function(t){var e=[];for(var n in t)r.call(t,n)&&e.push(n);return e},n.values=function(t){var e=[];for(var n in t)r.call(t,n)&&e.push(t[n]);return e},n.merge=function(t,e){for(var n in e)r.call(e,n)&&(t[n]=e[n]);return t},n.length=function(t){return n.keys(t).length},n.isEmpty=function(t){return 0==n.length(t)}},{}],44:[function(t,e){var n=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,r=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];e.exports=function(t){for(var e=n.exec(t||""),o={},i=14;i--;)o[r[i]]=e[i]||"";return o}},{}],45:[function(t,e,n){(function(e){var r=t("isarray"),o=t("./is-buffer");n.deconstructPacket=function(t){function e(t){if(!t)return t;if(o(t)){var i={_placeholder:!0,num:n.length};return n.push(t),i}if(r(t)){for(var s=new Array(t.length),a=0;a<t.length;a++)s[a]=e(t[a]);return s}if("object"==typeof t&&!(t instanceof Date)){var s={};for(var c in t)s[c]=e(t[c]);return s}return t}var n=[],i=t.data,s=t;return s.data=e(i),s.attachments=n.length,{packet:s,buffers:n}},n.reconstructPacket=function(t,e){function n(t){if(t&&t._placeholder){var o=e[t.num];return o}if(r(t)){for(var i=0;i<t.length;i++)t[i]=n(t[i]);return t}if(t&&"object"==typeof t){for(var s in t)t[s]=n(t[s]);return t}return t}return t.data=n(t.data),t.attachments=void 0,t},n.removeBlobs=function(t,n){function i(t,c,p){if(!t)return t;if(e.Blob&&t instanceof Blob||e.File&&t instanceof File){s++;var u=new FileReader;u.onload=function(){p?p[c]=this.result:a=this.result,--s||n(a)},u.readAsArrayBuffer(t)}else if(r(t))for(var f=0;f<t.length;f++)i(t[f],f,t);else if(t&&"object"==typeof t&&!o(t))for(var h in t)i(t[h],h,t)}var s=0,a=t;i(a),s||n(a)}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./is-buffer":47,isarray:48}],46:[function(t,e,n){function r(){}function o(t){var e="",r=!1;return e+=t.type,(n.BINARY_EVENT==t.type||n.BINARY_ACK==t.type)&&(e+=t.attachments,e+="-"),t.nsp&&"/"!=t.nsp&&(r=!0,e+=t.nsp),null!=t.id&&(r&&(e+=",",r=!1),e+=t.id),null!=t.data&&(r&&(e+=","),e+=f.stringify(t.data)),u("encoded %j as %s",t,e),e}function i(t,e){function n(t){var n=l.deconstructPacket(t),r=o(n.packet),i=n.buffers;i.unshift(r),e(i)}l.removeBlobs(t,n)}function s(){this.reconstructor=null}function a(t){var e={},r=0;if(e.type=Number(t.charAt(0)),null==n.types[e.type])return p();if(n.BINARY_EVENT==e.type||n.BINARY_ACK==e.type){for(var o="";"-"!=t.charAt(++r)&&(o+=t.charAt(r),r!=t.length););if(o!=Number(o)||"-"!=t.charAt(r))throw new Error("Illegal attachments");e.attachments=Number(o)}if("/"==t.charAt(r+1))for(e.nsp="";++r;){var i=t.charAt(r);if(","==i)break;if(e.nsp+=i,r==t.length)break}else e.nsp="/";var s=t.charAt(r+1);if(""!==s&&Number(s)==s){for(e.id="";++r;){var i=t.charAt(r);if(null==i||Number(i)!=i){--r;break}if(e.id+=t.charAt(r),r==t.length)break}e.id=Number(e.id)}if(t.charAt(++r))try{e.data=f.parse(t.substr(r))}catch(a){return p()}return u("decoded %s as %j",t,e),e}function c(t){this.reconPack=t,this.buffers=[]}function p(){return{type:n.ERROR,data:"parser error"}}var u=t("debug")("socket.io-parser"),f=t("json3"),h=(t("isarray"),t("component-emitter")),l=t("./binary"),d=t("./is-buffer");n.protocol=4,n.types=["CONNECT","DISCONNECT","EVENT","BINARY_EVENT","ACK","BINARY_ACK","ERROR"],n.CONNECT=0,n.DISCONNECT=1,n.EVENT=2,n.ACK=3,n.ERROR=4,n.BINARY_EVENT=5,n.BINARY_ACK=6,n.Encoder=r,n.Decoder=s,r.prototype.encode=function(t,e){if(u("encoding packet %j",t),n.BINARY_EVENT==t.type||n.BINARY_ACK==t.type)i(t,e);else{var r=o(t);e([r])}},h(s.prototype),s.prototype.add=function(t){var e;if("string"==typeof t)e=a(t),n.BINARY_EVENT==e.type||n.BINARY_ACK==e.type?(this.reconstructor=new c(e),0===this.reconstructor.reconPack.attachments&&this.emit("decoded",e)):this.emit("decoded",e);else{if(!d(t)&&!t.base64)throw new Error("Unknown type: "+t);if(!this.reconstructor)throw new Error("got binary data when not reconstructing a packet");e=this.reconstructor.takeBinaryData(t),e&&(this.reconstructor=null,this.emit("decoded",e))}},s.prototype.destroy=function(){this.reconstructor&&this.reconstructor.finishedReconstruction()},c.prototype.takeBinaryData=function(t){if(this.buffers.push(t),this.buffers.length==this.reconPack.attachments){var e=l.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null},c.prototype.finishedReconstruction=function(){this.reconPack=null,this.buffers=[]}},{"./binary":45,"./is-buffer":47,"component-emitter":9,debug:10,isarray:48,json3:49}],47:[function(t,e){(function(t){function n(e){return t.Buffer&&t.Buffer.isBuffer(e)||t.ArrayBuffer&&e instanceof ArrayBuffer}e.exports=n}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],48:[function(t,e){e.exports=t(32)},{}],49:[function(e,n,r){!function(e){function n(t){if(n[t]!==s)return n[t];var e;if("bug-string-char-index"==t)e="a"!="a"[0];else if("json"==t)e=n("json-stringify")&&n("json-parse");else{var r,o='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if("json-stringify"==t){var i=u.stringify,c="function"==typeof i&&f;if(c){(r=function(){return 1}).toJSON=r;try{c="0"===i(0)&&"0"===i(new Number)&&'""'==i(new String)&&i(a)===s&&i(s)===s&&i()===s&&"1"===i(r)&&"[1]"==i([r])&&"[null]"==i([s])&&"null"==i(null)&&"[null,null,null]"==i([s,a,null])&&i({a:[r,!0,!1,null,"\x00\b\n\f\r "]})==o&&"1"===i(null,r)&&"[\n 1,\n 2\n]"==i([1,2],null,1)&&'"-271821-04-20T00:00:00.000Z"'==i(new Date(-864e13))&&'"+275760-09-13T00:00:00.000Z"'==i(new Date(864e13))&&'"-000001-01-01T00:00:00.000Z"'==i(new Date(-621987552e5))&&'"1969-12-31T23:59:59.999Z"'==i(new Date(-1))}catch(p){c=!1}}e=c}if("json-parse"==t){var h=u.parse;if("function"==typeof h)try{if(0===h("0")&&!h(!1)){r=h(o);var l=5==r.a.length&&1===r.a[0];if(l){try{l=!h('" "')}catch(p){}if(l)try{l=1!==h("01")}catch(p){}if(l)try{l=1!==h("1.")}catch(p){}}}}catch(p){l=!1}e=l}}return n[t]=!!e}var o,i,s,a={}.toString,c="function"==typeof t&&t.amd,p="object"==typeof JSON&&JSON,u="object"==typeof r&&r&&!r.nodeType&&r;u&&p?(u.stringify=p.stringify,u.parse=p.parse):u=e.JSON=p||{};var f=new Date(-0xc782b5b800cec);try{f=-109252==f.getUTCFullYear()&&0===f.getUTCMonth()&&1===f.getUTCDate()&&10==f.getUTCHours()&&37==f.getUTCMinutes()&&6==f.getUTCSeconds()&&708==f.getUTCMilliseconds()}catch(h){}if(!n("json")){var l="[object Function]",d="[object Date]",y="[object Number]",g="[object String]",m="[object Array]",v="[object Boolean]",b=n("bug-string-char-index");if(!f)var w=Math.floor,k=[0,31,59,90,120,151,181,212,243,273,304,334],x=function(t,e){return k[e]+365*(t-1970)+w((t-1969+(e=+(e>1)))/4)-w((t-1901+e)/100)+w((t-1601+e)/400)};(o={}.hasOwnProperty)||(o=function(t){var e,n={};return(n.__proto__=null,n.__proto__={toString:1},n).toString!=a?o=function(t){var e=this.__proto__,n=t in(this.__proto__=null,this);return this.__proto__=e,n}:(e=n.constructor,o=function(t){var n=(this.constructor||e).prototype;return t in this&&!(t in n&&this[t]===n[t])}),n=null,o.call(this,t)});var A={"boolean":1,number:1,string:1,undefined:1},B=function(t,e){var n=typeof t[e];return"object"==n?!!t[e]:!A[n]};if(i=function(t,e){var n,r,s,c=0;(n=function(){this.valueOf=0}).prototype.valueOf=0,r=new n;for(s in r)o.call(r,s)&&c++;return n=r=null,c?i=2==c?function(t,e){var n,r={},i=a.call(t)==l;for(n in t)i&&"prototype"==n||o.call(r,n)||!(r[n]=1)||!o.call(t,n)||e(n)}:function(t,e){var n,r,i=a.call(t)==l;for(n in t)i&&"prototype"==n||!o.call(t,n)||(r="constructor"===n)||e(n);(r||o.call(t,n="constructor"))&&e(n)}:(r=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"],i=function(t,e){var n,i,s=a.call(t)==l,c=!s&&"function"!=typeof t.constructor&&B(t,"hasOwnProperty")?t.hasOwnProperty:o;for(n in t)s&&"prototype"==n||!c.call(t,n)||e(n);for(i=r.length;n=r[--i];c.call(t,n)&&e(n));}),i(t,e)},!n("json-stringify")){var C={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"},S="000000",E=function(t,e){return(S+(e||0)).slice(-t)},T="\\u00",j=function(t){var e,n='"',r=0,o=t.length,i=o>10&&b;for(i&&(e=t.split(""));o>r;r++){var s=t.charCodeAt(r);switch(s){case 8:case 9:case 10:case 12:case 13:case 34:case 92:n+=C[s];break;default:if(32>s){n+=T+E(2,s.toString(16));break}n+=i?e[r]:b?t.charAt(r):t[r]}}return n+'"'},_=function(t,e,n,r,c,p,u){var f,h,l,b,k,A,B,C,S,T,P,R,N,O,q,D;try{f=e[t]}catch(U){}if("object"==typeof f&&f)if(h=a.call(f),h!=d||o.call(f,"toJSON"))"function"==typeof f.toJSON&&(h!=y&&h!=g&&h!=m||o.call(f,"toJSON"))&&(f=f.toJSON(t));else if(f>-1/0&&1/0>f){if(x){for(k=w(f/864e5),l=w(k/365.2425)+1970-1;x(l+1,0)<=k;l++);for(b=w((k-x(l,0))/30.42);x(l,b+1)<=k;b++);k=1+k-x(l,b),A=(f%864e5+864e5)%864e5,B=w(A/36e5)%24,C=w(A/6e4)%60,S=w(A/1e3)%60,T=A%1e3}else l=f.getUTCFullYear(),b=f.getUTCMonth(),k=f.getUTCDate(),B=f.getUTCHours(),C=f.getUTCMinutes(),S=f.getUTCSeconds(),T=f.getUTCMilliseconds();f=(0>=l||l>=1e4?(0>l?"-":"+")+E(6,0>l?-l:l):E(4,l))+"-"+E(2,b+1)+"-"+E(2,k)+"T"+E(2,B)+":"+E(2,C)+":"+E(2,S)+"."+E(3,T)+"Z"}else f=null;if(n&&(f=n.call(e,t,f)),null===f)return"null";if(h=a.call(f),h==v)return""+f;if(h==y)return f>-1/0&&1/0>f?""+f:"null";if(h==g)return j(""+f);if("object"==typeof f){for(O=u.length;O--;)if(u[O]===f)throw TypeError();if(u.push(f),P=[],q=p,p+=c,h==m){for(N=0,O=f.length;O>N;N++)R=_(N,f,n,r,c,p,u),P.push(R===s?"null":R);D=P.length?c?"[\n"+p+P.join(",\n"+p)+"\n"+q+"]":"["+P.join(",")+"]":"[]"}else i(r||f,function(t){var e=_(t,f,n,r,c,p,u);e!==s&&P.push(j(t)+":"+(c?" ":"")+e)}),D=P.length?c?"{\n"+p+P.join(",\n"+p)+"\n"+q+"}":"{"+P.join(",")+"}":"{}";return u.pop(),D}};u.stringify=function(t,e,n){var r,o,i,s;if("function"==typeof e||"object"==typeof e&&e)if((s=a.call(e))==l)o=e;else if(s==m){i={};for(var c,p=0,u=e.length;u>p;c=e[p++],s=a.call(c),(s==g||s==y)&&(i[c]=1));}if(n)if((s=a.call(n))==y){if((n-=n%1)>0)for(r="",n>10&&(n=10);r.length<n;r+=" ");}else s==g&&(r=n.length<=10?n:n.slice(0,10));return _("",(c={},c[""]=t,c),o,i,r,"",[])}}if(!n("json-parse")){var P,R,N=String.fromCharCode,O={92:"\\",34:'"',47:"/",98:"\b",116:" ",110:"\n",102:"\f",114:"\r"},q=function(){throw P=R=null,SyntaxError()},D=function(){for(var t,e,n,r,o,i=R,s=i.length;s>P;)switch(o=i.charCodeAt(P)){case 9:case 10:case 13:case 32:P++;break;case 123:case 125:case 91:case 93:case 58:case 44:return t=b?i.charAt(P):i[P],P++,t;case 34:for(t="@",P++;s>P;)if(o=i.charCodeAt(P),32>o)q();else if(92==o)switch(o=i.charCodeAt(++P)){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:t+=O[o],P++;break;case 117:for(e=++P,n=P+4;n>P;P++)o=i.charCodeAt(P),o>=48&&57>=o||o>=97&&102>=o||o>=65&&70>=o||q();t+=N("0x"+i.slice(e,P));break;default:q()}else{if(34==o)break;for(o=i.charCodeAt(P),e=P;o>=32&&92!=o&&34!=o;)o=i.charCodeAt(++P);t+=i.slice(e,P)}if(34==i.charCodeAt(P))return P++,t;q();default:if(e=P,45==o&&(r=!0,o=i.charCodeAt(++P)),o>=48&&57>=o){for(48==o&&(o=i.charCodeAt(P+1),o>=48&&57>=o)&&q(),r=!1;s>P&&(o=i.charCodeAt(P),o>=48&&57>=o);P++);if(46==i.charCodeAt(P)){for(n=++P;s>n&&(o=i.charCodeAt(n),o>=48&&57>=o);n++);n==P&&q(),P=n}if(o=i.charCodeAt(P),101==o||69==o){for(o=i.charCodeAt(++P),(43==o||45==o)&&P++,n=P;s>n&&(o=i.charCodeAt(n),o>=48&&57>=o);n++);n==P&&q(),P=n}return+i.slice(e,P)}if(r&&q(),"true"==i.slice(P,P+4))return P+=4,!0;if("false"==i.slice(P,P+5))return P+=5,!1;
+if("null"==i.slice(P,P+4))return P+=4,null;q()}return"$"},U=function(t){var e,n;if("$"==t&&q(),"string"==typeof t){if("@"==(b?t.charAt(0):t[0]))return t.slice(1);if("["==t){for(e=[];t=D(),"]"!=t;n||(n=!0))n&&(","==t?(t=D(),"]"==t&&q()):q()),","==t&&q(),e.push(U(t));return e}if("{"==t){for(e={};t=D(),"}"!=t;n||(n=!0))n&&(","==t?(t=D(),"}"==t&&q()):q()),(","==t||"string"!=typeof t||"@"!=(b?t.charAt(0):t[0])||":"!=D())&&q(),e[t.slice(1)]=U(D());return e}q()}return t},I=function(t,e,n){var r=L(t,e,n);r===s?delete t[e]:t[e]=r},L=function(t,e,n){var r,o=t[e];if("object"==typeof o&&o)if(a.call(o)==m)for(r=o.length;r--;)I(o,r,n);else i(o,function(t){I(o,t,n)});return n.call(t,e,o)};u.parse=function(t,e){var n,r;return P=0,R=""+t,n=U(D()),"$"!=D()&&q(),P=R=null,e&&a.call(e)==l?L((r={},r[""]=n,r),"",e):n}}}c&&t(function(){return u})}(this)},{}],50:[function(t,e){function n(t,e){var n=[];e=e||0;for(var r=e||0;r<t.length;r++)n[r-e]=t[r];return n}e.exports=n},{}]},{},[1])(1)}); \ No newline at end of file
diff --git a/desktop/share/templates/401.html b/desktop/share/templates/401.html
new file mode 100644
index 00000000..5e43ca01
--- /dev/null
+++ b/desktop/share/templates/401.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare: 401 Unauthorized Access</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon" />
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+</head>
+
+<body>
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="{{ static_url_path }}/img/logo_large.png" title="OnionShare"></p>
+ <p class="info-header">401 Unauthorized Access</p>
+ </div>
+ </div>
+</body>
+
+</html>
diff --git a/desktop/share/templates/403.html b/desktop/share/templates/403.html
new file mode 100644
index 00000000..c9d28eea
--- /dev/null
+++ b/desktop/share/templates/403.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare: 403 Forbidden</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon" />
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+</head>
+
+<body>
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="{{ static_url_path }}/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/desktop/share/templates/404.html b/desktop/share/templates/404.html
new file mode 100644
index 00000000..e816f2c4
--- /dev/null
+++ b/desktop/share/templates/404.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare: 404 Not Found</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+</head>
+
+<body>
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="{{ static_url_path }}/img/logo_large.png" title="OnionShare"></p>
+ <p class="info-header">404 Not Found</p>
+ </div>
+ </div>
+</body>
+
+</html>
diff --git a/desktop/share/templates/405.html b/desktop/share/templates/405.html
new file mode 100644
index 00000000..63888004
--- /dev/null
+++ b/desktop/share/templates/405.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare: 405 Method Not Allowed</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+</head>
+
+<body>
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="{{ static_url_path }}/img/logo_large.png" title="OnionShare"></p>
+ <p class="info-header">405 Method Not Allowed</p>
+ </div>
+ </div>
+</body>
+
+</html>
diff --git a/desktop/share/templates/chat.html b/desktop/share/templates/chat.html
new file mode 100644
index 00000000..b4443c09
--- /dev/null
+++ b/desktop/share/templates/chat.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare</title>
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+</head>
+
+<body>
+
+ <header class="clearfix">
+ <img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </header>
+ <noscript>
+ <p>
+ Chat <b>requires JavaScript</b>, so you must set your Tor Browser security
+ level to <b>Safer</b> or <b>Standard</b> to join.
+ </p>
+ </noscript>
+
+ <div class="chat-container no-js">
+ <div class="chat-users">
+ <div class="editable-username">
+ <input id="username" value="{{ username }}" />
+ <p id="username-error"></p>
+ </div>
+ <ul id="user-list">
+ </ul>
+ </div>
+ <div class="chat-wrapper">
+ <div id="chat"></div>
+
+ <div class="chat-form">
+ <input type="text" id="new-message" name="new-message" placeholder="Type your message" />
+ </div>
+
+ </div>
+ </div>
+ <script src="{{ static_url_path }}/js/jquery-3.5.1.min.js"></script>
+ <script src="{{ static_url_path }}/js/socket.io.min.js"></script>
+ <script async src="{{ static_url_path }}/js/chat.js"></script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/desktop/share/templates/denied.html b/desktop/share/templates/denied.html
new file mode 100644
index 00000000..49147ef2
--- /dev/null
+++ b/desktop/share/templates/denied.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon" />
+</head>
+
+<body>
+ <p>OnionShare download in progress</p>
+</body>
+
+</html>
diff --git a/desktop/share/templates/listing.html b/desktop/share/templates/listing.html
new file mode 100644
index 00000000..ea050710
--- /dev/null
+++ b/desktop/share/templates/listing.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>OnionShare</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon" />
+ <link href="{{ static_url_path }}/css/style.css" rel="stylesheet" type="text/css" />
+ </head>
+ <body>
+
+ <header class="clearfix">
+ <img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </header>
+
+ {% if breadcrumbs %}
+ <ul class="breadcrumbs">
+ {% for breadcrumb in breadcrumbs %}<li><a href="{{ breadcrumb[1] }}">{{ breadcrumb[0] }}</a> <span class="sep">&#8227;</span></li>{% endfor %}<li>{{ breadcrumbs_leaf }}</li>
+ </ul>
+ {% endif %}
+
+ <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 dirs %}
+ <tr>
+ <td>
+ <img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_folder.png" />
+ <a href="{{ info.basename }}">
+ {{ info.basename }}
+ </a>
+ </td>
+ <td>&mdash;</td>
+ </tr>
+ {% endfor %}
+
+ {% for info in files %}
+ <tr>
+ <td>
+ <img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_file.png" />
+ <a href="{{ info.basename }}">
+ {{ info.basename }}
+ </a>
+ </td>
+ <td>{{ info.size_human }}</td>
+ </tr>
+ {% endfor %}
+ </table>
+ </body>
+</html>
diff --git a/desktop/share/templates/receive.html b/desktop/share/templates/receive.html
new file mode 100644
index 00000000..20f4bb7e
--- /dev/null
+++ b/desktop/share/templates/receive.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>OnionShare</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+ </head>
+ <body>
+
+ <header class="clearfix">
+ <img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </header>
+
+ <div class="upload-wrapper">
+ <p><img class="logo" src="{{ static_url_path }}/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>
+
+ <div id="uploads"></div>
+
+ <div>
+ <ul id="flashes" class="flashes">
+ {% with messages = get_flashed_messages(with_categories=true) %}
+ {% if messages %}
+ {% for category, message in messages %}
+ <li class="{{ category }}">{{ message }}</li>
+ {% endfor %}
+ {% endif %}
+ {% endwith %}
+ </ul>
+ </div>
+
+ <form id="send" method="post" enctype="multipart/form-data" action="/upload">
+ <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_url_path }}/js/jquery-3.5.1.min.js"></script>
+ <script async src="{{ static_url_path }}/js/receive.js" id="receive-script"></script>
+ </body>
+</html>
diff --git a/desktop/share/templates/send.html b/desktop/share/templates/send.html
new file mode 100644
index 00000000..dd30bfdd
--- /dev/null
+++ b/desktop/share/templates/send.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+ <meta name="onionshare-filename" content="{{ filename }}">
+ <meta name="onionshare-filesize" content="{{ filesize }}">
+</head>
+
+<body>
+
+ <header class="d-flex">
+ <div class="logo-container">
+ <img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </div>
+ <div class="information d-flex">
+ <div>Total size: <strong>{{ filesize_human }}</strong> {% if is_zipped %} (compressed){% endif %}</div>
+ <a class="button" href='/download'>Download Files</a>
+ </div>
+ </header>
+
+ {% if breadcrumbs %}
+ <ul class="breadcrumbs">
+ {% for breadcrumb in breadcrumbs %}<li><a href="{{ breadcrumb[1] }}">{{ breadcrumb[0] }}</a> <span class="sep">&#8227;</span></li>{% endfor %}<li>{{ breadcrumbs_leaf }}</li>
+ </ul>
+ {% endif %}
+
+ <div class="file-list" id="file-list">
+ <div class="d-flex">
+ <div id="filename-header" class="heading">Filename</div>
+ <div id="size-header" class="heading">Size</div>
+ </div>
+ {% for info in dirs %}
+ <div class="d-flex">
+ <div>
+ <img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_folder.png" />
+ <a href="{{ info.basename }}">
+ <span>{{ info.basename }}</span>
+ </a>
+ </div>
+ <div>&mdash;</div>
+ </div>
+ {% endfor %}
+
+ {% for info in files %}
+ <div class="d-flex">
+ <div>
+ <img width="30" height="30" title="" alt="" src="{{ static_url_path }}/img/web_file.png" />
+ {% if download_individual_files %}
+ <a href="{{ info.basename }}">
+ <span>{{ info.basename }}</span>
+ </a>
+ {% else %}
+ <span>{{ info.basename }}</span>
+ {% endif %}
+ </div>
+ <div>{{ info.size_human }}</div>
+ </div>
+ {% endfor %}
+ </div>
+ <script async src="{{ static_url_path }}/js/send.js" charset="utf-8"></script>
+</body>
+
+</html>
diff --git a/desktop/share/templates/thankyou.html b/desktop/share/templates/thankyou.html
new file mode 100644
index 00000000..aa0bc553
--- /dev/null
+++ b/desktop/share/templates/thankyou.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>OnionShare is closed</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="{{ static_url_path }}/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="{{ static_url_path }}/css/style.css" media="all">
+</head>
+
+<body>
+ <header class="clearfix">
+ <img class="logo" src="{{ static_url_path }}/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </header>
+
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="{{ static_url_path }}/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/desktop/share/torrc_template b/desktop/share/torrc_template
new file mode 100644
index 00000000..8ac9e1ef
--- /dev/null
+++ b/desktop/share/torrc_template
@@ -0,0 +1,8 @@
+DataDirectory {{data_directory}}
+SocksPort {{socks_port}}
+CookieAuthentication 1
+CookieAuthFile {{cookie_auth_file}}
+AvoidDiskWrites 1
+Log notice stdout
+GeoIPFile {{geo_ip_file}}
+GeoIPv6File {{geo_ipv6_file}}
diff --git a/desktop/share/torrc_template-meek_lite_amazon b/desktop/share/torrc_template-meek_lite_amazon
new file mode 100644
index 00000000..606ae889
--- /dev/null
+++ b/desktop/share/torrc_template-meek_lite_amazon
@@ -0,0 +1,2 @@
+Bridge meek_lite 0.0.2.0:2 B9E7141C594AF25699E0079C1F0146F409495296 url=https://d2cly7j4zqgua7.cloudfront.net/ front=a0.awsstatic.com
+UseBridges 1 \ No newline at end of file
diff --git a/desktop/share/torrc_template-meek_lite_azure b/desktop/share/torrc_template-meek_lite_azure
new file mode 100644
index 00000000..a9b374ba
--- /dev/null
+++ b/desktop/share/torrc_template-meek_lite_azure
@@ -0,0 +1,2 @@
+Bridge meek_lite 0.0.2.0:3 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com
+UseBridges 1 \ No newline at end of file
diff --git a/desktop/share/torrc_template-obfs4 b/desktop/share/torrc_template-obfs4
new file mode 100644
index 00000000..306c456c
--- /dev/null
+++ b/desktop/share/torrc_template-obfs4
@@ -0,0 +1,27 @@
+Bridge obfs4 154.35.22.10:80 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0
+Bridge obfs4 83.212.101.3:50002 A09D536DD1752D542E1FBB3C9CE4449D51298239 cert=lPRQ/MXdD1t5SRZ9MquYQNT9m5DV757jtdXdlePmRCudUU9CFUOX1Tm7/meFSyPOsud7Cw iat-mode=0
+Bridge obfs4 109.105.109.165:10527 8DFCD8FB3285E855F5A55EDDA35696C743ABFC4E cert=Bvg/itxeL4TWKLP6N1MaQzSOC6tcRIBv6q57DYAZc3b2AzuM+/TfB7mqTFEfXILCjEwzVA iat-mode=1
+Bridge obfs4 154.35.22.11:80 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0
+Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0
+Bridge obfs4 154.35.22.9:443 C73ADBAC8ADFDBF0FC0F3F4E8091C0107D093716 cert=gEGKc5WN/bSjFa6UkG9hOcft1tuK+cV8hbZ0H6cqXiMPLqSbCh2Q3PHe5OOr6oMVORhoJA iat-mode=0
+Bridge obfs4 154.35.22.11:443 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0
+Bridge obfs4 154.35.22.13:443 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0
+Bridge obfs4 154.35.22.10:443 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0
+Bridge obfs4 154.35.22.9:80 C73ADBAC8ADFDBF0FC0F3F4E8091C0107D093716 cert=gEGKc5WN/bSjFa6UkG9hOcft1tuK+cV8hbZ0H6cqXiMPLqSbCh2Q3PHe5OOr6oMVORhoJA iat-mode=0
+Bridge obfs4 192.99.11.54:443 7B126FAB960E5AC6A629C729434FF84FB5074EC2 cert=VW5f8+IBUWpPFxF+rsiVy2wXkyTQG7vEd+rHeN2jV5LIDNu8wMNEOqZXPwHdwMVEBdqXEw iat-mode=0
+Bridge obfs4 154.35.22.13:16815 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0
+Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0
+Bridge obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwEFpk9F/UN9JED7XpG1XOjm/O8ZCXK80oPecgWnNDZDv5pdkhq1OpbAH0wNqOT6H6BmRQ iat-mode=1
+Bridge obfs4 154.35.22.11:16488 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0
+Bridge obfs4 154.35.22.9:12166 C73ADBAC8ADFDBF0FC0F3F4E8091C0107D093716 cert=gEGKc5WN/bSjFa6UkG9hOcft1tuK+cV8hbZ0H6cqXiMPLqSbCh2Q3PHe5OOr6oMVORhoJA iat-mode=0
+Bridge obfs4 109.105.109.147:13764 BBB28DF0F201E706BE564EFE690FE9577DD8386D cert=KfMQN/tNMFdda61hMgpiMI7pbwU1T+wxjTulYnfw+4sgvG0zSH7N7fwT10BI8MUdAD7iJA iat-mode=2
+Bridge obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1
+Bridge obfs4 [2001:470:b381:bfff:216:3eff:fe23:d6c3]:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1
+Bridge obfs4 85.17.30.79:443 FC259A04A328A07FED1413E9FC6526530D9FD87A cert=RutxZlu8BtyP+y0NX7bAVD41+J/qXNhHUrKjFkRSdiBAhIHIQLhKQ2HxESAKZprn/lR3KA iat-mode=0
+Bridge obfs4 154.35.22.10:15937 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0
+Bridge obfs4 37.218.240.34:40035 88CD36D45A35271963EF82E511C8827A24730913 cert=eGXYfWODcgqIdPJ+rRupg4GGvVGfh25FWaIXZkit206OSngsp7GAIiGIXOJJROMxEqFKJg iat-mode=1
+Bridge obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1
+Bridge obfs4 154.35.22.12:80 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0
+Bridge obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0
+Bridge obfs4 154.35.22.12:4304 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0
+UseBridges 1
diff --git a/desktop/share/version.txt b/desktop/share/version.txt
new file mode 100644
index 00000000..4804c3be
--- /dev/null
+++ b/desktop/share/version.txt
@@ -0,0 +1 @@
+2.3.dev1 \ No newline at end of file
diff --git a/desktop/share/wordlist.txt b/desktop/share/wordlist.txt
new file mode 100644
index 00000000..caf71f52
--- /dev/null
+++ b/desktop/share/wordlist.txt
@@ -0,0 +1,7776 @@
+abacus
+abdomen
+abdominal
+abide
+abiding
+ability
+ablaze
+able
+abnormal
+abrasion
+abrasive
+abreast
+abridge
+abroad
+abruptly
+absence
+absentee
+absently
+absinthe
+absolute
+absolve
+abstain
+abstract
+absurd
+accent
+acclaim
+acclimate
+accompany
+account
+accuracy
+accurate
+accustom
+acetone
+achiness
+aching
+acid
+acorn
+acquaint
+acquire
+acre
+acrobat
+acronym
+acting
+action
+activate
+activator
+active
+activism
+activist
+activity
+actress
+acts
+acutely
+acuteness
+aeration
+aerobics
+aerosol
+aerospace
+afar
+affair
+affected
+affecting
+affection
+affidavit
+affiliate
+affirm
+affix
+afflicted
+affluent
+afford
+affront
+aflame
+afloat
+aflutter
+afoot
+afraid
+afterglow
+afterlife
+aftermath
+aftermost
+afternoon
+aged
+ageless
+agency
+agenda
+agent
+aggregate
+aghast
+agile
+agility
+aging
+agnostic
+agonize
+agonizing
+agony
+agreeable
+agreeably
+agreed
+agreeing
+agreement
+aground
+ahead
+ahoy
+aide
+aids
+aim
+ajar
+alabaster
+alarm
+albatross
+album
+alfalfa
+algebra
+algorithm
+alias
+alibi
+alienable
+alienate
+aliens
+alike
+alive
+alkaline
+alkalize
+almanac
+almighty
+almost
+aloe
+aloft
+aloha
+alone
+alongside
+aloof
+alphabet
+alright
+although
+altitude
+alto
+aluminum
+alumni
+always
+amaretto
+amaze
+amazingly
+amber
+ambiance
+ambiguity
+ambiguous
+ambition
+ambitious
+ambulance
+ambush
+amendable
+amendment
+amends
+amenity
+amiable
+amicably
+amid
+amigo
+amino
+amiss
+ammonia
+ammonium
+amnesty
+amniotic
+among
+amount
+amperage
+ample
+amplifier
+amplify
+amply
+amuck
+amulet
+amusable
+amused
+amusement
+amuser
+amusing
+anaconda
+anaerobic
+anagram
+anatomist
+anatomy
+anchor
+anchovy
+ancient
+android
+anemia
+anemic
+aneurism
+anew
+angelfish
+angelic
+anger
+angled
+angler
+angles
+angling
+angrily
+angriness
+anguished
+angular
+animal
+animate
+animating
+animation
+animator
+anime
+animosity
+ankle
+annex
+annotate
+announcer
+annoying
+annually
+annuity
+anointer
+another
+answering
+antacid
+antarctic
+anteater
+antelope
+antennae
+anthem
+anthill
+anthology
+antibody
+antics
+antidote
+antihero
+antiquely
+antiques
+antiquity
+antirust
+antitoxic
+antitrust
+antiviral
+antivirus
+antler
+antonym
+antsy
+anvil
+anybody
+anyhow
+anymore
+anyone
+anyplace
+anything
+anytime
+anyway
+anywhere
+aorta
+apache
+apostle
+appealing
+appear
+appease
+appeasing
+appendage
+appendix
+appetite
+appetizer
+applaud
+applause
+apple
+appliance
+applicant
+applied
+apply
+appointee
+appraisal
+appraiser
+apprehend
+approach
+approval
+approve
+apricot
+april
+apron
+aptitude
+aptly
+aqua
+aqueduct
+arbitrary
+arbitrate
+ardently
+area
+arena
+arguable
+arguably
+argue
+arise
+armadillo
+armband
+armchair
+armed
+armful
+armhole
+arming
+armless
+armoire
+armored
+armory
+armrest
+army
+aroma
+arose
+around
+arousal
+arrange
+array
+arrest
+arrival
+arrive
+arrogance
+arrogant
+arson
+art
+ascend
+ascension
+ascent
+ascertain
+ashamed
+ashen
+ashes
+ashy
+aside
+askew
+asleep
+asparagus
+aspect
+aspirate
+aspire
+aspirin
+astonish
+astound
+astride
+astrology
+astronaut
+astronomy
+astute
+atlantic
+atlas
+atom
+atonable
+atop
+atrium
+atrocious
+atrophy
+attach
+attain
+attempt
+attendant
+attendee
+attention
+attentive
+attest
+attic
+attire
+attitude
+attractor
+attribute
+atypical
+auction
+audacious
+audacity
+audible
+audibly
+audience
+audio
+audition
+augmented
+august
+authentic
+author
+autism
+autistic
+autograph
+automaker
+automated
+automatic
+autopilot
+available
+avalanche
+avatar
+avenge
+avenging
+avenue
+average
+aversion
+avert
+aviation
+aviator
+avid
+avoid
+await
+awaken
+award
+aware
+awhile
+awkward
+awning
+awoke
+awry
+axis
+babble
+babbling
+babied
+baboon
+backache
+backboard
+backboned
+backdrop
+backed
+backer
+backfield
+backfire
+backhand
+backing
+backlands
+backlash
+backless
+backlight
+backlit
+backlog
+backpack
+backpedal
+backrest
+backroom
+backshift
+backside
+backslid
+backspace
+backspin
+backstab
+backstage
+backtalk
+backtrack
+backup
+backward
+backwash
+backwater
+backyard
+bacon
+bacteria
+bacterium
+badass
+badge
+badland
+badly
+badness
+baffle
+baffling
+bagel
+bagful
+baggage
+bagged
+baggie
+bagginess
+bagging
+baggy
+bagpipe
+baguette
+baked
+bakery
+bakeshop
+baking
+balance
+balancing
+balcony
+balmy
+balsamic
+bamboo
+banana
+banish
+banister
+banjo
+bankable
+bankbook
+banked
+banker
+banking
+banknote
+bankroll
+banner
+bannister
+banshee
+banter
+barbecue
+barbed
+barbell
+barber
+barcode
+barge
+bargraph
+barista
+baritone
+barley
+barmaid
+barman
+barn
+barometer
+barrack
+barracuda
+barrel
+barrette
+barricade
+barrier
+barstool
+bartender
+barterer
+bash
+basically
+basics
+basil
+basin
+basis
+basket
+batboy
+batch
+bath
+baton
+bats
+battalion
+battered
+battering
+battery
+batting
+battle
+bauble
+bazooka
+blabber
+bladder
+blade
+blah
+blame
+blaming
+blanching
+blandness
+blank
+blaspheme
+blasphemy
+blast
+blatancy
+blatantly
+blazer
+blazing
+bleach
+bleak
+bleep
+blemish
+blend
+bless
+blighted
+blimp
+bling
+blinked
+blinker
+blinking
+blinks
+blip
+blissful
+blitz
+blizzard
+bloated
+bloating
+blob
+blog
+bloomers
+blooming
+blooper
+blot
+blouse
+blubber
+bluff
+bluish
+blunderer
+blunt
+blurb
+blurred
+blurry
+blurt
+blush
+blustery
+boaster
+boastful
+boasting
+boat
+bobbed
+bobbing
+bobble
+bobcat
+bobsled
+bobtail
+bodacious
+body
+bogged
+boggle
+bogus
+boil
+bok
+bolster
+bolt
+bonanza
+bonded
+bonding
+bondless
+boned
+bonehead
+boneless
+bonelike
+boney
+bonfire
+bonnet
+bonsai
+bonus
+bony
+boogeyman
+boogieman
+book
+boondocks
+booted
+booth
+bootie
+booting
+bootlace
+bootleg
+boots
+boozy
+borax
+boring
+borough
+borrower
+borrowing
+boss
+botanical
+botanist
+botany
+botch
+both
+bottle
+bottling
+bottom
+bounce
+bouncing
+bouncy
+bounding
+boundless
+bountiful
+bovine
+boxcar
+boxer
+boxing
+boxlike
+boxy
+breach
+breath
+breeches
+breeching
+breeder
+breeding
+breeze
+breezy
+brethren
+brewery
+brewing
+briar
+bribe
+brick
+bride
+bridged
+brigade
+bright
+brilliant
+brim
+bring
+brink
+brisket
+briskly
+briskness
+bristle
+brittle
+broadband
+broadcast
+broaden
+broadly
+broadness
+broadside
+broadways
+broiler
+broiling
+broken
+broker
+bronchial
+bronco
+bronze
+bronzing
+brook
+broom
+brought
+browbeat
+brownnose
+browse
+browsing
+bruising
+brunch
+brunette
+brunt
+brush
+brussels
+brute
+brutishly
+bubble
+bubbling
+bubbly
+buccaneer
+bucked
+bucket
+buckle
+buckshot
+buckskin
+bucktooth
+buckwheat
+buddhism
+buddhist
+budding
+buddy
+budget
+buffalo
+buffed
+buffer
+buffing
+buffoon
+buggy
+bulb
+bulge
+bulginess
+bulgur
+bulk
+bulldog
+bulldozer
+bullfight
+bullfrog
+bullhorn
+bullion
+bullish
+bullpen
+bullring
+bullseye
+bullwhip
+bully
+bunch
+bundle
+bungee
+bunion
+bunkbed
+bunkhouse
+bunkmate
+bunny
+bunt
+busboy
+bush
+busily
+busload
+bust
+busybody
+buzz
+cabana
+cabbage
+cabbie
+cabdriver
+cable
+caboose
+cache
+cackle
+cacti
+cactus
+caddie
+caddy
+cadet
+cadillac
+cadmium
+cage
+cahoots
+cake
+calamari
+calamity
+calcium
+calculate
+calculus
+caliber
+calibrate
+calm
+caloric
+calorie
+calzone
+camcorder
+cameo
+camera
+camisole
+camper
+campfire
+camping
+campsite
+campus
+canal
+canary
+cancel
+candied
+candle
+candy
+cane
+canine
+canister
+cannabis
+canned
+canning
+cannon
+cannot
+canola
+canon
+canopener
+canopy
+canteen
+canyon
+capable
+capably
+capacity
+cape
+capillary
+capital
+capitol
+capped
+capricorn
+capsize
+capsule
+caption
+captivate
+captive
+captivity
+capture
+caramel
+carat
+caravan
+carbon
+cardboard
+carded
+cardiac
+cardigan
+cardinal
+cardstock
+carefully
+caregiver
+careless
+caress
+caretaker
+cargo
+caring
+carless
+carload
+carmaker
+carnage
+carnation
+carnival
+carnivore
+carol
+carpenter
+carpentry
+carpool
+carport
+carried
+carrot
+carrousel
+carry
+cartel
+cartload
+carton
+cartoon
+cartridge
+cartwheel
+carve
+carving
+carwash
+cascade
+case
+cash
+casing
+casino
+casket
+cassette
+casually
+casualty
+catacomb
+catalog
+catalyst
+catalyze
+catapult
+cataract
+catatonic
+catcall
+catchable
+catcher
+catching
+catchy
+caterer
+catering
+catfight
+catfish
+cathedral
+cathouse
+catlike
+catnap
+catnip
+catsup
+cattail
+cattishly
+cattle
+catty
+catwalk
+caucasian
+caucus
+causal
+causation
+cause
+causing
+cauterize
+caution
+cautious
+cavalier
+cavalry
+caviar
+cavity
+cedar
+celery
+celestial
+celibacy
+celibate
+celtic
+cement
+census
+ceramics
+ceremony
+certainly
+certainty
+certified
+certify
+cesarean
+cesspool
+chafe
+chaffing
+chain
+chair
+chalice
+challenge
+chamber
+chamomile
+champion
+chance
+change
+channel
+chant
+chaos
+chaperone
+chaplain
+chapped
+chaps
+chapter
+character
+charbroil
+charcoal
+charger
+charging
+chariot
+charity
+charm
+charred
+charter
+charting
+chase
+chasing
+chaste
+chastise
+chastity
+chatroom
+chatter
+chatting
+chatty
+cheating
+cheddar
+cheek
+cheer
+cheese
+cheesy
+chef
+chemicals
+chemist
+chemo
+cherisher
+cherub
+chess
+chest
+chevron
+chevy
+chewable
+chewer
+chewing
+chewy
+chief
+chihuahua
+childcare
+childhood
+childish
+childless
+childlike
+chili
+chill
+chimp
+chip
+chirping
+chirpy
+chitchat
+chivalry
+chive
+chloride
+chlorine
+choice
+chokehold
+choking
+chomp
+chooser
+choosing
+choosy
+chop
+chosen
+chowder
+chowtime
+chrome
+chubby
+chuck
+chug
+chummy
+chump
+chunk
+churn
+chute
+cider
+cilantro
+cinch
+cinema
+cinnamon
+circle
+circling
+circular
+circulate
+circus
+citable
+citadel
+citation
+citizen
+citric
+citrus
+city
+civic
+civil
+clad
+claim
+clambake
+clammy
+clamor
+clamp
+clamshell
+clang
+clanking
+clapped
+clapper
+clapping
+clarify
+clarinet
+clarity
+clash
+clasp
+class
+clatter
+clause
+clavicle
+claw
+clay
+clean
+clear
+cleat
+cleaver
+cleft
+clench
+clergyman
+clerical
+clerk
+clever
+clicker
+client
+climate
+climatic
+cling
+clinic
+clinking
+clip
+clique
+cloak
+clobber
+clock
+clone
+cloning
+closable
+closure
+clothes
+clothing
+cloud
+clover
+clubbed
+clubbing
+clubhouse
+clump
+clumsily
+clumsy
+clunky
+clustered
+clutch
+clutter
+coach
+coagulant
+coastal
+coaster
+coasting
+coastland
+coastline
+coat
+coauthor
+cobalt
+cobbler
+cobweb
+cocoa
+coconut
+cod
+coeditor
+coerce
+coexist
+coffee
+cofounder
+cognition
+cognitive
+cogwheel
+coherence
+coherent
+cohesive
+coil
+coke
+cola
+cold
+coleslaw
+coliseum
+collage
+collapse
+collar
+collected
+collector
+collide
+collie
+collision
+colonial
+colonist
+colonize
+colony
+colossal
+colt
+coma
+come
+comfort
+comfy
+comic
+coming
+comma
+commence
+commend
+comment
+commerce
+commode
+commodity
+commodore
+common
+commotion
+commute
+commuting
+compacted
+compacter
+compactly
+compactor
+companion
+company
+compare
+compel
+compile
+comply
+component
+composed
+composer
+composite
+compost
+composure
+compound
+compress
+comprised
+computer
+computing
+comrade
+concave
+conceal
+conceded
+concept
+concerned
+concert
+conch
+concierge
+concise
+conclude
+concrete
+concur
+condense
+condiment
+condition
+condone
+conducive
+conductor
+conduit
+cone
+confess
+confetti
+confidant
+confident
+confider
+confiding
+configure
+confined
+confining
+confirm
+conflict
+conform
+confound
+confront
+confused
+confusing
+confusion
+congenial
+congested
+congrats
+congress
+conical
+conjoined
+conjure
+conjuror
+connected
+connector
+consensus
+consent
+console
+consoling
+consonant
+constable
+constant
+constrain
+constrict
+construct
+consult
+consumer
+consuming
+contact
+container
+contempt
+contend
+contented
+contently
+contents
+contest
+context
+contort
+contour
+contrite
+control
+contusion
+convene
+convent
+copartner
+cope
+copied
+copier
+copilot
+coping
+copious
+copper
+copy
+coral
+cork
+cornball
+cornbread
+corncob
+cornea
+corned
+corner
+cornfield
+cornflake
+cornhusk
+cornmeal
+cornstalk
+corny
+coronary
+coroner
+corporal
+corporate
+corral
+correct
+corridor
+corrode
+corroding
+corrosive
+corsage
+corset
+cortex
+cosigner
+cosmetics
+cosmic
+cosmos
+cosponsor
+cost
+cottage
+cotton
+couch
+cough
+could
+countable
+countdown
+counting
+countless
+country
+county
+courier
+covenant
+cover
+coveted
+coveting
+coyness
+cozily
+coziness
+cozy
+crabbing
+crabgrass
+crablike
+crabmeat
+cradle
+cradling
+crafter
+craftily
+craftsman
+craftwork
+crafty
+cramp
+cranberry
+crane
+cranial
+cranium
+crank
+crate
+crave
+craving
+crawfish
+crawlers
+crawling
+crayfish
+crayon
+crazed
+crazily
+craziness
+crazy
+creamed
+creamer
+creamlike
+crease
+creasing
+creatable
+create
+creation
+creative
+creature
+credible
+credibly
+credit
+creed
+creme
+creole
+crepe
+crept
+crescent
+crested
+cresting
+crestless
+crevice
+crewless
+crewman
+crewmate
+crib
+cricket
+cried
+crier
+crimp
+crimson
+cringe
+cringing
+crinkle
+crinkly
+crisped
+crisping
+crisply
+crispness
+crispy
+criteria
+critter
+croak
+crock
+crook
+croon
+crop
+cross
+crouch
+crouton
+crowbar
+crowd
+crown
+crucial
+crudely
+crudeness
+cruelly
+cruelness
+cruelty
+crumb
+crummiest
+crummy
+crumpet
+crumpled
+cruncher
+crunching
+crunchy
+crusader
+crushable
+crushed
+crusher
+crushing
+crust
+crux
+crying
+cryptic
+crystal
+cubbyhole
+cube
+cubical
+cubicle
+cucumber
+cuddle
+cuddly
+cufflink
+culinary
+culminate
+culpable
+culprit
+cultivate
+cultural
+culture
+cupbearer
+cupcake
+cupid
+cupped
+cupping
+curable
+curator
+curdle
+cure
+curfew
+curing
+curled
+curler
+curliness
+curling
+curly
+curry
+curse
+cursive
+cursor
+curtain
+curtly
+curtsy
+curvature
+curve
+curvy
+cushy
+cusp
+cussed
+custard
+custodian
+custody
+customary
+customer
+customize
+customs
+cut
+cycle
+cyclic
+cycling
+cyclist
+cylinder
+cymbal
+cytoplasm
+cytoplast
+dab
+dad
+daffodil
+dagger
+daily
+daintily
+dainty
+dairy
+daisy
+dallying
+dance
+dancing
+dandelion
+dander
+dandruff
+dandy
+danger
+dangle
+dangling
+daredevil
+dares
+daringly
+darkened
+darkening
+darkish
+darkness
+darkroom
+darling
+darn
+dart
+darwinism
+dash
+dastardly
+data
+datebook
+dating
+daughter
+daunting
+dawdler
+dawn
+daybed
+daybreak
+daycare
+daydream
+daylight
+daylong
+dayroom
+daytime
+dazzler
+dazzling
+deacon
+deafening
+deafness
+dealer
+dealing
+dealmaker
+dealt
+dean
+debatable
+debate
+debating
+debit
+debrief
+debtless
+debtor
+debug
+debunk
+decade
+decaf
+decal
+decathlon
+decay
+deceased
+deceit
+deceiver
+deceiving
+december
+decency
+decent
+deception
+deceptive
+decibel
+decidable
+decimal
+decimeter
+decipher
+deck
+declared
+decline
+decode
+decompose
+decorated
+decorator
+decoy
+decrease
+decree
+dedicate
+dedicator
+deduce
+deduct
+deed
+deem
+deepen
+deeply
+deepness
+deface
+defacing
+defame
+default
+defeat
+defection
+defective
+defendant
+defender
+defense
+defensive
+deferral
+deferred
+defiance
+defiant
+defile
+defiling
+define
+definite
+deflate
+deflation
+deflator
+deflected
+deflector
+defog
+deforest
+defraud
+defrost
+deftly
+defuse
+defy
+degraded
+degrading
+degrease
+degree
+dehydrate
+deity
+dejected
+delay
+delegate
+delegator
+delete
+deletion
+delicacy
+delicate
+delicious
+delighted
+delirious
+delirium
+deliverer
+delivery
+delouse
+delta
+deluge
+delusion
+deluxe
+demanding
+demeaning
+demeanor
+demise
+democracy
+democrat
+demote
+demotion
+demystify
+denatured
+deniable
+denial
+denim
+denote
+dense
+density
+dental
+dentist
+denture
+deny
+deodorant
+deodorize
+departed
+departure
+depict
+deplete
+depletion
+deplored
+deploy
+deport
+depose
+depraved
+depravity
+deprecate
+depress
+deprive
+depth
+deputize
+deputy
+derail
+deranged
+derby
+derived
+desecrate
+deserve
+deserving
+designate
+designed
+designer
+designing
+deskbound
+desktop
+deskwork
+desolate
+despair
+despise
+despite
+destiny
+destitute
+destruct
+detached
+detail
+detection
+detective
+detector
+detention
+detergent
+detest
+detonate
+detonator
+detoxify
+detract
+deuce
+devalue
+deviancy
+deviant
+deviate
+deviation
+deviator
+device
+devious
+devotedly
+devotee
+devotion
+devourer
+devouring
+devoutly
+dexterity
+dexterous
+diabetes
+diabetic
+diabolic
+diagnoses
+diagnosis
+diagram
+dial
+diameter
+diaper
+diaphragm
+diary
+dice
+dicing
+dictate
+dictation
+dictator
+difficult
+diffused
+diffuser
+diffusion
+diffusive
+dig
+dilation
+diligence
+diligent
+dill
+dilute
+dime
+diminish
+dimly
+dimmed
+dimmer
+dimness
+dimple
+diner
+dingbat
+dinghy
+dinginess
+dingo
+dingy
+dining
+dinner
+diocese
+dioxide
+diploma
+dipped
+dipper
+dipping
+directed
+direction
+directive
+directly
+directory
+direness
+dirtiness
+disabled
+disagree
+disallow
+disarm
+disarray
+disaster
+disband
+disbelief
+disburse
+discard
+discern
+discharge
+disclose
+discolor
+discount
+discourse
+discover
+discuss
+disdain
+disengage
+disfigure
+disgrace
+dish
+disinfect
+disjoin
+disk
+dislike
+disliking
+dislocate
+dislodge
+disloyal
+dismantle
+dismay
+dismiss
+dismount
+disobey
+disorder
+disown
+disparate
+disparity
+dispatch
+dispense
+dispersal
+dispersed
+disperser
+displace
+display
+displease
+disposal
+dispose
+disprove
+dispute
+disregard
+disrupt
+dissuade
+distance
+distant
+distaste
+distill
+distinct
+distort
+distract
+distress
+district
+distrust
+ditch
+ditto
+ditzy
+dividable
+divided
+dividend
+dividers
+dividing
+divinely
+diving
+divinity
+divisible
+divisibly
+division
+divisive
+divorcee
+dizziness
+dizzy
+doable
+docile
+dock
+doctrine
+document
+dodge
+dodgy
+doily
+doing
+dole
+dollar
+dollhouse
+dollop
+dolly
+dolphin
+domain
+domelike
+domestic
+dominion
+dominoes
+donated
+donation
+donator
+donor
+donut
+doodle
+doorbell
+doorframe
+doorknob
+doorman
+doormat
+doornail
+doorpost
+doorstep
+doorstop
+doorway
+doozy
+dork
+dormitory
+dorsal
+dosage
+dose
+dotted
+doubling
+douche
+dove
+down
+dowry
+doze
+drab
+dragging
+dragonfly
+dragonish
+dragster
+drainable
+drainage
+drained
+drainer
+drainpipe
+dramatic
+dramatize
+drank
+drapery
+drastic
+draw
+dreaded
+dreadful
+dreadlock
+dreamboat
+dreamily
+dreamland
+dreamless
+dreamlike
+dreamt
+dreamy
+drearily
+dreary
+drench
+dress
+drew
+dribble
+dried
+drier
+drift
+driller
+drilling
+drinkable
+drinking
+dripping
+drippy
+drivable
+driven
+driver
+driveway
+driving
+drizzle
+drizzly
+drone
+drool
+droop
+drop-down
+dropbox
+dropkick
+droplet
+dropout
+dropper
+drove
+drown
+drowsily
+drudge
+drum
+dry
+dubbed
+dubiously
+duchess
+duckbill
+ducking
+duckling
+ducktail
+ducky
+duct
+dude
+duffel
+dugout
+duh
+duke
+duller
+dullness
+duly
+dumping
+dumpling
+dumpster
+duo
+dupe
+duplex
+duplicate
+duplicity
+durable
+durably
+duration
+duress
+during
+dusk
+dust
+dutiful
+duty
+duvet
+dwarf
+dweeb
+dwelled
+dweller
+dwelling
+dwindle
+dwindling
+dynamic
+dynamite
+dynasty
+dyslexia
+dyslexic
+each
+eagle
+earache
+eardrum
+earflap
+earful
+earlobe
+early
+earmark
+earmuff
+earphone
+earpiece
+earplugs
+earring
+earshot
+earthen
+earthlike
+earthling
+earthly
+earthworm
+earthy
+earwig
+easeful
+easel
+easiest
+easily
+easiness
+easing
+eastbound
+eastcoast
+easter
+eastward
+eatable
+eaten
+eatery
+eating
+eats
+ebay
+ebony
+ebook
+ecard
+eccentric
+echo
+eclair
+eclipse
+ecologist
+ecology
+economic
+economist
+economy
+ecosphere
+ecosystem
+edge
+edginess
+edging
+edgy
+edition
+editor
+educated
+education
+educator
+eel
+effective
+effects
+efficient
+effort
+eggbeater
+egging
+eggnog
+eggplant
+eggshell
+egomaniac
+egotism
+egotistic
+either
+eject
+elaborate
+elastic
+elated
+elbow
+eldercare
+elderly
+eldest
+electable
+election
+elective
+elephant
+elevate
+elevating
+elevation
+elevator
+eleven
+elf
+eligible
+eligibly
+eliminate
+elite
+elitism
+elixir
+elk
+ellipse
+elliptic
+elm
+elongated
+elope
+eloquence
+eloquent
+elsewhere
+elude
+elusive
+elves
+email
+embargo
+embark
+embassy
+embattled
+embellish
+ember
+embezzle
+emblaze
+emblem
+embody
+embolism
+emboss
+embroider
+emcee
+emerald
+emergency
+emission
+emit
+emote
+emoticon
+emotion
+empathic
+empathy
+emperor
+emphases
+emphasis
+emphasize
+emphatic
+empirical
+employed
+employee
+employer
+emporium
+empower
+emptier
+emptiness
+empty
+emu
+enable
+enactment
+enamel
+enchanted
+enchilada
+encircle
+enclose
+enclosure
+encode
+encore
+encounter
+encourage
+encroach
+encrust
+encrypt
+endanger
+endeared
+endearing
+ended
+ending
+endless
+endnote
+endocrine
+endorphin
+endorse
+endowment
+endpoint
+endurable
+endurance
+enduring
+energetic
+energize
+energy
+enforced
+enforcer
+engaged
+engaging
+engine
+engorge
+engraved
+engraver
+engraving
+engross
+engulf
+enhance
+enigmatic
+enjoyable
+enjoyably
+enjoyer
+enjoying
+enjoyment
+enlarged
+enlarging
+enlighten
+enlisted
+enquirer
+enrage
+enrich
+enroll
+enslave
+ensnare
+ensure
+entail
+entangled
+entering
+entertain
+enticing
+entire
+entitle
+entity
+entomb
+entourage
+entrap
+entree
+entrench
+entrust
+entryway
+entwine
+enunciate
+envelope
+enviable
+enviably
+envious
+envision
+envoy
+envy
+enzyme
+epic
+epidemic
+epidermal
+epidermis
+epidural
+epilepsy
+epileptic
+epilogue
+epiphany
+episode
+equal
+equate
+equation
+equator
+equinox
+equipment
+equity
+equivocal
+eradicate
+erasable
+erased
+eraser
+erasure
+ergonomic
+errand
+errant
+erratic
+error
+erupt
+escalate
+escalator
+escapable
+escapade
+escapist
+escargot
+eskimo
+esophagus
+espionage
+espresso
+esquire
+essay
+essence
+essential
+establish
+estate
+esteemed
+estimate
+estimator
+estranged
+estrogen
+etching
+eternal
+eternity
+ethanol
+ether
+ethically
+ethics
+euphemism
+evacuate
+evacuee
+evade
+evaluate
+evaluator
+evaporate
+evasion
+evasive
+even
+everglade
+evergreen
+everybody
+everyday
+everyone
+evict
+evidence
+evident
+evil
+evoke
+evolution
+evolve
+exact
+exalted
+example
+excavate
+excavator
+exceeding
+exception
+excess
+exchange
+excitable
+exciting
+exclaim
+exclude
+excluding
+exclusion
+exclusive
+excretion
+excretory
+excursion
+excusable
+excusably
+excuse
+exemplary
+exemplify
+exemption
+exerciser
+exert
+exes
+exfoliate
+exhale
+exhaust
+exhume
+exile
+existing
+exit
+exodus
+exonerate
+exorcism
+exorcist
+expand
+expanse
+expansion
+expansive
+expectant
+expedited
+expediter
+expel
+expend
+expenses
+expensive
+expert
+expire
+expiring
+explain
+expletive
+explicit
+explode
+exploit
+explore
+exploring
+exponent
+exporter
+exposable
+expose
+exposure
+express
+expulsion
+exquisite
+extended
+extending
+extent
+extenuate
+exterior
+external
+extinct
+extortion
+extradite
+extras
+extrovert
+extrude
+extruding
+exuberant
+fable
+fabric
+fabulous
+facebook
+facecloth
+facedown
+faceless
+facelift
+faceplate
+faceted
+facial
+facility
+facing
+facsimile
+faction
+factoid
+factor
+factsheet
+factual
+faculty
+fade
+fading
+failing
+falcon
+fall
+false
+falsify
+fame
+familiar
+family
+famine
+famished
+fanatic
+fancied
+fanciness
+fancy
+fanfare
+fang
+fanning
+fantasize
+fantastic
+fantasy
+fascism
+fastball
+faster
+fasting
+fastness
+faucet
+favorable
+favorably
+favored
+favoring
+favorite
+fax
+feast
+federal
+fedora
+feeble
+feed
+feel
+feisty
+feline
+felt-tip
+feminine
+feminism
+feminist
+feminize
+femur
+fence
+fencing
+fender
+ferment
+fernlike
+ferocious
+ferocity
+ferret
+ferris
+ferry
+fervor
+fester
+festival
+festive
+festivity
+fetal
+fetch
+fever
+fiber
+fiction
+fiddle
+fiddling
+fidelity
+fidgeting
+fidgety
+fifteen
+fifth
+fiftieth
+fifty
+figment
+figure
+figurine
+filing
+filled
+filler
+filling
+film
+filter
+filth
+filtrate
+finale
+finalist
+finalize
+finally
+finance
+financial
+finch
+fineness
+finer
+finicky
+finished
+finisher
+finishing
+finite
+finless
+finlike
+fiscally
+fit
+five
+flaccid
+flagman
+flagpole
+flagship
+flagstick
+flagstone
+flail
+flakily
+flaky
+flame
+flammable
+flanked
+flanking
+flannels
+flap
+flaring
+flashback
+flashbulb
+flashcard
+flashily
+flashing
+flashy
+flask
+flatbed
+flatfoot
+flatly
+flatness
+flatten
+flattered
+flatterer
+flattery
+flattop
+flatware
+flatworm
+flavored
+flavorful
+flavoring
+flaxseed
+fled
+fleshed
+fleshy
+flick
+flier
+flight
+flinch
+fling
+flint
+flip
+flirt
+float
+flock
+flogging
+flop
+floral
+florist
+floss
+flounder
+flyable
+flyaway
+flyer
+flying
+flyover
+flypaper
+foam
+foe
+fog
+foil
+folic
+folk
+follicle
+follow
+fondling
+fondly
+fondness
+fondue
+font
+food
+fool
+footage
+football
+footbath
+footboard
+footer
+footgear
+foothill
+foothold
+footing
+footless
+footman
+footnote
+footpad
+footpath
+footprint
+footrest
+footsie
+footsore
+footwear
+footwork
+fossil
+foster
+founder
+founding
+fountain
+fox
+foyer
+fraction
+fracture
+fragile
+fragility
+fragment
+fragrance
+fragrant
+frail
+frame
+framing
+frantic
+fraternal
+frayed
+fraying
+frays
+freckled
+freckles
+freebase
+freebee
+freebie
+freedom
+freefall
+freehand
+freeing
+freeload
+freely
+freemason
+freeness
+freestyle
+freeware
+freeway
+freewill
+freezable
+freezing
+freight
+french
+frenzied
+frenzy
+frequency
+frequent
+fresh
+fretful
+fretted
+friction
+friday
+fridge
+fried
+friend
+frighten
+frightful
+frigidity
+frigidly
+frill
+fringe
+frisbee
+frisk
+fritter
+frivolous
+frolic
+from
+front
+frostbite
+frosted
+frostily
+frosting
+frostlike
+frosty
+froth
+frown
+frozen
+fructose
+frugality
+frugally
+fruit
+frustrate
+frying
+gab
+gaffe
+gag
+gainfully
+gaining
+gains
+gala
+gallantly
+galleria
+gallery
+galley
+gallon
+gallows
+gallstone
+galore
+galvanize
+gambling
+game
+gaming
+gamma
+gander
+gangly
+gangrene
+gangway
+gap
+garage
+garbage
+garden
+gargle
+garland
+garlic
+garment
+garnet
+garnish
+garter
+gas
+gatherer
+gathering
+gating
+gauging
+gauntlet
+gauze
+gave
+gawk
+gazing
+gear
+gecko
+geek
+geiger
+gem
+gender
+generic
+generous
+genetics
+genre
+gentile
+gentleman
+gently
+gents
+geography
+geologic
+geologist
+geology
+geometric
+geometry
+geranium
+gerbil
+geriatric
+germicide
+germinate
+germless
+germproof
+gestate
+gestation
+gesture
+getaway
+getting
+getup
+giant
+gibberish
+giblet
+giddily
+giddiness
+giddy
+gift
+gigabyte
+gigahertz
+gigantic
+giggle
+giggling
+giggly
+gigolo
+gilled
+gills
+gimmick
+girdle
+giveaway
+given
+giver
+giving
+gizmo
+gizzard
+glacial
+glacier
+glade
+gladiator
+gladly
+glamorous
+glamour
+glance
+glancing
+glandular
+glare
+glaring
+glass
+glaucoma
+glazing
+gleaming
+gleeful
+glider
+gliding
+glimmer
+glimpse
+glisten
+glitch
+glitter
+glitzy
+gloater
+gloating
+gloomily
+gloomy
+glorified
+glorifier
+glorify
+glorious
+glory
+gloss
+glove
+glowing
+glowworm
+glucose
+glue
+gluten
+glutinous
+glutton
+gnarly
+gnat
+goal
+goatskin
+goes
+goggles
+going
+goldfish
+goldmine
+goldsmith
+golf
+goliath
+gonad
+gondola
+gone
+gong
+good
+gooey
+goofball
+goofiness
+goofy
+google
+goon
+gopher
+gore
+gorged
+gorgeous
+gory
+gosling
+gossip
+gothic
+gotten
+gout
+gown
+grab
+graceful
+graceless
+gracious
+gradation
+graded
+grader
+gradient
+grading
+gradually
+graduate
+graffiti
+grafted
+grafting
+grain
+granddad
+grandkid
+grandly
+grandma
+grandpa
+grandson
+granite
+granny
+granola
+grant
+granular
+grape
+graph
+grapple
+grappling
+grasp
+grass
+gratified
+gratify
+grating
+gratitude
+gratuity
+gravel
+graveness
+graves
+graveyard
+gravitate
+gravity
+gravy
+gray
+grazing
+greasily
+greedily
+greedless
+greedy
+green
+greeter
+greeting
+grew
+greyhound
+grid
+grief
+grievance
+grieving
+grievous
+grill
+grimace
+grimacing
+grime
+griminess
+grimy
+grinch
+grinning
+grip
+gristle
+grit
+groggily
+groggy
+groin
+groom
+groove
+grooving
+groovy
+grope
+ground
+grouped
+grout
+grove
+grower
+growing
+growl
+grub
+grudge
+grudging
+grueling
+gruffly
+grumble
+grumbling
+grumbly
+grumpily
+grunge
+grunt
+guacamole
+guidable
+guidance
+guide
+guiding
+guileless
+guise
+gulf
+gullible
+gully
+gulp
+gumball
+gumdrop
+gumminess
+gumming
+gummy
+gurgle
+gurgling
+guru
+gush
+gusto
+gusty
+gutless
+guts
+gutter
+guy
+guzzler
+gyration
+habitable
+habitant
+habitat
+habitual
+hacked
+hacker
+hacking
+hacksaw
+had
+haggler
+haiku
+half
+halogen
+halt
+halved
+halves
+hamburger
+hamlet
+hammock
+hamper
+hamster
+hamstring
+handbag
+handball
+handbook
+handbrake
+handcart
+handclap
+handclasp
+handcraft
+handcuff
+handed
+handful
+handgrip
+handgun
+handheld
+handiness
+handiwork
+handlebar
+handled
+handler
+handling
+handmade
+handoff
+handpick
+handprint
+handrail
+handsaw
+handset
+handsfree
+handshake
+handstand
+handwash
+handwork
+handwoven
+handwrite
+handyman
+hangnail
+hangout
+hangover
+hangup
+hankering
+hankie
+hanky
+haphazard
+happening
+happier
+happiest
+happily
+happiness
+happy
+harbor
+hardcopy
+hardcore
+hardcover
+harddisk
+hardened
+hardener
+hardening
+hardhat
+hardhead
+hardiness
+hardly
+hardness
+hardship
+hardware
+hardwired
+hardwood
+hardy
+harmful
+harmless
+harmonica
+harmonics
+harmonize
+harmony
+harness
+harpist
+harsh
+harvest
+hash
+hassle
+haste
+hastily
+hastiness
+hasty
+hatbox
+hatchback
+hatchery
+hatchet
+hatching
+hatchling
+hate
+hatless
+hatred
+haunt
+haven
+hazard
+hazelnut
+hazily
+haziness
+hazing
+hazy
+headache
+headband
+headboard
+headcount
+headdress
+headed
+header
+headfirst
+headgear
+heading
+headlamp
+headless
+headlock
+headphone
+headpiece
+headrest
+headroom
+headscarf
+headset
+headsman
+headstand
+headstone
+headway
+headwear
+heap
+heat
+heave
+heavily
+heaviness
+heaving
+hedge
+hedging
+heftiness
+hefty
+helium
+helmet
+helper
+helpful
+helping
+helpless
+helpline
+hemlock
+hemstitch
+hence
+henchman
+henna
+herald
+herbal
+herbicide
+herbs
+heritage
+hermit
+heroics
+heroism
+herring
+herself
+hertz
+hesitancy
+hesitant
+hesitate
+hexagon
+hexagram
+hubcap
+huddle
+huddling
+huff
+hug
+hula
+hulk
+hull
+human
+humble
+humbling
+humbly
+humid
+humiliate
+humility
+humming
+hummus
+humongous
+humorist
+humorless
+humorous
+humpback
+humped
+humvee
+hunchback
+hundredth
+hunger
+hungrily
+hungry
+hunk
+hunter
+hunting
+huntress
+huntsman
+hurdle
+hurled
+hurler
+hurling
+hurray
+hurricane
+hurried
+hurry
+hurt
+husband
+hush
+husked
+huskiness
+hut
+hybrid
+hydrant
+hydrated
+hydration
+hydrogen
+hydroxide
+hyperlink
+hypertext
+hyphen
+hypnoses
+hypnosis
+hypnotic
+hypnotism
+hypnotist
+hypnotize
+hypocrisy
+hypocrite
+ibuprofen
+ice
+iciness
+icing
+icky
+icon
+icy
+idealism
+idealist
+idealize
+ideally
+idealness
+identical
+identify
+identity
+ideology
+idiocy
+idiom
+idly
+igloo
+ignition
+ignore
+iguana
+illicitly
+illusion
+illusive
+image
+imaginary
+imagines
+imaging
+imbecile
+imitate
+imitation
+immature
+immerse
+immersion
+imminent
+immobile
+immodest
+immorally
+immortal
+immovable
+immovably
+immunity
+immunize
+impaired
+impale
+impart
+impatient
+impeach
+impeding
+impending
+imperfect
+imperial
+impish
+implant
+implement
+implicate
+implicit
+implode
+implosion
+implosive
+imply
+impolite
+important
+importer
+impose
+imposing
+impotence
+impotency
+impotent
+impound
+imprecise
+imprint
+imprison
+impromptu
+improper
+improve
+improving
+improvise
+imprudent
+impulse
+impulsive
+impure
+impurity
+iodine
+iodize
+ion
+ipad
+iphone
+ipod
+irate
+irk
+iron
+irregular
+irrigate
+irritable
+irritably
+irritant
+irritate
+islamic
+islamist
+isolated
+isolating
+isolation
+isotope
+issue
+issuing
+italicize
+italics
+item
+itinerary
+itunes
+ivory
+ivy
+jab
+jackal
+jacket
+jackknife
+jackpot
+jailbird
+jailbreak
+jailer
+jailhouse
+jalapeno
+jam
+janitor
+january
+jargon
+jarring
+jasmine
+jaundice
+jaunt
+java
+jawed
+jawless
+jawline
+jaws
+jaybird
+jaywalker
+jazz
+jeep
+jeeringly
+jellied
+jelly
+jersey
+jester
+jet
+jiffy
+jigsaw
+jimmy
+jingle
+jingling
+jinx
+jitters
+jittery
+job
+jockey
+jockstrap
+jogger
+jogging
+john
+joining
+jokester
+jokingly
+jolliness
+jolly
+jolt
+jot
+jovial
+joyfully
+joylessly
+joyous
+joyride
+joystick
+jubilance
+jubilant
+judge
+judgingly
+judicial
+judiciary
+judo
+juggle
+juggling
+jugular
+juice
+juiciness
+juicy
+jujitsu
+jukebox
+july
+jumble
+jumbo
+jump
+junction
+juncture
+june
+junior
+juniper
+junkie
+junkman
+junkyard
+jurist
+juror
+jury
+justice
+justifier
+justify
+justly
+justness
+juvenile
+kabob
+kangaroo
+karaoke
+karate
+karma
+kebab
+keenly
+keenness
+keep
+keg
+kelp
+kennel
+kept
+kerchief
+kerosene
+kettle
+kick
+kiln
+kilobyte
+kilogram
+kilometer
+kilowatt
+kilt
+kimono
+kindle
+kindling
+kindly
+kindness
+kindred
+kinetic
+kinfolk
+king
+kinship
+kinsman
+kinswoman
+kissable
+kisser
+kissing
+kitchen
+kite
+kitten
+kitty
+kiwi
+kleenex
+knapsack
+knee
+knelt
+knickers
+knoll
+koala
+kooky
+kosher
+krypton
+kudos
+kung
+labored
+laborer
+laboring
+laborious
+labrador
+ladder
+ladies
+ladle
+ladybug
+ladylike
+lagged
+lagging
+lagoon
+lair
+lake
+lance
+landed
+landfall
+landfill
+landing
+landlady
+landless
+landline
+landlord
+landmark
+landmass
+landmine
+landowner
+landscape
+landside
+landslide
+language
+lankiness
+lanky
+lantern
+lapdog
+lapel
+lapped
+lapping
+laptop
+lard
+large
+lark
+lash
+lasso
+last
+latch
+late
+lather
+latitude
+latrine
+latter
+latticed
+launch
+launder
+laundry
+laurel
+lavender
+lavish
+laxative
+lazily
+laziness
+lazy
+lecturer
+left
+legacy
+legal
+legend
+legged
+leggings
+legible
+legibly
+legislate
+lego
+legroom
+legume
+legwarmer
+legwork
+lemon
+lend
+length
+lens
+lent
+leotard
+lesser
+letdown
+lethargic
+lethargy
+letter
+lettuce
+level
+leverage
+levers
+levitate
+levitator
+liability
+liable
+liberty
+librarian
+library
+licking
+licorice
+lid
+life
+lifter
+lifting
+liftoff
+ligament
+likely
+likeness
+likewise
+liking
+lilac
+lilly
+lily
+limb
+limeade
+limelight
+limes
+limit
+limping
+limpness
+line
+lingo
+linguini
+linguist
+lining
+linked
+linoleum
+linseed
+lint
+lion
+lip
+liquefy
+liqueur
+liquid
+lisp
+list
+litigate
+litigator
+litmus
+litter
+little
+livable
+lived
+lively
+liver
+livestock
+lividly
+living
+lizard
+lubricant
+lubricate
+lucid
+luckily
+luckiness
+luckless
+lucrative
+ludicrous
+lugged
+lukewarm
+lullaby
+lumber
+luminance
+luminous
+lumpiness
+lumping
+lumpish
+lunacy
+lunar
+lunchbox
+luncheon
+lunchroom
+lunchtime
+lung
+lurch
+lure
+luridness
+lurk
+lushly
+lushness
+luster
+lustfully
+lustily
+lustiness
+lustrous
+lusty
+luxurious
+luxury
+lying
+lyrically
+lyricism
+lyricist
+lyrics
+macarena
+macaroni
+macaw
+mace
+machine
+machinist
+magazine
+magenta
+maggot
+magical
+magician
+magma
+magnesium
+magnetic
+magnetism
+magnetize
+magnifier
+magnify
+magnitude
+magnolia
+mahogany
+maimed
+majestic
+majesty
+majorette
+majority
+makeover
+maker
+makeshift
+making
+malformed
+malt
+mama
+mammal
+mammary
+mammogram
+manager
+managing
+manatee
+mandarin
+mandate
+mandatory
+mandolin
+manger
+mangle
+mango
+mangy
+manhandle
+manhole
+manhood
+manhunt
+manicotti
+manicure
+manifesto
+manila
+mankind
+manlike
+manliness
+manly
+manmade
+manned
+mannish
+manor
+manpower
+mantis
+mantra
+manual
+many
+map
+marathon
+marauding
+marbled
+marbles
+marbling
+march
+mardi
+margarine
+margarita
+margin
+marigold
+marina
+marine
+marital
+maritime
+marlin
+marmalade
+maroon
+married
+marrow
+marry
+marshland
+marshy
+marsupial
+marvelous
+marxism
+mascot
+masculine
+mashed
+mashing
+massager
+masses
+massive
+mastiff
+matador
+matchbook
+matchbox
+matcher
+matching
+matchless
+material
+maternal
+maternity
+math
+mating
+matriarch
+matrimony
+matrix
+matron
+matted
+matter
+maturely
+maturing
+maturity
+mauve
+maverick
+maximize
+maximum
+maybe
+mayday
+mayflower
+moaner
+moaning
+mobile
+mobility
+mobilize
+mobster
+mocha
+mocker
+mockup
+modified
+modify
+modular
+modulator
+module
+moisten
+moistness
+moisture
+molar
+molasses
+mold
+molecular
+molecule
+molehill
+mollusk
+mom
+monastery
+monday
+monetary
+monetize
+moneybags
+moneyless
+moneywise
+mongoose
+mongrel
+monitor
+monkhood
+monogamy
+monogram
+monologue
+monopoly
+monorail
+monotone
+monotype
+monoxide
+monsieur
+monsoon
+monstrous
+monthly
+monument
+moocher
+moodiness
+moody
+mooing
+moonbeam
+mooned
+moonlight
+moonlike
+moonlit
+moonrise
+moonscape
+moonshine
+moonstone
+moonwalk
+mop
+morale
+morality
+morally
+morbidity
+morbidly
+morphine
+morphing
+morse
+mortality
+mortally
+mortician
+mortified
+mortify
+mortuary
+mosaic
+mossy
+most
+mothball
+mothproof
+motion
+motivate
+motivator
+motive
+motocross
+motor
+motto
+mountable
+mountain
+mounted
+mounting
+mourner
+mournful
+mouse
+mousiness
+moustache
+mousy
+mouth
+movable
+move
+movie
+moving
+mower
+mowing
+much
+muck
+mud
+mug
+mulberry
+mulch
+mule
+mulled
+mullets
+multiple
+multiply
+multitask
+multitude
+mumble
+mumbling
+mumbo
+mummified
+mummify
+mummy
+mumps
+munchkin
+mundane
+municipal
+muppet
+mural
+murkiness
+murky
+murmuring
+muscular
+museum
+mushily
+mushiness
+mushroom
+mushy
+music
+musket
+muskiness
+musky
+mustang
+mustard
+muster
+mustiness
+musty
+mutable
+mutate
+mutation
+mute
+mutilated
+mutilator
+mutiny
+mutt
+mutual
+muzzle
+myself
+myspace
+mystified
+mystify
+myth
+nacho
+nag
+nail
+name
+naming
+nanny
+nanometer
+nape
+napkin
+napped
+napping
+nappy
+narrow
+nastily
+nastiness
+national
+native
+nativity
+natural
+nature
+naturist
+nautical
+navigate
+navigator
+navy
+nearby
+nearest
+nearly
+nearness
+neatly
+neatness
+nebula
+nebulizer
+nectar
+negate
+negation
+negative
+neglector
+negligee
+negligent
+negotiate
+nemeses
+nemesis
+neon
+nephew
+nerd
+nervous
+nervy
+nest
+net
+neurology
+neuron
+neurosis
+neurotic
+neuter
+neutron
+never
+next
+nibble
+nickname
+nicotine
+niece
+nifty
+nimble
+nimbly
+nineteen
+ninetieth
+ninja
+nintendo
+ninth
+nuclear
+nuclei
+nucleus
+nugget
+nullify
+number
+numbing
+numbly
+numbness
+numeral
+numerate
+numerator
+numeric
+numerous
+nuptials
+nursery
+nursing
+nurture
+nutcase
+nutlike
+nutmeg
+nutrient
+nutshell
+nuttiness
+nutty
+nuzzle
+nylon
+oaf
+oak
+oasis
+oat
+obedience
+obedient
+obituary
+object
+obligate
+obliged
+oblivion
+oblivious
+oblong
+obnoxious
+oboe
+obscure
+obscurity
+observant
+observer
+observing
+obsessed
+obsession
+obsessive
+obsolete
+obstacle
+obstinate
+obstruct
+obtain
+obtrusive
+obtuse
+obvious
+occultist
+occupancy
+occupant
+occupier
+occupy
+ocean
+ocelot
+octagon
+octane
+october
+octopus
+ogle
+oil
+oink
+ointment
+okay
+old
+olive
+olympics
+omega
+omen
+ominous
+omission
+omit
+omnivore
+onboard
+oncoming
+ongoing
+onion
+online
+onlooker
+only
+onscreen
+onset
+onshore
+onslaught
+onstage
+onto
+onward
+onyx
+oops
+ooze
+oozy
+opacity
+opal
+open
+operable
+operate
+operating
+operation
+operative
+operator
+opium
+opossum
+opponent
+oppose
+opposing
+opposite
+oppressed
+oppressor
+opt
+opulently
+osmosis
+other
+otter
+ouch
+ought
+ounce
+outage
+outback
+outbid
+outboard
+outbound
+outbreak
+outburst
+outcast
+outclass
+outcome
+outdated
+outdoors
+outer
+outfield
+outfit
+outflank
+outgoing
+outgrow
+outhouse
+outing
+outlast
+outlet
+outline
+outlook
+outlying
+outmatch
+outmost
+outnumber
+outplayed
+outpost
+outpour
+output
+outrage
+outrank
+outreach
+outright
+outscore
+outsell
+outshine
+outshoot
+outsider
+outskirts
+outsmart
+outsource
+outspoken
+outtakes
+outthink
+outward
+outweigh
+outwit
+oval
+ovary
+oven
+overact
+overall
+overarch
+overbid
+overbill
+overbite
+overblown
+overboard
+overbook
+overbuilt
+overcast
+overcoat
+overcome
+overcook
+overcrowd
+overdraft
+overdrawn
+overdress
+overdrive
+overdue
+overeager
+overeater
+overexert
+overfed
+overfeed
+overfill
+overflow
+overfull
+overgrown
+overhand
+overhang
+overhaul
+overhead
+overhear
+overheat
+overhung
+overjoyed
+overkill
+overlabor
+overlaid
+overlap
+overlay
+overload
+overlook
+overlord
+overlying
+overnight
+overpass
+overpay
+overplant
+overplay
+overpower
+overprice
+overrate
+overreach
+overreact
+override
+overripe
+overrule
+overrun
+overshoot
+overshot
+oversight
+oversized
+oversleep
+oversold
+overspend
+overstate
+overstay
+overstep
+overstock
+overstuff
+oversweet
+overtake
+overthrow
+overtime
+overtly
+overtone
+overture
+overturn
+overuse
+overvalue
+overview
+overwrite
+owl
+oxford
+oxidant
+oxidation
+oxidize
+oxidizing
+oxygen
+oxymoron
+oyster
+ozone
+paced
+pacemaker
+pacific
+pacifier
+pacifism
+pacifist
+pacify
+padded
+padding
+paddle
+paddling
+padlock
+pagan
+pager
+paging
+pajamas
+palace
+palatable
+palm
+palpable
+palpitate
+paltry
+pampered
+pamperer
+pampers
+pamphlet
+panama
+pancake
+pancreas
+panda
+pandemic
+pang
+panhandle
+panic
+panning
+panorama
+panoramic
+panther
+pantomime
+pantry
+pants
+pantyhose
+paparazzi
+papaya
+paper
+paprika
+papyrus
+parabola
+parachute
+parade
+paradox
+paragraph
+parakeet
+paralegal
+paralyses
+paralysis
+paralyze
+paramedic
+parameter
+paramount
+parasail
+parasite
+parasitic
+parcel
+parched
+parchment
+pardon
+parish
+parka
+parking
+parkway
+parlor
+parmesan
+parole
+parrot
+parsley
+parsnip
+partake
+parted
+parting
+partition
+partly
+partner
+partridge
+party
+passable
+passably
+passage
+passcode
+passenger
+passerby
+passing
+passion
+passive
+passivism
+passover
+passport
+password
+pasta
+pasted
+pastel
+pastime
+pastor
+pastrami
+pasture
+pasty
+patchwork
+patchy
+paternal
+paternity
+path
+patience
+patient
+patio
+patriarch
+patriot
+patrol
+patronage
+patronize
+pauper
+pavement
+paver
+pavestone
+pavilion
+paving
+pawing
+payable
+payback
+paycheck
+payday
+payee
+payer
+paying
+payment
+payphone
+payroll
+pebble
+pebbly
+pecan
+pectin
+peculiar
+peddling
+pediatric
+pedicure
+pedigree
+pedometer
+pegboard
+pelican
+pellet
+pelt
+pelvis
+penalize
+penalty
+pencil
+pendant
+pending
+penholder
+penknife
+pennant
+penniless
+penny
+penpal
+pension
+pentagon
+pentagram
+pep
+perceive
+percent
+perch
+percolate
+perennial
+perfected
+perfectly
+perfume
+periscope
+perish
+perjurer
+perjury
+perkiness
+perky
+perm
+peroxide
+perpetual
+perplexed
+persecute
+persevere
+persuaded
+persuader
+pesky
+peso
+pessimism
+pessimist
+pester
+pesticide
+petal
+petite
+petition
+petri
+petroleum
+petted
+petticoat
+pettiness
+petty
+petunia
+phantom
+phobia
+phoenix
+phonebook
+phoney
+phonics
+phoniness
+phony
+phosphate
+photo
+phrase
+phrasing
+placard
+placate
+placidly
+plank
+planner
+plant
+plasma
+plaster
+plastic
+plated
+platform
+plating
+platinum
+platonic
+platter
+platypus
+plausible
+plausibly
+playable
+playback
+player
+playful
+playgroup
+playhouse
+playing
+playlist
+playmaker
+playmate
+playoff
+playpen
+playroom
+playset
+plaything
+playtime
+plaza
+pleading
+pleat
+pledge
+plentiful
+plenty
+plethora
+plexiglas
+pliable
+plod
+plop
+plot
+plow
+ploy
+pluck
+plug
+plunder
+plunging
+plural
+plus
+plutonium
+plywood
+poach
+pod
+poem
+poet
+pogo
+pointed
+pointer
+pointing
+pointless
+pointy
+poise
+poison
+poker
+poking
+polar
+police
+policy
+polio
+polish
+politely
+polka
+polo
+polyester
+polygon
+polygraph
+polymer
+poncho
+pond
+pony
+popcorn
+pope
+poplar
+popper
+poppy
+popsicle
+populace
+popular
+populate
+porcupine
+pork
+porous
+porridge
+portable
+portal
+portfolio
+porthole
+portion
+portly
+portside
+poser
+posh
+posing
+possible
+possibly
+possum
+postage
+postal
+postbox
+postcard
+posted
+poster
+posting
+postnasal
+posture
+postwar
+pouch
+pounce
+pouncing
+pound
+pouring
+pout
+powdered
+powdering
+powdery
+power
+powwow
+pox
+praising
+prance
+prancing
+pranker
+prankish
+prankster
+prayer
+praying
+preacher
+preaching
+preachy
+preamble
+precinct
+precise
+precision
+precook
+precut
+predator
+predefine
+predict
+preface
+prefix
+preflight
+preformed
+pregame
+pregnancy
+pregnant
+preheated
+prelaunch
+prelaw
+prelude
+premiere
+premises
+premium
+prenatal
+preoccupy
+preorder
+prepaid
+prepay
+preplan
+preppy
+preschool
+prescribe
+preseason
+preset
+preshow
+president
+presoak
+press
+presume
+presuming
+preteen
+pretended
+pretender
+pretense
+pretext
+pretty
+pretzel
+prevail
+prevalent
+prevent
+preview
+previous
+prewar
+prewashed
+prideful
+pried
+primal
+primarily
+primary
+primate
+primer
+primp
+princess
+print
+prior
+prism
+prison
+prissy
+pristine
+privacy
+private
+privatize
+prize
+proactive
+probable
+probably
+probation
+probe
+probing
+probiotic
+problem
+procedure
+process
+proclaim
+procreate
+procurer
+prodigal
+prodigy
+produce
+product
+profane
+profanity
+professed
+professor
+profile
+profound
+profusely
+progeny
+prognosis
+program
+progress
+projector
+prologue
+prolonged
+promenade
+prominent
+promoter
+promotion
+prompter
+promptly
+prone
+prong
+pronounce
+pronto
+proofing
+proofread
+proofs
+propeller
+properly
+property
+proponent
+proposal
+propose
+props
+prorate
+protector
+protegee
+proton
+prototype
+protozoan
+protract
+protrude
+proud
+provable
+proved
+proven
+provided
+provider
+providing
+province
+proving
+provoke
+provoking
+provolone
+prowess
+prowler
+prowling
+proximity
+proxy
+prozac
+prude
+prudishly
+prune
+pruning
+pry
+psychic
+public
+publisher
+pucker
+pueblo
+pug
+pull
+pulmonary
+pulp
+pulsate
+pulse
+pulverize
+puma
+pumice
+pummel
+punch
+punctual
+punctuate
+punctured
+pungent
+punisher
+punk
+pupil
+puppet
+puppy
+purchase
+pureblood
+purebred
+purely
+pureness
+purgatory
+purge
+purging
+purifier
+purify
+purist
+puritan
+purity
+purple
+purplish
+purposely
+purr
+purse
+pursuable
+pursuant
+pursuit
+purveyor
+pushcart
+pushchair
+pusher
+pushiness
+pushing
+pushover
+pushpin
+pushup
+pushy
+putdown
+putt
+puzzle
+puzzling
+pyramid
+pyromania
+python
+quack
+quadrant
+quail
+quaintly
+quake
+quaking
+qualified
+qualifier
+qualify
+quality
+qualm
+quantum
+quarrel
+quarry
+quartered
+quarterly
+quarters
+quartet
+quench
+query
+quicken
+quickly
+quickness
+quicksand
+quickstep
+quiet
+quill
+quilt
+quintet
+quintuple
+quirk
+quit
+quiver
+quizzical
+quotable
+quotation
+quote
+rabid
+race
+racing
+racism
+rack
+racoon
+radar
+radial
+radiance
+radiantly
+radiated
+radiation
+radiator
+radio
+radish
+raffle
+raft
+rage
+ragged
+raging
+ragweed
+raider
+railcar
+railing
+railroad
+railway
+raisin
+rake
+raking
+rally
+ramble
+rambling
+ramp
+ramrod
+ranch
+rancidity
+random
+ranged
+ranger
+ranging
+ranked
+ranking
+ransack
+ranting
+rants
+rare
+rarity
+rascal
+rash
+rasping
+ravage
+raven
+ravine
+raving
+ravioli
+ravishing
+reabsorb
+reach
+reacquire
+reaction
+reactive
+reactor
+reaffirm
+ream
+reanalyze
+reappear
+reapply
+reappoint
+reapprove
+rearrange
+rearview
+reason
+reassign
+reassure
+reattach
+reawake
+rebalance
+rebate
+rebel
+rebirth
+reboot
+reborn
+rebound
+rebuff
+rebuild
+rebuilt
+reburial
+rebuttal
+recall
+recant
+recapture
+recast
+recede
+recent
+recess
+recharger
+recipient
+recital
+recite
+reckless
+reclaim
+recliner
+reclining
+recluse
+reclusive
+recognize
+recoil
+recollect
+recolor
+reconcile
+reconfirm
+reconvene
+recopy
+record
+recount
+recoup
+recovery
+recreate
+rectal
+rectangle
+rectified
+rectify
+recycled
+recycler
+recycling
+reemerge
+reenact
+reenter
+reentry
+reexamine
+referable
+referee
+reference
+refill
+refinance
+refined
+refinery
+refining
+refinish
+reflected
+reflector
+reflex
+reflux
+refocus
+refold
+reforest
+reformat
+reformed
+reformer
+reformist
+refract
+refrain
+refreeze
+refresh
+refried
+refueling
+refund
+refurbish
+refurnish
+refusal
+refuse
+refusing
+refutable
+refute
+regain
+regalia
+regally
+reggae
+regime
+region
+register
+registrar
+registry
+regress
+regretful
+regroup
+regular
+regulate
+regulator
+rehab
+reheat
+rehire
+rehydrate
+reimburse
+reissue
+reiterate
+rejoice
+rejoicing
+rejoin
+rekindle
+relapse
+relapsing
+relatable
+related
+relation
+relative
+relax
+relay
+relearn
+release
+relenting
+reliable
+reliably
+reliance
+reliant
+relic
+relieve
+relieving
+relight
+relish
+relive
+reload
+relocate
+relock
+reluctant
+rely
+remake
+remark
+remarry
+rematch
+remedial
+remedy
+remember
+reminder
+remindful
+remission
+remix
+remnant
+remodeler
+remold
+remorse
+remote
+removable
+removal
+removed
+remover
+removing
+rename
+renderer
+rendering
+rendition
+renegade
+renewable
+renewably
+renewal
+renewed
+renounce
+renovate
+renovator
+rentable
+rental
+rented
+renter
+reoccupy
+reoccur
+reopen
+reorder
+repackage
+repacking
+repaint
+repair
+repave
+repaying
+repayment
+repeal
+repeated
+repeater
+repent
+rephrase
+replace
+replay
+replica
+reply
+reporter
+repose
+repossess
+repost
+repressed
+reprimand
+reprint
+reprise
+reproach
+reprocess
+reproduce
+reprogram
+reps
+reptile
+reptilian
+repugnant
+repulsion
+repulsive
+repurpose
+reputable
+reputably
+request
+require
+requisite
+reroute
+rerun
+resale
+resample
+rescuer
+reseal
+research
+reselect
+reseller
+resemble
+resend
+resent
+reset
+reshape
+reshoot
+reshuffle
+residence
+residency
+resident
+residual
+residue
+resigned
+resilient
+resistant
+resisting
+resize
+resolute
+resolved
+resonant
+resonate
+resort
+resource
+respect
+resubmit
+result
+resume
+resupply
+resurface
+resurrect
+retail
+retainer
+retaining
+retake
+retaliate
+retention
+rethink
+retinal
+retired
+retiree
+retiring
+retold
+retool
+retorted
+retouch
+retrace
+retract
+retrain
+retread
+retreat
+retrial
+retrieval
+retriever
+retry
+return
+retying
+retype
+reunion
+reunite
+reusable
+reuse
+reveal
+reveler
+revenge
+revenue
+reverb
+revered
+reverence
+reverend
+reversal
+reverse
+reversing
+reversion
+revert
+revisable
+revise
+revision
+revisit
+revivable
+revival
+reviver
+reviving
+revocable
+revoke
+revolt
+revolver
+revolving
+reward
+rewash
+rewind
+rewire
+reword
+rework
+rewrap
+rewrite
+rhyme
+ribbon
+ribcage
+rice
+riches
+richly
+richness
+rickety
+ricotta
+riddance
+ridden
+ride
+riding
+rifling
+rift
+rigging
+rigid
+rigor
+rimless
+rimmed
+rind
+rink
+rinse
+rinsing
+riot
+ripcord
+ripeness
+ripening
+ripping
+ripple
+rippling
+riptide
+rise
+rising
+risk
+risotto
+ritalin
+ritzy
+rival
+riverbank
+riverbed
+riverboat
+riverside
+riveter
+riveting
+roamer
+roaming
+roast
+robbing
+robe
+robin
+robotics
+robust
+rockband
+rocker
+rocket
+rockfish
+rockiness
+rocking
+rocklike
+rockslide
+rockstar
+rocky
+rogue
+roman
+romp
+rope
+roping
+roster
+rosy
+rotten
+rotting
+rotunda
+roulette
+rounding
+roundish
+roundness
+roundup
+roundworm
+routine
+routing
+rover
+roving
+royal
+rubbed
+rubber
+rubbing
+rubble
+rubdown
+ruby
+ruckus
+rudder
+rug
+ruined
+rule
+rumble
+rumbling
+rummage
+rumor
+runaround
+rundown
+runner
+running
+runny
+runt
+runway
+rupture
+rural
+ruse
+rush
+rust
+rut
+sabbath
+sabotage
+sacrament
+sacred
+sacrifice
+sadden
+saddlebag
+saddled
+saddling
+sadly
+sadness
+safari
+safeguard
+safehouse
+safely
+safeness
+saffron
+saga
+sage
+sagging
+saggy
+said
+saint
+sake
+salad
+salami
+salaried
+salary
+saline
+salon
+saloon
+salsa
+salt
+salutary
+salute
+salvage
+salvaging
+salvation
+same
+sample
+sampling
+sanction
+sanctity
+sanctuary
+sandal
+sandbag
+sandbank
+sandbar
+sandblast
+sandbox
+sanded
+sandfish
+sanding
+sandlot
+sandpaper
+sandpit
+sandstone
+sandstorm
+sandworm
+sandy
+sanitary
+sanitizer
+sank
+santa
+sapling
+sappiness
+sappy
+sarcasm
+sarcastic
+sardine
+sash
+sasquatch
+sassy
+satchel
+satiable
+satin
+satirical
+satisfied
+satisfy
+saturate
+saturday
+sauciness
+saucy
+sauna
+savage
+savanna
+saved
+savings
+savior
+savor
+saxophone
+say
+scabbed
+scabby
+scalded
+scalding
+scale
+scaling
+scallion
+scallop
+scalping
+scam
+scandal
+scanner
+scanning
+scant
+scapegoat
+scarce
+scarcity
+scarecrow
+scared
+scarf
+scarily
+scariness
+scarring
+scary
+scavenger
+scenic
+schedule
+schematic
+scheme
+scheming
+schilling
+schnapps
+scholar
+science
+scientist
+scion
+scoff
+scolding
+scone
+scoop
+scooter
+scope
+scorch
+scorebook
+scorecard
+scored
+scoreless
+scorer
+scoring
+scorn
+scorpion
+scotch
+scoundrel
+scoured
+scouring
+scouting
+scouts
+scowling
+scrabble
+scraggly
+scrambled
+scrambler
+scrap
+scratch
+scrawny
+screen
+scribble
+scribe
+scribing
+scrimmage
+script
+scroll
+scrooge
+scrounger
+scrubbed
+scrubber
+scruffy
+scrunch
+scrutiny
+scuba
+scuff
+sculptor
+sculpture
+scurvy
+scuttle
+secluded
+secluding
+seclusion
+second
+secrecy
+secret
+sectional
+sector
+secular
+securely
+security
+sedan
+sedate
+sedation
+sedative
+sediment
+seduce
+seducing
+segment
+seismic
+seizing
+seldom
+selected
+selection
+selective
+selector
+self
+seltzer
+semantic
+semester
+semicolon
+semifinal
+seminar
+semisoft
+semisweet
+senate
+senator
+send
+senior
+senorita
+sensation
+sensitive
+sensitize
+sensually
+sensuous
+sepia
+september
+septic
+septum
+sequel
+sequence
+sequester
+series
+sermon
+serotonin
+serpent
+serrated
+serve
+service
+serving
+sesame
+sessions
+setback
+setting
+settle
+settling
+setup
+sevenfold
+seventeen
+seventh
+seventy
+severity
+shabby
+shack
+shaded
+shadily
+shadiness
+shading
+shadow
+shady
+shaft
+shakable
+shakily
+shakiness
+shaking
+shaky
+shale
+shallot
+shallow
+shame
+shampoo
+shamrock
+shank
+shanty
+shape
+shaping
+share
+sharpener
+sharper
+sharpie
+sharply
+sharpness
+shawl
+sheath
+shed
+sheep
+sheet
+shelf
+shell
+shelter
+shelve
+shelving
+sherry
+shield
+shifter
+shifting
+shiftless
+shifty
+shimmer
+shimmy
+shindig
+shine
+shingle
+shininess
+shining
+shiny
+ship
+shirt
+shivering
+shock
+shone
+shoplift
+shopper
+shopping
+shoptalk
+shore
+shortage
+shortcake
+shortcut
+shorten
+shorter
+shorthand
+shortlist
+shortly
+shortness
+shorts
+shortwave
+shorty
+shout
+shove
+showbiz
+showcase
+showdown
+shower
+showgirl
+showing
+showman
+shown
+showoff
+showpiece
+showplace
+showroom
+showy
+shrank
+shrapnel
+shredder
+shredding
+shrewdly
+shriek
+shrill
+shrimp
+shrine
+shrink
+shrivel
+shrouded
+shrubbery
+shrubs
+shrug
+shrunk
+shucking
+shudder
+shuffle
+shuffling
+shun
+shush
+shut
+shy
+siamese
+siberian
+sibling
+siding
+sierra
+siesta
+sift
+sighing
+silenced
+silencer
+silent
+silica
+silicon
+silk
+silliness
+silly
+silo
+silt
+silver
+similarly
+simile
+simmering
+simple
+simplify
+simply
+sincere
+sincerity
+singer
+singing
+single
+singular
+sinister
+sinless
+sinner
+sinuous
+sip
+siren
+sister
+sitcom
+sitter
+sitting
+situated
+situation
+sixfold
+sixteen
+sixth
+sixties
+sixtieth
+sixtyfold
+sizable
+sizably
+size
+sizing
+sizzle
+sizzling
+skater
+skating
+skedaddle
+skeletal
+skeleton
+skeptic
+sketch
+skewed
+skewer
+skid
+skied
+skier
+skies
+skiing
+skilled
+skillet
+skillful
+skimmed
+skimmer
+skimming
+skimpily
+skincare
+skinhead
+skinless
+skinning
+skinny
+skintight
+skipper
+skipping
+skirmish
+skirt
+skittle
+skydiver
+skylight
+skyline
+skype
+skyrocket
+skyward
+slab
+slacked
+slacker
+slacking
+slackness
+slacks
+slain
+slam
+slander
+slang
+slapping
+slapstick
+slashed
+slashing
+slate
+slather
+slaw
+sled
+sleek
+sleep
+sleet
+sleeve
+slept
+sliceable
+sliced
+slicer
+slicing
+slick
+slider
+slideshow
+sliding
+slighted
+slighting
+slightly
+slimness
+slimy
+slinging
+slingshot
+slinky
+slip
+slit
+sliver
+slobbery
+slogan
+sloped
+sloping
+sloppily
+sloppy
+slot
+slouching
+slouchy
+sludge
+slug
+slum
+slurp
+slush
+sly
+small
+smartly
+smartness
+smasher
+smashing
+smashup
+smell
+smelting
+smile
+smilingly
+smirk
+smite
+smith
+smitten
+smock
+smog
+smoked
+smokeless
+smokiness
+smoking
+smoky
+smolder
+smooth
+smother
+smudge
+smudgy
+smuggler
+smuggling
+smugly
+smugness
+snack
+snagged
+snaking
+snap
+snare
+snarl
+snazzy
+sneak
+sneer
+sneeze
+sneezing
+snide
+sniff
+snippet
+snipping
+snitch
+snooper
+snooze
+snore
+snoring
+snorkel
+snort
+snout
+snowbird
+snowboard
+snowbound
+snowcap
+snowdrift
+snowdrop
+snowfall
+snowfield
+snowflake
+snowiness
+snowless
+snowman
+snowplow
+snowshoe
+snowstorm
+snowsuit
+snowy
+snub
+snuff
+snuggle
+snugly
+snugness
+speak
+spearfish
+spearhead
+spearman
+spearmint
+species
+specimen
+specked
+speckled
+specks
+spectacle
+spectator
+spectrum
+speculate
+speech
+speed
+spellbind
+speller
+spelling
+spendable
+spender
+spending
+spent
+spew
+sphere
+spherical
+sphinx
+spider
+spied
+spiffy
+spill
+spilt
+spinach
+spinal
+spindle
+spinner
+spinning
+spinout
+spinster
+spiny
+spiral
+spirited
+spiritism
+spirits
+spiritual
+splashed
+splashing
+splashy
+splatter
+spleen
+splendid
+splendor
+splice
+splicing
+splinter
+splotchy
+splurge
+spoilage
+spoiled
+spoiler
+spoiling
+spoils
+spoken
+spokesman
+sponge
+spongy
+sponsor
+spoof
+spookily
+spooky
+spool
+spoon
+spore
+sporting
+sports
+sporty
+spotless
+spotlight
+spotted
+spotter
+spotting
+spotty
+spousal
+spouse
+spout
+sprain
+sprang
+sprawl
+spray
+spree
+sprig
+spring
+sprinkled
+sprinkler
+sprint
+sprite
+sprout
+spruce
+sprung
+spry
+spud
+spur
+sputter
+spyglass
+squabble
+squad
+squall
+squander
+squash
+squatted
+squatter
+squatting
+squeak
+squealer
+squealing
+squeamish
+squeegee
+squeeze
+squeezing
+squid
+squiggle
+squiggly
+squint
+squire
+squirt
+squishier
+squishy
+stability
+stabilize
+stable
+stack
+stadium
+staff
+stage
+staging
+stagnant
+stagnate
+stainable
+stained
+staining
+stainless
+stalemate
+staleness
+stalling
+stallion
+stamina
+stammer
+stamp
+stand
+stank
+staple
+stapling
+starboard
+starch
+stardom
+stardust
+starfish
+stargazer
+staring
+stark
+starless
+starlet
+starlight
+starlit
+starring
+starry
+starship
+starter
+starting
+startle
+startling
+startup
+starved
+starving
+stash
+state
+static
+statistic
+statue
+stature
+status
+statute
+statutory
+staunch
+stays
+steadfast
+steadier
+steadily
+steadying
+steam
+steed
+steep
+steerable
+steering
+steersman
+stegosaur
+stellar
+stem
+stench
+stencil
+step
+stereo
+sterile
+sterility
+sterilize
+sterling
+sternness
+sternum
+stew
+stick
+stiffen
+stiffly
+stiffness
+stifle
+stifling
+stillness
+stilt
+stimulant
+stimulate
+stimuli
+stimulus
+stinger
+stingily
+stinging
+stingray
+stingy
+stinking
+stinky
+stipend
+stipulate
+stir
+stitch
+stock
+stoic
+stoke
+stole
+stomp
+stonewall
+stoneware
+stonework
+stoning
+stony
+stood
+stooge
+stool
+stoop
+stoplight
+stoppable
+stoppage
+stopped
+stopper
+stopping
+stopwatch
+storable
+storage
+storeroom
+storewide
+storm
+stout
+stove
+stowaway
+stowing
+straddle
+straggler
+strained
+strainer
+straining
+strangely
+stranger
+strangle
+strategic
+strategy
+stratus
+straw
+stray
+streak
+stream
+street
+strength
+strenuous
+strep
+stress
+stretch
+strewn
+stricken
+strict
+stride
+strife
+strike
+striking
+strive
+striving
+strobe
+strode
+stroller
+strongbox
+strongly
+strongman
+struck
+structure
+strudel
+struggle
+strum
+strung
+strut
+stubbed
+stubble
+stubbly
+stubborn
+stucco
+stuck
+student
+studied
+studio
+study
+stuffed
+stuffing
+stuffy
+stumble
+stumbling
+stump
+stung
+stunned
+stunner
+stunning
+stunt
+stupor
+sturdily
+sturdy
+styling
+stylishly
+stylist
+stylized
+stylus
+suave
+subarctic
+subatomic
+subdivide
+subdued
+subduing
+subfloor
+subgroup
+subheader
+subject
+sublease
+sublet
+sublevel
+sublime
+submarine
+submerge
+submersed
+submitter
+subpanel
+subpar
+subplot
+subprime
+subscribe
+subscript
+subsector
+subside
+subsiding
+subsidize
+subsidy
+subsoil
+subsonic
+substance
+subsystem
+subtext
+subtitle
+subtly
+subtotal
+subtract
+subtype
+suburb
+subway
+subwoofer
+subzero
+succulent
+such
+suction
+sudden
+sudoku
+suds
+sufferer
+suffering
+suffice
+suffix
+suffocate
+suffrage
+sugar
+suggest
+suing
+suitable
+suitably
+suitcase
+suitor
+sulfate
+sulfide
+sulfite
+sulfur
+sulk
+sullen
+sulphate
+sulphuric
+sultry
+superbowl
+superglue
+superhero
+superior
+superjet
+superman
+supermom
+supernova
+supervise
+supper
+supplier
+supply
+support
+supremacy
+supreme
+surcharge
+surely
+sureness
+surface
+surfacing
+surfboard
+surfer
+surgery
+surgical
+surging
+surname
+surpass
+surplus
+surprise
+surreal
+surrender
+surrogate
+surround
+survey
+survival
+survive
+surviving
+survivor
+sushi
+suspect
+suspend
+suspense
+sustained
+sustainer
+swab
+swaddling
+swagger
+swampland
+swan
+swapping
+swarm
+sway
+swear
+sweat
+sweep
+swell
+swept
+swerve
+swifter
+swiftly
+swiftness
+swimmable
+swimmer
+swimming
+swimsuit
+swimwear
+swinger
+swinging
+swipe
+swirl
+switch
+swivel
+swizzle
+swooned
+swoop
+swoosh
+swore
+sworn
+swung
+sycamore
+sympathy
+symphonic
+symphony
+symptom
+synapse
+syndrome
+synergy
+synopses
+synopsis
+synthesis
+synthetic
+syrup
+system
+t-shirt
+tabasco
+tabby
+tableful
+tables
+tablet
+tableware
+tabloid
+tackiness
+tacking
+tackle
+tackling
+tacky
+taco
+tactful
+tactical
+tactics
+tactile
+tactless
+tadpole
+taekwondo
+tag
+tainted
+take
+taking
+talcum
+talisman
+tall
+talon
+tamale
+tameness
+tamer
+tamper
+tank
+tanned
+tannery
+tanning
+tantrum
+tapeless
+tapered
+tapering
+tapestry
+tapioca
+tapping
+taps
+tarantula
+target
+tarmac
+tarnish
+tarot
+tartar
+tartly
+tartness
+task
+tassel
+taste
+tastiness
+tasting
+tasty
+tattered
+tattle
+tattling
+tattoo
+taunt
+tavern
+thank
+that
+thaw
+theater
+theatrics
+thee
+theft
+theme
+theology
+theorize
+thermal
+thermos
+thesaurus
+these
+thesis
+thespian
+thicken
+thicket
+thickness
+thieving
+thievish
+thigh
+thimble
+thing
+think
+thinly
+thinner
+thinness
+thinning
+thirstily
+thirsting
+thirsty
+thirteen
+thirty
+thong
+thorn
+those
+thousand
+thrash
+thread
+threaten
+threefold
+thrift
+thrill
+thrive
+thriving
+throat
+throbbing
+throng
+throttle
+throwaway
+throwback
+thrower
+throwing
+thud
+thumb
+thumping
+thursday
+thus
+thwarting
+thyself
+tiara
+tibia
+tidal
+tidbit
+tidiness
+tidings
+tidy
+tiger
+tighten
+tightly
+tightness
+tightrope
+tightwad
+tigress
+tile
+tiling
+till
+tilt
+timid
+timing
+timothy
+tinderbox
+tinfoil
+tingle
+tingling
+tingly
+tinker
+tinkling
+tinsel
+tinsmith
+tint
+tinwork
+tiny
+tipoff
+tipped
+tipper
+tipping
+tiptoeing
+tiptop
+tiring
+tissue
+trace
+tracing
+track
+traction
+tractor
+trade
+trading
+tradition
+traffic
+tragedy
+trailing
+trailside
+train
+traitor
+trance
+tranquil
+transfer
+transform
+translate
+transpire
+transport
+transpose
+trapdoor
+trapeze
+trapezoid
+trapped
+trapper
+trapping
+traps
+trash
+travel
+traverse
+travesty
+tray
+treachery
+treading
+treadmill
+treason
+treat
+treble
+tree
+trekker
+tremble
+trembling
+tremor
+trench
+trend
+trespass
+triage
+trial
+triangle
+tribesman
+tribunal
+tribune
+tributary
+tribute
+triceps
+trickery
+trickily
+tricking
+trickle
+trickster
+tricky
+tricolor
+tricycle
+trident
+tried
+trifle
+trifocals
+trillion
+trilogy
+trimester
+trimmer
+trimming
+trimness
+trinity
+trio
+tripod
+tripping
+triumph
+trivial
+trodden
+trolling
+trombone
+trophy
+tropical
+tropics
+trouble
+troubling
+trough
+trousers
+trout
+trowel
+truce
+truck
+truffle
+trump
+trunks
+trustable
+trustee
+trustful
+trusting
+trustless
+truth
+try
+tubby
+tubeless
+tubular
+tucking
+tuesday
+tug
+tuition
+tulip
+tumble
+tumbling
+tummy
+turban
+turbine
+turbofan
+turbojet
+turbulent
+turf
+turkey
+turmoil
+turret
+turtle
+tusk
+tutor
+tutu
+tux
+tweak
+tweed
+tweet
+tweezers
+twelve
+twentieth
+twenty
+twerp
+twice
+twiddle
+twiddling
+twig
+twilight
+twine
+twins
+twirl
+twistable
+twisted
+twister
+twisting
+twisty
+twitch
+twitter
+tycoon
+tying
+tyke
+udder
+ultimate
+ultimatum
+ultra
+umbilical
+umbrella
+umpire
+unabashed
+unable
+unadorned
+unadvised
+unafraid
+unaired
+unaligned
+unaltered
+unarmored
+unashamed
+unaudited
+unawake
+unaware
+unbaked
+unbalance
+unbeaten
+unbend
+unbent
+unbiased
+unbitten
+unblended
+unblessed
+unblock
+unbolted
+unbounded
+unboxed
+unbraided
+unbridle
+unbroken
+unbuckled
+unbundle
+unburned
+unbutton
+uncanny
+uncapped
+uncaring
+uncertain
+unchain
+unchanged
+uncharted
+uncheck
+uncivil
+unclad
+unclaimed
+unclamped
+unclasp
+uncle
+unclip
+uncloak
+unclog
+unclothed
+uncoated
+uncoiled
+uncolored
+uncombed
+uncommon
+uncooked
+uncork
+uncorrupt
+uncounted
+uncouple
+uncouth
+uncover
+uncross
+uncrown
+uncrushed
+uncured
+uncurious
+uncurled
+uncut
+undamaged
+undated
+undaunted
+undead
+undecided
+undefined
+underage
+underarm
+undercoat
+undercook
+undercut
+underdog
+underdone
+underfed
+underfeed
+underfoot
+undergo
+undergrad
+underhand
+underline
+underling
+undermine
+undermost
+underpaid
+underpass
+underpay
+underrate
+undertake
+undertone
+undertook
+undertow
+underuse
+underwear
+underwent
+underwire
+undesired
+undiluted
+undivided
+undocked
+undoing
+undone
+undrafted
+undress
+undrilled
+undusted
+undying
+unearned
+unearth
+unease
+uneasily
+uneasy
+uneatable
+uneaten
+unedited
+unelected
+unending
+unengaged
+unenvied
+unequal
+unethical
+uneven
+unexpired
+unexposed
+unfailing
+unfair
+unfasten
+unfazed
+unfeeling
+unfiled
+unfilled
+unfitted
+unfitting
+unfixable
+unfixed
+unflawed
+unfocused
+unfold
+unfounded
+unframed
+unfreeze
+unfrosted
+unfrozen
+unfunded
+unglazed
+ungloved
+unglue
+ungodly
+ungraded
+ungreased
+unguarded
+unguided
+unhappily
+unhappy
+unharmed
+unhealthy
+unheard
+unhearing
+unheated
+unhelpful
+unhidden
+unhinge
+unhitched
+unholy
+unhook
+unicorn
+unicycle
+unified
+unifier
+uniformed
+uniformly
+unify
+unimpeded
+uninjured
+uninstall
+uninsured
+uninvited
+union
+uniquely
+unisexual
+unison
+unissued
+unit
+universal
+universe
+unjustly
+unkempt
+unkind
+unknotted
+unknowing
+unknown
+unlaced
+unlatch
+unlawful
+unleaded
+unlearned
+unleash
+unless
+unleveled
+unlighted
+unlikable
+unlimited
+unlined
+unlinked
+unlisted
+unlit
+unlivable
+unloaded
+unloader
+unlocked
+unlocking
+unlovable
+unloved
+unlovely
+unloving
+unluckily
+unlucky
+unmade
+unmanaged
+unmanned
+unmapped
+unmarked
+unmasked
+unmasking
+unmatched
+unmindful
+unmixable
+unmixed
+unmolded
+unmoral
+unmovable
+unmoved
+unmoving
+unnamable
+unnamed
+unnatural
+unneeded
+unnerve
+unnerving
+unnoticed
+unopened
+unopposed
+unpack
+unpadded
+unpaid
+unpainted
+unpaired
+unpaved
+unpeeled
+unpicked
+unpiloted
+unpinned
+unplanned
+unplanted
+unpleased
+unpledged
+unplowed
+unplug
+unpopular
+unproven
+unquote
+unranked
+unrated
+unraveled
+unreached
+unread
+unreal
+unreeling
+unrefined
+unrelated
+unrented
+unrest
+unretired
+unrevised
+unrigged
+unripe
+unrivaled
+unroasted
+unrobed
+unroll
+unruffled
+unruly
+unrushed
+unsaddle
+unsafe
+unsaid
+unsalted
+unsaved
+unsavory
+unscathed
+unscented
+unscrew
+unsealed
+unseated
+unsecured
+unseeing
+unseemly
+unseen
+unselect
+unselfish
+unsent
+unsettled
+unshackle
+unshaken
+unshaved
+unshaven
+unsheathe
+unshipped
+unsightly
+unsigned
+unskilled
+unsliced
+unsmooth
+unsnap
+unsocial
+unsoiled
+unsold
+unsolved
+unsorted
+unspoiled
+unspoken
+unstable
+unstaffed
+unstamped
+unsteady
+unsterile
+unstirred
+unstitch
+unstopped
+unstuck
+unstuffed
+unstylish
+unsubtle
+unsubtly
+unsuited
+unsure
+unsworn
+untagged
+untainted
+untaken
+untamed
+untangled
+untapped
+untaxed
+unthawed
+unthread
+untidy
+untie
+until
+untimed
+untimely
+untitled
+untoasted
+untold
+untouched
+untracked
+untrained
+untreated
+untried
+untrimmed
+untrue
+untruth
+unturned
+untwist
+untying
+unusable
+unused
+unusual
+unvalued
+unvaried
+unvarying
+unveiled
+unveiling
+unvented
+unviable
+unvisited
+unvocal
+unwanted
+unwarlike
+unwary
+unwashed
+unwatched
+unweave
+unwed
+unwelcome
+unwell
+unwieldy
+unwilling
+unwind
+unwired
+unwitting
+unwomanly
+unworldly
+unworn
+unworried
+unworthy
+unwound
+unwoven
+unwrapped
+unwritten
+unzip
+upbeat
+upchuck
+upcoming
+upcountry
+update
+upfront
+upgrade
+upheaval
+upheld
+uphill
+uphold
+uplifted
+uplifting
+upload
+upon
+upper
+upright
+uprising
+upriver
+uproar
+uproot
+upscale
+upside
+upstage
+upstairs
+upstart
+upstate
+upstream
+upstroke
+upswing
+uptake
+uptight
+uptown
+upturned
+upward
+upwind
+uranium
+urban
+urchin
+urethane
+urgency
+urgent
+urging
+urologist
+urology
+usable
+usage
+useable
+used
+uselessly
+user
+usher
+usual
+utensil
+utility
+utilize
+utmost
+utopia
+utter
+vacancy
+vacant
+vacate
+vacation
+vagabond
+vagrancy
+vagrantly
+vaguely
+vagueness
+valiant
+valid
+valium
+valley
+valuables
+value
+vanilla
+vanish
+vanity
+vanquish
+vantage
+vaporizer
+variable
+variably
+varied
+variety
+various
+varmint
+varnish
+varsity
+varying
+vascular
+vaseline
+vastly
+vastness
+veal
+vegan
+veggie
+vehicular
+velcro
+velocity
+velvet
+vendetta
+vending
+vendor
+veneering
+vengeful
+venomous
+ventricle
+venture
+venue
+venus
+verbalize
+verbally
+verbose
+verdict
+verify
+verse
+version
+versus
+vertebrae
+vertical
+vertigo
+very
+vessel
+vest
+veteran
+veto
+vexingly
+viability
+viable
+vibes
+vice
+vicinity
+victory
+video
+viewable
+viewer
+viewing
+viewless
+viewpoint
+vigorous
+village
+villain
+vindicate
+vineyard
+vintage
+violate
+violation
+violator
+violet
+violin
+viper
+viral
+virtual
+virtuous
+virus
+visa
+viscosity
+viscous
+viselike
+visible
+visibly
+vision
+visiting
+visitor
+visor
+vista
+vitality
+vitalize
+vitally
+vitamins
+vivacious
+vividly
+vividness
+vixen
+vocalist
+vocalize
+vocally
+vocation
+voice
+voicing
+void
+volatile
+volley
+voltage
+volumes
+voter
+voting
+voucher
+vowed
+vowel
+voyage
+wackiness
+wad
+wafer
+waffle
+waged
+wager
+wages
+waggle
+wagon
+wake
+waking
+walk
+walmart
+walnut
+walrus
+waltz
+wand
+wannabe
+wanted
+wanting
+wasabi
+washable
+washbasin
+washboard
+washbowl
+washcloth
+washday
+washed
+washer
+washhouse
+washing
+washout
+washroom
+washstand
+washtub
+wasp
+wasting
+watch
+water
+waviness
+waving
+wavy
+whacking
+whacky
+wham
+wharf
+wheat
+whenever
+whiff
+whimsical
+whinny
+whiny
+whisking
+whoever
+whole
+whomever
+whoopee
+whooping
+whoops
+why
+wick
+widely
+widen
+widget
+widow
+width
+wieldable
+wielder
+wife
+wifi
+wikipedia
+wildcard
+wildcat
+wilder
+wildfire
+wildfowl
+wildland
+wildlife
+wildly
+wildness
+willed
+willfully
+willing
+willow
+willpower
+wilt
+wimp
+wince
+wincing
+wind
+wing
+winking
+winner
+winnings
+winter
+wipe
+wired
+wireless
+wiring
+wiry
+wisdom
+wise
+wish
+wisplike
+wispy
+wistful
+wizard
+wobble
+wobbling
+wobbly
+wok
+wolf
+wolverine
+womanhood
+womankind
+womanless
+womanlike
+womanly
+womb
+woof
+wooing
+wool
+woozy
+word
+work
+worried
+worrier
+worrisome
+worry
+worsening
+worshiper
+worst
+wound
+woven
+wow
+wrangle
+wrath
+wreath
+wreckage
+wrecker
+wrecking
+wrench
+wriggle
+wriggly
+wrinkle
+wrinkly
+wrist
+writing
+written
+wrongdoer
+wronged
+wrongful
+wrongly
+wrongness
+wrought
+xbox
+xerox
+yahoo
+yam
+yanking
+yapping
+yard
+yarn
+yeah
+yearbook
+yearling
+yearly
+yearning
+yeast
+yelling
+yelp
+yen
+yesterday
+yiddish
+yield
+yin
+yippee
+yo-yo
+yodel
+yoga
+yogurt
+yonder
+yoyo
+yummy
+zap
+zealous
+zebra
+zen
+zeppelin
+zero
+zestfully
+zesty
+zigzagged
+zipfile
+zipping
+zippy
+zips
+zit
+zodiac
+zombie
+zone
+zoning
+zookeeper
+zoologist
+zoology
+zoom
diff --git a/desktop/src/onionshare/__init__.py b/desktop/src/onionshare/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/desktop/src/onionshare/__init__.py
diff --git a/desktop/src/onionshare/resources/__init__.py b/desktop/src/onionshare/resources/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/desktop/src/onionshare/resources/__init__.py
diff --git a/desktop/src/onionshare/resources/onionshare.icns b/desktop/src/onionshare/resources/onionshare.icns
new file mode 100644
index 00000000..f65ad12d
--- /dev/null
+++ b/desktop/src/onionshare/resources/onionshare.icns
Binary files differ
diff --git a/desktop/src/onionshare/resources/onionshare.ico b/desktop/src/onionshare/resources/onionshare.ico
new file mode 100644
index 00000000..dcde4f1f
--- /dev/null
+++ b/desktop/src/onionshare/resources/onionshare.ico
Binary files differ
diff --git a/desktop/src/onionshare/resources/onionshare.png b/desktop/src/onionshare/resources/onionshare.png
new file mode 100644
index 00000000..a4810d04
--- /dev/null
+++ b/desktop/src/onionshare/resources/onionshare.png
Binary files differ
diff --git a/desktop/stdeb.cfg b/desktop/stdeb.cfg
new file mode 100644
index 00000000..dd59abf6
--- /dev/null
+++ b/desktop/stdeb.cfg
@@ -0,0 +1,6 @@
+[DEFAULT]
+Package3: onionshare
+Depends3: python3, python3-flask, python3-flask-httpauth, python3-stem, python3-pyqt5, python3-crypto, python3-socks, python3-distutils, python3-nautilus, tor, obfs4proxy, python3-psutil, python3-socketio, python3-flask-socketio, python3-qrcode
+Build-Depends: python3, python3-all, python3-pytest, python3-requests, python3-flask, python3-flask-httpauth, python3-stem, python3-pyqt5, python3-crypto, python3-socks, python3-distutils, python3-psutil, python3-socketio, python3-flask-socketio, python3-qrcode
+Suite: disco
+X-Python3-Version: >= 3.6
diff --git a/desktop/tests/__init__.py b/desktop/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/desktop/tests/__init__.py
diff --git a/desktop/tests/conftest.py b/desktop/tests/conftest.py
new file mode 100644
index 00000000..ba0f1e72
--- /dev/null
+++ b/desktop/tests/conftest.py
@@ -0,0 +1,209 @@
+import sys
+
+# Force tests to look for resources in the source code tree
+sys.onionshare_dev_mode = True
+
+# Let OnionShare know the tests are running, to avoid colliding with settings files
+sys.onionshare_test_mode = True
+
+import os
+import shutil
+import tempfile
+
+import pytest
+
+from onionshare import common, web, settings, strings
+
+
+# The temporary directory for CLI tests
+test_temp_dir = None
+
+
+def pytest_addoption(parser):
+ parser.addoption(
+ "--rungui", action="store_true", default=False, help="run GUI tests"
+ )
+ parser.addoption(
+ "--runtor", action="store_true", default=False, help="run tor tests"
+ )
+
+
+def pytest_collection_modifyitems(config, items):
+ if not config.getoption("--runtor"):
+ # --runtor given in cli: do not skip tor tests
+ skip_tor = pytest.mark.skip(reason="need --runtor option to run")
+ for item in items:
+ if "tor" in item.keywords:
+ item.add_marker(skip_tor)
+
+ if not config.getoption("--rungui"):
+ # --rungui given in cli: do not skip GUI tests
+ skip_gui = pytest.mark.skip(reason="need --rungui option to run")
+ for item in items:
+ if "gui" in item.keywords:
+ item.add_marker(skip_gui)
+
+
+@pytest.fixture
+def temp_dir():
+ """Creates a persistent temporary directory for the CLI tests to use"""
+ global test_temp_dir
+ if not test_temp_dir:
+ test_temp_dir = tempfile.mkdtemp()
+ return test_temp_dir
+
+
+@pytest.fixture
+def temp_dir_1024(temp_dir):
+ """ Create a temporary directory that has a single file of a
+ particular size (1024 bytes).
+ """
+
+ new_temp_dir = tempfile.mkdtemp(dir=temp_dir)
+ tmp_file, tmp_file_path = tempfile.mkstemp(dir=new_temp_dir)
+ with open(tmp_file, "wb") as f:
+ f.write(b"*" * 1024)
+ return new_temp_dir
+
+
+# pytest > 2.9 only needs @pytest.fixture
+@pytest.yield_fixture
+def temp_dir_1024_delete(temp_dir):
+ """ Create a temporary directory that has a single file of a
+ particular size (1024 bytes). The temporary directory (including
+ the file inside) will be deleted after fixture usage.
+ """
+
+ with tempfile.TemporaryDirectory(dir=temp_dir) as new_temp_dir:
+ tmp_file, tmp_file_path = tempfile.mkstemp(dir=new_temp_dir)
+ with open(tmp_file, "wb") as f:
+ f.write(b"*" * 1024)
+ yield new_temp_dir
+
+
+@pytest.fixture
+def temp_file_1024(temp_dir):
+ """ Create a temporary file of a particular size (1024 bytes). """
+
+ with tempfile.NamedTemporaryFile(delete=False, dir=temp_dir) as tmp_file:
+ tmp_file.write(b"*" * 1024)
+ return tmp_file.name
+
+
+# pytest > 2.9 only needs @pytest.fixture
+@pytest.yield_fixture
+def temp_file_1024_delete(temp_dir):
+ """
+ Create a temporary file of a particular size (1024 bytes).
+ The temporary file will be deleted after fixture usage.
+ """
+
+ with tempfile.NamedTemporaryFile(dir=temp_dir, delete=False) as tmp_file:
+ tmp_file.write(b"*" * 1024)
+ tmp_file.flush()
+ tmp_file.close()
+ yield tmp_file.name
+
+
+# pytest > 2.9 only needs @pytest.fixture
+@pytest.yield_fixture(scope="session")
+def custom_zw():
+ zw = web.share_mode.ZipWriter(
+ common.Common(),
+ zip_filename=common.Common.random_string(4, 6),
+ processed_size_callback=lambda _: "custom_callback",
+ )
+ yield zw
+ zw.close()
+ os.remove(zw.zip_filename)
+
+
+# pytest > 2.9 only needs @pytest.fixture
+@pytest.yield_fixture(scope="session")
+def default_zw():
+ zw = web.share_mode.ZipWriter(common.Common())
+ yield zw
+ zw.close()
+ tmp_dir = os.path.dirname(zw.zip_filename)
+ try:
+ shutil.rmtree(tmp_dir, ignore_errors=True)
+ except:
+ pass
+
+
+@pytest.fixture
+def locale_en(monkeypatch):
+ monkeypatch.setattr("locale.getdefaultlocale", lambda: ("en_US", "UTF-8"))
+
+
+@pytest.fixture
+def locale_fr(monkeypatch):
+ monkeypatch.setattr("locale.getdefaultlocale", lambda: ("fr_FR", "UTF-8"))
+
+
+@pytest.fixture
+def locale_invalid(monkeypatch):
+ monkeypatch.setattr("locale.getdefaultlocale", lambda: ("xx_XX", "UTF-8"))
+
+
+@pytest.fixture
+def locale_ru(monkeypatch):
+ monkeypatch.setattr("locale.getdefaultlocale", lambda: ("ru_RU", "UTF-8"))
+
+
+@pytest.fixture
+def platform_darwin(monkeypatch):
+ monkeypatch.setattr("platform.system", lambda: "Darwin")
+
+
+@pytest.fixture # (scope="session")
+def platform_linux(monkeypatch):
+ monkeypatch.setattr("platform.system", lambda: "Linux")
+
+
+@pytest.fixture
+def platform_windows(monkeypatch):
+ monkeypatch.setattr("platform.system", lambda: "Windows")
+
+
+@pytest.fixture
+def sys_argv_sys_prefix(monkeypatch):
+ monkeypatch.setattr("sys.argv", [sys.prefix])
+
+
+@pytest.fixture
+def sys_frozen(monkeypatch):
+ monkeypatch.setattr("sys.frozen", True, raising=False)
+
+
+@pytest.fixture
+def sys_meipass(monkeypatch):
+ monkeypatch.setattr("sys._MEIPASS", os.path.expanduser("~"), raising=False)
+
+
+@pytest.fixture # (scope="session")
+def sys_onionshare_dev_mode(monkeypatch):
+ monkeypatch.setattr("sys.onionshare_dev_mode", True, raising=False)
+
+
+@pytest.fixture
+def time_time_100(monkeypatch):
+ monkeypatch.setattr("time.time", lambda: 100)
+
+
+@pytest.fixture
+def time_strftime(monkeypatch):
+ monkeypatch.setattr("time.strftime", lambda _: "Jun 06 2013 11:05:00")
+
+
+@pytest.fixture
+def common_obj():
+ return common.Common()
+
+
+@pytest.fixture
+def settings_obj(sys_onionshare_dev_mode, platform_linux):
+ _common = common.Common()
+ _common.version = "DUMMY_VERSION_1.2.3"
+ strings.load_strings(_common)
+ return settings.Settings(_common)
diff --git a/desktop/tests/gui_base_test.py b/desktop/tests/gui_base_test.py
new file mode 100644
index 00000000..2b9bcd99
--- /dev/null
+++ b/desktop/tests/gui_base_test.py
@@ -0,0 +1,467 @@
+import pytest
+import unittest
+
+import json
+import os
+import requests
+import shutil
+import base64
+import tempfile
+import secrets
+import platform
+
+from PyQt5 import QtCore, QtTest, QtWidgets
+
+from onionshare import strings
+from onionshare.common import Common
+from onionshare.settings import Settings
+from onionshare.onion import Onion
+from onionshare.web import Web
+
+from onionshare_gui import Application, MainWindow, GuiCommon
+from onionshare_gui.tab.mode.share_mode import ShareMode
+from onionshare_gui.tab.mode.receive_mode import ReceiveMode
+from onionshare_gui.tab.mode.website_mode import WebsiteMode
+
+
+class GuiBaseTest(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ common = Common(verbose=True)
+
+ # Delete any old test data that might exist
+ shutil.rmtree(common.build_data_dir(), ignore_errors=True)
+
+ qtapp = Application(common)
+ common.gui = GuiCommon(common, qtapp, local_only=True)
+ cls.gui = MainWindow(common, filenames=None)
+ cls.gui.qtapp = qtapp
+
+ # Create some random files to test with
+ cls.tmpdir = tempfile.TemporaryDirectory()
+ cls.tmpfiles = []
+ for _ in range(10):
+ filename = os.path.join(cls.tmpdir.name, f"{secrets.token_hex(4)}.txt")
+ with open(filename, "w") as file:
+ file.write(secrets.token_hex(10))
+ cls.tmpfiles.append(filename)
+
+ # A file called "test.txt"
+ cls.tmpfile_test = os.path.join(cls.tmpdir.name, "test.txt")
+ with open(cls.tmpfile_test, "w") as file:
+ file.write("onionshare")
+
+ # A file called "test2.txt"
+ cls.tmpfile_test2 = os.path.join(cls.tmpdir.name, "test2.txt")
+ with open(cls.tmpfile_test2, "w") as file:
+ file.write("onionshare2")
+
+ # A file called "index.html"
+ cls.tmpfile_index_html = os.path.join(cls.tmpdir.name, "index.html")
+ with open(cls.tmpfile_index_html, "w") as file:
+ file.write(
+ "<html><body><p>This is a test website hosted by OnionShare</p></body></html>"
+ )
+
+ # A large file
+ size = 1024 * 1024 * 155
+ cls.tmpfile_large = os.path.join(cls.tmpdir.name, "large_file")
+ with open(cls.tmpfile_large, "wb") as fout:
+ fout.write(os.urandom(size))
+
+ @classmethod
+ def tearDownClass(cls):
+ # Quit
+ cls.gui.qtapp.clipboard().clear()
+ QtCore.QTimer.singleShot(200, cls.gui.close_dialog.accept_button.click)
+ cls.gui.close()
+
+ cls.gui.cleanup()
+
+ # Shared test methods
+
+ def verify_new_tab(self, tab):
+ # Make sure the new tab widget is showing, and no mode has been started
+ QtTest.QTest.qWait(1000)
+ self.assertTrue(tab.new_tab.isVisible())
+ self.assertFalse(hasattr(tab, "share_mode"))
+ self.assertFalse(hasattr(tab, "receive_mode"))
+ self.assertFalse(hasattr(tab, "website_mode"))
+ self.assertFalse(hasattr(tab, "chat_mode"))
+
+ def new_share_tab(self):
+ tab = self.gui.tabs.widget(0)
+ self.verify_new_tab(tab)
+
+ # Share files
+ tab.share_button.click()
+ self.assertFalse(tab.new_tab.isVisible())
+ self.assertTrue(tab.share_mode.isVisible())
+
+ return tab
+
+ def new_share_tab_with_files(self):
+ tab = self.new_share_tab()
+
+ # Add files
+ for filename in self.tmpfiles:
+ tab.share_mode.server_status.file_selection.file_list.add_file(filename)
+
+ return tab
+
+ def new_receive_tab(self):
+ tab = self.gui.tabs.widget(0)
+ self.verify_new_tab(tab)
+
+ # Receive files
+ tab.receive_button.click()
+ self.assertFalse(tab.new_tab.isVisible())
+ self.assertTrue(tab.receive_mode.isVisible())
+
+ return tab
+
+ def new_website_tab(self):
+ tab = self.gui.tabs.widget(0)
+ self.verify_new_tab(tab)
+
+ # Publish website
+ tab.website_button.click()
+ self.assertFalse(tab.new_tab.isVisible())
+ self.assertTrue(tab.website_mode.isVisible())
+
+ return tab
+
+ def new_website_tab_with_files(self):
+ tab = self.new_website_tab()
+
+ # Add files
+ for filename in self.tmpfiles:
+ tab.website_mode.server_status.file_selection.file_list.add_file(filename)
+
+ return tab
+
+ def close_all_tabs(self):
+ for _ in range(self.gui.tabs.count()):
+ tab = self.gui.tabs.widget(0)
+ QtCore.QTimer.singleShot(200, tab.close_dialog.accept_button.click)
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ def gui_loaded(self):
+ """Test that the GUI actually is shown"""
+ self.assertTrue(self.gui.show)
+
+ def window_title_seen(self):
+ """Test that the window title is OnionShare"""
+ self.assertEqual(self.gui.windowTitle(), "OnionShare")
+
+ def server_status_bar_is_visible(self):
+ """Test that the status bar is visible"""
+ self.assertTrue(self.gui.status_bar.isVisible())
+
+ def mode_settings_widget_is_visible(self, tab):
+ """Test that the mode settings are visible"""
+ self.assertTrue(tab.get_mode().mode_settings_widget.isVisible())
+
+ def mode_settings_widget_is_hidden(self, tab):
+ """Test that the mode settings are hidden when the server starts"""
+ self.assertFalse(tab.get_mode().mode_settings_widget.isVisible())
+
+ def click_toggle_history(self, tab):
+ """Test that we can toggle Download or Upload history by clicking the toggle button"""
+ currently_visible = tab.get_mode().history.isVisible()
+ tab.get_mode().toggle_history.click()
+ self.assertEqual(tab.get_mode().history.isVisible(), not currently_visible)
+
+ def history_indicator(self, tab, indicator_count="1"):
+ """Test that we can make sure the history is toggled off, do an action, and the indiciator works"""
+ # Make sure history is toggled off
+ if tab.get_mode().history.isVisible():
+ tab.get_mode().toggle_history.click()
+ self.assertFalse(tab.get_mode().history.isVisible())
+
+ # Indicator should not be visible yet
+ self.assertFalse(tab.get_mode().toggle_history.indicator_label.isVisible())
+
+ if type(tab.get_mode()) == ReceiveMode:
+ # Upload a file
+ files = {"file[]": open(self.tmpfiles[0], "rb")}
+ url = f"http://127.0.0.1:{tab.app.port}/upload"
+ if tab.settings.get("general", "public"):
+ requests.post(url, files=files)
+ else:
+ requests.post(
+ url,
+ files=files,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().web.password
+ ),
+ )
+ QtTest.QTest.qWait(2000)
+
+ if type(tab.get_mode()) == ShareMode:
+ # Download files
+ url = f"http://127.0.0.1:{tab.app.port}/download"
+ if tab.settings.get("general", "public"):
+ requests.get(url)
+ else:
+ requests.get(
+ url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().web.password
+ ),
+ )
+ QtTest.QTest.qWait(2000)
+
+ # Indicator should be visible, have a value of "1"
+ self.assertTrue(tab.get_mode().toggle_history.indicator_label.isVisible())
+ self.assertEqual(
+ tab.get_mode().toggle_history.indicator_label.text(), indicator_count
+ )
+
+ # Toggle history back on, indicator should be hidden again
+ tab.get_mode().toggle_history.click()
+ self.assertFalse(tab.get_mode().toggle_history.indicator_label.isVisible())
+
+ def history_is_not_visible(self, tab):
+ """Test that the History section is not visible"""
+ self.assertFalse(tab.get_mode().history.isVisible())
+
+ def history_is_visible(self, tab):
+ """Test that the History section is visible"""
+ self.assertTrue(tab.get_mode().history.isVisible())
+
+ def server_working_on_start_button_pressed(self, tab):
+ """Test we can start the service"""
+ # Should be in SERVER_WORKING state
+ tab.get_mode().server_status.server_button.click()
+ self.assertEqual(tab.get_mode().server_status.status, 1)
+
+ def toggle_indicator_is_reset(self, tab):
+ self.assertEqual(tab.get_mode().toggle_history.indicator_count, 0)
+ self.assertFalse(tab.get_mode().toggle_history.indicator_label.isVisible())
+
+ def server_status_indicator_says_starting(self, tab):
+ """Test that the Server Status indicator shows we are Starting"""
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("gui_status_indicator_share_working"),
+ )
+
+ def server_status_indicator_says_scheduled(self, tab):
+ """Test that the Server Status indicator shows we are Scheduled"""
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("gui_status_indicator_share_scheduled"),
+ )
+
+ def server_is_started(self, tab, startup_time=2000):
+ """Test that the server has started"""
+ QtTest.QTest.qWait(startup_time)
+ # Should now be in SERVER_STARTED state
+ self.assertEqual(tab.get_mode().server_status.status, 2)
+
+ def web_server_is_running(self, tab):
+ """Test that the web server has started"""
+ try:
+ requests.get(f"http://127.0.0.1:{tab.app.port}/")
+ self.assertTrue(True)
+ except requests.exceptions.ConnectionError:
+ self.assertTrue(False)
+
+ def have_a_password(self, tab):
+ """Test that we have a valid password"""
+ if not tab.settings.get("general", "public"):
+ self.assertRegex(tab.get_mode().server_status.web.password, r"(\w+)-(\w+)")
+ else:
+ self.assertIsNone(tab.get_mode().server_status.web.password, r"(\w+)-(\w+)")
+
+ def add_button_visible(self, tab):
+ """Test that the add button should be visible"""
+ if platform.system() == "Darwin":
+ self.assertTrue(
+ tab.get_mode().server_status.file_selection.add_files_button.isVisible()
+ )
+ self.assertTrue(
+ tab.get_mode().server_status.file_selection.add_folder_button.isVisible()
+ )
+ else:
+ self.assertTrue(
+ tab.get_mode().server_status.file_selection.add_button.isVisible()
+ )
+
+ def url_description_shown(self, tab):
+ """Test that the URL label is showing"""
+ self.assertTrue(tab.get_mode().server_status.url_description.isVisible())
+
+ def have_copy_url_button(self, tab):
+ """Test that the Copy URL button is shown and that the clipboard is correct"""
+ self.assertTrue(tab.get_mode().server_status.copy_url_button.isVisible())
+
+ tab.get_mode().server_status.copy_url_button.click()
+ clipboard = tab.common.gui.qtapp.clipboard()
+ if tab.settings.get("general", "public"):
+ self.assertEqual(clipboard.text(), f"http://127.0.0.1:{tab.app.port}")
+ else:
+ self.assertEqual(
+ clipboard.text(),
+ f"http://onionshare:{tab.get_mode().server_status.web.password}@127.0.0.1:{tab.app.port}",
+ )
+
+ def have_show_qr_code_button(self, tab):
+ """Test that the Show QR Code URL button is shown and that it loads a QR Code Dialog"""
+ self.assertTrue(
+ tab.get_mode().server_status.show_url_qr_code_button.isVisible()
+ )
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ QtCore.QTimer.singleShot(500, accept_dialog)
+ tab.get_mode().server_status.show_url_qr_code_button.click()
+
+ def server_status_indicator_says_started(self, tab):
+ """Test that the Server Status indicator shows we are started"""
+ if type(tab.get_mode()) == ReceiveMode:
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("gui_status_indicator_receive_started"),
+ )
+ if type(tab.get_mode()) == ShareMode:
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("gui_status_indicator_share_started"),
+ )
+
+ def web_page(self, tab, string):
+ """Test that the web page contains a string"""
+
+ url = f"http://127.0.0.1:{tab.app.port}/"
+ if tab.settings.get("general", "public"):
+ r = requests.get(url)
+ else:
+ r = requests.get(
+ url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().web.password
+ ),
+ )
+
+ self.assertTrue(string in r.text)
+
+ def history_widgets_present(self, tab):
+ """Test that the relevant widgets are present in the history view after activity has taken place"""
+ self.assertFalse(tab.get_mode().history.empty.isVisible())
+ self.assertTrue(tab.get_mode().history.not_empty.isVisible())
+
+ def counter_incremented(self, tab, count):
+ """Test that the counter has incremented"""
+ self.assertEqual(tab.get_mode().history.completed_count, count)
+
+ def server_is_stopped(self, tab):
+ """Test that the server stops when we click Stop"""
+ if (
+ type(tab.get_mode()) == ReceiveMode
+ or (
+ type(tab.get_mode()) == ShareMode
+ and not tab.settings.get("share", "autostop_sharing")
+ )
+ or (type(tab.get_mode()) == WebsiteMode)
+ ):
+ tab.get_mode().server_status.server_button.click()
+ self.assertEqual(tab.get_mode().server_status.status, 0)
+ self.assertFalse(
+ tab.get_mode().server_status.show_url_qr_code_button.isVisible()
+ )
+ self.assertFalse(tab.get_mode().server_status.copy_url_button.isVisible())
+ self.assertFalse(tab.get_mode().server_status.url.isVisible())
+ self.assertFalse(tab.get_mode().server_status.url_description.isVisible())
+ self.assertFalse(
+ tab.get_mode().server_status.copy_hidservauth_button.isVisible()
+ )
+
+ def web_server_is_stopped(self, tab):
+ """Test that the web server also stopped"""
+ QtTest.QTest.qWait(800)
+
+ try:
+ requests.get(f"http://127.0.0.1:{tab.app.port}/")
+ self.assertTrue(False)
+ except requests.exceptions.ConnectionError:
+ self.assertTrue(True)
+
+ def server_status_indicator_says_closed(self, tab):
+ """Test that the Server Status indicator shows we closed"""
+ if type(tab.get_mode()) == ReceiveMode:
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("gui_status_indicator_receive_stopped"),
+ )
+ if type(tab.get_mode()) == ShareMode:
+ if not tab.settings.get("share", "autostop_sharing"):
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("gui_status_indicator_share_stopped"),
+ )
+ else:
+ self.assertEqual(
+ tab.get_mode().server_status_label.text(),
+ strings._("closing_automatically"),
+ )
+
+ def clear_all_history_items(self, tab, count):
+ if count == 0:
+ tab.get_mode().history.clear_button.click()
+ self.assertEqual(len(tab.get_mode().history.item_list.items.keys()), count)
+
+ def file_selection_widget_has_files(self, tab, num=3):
+ """Test that the number of items in the list is as expected"""
+ self.assertEqual(
+ tab.get_mode().server_status.file_selection.get_num_files(), num
+ )
+
+ def add_remove_buttons_hidden(self, tab):
+ """Test that the add and remove buttons are hidden when the server starts"""
+ if platform.system() == "Darwin":
+ self.assertFalse(
+ tab.get_mode().server_status.file_selection.add_files_button.isVisible()
+ )
+ self.assertFalse(
+ tab.get_mode().server_status.file_selection.add_folder_button.isVisible()
+ )
+ else:
+ self.assertFalse(
+ tab.get_mode().server_status.file_selection.add_button.isVisible()
+ )
+ self.assertFalse(
+ tab.get_mode().server_status.file_selection.remove_button.isVisible()
+ )
+
+ # Auto-stop timer tests
+ def set_timeout(self, tab, timeout):
+ """Test that the timeout can be set"""
+ timer = QtCore.QDateTime.currentDateTime().addSecs(timeout)
+ tab.get_mode().mode_settings_widget.autostop_timer_widget.setDateTime(timer)
+ self.assertTrue(
+ tab.get_mode().mode_settings_widget.autostop_timer_widget.dateTime(), timer
+ )
+
+ def autostop_timer_widget_hidden(self, tab):
+ """Test that the auto-stop timer widget is hidden when share has started"""
+ self.assertFalse(
+ tab.get_mode().mode_settings_widget.autostop_timer_widget.isVisible()
+ )
+
+ def server_timed_out(self, tab, wait):
+ """Test that the server has timed out after the timer ran out"""
+ QtTest.QTest.qWait(wait)
+ # We should have timed out now
+ self.assertEqual(tab.get_mode().server_status.status, 0)
+
+ # Grouped tests follow from here
+
+ def run_all_common_setup_tests(self):
+ self.gui_loaded()
+ self.window_title_seen()
+ self.server_status_bar_is_visible()
diff --git a/desktop/tests/pytest.ini b/desktop/tests/pytest.ini
new file mode 100644
index 00000000..393e0dd8
--- /dev/null
+++ b/desktop/tests/pytest.ini
@@ -0,0 +1,4 @@
+[pytest]
+markers =
+ gui: marks tests as a GUI test
+ tor: marks tests as a Tor GUI test \ No newline at end of file
diff --git a/desktop/tests/run.bat b/desktop/tests/run.bat
new file mode 100644
index 00000000..5db3f14a
--- /dev/null
+++ b/desktop/tests/run.bat
@@ -0,0 +1,9 @@
+pytest -vvv tests\test_cli.py
+pytest -vvv tests\test_cli_common.py
+pytest -vvv tests\test_cli_settings.py
+pytest -vvv tests\test_cli_strings.py
+pytest -vvv tests\test_cli_web.py
+pytest -vvv --rungui tests\test_gui_tabs.py
+pytest -vvv --rungui tests\test_gui_share.py
+pytest -vvv --rungui tests\test_gui_receive.py
+pytest -vvv --rungui tests\test_gui_website.py
diff --git a/desktop/tests/run.sh b/desktop/tests/run.sh
new file mode 100755
index 00000000..184dfc16
--- /dev/null
+++ b/desktop/tests/run.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# The script runs python tests
+# Firstly, all CLI tests are run
+# Then, all the GUI tests are run individually
+# to avoid segmentation fault
+
+PARAMS=""
+
+while [ ! $# -eq 0 ]
+do
+ case "$1" in
+ --rungui)
+ PARAMS="$PARAMS --rungui"
+ ;;
+ --runtor)
+ PARAMS="$PARAMS --runtor"
+ ;;
+ esac
+ shift
+done
+
+pytest $PARAMS -vvv ./tests/test_cli*.py || exit 1
+for filename in ./tests/test_gui_*.py; do
+ pytest $PARAMS -vvv --no-qt-log $filename || exit 1
+done
diff --git a/desktop/tests/test_cli.py b/desktop/tests/test_cli.py
new file mode 100644
index 00000000..7cc61853
--- /dev/null
+++ b/desktop/tests/test_cli.py
@@ -0,0 +1,56 @@
+import os
+
+import pytest
+
+from onionshare import OnionShare
+from onionshare.common import Common
+from onionshare.mode_settings import ModeSettings
+
+
+class MyOnion:
+ def __init__(self):
+ self.auth_string = "TestHidServAuth"
+ self.private_key = ""
+ self.scheduled_key = None
+
+ @staticmethod
+ def start_onion_service(self, mode_settings_obj, await_publication=True, save_scheduled_key=False):
+ return "test_service_id.onion"
+
+
+@pytest.fixture
+def onionshare_obj():
+ common = Common()
+ return OnionShare(common, MyOnion())
+
+
+@pytest.fixture
+def mode_settings_obj():
+ common = Common()
+ return ModeSettings(common)
+
+
+class TestOnionShare:
+ def test_init(self, onionshare_obj):
+ assert onionshare_obj.hidserv_dir is None
+ assert onionshare_obj.onion_host is None
+ assert onionshare_obj.cleanup_filenames == []
+ assert onionshare_obj.local_only is False
+
+ def test_start_onion_service(self, onionshare_obj, mode_settings_obj):
+ onionshare_obj.start_onion_service(mode_settings_obj)
+ assert 17600 <= onionshare_obj.port <= 17650
+ assert onionshare_obj.onion_host == "test_service_id.onion"
+
+ def test_start_onion_service_local_only(self, onionshare_obj, mode_settings_obj):
+ onionshare_obj.local_only = True
+ onionshare_obj.start_onion_service(mode_settings_obj)
+ assert onionshare_obj.onion_host == "127.0.0.1:{}".format(onionshare_obj.port)
+
+ def test_cleanup(self, onionshare_obj, temp_dir_1024, temp_file_1024):
+ onionshare_obj.cleanup_filenames = [temp_dir_1024, temp_file_1024]
+ onionshare_obj.cleanup()
+
+ assert os.path.exists(temp_dir_1024) is False
+ assert os.path.exists(temp_dir_1024) is False
+ assert onionshare_obj.cleanup_filenames == []
diff --git a/desktop/tests/test_cli_common.py b/desktop/tests/test_cli_common.py
new file mode 100644
index 00000000..b60d22d7
--- /dev/null
+++ b/desktop/tests/test_cli_common.py
@@ -0,0 +1,275 @@
+import contextlib
+import inspect
+import io
+import os
+import random
+import re
+import socket
+import sys
+import zipfile
+
+import pytest
+
+PASSWORD_REGEX = re.compile(r"^([a-z]+)(-[a-z]+)?-([a-z]+)(-[a-z]+)?$")
+
+
+# TODO: Improve the Common tests to test it all as a single class
+
+
+class TestBuildPassword:
+ @pytest.mark.parametrize(
+ "test_input,expected",
+ (
+ # VALID, two lowercase words, separated by a hyphen
+ ("syrup-enzyme", True),
+ ("caution-friday", True),
+ # VALID, two lowercase words, with one hyphenated compound word
+ ("drop-down-thimble", True),
+ ("unmixed-yo-yo", True),
+ # VALID, two lowercase hyphenated compound words, separated by hyphen
+ ("yo-yo-drop-down", True),
+ ("felt-tip-t-shirt", True),
+ ("hello-world", True),
+ # INVALID
+ ("Upper-Case", False),
+ ("digits-123", False),
+ ("too-many-hyphens-", False),
+ ("symbols-!@#$%", False),
+ ),
+ )
+ def test_build_password_regex(self, test_input, expected):
+ """ Test that `PASSWORD_REGEX` accounts for the following patterns
+
+ There are a few hyphenated words in `wordlist.txt`:
+ * drop-down
+ * felt-tip
+ * t-shirt
+ * yo-yo
+
+ These words cause a few extra potential password patterns:
+ * word-word
+ * hyphenated-word-word
+ * word-hyphenated-word
+ * hyphenated-word-hyphenated-word
+ """
+
+ assert bool(PASSWORD_REGEX.match(test_input)) == expected
+
+ def test_build_password_unique(self, common_obj, sys_onionshare_dev_mode):
+ assert common_obj.build_password() != common_obj.build_password()
+
+
+class TestDirSize:
+ def test_temp_dir_size(self, common_obj, temp_dir_1024_delete):
+ """ dir_size() should return the total size (in bytes) of all files
+ in a particular directory.
+ """
+
+ assert common_obj.dir_size(temp_dir_1024_delete) == 1024
+
+
+class TestEstimatedTimeRemaining:
+ @pytest.mark.parametrize(
+ "test_input,expected",
+ (
+ ((2, 676, 12), "8h14m16s"),
+ ((14, 1049, 30), "1h26m15s"),
+ ((21, 450, 1), "33m42s"),
+ ((31, 1115, 80), "11m39s"),
+ ((336, 989, 32), "2m12s"),
+ ((603, 949, 38), "36s"),
+ ((971, 1009, 83), "1s"),
+ ),
+ )
+ def test_estimated_time_remaining(
+ self, common_obj, test_input, expected, time_time_100
+ ):
+ assert common_obj.estimated_time_remaining(*test_input) == expected
+
+ @pytest.mark.parametrize(
+ "test_input",
+ (
+ (10, 20, 100), # if `time_elapsed == 0`
+ (0, 37, 99), # if `download_rate == 0`
+ ),
+ )
+ def test_raises_zero_division_error(self, common_obj, test_input, time_time_100):
+ with pytest.raises(ZeroDivisionError):
+ common_obj.estimated_time_remaining(*test_input)
+
+
+class TestFormatSeconds:
+ @pytest.mark.parametrize(
+ "test_input,expected",
+ (
+ (0, "0s"),
+ (26, "26s"),
+ (60, "1m"),
+ (947.35, "15m47s"),
+ (1847, "30m47s"),
+ (2193.94, "36m34s"),
+ (3600, "1h"),
+ (13426.83, "3h43m47s"),
+ (16293, "4h31m33s"),
+ (18392.14, "5h6m32s"),
+ (86400, "1d"),
+ (129674, "1d12h1m14s"),
+ (56404.12, "15h40m4s"),
+ ),
+ )
+ def test_format_seconds(self, common_obj, test_input, expected):
+ assert common_obj.format_seconds(test_input) == expected
+
+ # TODO: test negative numbers?
+ @pytest.mark.parametrize("test_input", ("string", lambda: None, [], {}, set()))
+ def test_invalid_input_types(self, common_obj, test_input):
+ with pytest.raises(TypeError):
+ common_obj.format_seconds(test_input)
+
+
+class TestGetAvailablePort:
+ @pytest.mark.parametrize(
+ "port_min,port_max",
+ ((random.randint(1024, 1500), random.randint(1800, 2048)) for _ in range(50)),
+ )
+ def test_returns_an_open_port(self, common_obj, port_min, port_max):
+ """ get_available_port() should return an open port within the range """
+
+ port = common_obj.get_available_port(port_min, port_max)
+ assert port_min <= port <= port_max
+ with socket.socket() as tmpsock:
+ tmpsock.bind(("127.0.0.1", port))
+
+
+class TestGetPlatform:
+ def test_darwin(self, platform_darwin, common_obj):
+ assert common_obj.platform == "Darwin"
+
+ def test_linux(self, platform_linux, common_obj):
+ assert common_obj.platform == "Linux"
+
+ def test_windows(self, platform_windows, common_obj):
+ assert common_obj.platform == "Windows"
+
+
+# TODO: double-check these tests
+class TestGetResourcePath:
+ def test_onionshare_dev_mode(self, common_obj, sys_onionshare_dev_mode):
+ prefix = os.path.join(
+ os.path.dirname(
+ os.path.dirname(
+ os.path.abspath(inspect.getfile(inspect.currentframe()))
+ )
+ ),
+ "share",
+ )
+ assert common_obj.get_resource_path(
+ os.path.join(prefix, "test_filename")
+ ) == os.path.join(prefix, "test_filename")
+
+ def test_linux(self, common_obj, platform_linux, sys_argv_sys_prefix):
+ prefix = os.path.join(sys.prefix, "share", "onionshare")
+ assert common_obj.get_resource_path(
+ os.path.join(prefix, "test_filename")
+ ) == os.path.join(prefix, "test_filename")
+
+ def test_frozen_darwin(self, common_obj, platform_darwin, sys_frozen, sys_meipass):
+ prefix = os.path.join(sys._MEIPASS, "share")
+ assert common_obj.get_resource_path(
+ os.path.join(prefix, "test_filename")
+ ) == os.path.join(prefix, "test_filename")
+
+
+class TestGetTorPaths:
+ @pytest.mark.skipif(sys.platform != "Darwin", reason="requires MacOS")
+ def test_get_tor_paths_darwin(
+ self, platform_darwin, common_obj, sys_frozen, sys_meipass
+ ):
+ base_path = os.path.dirname(
+ os.path.dirname(os.path.dirname(common_obj.get_resource_path("")))
+ )
+ tor_path = os.path.join(base_path, "Resources", "Tor", "tor")
+ tor_geo_ip_file_path = os.path.join(base_path, "Resources", "Tor", "geoip")
+ tor_geo_ipv6_file_path = os.path.join(base_path, "Resources", "Tor", "geoip6")
+ obfs4proxy_file_path = os.path.join(base_path, "Resources", "Tor", "obfs4proxy")
+ assert common_obj.get_tor_paths() == (
+ tor_path,
+ tor_geo_ip_file_path,
+ tor_geo_ipv6_file_path,
+ obfs4proxy_file_path,
+ )
+
+ @pytest.mark.skipif(sys.platform != "Linux", reason="requires Linux")
+ def test_get_tor_paths_linux(self, platform_linux, common_obj):
+ (
+ tor_path,
+ tor_geo_ip_file_path,
+ tor_geo_ipv6_file_path,
+ _, # obfs4proxy is optional
+ ) = common_obj.get_tor_paths()
+
+ assert os.path.basename(tor_path) == "tor"
+ assert (
+ tor_geo_ip_file_path == "/usr/share/tor/geoip"
+ or tor_geo_ip_file_path == "/usr/local/share/tor/geoip"
+ )
+ assert (
+ tor_geo_ipv6_file_path == "/usr/share/tor/geoip6"
+ or tor_geo_ipv6_file_path == "/usr/local/share/tor/geoip6"
+ )
+
+ @pytest.mark.skipif(sys.platform != "win32", reason="requires Windows")
+ def test_get_tor_paths_windows(self, platform_windows, common_obj, sys_frozen):
+ base_path = os.path.join(
+ os.path.dirname(os.path.dirname(common_obj.get_resource_path(""))), "tor"
+ )
+ tor_path = os.path.join(os.path.join(base_path, "Tor"), "tor.exe")
+ obfs4proxy_file_path = os.path.join(
+ os.path.join(base_path, "Tor"), "obfs4proxy.exe"
+ )
+ tor_geo_ip_file_path = os.path.join(
+ os.path.join(os.path.join(base_path, "Data"), "Tor"), "geoip"
+ )
+ tor_geo_ipv6_file_path = os.path.join(
+ os.path.join(os.path.join(base_path, "Data"), "Tor"), "geoip6"
+ )
+ assert common_obj.get_tor_paths() == (
+ tor_path,
+ tor_geo_ip_file_path,
+ tor_geo_ipv6_file_path,
+ obfs4proxy_file_path,
+ )
+
+
+class TestHumanReadableFilesize:
+ @pytest.mark.parametrize(
+ "test_input,expected",
+ (
+ (1024 ** 0, "1.0 B"),
+ (1024 ** 1, "1.0 KiB"),
+ (1024 ** 2, "1.0 MiB"),
+ (1024 ** 3, "1.0 GiB"),
+ (1024 ** 4, "1.0 TiB"),
+ (1024 ** 5, "1.0 PiB"),
+ (1024 ** 6, "1.0 EiB"),
+ (1024 ** 7, "1.0 ZiB"),
+ (1024 ** 8, "1.0 YiB"),
+ ),
+ )
+ def test_human_readable_filesize(self, common_obj, test_input, expected):
+ assert common_obj.human_readable_filesize(test_input) == expected
+
+
+class TestLog:
+ def test_output(self, common_obj, time_strftime):
+ common_obj.verbose = True
+
+ # From: https://stackoverflow.com/questions/1218933
+ with io.StringIO() as buf, contextlib.redirect_stdout(buf):
+ common_obj.log("TestModule", "dummy_func")
+ common_obj.log("TestModule", "dummy_func", "TEST_MSG")
+ output = buf.getvalue()
+
+ line_one, line_two, _ = output.split("\n")
+ assert line_one == "[Jun 06 2013 11:05:00] TestModule.dummy_func"
+ assert line_two == "[Jun 06 2013 11:05:00] TestModule.dummy_func: TEST_MSG"
diff --git a/desktop/tests/test_cli_settings.py b/desktop/tests/test_cli_settings.py
new file mode 100644
index 00000000..83b51e54
--- /dev/null
+++ b/desktop/tests/test_cli_settings.py
@@ -0,0 +1,149 @@
+import json
+import os
+import tempfile
+import sys
+
+import pytest
+
+from onionshare import common, settings, strings
+
+
+@pytest.fixture
+def settings_obj(sys_onionshare_dev_mode, platform_linux):
+ _common = common.Common()
+ _common.version = "DUMMY_VERSION_1.2.3"
+ return settings.Settings(_common)
+
+
+class TestSettings:
+ def test_init(self, settings_obj):
+ expected_settings = {
+ "version": "DUMMY_VERSION_1.2.3",
+ "connection_type": "bundled",
+ "control_port_address": "127.0.0.1",
+ "control_port_port": 9051,
+ "socks_address": "127.0.0.1",
+ "socks_port": 9050,
+ "socket_file_path": "/var/run/tor/control",
+ "auth_type": "no_auth",
+ "auth_password": "",
+ "use_autoupdate": True,
+ "autoupdate_timestamp": None,
+ "no_bridges": True,
+ "tor_bridges_use_obfs4": False,
+ "tor_bridges_use_meek_lite_azure": False,
+ "tor_bridges_use_custom_bridges": "",
+ "persistent_tabs": [],
+ }
+ for key in settings_obj._settings:
+ # Skip locale, it will not always default to the same thing
+ if key != "locale":
+ assert settings_obj._settings[key] == settings_obj.default_settings[key]
+ assert settings_obj._settings[key] == expected_settings[key]
+
+ def test_fill_in_defaults(self, settings_obj):
+ del settings_obj._settings["version"]
+ settings_obj.fill_in_defaults()
+ assert settings_obj._settings["version"] == "DUMMY_VERSION_1.2.3"
+
+ def test_load(self, temp_dir, settings_obj):
+ custom_settings = {
+ "version": "CUSTOM_VERSION",
+ "socks_port": 9999,
+ "use_stealth": True,
+ }
+ tmp_file, tmp_file_path = tempfile.mkstemp(dir=temp_dir)
+ with open(tmp_file, "w") as f:
+ json.dump(custom_settings, f)
+ settings_obj.filename = tmp_file_path
+ settings_obj.load()
+
+ assert settings_obj._settings["version"] == "CUSTOM_VERSION"
+ assert settings_obj._settings["socks_port"] == 9999
+ assert settings_obj._settings["use_stealth"] is True
+
+ os.remove(tmp_file_path)
+ assert os.path.exists(tmp_file_path) is False
+
+ def test_save(self, monkeypatch, temp_dir, settings_obj):
+ monkeypatch.setattr(strings, "_", lambda _: "")
+
+ settings_filename = "default_settings.json"
+ new_temp_dir = tempfile.mkdtemp(dir=temp_dir)
+ settings_path = os.path.join(new_temp_dir, settings_filename)
+ settings_obj.filename = settings_path
+ settings_obj.save()
+ with open(settings_path, "r") as f:
+ settings = json.load(f)
+
+ assert settings_obj._settings == settings
+
+ os.remove(settings_path)
+ assert os.path.exists(settings_path) is False
+
+ def test_get(self, settings_obj):
+ assert settings_obj.get("version") == "DUMMY_VERSION_1.2.3"
+ assert settings_obj.get("connection_type") == "bundled"
+ assert settings_obj.get("control_port_address") == "127.0.0.1"
+ assert settings_obj.get("control_port_port") == 9051
+ assert settings_obj.get("socks_address") == "127.0.0.1"
+ assert settings_obj.get("socks_port") == 9050
+ assert settings_obj.get("socket_file_path") == "/var/run/tor/control"
+ assert settings_obj.get("auth_type") == "no_auth"
+ assert settings_obj.get("auth_password") == ""
+ assert settings_obj.get("use_autoupdate") is True
+ assert settings_obj.get("autoupdate_timestamp") is None
+ assert settings_obj.get("autoupdate_timestamp") is None
+ assert settings_obj.get("no_bridges") is True
+ assert settings_obj.get("tor_bridges_use_obfs4") is False
+ assert settings_obj.get("tor_bridges_use_meek_lite_azure") is False
+ assert settings_obj.get("tor_bridges_use_custom_bridges") == ""
+
+ def test_set_version(self, settings_obj):
+ settings_obj.set("version", "CUSTOM_VERSION")
+ assert settings_obj._settings["version"] == "CUSTOM_VERSION"
+
+ def test_set_control_port_port(self, settings_obj):
+ settings_obj.set("control_port_port", 999)
+ assert settings_obj._settings["control_port_port"] == 999
+
+ settings_obj.set("control_port_port", "NON_INTEGER")
+ assert settings_obj._settings["control_port_port"] == 9051
+
+ def test_set_socks_port(self, settings_obj):
+ settings_obj.set("socks_port", 888)
+ assert settings_obj._settings["socks_port"] == 888
+
+ settings_obj.set("socks_port", "NON_INTEGER")
+ assert settings_obj._settings["socks_port"] == 9050
+
+ @pytest.mark.skipif(sys.platform != "Darwin", reason="requires Darwin")
+ def test_filename_darwin(self, monkeypatch, platform_darwin):
+ obj = settings.Settings(common.Common())
+ assert obj.filename == os.path.expanduser(
+ "~/Library/Application Support/OnionShare-testdata/onionshare.json"
+ )
+
+ @pytest.mark.skipif(sys.platform != "Linux", reason="requires Linux")
+ def test_filename_linux(self, monkeypatch, platform_linux):
+ obj = settings.Settings(common.Common())
+ assert obj.filename == os.path.expanduser(
+ "~/.config/onionshare-testdata/onionshare.json"
+ )
+
+ @pytest.mark.skipif(sys.platform != "win32", reason="requires Windows")
+ def test_filename_windows(self, monkeypatch, platform_windows):
+ obj = settings.Settings(common.Common())
+ assert obj.filename == os.path.expanduser(
+ "~\\AppData\\Roaming\\OnionShare-testdata\\onionshare.json"
+ )
+
+ def test_set_custom_bridge(self, settings_obj):
+ settings_obj.set(
+ "tor_bridges_use_custom_bridges",
+ "Bridge 45.3.20.65:9050 21300AD88890A49C429A6CB9959CFD44490A8F6E",
+ )
+ assert (
+ settings_obj._settings["tor_bridges_use_custom_bridges"]
+ == "Bridge 45.3.20.65:9050 21300AD88890A49C429A6CB9959CFD44490A8F6E"
+ )
diff --git a/desktop/tests/test_cli_strings.py b/desktop/tests/test_cli_strings.py
new file mode 100644
index 00000000..8c90240f
--- /dev/null
+++ b/desktop/tests/test_cli_strings.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+import types
+
+import pytest
+
+from onionshare import strings
+from onionshare.settings import Settings
+
+# # Stub get_resource_path so it finds the correct path while running tests
+# def get_resource_path(filename):
+# resources_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'share')
+# path = os.path.join(resources_dir, filename)
+# return path
+# common.get_resource_path = get_resource_path
+
+
+def test_underscore_is_function():
+ assert callable(strings._) and isinstance(strings._, types.FunctionType)
+
+
+class TestLoadStrings:
+ def test_load_strings_defaults_to_english(
+ self, common_obj, locale_en, sys_onionshare_dev_mode
+ ):
+ """ load_strings() loads English by default """
+ common_obj.settings = Settings(common_obj)
+ strings.load_strings(common_obj)
+ assert strings._("not_a_readable_file") == "{0:s} is not a readable file."
+
+ def test_load_strings_loads_other_languages(
+ self, common_obj, locale_fr, sys_onionshare_dev_mode
+ ):
+ """ load_strings() loads other languages in different locales """
+ common_obj.settings = Settings(common_obj)
+ common_obj.settings.set("locale", "fr")
+ strings.load_strings(common_obj)
+ assert strings._("not_a_readable_file") == "{0:s} n’est pas un fichier lisible."
+
+ def test_load_invalid_locale(
+ self, common_obj, locale_invalid, sys_onionshare_dev_mode
+ ):
+ """ load_strings() raises a KeyError for an invalid locale """
+ with pytest.raises(KeyError):
+ common_obj.settings = Settings(common_obj)
+ common_obj.settings.set("locale", "XX")
+ strings.load_strings(common_obj)
diff --git a/desktop/tests/test_cli_web.py b/desktop/tests/test_cli_web.py
new file mode 100644
index 00000000..d2802bf3
--- /dev/null
+++ b/desktop/tests/test_cli_web.py
@@ -0,0 +1,233 @@
+import contextlib
+import inspect
+import io
+import os
+import random
+import re
+import socket
+import sys
+import zipfile
+import tempfile
+import base64
+
+import pytest
+from werkzeug.datastructures import Headers
+
+from onionshare.common import Common
+from onionshare import strings
+from onionshare.web import Web
+from onionshare.settings import Settings
+from onionshare.mode_settings import ModeSettings
+
+DEFAULT_ZW_FILENAME_REGEX = re.compile(r"^onionshare_[a-z2-7]{6}.zip$")
+RANDOM_STR_REGEX = re.compile(r"^[a-z2-7]+$")
+
+
+def web_obj(temp_dir, common_obj, mode, num_files=0):
+ """ Creates a Web object, in either share mode or receive mode, ready for testing """
+ common_obj.settings = Settings(common_obj)
+ strings.load_strings(common_obj)
+ mode_settings = ModeSettings(common_obj)
+ web = Web(common_obj, False, mode_settings, mode)
+ web.generate_password()
+ web.running = True
+
+ web.app.testing = True
+
+ # Share mode
+ if mode == "share":
+ # Add files
+ files = []
+ for _ in range(num_files):
+ with tempfile.NamedTemporaryFile(delete=False, dir=temp_dir) as tmp_file:
+ tmp_file.write(b"*" * 1024)
+ files.append(tmp_file.name)
+ web.share_mode.set_file_info(files)
+ # Receive mode
+ else:
+ pass
+
+ return web
+
+
+class TestWeb:
+ def test_share_mode(self, temp_dir, common_obj):
+ web = web_obj(temp_dir, common_obj, "share", 3)
+ assert web.mode == "share"
+ with web.app.test_client() as c:
+ # Load / without auth
+ res = c.get("/")
+ res.get_data()
+ assert res.status_code == 401
+
+ # Load / with invalid auth
+ res = c.get("/", headers=self._make_auth_headers("invalid"))
+ res.get_data()
+ assert res.status_code == 401
+
+ # Load / with valid auth
+ res = c.get("/", headers=self._make_auth_headers(web.password))
+ res.get_data()
+ assert res.status_code == 200
+
+ # Download
+ res = c.get("/download", headers=self._make_auth_headers(web.password))
+ res.get_data()
+ assert res.status_code == 200
+ assert (
+ res.mimetype == "application/zip"
+ or res.mimetype == "application/x-zip-compressed"
+ )
+
+ def test_share_mode_autostop_sharing_on(self, temp_dir, common_obj, temp_file_1024):
+ web = web_obj(temp_dir, common_obj, "share", 3)
+ web.settings.set("share", "autostop_sharing", True)
+
+ assert web.running == True
+
+ with web.app.test_client() as c:
+ # Download the first time
+ res = c.get("/download", headers=self._make_auth_headers(web.password))
+ res.get_data()
+ assert res.status_code == 200
+ assert (
+ res.mimetype == "application/zip"
+ or res.mimetype == "application/x-zip-compressed"
+ )
+
+ assert web.running == False
+
+ def test_share_mode_autostop_sharing_off(
+ self, temp_dir, common_obj, temp_file_1024
+ ):
+ web = web_obj(temp_dir, common_obj, "share", 3)
+ web.settings.set("share", "autostop_sharing", False)
+
+ assert web.running == True
+
+ with web.app.test_client() as c:
+ # Download the first time
+ res = c.get("/download", headers=self._make_auth_headers(web.password))
+ res.get_data()
+ assert res.status_code == 200
+ assert (
+ res.mimetype == "application/zip"
+ or res.mimetype == "application/x-zip-compressed"
+ )
+ assert web.running == True
+
+ def test_receive_mode(self, temp_dir, common_obj):
+ web = web_obj(temp_dir, common_obj, "receive")
+ assert web.mode == "receive"
+
+ with web.app.test_client() as c:
+ # Load / without auth
+ res = c.get("/")
+ res.get_data()
+ assert res.status_code == 401
+
+ # Load / with invalid auth
+ res = c.get("/", headers=self._make_auth_headers("invalid"))
+ res.get_data()
+ assert res.status_code == 401
+
+ # Load / with valid auth
+ res = c.get("/", headers=self._make_auth_headers(web.password))
+ res.get_data()
+ assert res.status_code == 200
+
+ def test_public_mode_on(self, temp_dir, common_obj):
+ web = web_obj(temp_dir, common_obj, "receive")
+ web.settings.set("general", "public", True)
+
+ with web.app.test_client() as c:
+ # Loading / should work without auth
+ res = c.get("/")
+ data1 = res.get_data()
+ assert res.status_code == 200
+
+ def test_public_mode_off(self, temp_dir, common_obj):
+ web = web_obj(temp_dir, common_obj, "receive")
+ web.settings.set("general", "public", False)
+
+ with web.app.test_client() as c:
+ # Load / without auth
+ res = c.get("/")
+ res.get_data()
+ assert res.status_code == 401
+
+ # But static resources should work without auth
+ res = c.get(f"{web.static_url_path}/css/style.css")
+ res.get_data()
+ assert res.status_code == 200
+
+ # Load / with valid auth
+ res = c.get("/", headers=self._make_auth_headers(web.password))
+ res.get_data()
+ assert res.status_code == 200
+
+ def _make_auth_headers(self, password):
+ auth = base64.b64encode(b"onionshare:" + password.encode()).decode()
+ h = Headers()
+ h.add("Authorization", "Basic " + auth)
+ return h
+
+
+class TestZipWriterDefault:
+ @pytest.mark.parametrize(
+ "test_input",
+ (
+ f"onionshare_{''.join(random.choice('abcdefghijklmnopqrstuvwxyz234567') for _ in range(6))}.zip"
+ for _ in range(50)
+ ),
+ )
+ def test_default_zw_filename_regex(self, test_input):
+ assert bool(DEFAULT_ZW_FILENAME_REGEX.match(test_input))
+
+ def test_zw_filename(self, default_zw):
+ zw_filename = os.path.basename(default_zw.zip_filename)
+ assert bool(DEFAULT_ZW_FILENAME_REGEX.match(zw_filename))
+
+ def test_zipfile_filename_matches_zipwriter_filename(self, default_zw):
+ assert default_zw.z.filename == default_zw.zip_filename
+
+ def test_zipfile_allow_zip64(self, default_zw):
+ assert default_zw.z._allowZip64 is True
+
+ def test_zipfile_mode(self, default_zw):
+ assert default_zw.z.mode == "w"
+
+ def test_callback(self, default_zw):
+ assert default_zw.processed_size_callback(None) is None
+
+ def test_add_file(self, default_zw, temp_file_1024_delete):
+ default_zw.add_file(temp_file_1024_delete)
+ zipfile_info = default_zw.z.getinfo(os.path.basename(temp_file_1024_delete))
+
+ assert zipfile_info.compress_type == zipfile.ZIP_DEFLATED
+ assert zipfile_info.file_size == 1024
+
+ def test_add_directory(self, temp_dir_1024_delete, default_zw):
+ previous_size = default_zw._size # size before adding directory
+ default_zw.add_dir(temp_dir_1024_delete)
+ assert default_zw._size == previous_size + 1024
+
+
+class TestZipWriterCustom:
+ @pytest.mark.parametrize(
+ "test_input",
+ (
+ Common.random_string(
+ random.randint(2, 50), random.choice((None, random.randint(2, 50)))
+ )
+ for _ in range(50)
+ ),
+ )
+ def test_random_string_regex(self, test_input):
+ assert bool(RANDOM_STR_REGEX.match(test_input))
+
+ def test_custom_filename(self, custom_zw):
+ assert bool(RANDOM_STR_REGEX.match(custom_zw.zip_filename))
+
+ def test_custom_callback(self, custom_zw):
+ assert custom_zw.processed_size_callback(None) == "custom_callback"
diff --git a/desktop/tests/test_gui_receive.py b/desktop/tests/test_gui_receive.py
new file mode 100644
index 00000000..d9501460
--- /dev/null
+++ b/desktop/tests/test_gui_receive.py
@@ -0,0 +1,252 @@
+import pytest
+import os
+import requests
+import shutil
+import sys
+from datetime import datetime, timedelta
+
+from PyQt5 import QtCore, QtTest
+
+from .gui_base_test import GuiBaseTest
+
+
+class TestReceive(GuiBaseTest):
+ # Shared test methods
+
+ def upload_file(
+ self, tab, file_to_upload, expected_basename, identical_files_at_once=False
+ ):
+ """Test that we can upload the file"""
+
+ # Wait 2 seconds to make sure the filename, based on timestamp, isn't accidentally reused
+ QtTest.QTest.qWait(2000)
+
+ files = {"file[]": open(file_to_upload, "rb")}
+ url = f"http://127.0.0.1:{tab.app.port}/upload"
+ if tab.settings.get("general", "public"):
+ requests.post(url, files=files)
+ if identical_files_at_once:
+ # Send a duplicate upload to test for collisions
+ requests.post(url, files=files)
+ else:
+ requests.post(
+ url,
+ files=files,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().web.password
+ ),
+ )
+ if identical_files_at_once:
+ # Send a duplicate upload to test for collisions
+ requests.post(
+ url,
+ files=files,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().web.password
+ ),
+ )
+
+ QtTest.QTest.qWait(1000)
+
+ # Make sure the file is within the last 10 seconds worth of fileames
+ exists = False
+ now = datetime.now()
+ for _ in range(10):
+ date_dir = now.strftime("%Y-%m-%d")
+ if identical_files_at_once:
+ time_dir = now.strftime("%H.%M.%S-1")
+ else:
+ time_dir = now.strftime("%H.%M.%S")
+ receive_mode_dir = os.path.join(
+ tab.settings.get("receive", "data_dir"), date_dir, time_dir
+ )
+ expected_filename = os.path.join(receive_mode_dir, expected_basename)
+ if os.path.exists(expected_filename):
+ exists = True
+ break
+ now = now - timedelta(seconds=1)
+
+ self.assertTrue(exists)
+
+ def upload_file_should_fail(self, tab):
+ """Test that we can't upload the file when permissions are wrong, and expected content is shown"""
+ QtTest.QTest.qWait(1000)
+
+ files = {"file[]": open(self.tmpfile_test, "rb")}
+ url = f"http://127.0.0.1:{tab.app.port}/upload"
+ if tab.settings.get("general", "public"):
+ r = requests.post(url, files=files)
+ else:
+ r = requests.post(
+ url,
+ files=files,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().web.password
+ ),
+ )
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ QtCore.QTimer.singleShot(1000, accept_dialog)
+ self.assertTrue("Error uploading, please inform the OnionShare user" in r.text)
+
+ def try_without_auth_in_non_public_mode(self, tab):
+ r = requests.post(f"http://127.0.0.1:{tab.app.port}/upload")
+ self.assertEqual(r.status_code, 401)
+ r = requests.get(f"http://127.0.0.1:{tab.app.port}/close")
+ self.assertEqual(r.status_code, 401)
+
+ # 'Grouped' tests follow from here
+
+ def run_all_receive_mode_setup_tests(self, tab):
+ """Set up a share in Receive mode and start it"""
+ self.history_is_not_visible(tab)
+ self.click_toggle_history(tab)
+ self.history_is_visible(tab)
+ self.server_working_on_start_button_pressed(tab)
+ self.server_status_indicator_says_starting(tab)
+ self.server_is_started(tab)
+ self.web_server_is_running(tab)
+ self.have_a_password(tab)
+ self.url_description_shown(tab)
+ self.have_copy_url_button(tab)
+ self.have_show_qr_code_button(tab)
+ self.server_status_indicator_says_started(tab)
+ self.web_page(tab, "Select the files you want to send, then click")
+
+ def run_all_receive_mode_tests(self, tab):
+ """Upload files in receive mode and stop the share"""
+ self.run_all_receive_mode_setup_tests(tab)
+ if not tab.settings.get("general", "public"):
+ self.try_without_auth_in_non_public_mode(tab)
+ self.upload_file(tab, self.tmpfile_test, "test.txt")
+ self.history_widgets_present(tab)
+ self.counter_incremented(tab, 1)
+ self.upload_file(tab, self.tmpfile_test, "test.txt")
+ self.counter_incremented(tab, 2)
+ self.upload_file(tab, self.tmpfile_test2, "test2.txt")
+ self.counter_incremented(tab, 3)
+ self.upload_file(tab, self.tmpfile_test2, "test2.txt")
+ self.counter_incremented(tab, 4)
+ # Test uploading the same file twice at the same time, and make sure no collisions
+ self.upload_file(tab, self.tmpfile_test, "test.txt", True)
+ self.counter_incremented(tab, 6)
+ self.history_indicator(tab, "2")
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+ self.server_status_indicator_says_closed(tab)
+ self.server_working_on_start_button_pressed(tab)
+ self.server_is_started(tab)
+ self.history_indicator(tab, "2")
+
+ def run_all_clear_all_button_tests(self, tab):
+ """Test the Clear All history button"""
+ self.run_all_receive_mode_setup_tests(tab)
+ self.upload_file(tab, self.tmpfile_test, "test.txt")
+ self.history_widgets_present(tab)
+ self.clear_all_history_items(tab, 0)
+ self.upload_file(tab, self.tmpfile_test, "test.txt")
+ self.clear_all_history_items(tab, 2)
+
+ def run_all_upload_non_writable_dir_tests(self, tab):
+ """Test uploading a file when the data_dir is non-writable"""
+ upload_dir = os.path.join(self.tmpdir.name, "OnionShare")
+ shutil.rmtree(upload_dir, ignore_errors=True)
+ os.makedirs(upload_dir, 0o700)
+
+ # Set the upload dir setting
+ tab.get_mode().data_dir_lineedit.setText(upload_dir)
+ tab.settings.set("receive", "data_dir", upload_dir)
+
+ self.run_all_receive_mode_setup_tests(tab)
+ os.chmod(upload_dir, 0o400)
+ self.upload_file_should_fail(tab)
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+ self.server_status_indicator_says_closed(tab)
+ os.chmod(upload_dir, 0o700)
+
+ # Tests
+
+ @pytest.mark.gui
+ def test_clear_all_button(self):
+ """
+ Clear all history items should work
+ """
+ tab = self.new_receive_tab()
+
+ self.run_all_common_setup_tests()
+ self.run_all_clear_all_button_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_autostop_timer(self):
+ """
+ Test autostop timer
+ """
+ tab = self.new_receive_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostop_timer_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_receive_mode_setup_tests(tab)
+ self.set_timeout(tab, 5)
+ self.autostop_timer_widget_hidden(tab)
+ self.server_timed_out(tab, 15000)
+ self.web_server_is_stopped(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_upload(self):
+ """
+ Test uploading files
+ """
+ tab = self.new_receive_tab()
+
+ self.run_all_common_setup_tests()
+ self.run_all_receive_mode_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ @pytest.mark.skipif(sys.platform == "win32", reason="Windows doesn't have chmod")
+ def test_upload_non_writable_dir(self):
+ """
+ Test uploading files to a non-writable directory
+ """
+ tab = self.new_receive_tab()
+
+ self.run_all_upload_non_writable_dir_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_public_upload(self):
+ """
+ Test uploading files in public mode
+ """
+ tab = self.new_receive_tab()
+ tab.get_mode().mode_settings_widget.public_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_receive_mode_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ @pytest.mark.skipif(sys.platform == "win32", reason="Windows doesn't have chmod")
+ def test_public_upload_non_writable_dir(self):
+ """
+ Test uploading files to a non-writable directory in public mode
+ """
+ tab = self.new_receive_tab()
+ tab.get_mode().mode_settings_widget.public_checkbox.click()
+
+ self.run_all_upload_non_writable_dir_tests(tab)
+
+ self.close_all_tabs()
diff --git a/desktop/tests/test_gui_share.py b/desktop/tests/test_gui_share.py
new file mode 100644
index 00000000..441fc03a
--- /dev/null
+++ b/desktop/tests/test_gui_share.py
@@ -0,0 +1,629 @@
+import pytest
+import os
+import requests
+import tempfile
+import zipfile
+
+from PyQt5 import QtCore, QtTest
+
+from .gui_base_test import GuiBaseTest
+
+
+class TestShare(GuiBaseTest):
+ # Shared test methods
+
+ def removing_all_files_hides_remove_button(self, tab):
+ """Test that clicking on the file item shows the remove button. Test that removing the only item in the list hides the remove button"""
+ rect = tab.get_mode().server_status.file_selection.file_list.visualItemRect(
+ tab.get_mode().server_status.file_selection.file_list.item(0)
+ )
+ QtTest.QTest.mouseClick(
+ tab.get_mode().server_status.file_selection.file_list.viewport(),
+ QtCore.Qt.LeftButton,
+ pos=rect.center(),
+ )
+ # Remove button should be visible
+ self.assertTrue(
+ tab.get_mode().server_status.file_selection.remove_button.isVisible()
+ )
+ # Click remove, remove button should still be visible since we have one more file
+ tab.get_mode().server_status.file_selection.remove_button.click()
+ rect = tab.get_mode().server_status.file_selection.file_list.visualItemRect(
+ tab.get_mode().server_status.file_selection.file_list.item(0)
+ )
+ QtTest.QTest.mouseClick(
+ tab.get_mode().server_status.file_selection.file_list.viewport(),
+ QtCore.Qt.LeftButton,
+ pos=rect.center(),
+ )
+ self.assertTrue(
+ tab.get_mode().server_status.file_selection.remove_button.isVisible()
+ )
+ tab.get_mode().server_status.file_selection.remove_button.click()
+
+ # No more files, the remove button should be hidden
+ self.assertFalse(
+ tab.get_mode().server_status.file_selection.remove_button.isVisible()
+ )
+
+ def add_a_file_and_remove_using_its_remove_widget(self, tab):
+ """Test that we can also remove a file by clicking on its [X] widget"""
+ num_files = tab.get_mode().server_status.file_selection.get_num_files()
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[0])
+ tab.get_mode().server_status.file_selection.file_list.item(
+ 0
+ ).item_button.click()
+ self.file_selection_widget_has_files(tab, num_files)
+
+ def add_a_file_and_remove_using_remove_all_widget(self, tab):
+ """Test that we can also remove all files by clicking on the Remove All widget"""
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[0])
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[1])
+ tab.get_mode().remove_all_button.click()
+ # Should be no files after clearing all
+ self.file_selection_widget_has_files(tab, 0)
+
+ def file_selection_widget_read_files(self, tab):
+ """Re-add some files to the list so we can share"""
+ num_files = tab.get_mode().server_status.file_selection.get_num_files()
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[0])
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[1])
+ self.file_selection_widget_has_files(tab, num_files + 2)
+
+ def download_share(self, tab):
+ """Test that we can download the share"""
+ url = f"http://127.0.0.1:{tab.app.port}/download"
+ if tab.settings.get("general", "public"):
+ r = requests.get(url)
+ else:
+ r = requests.get(
+ url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().server_status.web.password
+ ),
+ )
+
+ tmp_file = tempfile.NamedTemporaryFile("wb", delete=False)
+ tmp_file.write(r.content)
+ tmp_file.close()
+
+ z = zipfile.ZipFile(tmp_file.name)
+ QtTest.QTest.qWait(50)
+ self.assertEqual("onionshare", z.read("test.txt").decode("utf-8"))
+
+ QtTest.QTest.qWait(500)
+
+ def individual_file_is_viewable_or_not(self, tab):
+ """
+ Test that an individual file is viewable (when in autostop_sharing is false) or that it
+ isn't (when not in autostop_sharing is true)
+ """
+ url = f"http://127.0.0.1:{tab.app.port}"
+ download_file_url = f"http://127.0.0.1:{tab.app.port}/test.txt"
+ if tab.settings.get("general", "public"):
+ r = requests.get(url)
+ else:
+ r = requests.get(
+ url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().server_status.web.password
+ ),
+ )
+
+ if tab.settings.get("share", "autostop_sharing"):
+ self.assertFalse('a href="/test.txt"' in r.text)
+ if tab.settings.get("general", "public"):
+ r = requests.get(download_file_url)
+ else:
+ r = requests.get(
+ download_file_url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().server_status.web.password
+ ),
+ )
+ self.assertEqual(r.status_code, 404)
+ self.download_share(tab)
+ else:
+ self.assertTrue('a href="test.txt"' in r.text)
+ if tab.settings.get("general", "public"):
+ r = requests.get(download_file_url)
+ else:
+ r = requests.get(
+ download_file_url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().server_status.web.password
+ ),
+ )
+
+ tmp_file = tempfile.NamedTemporaryFile("wb", delete=False)
+ tmp_file.write(r.content)
+ tmp_file.close()
+
+ with open(tmp_file.name, "r") as f:
+ self.assertEqual("onionshare", f.read())
+ os.remove(tmp_file.name)
+
+ QtTest.QTest.qWait(500)
+
+ def hit_401(self, tab):
+ """Test that the server stops after too many 401s, or doesn't when in public mode"""
+ # In non-public mode, get ready to accept the dialog
+ if not tab.settings.get("general", "public"):
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ QtCore.QTimer.singleShot(1000, accept_dialog)
+
+ # Make 20 requests with guessed passwords
+ url = f"http://127.0.0.1:{tab.app.port}/"
+ for _ in range(20):
+ password_guess = self.gui.common.build_password()
+ requests.get(
+ url, auth=requests.auth.HTTPBasicAuth("onionshare", password_guess)
+ )
+
+ # In public mode, we should still be running (no rate-limiting)
+ if tab.settings.get("general", "public"):
+ self.web_server_is_running(tab)
+
+ # In non-public mode, we should be shut down (rate-limiting)
+ else:
+ self.web_server_is_stopped(tab)
+
+ def set_autostart_timer(self, tab, timer):
+ """Test that the timer can be set"""
+ schedule = QtCore.QDateTime.currentDateTime().addSecs(timer)
+ tab.get_mode().mode_settings_widget.autostart_timer_widget.setDateTime(schedule)
+ self.assertTrue(
+ tab.get_mode().mode_settings_widget.autostart_timer_widget.dateTime(),
+ schedule,
+ )
+
+ def autostart_timer_widget_hidden(self, tab):
+ """Test that the auto-start timer widget is hidden when share has started"""
+ self.assertFalse(
+ tab.get_mode().mode_settings_widget.autostart_timer_widget.isVisible()
+ )
+
+ def scheduled_service_started(self, tab, wait):
+ """Test that the server has timed out after the timer ran out"""
+ QtTest.QTest.qWait(wait)
+ # We should have started now
+ self.assertEqual(tab.get_mode().server_status.status, 2)
+
+ def cancel_the_share(self, tab):
+ """Test that we can cancel a share before it's started up """
+ self.server_working_on_start_button_pressed(tab)
+ self.server_status_indicator_says_scheduled(tab)
+ self.add_remove_buttons_hidden(tab)
+ self.mode_settings_widget_is_hidden(tab)
+ self.set_autostart_timer(tab, 10)
+ QtTest.QTest.qWait(500)
+ QtTest.QTest.mousePress(
+ tab.get_mode().server_status.server_button, QtCore.Qt.LeftButton
+ )
+ QtTest.QTest.qWait(100)
+ QtTest.QTest.mouseRelease(
+ tab.get_mode().server_status.server_button, QtCore.Qt.LeftButton
+ )
+ QtTest.QTest.qWait(500)
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_STOPPED,
+ )
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+
+ # Grouped tests follow from here
+
+ def run_all_share_mode_setup_tests(self, tab):
+ """Tests in share mode prior to starting a share"""
+ tab.get_mode().server_status.file_selection.file_list.add_file(
+ self.tmpfile_test
+ )
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[0])
+ tab.get_mode().server_status.file_selection.file_list.add_file(self.tmpfiles[1])
+ self.file_selection_widget_has_files(tab, 3)
+ self.history_is_not_visible(tab)
+ self.click_toggle_history(tab)
+ self.history_is_visible(tab)
+ self.removing_all_files_hides_remove_button(tab)
+ self.add_a_file_and_remove_using_its_remove_widget(tab)
+ self.file_selection_widget_read_files(tab)
+
+ def run_all_share_mode_started_tests(self, tab, startup_time=2000):
+ """Tests in share mode after starting a share"""
+ self.server_working_on_start_button_pressed(tab)
+ self.server_status_indicator_says_starting(tab)
+ self.add_remove_buttons_hidden(tab)
+ self.mode_settings_widget_is_hidden(tab)
+ self.server_is_started(tab, startup_time)
+ self.web_server_is_running(tab)
+ self.have_a_password(tab)
+ self.url_description_shown(tab)
+ self.have_copy_url_button(tab)
+ self.have_show_qr_code_button(tab)
+ self.server_status_indicator_says_started(tab)
+
+ def run_all_share_mode_download_tests(self, tab):
+ """Tests in share mode after downloading a share"""
+ tab.get_mode().server_status.file_selection.file_list.add_file(
+ self.tmpfile_test
+ )
+ self.web_page(tab, "Total size")
+ self.download_share(tab)
+ self.history_widgets_present(tab)
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+ self.server_status_indicator_says_closed(tab)
+ self.add_button_visible(tab)
+ self.server_working_on_start_button_pressed(tab)
+ self.toggle_indicator_is_reset(tab)
+ self.server_is_started(tab)
+ self.history_indicator(tab)
+
+ def run_all_share_mode_individual_file_download_tests(self, tab):
+ """Tests in share mode after downloading a share"""
+ self.web_page(tab, "Total size")
+ self.individual_file_is_viewable_or_not(tab)
+ self.history_widgets_present(tab)
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+ self.server_status_indicator_says_closed(tab)
+ self.add_button_visible(tab)
+ self.server_working_on_start_button_pressed(tab)
+ self.server_is_started(tab)
+ self.history_indicator(tab)
+
+ def run_all_share_mode_tests(self, tab):
+ """End-to-end share tests"""
+ self.run_all_share_mode_setup_tests(tab)
+ self.run_all_share_mode_started_tests(tab)
+ self.run_all_share_mode_download_tests(tab)
+
+ def run_all_clear_all_history_button_tests(self, tab):
+ """Test the Clear All history button"""
+ self.run_all_share_mode_setup_tests(tab)
+ self.run_all_share_mode_started_tests(tab)
+ self.individual_file_is_viewable_or_not(tab)
+ self.history_widgets_present(tab)
+ self.clear_all_history_items(tab, 0)
+ self.individual_file_is_viewable_or_not(tab)
+ self.clear_all_history_items(tab, 2)
+
+ def run_all_remove_all_file_selection_button_tests(self, tab):
+ """Test the Remove All File Selection button"""
+ self.run_all_share_mode_setup_tests(tab)
+ self.add_a_file_and_remove_using_remove_all_widget(tab)
+
+ def run_all_share_mode_individual_file_tests(self, tab):
+ """Tests in share mode when viewing an individual file"""
+ self.run_all_share_mode_setup_tests(tab)
+ self.run_all_share_mode_started_tests(tab)
+ self.run_all_share_mode_individual_file_download_tests(tab)
+
+ # Tests
+
+ @pytest.mark.gui
+ def test_autostart_and_autostop_timer_mismatch(self):
+ """
+ If autostart timer is after autostop timer, a warning should be thrown
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostart_timer_checkbox.click()
+ tab.get_mode().mode_settings_widget.autostop_timer_checkbox.click()
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ self.set_autostart_timer(tab, 15)
+ self.set_timeout(tab, 5)
+ QtCore.QTimer.singleShot(200, accept_dialog)
+ tab.get_mode().server_status.server_button.click()
+ self.server_is_stopped(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_autostart_timer(self):
+ """
+ Autostart timer should automatically start
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostart_timer_checkbox.click()
+
+ self.run_all_common_setup_tests()
+
+ self.run_all_share_mode_setup_tests(tab)
+ self.set_autostart_timer(tab, 2)
+ self.server_working_on_start_button_pressed(tab)
+ self.autostart_timer_widget_hidden(tab)
+ self.server_status_indicator_says_scheduled(tab)
+ self.web_server_is_stopped(tab)
+ self.scheduled_service_started(tab, 2200)
+ self.web_server_is_running(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_autostart_timer_too_short(self):
+ """
+ Autostart timer should throw a warning if the scheduled time is too soon
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostart_timer_checkbox.click()
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ # Set a low timeout
+ self.set_autostart_timer(tab, 2)
+ QtTest.QTest.qWait(2200)
+ QtCore.QTimer.singleShot(200, accept_dialog)
+ tab.get_mode().server_status.server_button.click()
+ self.assertEqual(tab.get_mode().server_status.status, 0)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_autostart_timer_cancel(self):
+ """
+ Test canceling a scheduled share
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostart_timer_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ self.cancel_the_share(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_clear_all_history_button(self):
+ """
+ Test clearing all history items
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().autostop_sharing_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_clear_all_history_button_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_remove_all_file_selection_button(self):
+ """
+ Test remove all file items at once
+ """
+ tab = self.new_share_tab()
+
+ self.run_all_common_setup_tests()
+ self.run_all_remove_all_file_selection_button_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_public_mode(self):
+ """
+ Public mode shouldn't have a password
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.public_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_without_autostop_sharing(self):
+ """
+ Disable autostop sharing after first download
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().autostop_sharing_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_download(self):
+ """
+ Test downloading in share mode
+ """
+ tab = self.new_share_tab()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_individual_files_without_autostop_sharing(self):
+ """
+ Test downloading individual files with autostop sharing disabled
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().autostop_sharing_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_individual_file_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_individual_files(self):
+ """
+ Test downloading individual files
+ """
+ tab = self.new_share_tab()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_individual_file_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_large_download(self):
+ """
+ Test a large download
+ """
+ tab = self.new_share_tab()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ tab.get_mode().server_status.file_selection.file_list.add_file(
+ self.tmpfile_large
+ )
+ self.run_all_share_mode_started_tests(tab, startup_time=15000)
+ self.assertTrue(tab.get_mode().filesize_warning.isVisible())
+ self.download_share(tab)
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+ self.server_status_indicator_says_closed(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_persistent_password(self):
+ """
+ Test a large download
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.persistent_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ self.run_all_share_mode_started_tests(tab)
+ password = tab.get_mode().server_status.web.password
+ self.run_all_share_mode_download_tests(tab)
+ self.run_all_share_mode_started_tests(tab)
+ self.assertEqual(tab.get_mode().server_status.web.password, password)
+ self.run_all_share_mode_download_tests(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_autostop_timer(self):
+ """
+ Test the autostop timer
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostop_timer_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ self.set_timeout(tab, 5)
+ self.run_all_share_mode_started_tests(tab)
+ self.autostop_timer_widget_hidden(tab)
+ self.server_timed_out(tab, 10000)
+ self.web_server_is_stopped(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_autostop_timer_too_short(self):
+ """
+ Test the autostop timer when the timeout is too short
+ """
+ tab = self.new_share_tab()
+ tab.get_mode().mode_settings_widget.toggle_advanced_button.click()
+ tab.get_mode().mode_settings_widget.autostop_timer_checkbox.click()
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests(tab)
+ # Set a low timeout
+ self.set_timeout(tab, 2)
+ QtTest.QTest.qWait(2100)
+ QtCore.QTimer.singleShot(2200, accept_dialog)
+ tab.get_mode().server_status.server_button.click()
+ self.assertEqual(tab.get_mode().server_status.status, 0)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_unreadable_file(self):
+ """
+ Sharing an unreadable file should throw a warning
+ """
+ tab = self.new_share_tab()
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ self.run_all_share_mode_setup_tests(tab)
+ QtCore.QTimer.singleShot(200, accept_dialog)
+ tab.get_mode().server_status.file_selection.file_list.add_file(
+ "/tmp/nonexistent.txt"
+ )
+ self.file_selection_widget_has_files(tab, 3)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_401_triggers_ratelimit(self):
+ """
+ Rate limit should be triggered
+ """
+ tab = self.new_share_tab()
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ tab.get_mode().autostop_sharing_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_tests(tab)
+ self.hit_401(tab)
+
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_401_public_skips_ratelimit(self):
+ """
+ Public mode should skip the rate limit
+ """
+ tab = self.new_share_tab()
+
+ def accept_dialog():
+ window = tab.common.gui.qtapp.activeWindow()
+ if window:
+ window.close()
+
+ tab.get_mode().autostop_sharing_checkbox.click()
+ tab.get_mode().mode_settings_widget.public_checkbox.click()
+
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_tests(tab)
+ self.hit_401(tab)
+
+ self.close_all_tabs()
diff --git a/desktop/tests/test_gui_tabs.py b/desktop/tests/test_gui_tabs.py
new file mode 100644
index 00000000..a2473441
--- /dev/null
+++ b/desktop/tests/test_gui_tabs.py
@@ -0,0 +1,236 @@
+import pytest
+import os
+
+from PyQt5 import QtCore, QtTest, QtWidgets
+
+from .gui_base_test import GuiBaseTest
+
+
+class TestTabs(GuiBaseTest):
+ # Shared test methods
+
+ def close_tab_with_active_server(self, tab):
+ # Start the server
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_STOPPED,
+ )
+ tab.get_mode().server_status.server_button.click()
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_WORKING,
+ )
+ QtTest.QTest.qWait(1000)
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_STARTED,
+ )
+
+ # Prepare to reject the dialog
+ QtCore.QTimer.singleShot(0, tab.close_dialog.reject_button.click)
+
+ # Close tab
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ # The tab should still be open
+ self.assertFalse(tab.new_tab.isVisible())
+ self.assertTrue(tab.get_mode().isVisible())
+
+ # Prepare to accept the dialog
+ QtCore.QTimer.singleShot(0, tab.close_dialog.accept_button.click)
+
+ # Close tab
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ # The tab should be closed
+ self.assertTrue(self.gui.tabs.widget(0).new_tab.isVisible())
+
+ def close_persistent_tab(self, tab):
+ # There shouldn't be a persistent settings file
+ self.assertFalse(os.path.exists(tab.settings.filename))
+
+ # Click the persistent checkbox
+ tab.get_mode().server_status.mode_settings_widget.persistent_checkbox.click()
+ QtTest.QTest.qWait(100)
+
+ # There should be a persistent settings file now
+ self.assertTrue(os.path.exists(tab.settings.filename))
+
+ # Prepare to reject the dialog
+ QtCore.QTimer.singleShot(0, tab.close_dialog.reject_button.click)
+
+ # Close tab
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ # The tab should still be open
+ self.assertFalse(tab.new_tab.isVisible())
+ self.assertTrue(tab.get_mode().isVisible())
+
+ # There should be a persistent settings file still
+ self.assertTrue(os.path.exists(tab.settings.filename))
+
+ # Prepare to accept the dialog
+ QtCore.QTimer.singleShot(0, tab.close_dialog.accept_button.click)
+
+ # Close tab
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ # The tab should be closed
+ self.assertTrue(self.gui.tabs.widget(0).new_tab.isVisible())
+
+ # The persistent settings file should be deleted
+ self.assertFalse(os.path.exists(tab.settings.filename))
+
+ # Tests
+
+ @pytest.mark.gui
+ def test_01_common_tests(self):
+ """Run all common tests"""
+ self.run_all_common_setup_tests()
+
+ @pytest.mark.gui
+ def test_02_starts_with_one_new_tab(self):
+ """There should be one "New Tab" tab open"""
+ self.assertEqual(self.gui.tabs.count(), 1)
+ self.assertTrue(self.gui.tabs.widget(0).new_tab.isVisible())
+
+ @pytest.mark.gui
+ def test_03_new_tab_button_opens_new_tabs(self):
+ """Clicking the "+" button should open new tabs"""
+ self.assertEqual(self.gui.tabs.count(), 1)
+ self.gui.tabs.new_tab_button.click()
+ self.gui.tabs.new_tab_button.click()
+ self.gui.tabs.new_tab_button.click()
+ self.assertEqual(self.gui.tabs.count(), 4)
+
+ @pytest.mark.gui
+ def test_04_close_tab_button_closes_tabs(self):
+ """Clicking the "x" button should close tabs"""
+ self.assertEqual(self.gui.tabs.count(), 4)
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+ self.assertEqual(self.gui.tabs.count(), 1)
+
+ @pytest.mark.gui
+ def test_05_closing_last_tab_opens_new_one(self):
+ """Closing the last tab should open a new tab"""
+ self.assertEqual(self.gui.tabs.count(), 1)
+
+ # Click share button
+ self.gui.tabs.widget(0).share_button.click()
+ self.assertFalse(self.gui.tabs.widget(0).new_tab.isVisible())
+ self.assertTrue(self.gui.tabs.widget(0).share_mode.isVisible())
+
+ # Close the tab
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ # A new tab should be opened
+ self.assertEqual(self.gui.tabs.count(), 1)
+ self.assertTrue(self.gui.tabs.widget(0).new_tab.isVisible())
+
+ @pytest.mark.gui
+ def test_06_new_tab_mode_buttons_show_correct_modes(self):
+ """Clicking the mode buttons in a new tab should change the mode of the tab"""
+
+ # New tab, share files
+ self.gui.tabs.new_tab_button.click()
+ self.gui.tabs.widget(1).share_button.click()
+ self.assertFalse(self.gui.tabs.widget(1).new_tab.isVisible())
+ self.assertTrue(self.gui.tabs.widget(1).share_mode.isVisible())
+ self.assertEqual(
+ self.gui.status_bar.server_status_label.text(), "Ready to share"
+ )
+
+ # New tab, receive files
+ self.gui.tabs.new_tab_button.click()
+ self.gui.tabs.widget(2).receive_button.click()
+ self.assertFalse(self.gui.tabs.widget(2).new_tab.isVisible())
+ self.assertTrue(self.gui.tabs.widget(2).receive_mode.isVisible())
+ self.assertEqual(
+ self.gui.status_bar.server_status_label.text(), "Ready to receive"
+ )
+
+ # New tab, publish website
+ self.gui.tabs.new_tab_button.click()
+ self.gui.tabs.widget(3).website_button.click()
+ self.assertFalse(self.gui.tabs.widget(3).new_tab.isVisible())
+ self.assertTrue(self.gui.tabs.widget(3).website_mode.isVisible())
+ self.assertEqual(
+ self.gui.status_bar.server_status_label.text(), "Ready to share"
+ )
+
+ # Close tabs
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+ self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click()
+
+ @pytest.mark.gui
+ def test_07_close_share_tab_while_server_started_should_warn(self):
+ """Closing a share mode tab when the server is running should throw a warning"""
+ tab = self.new_share_tab_with_files()
+ self.close_tab_with_active_server(tab)
+
+ @pytest.mark.gui
+ def test_08_close_receive_tab_while_server_started_should_warn(self):
+ """Closing a recieve mode tab when the server is running should throw a warning"""
+ tab = self.new_receive_tab()
+ self.close_tab_with_active_server(tab)
+
+ @pytest.mark.gui
+ def test_09_close_website_tab_while_server_started_should_warn(self):
+ """Closing a website mode tab when the server is running should throw a warning"""
+ tab = self.new_website_tab_with_files()
+ self.close_tab_with_active_server(tab)
+
+ @pytest.mark.gui
+ def test_10_close_persistent_share_tab_shows_warning(self):
+ """Closing a share mode tab that's persistent should show a warning"""
+ tab = self.new_share_tab_with_files()
+ self.close_persistent_tab(tab)
+
+ @pytest.mark.gui
+ def test_11_close_persistent_receive_tab_shows_warning(self):
+ """Closing a receive mode tab that's persistent should show a warning"""
+ tab = self.new_receive_tab()
+ self.close_persistent_tab(tab)
+
+ @pytest.mark.gui
+ def test_12_close_persistent_website_tab_shows_warning(self):
+ """Closing a website mode tab that's persistent should show a warning"""
+ tab = self.new_website_tab_with_files()
+ self.close_persistent_tab(tab)
+
+ @pytest.mark.gui
+ def test_13_quit_with_server_started_should_warn(self):
+ """Quitting OnionShare with any active servers should show a warning"""
+ tab = self.new_share_tab()
+
+ # Start the server
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_STOPPED,
+ )
+ tab.get_mode().server_status.server_button.click()
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_WORKING,
+ )
+ QtTest.QTest.qWait(500)
+ self.assertEqual(
+ tab.get_mode().server_status.status,
+ tab.get_mode().server_status.STATUS_STARTED,
+ )
+
+ # Prepare to reject the dialog
+ QtCore.QTimer.singleShot(0, self.gui.close_dialog.reject_button.click)
+
+ # Close the window
+ self.gui.close()
+
+ # The window should still be open
+ self.assertTrue(self.gui.isVisible())
+
+ # Stop the server
+ tab.get_mode().server_status.server_button.click()
diff --git a/desktop/tests/test_gui_website.py b/desktop/tests/test_gui_website.py
new file mode 100644
index 00000000..80c74dea
--- /dev/null
+++ b/desktop/tests/test_gui_website.py
@@ -0,0 +1,107 @@
+import pytest
+import os
+import requests
+import shutil
+from datetime import datetime, timedelta
+
+from PyQt5 import QtCore, QtTest
+
+from .gui_base_test import GuiBaseTest
+
+
+class TestWebsite(GuiBaseTest):
+ # Shared test methods
+
+ def view_website(self, tab):
+ """Test that we can download the share"""
+ url = f"http://127.0.0.1:{tab.app.port}/"
+ if tab.settings.get("general", "public"):
+ r = requests.get(url)
+ else:
+ r = requests.get(
+ url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().server_status.web.password
+ ),
+ )
+
+ QtTest.QTest.qWait(500)
+ self.assertTrue("This is a test website hosted by OnionShare" in r.text)
+
+ def check_csp_header(self, tab):
+ """Test that the CSP header is present when enabled or vice versa"""
+ url = f"http://127.0.0.1:{tab.app.port}/"
+ if tab.settings.get("general", "public"):
+ r = requests.get(url)
+ else:
+ r = requests.get(
+ url,
+ auth=requests.auth.HTTPBasicAuth(
+ "onionshare", tab.get_mode().server_status.web.password
+ ),
+ )
+
+ QtTest.QTest.qWait(500)
+ if tab.settings.get("website", "disable_csp"):
+ self.assertFalse("Content-Security-Policy" in r.headers)
+ else:
+ self.assertTrue("Content-Security-Policy" in r.headers)
+
+ def run_all_website_mode_setup_tests(self, tab):
+ """Tests in website mode prior to starting a share"""
+ tab.get_mode().server_status.file_selection.file_list.add_file(
+ self.tmpfile_index_html
+ )
+ for filename in self.tmpfiles:
+ tab.get_mode().server_status.file_selection.file_list.add_file(filename)
+
+ self.file_selection_widget_has_files(tab, 11)
+ self.history_is_not_visible(tab)
+ self.click_toggle_history(tab)
+ self.history_is_visible(tab)
+
+ def run_all_website_mode_started_tests(self, tab, startup_time=500):
+ """Tests in website mode after starting a share"""
+ self.server_working_on_start_button_pressed(tab)
+ self.server_status_indicator_says_starting(tab)
+ self.add_remove_buttons_hidden(tab)
+ self.server_is_started(tab, startup_time)
+ self.web_server_is_running(tab)
+ self.have_a_password(tab)
+ self.url_description_shown(tab)
+ self.have_copy_url_button(tab)
+ self.have_show_qr_code_button(tab)
+ self.server_status_indicator_says_started(tab)
+
+ def run_all_website_mode_download_tests(self, tab):
+ """Tests in website mode after viewing the site"""
+ self.run_all_website_mode_setup_tests(tab)
+ self.run_all_website_mode_started_tests(tab, startup_time=500)
+ self.view_website(tab)
+ self.check_csp_header(tab)
+ self.history_widgets_present(tab)
+ self.server_is_stopped(tab)
+ self.web_server_is_stopped(tab)
+ self.server_status_indicator_says_closed(tab)
+ self.add_button_visible(tab)
+
+ # Tests
+
+ @pytest.mark.gui
+ def test_website(self):
+ """
+ Test website mode
+ """
+ tab = self.new_website_tab()
+ self.run_all_website_mode_download_tests(tab)
+ self.close_all_tabs()
+
+ @pytest.mark.gui
+ def test_csp_enabled(self):
+ """
+ Test disabling CSP
+ """
+ tab = self.new_website_tab()
+ tab.get_mode().disable_csp_checkbox.click()
+ self.run_all_website_mode_download_tests(tab)
+ self.close_all_tabs()