aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar vantezzen <hello@vantezzen.io>2020-06-19 18:51:02 +0200
committerLibravatar vantezzen <hello@vantezzen.io>2020-06-19 18:51:02 +0200
commitcb312b7523d1b4d6f440a2f6b4443a86691f68f9 (patch)
treef0165c5599d61f2ba72c97c26ec02fca9211a6a7
parentUpdate submodules (diff)
parentPrepare and Release/5.6.0 beta.1 (#820) (diff)
downloadferdium-app-cb312b7523d1b4d6f440a2f6b4443a86691f68f9.tar.gz
ferdium-app-cb312b7523d1b4d6f440a2f6b4443a86691f68f9.tar.zst
ferdium-app-cb312b7523d1b4d6f440a2f6b4443a86691f68f9.zip
Merge branch 'develop'
-rw-r--r--.all-contributorsrc88
-rw-r--r--.github/FEATURE_PROPOSAL_TEMPLATE.md14
-rw-r--r--.github/ISSUE_TEMPLATE.md36
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md34
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md3
-rw-r--r--.github/ISSUE_TEMPLATE/open_issue.md8
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md32
-rw-r--r--.github/issue_label_bot.yaml2
-rw-r--r--.travis.yml15
-rw-r--r--CHANGELOG.md28
-rw-r--r--README.md171
-rw-r--r--SECURITY.md17
-rw-r--r--appveyor.yml11
-rw-r--r--build-helpers/notarize.js2
-rw-r--r--package-lock.json149
-rw-r--r--package.json6
-rw-r--r--src/app.js69
-rw-r--r--src/components/auth/ChangeServer.js66
-rw-r--r--src/components/auth/Locked.js3
-rw-r--r--src/components/layout/Sidebar.js7
-rw-r--r--src/components/services/content/ServiceWebview.js2
-rw-r--r--src/components/services/tabs/TabItem.js12
-rw-r--r--src/components/settings/settings/EditSettingsForm.js2
-rw-r--r--src/config.js1
-rw-r--r--src/containers/auth/LockedScreen.js30
-rw-r--r--src/containers/settings/EditSettingsScreen.js18
-rw-r--r--src/features/todos/components/TodosWebview.js23
-rw-r--r--src/helpers/userAgent-helpers.js16
-rw-r--r--src/i18n/locales/af.json3
-rw-r--r--src/i18n/locales/ar.json429
-rw-r--r--src/i18n/locales/bs.json3
-rw-r--r--src/i18n/locales/ca.json149
-rw-r--r--src/i18n/locales/cs.json3
-rw-r--r--src/i18n/locales/da.json3
-rw-r--r--src/i18n/locales/de.json3
-rw-r--r--src/i18n/locales/defaultMessages.json239
-rw-r--r--src/i18n/locales/el.json21
-rw-r--r--src/i18n/locales/en-US.json3
-rw-r--r--src/i18n/locales/es.json67
-rw-r--r--src/i18n/locales/fi.json3
-rw-r--r--src/i18n/locales/fr.json5
-rw-r--r--src/i18n/locales/ga.json3
-rw-r--r--src/i18n/locales/he.json3
-rw-r--r--src/i18n/locales/hr.json3
-rw-r--r--src/i18n/locales/hu.json41
-rw-r--r--src/i18n/locales/id.json3
-rw-r--r--src/i18n/locales/it.json17
-rw-r--r--src/i18n/locales/ja.json3
-rw-r--r--src/i18n/locales/ka.json3
-rw-r--r--src/i18n/locales/ko.json3
-rw-r--r--src/i18n/locales/nl-BE.json3
-rw-r--r--src/i18n/locales/nl.json3
-rw-r--r--src/i18n/locales/no.json3
-rw-r--r--src/i18n/locales/pl.json3
-rw-r--r--src/i18n/locales/pt-BR.json7
-rw-r--r--src/i18n/locales/pt.json3
-rw-r--r--src/i18n/locales/ro.json3
-rw-r--r--src/i18n/locales/ru.json3
-rw-r--r--src/i18n/locales/sk.json3
-rw-r--r--src/i18n/locales/sl.json3
-rw-r--r--src/i18n/locales/sr.json3
-rw-r--r--src/i18n/locales/sv.json3
-rw-r--r--src/i18n/locales/tr.json3
-rw-r--r--src/i18n/locales/uk.json3
-rw-r--r--src/i18n/locales/vi.json3
-rw-r--r--src/i18n/locales/zh-HANT.json3
-rw-r--r--src/i18n/locales/zh.json3
-rw-r--r--src/i18n/messages/src/components/auth/ChangeServer.json51
-rw-r--r--src/i18n/messages/src/components/layout/Sidebar.json36
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json152
-rw-r--r--src/index.js31
-rw-r--r--src/lib/DBus.js49
-rw-r--r--src/lib/Menu.js2
-rw-r--r--src/lib/Tray.js69
-rw-r--r--src/models/Service.js21
-rw-r--r--src/routes.js100
-rw-r--r--src/stores/AppStore.js5
-rw-r--r--src/stores/ServicesStore.js3
-rw-r--r--src/stores/SettingsStore.js43
79 files changed, 1576 insertions, 916 deletions
diff --git a/.all-contributorsrc b/.all-contributorsrc
index e5ae29a91..0c891c555 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -463,7 +463,8 @@
463 "avatar_url": "https://avatars2.githubusercontent.com/u/46404814?v=4", 463 "avatar_url": "https://avatars2.githubusercontent.com/u/46404814?v=4",
464 "profile": "https://github.com/yourcontact", 464 "profile": "https://github.com/yourcontact",
465 "contributions": [ 465 "contributions": [
466 "code" 466 "code",
467 "ideas"
467 ] 468 ]
468 }, 469 },
469 { 470 {
@@ -474,7 +475,10 @@
474 "contributions": [ 475 "contributions": [
475 "code", 476 "code",
476 "ideas", 477 "ideas",
477 "review" 478 "review",
479 "bug",
480 "doc",
481 "userTesting"
478 ] 482 ]
479 }, 483 },
480 { 484 {
@@ -493,7 +497,11 @@
493 "profile": "https://github.com/sampathBlam", 497 "profile": "https://github.com/sampathBlam",
494 "contributions": [ 498 "contributions": [
495 "code", 499 "code",
496 "review" 500 "review",
501 "ideas",
502 "bug",
503 "doc",
504 "userTesting"
497 ] 505 ]
498 }, 506 },
499 { 507 {
@@ -667,6 +675,80 @@
667 "contributions": [ 675 "contributions": [
668 "translation" 676 "translation"
669 ] 677 ]
678 },
679 {
680 "login": "gega7",
681 "name": "gega7",
682 "avatar_url": "https://avatars0.githubusercontent.com/u/20799911?v=4",
683 "profile": "https://github.com/gega7",
684 "contributions": [
685 "bug"
686 ]
687 },
688 {
689 "login": "tristanplouz",
690 "name": "tristanplouz",
691 "avatar_url": "https://avatars2.githubusercontent.com/u/6893466?v=4",
692 "profile": "https://github.com/tristanplouz",
693 "contributions": [
694 "code",
695 "ideas"
696 ]
697 },
698 {
699 "login": "dannyqiu",
700 "name": "Danny Qiu",
701 "avatar_url": "https://avatars1.githubusercontent.com/u/1170755?v=4",
702 "profile": "https://github.com/dannyqiu",
703 "contributions": [
704 "code",
705 "bug"
706 ]
707 },
708 {
709 "login": "belyazidi56",
710 "name": "Youssef Belyazidi",
711 "avatar_url": "https://avatars3.githubusercontent.com/u/35711540?v=4",
712 "profile": "https://github.com/belyazidi56",
713 "contributions": [
714 "code"
715 ]
716 },
717 {
718 "login": "gabspeck",
719 "name": "Gabriel Speckhahn",
720 "avatar_url": "https://avatars2.githubusercontent.com/u/749488?v=4",
721 "profile": "https://github.com/gabspeck",
722 "contributions": [
723 "platform"
724 ]
725 },
726 {
727 "login": "dandelionadia",
728 "name": "Nadiia Ridko",
729 "avatar_url": "https://avatars0.githubusercontent.com/u/33199975?v=4",
730 "profile": "https://github.com/dandelionadia",
731 "contributions": [
732 "code"
733 ]
734 },
735 {
736 "login": "janhohner",
737 "name": "Jan Hohner",
738 "avatar_url": "https://avatars0.githubusercontent.com/u/649895?v=4",
739 "profile": "https://hohner.dev",
740 "contributions": [
741 "userTesting"
742 ]
743 },
744 {
745 "login": "kris7t",
746 "name": "Kristóf Marussy",
747 "avatar_url": "https://avatars1.githubusercontent.com/u/38888?v=4",
748 "profile": "https://marussy.com",
749 "contributions": [
750 "code"
751 ]
670 } 752 }
671 ], 753 ],
672 "contributorsPerLine": 6, 754 "contributorsPerLine": 6,
diff --git a/.github/FEATURE_PROPOSAL_TEMPLATE.md b/.github/FEATURE_PROPOSAL_TEMPLATE.md
deleted file mode 100644
index e8cdd41ed..000000000
--- a/.github/FEATURE_PROPOSAL_TEMPLATE.md
+++ /dev/null
@@ -1,14 +0,0 @@
1<!--- Provide a general summary of your changes in the Title above -->
2
3### Feature Description
4<!--- Describe your feature in detail -->
5
6### Motivation and Context
7<!---
8* Why is this change required?
9* How is this improving the Ferdi experience?
10* What problem does it solve?
11-->
12
13### Mockups, Screenshots (if available):
14<!--- A picture says more than a thousand words. -->
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index c0ce853ae..000000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,36 +0,0 @@
1<!--- Provide a general summary of the issue in the Title above -->
2
3<!-- This repository is only for the Ferdi client. Please use this form ( https://bitly.com/franz-service-request ) for service requests or check out the guide ( https://github.com/meetfranz/plugins ) to create your own service integration. -->
4
5<!--- If you want to propose a feature, use this template: https://raw.githubusercontent.com/meetfranz/franz/master/.github/FEATURE_PROPOSAL_TEMPLATE.md -->
6
7### Expected Behavior
8<!--- If you're describing a bug, tell us what should happen -->
9<!--- If you're suggesting a change/improvement, tell us how it should work -->
10
11### Current Behavior
12<!--- If describing a bug, tell us what happens instead of the expected behavior -->
13<!--- If suggesting a change/improvement, explain the difference from current behavior -->
14
15### Screenshots (if appropriate):
16
17### Possible Solution
18<!--- Not obligatory, but suggest a fix/reason for the bug, -->
19<!--- or ideas how to implement the addition or change -->
20
21### Steps to Reproduce (for bugs)
22<!--- Provide a link to a live example, or an unambiguous set of steps to -->
23<!--- reproduce this bug. Include code to reproduce, if relevant -->
241.
252.
263.
274.
28
29### Context
30<!--- How has this issue affected you? What are you trying to accomplish? -->
31<!--- Providing context helps us come up with a solution that is most useful in the real world -->
32
33### Your Environment
34<!--- Include as many relevant details about the environment you experienced the bug in -->
35* Ferdi Version used:
36* Operating System and version:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index e206b128f..efad9f6a2 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -8,12 +8,11 @@ Please fill our form below, this way we can analyse and fix the problem as fast
8Please keep in mind that any text inside "<!--" and "--\>" are comments from us and won't be 8Please keep in mind that any text inside "<!--" and "--\>" are comments from us and won't be
9visible in your bug report, so please don't put any text in them. 9visible in your bug report, so please don't put any text in them.
10--> 10-->
11**Describe the bug** 11**Bug description:**
12<!-- Add a clear and concise description of what the bug is --> 12<!-- Add a clear and concise description of what the bug is -->
13 13
14**To Reproduce** 14**Steps to reproduce:**
15<!-- Explain to us how we can reproduce your bug on our computer --> 15<!-- Explain to us how we can reproduce your bug on our computer -->
16Steps to reproduce the behavior:
17 16
181. Go to '...' 171. Go to '...'
192. Click on '....' 182. Click on '....'
@@ -27,27 +26,18 @@ Steps to reproduce the behavior:
27<!-- If applicable, add screenshots to help explain your problem. --> 26<!-- If applicable, add screenshots to help explain your problem. -->
28<!-- You can simply drag and drop any image file into the editor to add it to the report --> 27<!-- You can simply drag and drop any image file into the editor to add it to the report -->
29 28
30**Desktop:** 29**Environment:**
31 30
32- OS: [e.g. macOS, Windows 10 etc.] 31- Operating System: <!-- e.g. macOS Catalina, Windows 10, etc. -->
33- Ferdi Version [e.g. 5.4.3] 32- Ferdi Version: <!-- e.g. 5.4.3 -->
34<!-- ℹ You can find Ferdi's version by opening File > About Ferdi or Help > About Ferdi, depending on your Operating System --> 33- Server: <!-- e.g. Ferdi, Franz, Using without an account -->
35- Server Used: [e.g. https://api.getferdi.com]
36<!-- ℹ You can find Ferdi's server in Ferdi's settings under "Server". If you self-host or use Ferdi without an account please say so. -->
37 34
35- Debug information:
38<!-- 36<!--
39If you are using Ferdi >= 5.4.4-beta.2 please publish your debugging information and share them in your bug report. 37Get your debug information via Ferdi "Help" menu ("Copy/Publish Debug Information") then
40To publish a bug report, inside Ferdi's menu bar click on "Help" > "Publish debug information", accept our terms 38share a debug information file or your published link with us.
41and copy the link given to you.
42--> 39-->
43Debug information: https://debug.getferdi.com/...
44 40
45**Additional context** 41<!-- Please consider supporting Ferdi!
46<!-- Add any other context about the problem here. --> 42👉 https://github.com/sponsors/getferdi
47 43👉 https://opencollective.com/getferdi/donate -->
48<!--
49Love Ferdi? Please consider supporting our open-collective:
50👉 https://opencollective.com/getferdi/donate
51or following us on Twitter:
52👉 https://twitter.com/getferdi
53-->
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 5535496d2..61353797c 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -15,5 +15,6 @@ A clear and concise description of any alternative solutions or features you've
15**Additional context** 15**Additional context**
16Add any other context or screenshots about the feature request here. 16Add any other context or screenshots about the feature request here.
17 17
18<!-- Love Ferdi? Please consider supporting our collective: 18<!-- Please consider supporting Ferdi!
19👉 https://github.com/sponsors/getferdi
19👉 https://opencollective.com/getferdi/donate --> 20👉 https://opencollective.com/getferdi/donate -->
diff --git a/.github/ISSUE_TEMPLATE/open_issue.md b/.github/ISSUE_TEMPLATE/open_issue.md
new file mode 100644
index 000000000..c7c279643
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/open_issue.md
@@ -0,0 +1,8 @@
1---
2name: Open issue
3about: For everything that's neither a feature request, nor a bug
4---
5
6<!-- Please consider supporting Ferdi!
7👉 https://github.com/sponsors/getferdi
8👉 https://opencollective.com/getferdi/donate -->
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 6c4384695..5a6f95002 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,28 +1,18 @@
1<!--- Provide a general summary of your changes in the Title above --> 1<!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
2<!-- Please start by naming your pull request properly e.g. "Add Google Tasks to Todo providers". -->
2 3
3### Description 4### Description
4<!--- Describe your changes in detail --> 5<!-- Describe your changes in detail. -->
5 6
6### Motivation and Context 7### Motivation and Context
7<!--- Why is this change required? What problem does it solve? --> 8<!-- Why is this change required? What problem does it solve? -->
8<!--- If it fixes an open issue, please link to the issue here. --> 9<!-- If it fixes an open issue, please link to the issue here. -->
9 10
10### How Has This Been Tested? 11### Screenshots
11<!--- Please describe in detail how you tested your changes. --> 12<!-- Remove the section if this does not apply. -->
12<!--- Include details of your testing environment, tests ran to see how -->
13<!--- your change affects other areas of the code, etc. -->
14
15### Screenshots (if appropriate):
16
17### Types of changes
18<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
19- [ ] Bug fix (non-breaking change which fixes an issue)
20- [ ] New feature (non-breaking change which adds functionality)
21- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
22 13
23### Checklist: 14### Checklist:
24<!--- Go over all the following points, and put an `x` in all the boxes that apply. --> 15<!-- Go over all the following points, and put an `x` in all the boxes that apply. -->
25<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> 16- [ ] My pull request is properly named
26- [ ] My code follows the code style of this project (run `$ yarn lint`). 17- [ ] The changes respect the code style of the project (`$ npm run lint`)
27<!---- [ ] My change requires a change to the documentation. 18- [ ] I tested/previewed my changes locally \ No newline at end of file
28- [ ] I have updated the documentation accordingly. -->
diff --git a/.github/issue_label_bot.yaml b/.github/issue_label_bot.yaml
new file mode 100644
index 000000000..bc1c64d59
--- /dev/null
+++ b/.github/issue_label_bot.yaml
@@ -0,0 +1,2 @@
1label-alias:
2 feature_request: 'enhancement'
diff --git a/.travis.yml b/.travis.yml
index 7579878b7..29d31c4a8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,7 +12,7 @@ matrix:
12 - libxkbfile-dev 12 - libxkbfile-dev
13 - rpm 13 - rpm
14 - os: osx 14 - os: osx
15 if: branch = release 15 if: branch IN (nightly, release)
16 osx_image: xcode11 16 osx_image: xcode11
17 17
18language: node_js 18language: node_js
@@ -22,6 +22,7 @@ branches:
22 only: 22 only:
23 - develop 23 - develop
24 - release 24 - release
25 - nightly
25cache: npm 26cache: npm
26 27
27before_install: 28before_install:
@@ -34,6 +35,14 @@ before_script:
34script: 35script:
35 - | 36 - |
36 if [ $TRAVIS_BRANCH == "release" ]; then 37 if [ $TRAVIS_BRANCH == "release" ]; then
37 travis_retry travis_wait 100 npm run build 38 travis_retry travis_wait 100 npm run build
39 fi
40 - |
41 if [ $TRAVIS_BRANCH == "nightly" ]; then
42 npm version prerelease --preid=nightly -m "%s [skip ci]"
43 travis_retry travis_wait 100 npm run build -- --publish always -c.publish.provider=github -c.publish.owner=getferdi -c.publish.repo=nightlies
44 if [ $TRAVIS_OS_NAME == "osx" ]; then
45 git remote add nightly https://${GH_TOKEN}@github.com/getferdi/ferdi.git > /dev/null 2>&1
46 git push --quiet --set-upstream nightly HEAD:nightly >/dev/null 2>&1
47 fi
38 fi 48 fi
39
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3e573ea76..d36e75ed9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,34 @@
1# [5.6.0-beta.1](https://github.com/getferdi/ferdi/compare/v5.5.0...v5.6.0-beta.1) (2020-06-14)
2
3### Features
4- Make the notifications badge work with LauncherAPI-compliant (#736) 💖 @gabspeck
5
6### Minor changes
7- Update node-sass to 4.14.0 for compatibility with Node 14.x (#656) 💖 @dpeukert
8- Change Keyboard shortcut tooltip text in Sidebar for Settings (#665) 💖 @sampathBlam
9- Restore "delete service" option in sidebar (#692) 💖 @sampathBlam
10- Add Google Tasks to Todo providers (#695) 💖 @dannyqiu
11- Restore window last closed maximize/fullscreen state (#733) 💖 @dannyqiu
12- Add password hashing to lock password (#694)
13- Close/open window when clicking on tray menu item (#630) 💖 @dandelionadia
14- Use Tray popUpContextMenu on macOS/Windows only (#741)
15- Setup nightly releases deployment pipeline (#730)
16- Make Tray icons more robust on Linux (#748) 💖 @kris7t
17- Load disable hibernation per service status on startup (#754) 💖 @kris7t
18- Update global user agent to conform with spec (#779) 💖 @dannyqiu
19
20### Bug Fixes
21- Prevent unnecessary electron popup windows for links (#685) 💖 @mahadevans87
22- Refactor locking feature (#693)
23- Review launch on startup for macOS, start Ferdi app, not renderer (#696) 💖 @dannyqiu
24- Fix TodosWebview user agent (#713) 💖 @mahadevans87
25- Fix crash when using Password Lock with TouchID API unavailable (#737) 💖 @mahadevans87
26- Fix setting of webview disablewebsecurity attribute (#772) 💖 @dannyqiu
27
1# [5.5.0](https://github.com/getferdi/ferdi/compare/v5.4.3...v5.5.0) (2020-04-26) 28# [5.5.0](https://github.com/getferdi/ferdi/compare/v5.4.3...v5.5.0) (2020-04-26)
2### Features 29### Features
3- Merge Franz 5.5.0-beta.2 30- Merge Franz 5.5.0-beta.2
31- Add modifyRequestHeaders, enable properly setting headers for services (#639), 💖 @mahadevans87 @sampathBlam
4- Add dropdown list to choose Todo service (#418, #477), 💖 @yourcontact 32- Add dropdown list to choose Todo service (#418, #477), 💖 @yourcontact
5- Add hotkey for darkmode (#530, #537), 💖 @Room4O4 & @mahadevans87 33- Add hotkey for darkmode (#530, #537), 💖 @Room4O4 & @mahadevans87
6- Add option to start Ferdi minimized (#490, #534) 34- Add option to start Ferdi minimized (#490, #534)
diff --git a/README.md b/README.md
index bf3f18ea7..dd9fc3d72 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,9 @@
13 13
14<p align="center"> 14<p align="center">
15<img alt="GitHub Releases" src="https://img.shields.io/github/downloads/getferdi/ferdi/latest/total?label=Downloads&logo=iCloud&logoColor=%23FFFFFF"> 15<img alt="GitHub Releases" src="https://img.shields.io/github/downloads/getferdi/ferdi/latest/total?label=Downloads&logo=iCloud&logoColor=%23FFFFFF">
16<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --><a href='#contributors-'><img src='https://img.shields.io/badge/contributors-67-default.svg?logo=github' alt='Contributors'/></a><!-- ALL-CONTRIBUTORS-BADGE:END --> 16<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
17<a href='#contributors-'><img src='https://img.shields.io/badge/contributors-75-default.svg?logo=github' alt='Contributors'/></a>
18<!-- ALL-CONTRIBUTORS-BADGE:END -->
17<a href="#backers-via-opencollective"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective"></a> 19<a href="#backers-via-opencollective"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective"></a>
18<a href="#sponsors-via-opencollective"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective"></a> 20<a href="#sponsors-via-opencollective"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective"></a>
19<a href="https://ci.appveyor.com/project/kytwb/ferdi"><img alt="Build Status Windows" src="https://img.shields.io/appveyor/ci/kytwb/ferdi/master?logo=appveyor"></a> 21<a href="https://ci.appveyor.com/project/kytwb/ferdi"><img alt="Build Status Windows" src="https://img.shields.io/appveyor/ci/kytwb/ferdi/master?logo=appveyor"></a>
@@ -280,18 +282,33 @@ Deliverables will be available in the `out` folder.
280 282
281### Release 283### Release
282 284
285Create a new [draft release](https://github.com/getferdi/ferdi/releases/new) that targets the `release` branch, then:
286
283```bash 287```bash
284$ git checkout develop && git pull 288$ git checkout develop && git pull
289$ git checkout release
285$ git submodule update --remote --force 290$ git submodule update --remote --force
286$ git add . 291$ git add .
287$ git commit -m "Update submodules" 292$ git commit -m "Update submodules"
288$ git checkout master
289$ git merge --no-ff develop 293$ git merge --no-ff develop
290$ git tag v5.3.4-beta.4 294$ git push
291$ git push --tags
292``` 295```
293 296
294When pushing a new tag, the CI builds will create a draft GitHub release and upload the deliverables in the draft release assets. Wait for all the assets to be uploaded before publishing the draft release. 297Once the draft release assets are uploaded (13 assets), publish the release. The last commit of the `release` branch will be tagged. You can then merge `release` into `master` and back into `develop` if needed.
298
299#### Nightly
300
301```bash
302$ git checkout develop && git pull
303$ git checkout nightly
304$ git submodule update --remote --force
305$ git add .
306$ git commit -m "Update submodules"
307$ git merge --no-ff develop
308$ git push
309```
310
311The draft release and assets will be available in [getferdi/nightlies releases](https://github.com/getferdi/nightlies/releases). You need to manually publish the draft release as a pre-release for now.
295 312
296## Contributors ✨ 313## Contributors ✨
297 314
@@ -302,95 +319,105 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
302<!-- markdownlint-disable --> 319<!-- markdownlint-disable -->
303<table> 320<table>
304 <tr> 321 <tr>
305 <td align="center"><a href="https://vantezzen.io"><img src="https://avatars2.githubusercontent.com/u/10333196?v=4" width="40px;" alt="Bennett"/><br /><sub><b>Bennett</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Code">💻</a> <a href="#design-vantezzen" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Documentation">📖</a> <a href="#ideas-vantezzen" title="Ideas, Planning, & Feedback">🤔</a> <a href="#translation-vantezzen" title="Translation">ðŸŒ</a> <a href="#example-vantezzen" title="Examples">💡</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Avantezzen" title="Bug reports">ðŸ›</a> <a href="#content-vantezzen" title="Content">🖋</a> <a href="#infra-vantezzen" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#userTesting-vantezzen" title="User Testing">📓</a> <a href="#question-vantezzen" title="Answering Questions">💬</a> <a href="#projectManagement-vantezzen" title="Project Management">📆</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Avantezzen" title="Reviewed Pull Requests">👀</a></td> 322 <td align="center"><a href="https://vantezzen.io"><img src="https://avatars2.githubusercontent.com/u/10333196?v=4" width="40px;" alt=""/><br /><sub><b>Bennett</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Code">💻</a> <a href="#design-vantezzen" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=vantezzen" title="Documentation">📖</a> <a href="#ideas-vantezzen" title="Ideas, Planning, & Feedback">🤔</a> <a href="#translation-vantezzen" title="Translation">ðŸŒ</a> <a href="#example-vantezzen" title="Examples">💡</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Avantezzen" title="Bug reports">ðŸ›</a> <a href="#content-vantezzen" title="Content">🖋</a> <a href="#infra-vantezzen" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#userTesting-vantezzen" title="User Testing">📓</a> <a href="#question-vantezzen" title="Answering Questions">💬</a> <a href="#projectManagement-vantezzen" title="Project Management">📆</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Avantezzen" title="Reviewed Pull Requests">👀</a></td>
306 <td align="center"><a href="https://twitter.com/kytwb"><img src="https://avatars0.githubusercontent.com/u/412895?v=4" width="40px;" alt="Amine Mouafik"/><br /><sub><b>Amine Mouafik</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Code">💻</a> <a href="#design-kytwb" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Documentation">📖</a> <a href="#ideas-kytwb" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Akytwb" title="Bug reports">ðŸ›</a> <a href="#content-kytwb" title="Content">🖋</a> <a href="#infra-kytwb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#userTesting-kytwb" title="User Testing">📓</a> <a href="#question-kytwb" title="Answering Questions">💬</a> <a href="#projectManagement-kytwb" title="Project Management">📆</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Akytwb" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-kytwb" title="Maintenance">🚧</a> <a href="#platform-kytwb" title="Packaging/porting to new platform">📦</a> <a href="#fundingFinding-kytwb" title="Funding Finding">ðŸ”</a> <a href="#blog-kytwb" title="Blogposts">ðŸ“</a> <a href="#translation-kytwb" title="Translation">ðŸŒ</a></td> 323 <td align="center"><a href="https://twitter.com/kytwb"><img src="https://avatars0.githubusercontent.com/u/412895?v=4" width="40px;" alt=""/><br /><sub><b>Amine Mouafik</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Code">💻</a> <a href="#design-kytwb" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Documentation">📖</a> <a href="#ideas-kytwb" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Akytwb" title="Bug reports">ðŸ›</a> <a href="#content-kytwb" title="Content">🖋</a> <a href="#infra-kytwb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#userTesting-kytwb" title="User Testing">📓</a> <a href="#question-kytwb" title="Answering Questions">💬</a> <a href="#projectManagement-kytwb" title="Project Management">📆</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Akytwb" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-kytwb" title="Maintenance">🚧</a> <a href="#platform-kytwb" title="Packaging/porting to new platform">📦</a> <a href="#fundingFinding-kytwb" title="Funding Finding">ðŸ”</a> <a href="#blog-kytwb" title="Blogposts">ðŸ“</a> <a href="#translation-kytwb" title="Translation">ðŸŒ</a></td>
307 <td align="center"><a href="http://www.adlk.io"><img src="https://avatars1.githubusercontent.com/u/3265004?v=4" width="40px;" alt="Stefan Malzner"/><br /><sub><b>Stefan Malzner</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Code">💻</a> <a href="#content-adlk" title="Content">🖋</a> <a href="#design-adlk" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Documentation">📖</a> <a href="#ideas-adlk" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-adlk" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#projectManagement-adlk" title="Project Management">📆</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Tests">âš ï¸</a> <a href="#translation-adlk" title="Translation">ðŸŒ</a></td> 324 <td align="center"><a href="http://www.adlk.io"><img src="https://avatars1.githubusercontent.com/u/3265004?v=4" width="40px;" alt=""/><br /><sub><b>Stefan Malzner</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Code">💻</a> <a href="#content-adlk" title="Content">🖋</a> <a href="#design-adlk" title="Design">🎨</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Documentation">📖</a> <a href="#ideas-adlk" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-adlk" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#projectManagement-adlk" title="Project Management">📆</a> <a href="https://github.com/getferdi/ferdi/commits?author=adlk" title="Tests">âš ï¸</a> <a href="#translation-adlk" title="Translation">ðŸŒ</a></td>
308 <td align="center"><a href="https://github.com/Makazzz"><img src="https://avatars2.githubusercontent.com/u/49844464?v=4" width="40px;" alt="Makazzz"/><br /><sub><b>Makazzz</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3AMakazzz" title="Bug reports">ðŸ›</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Code">💻</a> <a href="#translation-Makazzz" title="Translation">ðŸŒ</a> <a href="#content-Makazzz" title="Content">🖋</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Documentation">📖</a> <a href="#platform-Makazzz" title="Packaging/porting to new platform">📦</a></td> 325 <td align="center"><a href="https://github.com/Makazzz"><img src="https://avatars2.githubusercontent.com/u/49844464?v=4" width="40px;" alt=""/><br /><sub><b>Makazzz</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3AMakazzz" title="Bug reports">ðŸ›</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Code">💻</a> <a href="#translation-Makazzz" title="Translation">ðŸŒ</a> <a href="#content-Makazzz" title="Content">🖋</a> <a href="https://github.com/getferdi/ferdi/commits?author=Makazzz" title="Documentation">📖</a> <a href="#platform-Makazzz" title="Packaging/porting to new platform">📦</a></td>
309 <td align="center"><a href="http://seriesgt.com"><img src="https://avatars3.githubusercontent.com/u/5977640?v=4" width="40px;" alt="ZeroCool"/><br /><sub><b>ZeroCool</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=ZeroCool940711" title="Code">💻</a> <a href="#ideas-ZeroCool940711" title="Ideas, Planning, & Feedback">🤔</a></td> 326 <td align="center"><a href="http://seriesgt.com"><img src="https://avatars3.githubusercontent.com/u/5977640?v=4" width="40px;" alt=""/><br /><sub><b>ZeroCool</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=ZeroCool940711" title="Code">💻</a> <a href="#ideas-ZeroCool940711" title="Ideas, Planning, & Feedback">🤔</a></td>
310 <td align="center"><a href="https://github.com/rseitbekov"><img src="https://avatars2.githubusercontent.com/u/35684439?v=4" width="40px;" alt="rseitbekov"/><br /><sub><b>rseitbekov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=rseitbekov" title="Code">💻</a></td> 327 <td align="center"><a href="https://github.com/rseitbekov"><img src="https://avatars2.githubusercontent.com/u/35684439?v=4" width="40px;" alt=""/><br /><sub><b>rseitbekov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=rseitbekov" title="Code">💻</a></td>
328 </tr>
329 <tr>
330 <td align="center"><a href="https://djangogigs.com/developers/peter-bittner/"><img src="https://avatars2.githubusercontent.com/u/665072?v=4" width="40px;" alt=""/><br /><sub><b>Peter Bittner</b></sub></a><br /><a href="#ideas-bittner" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Abittner" title="Bug reports">ðŸ›</a></td>
331 <td align="center"><a href="https://github.com/justus-saul"><img src="https://avatars1.githubusercontent.com/u/5861826?v=4" width="40px;" alt=""/><br /><sub><b>Justus Saul</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Ajustus-saul" title="Bug reports">ðŸ›</a> <a href="#ideas-justus-saul" title="Ideas, Planning, & Feedback">🤔</a></td>
332 <td align="center"><a href="https://github.com/igreil"><img src="https://avatars0.githubusercontent.com/u/17239151?v=4" width="40px;" alt=""/><br /><sub><b>igreil</b></sub></a><br /><a href="#ideas-igreil" title="Ideas, Planning, & Feedback">🤔</a></td>
333 <td align="center"><a href="http://marcolopes.eu"><img src="https://avatars1.githubusercontent.com/u/431889?v=4" width="40px;" alt=""/><br /><sub><b>Marco Lopes</b></sub></a><br /><a href="#ideas-marcolopes" title="Ideas, Planning, & Feedback">🤔</a></td>
334 <td align="center"><a href="https://github.com/dayzlun"><img src="https://avatars3.githubusercontent.com/u/17259690?v=4" width="40px;" alt=""/><br /><sub><b>dayzlun</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Adayzlun" title="Bug reports">ðŸ›</a></td>
335 <td align="center"><a href="https://twitter.com/tobigue_"><img src="https://avatars2.githubusercontent.com/u/1560152?v=4" width="40px;" alt=""/><br /><sub><b>Tobias Günther</b></sub></a><br /><a href="#ideas-tobigue" title="Ideas, Planning, & Feedback">🤔</a></td>
311 </tr> 336 </tr>
312 <tr> 337 <tr>
313 <td align="center"><a href="https://djangogigs.com/developers/peter-bittner/"><img src="https://avatars2.githubusercontent.com/u/665072?v=4" width="40px;" alt="Peter Bittner"/><br /><sub><b>Peter Bittner</b></sub></a><br /><a href="#ideas-bittner" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Abittner" title="Bug reports">ðŸ›</a></td> 338 <td align="center"><a href="https://github.com/AGCaesar"><img src="https://avatars3.githubusercontent.com/u/7844066?v=4" width="40px;" alt=""/><br /><sub><b>AGCaesar</b></sub></a><br /><a href="#platform-AGCaesar" title="Packaging/porting to new platform">📦</a></td>
314 <td align="center"><a href="https://github.com/justus-saul"><img src="https://avatars1.githubusercontent.com/u/5861826?v=4" width="40px;" alt="Justus Saul"/><br /><sub><b>Justus Saul</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Ajustus-saul" title="Bug reports">ðŸ›</a> <a href="#ideas-justus-saul" title="Ideas, Planning, & Feedback">🤔</a></td> 339 <td align="center"><a href="https://github.com/xthursdayx"><img src="https://avatars0.githubusercontent.com/u/18044308?v=4" width="40px;" alt=""/><br /><sub><b>xthursdayx</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Code">💻</a> <a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Documentation">📖</a> <a href="#infra-xthursdayx" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#platform-xthursdayx" title="Packaging/porting to new platform">📦</a></td>
315 <td align="center"><a href="https://github.com/igreil"><img src="https://avatars0.githubusercontent.com/u/17239151?v=4" width="40px;" alt="igreil"/><br /><sub><b>igreil</b></sub></a><br /><a href="#ideas-igreil" title="Ideas, Planning, & Feedback">🤔</a></td> 340 <td align="center"><a href="https://github.com/Gaboris"><img src="https://avatars2.githubusercontent.com/u/9462372?v=4" width="40px;" alt=""/><br /><sub><b>Gaboris</b></sub></a><br /><a href="#question-Gaboris" title="Answering Questions">💬</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3AGaboris" title="Bug reports">ðŸ›</a></td>
316 <td align="center"><a href="http://marcolopes.eu"><img src="https://avatars1.githubusercontent.com/u/431889?v=4" width="40px;" alt="Marco Lopes"/><br /><sub><b>Marco Lopes</b></sub></a><br /><a href="#ideas-marcolopes" title="Ideas, Planning, & Feedback">🤔</a></td> 341 <td align="center"><a href="http://www.cu3ed.com/"><img src="https://avatars1.githubusercontent.com/u/61343?v=4" width="40px;" alt=""/><br /><sub><b>Ce</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aincace" title="Bug reports">ðŸ›</a></td>
317 <td align="center"><a href="https://github.com/dayzlun"><img src="https://avatars3.githubusercontent.com/u/17259690?v=4" width="40px;" alt="dayzlun"/><br /><sub><b>dayzlun</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Adayzlun" title="Bug reports">ðŸ›</a></td> 342 <td align="center"><a href="http://pztrn.name/"><img src="https://avatars1.githubusercontent.com/u/869402?v=4" width="40px;" alt=""/><br /><sub><b>Stanislav N.</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Apztrn" title="Bug reports">ðŸ›</a></td>
318 <td align="center"><a href="https://twitter.com/tobigue_"><img src="https://avatars2.githubusercontent.com/u/1560152?v=4" width="40px;" alt="Tobias Günther"/><br /><sub><b>Tobias Günther</b></sub></a><br /><a href="#ideas-tobigue" title="Ideas, Planning, & Feedback">🤔</a></td> 343 <td align="center"><a href="http://www.patrickcurl.com"><img src="https://avatars1.githubusercontent.com/u/1470061?v=4" width="40px;" alt=""/><br /><sub><b>Patrick Curl</b></sub></a><br /><a href="#ideas-patrickcurl" title="Ideas, Planning, & Feedback">🤔</a></td>
319 </tr> 344 </tr>
320 <tr> 345 <tr>
321 <td align="center"><a href="https://github.com/AGCaesar"><img src="https://avatars3.githubusercontent.com/u/7844066?v=4" width="40px;" alt="AGCaesar"/><br /><sub><b>AGCaesar</b></sub></a><br /><a href="#platform-AGCaesar" title="Packaging/porting to new platform">📦</a></td> 346 <td align="center"><a href="https://github.com/Stanzilla"><img src="https://avatars3.githubusercontent.com/u/75278?v=4" width="40px;" alt=""/><br /><sub><b>Benjamin Staneck</b></sub></a><br /><a href="#design-Stanzilla" title="Design">🎨</a></td>
322 <td align="center"><a href="https://github.com/xthursdayx"><img src="https://avatars0.githubusercontent.com/u/18044308?v=4" width="40px;" alt="xthursdayx"/><br /><sub><b>xthursdayx</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Code">💻</a> <a href="https://github.com/getferdi/ferdi/commits?author=xthursdayx" title="Documentation">📖</a> <a href="#infra-xthursdayx" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#platform-xthursdayx" title="Packaging/porting to new platform">📦</a></td> 347 <td align="center"><a href="https://github.com/ammarmalhas"><img src="https://avatars1.githubusercontent.com/u/57057209?v=4" width="40px;" alt=""/><br /><sub><b>ammarmalhas</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aammarmalhas" title="Bug reports">ðŸ›</a> <a href="#security-ammarmalhas" title="Security">🛡ï¸</a></td>
323 <td align="center"><a href="https://github.com/Gaboris"><img src="https://avatars2.githubusercontent.com/u/9462372?v=4" width="40px;" alt="Gaboris"/><br /><sub><b>Gaboris</b></sub></a><br /><a href="#question-Gaboris" title="Answering Questions">💬</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3AGaboris" title="Bug reports">ðŸ›</a></td> 348 <td align="center"><a href="https://github.com/steliyan"><img src="https://avatars1.githubusercontent.com/u/1850292?v=4" width="40px;" alt=""/><br /><sub><b>Steliyan Stoyanov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=steliyan" title="Code">💻</a> <a href="#ideas-steliyan" title="Ideas, Planning, & Feedback">🤔</a></td>
324 <td align="center"><a href="http://www.cu3ed.com/"><img src="https://avatars1.githubusercontent.com/u/61343?v=4" width="40px;" alt="Ce"/><br /><sub><b>Ce</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aincace" title="Bug reports">ðŸ›</a></td> 349 <td align="center"><a href="https://github.com/brorbw"><img src="https://avatars2.githubusercontent.com/u/5909562?v=4" width="40px;" alt=""/><br /><sub><b>Bror Winther</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=brorbw" title="Documentation">📖</a></td>
325 <td align="center"><a href="http://pztrn.name/"><img src="https://avatars1.githubusercontent.com/u/869402?v=4" width="40px;" alt="Stanislav N."/><br /><sub><b>Stanislav N.</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Apztrn" title="Bug reports">ðŸ›</a></td> 350 <td align="center"><a href="https://fwdekker.com/"><img src="https://avatars0.githubusercontent.com/u/13442533?v=4" width="40px;" alt=""/><br /><sub><b>Felix W. Dekker</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=FWDekker" title="Documentation">📖</a></td>
326 <td align="center"><a href="http://www.patrickcurl.com"><img src="https://avatars1.githubusercontent.com/u/1470061?v=4" width="40px;" alt="Patrick Curl"/><br /><sub><b>Patrick Curl</b></sub></a><br /><a href="#ideas-patrickcurl" title="Ideas, Planning, & Feedback">🤔</a></td> 351 <td align="center"><a href="https://github.com/Sauceee"><img src="https://avatars2.githubusercontent.com/u/17987941?v=4" width="40px;" alt=""/><br /><sub><b>Sauceee</b></sub></a><br /><a href="#design-Sauceee" title="Design">🎨</a></td>
327 </tr> 352 </tr>
328 <tr> 353 <tr>
329 <td align="center"><a href="https://github.com/Stanzilla"><img src="https://avatars3.githubusercontent.com/u/75278?v=4" width="40px;" alt="Benjamin Staneck"/><br /><sub><b>Benjamin Staneck</b></sub></a><br /><a href="#design-Stanzilla" title="Design">🎨</a></td> 354 <td align="center"><a href="http://lhw.ring0.de"><img src="https://avatars2.githubusercontent.com/u/351875?v=4" width="40px;" alt=""/><br /><sub><b>Lennart Weller</b></sub></a><br /><a href="#platform-lhw" title="Packaging/porting to new platform">📦</a></td>
330 <td align="center"><a href="https://github.com/ammarmalhas"><img src="https://avatars1.githubusercontent.com/u/57057209?v=4" width="40px;" alt="ammarmalhas"/><br /><sub><b>ammarmalhas</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Aammarmalhas" title="Bug reports">ðŸ›</a> <a href="#security-ammarmalhas" title="Security">🛡ï¸</a></td> 355 <td align="center"><a href="https://github.com/jereksel"><img src="https://avatars0.githubusercontent.com/u/1307829?v=4" width="40px;" alt=""/><br /><sub><b>Andrzej Ressel</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=jereksel" title="Code">💻</a></td>
331 <td align="center"><a href="https://github.com/steliyan"><img src="https://avatars1.githubusercontent.com/u/1850292?v=4" width="40px;" alt="Steliyan Stoyanov"/><br /><sub><b>Steliyan Stoyanov</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=steliyan" title="Code">💻</a> <a href="#ideas-steliyan" title="Ideas, Planning, & Feedback">🤔</a></td> 356 <td align="center"><a href="https://gitlab.com/dpeukert"><img src="https://avatars2.githubusercontent.com/u/3451904?v=4" width="40px;" alt=""/><br /><sub><b>Daniel Peukert</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=dpeukert" title="Code">💻</a></td>
332 <td align="center"><a href="https://github.com/brorbw"><img src="https://avatars2.githubusercontent.com/u/5909562?v=4" width="40px;" alt="Bror Winther"/><br /><sub><b>Bror Winther</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=brorbw" title="Documentation">📖</a></td> 357 <td align="center"><a href="https://crowdin.com/profile/Ali_Shiple"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12895436/small/00917d09ca1b4b6d8e0ef36af07ecf6b.jpg" width="40px;" alt=""/><br /><sub><b>Ali M. Shiple</b></sub></a><br /><a href="#translation-Ali_Shiple" title="Translation">ðŸŒ</a></td>
333 <td align="center"><a href="https://fwdekker.com/"><img src="https://avatars0.githubusercontent.com/u/13442533?v=4" width="40px;" alt="Felix W. Dekker"/><br /><sub><b>Felix W. Dekker</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=FWDekker" title="Documentation">📖</a></td> 358 <td align="center"><a href="https://crowdin.com/profile/elviseras"><img src="https://www.gravatar.com/avatar/25c2cf0d8cb4a4141e71c3b8a2e9324f" width="40px;" alt=""/><br /><sub><b>elviseras</b></sub></a><br /><a href="#translation-elviseras" title="Translation">ðŸŒ</a></td>
334 <td align="center"><a href="https://github.com/Sauceee"><img src="https://avatars2.githubusercontent.com/u/17987941?v=4" width="40px;" alt="Sauceee"/><br /><sub><b>Sauceee</b></sub></a><br /><a href="#design-Sauceee" title="Design">🎨</a></td> 359 <td align="center"><a href="https://crowdin.com/profile/J370"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14141203/small/7b12b5db419d8796450221c2eaaf6003.png" width="40px;" alt=""/><br /><sub><b>J370</b></sub></a><br /><a href="#translation-J370" title="Translation">ðŸŒ</a></td>
335 </tr> 360 </tr>
336 <tr> 361 <tr>
337 <td align="center"><a href="http://lhw.ring0.de"><img src="https://avatars2.githubusercontent.com/u/351875?v=4" width="40px;" alt="Lennart Weller"/><br /><sub><b>Lennart Weller</b></sub></a><br /><a href="#platform-lhw" title="Packaging/porting to new platform">📦</a></td> 362 <td align="center"><a href="https://crowdin.com/profile/keunes"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13018172/small/829115c606347b10218f34c637a2100c.png" width="40px;" alt=""/><br /><sub><b>Koen</b></sub></a><br /><a href="#translation-keunes" title="Translation">ðŸŒ</a></td>
338 <td align="center"><a href="https://github.com/jereksel"><img src="https://avatars0.githubusercontent.com/u/1307829?v=4" width="40px;" alt="Andrzej Ressel"/><br /><sub><b>Andrzej Ressel</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=jereksel" title="Code">💻</a></td> 363 <td align="center"><a href="https://crowdin.com/profile/leandrogehlen"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14099621/small/1d9503523839c310dbce0af3c226e894.jpeg" width="40px;" alt=""/><br /><sub><b>Leandro Gehlen</b></sub></a><br /><a href="#translation-leandrogehlen" title="Translation">ðŸŒ</a></td>
339 <td align="center"><a href="https://gitlab.com/dpeukert"><img src="https://avatars2.githubusercontent.com/u/3451904?v=4" width="40px;" alt="Daniel Peukert"/><br /><sub><b>Daniel Peukert</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=dpeukert" title="Code">💻</a></td> 364 <td align="center"><a href="https://crowdin.com/profile/Matthieu42"><img src="https://www.gravatar.com/avatar/735217ccccf11ba97573deee517ddb19" width="40px;" alt=""/><br /><sub><b>Matthieu42</b></sub></a><br /><a href="#translation-Matthieu42" title="Translation">ðŸŒ</a></td>
340 <td align="center"><a href="https://crowdin.com/profile/Ali_Shiple"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12895436/small/00917d09ca1b4b6d8e0ef36af07ecf6b.jpg" width="40px;" alt="Ali M. Shiple"/><br /><sub><b>Ali M. Shiple</b></sub></a><br /><a href="#translation-Ali_Shiple" title="Translation">ðŸŒ</a></td> 365 <td align="center"><a href="https://crowdin.com/profile/nicky18013"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13468928/small/2b31e7ac19645d950a79b33ffd5721b8.png" width="40px;" alt=""/><br /><sub><b>Nikita Bibanaev</b></sub></a><br /><a href="#translation-nicky18013" title="Translation">ðŸŒ</a></td>
341 <td align="center"><a href="https://crowdin.com/profile/elviseras"><img src="https://www.gravatar.com/avatar/25c2cf0d8cb4a4141e71c3b8a2e9324f" width="40px;" alt="elviseras"/><br /><sub><b>elviseras</b></sub></a><br /><a href="#translation-elviseras" title="Translation">ðŸŒ</a></td> 366 <td align="center"><a href="https://crowdin.com/profile/Tatjana1998"><img src="https://www.gravatar.com/avatar/ade202a04fcbb2c177e4f1d9936af29e" width="40px;" alt=""/><br /><sub><b>Tatjana1998</b></sub></a><br /><a href="#translation-Tatjana1998" title="Translation">ðŸŒ</a></td>
342 <td align="center"><a href="https://crowdin.com/profile/J370"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14141203/small/7b12b5db419d8796450221c2eaaf6003.png" width="40px;" alt="J370"/><br /><sub><b>J370</b></sub></a><br /><a href="#translation-J370" title="Translation">ðŸŒ</a></td> 367 <td align="center"><a href="https://crowdin.com/profile/seayko"><img src="https://www.gravatar.com/avatar/65e2aef738ddf828f822d8463fd04918" width="40px;" alt=""/><br /><sub><b>tinect</b></sub></a><br /><a href="#translation-seayko" title="Translation">ðŸŒ</a></td>
343 </tr> 368 </tr>
344 <tr> 369 <tr>
345 <td align="center"><a href="https://crowdin.com/profile/keunes"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13018172/small/829115c606347b10218f34c637a2100c.png" width="40px;" alt="Koen"/><br /><sub><b>Koen</b></sub></a><br /><a href="#translation-keunes" title="Translation">ðŸŒ</a></td> 370 <td align="center"><a href="https://crowdin.com/profile/Pusnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13514833/small/65f0b45587cc7e34f2827830cd324b16.jpeg" width="40px;" alt=""/><br /><sub><b>Wonsup Yoon</b></sub></a><br /><a href="#translation-Pusnow" title="Translation">ðŸŒ</a></td>
346 <td align="center"><a href="https://crowdin.com/profile/leandrogehlen"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14099621/small/1d9503523839c310dbce0af3c226e894.jpeg" width="40px;" alt="Leandro Gehlen"/><br /><sub><b>Leandro Gehlen</b></sub></a><br /><a href="#translation-leandrogehlen" title="Translation">ðŸŒ</a></td> 371 <td align="center"><a href="https://crowdin.com/profile/zutt"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13320003/small/50fdf9f8c7e54a446925bd79696ea625.JPG" width="40px;" alt=""/><br /><sub><b>zutt</b></sub></a><br /><a href="#translation-zutt" title="Translation">ðŸŒ</a></td>
347 <td align="center"><a href="https://crowdin.com/profile/Matthieu42"><img src="https://www.gravatar.com/avatar/735217ccccf11ba97573deee517ddb19" width="40px;" alt="Matthieu42"/><br /><sub><b>Matthieu42</b></sub></a><br /><a href="#translation-Matthieu42" title="Translation">ðŸŒ</a></td> 372 <td align="center"><a href="http://twitter.com/noemis_exec"><img src="https://avatars3.githubusercontent.com/u/22817873?v=4" width="40px;" alt=""/><br /><sub><b>n0emis</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=n0emis" title="Code">💻</a> <a href="#translation-n0emis" title="Translation">ðŸŒ</a></td>
348 <td align="center"><a href="https://crowdin.com/profile/nicky18013"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13468928/small/2b31e7ac19645d950a79b33ffd5721b8.png" width="40px;" alt="Nikita Bibanaev"/><br /><sub><b>Nikita Bibanaev</b></sub></a><br /><a href="#translation-nicky18013" title="Translation">ðŸŒ</a></td> 373 <td align="center"><a href="https://www.monke-agency.com/equipe.html"><img src="https://avatars2.githubusercontent.com/u/3405028?v=4" width="40px;" alt=""/><br /><sub><b>gmarec</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=gmarec" title="Code">💻</a></td>
349 <td align="center"><a href="https://crowdin.com/profile/Tatjana1998"><img src="https://www.gravatar.com/avatar/ade202a04fcbb2c177e4f1d9936af29e" width="40px;" alt="Tatjana1998"/><br /><sub><b>Tatjana1998</b></sub></a><br /><a href="#translation-Tatjana1998" title="Translation">ðŸŒ</a></td> 374 <td align="center"><a href="https://crowdin.com/profile/127oo1"><img src="https://www.gravatar.com/avatar/060c722be11da16ae31902e9c98326b2" width="40px;" alt=""/><br /><sub><b>127oo1</b></sub></a><br /><a href="#translation-127oo1" title="Translation">ðŸŒ</a></td>
350 <td align="center"><a href="https://crowdin.com/profile/seayko"><img src="https://www.gravatar.com/avatar/65e2aef738ddf828f822d8463fd04918" width="40px;" alt="tinect"/><br /><sub><b>tinect</b></sub></a><br /><a href="#translation-seayko" title="Translation">ðŸŒ</a></td> 375 <td align="center"><a href="https://crowdin.com/profile/ChTBoner"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13273153/small/a810886febf5199cfa1c98644444dea7.jpeg" width="40px;" alt=""/><br /><sub><b>ChTBoner</b></sub></a><br /><a href="#translation-ChTBoner" title="Translation">ðŸŒ</a></td>
351 </tr> 376 </tr>
352 <tr> 377 <tr>
353 <td align="center"><a href="https://crowdin.com/profile/Pusnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13514833/small/65f0b45587cc7e34f2827830cd324b16.jpeg" width="40px;" alt="Wonsup Yoon"/><br /><sub><b>Wonsup Yoon</b></sub></a><br /><a href="#translation-Pusnow" title="Translation">ðŸŒ</a></td> 378 <td align="center"><a href="https://crowdin.com/profile/johanengstrand"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14152801/small/fd395f120efca971ca9b34c57fd02cca.png" width="40px;" alt=""/><br /><sub><b>Johan Engstrand</b></sub></a><br /><a href="#translation-johanengstrand" title="Translation">ðŸŒ</a></td>
354 <td align="center"><a href="https://crowdin.com/profile/zutt"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13320003/small/50fdf9f8c7e54a446925bd79696ea625.JPG" width="40px;" alt="zutt"/><br /><sub><b>zutt</b></sub></a><br /><a href="#translation-zutt" title="Translation">ðŸŒ</a></td> 379 <td align="center"><a href="https://mrassili.com"><img src="https://avatars0.githubusercontent.com/u/25288435?v=4" width="40px;" alt=""/><br /><sub><b>Marouane R</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=mrassili" title="Code">💻</a></td>
355 <td align="center"><a href="http://twitter.com/noemis_exec"><img src="https://avatars3.githubusercontent.com/u/22817873?v=4" width="40px;" alt="n0emis"/><br /><sub><b>n0emis</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=n0emis" title="Code">💻</a> <a href="#translation-n0emis" title="Translation">ðŸŒ</a></td> 380 <td align="center"><a href="https://github.com/yourcontact"><img src="https://avatars2.githubusercontent.com/u/46404814?v=4" width="40px;" alt=""/><br /><sub><b>Roman</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=yourcontact" title="Code">💻</a> <a href="#ideas-yourcontact" title="Ideas, Planning, & Feedback">🤔</a></td>
356 <td align="center"><a href="https://www.monke-agency.com/equipe.html"><img src="https://avatars2.githubusercontent.com/u/3405028?v=4" width="40px;" alt="gmarec"/><br /><sub><b>gmarec</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=gmarec" title="Code">💻</a></td> 381 <td align="center"><a href="https://github.com/mahadevans87"><img src="https://avatars1.githubusercontent.com/u/1255523?v=4" width="40px;" alt=""/><br /><sub><b>Mahadevan Sreenivasan</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=mahadevans87" title="Code">💻</a> <a href="#ideas-mahadevans87" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Amahadevans87" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Amahadevans87" title="Bug reports">ðŸ›</a> <a href="https://github.com/getferdi/ferdi/commits?author=mahadevans87" title="Documentation">📖</a> <a href="#userTesting-mahadevans87" title="User Testing">📓</a></td>
357 <td align="center"><a href="https://crowdin.com/profile/127oo1"><img src="https://www.gravatar.com/avatar/060c722be11da16ae31902e9c98326b2" width="40px;" alt="127oo1"/><br /><sub><b>127oo1</b></sub></a><br /><a href="#translation-127oo1" title="Translation">ðŸŒ</a></td> 382 <td align="center"><a href="https://jakelee.co.uk"><img src="https://avatars2.githubusercontent.com/u/12380876?v=4" width="40px;" alt=""/><br /><sub><b>Jake Lee</b></sub></a><br /><a href="#content-JakeSteam" title="Content">🖋</a></td>
358 <td align="center"><a href="https://crowdin.com/profile/ChTBoner"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13273153/small/a810886febf5199cfa1c98644444dea7.jpeg" width="40px;" alt="ChTBoner"/><br /><sub><b>ChTBoner</b></sub></a><br /><a href="#translation-ChTBoner" title="Translation">ðŸŒ</a></td> 383 <td align="center"><a href="https://github.com/sampathBlam"><img src="https://avatars1.githubusercontent.com/u/17728976?v=4" width="40px;" alt=""/><br /><sub><b>Sampath Kumar Krishnan</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=sampathBlam" title="Code">💻</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3AsampathBlam" title="Reviewed Pull Requests">👀</a> <a href="#ideas-sampathBlam" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3AsampathBlam" title="Bug reports">ðŸ›</a> <a href="https://github.com/getferdi/ferdi/commits?author=sampathBlam" title="Documentation">📖</a> <a href="#userTesting-sampathBlam" title="User Testing">📓</a></td>
359 </tr> 384 </tr>
360 <tr> 385 <tr>
361 <td align="center"><a href="https://crowdin.com/profile/johanengstrand"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14152801/small/fd395f120efca971ca9b34c57fd02cca.png" width="40px;" alt="Johan Engstrand"/><br /><sub><b>Johan Engstrand</b></sub></a><br /><a href="#translation-johanengstrand" title="Translation">ðŸŒ</a></td> 386 <td align="center"><a href="https://github.com/saruwman"><img src="https://avatars2.githubusercontent.com/u/41330038?v=4" width="40px;" alt=""/><br /><sub><b>saruwman</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=saruwman" title="Documentation">📖</a> <a href="https://github.com/getferdi/ferdi/commits?author=saruwman" title="Code">💻</a></td>
362 <td align="center"><a href="https://mrassili.com"><img src="https://avatars0.githubusercontent.com/u/25288435?v=4" width="40px;" alt="Marouane R"/><br /><sub><b>Marouane R</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=mrassili" title="Code">💻</a></td> 387 <td align="center"><a href="https://github.com/dorukkarinca"><img src="https://avatars0.githubusercontent.com/u/9303867?v=4" width="40px;" alt=""/><br /><sub><b>dorukkarinca</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Adorukkarinca" title="Bug reports">ðŸ›</a></td>
363 <td align="center"><a href="https://github.com/yourcontact"><img src="https://avatars2.githubusercontent.com/u/46404814?v=4" width="40px;" alt="Roman"/><br /><sub><b>Roman</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=yourcontact" title="Code">💻</a></td> 388 <td align="center"><a href="https://www.linkedin.com/in/gautamsi"><img src="https://avatars2.githubusercontent.com/u/5769869?v=4" width="40px;" alt=""/><br /><sub><b>Gautam Singh</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=gautamsi" title="Code">💻</a></td>
364 <td align="center"><a href="https://github.com/mahadevans87"><img src="https://avatars1.githubusercontent.com/u/1255523?v=4" width="40px;" alt="Mahadevan Sreenivasan"/><br /><sub><b>Mahadevan Sreenivasan</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=mahadevans87" title="Code">💻</a> <a href="#ideas-mahadevans87" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3Amahadevans87" title="Reviewed Pull Requests">👀</a></td> 389 <td align="center"><a href="https://feikojoosten.com"><img src="https://avatars0.githubusercontent.com/u/10920052?v=4" width="40px;" alt=""/><br /><sub><b>Feiko Joosten</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=FeikoJoosten" title="Code">💻</a></td>
365 <td align="center"><a href="https://jakelee.co.uk"><img src="https://avatars2.githubusercontent.com/u/12380876?v=4" width="40px;" alt="Jake Lee"/><br /><sub><b>Jake Lee</b></sub></a><br /><a href="#content-JakeSteam" title="Content">🖋</a></td> 390 <td align="center"><a href="https://crowdin.com/profile/2bdelghafour"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14219410/small/31ff20f60d352fb46e314f3c180a77b0.jpeg" width="40px;" alt=""/><br /><sub><b>2bdelghafour</b></sub></a><br /><a href="#translation-2bdelghafour" title="Translation">ðŸŒ</a></td>
366 <td align="center"><a href="https://github.com/sampathBlam"><img src="https://avatars1.githubusercontent.com/u/17728976?v=4" width="40px;" alt="Sampath Kumar Krishnan"/><br /><sub><b>Sampath Kumar Krishnan</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=sampathBlam" title="Code">💻</a> <a href="https://github.com/getferdi/ferdi/pulls?q=is%3Apr+reviewed-by%3AsampathBlam" title="Reviewed Pull Requests">👀</a></td> 391 <td align="center"><a href="https://crowdin.com/profile/abdoutanta"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14213908/small/5b2fc8166f8a0a2b7313fbf49ee5b6b6.jpeg" width="40px;" alt=""/><br /><sub><b>Abderrahim Tantaoui</b></sub></a><br /><a href="#translation-abdoutanta" title="Translation">ðŸŒ</a></td>
367 </tr> 392 </tr>
368 <tr> 393 <tr>
369 <td align="center"><a href="https://github.com/saruwman"><img src="https://avatars2.githubusercontent.com/u/41330038?v=4" width="40px;" alt="saruwman"/><br /><sub><b>saruwman</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=saruwman" title="Documentation">📖</a> <a href="https://github.com/getferdi/ferdi/commits?author=saruwman" title="Code">💻</a></td> 394 <td align="center"><a href="https://crowdin.com/profile/AndiLeni"><img src="https://www.gravatar.com/avatar/4bd0da860de38afa735425ce2d4e10b5" width="40px;" alt=""/><br /><sub><b>AndiLeni</b></sub></a><br /><a href="#translation-AndiLeni" title="Translation">ðŸŒ</a></td>
370 <td align="center"><a href="https://github.com/dorukkarinca"><img src="https://avatars0.githubusercontent.com/u/9303867?v=4" width="40px;" alt="dorukkarinca"/><br /><sub><b>dorukkarinca</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Adorukkarinca" title="Bug reports">ðŸ›</a></td> 395 <td align="center"><a href="https://crowdin.com/profile/brunofalmada"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14200540/small/f6f1addceeeabc02488f9b08520a902f.jpeg" width="40px;" alt=""/><br /><sub><b>Bruno Almada</b></sub></a><br /><a href="#translation-brunofalmada" title="Translation">ðŸŒ</a></td>
371 <td align="center"><a href="https://www.linkedin.com/in/gautamsi"><img src="https://avatars2.githubusercontent.com/u/5769869?v=4" width="40px;" alt="Gautam Singh"/><br /><sub><b>Gautam Singh</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=gautamsi" title="Code">💻</a></td> 396 <td align="center"><a href="https://crowdin.com/profile/Catarino"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14208802/small/07287eb2de671257ca3d6bb4ba1cca67.jpeg" width="40px;" alt=""/><br /><sub><b>Catarino Gonçalo</b></sub></a><br /><a href="#translation-Catarino" title="Translation">ðŸŒ</a></td>
372 <td align="center"><a href="https://feikojoosten.com"><img src="https://avatars0.githubusercontent.com/u/10920052?v=4" width="40px;" alt="Feiko Joosten"/><br /><sub><b>Feiko Joosten</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=FeikoJoosten" title="Code">💻</a></td> 397 <td align="center"><a href="https://crowdin.com/profile/Alzemand"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14184269/small/f5e68247f01988ae7951a282f0fd4d06.jpeg" width="40px;" alt=""/><br /><sub><b>Edilson Alzemand Sigmaringa Junior</b></sub></a><br /><a href="#translation-Alzemand" title="Translation">ðŸŒ</a></td>
373 <td align="center"><a href="https://crowdin.com/profile/2bdelghafour"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14219410/small/31ff20f60d352fb46e314f3c180a77b0.jpeg" width="40px;" alt="2bdelghafour"/><br /><sub><b>2bdelghafour</b></sub></a><br /><a href="#translation-2bdelghafour" title="Translation">ðŸŒ</a></td> 398 <td align="center"><a href="https://crowdin.com/profile/MAT-OUT"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14201550/small/68dd2402bf2879bc3ca312d627710400.png" width="40px;" alt=""/><br /><sub><b>MAT-OUT</b></sub></a><br /><a href="#translation-MAT-OUT" title="Translation">ðŸŒ</a></td>
374 <td align="center"><a href="https://crowdin.com/profile/abdoutanta"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14213908/small/5b2fc8166f8a0a2b7313fbf49ee5b6b6.jpeg" width="40px;" alt="Abderrahim Tantaoui"/><br /><sub><b>Abderrahim Tantaoui</b></sub></a><br /><a href="#translation-abdoutanta" title="Translation">ðŸŒ</a></td> 399 <td align="center"><a href="https://crowdin.com/profile/mazzo98"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12864917/small/69799b5fd7be2f67282715d5cdfd4ae1.png" width="40px;" alt=""/><br /><sub><b>mazzo98</b></sub></a><br /><a href="#translation-mazzo98" title="Translation">ðŸŒ</a></td>
375 </tr> 400 </tr>
376 <tr> 401 <tr>
377 <td align="center"><a href="https://crowdin.com/profile/AndiLeni"><img src="https://www.gravatar.com/avatar/4bd0da860de38afa735425ce2d4e10b5" width="40px;" alt="AndiLeni"/><br /><sub><b>AndiLeni</b></sub></a><br /><a href="#translation-AndiLeni" title="Translation">ðŸŒ</a></td> 402 <td align="center"><a href="https://crowdin.com/profile/paprika-naught-tiffin-flyspeck"><img src="https://www.gravatar.com/avatar/8671ebe7a7164dfa7624fbdbff69ed96" width="40px;" alt=""/><br /><sub><b>paprika-naught-tiffin-flyspeck</b></sub></a><br /><a href="#translation-paprika-naught-tiffin-flyspeck" title="Translation">ðŸŒ</a></td>
378 <td align="center"><a href="https://crowdin.com/profile/brunofalmada"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14200540/small/f6f1addceeeabc02488f9b08520a902f.jpeg" width="40px;" alt="Bruno Almada"/><br /><sub><b>Bruno Almada</b></sub></a><br /><a href="#translation-brunofalmada" title="Translation">ðŸŒ</a></td> 403 <td align="center"><a href="https://crowdin.com/profile/patrickvalle"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14217484/small/8b73f313ee79fe33625e819cdac86551.jpg" width="40px;" alt=""/><br /><sub><b>Patrick Valle</b></sub></a><br /><a href="#translation-patrickvalle" title="Translation">ðŸŒ</a></td>
379 <td align="center"><a href="https://crowdin.com/profile/Catarino"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14208802/small/07287eb2de671257ca3d6bb4ba1cca67.jpeg" width="40px;" alt="Catarino Gonçalo"/><br /><sub><b>Catarino Gonçalo</b></sub></a><br /><a href="#translation-Catarino" title="Translation">ðŸŒ</a></td> 404 <td align="center"><a href="https://crowdin.com/profile/peq42"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14155811/small/b62a94dde7ec29948ec6a6af9fd24b1d.png" width="40px;" alt=""/><br /><sub><b>peq42_</b></sub></a><br /><a href="#translation-peq42" title="Translation">ðŸŒ</a></td>
380 <td align="center"><a href="https://crowdin.com/profile/Alzemand"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14184269/small/f5e68247f01988ae7951a282f0fd4d06.jpeg" width="40px;" alt="Edilson Alzemand Sigmaringa Junior"/><br /><sub><b>Edilson Alzemand Sigmaringa Junior</b></sub></a><br /><a href="#translation-Alzemand" title="Translation">ðŸŒ</a></td> 405 <td align="center"><a href="https://crowdin.com/profile/karlinhos"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14161139/small/96450eb44c22b3141ab4401e547109b8.png" width="40px;" alt=""/><br /><sub><b>Pumbinha</b></sub></a><br /><a href="#translation-karlinhos" title="Translation">ðŸŒ</a></td>
381 <td align="center"><a href="https://crowdin.com/profile/MAT-OUT"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14201550/small/68dd2402bf2879bc3ca312d627710400.png" width="40px;" alt="MAT-OUT"/><br /><sub><b>MAT-OUT</b></sub></a><br /><a href="#translation-MAT-OUT" title="Translation">ðŸŒ</a></td> 406 <td align="center"><a href="https://crowdin.com/profile/dies"><img src="https://crowdin-static.downloads.crowdin.com/avatar/1/small/e84bcdf6c084ffd52527931f988fb410.png" width="40px;" alt=""/><br /><sub><b>Serhiy Dmytryshyn</b></sub></a><br /><a href="#translation-dies" title="Translation">ðŸŒ</a></td>
382 <td align="center"><a href="https://crowdin.com/profile/mazzo98"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12864917/small/69799b5fd7be2f67282715d5cdfd4ae1.png" width="40px;" alt="mazzo98"/><br /><sub><b>mazzo98</b></sub></a><br /><a href="#translation-mazzo98" title="Translation">ðŸŒ</a></td> 407 <td align="center"><a href="https://crowdin.com/profile/SMile61"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14177585/small/1bb4f6ba39bff3df8f579e61460ce016.png" width="40px;" alt=""/><br /><sub><b>SMile61</b></sub></a><br /><a href="#translation-SMile61" title="Translation">ðŸŒ</a></td>
383 </tr> 408 </tr>
384 <tr> 409 <tr>
385 <td align="center"><a href="https://crowdin.com/profile/paprika-naught-tiffin-flyspeck"><img src="https://www.gravatar.com/avatar/8671ebe7a7164dfa7624fbdbff69ed96" width="40px;" alt="paprika-naught-tiffin-flyspeck"/><br /><sub><b>paprika-naught-tiffin-flyspeck</b></sub></a><br /><a href="#translation-paprika-naught-tiffin-flyspeck" title="Translation">ðŸŒ</a></td> 410 <td align="center"><a href="https://crowdin.com/profile/tinect"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12521988/small/56c2041645746af9e51dd28782b828c3.jpeg" width="40px;" alt=""/><br /><sub><b>tinect</b></sub></a><br /><a href="#translation-tinect" title="Translation">ðŸŒ</a></td>
386 <td align="center"><a href="https://crowdin.com/profile/patrickvalle"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14217484/small/8b73f313ee79fe33625e819cdac86551.jpg" width="40px;" alt="Patrick Valle"/><br /><sub><b>Patrick Valle</b></sub></a><br /><a href="#translation-patrickvalle" title="Translation">ðŸŒ</a></td> 411 <td align="center"><a href="https://github.com/gega7"><img src="https://avatars0.githubusercontent.com/u/20799911?v=4" width="40px;" alt=""/><br /><sub><b>gega7</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/issues?q=author%3Agega7" title="Bug reports">ðŸ›</a></td>
387 <td align="center"><a href="https://crowdin.com/profile/peq42"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14155811/small/b62a94dde7ec29948ec6a6af9fd24b1d.png" width="40px;" alt="peq42_"/><br /><sub><b>peq42_</b></sub></a><br /><a href="#translation-peq42" title="Translation">ðŸŒ</a></td> 412 <td align="center"><a href="https://github.com/tristanplouz"><img src="https://avatars2.githubusercontent.com/u/6893466?v=4" width="40px;" alt=""/><br /><sub><b>tristanplouz</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=tristanplouz" title="Code">💻</a> <a href="#ideas-tristanplouz" title="Ideas, Planning, & Feedback">🤔</a></td>
388 <td align="center"><a href="https://crowdin.com/profile/karlinhos"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14161139/small/96450eb44c22b3141ab4401e547109b8.png" width="40px;" alt="Pumbinha"/><br /><sub><b>Pumbinha</b></sub></a><br /><a href="#translation-karlinhos" title="Translation">ðŸŒ</a></td> 413 <td align="center"><a href="https://github.com/dannyqiu"><img src="https://avatars1.githubusercontent.com/u/1170755?v=4" width="40px;" alt=""/><br /><sub><b>Danny Qiu</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=dannyqiu" title="Code">💻</a> <a href="https://github.com/getferdi/ferdi/issues?q=author%3Adannyqiu" title="Bug reports">ðŸ›</a></td>
389 <td align="center"><a href="https://crowdin.com/profile/dies"><img src="https://crowdin-static.downloads.crowdin.com/avatar/1/small/e84bcdf6c084ffd52527931f988fb410.png" width="40px;" alt="Serhiy Dmytryshyn"/><br /><sub><b>Serhiy Dmytryshyn</b></sub></a><br /><a href="#translation-dies" title="Translation">ðŸŒ</a></td> 414 <td align="center"><a href="https://github.com/belyazidi56"><img src="https://avatars3.githubusercontent.com/u/35711540?v=4" width="40px;" alt=""/><br /><sub><b>Youssef Belyazidi</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=belyazidi56" title="Code">💻</a></td>
390 <td align="center"><a href="https://crowdin.com/profile/SMile61"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14177585/small/1bb4f6ba39bff3df8f579e61460ce016.png" width="40px;" alt="SMile61"/><br /><sub><b>SMile61</b></sub></a><br /><a href="#translation-SMile61" title="Translation">ðŸŒ</a></td> 415 <td align="center"><a href="https://github.com/gabspeck"><img src="https://avatars2.githubusercontent.com/u/749488?v=4" width="40px;" alt=""/><br /><sub><b>Gabriel Speckhahn</b></sub></a><br /><a href="#platform-gabspeck" title="Packaging/porting to new platform">📦</a></td>
391 </tr> 416 </tr>
392 <tr> 417 <tr>
393 <td align="center"><a href="https://crowdin.com/profile/tinect"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12521988/small/56c2041645746af9e51dd28782b828c3.jpeg" width="40px;" alt="tinect"/><br /><sub><b>tinect</b></sub></a><br /><a href="#translation-tinect" title="Translation">ðŸŒ</a></td> 418 <td align="center"><a href="https://github.com/dandelionadia"><img src="https://avatars0.githubusercontent.com/u/33199975?v=4" width="40px;" alt=""/><br /><sub><b>Nadiia Ridko</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=dandelionadia" title="Code">💻</a></td>
419 <td align="center"><a href="https://hohner.dev"><img src="https://avatars0.githubusercontent.com/u/649895?v=4" width="40px;" alt=""/><br /><sub><b>Jan Hohner</b></sub></a><br /><a href="#userTesting-janhohner" title="User Testing">📓</a></td>
420 <td align="center"><a href="https://marussy.com"><img src="https://avatars1.githubusercontent.com/u/38888?v=4" width="40px;" alt=""/><br /><sub><b>Kristóf Marussy</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=kris7t" title="Code">💻</a></td>
394 </tr> 421 </tr>
395</table> 422</table>
396 423
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..48516db61
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,17 @@
1# Security Policy
2
3## Supported Versions
4
5| Version | Supported |
6| ------- | ------------------ |
7| 5.5.0 | :white_check_mark: |
8| 5.4.3 | :x: |
9| < 5.4.3 | :x: |
10
11## Reporting a Vulnerability
12
13If you discover a minor vulnerability in Ferdi, please create a new issue on GitHub. Minor vulnerabilities are those, that do not leave the user at immediate danger, i.e. though remote code execution.
14
15If you discover a major vulnerability in Ferdi, please report it to us via E-Mail to `hello@getferdi.com`, prefixing your E-Mail subject with "[Security]". We will then come in contact with you as quickly as possible.
16
17Please keep in mind that some vulnerabilities you find may not be due to Ferdi but instead due to ElectronJS or Chromium. In that case, please contact the owners of those projects instead.
diff --git a/appveyor.yml b/appveyor.yml
index acdd94e13..d6e909f9c 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -2,6 +2,7 @@ version: build-{build}
2branches: 2branches:
3 only: 3 only:
4 - release 4 - release
5 - nightly
5skip_tags: true 6skip_tags: true
6skip_branch_with_pr: true 7skip_branch_with_pr: true
7 8
@@ -20,3 +21,13 @@ before_build:
20 21
21build_script: 22build_script:
22 - appveyor-retry npm run build 23 - appveyor-retry npm run build
24
25for:
26-
27 branches:
28 only:
29 - nightly
30 before_build:
31 - npm version prerelease --preid=nightly --no-git-tag-version
32 build_script:
33 - appveyor-retry npm run build -- --publish always -c.publish.provider=github -c.publish.owner=getferdi -c.publish.repo=nightlies
diff --git a/build-helpers/notarize.js b/build-helpers/notarize.js
index fc463f749..cb83808ad 100644
--- a/build-helpers/notarize.js
+++ b/build-helpers/notarize.js
@@ -2,7 +2,7 @@ const { notarize } = require("electron-notarize");
2 2
3exports.default = async function notarizing(context) { 3exports.default = async function notarizing(context) {
4 const { electronPlatformName, appOutDir } = context; 4 const { electronPlatformName, appOutDir } = context;
5 if (electronPlatformName !== "darwin" || process.env.TRAVIS_BRANCH !== 'release') { 5 if (electronPlatformName !== "darwin" || (process.env.TRAVIS_BRANCH !== 'release' && process.env.TRAVIS_BRANCH !== 'nightly')) {
6 return; 6 return;
7 } 7 }
8 8
diff --git a/package-lock.json b/package-lock.json
index 65294a3a6..c3d3e2474 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "ferdi", 2 "name": "ferdi",
3 "version": "5.5.0", 3 "version": "5.5.1-nightly.13",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
@@ -4403,6 +4403,11 @@
4403 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", 4403 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
4404 "dev": true 4404 "dev": true
4405 }, 4405 },
4406 "@nornagon/put": {
4407 "version": "0.0.8",
4408 "resolved": "https://registry.npmjs.org/@nornagon/put/-/put-0.0.8.tgz",
4409 "integrity": "sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow=="
4410 },
4406 "@octokit/endpoint": { 4411 "@octokit/endpoint": {
4407 "version": "5.5.1", 4412 "version": "5.5.1",
4408 "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz", 4413 "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz",
@@ -5140,6 +5145,16 @@
5140 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 5145 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
5141 "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 5146 "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
5142 }, 5147 },
5148 "abstract-socket": {
5149 "version": "2.1.1",
5150 "resolved": "https://registry.npmjs.org/abstract-socket/-/abstract-socket-2.1.1.tgz",
5151 "integrity": "sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==",
5152 "optional": true,
5153 "requires": {
5154 "bindings": "^1.2.1",
5155 "nan": "^2.12.1"
5156 }
5157 },
5143 "accepts": { 5158 "accepts": {
5144 "version": "1.0.7", 5159 "version": "1.0.7",
5145 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", 5160 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz",
@@ -9134,6 +9149,21 @@
9134 "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", 9149 "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
9135 "dev": true 9150 "dev": true
9136 }, 9151 },
9152 "dbus-next": {
9153 "version": "0.8.2",
9154 "resolved": "https://registry.npmjs.org/dbus-next/-/dbus-next-0.8.2.tgz",
9155 "integrity": "sha512-E2wkbhZzzsgmY+jxIdeuhA1nVT697I5koRIRJTk3doTeukwtzqSFG89RC5XK8OsLG/eHDZ8PVNptUuEPkhdPbA==",
9156 "requires": {
9157 "@nornagon/put": "0.0.8",
9158 "abstract-socket": "^2.0.0",
9159 "event-stream": "3.3.4",
9160 "hexy": "^0.2.10",
9161 "jsbi": "^2.0.5",
9162 "long": "^4.0.0",
9163 "safe-buffer": "^5.1.1",
9164 "xml2js": "^0.4.17"
9165 }
9166 },
9137 "debug": { 9167 "debug": {
9138 "version": "4.1.1", 9168 "version": "4.1.1",
9139 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 9169 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -11452,6 +11482,30 @@
11452 "resolved": "https://registry.npmjs.org/event-kit/-/event-kit-2.5.3.tgz", 11482 "resolved": "https://registry.npmjs.org/event-kit/-/event-kit-2.5.3.tgz",
11453 "integrity": "sha512-b7Qi1JNzY4BfAYfnIRanLk0DOD1gdkWHT4GISIn8Q2tAf3LpU8SP2CMwWaq40imYoKWbtN4ZhbSRxvsnikooZQ==" 11483 "integrity": "sha512-b7Qi1JNzY4BfAYfnIRanLk0DOD1gdkWHT4GISIn8Q2tAf3LpU8SP2CMwWaq40imYoKWbtN4ZhbSRxvsnikooZQ=="
11454 }, 11484 },
11485 "event-stream": {
11486 "version": "3.3.4",
11487 "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
11488 "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
11489 "requires": {
11490 "duplexer": "~0.1.1",
11491 "from": "~0",
11492 "map-stream": "~0.1.0",
11493 "pause-stream": "0.0.11",
11494 "split": "0.3",
11495 "stream-combiner": "~0.0.4",
11496 "through": "~2.3.1"
11497 },
11498 "dependencies": {
11499 "split": {
11500 "version": "0.3.3",
11501 "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
11502 "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
11503 "requires": {
11504 "through": "2"
11505 }
11506 }
11507 }
11508 },
11455 "eventemitter2": { 11509 "eventemitter2": {
11456 "version": "5.0.1", 11510 "version": "5.0.1",
11457 "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", 11511 "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
@@ -12426,6 +12480,11 @@
12426 "integrity": "sha1-lzHc9WeMf660T7kDxPct9VGH+nc=", 12480 "integrity": "sha1-lzHc9WeMf660T7kDxPct9VGH+nc=",
12427 "dev": true 12481 "dev": true
12428 }, 12482 },
12483 "from": {
12484 "version": "0.1.7",
12485 "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
12486 "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4="
12487 },
12429 "from2": { 12488 "from2": {
12430 "version": "2.3.0", 12489 "version": "2.3.0",
12431 "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 12490 "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
@@ -13985,13 +14044,13 @@
13985 } 14044 }
13986 }, 14045 },
13987 "globule": { 14046 "globule": {
13988 "version": "1.2.1", 14047 "version": "1.3.1",
13989 "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", 14048 "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz",
13990 "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", 14049 "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==",
13991 "dev": true, 14050 "dev": true,
13992 "requires": { 14051 "requires": {
13993 "glob": "~7.1.1", 14052 "glob": "~7.1.1",
13994 "lodash": "~4.17.10", 14053 "lodash": "~4.17.12",
13995 "minimatch": "~3.0.2" 14054 "minimatch": "~3.0.2"
13996 } 14055 }
13997 }, 14056 },
@@ -15628,6 +15687,11 @@
15628 "resolved": "https://registry.npmjs.org/hex-to-rgba/-/hex-to-rgba-1.0.2.tgz", 15687 "resolved": "https://registry.npmjs.org/hex-to-rgba/-/hex-to-rgba-1.0.2.tgz",
15629 "integrity": "sha512-fL+4NFccs86iOuDnFl1Mhyn471qTPAkpE7k39+JYGPMB3+S9LoUnauQI2nz6BUb3DpYQCx8RqENbaf8IFdKYOg==" 15688 "integrity": "sha512-fL+4NFccs86iOuDnFl1Mhyn471qTPAkpE7k39+JYGPMB3+S9LoUnauQI2nz6BUb3DpYQCx8RqENbaf8IFdKYOg=="
15630 }, 15689 },
15690 "hexy": {
15691 "version": "0.2.11",
15692 "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz",
15693 "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A=="
15694 },
15631 "history": { 15695 "history": {
15632 "version": "3.3.0", 15696 "version": "3.3.0",
15633 "resolved": "https://registry.npmjs.org/history/-/history-3.3.0.tgz", 15697 "resolved": "https://registry.npmjs.org/history/-/history-3.3.0.tgz",
@@ -16098,9 +16162,9 @@
16098 "dev": true 16162 "dev": true
16099 }, 16163 },
16100 "in-publish": { 16164 "in-publish": {
16101 "version": "2.0.0", 16165 "version": "2.0.1",
16102 "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", 16166 "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
16103 "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", 16167 "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
16104 "dev": true 16168 "dev": true
16105 }, 16169 },
16106 "indefinite-observable": { 16170 "indefinite-observable": {
@@ -17465,9 +17529,9 @@
17465 } 17529 }
17466 }, 17530 },
17467 "js-base64": { 17531 "js-base64": {
17468 "version": "2.5.1", 17532 "version": "2.5.2",
17469 "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", 17533 "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz",
17470 "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", 17534 "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==",
17471 "dev": true 17535 "dev": true
17472 }, 17536 },
17473 "js-levenshtein": { 17537 "js-levenshtein": {
@@ -17490,6 +17554,11 @@
17490 "esprima": "^4.0.0" 17554 "esprima": "^4.0.0"
17491 } 17555 }
17492 }, 17556 },
17557 "jsbi": {
17558 "version": "2.0.5",
17559 "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-2.0.5.tgz",
17560 "integrity": "sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ=="
17561 },
17493 "jsbn": { 17562 "jsbn": {
17494 "version": "0.1.1", 17563 "version": "0.1.1",
17495 "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 17564 "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@@ -18507,6 +18576,11 @@
18507 "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", 18576 "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==",
18508 "dev": true 18577 "dev": true
18509 }, 18578 },
18579 "long": {
18580 "version": "4.0.0",
18581 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
18582 "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
18583 },
18510 "longest": { 18584 "longest": {
18511 "version": "1.0.1", 18585 "version": "1.0.1",
18512 "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 18586 "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
@@ -18826,6 +18900,11 @@
18826 "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", 18900 "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
18827 "dev": true 18901 "dev": true
18828 }, 18902 },
18903 "map-stream": {
18904 "version": "0.1.0",
18905 "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
18906 "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ="
18907 },
18829 "map-visit": { 18908 "map-visit": {
18830 "version": "1.0.0", 18909 "version": "1.0.0",
18831 "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 18910 "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
@@ -20083,9 +20162,9 @@
20083 } 20162 }
20084 }, 20163 },
20085 "node-sass": { 20164 "node-sass": {
20086 "version": "4.13.0", 20165 "version": "4.14.0",
20087 "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", 20166 "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz",
20088 "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", 20167 "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==",
20089 "dev": true, 20168 "dev": true,
20090 "requires": { 20169 "requires": {
20091 "async-foreach": "^0.1.3", 20170 "async-foreach": "^0.1.3",
@@ -20215,9 +20294,9 @@
20215 } 20294 }
20216 }, 20295 },
20217 "minimist": { 20296 "minimist": {
20218 "version": "1.2.0", 20297 "version": "1.2.5",
20219 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 20298 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
20220 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 20299 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
20221 "dev": true 20300 "dev": true
20222 }, 20301 },
20223 "node-gyp": { 20302 "node-gyp": {
@@ -21352,6 +21431,14 @@
21352 "pify": "^3.0.0" 21431 "pify": "^3.0.0"
21353 } 21432 }
21354 }, 21433 },
21434 "pause-stream": {
21435 "version": "0.0.11",
21436 "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
21437 "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
21438 "requires": {
21439 "through": "~2.3"
21440 }
21441 },
21355 "pbkdf2": { 21442 "pbkdf2": {
21356 "version": "3.0.17", 21443 "version": "3.0.17",
21357 "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 21444 "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
@@ -24896,9 +24983,9 @@
24896 }, 24983 },
24897 "dependencies": { 24984 "dependencies": {
24898 "readable-stream": { 24985 "readable-stream": {
24899 "version": "2.3.6", 24986 "version": "2.3.7",
24900 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 24987 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
24901 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 24988 "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
24902 "dev": true, 24989 "dev": true,
24903 "requires": { 24990 "requires": {
24904 "core-util-is": "~1.0.0", 24991 "core-util-is": "~1.0.0",
@@ -24975,6 +25062,14 @@
24975 } 25062 }
24976 } 25063 }
24977 }, 25064 },
25065 "stream-combiner": {
25066 "version": "0.0.4",
25067 "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
25068 "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
25069 "requires": {
25070 "duplexer": "~0.1.1"
25071 }
25072 },
24978 "stream-each": { 25073 "stream-each": {
24979 "version": "1.2.3", 25074 "version": "1.2.3",
24980 "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 25075 "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
@@ -27873,6 +27968,20 @@
27873 "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", 27968 "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
27874 "dev": true 27969 "dev": true
27875 }, 27970 },
27971 "xml2js": {
27972 "version": "0.4.23",
27973 "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
27974 "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
27975 "requires": {
27976 "sax": ">=0.6.0",
27977 "xmlbuilder": "~11.0.0"
27978 }
27979 },
27980 "xmlbuilder": {
27981 "version": "11.0.1",
27982 "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
27983 "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
27984 },
27876 "xmlhttprequest": { 27985 "xmlhttprequest": {
27877 "version": "1.8.0", 27986 "version": "1.8.0",
27878 "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 27987 "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
diff --git a/package.json b/package.json
index 01b902bc0..0abb3bb7d 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,9 @@
1{ 1{
2 "name": "ferdi", 2 "name": "ferdi",
3 "productName": "Ferdi", 3 "productName": "Ferdi",
4 "desktopName": "ferdi.desktop",
4 "appId": "com.kytwb.ferdi", 5 "appId": "com.kytwb.ferdi",
5 "version": "5.5.0", 6 "version": "5.6.0-beta.1",
6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.", 7 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.",
7 "copyright": "kytwb", 8 "copyright": "kytwb",
8 "main": "index.js", 9 "main": "index.js",
@@ -67,6 +68,7 @@
67 "cld3-asm": "1.0.1", 68 "cld3-asm": "1.0.1",
68 "css": "2.2.4", 69 "css": "2.2.4",
69 "darkreader": "4.7.15", 70 "darkreader": "4.7.15",
71 "dbus-next": "0.8.2",
70 "du": "^0.1.0", 72 "du": "^0.1.0",
71 "electron-dl": "1.14.0", 73 "electron-dl": "1.14.0",
72 "electron-fetch": "1.4.0", 74 "electron-fetch": "1.4.0",
@@ -184,7 +186,7 @@
184 "lerna": "3.19.0", 186 "lerna": "3.19.0",
185 "mobx-react-devtools": "6.1.1", 187 "mobx-react-devtools": "6.1.1",
186 "mocha": "5.2.0", 188 "mocha": "5.2.0",
187 "node-sass": "4.13.0", 189 "node-sass": "4.14.0",
188 "prettier": "1.19.1", 190 "prettier": "1.19.1",
189 "react-intl-translations-manager": "5.0.3", 191 "react-intl-translations-manager": "5.0.3",
190 "terser-webpack-plugin": "1.2.1", 192 "terser-webpack-plugin": "1.2.1",
diff --git a/src/app.js b/src/app.js
index 0e24420c3..aab1729d7 100644
--- a/src/app.js
+++ b/src/app.js
@@ -5,7 +5,7 @@ import { render } from 'react-dom';
5import { Provider } from 'mobx-react'; 5import { Provider } from 'mobx-react';
6import { syncHistoryWithStore, RouterStore } from 'mobx-react-router'; 6import { syncHistoryWithStore, RouterStore } from 'mobx-react-router';
7import { 7import {
8 Router, Route, hashHistory, IndexRedirect, 8 hashHistory,
9} from 'react-router'; 9} from 'react-router';
10 10
11import '@babel/polyfill'; 11import '@babel/polyfill';
@@ -20,33 +20,7 @@ import MenuFactory from './lib/Menu';
20import TouchBarFactory from './lib/TouchBar'; 20import TouchBarFactory from './lib/TouchBar';
21 21
22import I18N from './I18n'; 22import I18N from './I18n';
23import AppLayoutContainer from './containers/layout/AppLayoutContainer'; 23import Routes from './routes';
24import SettingsWindow from './containers/settings/SettingsWindow';
25import RecipesScreen from './containers/settings/RecipesScreen';
26import ServicesScreen from './containers/settings/ServicesScreen';
27import EditServiceScreen from './containers/settings/EditServiceScreen';
28import AccountScreen from './containers/settings/AccountScreen';
29import TeamScreen from './containers/settings/TeamScreen';
30import EditUserScreen from './containers/settings/EditUserScreen';
31import EditSettingsScreen from './containers/settings/EditSettingsScreen';
32import InviteSettingsScreen from './containers/settings/InviteScreen';
33import SupportFerdiScreen from './containers/settings/SupportScreen';
34import WelcomeScreen from './containers/auth/WelcomeScreen';
35import LoginScreen from './containers/auth/LoginScreen';
36import LockedScreen from './containers/auth/LockedScreen';
37import PasswordScreen from './containers/auth/PasswordScreen';
38import ChangeServerScreen from './containers/auth/ChangeServerScreen';
39import SignupScreen from './containers/auth/SignupScreen';
40import ImportScreen from './containers/auth/ImportScreen';
41import PricingScreen from './containers/auth/PricingScreen';
42import InviteScreen from './containers/auth/InviteScreen';
43import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
44import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
45import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
46import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
47import { WORKSPACES_ROUTES } from './features/workspaces';
48import AnnouncementScreen from './features/announcements/components/AnnouncementScreen';
49import { ANNOUNCEMENTS_ROUTES } from './features/announcements';
50 24
51// Add Polyfills 25// Add Polyfills
52smoothScroll.polyfill(); 26smoothScroll.polyfill();
@@ -74,44 +48,7 @@ window.addEventListener('load', () => {
74 const preparedApp = ( 48 const preparedApp = (
75 <Provider stores={stores} actions={actions}> 49 <Provider stores={stores} actions={actions}>
76 <I18N> 50 <I18N>
77 <Router history={history}> 51 <Routes history={history} />
78 <Route path="/" component={AppLayoutContainer}>
79 <Route path={ANNOUNCEMENTS_ROUTES.TARGET} component={AnnouncementScreen} />
80 <Route path="/settings" component={SettingsWindow}>
81 <IndexRedirect to="/settings/recipes" />
82 <Route path="/settings/recipes" component={RecipesScreen} />
83 <Route path="/settings/recipes/:filter" component={RecipesScreen} />
84 <Route path="/settings/services" component={ServicesScreen} />
85 <Route path="/settings/services/:action/:id" component={EditServiceScreen} />
86 <Route path={WORKSPACES_ROUTES.ROOT} component={WorkspacesScreen} />
87 <Route path={WORKSPACES_ROUTES.EDIT} component={EditWorkspaceScreen} />
88 <Route path="/settings/user" component={AccountScreen} />
89 <Route path="/settings/user/edit" component={EditUserScreen} />
90 <Route path="/settings/team" component={TeamScreen} />
91 <Route path="/settings/app" component={EditSettingsScreen} />
92 <Route path="/settings/invite" component={InviteSettingsScreen} />
93 <Route path="/settings/support" component={SupportFerdiScreen} />
94 </Route>
95 </Route>
96 <Route path="/auth" component={AuthLayoutContainer}>
97 <IndexRedirect to="/auth/welcome" />
98 <Route path="/auth/welcome" component={WelcomeScreen} />
99 <Route path="/auth/login" component={LoginScreen} />
100 <Route path="/auth/locked" component={LockedScreen} />
101 <Route path="/auth/server" component={ChangeServerScreen} />
102 <Route path="/auth/signup">
103 <IndexRedirect to="/auth/signup/form" />
104 <Route path="/auth/signup/form" component={SignupScreen} />
105 <Route path="/auth/signup/pricing" component={PricingScreen} />
106 <Route path="/auth/signup/import" component={ImportScreen} />
107 <Route path="/auth/signup/invite" component={InviteScreen} />
108 </Route>
109 <Route path="/auth/password" component={PasswordScreen} />
110 <Route path="/auth/logout" component={LoginScreen} />
111 </Route>
112 <Route path="/payment/:url" component={SubscriptionPopupScreen} />
113 <Route path="*" component={AppLayoutContainer} />
114 </Router>
115 </I18N> 52 </I18N>
116 </Provider> 53 </Provider>
117 ); 54 );
diff --git a/src/components/auth/ChangeServer.js b/src/components/auth/ChangeServer.js
index 433334b6c..68c2303a4 100644
--- a/src/components/auth/ChangeServer.js
+++ b/src/components/auth/ChangeServer.js
@@ -2,10 +2,12 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5
6import Form from '../../lib/Form'; 5import Form from '../../lib/Form';
7import Input from '../ui/Input'; 6import Input from '../ui/Input';
7import Select from '../ui/Select';
8import Button from '../ui/Button'; 8import Button from '../ui/Button';
9import Infobox from '../ui/Infobox';
10import { url, required } from '../../helpers/validation-helpers';
9 11
10const messages = defineMessages({ 12const messages = defineMessages({
11 headline: { 13 headline: {
@@ -16,10 +18,23 @@ const messages = defineMessages({
16 id: 'changeserver.label', 18 id: 'changeserver.label',
17 defaultMessage: '!!!Server', 19 defaultMessage: '!!!Server',
18 }, 20 },
21 warning: {
22 id: 'changeserver.warning',
23 defaultMessage: '!!!Extra settings offered by Ferdi will not be saved',
24 },
25 customServerLabel: {
26 id: 'changeserver.customServerLabel',
27 defaultMessage: '!!!Custom server',
28 },
29 urlError: {
30 id: 'changeserver.urlError',
31 defaultMessage: '!!!Enter a valid URL',
32 },
19 submit: { 33 submit: {
20 id: 'changeserver.submit', 34 id: 'changeserver.submit',
21 defaultMessage: '!!!Submit', 35 defaultMessage: '!!!Submit',
22 }, 36 },
37
23}); 38});
24 39
25export default @observer class ChangeServer extends Component { 40export default @observer class ChangeServer extends Component {
@@ -32,42 +47,75 @@ export default @observer class ChangeServer extends Component {
32 intl: intlShape, 47 intl: intlShape,
33 }; 48 };
34 49
50 ferdiServer='https://api.getferdi.com';
51
52 franzServer='https://api.franzinfra.com';
53
54 defaultServers=[this.franzServer, this.ferdiServer];
55
35 form = new Form({ 56 form = new Form({
36 fields: { 57 fields: {
37 server: { 58 server: {
38 label: this.context.intl.formatMessage(messages.label), 59 label: this.context.intl.formatMessage(messages.label),
60 value: this.props.server,
61 options: [{ value: this.ferdiServer, label: 'Ferdi' }, { value: this.franzServer, label: 'Franz' }, { value: this.defaultServers.includes(this.props.server) ? '' : this.props.server, label: 'Custom' }],
62 },
63 customServer: {
64 label: this.context.intl.formatMessage(messages.customServerLabel),
39 value: '', 65 value: '',
66 validators: [url, required],
40 }, 67 },
41 }, 68 },
42 }, this.context.intl); 69 }, this.context.intl);
43 70
44 componentDidMount() { 71 componentDidMount() {
45 this.form.$('server').value = this.props.server; 72 if (this.defaultServers.includes(this.props.server)) {
73 this.form.$('server').value = this.props.server;
74 } else {
75 this.form.$('server').value = '';
76 this.form.$('customServer').value = this.props.server;
77 }
46 } 78 }
47 79
48 submit(e) { 80 submit(e) {
49 e.preventDefault(); 81 e.preventDefault();
50 this.form.submit({ 82 this.form.submit({
51 onSuccess: (form) => { 83 onSuccess: (form) => {
84 if (!this.defaultServers.includes(form.values().server)) {
85 form.$('server').onChange(form.values().customServer);
86 }
52 this.props.onSubmit(form.values()); 87 this.props.onSubmit(form.values());
53 }, 88 },
54 onError: () => { }, 89 onError: (form) => {
90 if (this.defaultServers.includes(form.values().server)) {
91 this.props.onSubmit(form.values());
92 }
93 },
55 }); 94 });
56 } 95 }
57 96
58 render() { 97 render() {
59 const { form } = this; 98 const { form } = this;
60 const { intl } = this.context; 99 const { intl } = this.context;
61
62 return ( 100 return (
63 <div className="auth__container"> 101 <div className="auth__container">
64 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 102 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}>
65 <h1>{intl.formatMessage(messages.headline)}</h1> 103 <h1>{intl.formatMessage(messages.headline)}</h1>
66 104 {form.$('server').value === this.franzServer
67 <Input 105 && (
68 field={form.$('server')} 106 <Infobox type="warning">
69 focus 107 {intl.formatMessage(messages.warning)}
70 /> 108 </Infobox>
109 )}
110 <Select field={form.$('server')} />
111 {!this.defaultServers.includes(form.$('server').value)
112 && (
113 <Input
114 placeholder="Custom Server"
115 onChange={e => this.submit(e)}
116 field={form.$('customServer')}
117 />
118 )}
71 <Button 119 <Button
72 type="submit" 120 type="submit"
73 className="auth__button" 121 className="auth__button"
diff --git a/src/components/auth/Locked.js b/src/components/auth/Locked.js
index 6142e78c6..c5e8a5aad 100644
--- a/src/components/auth/Locked.js
+++ b/src/components/auth/Locked.js
@@ -8,6 +8,7 @@ import Form from '../../lib/Form';
8import Input from '../ui/Input'; 8import Input from '../ui/Input';
9import Button from '../ui/Button'; 9import Button from '../ui/Button';
10import Infobox from '../ui/Infobox'; 10import Infobox from '../ui/Infobox';
11import { isMac } from '../../environment';
11 12
12import { globalError as globalErrorPropType } from '../../prop-types'; 13import { globalError as globalErrorPropType } from '../../prop-types';
13 14
@@ -100,7 +101,7 @@ export default @observer class Locked extends Component {
100 useTouchIdToUnlock, 101 useTouchIdToUnlock,
101 } = this.props; 102 } = this.props;
102 103
103 const touchIdEnabled = useTouchIdToUnlock && systemPreferences.canPromptTouchID(); 104 const touchIdEnabled = isMac ? (useTouchIdToUnlock && systemPreferences.canPromptTouchID()) : false;
104 const submitButtonLabel = touchIdEnabled ? intl.formatMessage(messages.unlockWithPassword) : intl.formatMessage(messages.submitButtonLabel); 105 const submitButtonLabel = touchIdEnabled ? intl.formatMessage(messages.unlockWithPassword) : intl.formatMessage(messages.submitButtonLabel);
105 106
106 return ( 107 return (
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index bd10ccb4a..90bbe86e9 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -6,11 +6,14 @@ import { inject, observer } from 'mobx-react';
6import { Link } from 'react-router'; 6import { Link } from 'react-router';
7 7
8import Tabbar from '../services/tabs/Tabbar'; 8import Tabbar from '../services/tabs/Tabbar';
9import { ctrlKey } from '../../environment'; 9import { ctrlKey, isMac } from '../../environment';
10import { workspaceStore } from '../../features/workspaces'; 10import { workspaceStore } from '../../features/workspaces';
11import { todosStore } from '../../features/todos'; 11import { todosStore } from '../../features/todos';
12import { todoActions } from '../../features/todos/actions'; 12import { todoActions } from '../../features/todos/actions';
13 13
14// Platform specific shortcut keys
15const settingsShortcutKey = isMac ? ',' : 'P';
16
14const messages = defineMessages({ 17const messages = defineMessages({
15 settings: { 18 settings: {
16 id: 'sidebar.settings', 19 id: 'sidebar.settings',
@@ -189,7 +192,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
189 type="button" 192 type="button"
190 onClick={() => openSettings({ path: 'app' })} 193 onClick={() => openSettings({ path: 'app' })}
191 className="sidebar__button sidebar__button--settings" 194 className="sidebar__button sidebar__button--settings"
192 data-tip={`${intl.formatMessage(messages.settings)} (${ctrlKey}+,)`} 195 data-tip={`${intl.formatMessage(messages.settings)} (${ctrlKey}+${settingsShortcutKey})`}
193 > 196 >
194 <i className="mdi mdi-settings" /> 197 <i className="mdi mdi-settings" />
195 { (this.props.stores.app.updateStatus === this.props.stores.app.updateStatusTypes.AVAILABLE 198 { (this.props.stores.app.updateStatus === this.props.stores.app.updateStatusTypes.AVAILABLE
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index 210a6ab6b..2e3354279 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -79,7 +79,7 @@ class ServiceWebview extends Component {
79 }} 79 }}
80 onUpdateTargetUrl={this.updateTargetUrl} 80 onUpdateTargetUrl={this.updateTargetUrl}
81 useragent={service.userAgent} 81 useragent={service.userAgent}
82 disablewebsecurity={service.recipe.disablewebsecurity} 82 disablewebsecurity={service.recipe.disablewebsecurity ? true : undefined}
83 allowpopups 83 allowpopups
84 /> 84 />
85 ); 85 );
diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js
index ea7a66a62..efa5fa60c 100644
--- a/src/components/services/tabs/TabItem.js
+++ b/src/components/services/tabs/TabItem.js
@@ -7,7 +7,7 @@ import classnames from 'classnames';
7import { SortableElement } from 'react-sortable-hoc'; 7import { SortableElement } from 'react-sortable-hoc';
8 8
9import ServiceModel from '../../../models/Service'; 9import ServiceModel from '../../../models/Service';
10import { isDevMode, ctrlKey } from '../../../environment'; 10import { ctrlKey } from '../../../environment';
11 11
12const { Menu } = remote; 12const { Menu } = remote;
13 13
@@ -119,14 +119,10 @@ class TabItem extends Component {
119 click: () => (service.isEnabled ? disableService() : enableService()), 119 click: () => (service.isEnabled ? disableService() : enableService()),
120 }, { 120 }, {
121 type: 'separator', 121 type: 'separator',
122 }, {
123 label: intl.formatMessage(messages.deleteService),
124 click: () => deleteService(),
122 }]; 125 }];
123
124 if (isDevMode) {
125 menuTemplate.push({
126 label: intl.formatMessage(messages.deleteService),
127 click: () => deleteService(),
128 });
129 }
130 const menu = Menu.buildFromTemplate(menuTemplate); 126 const menu = Menu.buildFromTemplate(menuTemplate);
131 127
132 let notificationBadge = null; 128 let notificationBadge = null;
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 8faea708b..50358c36f 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -367,7 +367,7 @@ export default @observer class EditSettingsForm extends Component {
367 <Toggle field={form.$('lockingFeatureEnabled')} /> 367 <Toggle field={form.$('lockingFeatureEnabled')} />
368 {lockingFeatureEnabled && ( 368 {lockingFeatureEnabled && (
369 <> 369 <>
370 {systemPreferences.canPromptTouchID() && ( 370 {isMac && systemPreferences.canPromptTouchID() && (
371 <Toggle field={form.$('useTouchIdToUnlock')} /> 371 <Toggle field={form.$('useTouchIdToUnlock')} />
372 )} 372 )}
373 373
diff --git a/src/config.js b/src/config.js
index 2467ab706..b8af16419 100644
--- a/src/config.js
+++ b/src/config.js
@@ -60,6 +60,7 @@ export const TODO_APPS = {
60 'https://app.nozbe.com/#login': 'Nozbe', 60 'https://app.nozbe.com/#login': 'Nozbe',
61 'https://www.rememberthemilk.com/login/': 'Remember The Milk', 61 'https://www.rememberthemilk.com/login/': 'Remember The Milk',
62 'https://desktop.any.do/': 'Any.do', 62 'https://desktop.any.do/': 'Any.do',
63 'https://tasks.google.com/embed/?origin=https%3A%2F%2Fcalendar.google.com&fullWidth=1': 'Google Tasks',
63 isUsingCustomTodoService: 'Other service', 64 isUsingCustomTodoService: 'Other service',
64}; 65};
65 66
diff --git a/src/containers/auth/LockedScreen.js b/src/containers/auth/LockedScreen.js
index aced64a98..a04107072 100644
--- a/src/containers/auth/LockedScreen.js
+++ b/src/containers/auth/LockedScreen.js
@@ -4,13 +4,9 @@ import { inject, observer } from 'mobx-react';
4import Locked from '../../components/auth/Locked'; 4import Locked from '../../components/auth/Locked';
5import SettingsStore from '../../stores/SettingsStore'; 5import SettingsStore from '../../stores/SettingsStore';
6 6
7import { globalError as globalErrorPropType } from '../../prop-types'; 7import { hash } from '../../helpers/password-helpers';
8 8
9export default @inject('stores', 'actions') @observer class LockedScreen extends Component { 9export default @inject('stores', 'actions') @observer class LockedScreen extends Component {
10 static propTypes = {
11 error: globalErrorPropType.isRequired,
12 };
13
14 state = { 10 state = {
15 error: false, 11 error: false,
16 } 12 }
@@ -30,7 +26,7 @@ export default @inject('stores', 'actions') @observer class LockedScreen extends
30 correctPassword = ''; 26 correctPassword = '';
31 } 27 }
32 28
33 if (String(password) === String(correctPassword)) { 29 if (hash(String(password)) === String(correctPassword)) {
34 this.props.actions.settings.update({ 30 this.props.actions.settings.update({
35 type: 'app', 31 type: 'app',
36 data: { 32 data: {
@@ -56,17 +52,23 @@ export default @inject('stores', 'actions') @observer class LockedScreen extends
56 } 52 }
57 53
58 render() { 54 render() {
59 const { stores, error } = this.props; 55 const { stores } = this.props;
60 const { useTouchIdToUnlock } = this.props.stores.settings.all.app; 56 const { useTouchIdToUnlock } = this.props.stores.settings.all.app;
61 57
62 return ( 58 return (
63 <Locked 59 <div className="auth">
64 onSubmit={this.onSubmit} 60 <div className="auth__layout">
65 unlock={this.unlock} 61 <div className="auth__container">
66 useTouchIdToUnlock={useTouchIdToUnlock} 62 <Locked
67 isSubmitting={stores.user.loginRequest.isExecuting} 63 onSubmit={this.onSubmit}
68 error={this.state.error || error} 64 unlock={this.unlock}
69 /> 65 useTouchIdToUnlock={useTouchIdToUnlock}
66 isSubmitting={stores.user.loginRequest.isExecuting}
67 error={this.state.error || {}}
68 />
69 </div>
70 </div>
71 </div>
70 ); 72 );
71 } 73 }
72} 74}
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index f6c2d4360..3dba3bc11 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -16,6 +16,7 @@ import {
16import { config as spellcheckerConfig } from '../../features/spellchecker'; 16import { config as spellcheckerConfig } from '../../features/spellchecker';
17 17
18import { getSelectOptions } from '../../helpers/i18n-helpers'; 18import { getSelectOptions } from '../../helpers/i18n-helpers';
19import { hash } from '../../helpers/password-helpers';
19 20
20import EditSettingsForm from '../../components/settings/settings/EditSettingsForm'; 21import EditSettingsForm from '../../components/settings/settings/EditSettingsForm';
21import ErrorBoundary from '../../components/util/ErrorBoundary'; 22import ErrorBoundary from '../../components/util/ErrorBoundary';
@@ -185,6 +186,14 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
185 intl: intlShape, 186 intl: intlShape,
186 }; 187 };
187 188
189 constructor(props) {
190 super(props);
191
192 this.state = {
193 lockedPassword: '',
194 };
195 }
196
188 onSubmit(settingsData) { 197 onSubmit(settingsData) {
189 const { todos, workspaces } = this.props.stores; 198 const { todos, workspaces } = this.props.stores;
190 const { 199 const {
@@ -195,6 +204,10 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
195 workspaces: workspaceActions, 204 workspaces: workspaceActions,
196 } = this.props.actions; 205 } = this.props.actions;
197 206
207 this.setState({
208 lockedPassword: settingsData.lockedPassword,
209 });
210
198 app.launchOnStartup({ 211 app.launchOnStartup({
199 enable: settingsData.autoLaunchOnStart, 212 enable: settingsData.autoLaunchOnStart,
200 openInBackground: settingsData.autoLaunchInBackground, 213 openInBackground: settingsData.autoLaunchInBackground,
@@ -217,7 +230,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
217 predefinedTodoServer: settingsData.predefinedTodoServer, 230 predefinedTodoServer: settingsData.predefinedTodoServer,
218 customTodoServer: settingsData.customTodoServer, 231 customTodoServer: settingsData.customTodoServer,
219 lockingFeatureEnabled: settingsData.lockingFeatureEnabled, 232 lockingFeatureEnabled: settingsData.lockingFeatureEnabled,
220 lockedPassword: settingsData.lockedPassword, 233 lockedPassword: hash(String(settingsData.lockedPassword)),
221 useTouchIdToUnlock: settingsData.useTouchIdToUnlock, 234 useTouchIdToUnlock: settingsData.useTouchIdToUnlock,
222 inactivityLock: settingsData.inactivityLock, 235 inactivityLock: settingsData.inactivityLock,
223 scheduledDNDEnabled: settingsData.scheduledDNDEnabled, 236 scheduledDNDEnabled: settingsData.scheduledDNDEnabled,
@@ -273,6 +286,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
273 app, settings, user, todos, workspaces, 286 app, settings, user, todos, workspaces,
274 } = this.props.stores; 287 } = this.props.stores;
275 const { intl } = this.context; 288 const { intl } = this.context;
289 const { lockedPassword } = this.state;
276 290
277 const locales = getSelectOptions({ 291 const locales = getSelectOptions({
278 locales: APP_LOCALES, 292 locales: APP_LOCALES,
@@ -395,7 +409,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
395 }, 409 },
396 lockedPassword: { 410 lockedPassword: {
397 label: intl.formatMessage(messages.lockPassword), 411 label: intl.formatMessage(messages.lockPassword),
398 value: settings.all.app.lockedPassword, 412 value: lockedPassword,
399 default: '', 413 default: '',
400 type: 'password', 414 type: 'password',
401 }, 415 },
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index 2626186e9..c612702b0 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -12,15 +12,19 @@ import SettingsStore from '../../../stores/SettingsStore';
12import Appear from '../../../components/ui/effects/Appear'; 12import Appear from '../../../components/ui/effects/Appear';
13import UpgradeButton from '../../../components/ui/UpgradeButton'; 13import UpgradeButton from '../../../components/ui/UpgradeButton';
14 14
15import userAgent from '../../../helpers/userAgent-helpers';
16
15// NOTE: https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url 17// NOTE: https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url
16function validURL(str) { 18function validURL(str) {
17 const pattern = new RegExp('^(https?:\\/\\/)?' // protocol 19 let url;
18 + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' // domain name 20
19 + '((\\d{1,3}\\.){3}\\d{1,3}))' // OR ip (v4) address 21 try {
20 + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' // port and path 22 url = new URL(str);
21 + '(\\?[;&a-z\\d%_.~+=-]*)?' // query string 23 } catch (_) {
22 + '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator 24 return false;
23 return !!pattern.test(str); 25 }
26
27 return url.protocol === 'http:' || url.protocol === 'https:';
24} 28}
25 29
26const messages = defineMessages({ 30const messages = defineMessages({
@@ -126,6 +130,11 @@ class TodosWebview extends Component {
126 this.node.addEventListener('mousemove', this.resizePanel.bind(this)); 130 this.node.addEventListener('mousemove', this.resizePanel.bind(this));
127 this.node.addEventListener('mouseup', this.stopResize.bind(this)); 131 this.node.addEventListener('mouseup', this.stopResize.bind(this));
128 this.node.addEventListener('mouseleave', this.stopResize.bind(this)); 132 this.node.addEventListener('mouseleave', this.stopResize.bind(this));
133
134 const webViewInstance = this;
135 this.webview.addEventListener('dom-ready', () => {
136 webViewInstance.webview.setUserAgent(userAgent(true));
137 });
129 } 138 }
130 139
131 startResize = (event) => { 140 startResize = (event) => {
diff --git a/src/helpers/userAgent-helpers.js b/src/helpers/userAgent-helpers.js
index 15edc1054..7b994c7d4 100644
--- a/src/helpers/userAgent-helpers.js
+++ b/src/helpers/userAgent-helpers.js
@@ -9,7 +9,6 @@ const ferdiVersion = remote && remote.app ? remote.app.getVersion() : app.getVer
9 9
10function macOS() { 10function macOS() {
11 const version = macosVersion(); 11 const version = macosVersion();
12
13 return `Macintosh; Intel Mac OS X ${version.replace(/\./g, '_')}`; 12 return `Macintosh; Intel Mac OS X ${version.replace(/\./g, '_')}`;
14} 13}
15 14
@@ -20,7 +19,7 @@ function windows() {
20} 19}
21 20
22function linux() { 21function linux() {
23 return 'X11; Ubuntu; Linux x86_64'; 22 return 'X11; Linux x86_64';
24} 23}
25 24
26export default function userAgent(removeChromeVersion = false) { 25export default function userAgent(removeChromeVersion = false) {
@@ -34,12 +33,17 @@ export default function userAgent(removeChromeVersion = false) {
34 platformString = linux(); 33 platformString = linux();
35 } 34 }
36 35
36 let chromeVersion = 'Chrome';
37 if (!removeChromeVersion) {
38 chromeVersion = `Chrome/${process.versions.chrome}`;
39 }
40
37 let applicationString = ''; 41 let applicationString = '';
38 if (!removeChromeVersion) { 42 if (!removeChromeVersion) {
39 applicationString = ` Ferdi/${ferdiVersion} (Electron ${process.versions.electron})`; 43 applicationString = ` Ferdi/${ferdiVersion} Electron/${process.versions.electron}`;
40 } 44 }
41 45
42 // TODO: Update AppleWebKit and Safari version after electron update 46 // Chrome is pinned to WebKit 537.36, the latest version before hard forking to Blink.
43 return `Mozilla/5.0 (${platformString}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome${!removeChromeVersion ? `/${process.versions.chrome}` : ''} Safari/537.36${applicationString}`; 47 return `Mozilla/5.0 (${platformString}) AppleWebKit/537.36 (KHTML, like Gecko) ${chromeVersion} Safari/537.36${applicationString}`;
44 // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) old-airport-include/1.0.0 Chrome Electron/7.1.7 Safari/537.36 48 // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 Ferdi/5.5.1-nightly.13 Electron/8.2.3
45} 49}
diff --git a/src/i18n/locales/af.json b/src/i18n/locales/af.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/af.json
+++ b/src/i18n/locales/af.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json
index 88f970da9..baceec651 100644
--- a/src/i18n/locales/ar.json
+++ b/src/i18n/locales/ar.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "إعادة التحميل", 2 "app.errorHandler.action": "إعادة التحميل",
3 "app.errorHandler.headline": "لقد حدث خطب ما", 3 "app.errorHandler.headline": "لقد حدث خطب ما",
4 "changeserver.customServerLabel": "خادم مخصص",
4 "changeserver.headline": "تغيير الخادم", 5 "changeserver.headline": "تغيير الخادم",
5 "changeserver.label": "خادم", 6 "changeserver.label": "خادم",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "إرسال",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "إعادة تحميل الخدمة", 10 "connectionLostBanner.cta": "إعادة تحميل الخدمة",
8 "connectionLostBanner.informationLink": "ماذا حدث؟", 11 "connectionLostBanner.informationLink": "ماذا حدث؟",
9 "connectionLostBanner.message": "أوه لا! Ùقد Ùردي الاتصال بـ.", 12 "connectionLostBanner.message": "أوه لا! Ùقد Ùردي الاتصال بـ.",
@@ -37,7 +40,7 @@
37 "feature.publishDebugInfo.privacy": "سياسة الخصوصية", 40 "feature.publishDebugInfo.privacy": "سياسة الخصوصية",
38 "feature.publishDebugInfo.publish": "قبول ونشر", 41 "feature.publishDebugInfo.publish": "قبول ونشر",
39 "feature.publishDebugInfo.published": "تم نشر سجل تصحيح الأخطاء الخاص بك وهو متاح الآن ÙÙŠ", 42 "feature.publishDebugInfo.published": "تم نشر سجل تصحيح الأخطاء الخاص بك وهو متاح الآن ÙÙŠ",
40 "feature.publishDebugInfo.terms": "Terms of service", 43 "feature.publishDebugInfo.terms": "بنود الخدمة",
41 "feature.publishDebugInfo.title": "نشر معلومات تصحيح الأخطاء", 44 "feature.publishDebugInfo.title": "نشر معلومات تصحيح الأخطاء",
42 "feature.quickSwitch.info": "حدد خدمة من خلال زر تاب، ↑ Ùˆ ↓. اÙتح الخدمة بالظغط على زر الدخول.", 45 "feature.quickSwitch.info": "حدد خدمة من خلال زر تاب، ↑ Ùˆ ↓. اÙتح الخدمة بالظغط على زر الدخول.",
43 "feature.quickSwitch.search": "بحث...", 46 "feature.quickSwitch.search": "بحث...",
@@ -121,7 +124,7 @@
121 "menu.edit.copy": "نسخ", 124 "menu.edit.copy": "نسخ",
122 "menu.edit.cut": "قص", 125 "menu.edit.cut": "قص",
123 "menu.edit.delete": "حذÙ", 126 "menu.edit.delete": "حذÙ",
124 "menu.edit.emojiSymbols": "Emoji & Symbols", 127 "menu.edit.emojiSymbols": "الابتسامات والرموز التعبيرية",
125 "menu.edit.findInPage": "البحث ÙÙŠ الصÙحة", 128 "menu.edit.findInPage": "البحث ÙÙŠ الصÙحة",
126 "menu.edit.paste": "لصق", 129 "menu.edit.paste": "لصق",
127 "menu.edit.pasteAndMatchStyle": "لصق ومطابقة النمط", 130 "menu.edit.pasteAndMatchStyle": "لصق ومطابقة النمط",
@@ -134,7 +137,7 @@
134 "menu.edit.undo": "تراجع", 137 "menu.edit.undo": "تراجع",
135 "menu.file": "الملÙ", 138 "menu.file": "الملÙ",
136 "menu.help": "مساعدة", 139 "menu.help": "مساعدة",
137 "menu.help.changelog": "سÙجل التغييرات", 140 "menu.help.changelog": "سÙجل التغيرات",
138 "menu.help.debugInfo": "نسخ معلومات تصحيح الأخطاء", 141 "menu.help.debugInfo": "نسخ معلومات تصحيح الأخطاء",
139 "menu.help.debugInfoCopiedBody": "تم نسخ معلومات تصحيح الأخطاء الخاصة بك إلى الحاÙظة.", 142 "menu.help.debugInfoCopiedBody": "تم نسخ معلومات تصحيح الأخطاء الخاصة بك إلى الحاÙظة.",
140 "menu.help.debugInfoCopiedHeadline": "معلومات تصحيح الأخطاء Ù„Ùردي", 143 "menu.help.debugInfoCopiedHeadline": "معلومات تصحيح الأخطاء Ù„Ùردي",
@@ -164,49 +167,49 @@
164 "menu.view.toggleDevTools": "Ùتح أدوات المطور", 167 "menu.view.toggleDevTools": "Ùتح أدوات المطور",
165 "menu.view.toggleFullScreen": "تÙعيل وضع ملء الشاشة", 168 "menu.view.toggleFullScreen": "تÙعيل وضع ملء الشاشة",
166 "menu.view.toggleServiceDevTools": "Ùتح أدوات المطور للخدمة", 169 "menu.view.toggleServiceDevTools": "Ùتح أدوات المطور للخدمة",
167 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 170 "menu.view.toggleTodosDevTools": "ادخل إلى أدوات مطوري تودوس",
168 "menu.view.zoomIn": "Zoom In", 171 "menu.view.zoomIn": "تكبير",
169 "menu.view.zoomOut": "Zoom Out", 172 "menu.view.zoomOut": "تصغير",
170 "menu.window": "Window", 173 "menu.window": "الناÙذة",
171 "menu.window.close": "Close", 174 "menu.window.close": "إغلاق",
172 "menu.window.minimize": "Minimize", 175 "menu.window.minimize": "تصغير الناÙذة",
173 "menu.workspaces": "Workspaces", 176 "menu.workspaces": "مساحات٠العمل",
174 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 177 "menu.workspaces.addNewWorkspace": "إضاÙØ© مساحة عمل جديدة...",
175 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 178 "menu.workspaces.closeWorkspaceDrawer": "غلق٠دÙرج٠مساحة العمل",
176 "menu.workspaces.defaultWorkspace": "All services", 179 "menu.workspaces.defaultWorkspace": "جميع الخدمات",
177 "menu.workspaces.openWorkspaceDrawer": "Open workspace drawer", 180 "menu.workspaces.openWorkspaceDrawer": "Ùتح٠دÙرج٠مساحة العمل",
178 "password.email.label": "البريد الإلكتروني", 181 "password.email.label": "البريد الإلكتروني",
179 "password.headline": "إعادة تعيين كلمة المرور", 182 "password.headline": "إعادة تعيين كلمة المرور",
180 "password.link.login": "Sign in to your account", 183 "password.link.login": "سجل الدخول لحسابك",
181 "password.link.signup": "إنشاء حساب مجاني", 184 "password.link.signup": "إنشاء حساب مجاني",
182 "password.noUser": "No user with that email address was found", 185 "password.noUser": "لم ÙŠÙعثر على Ù…Ùستخدم٠بعنوان٠البريد٠هذا",
183 "password.submit.label": "Submit", 186 "password.submit.label": "إرسال",
184 "password.successInfo": "Please check your email", 187 "password.successInfo": "رجاءً تحقق من عنوان بريدك الإلكتروني",
185 "premiumFeature.button.upgradeAccount": "ترقية الحساب", 188 "premiumFeature.button.upgradeAccount": "ترقية الحساب",
186 "pricing.features.accountSync": "Account Synchronisation", 189 "pricing.features.accountSync": "مزامنة٠الحساب",
187 "pricing.features.adFree": "Forever ad-free", 190 "pricing.features.adFree": "خال٠من الإعلانات للأبد",
188 "pricing.features.appDelays": "No Waiting Screens", 191 "pricing.features.appDelays": "لا شاشات٠انتظار",
189 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens", 192 "pricing.features.appDelaysEnabled": "شاشات٠انتظار هنا وهنا",
190 "pricing.features.customWebsites": "Add Custom Websites", 193 "pricing.features.customWebsites": "إضاÙØ© مواقع مخصصة",
191 "pricing.features.desktopNotifications": "Desktop Notifications", 194 "pricing.features.desktopNotifications": "إشعارات سطح المكتب",
192 "pricing.features.onPremise": "On-premise & other Hosted Services", 195 "pricing.features.onPremise": "On-premise & other Hosted Services",
193 "pricing.features.recipes": "Choose from more than 70 Services", 196 "pricing.features.recipes": "اختر من بين ما يزيد على 70 خدمة",
194 "pricing.features.serviceProxies": "Service Proxies", 197 "pricing.features.serviceProxies": "وكلاء الخدمة",
195 "pricing.features.spellchecker": "Spellchecker support", 198 "pricing.features.spellchecker": "دعم المدقق الإملائي",
196 "pricing.features.teamManagement": "Team Management", 199 "pricing.features.teamManagement": "Ùريق الإدارة",
197 "pricing.features.thirdPartyServices": "Install 3rd party services", 200 "pricing.features.thirdPartyServices": "تنصيب خدمات الطر٠الثالث",
198 "pricing.features.unlimitedServices": "Add unlimited services", 201 "pricing.features.unlimitedServices": "إمكانية إضاÙØ© خدمات غير محدودة",
199 "pricing.features.upToSixServices": "Add up to 6 services", 202 "pricing.features.upToSixServices": "إضاÙØ© ما يصل إلى 6 خدمات",
200 "pricing.features.upToThreeServices": "Add up to 3 services", 203 "pricing.features.upToThreeServices": "إضاÙØ© ما يصل إلى 3 خدمات",
201 "pricing.features.workspaces": "Workspaces", 204 "pricing.features.workspaces": "مساحات٠العمل",
202 "pricing.plan.free": "Ferdi Free", 205 "pricing.plan.free": "Ùيردي المجاني",
203 "pricing.plan.legacy": "Ferdi Premium", 206 "pricing.plan.legacy": "Ùيردي الإصدار الممتاز",
204 "pricing.plan.personal": "Ferdi Personal", 207 "pricing.plan.personal": "Ùيردي الإصدار الشخصي",
205 "pricing.plan.personal-monthly": "Ferdi Personal Monthly", 208 "pricing.plan.personal-monthly": "Ùيردي الإصدار الشخصي الشهري",
206 "pricing.plan.personal-yearly": "Ferdi Personal Yearly", 209 "pricing.plan.personal-yearly": "Ùيردي الإصدار الشخصي السنوي",
207 "pricing.plan.pro": "Ferdi Professional", 210 "pricing.plan.pro": "Ùيردي الإصدار الاحتراÙÙŠ",
208 "pricing.plan.pro-monthly": "Ferdi Professional Monthly", 211 "pricing.plan.pro-monthly": "Ùيردي الإصدار الاحتراÙÙŠ الشهري",
209 "pricing.plan.pro-yearly": "Ferdi Professional Yearly", 212 "pricing.plan.pro-yearly": "Ùيردي الإصدار الاحتراÙÙŠ السنوي",
210 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional", 213 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
211 "pricing.trial.cta.skip": "Continue to Ferdi", 214 "pricing.trial.cta.skip": "Continue to Ferdi",
212 "pricing.trial.cta.start": "Start using Ferdi", 215 "pricing.trial.cta.start": "Start using Ferdi",
@@ -220,20 +223,20 @@
220 "pricing.trial.terms.headline": "No strings attached", 223 "pricing.trial.terms.headline": "No strings attached",
221 "pricing.trial.terms.noCreditCard": "No credit card required", 224 "pricing.trial.terms.noCreditCard": "No credit card required",
222 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)", 225 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
223 "service.crashHandler.action": "Reload {name}", 226 "service.crashHandler.action": "أعادة تحميل {name}",
224 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 227 "service.crashHandler.autoReload": "محاولة الاستعادة التلقائية {name} ÙÙŠ غضون {seconds} ثانية",
225 "service.crashHandler.headline": "Oh no!", 228 "service.crashHandler.headline": "أوه لا!",
226 "service.crashHandler.text": "{name} has caused an error.", 229 "service.crashHandler.text": "{name} تسبب ÙÙŠ خطأ.",
227 "service.disabledHandler.action": "Enable {name}", 230 "service.disabledHandler.action": "تمكين {name}",
228 "service.disabledHandler.headline": "{name} is disabled", 231 "service.disabledHandler.headline": "{name} معطل",
229 "service.errorHandler.action": "Reload {name}", 232 "service.errorHandler.action": "أعادة تحميل {name}",
230 "service.errorHandler.editAction": "Edit {name}", 233 "service.errorHandler.editAction": "تحرير {name}",
231 "service.errorHandler.headline": "Oh no!", 234 "service.errorHandler.headline": "أوه لا!",
232 "service.errorHandler.message": "Error", 235 "service.errorHandler.message": "خطأ",
233 "service.errorHandler.text": "{name} has failed to load.", 236 "service.errorHandler.text": "Ùشل {name} ÙÙŠ التحميل.",
234 "service.restrictedHandler.action": "ترقية الحساب", 237 "service.restrictedHandler.action": "ترقية الحساب",
235 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required", 238 "service.restrictedHandler.customUrl.headline": "مطلوب الخطة الاحتراÙية Ù„Ùيردي",
236 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.", 239 "service.restrictedHandler.customUrl.text": "يرجى الترقية إلى خطة Ùيردي الاحتراÙية لاستخدام العناوين الإلكترونية المخصصة وخدمات الاستضاÙØ© الذاتية.",
237 "service.restrictedHandler.serviceLimit.headline": "لقد وصلت إلى حد الخدمة الخاص بك.", 240 "service.restrictedHandler.serviceLimit.headline": "لقد وصلت إلى حد الخدمة الخاص بك.",
238 "service.restrictedHandler.serviceLimit.text": "الرجاء ترقية حسابك لاستخدام أكثر من {count} خدمة.", 241 "service.restrictedHandler.serviceLimit.text": "الرجاء ترقية حسابك لاستخدام أكثر من {count} خدمة.",
239 "service.webviewLoader.loading": "جاري تحميل {service}", 242 "service.webviewLoader.loading": "جاري تحميل {service}",
@@ -257,7 +260,7 @@
257 "settings.account.headlineInvoices": "الÙواتير", 260 "settings.account.headlineInvoices": "الÙواتير",
258 "settings.account.headlinePassword": "تغيير كلمة المرور", 261 "settings.account.headlinePassword": "تغيير كلمة المرور",
259 "settings.account.headlineProfile": "تحديث المل٠الشخصي", 262 "settings.account.headlineProfile": "تحديث المل٠الشخصي",
260 "settings.account.headlineSubscription": "الإشتراك الخاصة بك", 263 "settings.account.headlineSubscription": "الاشتراك الخاص بك",
261 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial", 264 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
262 "settings.account.headlineUpgradeAccount": "قم بترقية حسابك واحصل على تجربة Ùردي الكاملة", 265 "settings.account.headlineUpgradeAccount": "قم بترقية حسابك واحصل على تجربة Ùردي الكاملة",
263 "settings.account.invoiceDownload": "تنزيل", 266 "settings.account.invoiceDownload": "تنزيل",
@@ -276,7 +279,7 @@
276 "settings.app.buttonInstallUpdate": "إعادة التشغيل وتثبيت التحديث", 279 "settings.app.buttonInstallUpdate": "إعادة التشغيل وتثبيت التحديث",
277 "settings.app.buttonSearchForUpdate": "التحقق من وجود تحديثات", 280 "settings.app.buttonSearchForUpdate": "التحقق من وجود تحديثات",
278 "settings.app.cacheInfo": "التخزين المؤقت Ù„Ùردي يستخدم حاليا {size} من مساحة القرص.", 281 "settings.app.cacheInfo": "التخزين المؤقت Ù„Ùردي يستخدم حاليا {size} من مساحة القرص.",
279 "settings.app.cacheNotCleared": "Couldn't clear all cache", 282 "settings.app.cacheNotCleared": "تعذر مسح كل ذاكرة التخزين المؤقت",
280 "settings.app.currentVersion": "الإصدار الحالي:", 283 "settings.app.currentVersion": "الإصدار الحالي:",
281 "settings.app.form.accentColor": "لون التمييز", 284 "settings.app.form.accentColor": "لون التمييز",
282 "settings.app.form.adaptableDarkMode": "مزامنة الوضع المظلم مع إعداد الوضع المظلم لنظام التشغيل الخاص بي", 285 "settings.app.form.adaptableDarkMode": "مزامنة الوضع المظلم مع إعداد الوضع المظلم لنظام التشغيل الخاص بي",
@@ -294,235 +297,235 @@
294 "settings.app.form.hibernate": "تÙعيل وضع النوم للخدمة", 297 "settings.app.form.hibernate": "تÙعيل وضع النوم للخدمة",
295 "settings.app.form.hibernateOnStartup": "الإبقاء على الخدمات ÙÙŠ وضع النوم عند بدء التشغيل", 298 "settings.app.form.hibernateOnStartup": "الإبقاء على الخدمات ÙÙŠ وضع النوم عند بدء التشغيل",
296 "settings.app.form.hibernationStrategy": "استراتيجية وضع النوم", 299 "settings.app.form.hibernationStrategy": "استراتيجية وضع النوم",
297 "settings.app.form.iconSize": "Service icon size", 300 "settings.app.form.iconSize": "حجم أيقونة الخدمة",
298 "settings.app.form.inactivityLock": "Lock after inactivity", 301 "settings.app.form.inactivityLock": "الإغلاق عن عدم استخدامك Ù„Ùترة",
299 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded", 302 "settings.app.form.keepAllWorkspacesLoaded": "حاÙظ على جميع مساحات العمل Ù…Ùحملة",
300 "settings.app.form.language": "Language", 303 "settings.app.form.language": "اللغة",
301 "settings.app.form.lockPassword": "كلمة المرور", 304 "settings.app.form.lockPassword": "كلمة المرور",
302 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray", 305 "settings.app.form.minimizeToSystemTray": "تصغير الناÙذة إلى جانب شريط المهام",
303 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour", 306 "settings.app.form.navigationBarBehaviour": "سلوك شريط التنقل",
304 "settings.app.form.predefinedTodoServer": "Todo Server", 307 "settings.app.form.predefinedTodoServer": "خادم Todo",
305 "settings.app.form.privateNotifications": "Don't show message content in notifications", 308 "settings.app.form.privateNotifications": "عدم إظهار محتوى الرسالة ÙÙŠ الإشعارات",
306 "settings.app.form.reloadAfterResume": "Reload Ferdi after system resume", 309 "settings.app.form.reloadAfterResume": "إعادة تحميل Ùيردي بعد أعادة تشغيل النظام",
307 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window", 310 "settings.app.form.runInBackground": "إبقاء Ùردي ÙÙŠ الخلÙية عند إغلاق الناÙذة",
308 "settings.app.form.scheduledDNDEnabled": "Enable scheduled Do-not-Disturb", 311 "settings.app.form.scheduledDNDEnabled": "Enable scheduled Do-not-Disturb",
309 "settings.app.form.scheduledDNDEnd": "To", 312 "settings.app.form.scheduledDNDEnd": "الى",
310 "settings.app.form.scheduledDNDStart": "From", 313 "settings.app.form.scheduledDNDStart": "من",
311 "settings.app.form.sentry": "Send telemetry data", 314 "settings.app.form.sentry": "Send telemetry data",
312 "settings.app.form.serviceRibbonWidth": "Sidebar width", 315 "settings.app.form.serviceRibbonWidth": "عرض الشريط الجانبي",
313 "settings.app.form.showDisabledServices": "Display disabled services tabs", 316 "settings.app.form.showDisabledServices": "عرض تبويبات الخدمات المعطلة",
314 "settings.app.form.showDragArea": "Show draggable area on window", 317 "settings.app.form.showDragArea": "إظهار المنطقة القابلة للسحب على الناÙذة",
315 "settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled", 318 "settings.app.form.showMessagesBadgesWhenMuted": "إظهار شارة رسالة غير مقروءة عند تعطيل الإشعارات",
316 "settings.app.form.startMinimized": "Start minimized", 319 "settings.app.form.startMinimized": "البدء بناÙذة مصغرة",
317 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 320 "settings.app.form.universalDarkMode": "تمكين الوضع المظلم الكامل",
318 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 321 "settings.app.form.useTouchIdToUnlock": "السماح باستخدام TouchID Ù„Ùتح Ùردي",
319 "settings.app.headline": "الإعدادات", 322 "settings.app.headline": "الإعدادات",
320 "settings.app.headlineAdvanced": "Advanced", 323 "settings.app.headlineAdvanced": "متقدم",
321 "settings.app.headlineAppearance": "Appearance", 324 "settings.app.headlineAppearance": "المظهر",
322 "settings.app.headlineGeneral": "General", 325 "settings.app.headlineGeneral": "عام",
323 "settings.app.headlineLanguage": "Language", 326 "settings.app.headlineLanguage": "اللغة",
324 "settings.app.headlineUpdates": "Updates", 327 "settings.app.headlineUpdates": "التحديثات",
325 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 328 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
326 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 329 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
327 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 330 "settings.app.languageDisclaimer": "الترجمات الرسمية هي الإنكليزية والألمانية. وجميع اللغات الأخرى مبنية على ترجمات مساهمين.",
328 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 331 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.",
329 "settings.app.lockedPassword": "كلمة المرور", 332 "settings.app.lockedPassword": "كلمة المرور",
330 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 333 "settings.app.lockedPasswordInfo": "الرجاء التأكد من تعيين كلمة مرور سو٠تتذكرها.\nإذما Ùقدت كلمة المرور هذه، سو٠تضطر إلى إعادة تثبيت Ùيردي.",
331 "settings.app.restartRequired": "Changes require restart", 334 "settings.app.restartRequired": "التغيرات تتطلب إعادة تشغيل",
332 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 335 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
333 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 336 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
334 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 337 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.",
335 "settings.app.subheadlineCache": "Cache", 338 "settings.app.subheadlineCache": "الذاكرة المؤقتة",
336 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 339 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
337 "settings.app.translationHelp": "Help us to translate Ferdi into your language.", 340 "settings.app.translationHelp": "ساعدنا على ترجمة Ùيردي إلى لغتك.",
338 "settings.app.universalDarkModeInfo": "Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 341 "settings.app.universalDarkModeInfo": "Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
339 "settings.app.updateStatusAvailable": "Update available, downloading...", 342 "settings.app.updateStatusAvailable": "التحديث متوÙر! يتم التحميل...",
340 "settings.app.updateStatusSearching": "Is searching for update", 343 "settings.app.updateStatusSearching": "يبحث عن تحديث",
341 "settings.app.updateStatusUpToDate": "You are using the latest version of Ferdi", 344 "settings.app.updateStatusUpToDate": "أنت تستخدم الإصدار الأخير من Ùيردي",
342 "settings.invite.headline": "Invite Friends", 345 "settings.invite.headline": "أدع٠الأصدقاء",
343 "settings.navigation.account": "الحساب", 346 "settings.navigation.account": "الحساب",
344 "settings.navigation.availableServices": "Available services", 347 "settings.navigation.availableServices": "الخدمات المتاحة",
345 "settings.navigation.logout": "Logout", 348 "settings.navigation.logout": "تسجيل خروج",
346 "settings.navigation.settings": "الإعدادات", 349 "settings.navigation.settings": "الإعدادات",
347 "settings.navigation.supportFerdi": "Support Ferdi", 350 "settings.navigation.supportFerdi": "ادعم Ùيردي",
348 "settings.navigation.team": "Manage Team", 351 "settings.navigation.team": "إدارة الÙريق",
349 "settings.navigation.yourServices": "Your services", 352 "settings.navigation.yourServices": "خدماتك",
350 "settings.navigation.yourWorkspaces": "Your workspaces", 353 "settings.navigation.yourWorkspaces": "مساحات عملك",
351 "settings.recipes.all": "All services", 354 "settings.recipes.all": "جميع الخدمات",
352 "settings.recipes.custom": "Custom Services", 355 "settings.recipes.custom": "خدماتٌ مخصصة",
353 "settings.recipes.customService.headline.communityRecipes": "Community 3rd Party Recipes", 356 "settings.recipes.customService.headline.communityRecipes": "Community 3rd Party Recipes",
354 "settings.recipes.customService.headline.customRecipes": "وصÙات طر٠ثالث مخصصة", 357 "settings.recipes.customService.headline.customRecipes": "وصÙات طر٠ثالث مخصصة",
355 "settings.recipes.customService.headline.devRecipes": "وصÙات خدمة التطوير الخاصة بك", 358 "settings.recipes.customService.headline.devRecipes": "وصÙات خدمة التطوير الخاصة بك",
356 "settings.recipes.customService.intro": "لإضاÙØ© خدمة مخصصة، انسخ وصÙØ© الخدمة إلى:", 359 "settings.recipes.customService.intro": "لإضاÙØ© خدمة مخصصة، انسخ وصÙØ© الخدمة إلى:",
357 "settings.recipes.customService.openDevDocs": "وثائق المطور", 360 "settings.recipes.customService.openDevDocs": "وثائق المطور",
358 "settings.recipes.customService.openFolder": "Ùتح المجلد", 361 "settings.recipes.customService.openFolder": "Ùتح المجلد",
359 "settings.recipes.headline": "Available services", 362 "settings.recipes.headline": "الخدمات المتاحة",
360 "settings.recipes.missingService": "خدمة Ù…Ùقودة؟", 363 "settings.recipes.missingService": "خدمة Ù…Ùقودة؟",
361 "settings.recipes.mostPopular": "الأكثر شعبية", 364 "settings.recipes.mostPopular": "الأكثر شعبية",
362 "settings.recipes.nothingFound": "عذراً، ولكن لا توجد خدمة تطابق مصطلح البحث الخاص بك.", 365 "settings.recipes.nothingFound": "عذراً، ولكن لا توجد خدمة تطابق مصطلح البحث الخاص بك.",
363 "settings.recipes.servicesSuccessfulAddedInfo": "تمت إضاÙØ© الخدمة بنجاح", 366 "settings.recipes.servicesSuccessfulAddedInfo": "تمت إضاÙØ© الخدمة بنجاح",
364 "settings.searchService": "البحث عن خدمة", 367 "settings.searchService": "البحث عن خدمة",
365 "settings.service.error.goBack": "العودة إلى الخدمات", 368 "settings.service.error.goBack": "العودة إلى الخدمات",
366 "settings.service.error.headline": "Error", 369 "settings.service.error.headline": "خطأ",
367 "settings.service.error.message": "تعذر تحميل وصÙØ© الخدمة.", 370 "settings.service.error.message": "تعذر تحميل وصÙØ© الخدمة.",
368 "settings.service.form.addServiceHeadline": "إضاÙØ© {name}", 371 "settings.service.form.addServiceHeadline": "إضاÙØ© {name}",
369 "settings.service.form.availableServices": "Available services", 372 "settings.service.form.availableServices": "الخدمات المتاحة",
370 "settings.service.form.customUrl": "خادم مخصص", 373 "settings.service.form.customUrl": "خادم مخصص",
371 "settings.service.form.customUrlPremiumInfo": "لإضاÙØ© الخدمات المستضاÙØ© بنÙسك، تحتاج إلى حساب الدعم المدÙوع Ù„Ùردي.", 374 "settings.service.form.customUrlPremiumInfo": "لإضاÙØ© الخدمات المستضاÙØ© بنÙسك، تحتاج إلى حساب الدعم المدÙوع Ù„Ùردي.",
372 "settings.service.form.customUrlUpgradeAccount": "ترقية حسابك", 375 "settings.service.form.customUrlUpgradeAccount": "ترقية حسابك",
373 "settings.service.form.customUrlValidationError": "تعذر التحقق من خادم {name} المخصص.", 376 "settings.service.form.customUrlValidationError": "تعذر التحقق من خادم {name} المخصص.",
374 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 377 "settings.service.form.darkReaderBrightness": "سطوع الشاشة ÙÙŠ وضع القراءة المظلم",
375 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 378 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
376 "settings.service.form.darkReaderSepia": "Dark Reader Sepia", 379 "settings.service.form.darkReaderSepia": "Dark Reader Sepia",
377 "settings.service.form.deleteButton": "Delete service", 380 "settings.service.form.deleteButton": "حذ٠الخدمة",
378 "settings.service.form.disableHibernation": "Disable hibernation", 381 "settings.service.form.disableHibernation": "Disable hibernation",
379 "settings.service.form.disableHibernationInfo": "You currently have hibernation enabled but you can disable hibernation for individual services using this option.", 382 "settings.service.form.disableHibernationInfo": "You currently have hibernation enabled but you can disable hibernation for individual services using this option.",
380 "settings.service.form.editServiceHeadline": "Edit {name}", 383 "settings.service.form.editServiceHeadline": "تحرير {name}",
381 "settings.service.form.enableAudio": "Enable audio", 384 "settings.service.form.enableAudio": "تمكين الصوت",
382 "settings.service.form.enableBadge": "Show unread message badges", 385 "settings.service.form.enableBadge": "إظهار شارات الرسائل غير المقروءة",
383 "settings.service.form.enableDarkMode": "Enable Dark Mode", 386 "settings.service.form.enableDarkMode": "تمكين الوضع المظلم",
384 "settings.service.form.enableNotification": "Enable notifications", 387 "settings.service.form.enableNotification": "تÙعيل الإشعارات",
385 "settings.service.form.enableService": "Enable service", 388 "settings.service.form.enableService": "تÙعيل الخدمة",
386 "settings.service.form.headlineBadges": "Unread message badges", 389 "settings.service.form.headlineBadges": "شارات الرسائل غير المقروءة",
387 "settings.service.form.headlineDarkReaderSettings": "Dark Reader Settings", 390 "settings.service.form.headlineDarkReaderSettings": "إعدادات وضع القارئ المظلم",
388 "settings.service.form.headlineGeneral": "General", 391 "settings.service.form.headlineGeneral": "عام",
389 "settings.service.form.headlineNotifications": "Notifications", 392 "settings.service.form.headlineNotifications": "الإشعارات",
390 "settings.service.form.icon": "Custom icon", 393 "settings.service.form.icon": "أيقونة مخصصة",
391 "settings.service.form.iconDelete": "حذÙ", 394 "settings.service.form.iconDelete": "حذÙ",
392 "settings.service.form.iconUpload": "Drop your image, or click here", 395 "settings.service.form.iconUpload": "إسقط صورتك، أو انقر هنا",
393 "settings.service.form.indirectMessageInfo": "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 396 "settings.service.form.indirectMessageInfo": "سيتم إعلامك عن جميع الرسائل الجديدة ÙÙŠ القناة، وليس Ùقط @username, @channel, @here, ...",
394 "settings.service.form.indirectMessages": "Show message badge for all new messages", 397 "settings.service.form.indirectMessages": "Show message badge for all new messages",
395 "settings.service.form.isMutedInfo": "When disabled, all notification sounds and audio playback are muted", 398 "settings.service.form.isMutedInfo": "When disabled, all notification sounds and audio playback are muted",
396 "settings.service.form.name": "الاسم", 399 "settings.service.form.name": "الاسم",
397 "settings.service.form.openDarkmodeCss": "Open darkmode.css", 400 "settings.service.form.openDarkmodeCss": "Open darkmode.css",
398 "settings.service.form.openUserCss": "Open user.css", 401 "settings.service.form.openUserCss": "Ùتح user.css",
399 "settings.service.form.openUserJs": "Open user.js", 402 "settings.service.form.openUserJs": "Ùتح user.js",
400 "settings.service.form.proxy.headline": "HTTP/HTTPS Proxy Settings", 403 "settings.service.form.proxy.headline": "HTTP/HTTPS Proxy Settings",
401 "settings.service.form.proxy.host": "Proxy Host/IP", 404 "settings.service.form.proxy.host": "Proxy Host/IP",
402 "settings.service.form.proxy.info": "Proxy settings will not synced with the Ferdi servers.", 405 "settings.service.form.proxy.info": "Proxy settings will not synced with the Ferdi servers.",
403 "settings.service.form.proxy.isEnabled": "Use Proxy", 406 "settings.service.form.proxy.isEnabled": "استخدام بروكسي",
404 "settings.service.form.proxy.password": "Password (optional)", 407 "settings.service.form.proxy.password": "كلمة المرور (اختياري)",
405 "settings.service.form.proxy.port": "Port", 408 "settings.service.form.proxy.port": "المنÙØ°",
406 "settings.service.form.proxy.restartInfo": "Please restart Ferdi after changing proxy Settings.", 409 "settings.service.form.proxy.restartInfo": "الرجاء إعادة تشغيل Ùيردي بعد تغيير إعدادات البروكسي.",
407 "settings.service.form.proxy.user": "User (optional)", 410 "settings.service.form.proxy.user": "المستخدم (اختياري)",
408 "settings.service.form.recipeFileInfo": "Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 411 "settings.service.form.recipeFileInfo": "Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
409 "settings.service.form.saveButton": "Save service", 412 "settings.service.form.saveButton": "Ø­Ùظ الخدمة",
410 "settings.service.form.tabHosted": "Hosted", 413 "settings.service.form.tabHosted": "Hosted",
411 "settings.service.form.tabOnPremise": "Self hosted â­ï¸", 414 "settings.service.form.tabOnPremise": "استضاÙØ© ذاتية â­",
412 "settings.service.form.team": "Team", 415 "settings.service.form.team": "Ùريق",
413 "settings.service.form.useHostedService": "Use the hosted {name} service.", 416 "settings.service.form.useHostedService": "Use the hosted {name} service.",
414 "settings.service.form.yourServices": "Your services", 417 "settings.service.form.yourServices": "خدماتك",
415 "settings.services.deletedInfo": "Service has been deleted", 418 "settings.services.deletedInfo": "تم حذ٠الخدمة",
416 "settings.services.discoverServices": "Discover services", 419 "settings.services.discoverServices": "اكتش٠الخدمات",
417 "settings.services.headline": "Your services", 420 "settings.services.headline": "خدماتك",
418 "settings.services.noServicesAdded": "You haven't added any services yet.", 421 "settings.services.noServicesAdded": "لم تقم بإضاÙØ© أي خدمات حتى الآن.",
419 "settings.services.servicesRequestFailed": "Could not load your services", 422 "settings.services.servicesRequestFailed": "تعذرَ تحميل خدماتك",
420 "settings.services.tooltip.isDisabled": "Service is disabled", 423 "settings.services.tooltip.isDisabled": "الخدمة معطّلة",
421 "settings.services.tooltip.isMuted": "All sounds are muted", 424 "settings.services.tooltip.isMuted": "تم كتم جميع الأصوات",
422 "settings.services.tooltip.notificationsDisabled": "Notifications are disabled", 425 "settings.services.tooltip.notificationsDisabled": "الإشعارات Ù…Ùعَطَّلة",
423 "settings.services.updatedInfo": "تم Ø­Ùظ التغييرات الخاصة بك", 426 "settings.services.updatedInfo": "تم Ø­Ùظ التغييرات الخاصة بك",
424 "settings.supportFerdi.github": "Star on GitHub", 427 "settings.supportFerdi.github": "أبدأ على منصة GitHub",
425 "settings.supportFerdi.headline": "Support Ferdi", 428 "settings.supportFerdi.headline": "ادعم Ùيردي",
426 "settings.supportFerdi.openCollective": "Support our Open Collective", 429 "settings.supportFerdi.openCollective": "ادعم مجتمعنا المÙتوح",
427 "settings.supportFerdi.share": "Tell your Friends", 430 "settings.supportFerdi.share": "أخبر أصدقائك",
428 "settings.supportFerdi.title": "Do you like Ferdi? Spread the love!", 431 "settings.supportFerdi.title": "هل تحب Ùيردي؟ انشر الحب!",
429 "settings.team.contentHeadline": "Franz Team Management", 432 "settings.team.contentHeadline": "Ùريق أدارة Ùرانز",
430 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 433 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
431 "settings.team.headline": "Team", 434 "settings.team.headline": "Ùريق",
432 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 435 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.",
433 "settings.team.manageAction": "Manage your Team on meetfranz.com", 436 "settings.team.manageAction": "ادر Ùريقك على meetfranz.com",
434 "settings.team.teamsUnavailable": "Teams are unavailable", 437 "settings.team.teamsUnavailable": "الÙرق غير متوÙرة",
435 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 438 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
436 "settings.team.upgradeAction": "Upgrade your Account", 439 "settings.team.upgradeAction": "ترقية حسابك",
437 "settings.user.form.accountType.company": "Company", 440 "settings.user.form.accountType.company": "اسم الشركة",
438 "settings.user.form.accountType.individual": "Individual", 441 "settings.user.form.accountType.individual": "شخصي",
439 "settings.user.form.accountType.label": "Account type", 442 "settings.user.form.accountType.label": "نوع الحساب",
440 "settings.user.form.accountType.non-profit": "Non-Profit", 443 "settings.user.form.accountType.non-profit": "غير ربحي",
441 "settings.user.form.currentPassword": "Current password", 444 "settings.user.form.currentPassword": "الكلمة السرية الحالية",
442 "settings.user.form.email": "Email", 445 "settings.user.form.email": "البريد الألكتروني",
443 "settings.user.form.firstname": "First Name", 446 "settings.user.form.firstname": "الاسم الأول",
444 "settings.user.form.lastname": "Last Name", 447 "settings.user.form.lastname": "اسم العائلة",
445 "settings.user.form.newPassword": "New password", 448 "settings.user.form.newPassword": "كلمة سرّ جديدة",
446 "settings.workspace.add.form.name": "الاسم", 449 "settings.workspace.add.form.name": "الاسم",
447 "settings.workspace.add.form.submitButton": "Create workspace", 450 "settings.workspace.add.form.submitButton": "إنشاء مساحة عمل",
448 "settings.workspace.form.buttonDelete": "Delete workspace", 451 "settings.workspace.form.buttonDelete": "حذ٠مساحة العمل",
449 "settings.workspace.form.buttonSave": "Save workspace", 452 "settings.workspace.form.buttonSave": "Ø­Ùظ مساحة العمل",
450 "settings.workspace.form.keepLoaded": "Keep this workspace loaded*", 453 "settings.workspace.form.keepLoaded": "حاÙظ على مساحة العمل هذه Ù…Ùحملة*",
451 "settings.workspace.form.keepLoadedInfo": "*This option will be overwritten by the global \"Keep all workspaces loaded\" option.", 454 "settings.workspace.form.keepLoadedInfo": "*This option will be overwritten by the global \"Keep all workspaces loaded\" option.",
452 "settings.workspace.form.name": "الاسم", 455 "settings.workspace.form.name": "الاسم",
453 "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace", 456 "settings.workspace.form.servicesInWorkspaceHeadline": "الخدمات ÙÙŠ مساحة العمل هذه",
454 "settings.workspace.form.yourWorkspaces": "Your workspaces", 457 "settings.workspace.form.yourWorkspaces": "مساحات عملك",
455 "settings.workspaces.deletedInfo": "Workspace has been deleted", 458 "settings.workspaces.deletedInfo": "تم حذ٠مساحة العمل",
456 "settings.workspaces.headline": "Your workspaces", 459 "settings.workspaces.headline": "مساحات عملك",
457 "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", 460 "settings.workspaces.noWorkspacesAdded": "لم تقم بإضاÙØ© أي مساحات عمل حتى الآن.",
458 "settings.workspaces.tryReloadWorkspaces": "حاول مجددًا", 461 "settings.workspaces.tryReloadWorkspaces": "حاول مجددًا",
459 "settings.workspaces.updatedInfo": "تم Ø­Ùظ التغييرات الخاصة بك", 462 "settings.workspaces.updatedInfo": "تم Ø­Ùظ التغييرات الخاصة بك",
460 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces", 463 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces",
461 "settings.workspaces.workspaceFeatureInfo": "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 464 "settings.workspaces.workspaceFeatureInfo": "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
462 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", 465 "settings.workspaces.workspacesRequestFailed": "تعذر تحميل مساحات عملك",
463 "sidebar.addNewService": "Add new service", 466 "sidebar.addNewService": "إضاÙØ© خدمة جديدة",
464 "sidebar.closeTodosDrawer": "Close Ferdi Todos", 467 "sidebar.closeTodosDrawer": "أغلق Todos Ùيردي",
465 "sidebar.closeWorkspaceDrawer": "Close workspace drawer", 468 "sidebar.closeWorkspaceDrawer": "غلق٠دÙرج٠مساحة العمل",
466 "sidebar.lockFerdi": "Ù‚ÙÙ„ Ùردي", 469 "sidebar.lockFerdi": "Ù‚ÙÙ„ Ùردي",
467 "sidebar.muteApp": "Disable notifications & audio", 470 "sidebar.muteApp": "تعطيل الإشعارات والصوت",
468 "sidebar.openTodosDrawer": "Open Ferdi Todos", 471 "sidebar.openTodosDrawer": "Ùتح Todos Ùيردي",
469 "sidebar.openWorkspaceDrawer": "Open workspace drawer", 472 "sidebar.openWorkspaceDrawer": "Ùتح٠دÙرج٠مساحة العمل",
470 "sidebar.settings": "الإعدادات", 473 "sidebar.settings": "الإعدادات",
471 "sidebar.unmuteApp": "Enable notifications & audio", 474 "sidebar.unmuteApp": "تمكين الإشعارات والصوت",
472 "signup.email.label": "البريد الإلكتروني", 475 "signup.email.label": "البريد الإلكتروني",
473 "signup.emailDuplicate": "A user with that email address already exists", 476 "signup.emailDuplicate": "مستخدم بهذا البريد الإلكتروني موجود بالÙعل",
474 "signup.firstname.label": "First Name", 477 "signup.firstname.label": "الاسم الأول",
475 "signup.headline": "Sign up", 478 "signup.headline": "التسجيل",
476 "signup.lastname.label": "Last Name", 479 "signup.lastname.label": "اسم العائلة",
477 "signup.legal.info": "By creating a Ferdi account you accept the", 480 "signup.legal.info": "من خلال إنشاء حساب Ùيردي Ùإنك تقبل",
478 "signup.legal.privacy": "بيان الخصوصية", 481 "signup.legal.privacy": "بيان الخصوصية",
479 "signup.legal.terms": "Terms of service", 482 "signup.legal.terms": "بنود الخدمة",
480 "signup.link.login": "Already have an account, sign in?", 483 "signup.link.login": "ألديك حساب, سجل الدخول؟",
481 "signup.password.label": "كلمة المرور", 484 "signup.password.label": "كلمة المرور",
482 "signup.submit.label": "Create account", 485 "signup.submit.label": "أنشئ حساب",
483 "subscription.bestValue": "Best value", 486 "subscription.bestValue": "Best value",
484 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial", 487 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
485 "subscription.cta.allOptions": "See all options", 488 "subscription.cta.allOptions": "مشاهدة جميع الخيارات",
486 "subscription.cta.choosePlan": "Choose your plan", 489 "subscription.cta.choosePlan": "اختر خطة اشتراكك",
487 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:", 490 "subscription.includedProFeatures": "وتشمل خطة اشتراك Ùيردي الاحتراÙية ما يلي:",
488 "subscription.interval.per": "per {interval}", 491 "subscription.interval.per": "لكل {interval}",
489 "subscription.interval.perMonth": "per month", 492 "subscription.interval.perMonth": "ÙÙŠ الشهر",
490 "subscription.interval.perMonthPerUser": "per month & user", 493 "subscription.interval.perMonthPerUser": "ÙÙŠ الشهر وعدد المستخدمين",
491 "subscription.planItem.upgradeAccount": "ترقية الحساب", 494 "subscription.planItem.upgradeAccount": "ترقية الحساب",
492 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:", 495 "subscription.teaser.includedFeatures": "تشمل خطة الاشتراك المدÙوعة Ù„Ùريدي:",
493 "subscription.teaser.intro": "Ferdi 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!", 496 "subscription.teaser.intro": "يأتي Ùردي 5 مع مجموعة واسعة من الميزات الجديدة لتعزيز تواصلك اليومي - ويشمل ذلك البطاريات. تحقق من خطط اشتراكاتنا الجديدة واكتش٠أي واحد تناسبك أكثر!",
494 "subscriptionPopup.buttonCancel": "Cancel", 497 "subscriptionPopup.buttonCancel": "إلغاء",
495 "subscriptionPopup.buttonDone": "Done", 498 "subscriptionPopup.buttonDone": "تم",
496 "tabs.item.deleteService": "Delete service", 499 "tabs.item.deleteService": "حذ٠الخدمة",
497 "tabs.item.disableAudio": "Disable audio", 500 "tabs.item.disableAudio": "تعطيل الصوت",
498 "tabs.item.disableNotifications": "Disable notifications", 501 "tabs.item.disableNotifications": "تعطيل الإشعارات",
499 "tabs.item.disableService": "Disable service", 502 "tabs.item.disableService": "تعطيل الخدمة",
500 "tabs.item.edit": "تعديل", 503 "tabs.item.edit": "تعديل",
501 "tabs.item.enableAudio": "Enable audio", 504 "tabs.item.enableAudio": "تمكين الصوت",
502 "tabs.item.enableNotification": "Enable notifications", 505 "tabs.item.enableNotification": "تÙعيل الإشعارات",
503 "tabs.item.enableService": "Enable service", 506 "tabs.item.enableService": "تÙعيل الخدمة",
504 "tabs.item.reload": "إعادة التحميل", 507 "tabs.item.reload": "إعادة التحميل",
505 "validation.email": "{field} is not valid", 508 "validation.email": "{field} غير صالح",
506 "validation.minLength": "{field} should be at least {length} characters long", 509 "validation.minLength": "{field} يجب أن يكون على الأقل {length} حرÙاً",
507 "validation.oneRequired": "At least one is required", 510 "validation.oneRequired": "At least one is required",
508 "validation.required": "{field} is required", 511 "validation.required": "{field} مطلوب",
509 "validation.url": "{field} is not a valid URL", 512 "validation.url": "{field} ليس عنوان URL صالح",
510 "webControls.back": "الرجوع", 513 "webControls.back": "الرجوع",
511 "webControls.forward": "تقدم", 514 "webControls.forward": "تقدم",
512 "webControls.goHome": "الرئيسية", 515 "webControls.goHome": "الرئيسية",
513 "webControls.openInBrowser": "Open in Browser", 516 "webControls.openInBrowser": "Ùتح ÙÙŠ المتصÙØ­",
514 "webControls.reload": "إعادة التحميل", 517 "webControls.reload": "إعادة التحميل",
515 "welcome.loginButton": "Login to your account", 518 "welcome.loginButton": "تسجيل الدخول إلى حسابك",
516 "welcome.signupButton": "إنشاء حساب مجاني", 519 "welcome.signupButton": "إنشاء حساب مجاني",
517 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace", 520 "workspaceDrawer.addNewWorkspaceLabel": "إضاÙØ© مساحة عمل جديدة",
518 "workspaceDrawer.allServices": "All services", 521 "workspaceDrawer.allServices": "جميع الخدمات",
519 "workspaceDrawer.headline": "Workspaces", 522 "workspaceDrawer.headline": "مساحات٠العمل",
520 "workspaceDrawer.item.contextMenuEdit": "edit", 523 "workspaceDrawer.item.contextMenuEdit": "تعديل",
521 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 524 "workspaceDrawer.item.noServicesAddedYet": "لم تض٠أي خدمات بعد",
522 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 525 "workspaceDrawer.premiumCtaButtonLabel": "أنشئ مساحة عملك الأولى",
523 "workspaceDrawer.proFeatureBadge": "Premium feature", 526 "workspaceDrawer.proFeatureBadge": "المزايا المدÙوعة",
524 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 527 "workspaceDrawer.reactivatePremiumAccountLabel": "إعادة تنشيط الحساب المدÙوع",
525 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>", 528 "workspaceDrawer.workspaceFeatureInfo": "<p>ÙŠÙمكنك Ùيردي من التركيز على ما هو مهم لديك الآن. أنشاء مجموعات مختلÙØ© من الخدمات وإداراتها والتنقل بينها بسهولة ÙÙŠ أي وقت.<p><p/>أنتَ من يقرر أيّ الخدمات تحتاج ساعة تحتاج وأين تحتاج, لذا نستطيع مساعدتك لتبقى محاÙظ مع مستجدات ما تقوم به أو تستريح إن شئت.<p/>",
526 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 529 "workspaceDrawer.workspacesSettingsTooltip": "تعديل إعدادات مساحات العمل",
527 "workspaces.switchingIndicator.switchingTo": "Switching to" 530 "workspaces.switchingIndicator.switchingTo": "التبديل إلى"
528} 531}
diff --git a/src/i18n/locales/bs.json b/src/i18n/locales/bs.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/bs.json
+++ b/src/i18n/locales/bs.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index b0e8d2ded..bfb6391f1 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -1,14 +1,17 @@
1{ 1{
2 "app.errorHandler.action": "Recarrega", 2 "app.errorHandler.action": "Recarrega",
3 "app.errorHandler.headline": "Quelcom ha anat malament", 3 "app.errorHandler.headline": "Quelcom ha anat malament",
4 "changeserver.headline": "Change server", 4 "changeserver.customServerLabel": "Servidor personalitzat",
5 "changeserver.label": "Server", 5 "changeserver.headline": "Canvía de Servidor",
6 "changeserver.label": "Servidor",
6 "changeserver.submit": "Enviar", 7 "changeserver.submit": "Enviar",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Torna a carregar el servei", 10 "connectionLostBanner.cta": "Torna a carregar el servei",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "Què ha passat?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi ha perdut la connexió a {name}.",
10 "feature.announcements.changelog.headline": "Canvis en Ferdi {version}", 13 "feature.announcements.changelog.headline": "Canvis en Ferdi {version}",
11 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Registra la informació de depuració",
12 "feature.delayApp.headline": "Si us plau, compra una llicència de suport per a Ferdi per saltar l'espera", 15 "feature.delayApp.headline": "Si us plau, compra una llicència de suport per a Ferdi per saltar l'espera",
13 "feature.delayApp.text": "Ferdi continuarà en {seconds} segons", 16 "feature.delayApp.text": "Ferdi continuarà en {seconds} segons",
14 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional", 17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
@@ -32,17 +35,17 @@
32 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", 35 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
33 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment", 36 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
34 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", 37 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
35 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 38 "feature.publishDebugInfo.error": "S'ha produït un error en intentar publicar la informació de depuració. Torneu-ho a provar més tard o visualitzeu la consola per obtenir més informació.",
36 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 39 "feature.publishDebugInfo.info": "La publicació de la informació de depuració ens ajuda a trobar problemes i errors a Ferdi. En publicar la informació de depuració, accepteu la política de privadesa i els termes del servei de Ferdi Debugger",
37 "feature.publishDebugInfo.privacy": "Privacy policy", 40 "feature.publishDebugInfo.privacy": "Política de privacitat",
38 "feature.publishDebugInfo.publish": "Accept and publish", 41 "feature.publishDebugInfo.publish": "Accepta i publica",
39 "feature.publishDebugInfo.published": "Your debug log was published and is now availible at", 42 "feature.publishDebugInfo.published": "El vostre registre de depuració es va publicar i ja es pot consultar a",
40 "feature.publishDebugInfo.terms": "Termes del Servei", 43 "feature.publishDebugInfo.terms": "Termes del Servei",
41 "feature.publishDebugInfo.title": "Publish debug information", 44 "feature.publishDebugInfo.title": "Publicar informació de depuració",
42 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 45 "feature.quickSwitch.info": "Seleccioneu un servei amb TAB, ↑ i ↓. Obriu un servei amb ENTER.",
43 "feature.quickSwitch.search": "Search...", 46 "feature.quickSwitch.search": "Cerca...",
44 "feature.quickSwitch.title": "QuickSwitch", 47 "feature.quickSwitch.title": "QuickSwitch",
45 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", 48 "feature.serviceLimit.limitReached": "Heu afegit {amount} de {limit} serveis inclosos al vostre pla. Actualitzeu el vostre compte per afegir més serveis.",
46 "feature.shareFranz.action.email": "Envia com a correu", 49 "feature.shareFranz.action.email": "Envia com a correu",
47 "feature.shareFranz.action.facebook": "Compartir en Facebook", 50 "feature.shareFranz.action.facebook": "Compartir en Facebook",
48 "feature.shareFranz.action.twitter": "Compartir a Twitter", 51 "feature.shareFranz.action.twitter": "Compartir a Twitter",
@@ -50,9 +53,9 @@
50 "feature.shareFranz.shareText.email": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta per a Whatsapp, Messenger, Slack, Skype a www,getferdi.com", 53 "feature.shareFranz.shareText.email": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta per a Whatsapp, Messenger, Slack, Skype a www,getferdi.com",
51 "feature.shareFranz.shareText.twitter": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta de Whatsapp, Messenger, Slack, Skype i altres a www.getferdi.com/cc @FerdiMessenger", 54 "feature.shareFranz.shareText.twitter": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta de Whatsapp, Messenger, Slack, Skype i altres a www.getferdi.com/cc @FerdiMessenger",
52 "feature.shareFranz.text": "Digues als teus amics i col·legues l'increïble que és Ferdi i ajuda'ns a còrrer la veu ", 55 "feature.shareFranz.text": "Digues als teus amics i col·legues l'increïble que és Ferdi i ajuda'ns a còrrer la veu ",
53 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!", 56 "feature.todos.premium.info": "Les Tasques de Ferdi ja estan disponibles per a usuaris premium!",
54 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.", 57 "feature.todos.premium.rollout": "Tothom haurà d'esperar una mica més.",
55 "feature.todos.premium.upgrade": "Upgrade Account", 58 "feature.todos.premium.upgrade": "Actualitzar el compte",
56 "feature.trialStatusBar.cta": "Upgrade now", 59 "feature.trialStatusBar.cta": "Upgrade now",
57 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.", 60 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
58 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 61 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
@@ -61,18 +64,18 @@
61 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 64 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
62 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.", 65 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
63 "global.api.unhealthy": "No es pot connectar amb els serveis en línia de Ferdi", 66 "global.api.unhealthy": "No es pot connectar amb els serveis en línia de Ferdi",
64 "global.franzProRequired": "Ferdi Professional Required", 67 "global.franzProRequired": "Professional de Ferdi obligatori",
65 "global.notConnectedToTheInternet": "No esteu connectat a Internet.", 68 "global.notConnectedToTheInternet": "No esteu connectat a Internet.",
66 "global.spellchecker.useDefault": "Utilitzar el predeterminat del sistema ({default})", 69 "global.spellchecker.useDefault": "Utilitzar el predeterminat del sistema ({default})",
67 "global.spellchecking.autodetect": "Detectar l'idioma automàticament", 70 "global.spellchecking.autodetect": "Detectar l'idioma automàticament",
68 "global.spellchecking.autodetect.short": "Automàtic", 71 "global.spellchecking.autodetect.short": "Automàtic",
69 "global.spellchecking.language": "Corrector ortogràfic", 72 "global.spellchecking.language": "Corrector ortogràfic",
70 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional", 73 "global.upgradeButton.upgradeToPro": "Actualitza a Ferdi Professional",
71 "import.headline": "Importa els teus serveis Ferdi 4", 74 "import.headline": "Importa els teus serveis Ferdi 4",
72 "import.notSupportedHeadline": "Serveis que encara no s'admeten a Ferdi 5", 75 "import.notSupportedHeadline": "Serveis que encara no s'admeten a Ferdi 5",
73 "import.skip.label": "Vull afegir serveis manualment", 76 "import.skip.label": "Vull afegir serveis manualment",
74 "import.submit.label": "Importa serveis", 77 "import.submit.label": "Importa serveis",
75 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 78 "infobar.authRequestFailed": "S'han produït errors al intentar realitzar una sol·licitud autentificada. Proveu de tancar la sessió i tornar-hi si aquest error continua.",
76 "infobar.buttonChangelog": "Que hi ha de nou?", 79 "infobar.buttonChangelog": "Que hi ha de nou?",
77 "infobar.buttonInstallUpdate": "Reinicia i instal·la l'actualització", 80 "infobar.buttonInstallUpdate": "Reinicia i instal·la l'actualització",
78 "infobar.buttonReloadServices": "Recarrega els serveis", 81 "infobar.buttonReloadServices": "Recarrega els serveis",
@@ -86,15 +89,15 @@
86 "invite.skip.label": "Ho vull fer més tard", 89 "invite.skip.label": "Ho vull fer més tard",
87 "invite.submit.label": "Enviar invitacions", 90 "invite.submit.label": "Enviar invitacions",
88 "invite.successInfo": "Invitacions enviades correctament", 91 "invite.successInfo": "Invitacions enviades correctament",
89 "locked.headline": "Locked", 92 "locked.headline": "Bloquejat",
90 "locked.info": "Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.", 93 "locked.info": "Actualment, Ferdi està bloquejat. Desbloqueu Ferdi amb la vostra contrasenya per veure els vostres missatges.",
91 "locked.invalidCredentials": "Password invalid", 94 "locked.invalidCredentials": "Contrasenya incorrecte",
92 "locked.password.label": "Password", 95 "locked.password.label": "Contrasenya",
93 "locked.submit.label": "Unlock", 96 "locked.submit.label": "Desbloqueja",
94 "locked.touchId": "Unlock with Touch ID", 97 "locked.touchId": "Desbloqueja amb Touch ID",
95 "locked.touchIdPrompt": "unlock via Touch ID", 98 "locked.touchIdPrompt": "desbloqueja amb Touch ID",
96 "locked.unlockWithPassword": "Unlock with Password", 99 "locked.unlockWithPassword": "Desbloqueja amb contrasenya",
97 "login.changeServer": "Change server", 100 "login.changeServer": "Canvía de Servidor",
98 "login.customServerQuestion": "Using a custom Ferdi server?", 101 "login.customServerQuestion": "Using a custom Ferdi server?",
99 "login.customServerSuggestion": "Try importing your Franz account", 102 "login.customServerSuggestion": "Try importing your Franz account",
100 "login.email.label": "Correu electrònic", 103 "login.email.label": "Correu electrònic",
@@ -102,15 +105,15 @@
102 "login.invalidCredentials": "El correu electrònic o la contrasenya no són vàlids", 105 "login.invalidCredentials": "El correu electrònic o la contrasenya no són vàlids",
103 "login.link.password": "Restablir la contrasenya", 106 "login.link.password": "Restablir la contrasenya",
104 "login.link.signup": "Crea un compte gratuït", 107 "login.link.signup": "Crea un compte gratuït",
105 "login.password.label": "Password", 108 "login.password.label": "Contrasenya",
106 "login.serverLogout": "La teva sessió ha caducat, torna-la a iniciar.", 109 "login.serverLogout": "La teva sessió ha caducat, torna-la a iniciar.",
107 "login.submit.label": "Accedir-hi", 110 "login.submit.label": "Accedir-hi",
108 "login.tokenExpired": "La teva sessió ha caducat, torna-la a iniciar.", 111 "login.tokenExpired": "La teva sessió ha caducat, torna-la a iniciar.",
109 "menu.Todoss.closeTodosDrawer": "Close Todos drawer", 112 "menu.Todoss.closeTodosDrawer": "Tanca el calaix de tasques",
110 "menu.Todoss.openTodosDrawer": "Open Todos drawer", 113 "menu.Todoss.openTodosDrawer": "Obre el calaix de tasques",
111 "menu.app.about": "Sobre Ferdi", 114 "menu.app.about": "Sobre Ferdi",
112 "menu.app.announcement": "Què hi ha de nou?", 115 "menu.app.announcement": "Què hi ha de nou?",
113 "menu.app.autohideMenuBar": "Auto-hide menu bar", 116 "menu.app.autohideMenuBar": "Amaga automàticament la barra de menú",
114 "menu.app.checkForUpdates": "Comprova si hi ha actualitzacions", 117 "menu.app.checkForUpdates": "Comprova si hi ha actualitzacions",
115 "menu.app.hide": "Amaga", 118 "menu.app.hide": "Amaga",
116 "menu.app.hideOthers": "Amaga altres", 119 "menu.app.hideOthers": "Amaga altres",
@@ -122,7 +125,7 @@
122 "menu.edit.cut": "Retalla", 125 "menu.edit.cut": "Retalla",
123 "menu.edit.delete": "Suprimeix", 126 "menu.edit.delete": "Suprimeix",
124 "menu.edit.emojiSymbols": "Emoji i Símbols", 127 "menu.edit.emojiSymbols": "Emoji i Símbols",
125 "menu.edit.findInPage": "Find in Page", 128 "menu.edit.findInPage": "Troba a la pàgina",
126 "menu.edit.paste": "Enganxa", 129 "menu.edit.paste": "Enganxa",
127 "menu.edit.pasteAndMatchStyle": "Enganxa amb els estils", 130 "menu.edit.pasteAndMatchStyle": "Enganxa amb els estils",
128 "menu.edit.redo": "Refés", 131 "menu.edit.redo": "Refés",
@@ -135,46 +138,46 @@
135 "menu.file": "Fitxer", 138 "menu.file": "Fitxer",
136 "menu.help": "Ajuda", 139 "menu.help": "Ajuda",
137 "menu.help.changelog": "Registre de canvis", 140 "menu.help.changelog": "Registre de canvis",
138 "menu.help.debugInfo": "Copy Debug Information", 141 "menu.help.debugInfo": "Copia la informació de depuració",
139 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 142 "menu.help.debugInfoCopiedBody": "La informació de depuració s'ha copiat al porta-retalls.",
140 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 143 "menu.help.debugInfoCopiedHeadline": "Informació de depuració de Ferdi",
141 "menu.help.learnMore": "Conegueu-ne més detalls", 144 "menu.help.learnMore": "Conegueu-ne més detalls",
142 "menu.help.privacy": "Declaració de privacitat", 145 "menu.help.privacy": "Declaració de privacitat",
143 "menu.help.publishDebugInfo": "Publish Debug Information", 146 "menu.help.publishDebugInfo": "Publicar informació de depuració",
144 "menu.help.support": "Suport", 147 "menu.help.support": "Suport",
145 "menu.help.tos": "Condicions del Servei", 148 "menu.help.tos": "Condicions del Servei",
146 "menu.services": "Serveis", 149 "menu.services": "Serveis",
147 "menu.services.activatePreviousService": "Activate previous service", 150 "menu.services.activatePreviousService": "Activa el servei anterior",
148 "menu.services.addNewService": "Afegeix un servei...", 151 "menu.services.addNewService": "Afegeix un servei...",
149 "menu.services.goHome": "Home", 152 "menu.services.goHome": "Inici",
150 "menu.services.setNextServiceActive": "Activate next service", 153 "menu.services.setNextServiceActive": "Activa el següent servei",
151 "menu.todos": "Todos", 154 "menu.todos": "Tasques",
152 "menu.todos.enableTodos": "Enable Todos", 155 "menu.todos.enableTodos": "Activar Tasques",
153 "menu.view": "Visualitza", 156 "menu.view": "Visualitza",
154 "menu.view.back": "Back", 157 "menu.view.back": "Enrere",
155 "menu.view.enterFullScreen": "Inicia la pantalla completa", 158 "menu.view.enterFullScreen": "Inicia la pantalla completa",
156 "menu.view.exitFullScreen": "Surt de pantalla completa", 159 "menu.view.exitFullScreen": "Surt de pantalla completa",
157 "menu.view.forward": "Forward", 160 "menu.view.forward": "Endavant",
158 "menu.view.lockFerdi": "Lock Ferdi", 161 "menu.view.lockFerdi": "Bloqueja Ferdi",
159 "menu.view.openQuickSwitch": "Open Quick Switch", 162 "menu.view.openQuickSwitch": "Obre Quick Switch",
160 "menu.view.reloadFranz": "Torna a carregar Ferdi", 163 "menu.view.reloadFranz": "Torna a carregar Ferdi",
161 "menu.view.reloadService": "Torna a carregar el servei", 164 "menu.view.reloadService": "Torna a carregar el servei",
162 "menu.view.resetZoom": "Mida real", 165 "menu.view.resetZoom": "Mida real",
163 "menu.view.toggleDarkMode": "Toggle Dark Mode", 166 "menu.view.toggleDarkMode": "Canvia a Mode Fosc",
164 "menu.view.toggleDevTools": "Activa serveis per a desenvolupadors", 167 "menu.view.toggleDevTools": "Activa serveis per a desenvolupadors",
165 "menu.view.toggleFullScreen": "Activa la pantalla completa", 168 "menu.view.toggleFullScreen": "Activa la pantalla completa",
166 "menu.view.toggleServiceDevTools": "Habilita les eines de desenvolupador de serveis", 169 "menu.view.toggleServiceDevTools": "Habilita les eines de desenvolupador de serveis",
167 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 170 "menu.view.toggleTodosDevTools": "Activa serveis per a desenvolupadors a Tasques",
168 "menu.view.zoomIn": "Amplia", 171 "menu.view.zoomIn": "Amplia",
169 "menu.view.zoomOut": "Redueix", 172 "menu.view.zoomOut": "Redueix",
170 "menu.window": "Finestra", 173 "menu.window": "Finestra",
171 "menu.window.close": "Tanca", 174 "menu.window.close": "Tanca",
172 "menu.window.minimize": "Minimitza", 175 "menu.window.minimize": "Minimitza",
173 "menu.workspaces": "Workspaces", 176 "menu.workspaces": "Espais de treball",
174 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 177 "menu.workspaces.addNewWorkspace": "Afegir un Espai de Treball...",
175 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 178 "menu.workspaces.closeWorkspaceDrawer": "Tancar el calaix d'espais de treball",
176 "menu.workspaces.defaultWorkspace": "Tots els serveis", 179 "menu.workspaces.defaultWorkspace": "Tots els serveis",
177 "menu.workspaces.openWorkspaceDrawer": "Open workspace drawer", 180 "menu.workspaces.openWorkspaceDrawer": "Obrir el calaix d'espais de treball",
178 "password.email.label": "Correu electrònic", 181 "password.email.label": "Correu electrònic",
179 "password.headline": "Restablir la contrasenya", 182 "password.headline": "Restablir la contrasenya",
180 "password.link.login": "Inicia la sessió al teu compte", 183 "password.link.login": "Inicia la sessió al teu compte",
@@ -183,12 +186,12 @@
183 "password.submit.label": "Enviar", 186 "password.submit.label": "Enviar",
184 "password.successInfo": "Comproveu el vostre correu electrònic", 187 "password.successInfo": "Comproveu el vostre correu electrònic",
185 "premiumFeature.button.upgradeAccount": "Millorar el teu compte", 188 "premiumFeature.button.upgradeAccount": "Millorar el teu compte",
186 "pricing.features.accountSync": "Account Synchronisation", 189 "pricing.features.accountSync": "Sincronització de Conte",
187 "pricing.features.adFree": "Forever ad-free", 190 "pricing.features.adFree": "Sense publicitat per sempre",
188 "pricing.features.appDelays": "No Waiting Screens", 191 "pricing.features.appDelays": "Cap pantalla d’espera",
189 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens", 192 "pricing.features.appDelaysEnabled": "Pantalles d’espera ocasionals",
190 "pricing.features.customWebsites": "Add Custom Websites", 193 "pricing.features.customWebsites": "Afegir llocs web personalitzats",
191 "pricing.features.desktopNotifications": "Desktop Notifications", 194 "pricing.features.desktopNotifications": "Notificacions a l'escriptori",
192 "pricing.features.onPremise": "On-premise & other Hosted Services", 195 "pricing.features.onPremise": "On-premise & other Hosted Services",
193 "pricing.features.recipes": "Choose from more than 70 Services", 196 "pricing.features.recipes": "Choose from more than 70 Services",
194 "pricing.features.serviceProxies": "Service Proxies", 197 "pricing.features.serviceProxies": "Service Proxies",
@@ -198,7 +201,7 @@
198 "pricing.features.unlimitedServices": "Add unlimited services", 201 "pricing.features.unlimitedServices": "Add unlimited services",
199 "pricing.features.upToSixServices": "Add up to 6 services", 202 "pricing.features.upToSixServices": "Add up to 6 services",
200 "pricing.features.upToThreeServices": "Add up to 3 services", 203 "pricing.features.upToThreeServices": "Add up to 3 services",
201 "pricing.features.workspaces": "Workspaces", 204 "pricing.features.workspaces": "Espais de treball",
202 "pricing.plan.free": "Ferdi Free", 205 "pricing.plan.free": "Ferdi Free",
203 "pricing.plan.legacy": "Ferdi Premium", 206 "pricing.plan.legacy": "Ferdi Premium",
204 "pricing.plan.personal": "Ferdi Personal", 207 "pricing.plan.personal": "Ferdi Personal",
@@ -231,7 +234,7 @@
231 "service.errorHandler.headline": "Oh no!", 234 "service.errorHandler.headline": "Oh no!",
232 "service.errorHandler.message": "Error", 235 "service.errorHandler.message": "Error",
233 "service.errorHandler.text": "{name} ha fallat al carregar", 236 "service.errorHandler.text": "{name} ha fallat al carregar",
234 "service.restrictedHandler.action": "Upgrade Account", 237 "service.restrictedHandler.action": "Actualitzar el compte",
235 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required", 238 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
236 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.", 239 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
237 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.", 240 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
@@ -268,7 +271,7 @@
268 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.", 271 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
269 "settings.account.tryReloadServices": "Torna a provar-ho", 272 "settings.account.tryReloadServices": "Torna a provar-ho",
270 "settings.account.tryReloadUserInfoRequest": "Torna a provar-ho", 273 "settings.account.tryReloadUserInfoRequest": "Torna a provar-ho",
271 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional", 274 "settings.account.upgradeToPro.label": "Actualitza a Ferdi Professional",
272 "settings.account.userInfoRequestFailed": "No s'ha pogut carregar la informació de l'usuari", 275 "settings.account.userInfoRequestFailed": "No s'ha pogut carregar la informació de l'usuari",
273 "settings.account.yourLicense": "Your Ferdi License", 276 "settings.account.yourLicense": "Your Ferdi License",
274 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: #7367f0)", 277 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: #7367f0)",
@@ -298,7 +301,7 @@
298 "settings.app.form.inactivityLock": "Lock after inactivity", 301 "settings.app.form.inactivityLock": "Lock after inactivity",
299 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded", 302 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded",
300 "settings.app.form.language": "Idioma", 303 "settings.app.form.language": "Idioma",
301 "settings.app.form.lockPassword": "Password", 304 "settings.app.form.lockPassword": "Contrasenya",
302 "settings.app.form.minimizeToSystemTray": "Minimitza Ferdi a la safata del sistema", 305 "settings.app.form.minimizeToSystemTray": "Minimitza Ferdi a la safata del sistema",
303 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour", 306 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour",
304 "settings.app.form.predefinedTodoServer": "Todo Server", 307 "settings.app.form.predefinedTodoServer": "Todo Server",
@@ -326,7 +329,7 @@
326 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 329 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
327 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 330 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
328 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 331 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.",
329 "settings.app.lockedPassword": "Password", 332 "settings.app.lockedPassword": "Contrasenya",
330 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 333 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
331 "settings.app.restartRequired": "Els canvis requereixen reiniciar", 334 "settings.app.restartRequired": "Els canvis requereixen reiniciar",
332 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 335 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
@@ -462,11 +465,11 @@
462 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", 465 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces",
463 "sidebar.addNewService": "Afegeix nou servei", 466 "sidebar.addNewService": "Afegeix nou servei",
464 "sidebar.closeTodosDrawer": "Close Ferdi Todos", 467 "sidebar.closeTodosDrawer": "Close Ferdi Todos",
465 "sidebar.closeWorkspaceDrawer": "Close workspace drawer", 468 "sidebar.closeWorkspaceDrawer": "Tancar el calaix d'espais de treball",
466 "sidebar.lockFerdi": "Lock Ferdi", 469 "sidebar.lockFerdi": "Bloqueja Ferdi",
467 "sidebar.muteApp": "Desactivar notificacions i àudio", 470 "sidebar.muteApp": "Desactivar notificacions i àudio",
468 "sidebar.openTodosDrawer": "Open Ferdi Todos", 471 "sidebar.openTodosDrawer": "Open Ferdi Todos",
469 "sidebar.openWorkspaceDrawer": "Open workspace drawer", 472 "sidebar.openWorkspaceDrawer": "Obrir el calaix d'espais de treball",
470 "sidebar.settings": "Configuració", 473 "sidebar.settings": "Configuració",
471 "sidebar.unmuteApp": "Activar notificacions i àudio", 474 "sidebar.unmuteApp": "Activar notificacions i àudio",
472 "signup.email.label": "Correu electrònic", 475 "signup.email.label": "Correu electrònic",
@@ -478,7 +481,7 @@
478 "signup.legal.privacy": "Declaració de privacitat", 481 "signup.legal.privacy": "Declaració de privacitat",
479 "signup.legal.terms": "Termes del Servei", 482 "signup.legal.terms": "Termes del Servei",
480 "signup.link.login": "Ja teniu un compte, iniciar la sessió?", 483 "signup.link.login": "Ja teniu un compte, iniciar la sessió?",
481 "signup.password.label": "Password", 484 "signup.password.label": "Contrasenya",
482 "signup.submit.label": "Crea un compte", 485 "signup.submit.label": "Crea un compte",
483 "subscription.bestValue": "Best value", 486 "subscription.bestValue": "Best value",
484 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial", 487 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
@@ -488,7 +491,7 @@
488 "subscription.interval.per": "per {interval}", 491 "subscription.interval.per": "per {interval}",
489 "subscription.interval.perMonth": "per month", 492 "subscription.interval.perMonth": "per month",
490 "subscription.interval.perMonthPerUser": "per month & user", 493 "subscription.interval.perMonthPerUser": "per month & user",
491 "subscription.planItem.upgradeAccount": "Upgrade Account", 494 "subscription.planItem.upgradeAccount": "Actualitzar el compte",
492 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:", 495 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
493 "subscription.teaser.intro": "Ferdi 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!", 496 "subscription.teaser.intro": "Ferdi 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
494 "subscriptionPopup.buttonCancel": "Cancel·la", 497 "subscriptionPopup.buttonCancel": "Cancel·la",
@@ -507,16 +510,16 @@
507 "validation.oneRequired": "At least one is required", 510 "validation.oneRequired": "At least one is required",
508 "validation.required": "{field} es requerit", 511 "validation.required": "{field} es requerit",
509 "validation.url": "{field} es una URL no vàlida", 512 "validation.url": "{field} es una URL no vàlida",
510 "webControls.back": "Back", 513 "webControls.back": "Enrere",
511 "webControls.forward": "Forward", 514 "webControls.forward": "Endavant",
512 "webControls.goHome": "Home", 515 "webControls.goHome": "Inici",
513 "webControls.openInBrowser": "Open in Browser", 516 "webControls.openInBrowser": "Open in Browser",
514 "webControls.reload": "Recarrega", 517 "webControls.reload": "Recarrega",
515 "welcome.loginButton": "Inicia sessió al teu compte", 518 "welcome.loginButton": "Inicia sessió al teu compte",
516 "welcome.signupButton": "Crea un compte gratuït", 519 "welcome.signupButton": "Crea un compte gratuït",
517 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace", 520 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace",
518 "workspaceDrawer.allServices": "Tots els serveis", 521 "workspaceDrawer.allServices": "Tots els serveis",
519 "workspaceDrawer.headline": "Workspaces", 522 "workspaceDrawer.headline": "Espais de treball",
520 "workspaceDrawer.item.contextMenuEdit": "edit", 523 "workspaceDrawer.item.contextMenuEdit": "edit",
521 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 524 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
522 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 525 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index 136602524..5ac77ec4d 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Obnovit", 2 "app.errorHandler.action": "Obnovit",
3 "app.errorHandler.headline": "Něco se pokazilo", 3 "app.errorHandler.headline": "Něco se pokazilo",
4 "changeserver.customServerLabel": "Vlastní server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Odeslat", 7 "changeserver.submit": "Odeslat",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Obnovit službu", 10 "connectionLostBanner.cta": "Obnovit službu",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/da.json b/src/i18n/locales/da.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/da.json
+++ b/src/i18n/locales/da.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 38772d36a..fd36c91a7 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Neu laden", 2 "app.errorHandler.action": "Neu laden",
3 "app.errorHandler.headline": "Es ist ein Fehler aufgetreten", 3 "app.errorHandler.headline": "Es ist ein Fehler aufgetreten",
4 "changeserver.customServerLabel": "Eigener Server",
4 "changeserver.headline": "Server wechseln", 5 "changeserver.headline": "Server wechseln",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Absenden", 7 "changeserver.submit": "Absenden",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Dienst neu laden", 10 "connectionLostBanner.cta": "Dienst neu laden",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index c80574aa8..244ceb521 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -49,39 +49,78 @@
49 "defaultMessage": "!!!Change server", 49 "defaultMessage": "!!!Change server",
50 "end": { 50 "end": {
51 "column": 3, 51 "column": 3,
52 "line": 14 52 "line": 16
53 }, 53 },
54 "file": "src/components/auth/ChangeServer.js", 54 "file": "src/components/auth/ChangeServer.js",
55 "id": "changeserver.headline", 55 "id": "changeserver.headline",
56 "start": { 56 "start": {
57 "column": 12, 57 "column": 12,
58 "line": 11 58 "line": 13
59 } 59 }
60 }, 60 },
61 { 61 {
62 "defaultMessage": "!!!Server", 62 "defaultMessage": "!!!Server",
63 "end": { 63 "end": {
64 "column": 3, 64 "column": 3,
65 "line": 18 65 "line": 20
66 }, 66 },
67 "file": "src/components/auth/ChangeServer.js", 67 "file": "src/components/auth/ChangeServer.js",
68 "id": "changeserver.label", 68 "id": "changeserver.label",
69 "start": { 69 "start": {
70 "column": 9, 70 "column": 9,
71 "line": 15 71 "line": 17
72 }
73 },
74 {
75 "defaultMessage": "!!!Extra settings offered by Ferdi will not be saved",
76 "end": {
77 "column": 3,
78 "line": 24
79 },
80 "file": "src/components/auth/ChangeServer.js",
81 "id": "changeserver.warning",
82 "start": {
83 "column": 11,
84 "line": 21
85 }
86 },
87 {
88 "defaultMessage": "!!!Custom server",
89 "end": {
90 "column": 3,
91 "line": 28
92 },
93 "file": "src/components/auth/ChangeServer.js",
94 "id": "changeserver.customServerLabel",
95 "start": {
96 "column": 21,
97 "line": 25
98 }
99 },
100 {
101 "defaultMessage": "!!!Enter a valid URL",
102 "end": {
103 "column": 3,
104 "line": 32
105 },
106 "file": "src/components/auth/ChangeServer.js",
107 "id": "changeserver.urlError",
108 "start": {
109 "column": 12,
110 "line": 29
72 } 111 }
73 }, 112 },
74 { 113 {
75 "defaultMessage": "!!!Submit", 114 "defaultMessage": "!!!Submit",
76 "end": { 115 "end": {
77 "column": 3, 116 "column": 3,
78 "line": 22 117 "line": 36
79 }, 118 },
80 "file": "src/components/auth/ChangeServer.js", 119 "file": "src/components/auth/ChangeServer.js",
81 "id": "changeserver.submit", 120 "id": "changeserver.submit",
82 "start": { 121 "start": {
83 "column": 10, 122 "column": 10,
84 "line": 19 123 "line": 33
85 } 124 }
86 } 125 }
87 ], 126 ],
@@ -1074,117 +1113,117 @@
1074 "defaultMessage": "!!!Settings", 1113 "defaultMessage": "!!!Settings",
1075 "end": { 1114 "end": {
1076 "column": 3, 1115 "column": 3,
1077 "line": 18 1116 "line": 21
1078 }, 1117 },
1079 "file": "src/components/layout/Sidebar.js", 1118 "file": "src/components/layout/Sidebar.js",
1080 "id": "sidebar.settings", 1119 "id": "sidebar.settings",
1081 "start": { 1120 "start": {
1082 "column": 12, 1121 "column": 12,
1083 "line": 15 1122 "line": 18
1084 } 1123 }
1085 }, 1124 },
1086 { 1125 {
1087 "defaultMessage": "!!!Add new service", 1126 "defaultMessage": "!!!Add new service",
1088 "end": { 1127 "end": {
1089 "column": 3, 1128 "column": 3,
1090 "line": 22 1129 "line": 25
1091 }, 1130 },
1092 "file": "src/components/layout/Sidebar.js", 1131 "file": "src/components/layout/Sidebar.js",
1093 "id": "sidebar.addNewService", 1132 "id": "sidebar.addNewService",
1094 "start": { 1133 "start": {
1095 "column": 17, 1134 "column": 17,
1096 "line": 19 1135 "line": 22
1097 } 1136 }
1098 }, 1137 },
1099 { 1138 {
1100 "defaultMessage": "!!!Disable notifications & audio", 1139 "defaultMessage": "!!!Disable notifications & audio",
1101 "end": { 1140 "end": {
1102 "column": 3, 1141 "column": 3,
1103 "line": 26 1142 "line": 29
1104 }, 1143 },
1105 "file": "src/components/layout/Sidebar.js", 1144 "file": "src/components/layout/Sidebar.js",
1106 "id": "sidebar.muteApp", 1145 "id": "sidebar.muteApp",
1107 "start": { 1146 "start": {
1108 "column": 8, 1147 "column": 8,
1109 "line": 23 1148 "line": 26
1110 } 1149 }
1111 }, 1150 },
1112 { 1151 {
1113 "defaultMessage": "!!!Enable notifications & audio", 1152 "defaultMessage": "!!!Enable notifications & audio",
1114 "end": { 1153 "end": {
1115 "column": 3, 1154 "column": 3,
1116 "line": 30 1155 "line": 33
1117 }, 1156 },
1118 "file": "src/components/layout/Sidebar.js", 1157 "file": "src/components/layout/Sidebar.js",
1119 "id": "sidebar.unmuteApp", 1158 "id": "sidebar.unmuteApp",
1120 "start": { 1159 "start": {
1121 "column": 10, 1160 "column": 10,
1122 "line": 27 1161 "line": 30
1123 } 1162 }
1124 }, 1163 },
1125 { 1164 {
1126 "defaultMessage": "!!!Open workspace drawer", 1165 "defaultMessage": "!!!Open workspace drawer",
1127 "end": { 1166 "end": {
1128 "column": 3, 1167 "column": 3,
1129 "line": 34 1168 "line": 37
1130 }, 1169 },
1131 "file": "src/components/layout/Sidebar.js", 1170 "file": "src/components/layout/Sidebar.js",
1132 "id": "sidebar.openWorkspaceDrawer", 1171 "id": "sidebar.openWorkspaceDrawer",
1133 "start": { 1172 "start": {
1134 "column": 23, 1173 "column": 23,
1135 "line": 31 1174 "line": 34
1136 } 1175 }
1137 }, 1176 },
1138 { 1177 {
1139 "defaultMessage": "!!!Close workspace drawer", 1178 "defaultMessage": "!!!Close workspace drawer",
1140 "end": { 1179 "end": {
1141 "column": 3, 1180 "column": 3,
1142 "line": 38 1181 "line": 41
1143 }, 1182 },
1144 "file": "src/components/layout/Sidebar.js", 1183 "file": "src/components/layout/Sidebar.js",
1145 "id": "sidebar.closeWorkspaceDrawer", 1184 "id": "sidebar.closeWorkspaceDrawer",
1146 "start": { 1185 "start": {
1147 "column": 24, 1186 "column": 24,
1148 "line": 35 1187 "line": 38
1149 } 1188 }
1150 }, 1189 },
1151 { 1190 {
1152 "defaultMessage": "!!!Open Franz Todos", 1191 "defaultMessage": "!!!Open Franz Todos",
1153 "end": { 1192 "end": {
1154 "column": 3, 1193 "column": 3,
1155 "line": 42 1194 "line": 45
1156 }, 1195 },
1157 "file": "src/components/layout/Sidebar.js", 1196 "file": "src/components/layout/Sidebar.js",
1158 "id": "sidebar.openTodosDrawer", 1197 "id": "sidebar.openTodosDrawer",
1159 "start": { 1198 "start": {
1160 "column": 19, 1199 "column": 19,
1161 "line": 39 1200 "line": 42
1162 } 1201 }
1163 }, 1202 },
1164 { 1203 {
1165 "defaultMessage": "!!!Close Franz Todos", 1204 "defaultMessage": "!!!Close Franz Todos",
1166 "end": { 1205 "end": {
1167 "column": 3, 1206 "column": 3,
1168 "line": 46 1207 "line": 49
1169 }, 1208 },
1170 "file": "src/components/layout/Sidebar.js", 1209 "file": "src/components/layout/Sidebar.js",
1171 "id": "sidebar.closeTodosDrawer", 1210 "id": "sidebar.closeTodosDrawer",
1172 "start": { 1211 "start": {
1173 "column": 20, 1212 "column": 20,
1174 "line": 43 1213 "line": 46
1175 } 1214 }
1176 }, 1215 },
1177 { 1216 {
1178 "defaultMessage": "!!!Lock Ferdi", 1217 "defaultMessage": "!!!Lock Ferdi",
1179 "end": { 1218 "end": {
1180 "column": 3, 1219 "column": 3,
1181 "line": 50 1220 "line": 53
1182 }, 1221 },
1183 "file": "src/components/layout/Sidebar.js", 1222 "file": "src/components/layout/Sidebar.js",
1184 "id": "sidebar.lockFerdi", 1223 "id": "sidebar.lockFerdi",
1185 "start": { 1224 "start": {
1186 "column": 13, 1225 "column": 13,
1187 "line": 47 1226 "line": 50
1188 } 1227 }
1189 } 1228 }
1190 ], 1229 ],
@@ -4541,494 +4580,494 @@
4541 "defaultMessage": "!!!Launch Ferdi on start", 4580 "defaultMessage": "!!!Launch Ferdi on start",
4542 "end": { 4581 "end": {
4543 "column": 3, 4582 "column": 3,
4544 "line": 32 4583 "line": 33
4545 }, 4584 },
4546 "file": "src/containers/settings/EditSettingsScreen.js", 4585 "file": "src/containers/settings/EditSettingsScreen.js",
4547 "id": "settings.app.form.autoLaunchOnStart", 4586 "id": "settings.app.form.autoLaunchOnStart",
4548 "start": { 4587 "start": {
4549 "column": 21, 4588 "column": 21,
4550 "line": 29 4589 "line": 30
4551 } 4590 }
4552 }, 4591 },
4553 { 4592 {
4554 "defaultMessage": "!!!Open in background", 4593 "defaultMessage": "!!!Open in background",
4555 "end": { 4594 "end": {
4556 "column": 3, 4595 "column": 3,
4557 "line": 36 4596 "line": 37
4558 }, 4597 },
4559 "file": "src/containers/settings/EditSettingsScreen.js", 4598 "file": "src/containers/settings/EditSettingsScreen.js",
4560 "id": "settings.app.form.autoLaunchInBackground", 4599 "id": "settings.app.form.autoLaunchInBackground",
4561 "start": { 4600 "start": {
4562 "column": 26, 4601 "column": 26,
4563 "line": 33 4602 "line": 34
4564 } 4603 }
4565 }, 4604 },
4566 { 4605 {
4567 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 4606 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
4568 "end": { 4607 "end": {
4569 "column": 3, 4608 "column": 3,
4570 "line": 40 4609 "line": 41
4571 }, 4610 },
4572 "file": "src/containers/settings/EditSettingsScreen.js", 4611 "file": "src/containers/settings/EditSettingsScreen.js",
4573 "id": "settings.app.form.runInBackground", 4612 "id": "settings.app.form.runInBackground",
4574 "start": { 4613 "start": {
4575 "column": 19, 4614 "column": 19,
4576 "line": 37 4615 "line": 38
4577 } 4616 }
4578 }, 4617 },
4579 { 4618 {
4580 "defaultMessage": "!!!Start minimized", 4619 "defaultMessage": "!!!Start minimized",
4581 "end": { 4620 "end": {
4582 "column": 3, 4621 "column": 3,
4583 "line": 44 4622 "line": 45
4584 }, 4623 },
4585 "file": "src/containers/settings/EditSettingsScreen.js", 4624 "file": "src/containers/settings/EditSettingsScreen.js",
4586 "id": "settings.app.form.startMinimized", 4625 "id": "settings.app.form.startMinimized",
4587 "start": { 4626 "start": {
4588 "column": 18, 4627 "column": 18,
4589 "line": 41 4628 "line": 42
4590 } 4629 }
4591 }, 4630 },
4592 { 4631 {
4593 "defaultMessage": "!!!Always show Ferdi in system tray", 4632 "defaultMessage": "!!!Always show Ferdi in system tray",
4594 "end": { 4633 "end": {
4595 "column": 3, 4634 "column": 3,
4596 "line": 48 4635 "line": 49
4597 }, 4636 },
4598 "file": "src/containers/settings/EditSettingsScreen.js", 4637 "file": "src/containers/settings/EditSettingsScreen.js",
4599 "id": "settings.app.form.enableSystemTray", 4638 "id": "settings.app.form.enableSystemTray",
4600 "start": { 4639 "start": {
4601 "column": 20, 4640 "column": 20,
4602 "line": 45 4641 "line": 46
4603 } 4642 }
4604 }, 4643 },
4605 { 4644 {
4606 "defaultMessage": "!!!Reload Ferdi after system resume", 4645 "defaultMessage": "!!!Reload Ferdi after system resume",
4607 "end": { 4646 "end": {
4608 "column": 3, 4647 "column": 3,
4609 "line": 52 4648 "line": 53
4610 }, 4649 },
4611 "file": "src/containers/settings/EditSettingsScreen.js", 4650 "file": "src/containers/settings/EditSettingsScreen.js",
4612 "id": "settings.app.form.reloadAfterResume", 4651 "id": "settings.app.form.reloadAfterResume",
4613 "start": { 4652 "start": {
4614 "column": 21, 4653 "column": 21,
4615 "line": 49 4654 "line": 50
4616 } 4655 }
4617 }, 4656 },
4618 { 4657 {
4619 "defaultMessage": "!!!Minimize Ferdi to system tray", 4658 "defaultMessage": "!!!Minimize Ferdi to system tray",
4620 "end": { 4659 "end": {
4621 "column": 3, 4660 "column": 3,
4622 "line": 56 4661 "line": 57
4623 }, 4662 },
4624 "file": "src/containers/settings/EditSettingsScreen.js", 4663 "file": "src/containers/settings/EditSettingsScreen.js",
4625 "id": "settings.app.form.minimizeToSystemTray", 4664 "id": "settings.app.form.minimizeToSystemTray",
4626 "start": { 4665 "start": {
4627 "column": 24, 4666 "column": 24,
4628 "line": 53 4667 "line": 54
4629 } 4668 }
4630 }, 4669 },
4631 { 4670 {
4632 "defaultMessage": "!!!Don't show message content in notifications", 4671 "defaultMessage": "!!!Don't show message content in notifications",
4633 "end": { 4672 "end": {
4634 "column": 3, 4673 "column": 3,
4635 "line": 60 4674 "line": 61
4636 }, 4675 },
4637 "file": "src/containers/settings/EditSettingsScreen.js", 4676 "file": "src/containers/settings/EditSettingsScreen.js",
4638 "id": "settings.app.form.privateNotifications", 4677 "id": "settings.app.form.privateNotifications",
4639 "start": { 4678 "start": {
4640 "column": 24, 4679 "column": 24,
4641 "line": 57 4680 "line": 58
4642 } 4681 }
4643 }, 4682 },
4644 { 4683 {
4645 "defaultMessage": "!!!Navigation bar behaviour", 4684 "defaultMessage": "!!!Navigation bar behaviour",
4646 "end": { 4685 "end": {
4647 "column": 3, 4686 "column": 3,
4648 "line": 64 4687 "line": 65
4649 }, 4688 },
4650 "file": "src/containers/settings/EditSettingsScreen.js", 4689 "file": "src/containers/settings/EditSettingsScreen.js",
4651 "id": "settings.app.form.navigationBarBehaviour", 4690 "id": "settings.app.form.navigationBarBehaviour",
4652 "start": { 4691 "start": {
4653 "column": 26, 4692 "column": 26,
4654 "line": 61 4693 "line": 62
4655 } 4694 }
4656 }, 4695 },
4657 { 4696 {
4658 "defaultMessage": "!!!Send telemetry data", 4697 "defaultMessage": "!!!Send telemetry data",
4659 "end": { 4698 "end": {
4660 "column": 3, 4699 "column": 3,
4661 "line": 68 4700 "line": 69
4662 }, 4701 },
4663 "file": "src/containers/settings/EditSettingsScreen.js", 4702 "file": "src/containers/settings/EditSettingsScreen.js",
4664 "id": "settings.app.form.sentry", 4703 "id": "settings.app.form.sentry",
4665 "start": { 4704 "start": {
4666 "column": 10, 4705 "column": 10,
4667 "line": 65 4706 "line": 66
4668 } 4707 }
4669 }, 4708 },
4670 { 4709 {
4671 "defaultMessage": "!!!Enable service hibernation", 4710 "defaultMessage": "!!!Enable service hibernation",
4672 "end": { 4711 "end": {
4673 "column": 3, 4712 "column": 3,
4674 "line": 72 4713 "line": 73
4675 }, 4714 },
4676 "file": "src/containers/settings/EditSettingsScreen.js", 4715 "file": "src/containers/settings/EditSettingsScreen.js",
4677 "id": "settings.app.form.hibernate", 4716 "id": "settings.app.form.hibernate",
4678 "start": { 4717 "start": {
4679 "column": 13, 4718 "column": 13,
4680 "line": 69 4719 "line": 70
4681 } 4720 }
4682 }, 4721 },
4683 { 4722 {
4684 "defaultMessage": "!!!Keep services in hibernation on startup", 4723 "defaultMessage": "!!!Keep services in hibernation on startup",
4685 "end": { 4724 "end": {
4686 "column": 3, 4725 "column": 3,
4687 "line": 76 4726 "line": 77
4688 }, 4727 },
4689 "file": "src/containers/settings/EditSettingsScreen.js", 4728 "file": "src/containers/settings/EditSettingsScreen.js",
4690 "id": "settings.app.form.hibernateOnStartup", 4729 "id": "settings.app.form.hibernateOnStartup",
4691 "start": { 4730 "start": {
4692 "column": 22, 4731 "column": 22,
4693 "line": 73 4732 "line": 74
4694 } 4733 }
4695 }, 4734 },
4696 { 4735 {
4697 "defaultMessage": "!!!Hibernation strategy", 4736 "defaultMessage": "!!!Hibernation strategy",
4698 "end": { 4737 "end": {
4699 "column": 3, 4738 "column": 3,
4700 "line": 80 4739 "line": 81
4701 }, 4740 },
4702 "file": "src/containers/settings/EditSettingsScreen.js", 4741 "file": "src/containers/settings/EditSettingsScreen.js",
4703 "id": "settings.app.form.hibernationStrategy", 4742 "id": "settings.app.form.hibernationStrategy",
4704 "start": { 4743 "start": {
4705 "column": 23, 4744 "column": 23,
4706 "line": 77 4745 "line": 78
4707 } 4746 }
4708 }, 4747 },
4709 { 4748 {
4710 "defaultMessage": "!!!Todo Server", 4749 "defaultMessage": "!!!Todo Server",
4711 "end": { 4750 "end": {
4712 "column": 3, 4751 "column": 3,
4713 "line": 84 4752 "line": 85
4714 }, 4753 },
4715 "file": "src/containers/settings/EditSettingsScreen.js", 4754 "file": "src/containers/settings/EditSettingsScreen.js",
4716 "id": "settings.app.form.predefinedTodoServer", 4755 "id": "settings.app.form.predefinedTodoServer",
4717 "start": { 4756 "start": {
4718 "column": 24, 4757 "column": 24,
4719 "line": 81 4758 "line": 82
4720 } 4759 }
4721 }, 4760 },
4722 { 4761 {
4723 "defaultMessage": "!!!Custom TodoServer", 4762 "defaultMessage": "!!!Custom TodoServer",
4724 "end": { 4763 "end": {
4725 "column": 3, 4764 "column": 3,
4726 "line": 88 4765 "line": 89
4727 }, 4766 },
4728 "file": "src/containers/settings/EditSettingsScreen.js", 4767 "file": "src/containers/settings/EditSettingsScreen.js",
4729 "id": "settings.app.form.customTodoServer", 4768 "id": "settings.app.form.customTodoServer",
4730 "start": { 4769 "start": {
4731 "column": 20, 4770 "column": 20,
4732 "line": 85 4771 "line": 86
4733 } 4772 }
4734 }, 4773 },
4735 { 4774 {
4736 "defaultMessage": "!!!Enable Password Lock", 4775 "defaultMessage": "!!!Enable Password Lock",
4737 "end": { 4776 "end": {
4738 "column": 3, 4777 "column": 3,
4739 "line": 92 4778 "line": 93
4740 }, 4779 },
4741 "file": "src/containers/settings/EditSettingsScreen.js", 4780 "file": "src/containers/settings/EditSettingsScreen.js",
4742 "id": "settings.app.form.enableLock", 4781 "id": "settings.app.form.enableLock",
4743 "start": { 4782 "start": {
4744 "column": 14, 4783 "column": 14,
4745 "line": 89 4784 "line": 90
4746 } 4785 }
4747 }, 4786 },
4748 { 4787 {
4749 "defaultMessage": "!!!Password", 4788 "defaultMessage": "!!!Password",
4750 "end": { 4789 "end": {
4751 "column": 3, 4790 "column": 3,
4752 "line": 96 4791 "line": 97
4753 }, 4792 },
4754 "file": "src/containers/settings/EditSettingsScreen.js", 4793 "file": "src/containers/settings/EditSettingsScreen.js",
4755 "id": "settings.app.form.lockPassword", 4794 "id": "settings.app.form.lockPassword",
4756 "start": { 4795 "start": {
4757 "column": 16, 4796 "column": 16,
4758 "line": 93 4797 "line": 94
4759 } 4798 }
4760 }, 4799 },
4761 { 4800 {
4762 "defaultMessage": "!!!Allow using Touch ID to unlock", 4801 "defaultMessage": "!!!Allow using Touch ID to unlock",
4763 "end": { 4802 "end": {
4764 "column": 3, 4803 "column": 3,
4765 "line": 100 4804 "line": 101
4766 }, 4805 },
4767 "file": "src/containers/settings/EditSettingsScreen.js", 4806 "file": "src/containers/settings/EditSettingsScreen.js",
4768 "id": "settings.app.form.useTouchIdToUnlock", 4807 "id": "settings.app.form.useTouchIdToUnlock",
4769 "start": { 4808 "start": {
4770 "column": 22, 4809 "column": 22,
4771 "line": 97 4810 "line": 98
4772 } 4811 }
4773 }, 4812 },
4774 { 4813 {
4775 "defaultMessage": "!!!Lock after inactivity", 4814 "defaultMessage": "!!!Lock after inactivity",
4776 "end": { 4815 "end": {
4777 "column": 3, 4816 "column": 3,
4778 "line": 104 4817 "line": 105
4779 }, 4818 },
4780 "file": "src/containers/settings/EditSettingsScreen.js", 4819 "file": "src/containers/settings/EditSettingsScreen.js",
4781 "id": "settings.app.form.inactivityLock", 4820 "id": "settings.app.form.inactivityLock",
4782 "start": { 4821 "start": {
4783 "column": 18, 4822 "column": 18,
4784 "line": 101 4823 "line": 102
4785 } 4824 }
4786 }, 4825 },
4787 { 4826 {
4788 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 4827 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
4789 "end": { 4828 "end": {
4790 "column": 3, 4829 "column": 3,
4791 "line": 108 4830 "line": 109
4792 }, 4831 },
4793 "file": "src/containers/settings/EditSettingsScreen.js", 4832 "file": "src/containers/settings/EditSettingsScreen.js",
4794 "id": "settings.app.form.scheduledDNDEnabled", 4833 "id": "settings.app.form.scheduledDNDEnabled",
4795 "start": { 4834 "start": {
4796 "column": 23, 4835 "column": 23,
4797 "line": 105 4836 "line": 106
4798 } 4837 }
4799 }, 4838 },
4800 { 4839 {
4801 "defaultMessage": "!!!From", 4840 "defaultMessage": "!!!From",
4802 "end": { 4841 "end": {
4803 "column": 3, 4842 "column": 3,
4804 "line": 112 4843 "line": 113
4805 }, 4844 },
4806 "file": "src/containers/settings/EditSettingsScreen.js", 4845 "file": "src/containers/settings/EditSettingsScreen.js",
4807 "id": "settings.app.form.scheduledDNDStart", 4846 "id": "settings.app.form.scheduledDNDStart",
4808 "start": { 4847 "start": {
4809 "column": 21, 4848 "column": 21,
4810 "line": 109 4849 "line": 110
4811 } 4850 }
4812 }, 4851 },
4813 { 4852 {
4814 "defaultMessage": "!!!To", 4853 "defaultMessage": "!!!To",
4815 "end": { 4854 "end": {
4816 "column": 3, 4855 "column": 3,
4817 "line": 116 4856 "line": 117
4818 }, 4857 },
4819 "file": "src/containers/settings/EditSettingsScreen.js", 4858 "file": "src/containers/settings/EditSettingsScreen.js",
4820 "id": "settings.app.form.scheduledDNDEnd", 4859 "id": "settings.app.form.scheduledDNDEnd",
4821 "start": { 4860 "start": {
4822 "column": 19, 4861 "column": 19,
4823 "line": 113 4862 "line": 114
4824 } 4863 }
4825 }, 4864 },
4826 { 4865 {
4827 "defaultMessage": "!!!Language", 4866 "defaultMessage": "!!!Language",
4828 "end": { 4867 "end": {
4829 "column": 3, 4868 "column": 3,
4830 "line": 120 4869 "line": 121
4831 }, 4870 },
4832 "file": "src/containers/settings/EditSettingsScreen.js", 4871 "file": "src/containers/settings/EditSettingsScreen.js",
4833 "id": "settings.app.form.language", 4872 "id": "settings.app.form.language",
4834 "start": { 4873 "start": {
4835 "column": 12, 4874 "column": 12,
4836 "line": 117 4875 "line": 118
4837 } 4876 }
4838 }, 4877 },
4839 { 4878 {
4840 "defaultMessage": "!!!Dark Mode", 4879 "defaultMessage": "!!!Dark Mode",
4841 "end": { 4880 "end": {
4842 "column": 3, 4881 "column": 3,
4843 "line": 124 4882 "line": 125
4844 }, 4883 },
4845 "file": "src/containers/settings/EditSettingsScreen.js", 4884 "file": "src/containers/settings/EditSettingsScreen.js",
4846 "id": "settings.app.form.darkMode", 4885 "id": "settings.app.form.darkMode",
4847 "start": { 4886 "start": {
4848 "column": 12, 4887 "column": 12,
4849 "line": 121 4888 "line": 122
4850 } 4889 }
4851 }, 4890 },
4852 { 4891 {
4853 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 4892 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
4854 "end": { 4893 "end": {
4855 "column": 3, 4894 "column": 3,
4856 "line": 128 4895 "line": 129
4857 }, 4896 },
4858 "file": "src/containers/settings/EditSettingsScreen.js", 4897 "file": "src/containers/settings/EditSettingsScreen.js",
4859 "id": "settings.app.form.adaptableDarkMode", 4898 "id": "settings.app.form.adaptableDarkMode",
4860 "start": { 4899 "start": {
4861 "column": 21, 4900 "column": 21,
4862 "line": 125 4901 "line": 126
4863 } 4902 }
4864 }, 4903 },
4865 { 4904 {
4866 "defaultMessage": "!!!Enable universal Dark Mode", 4905 "defaultMessage": "!!!Enable universal Dark Mode",
4867 "end": { 4906 "end": {
4868 "column": 3, 4907 "column": 3,
4869 "line": 132 4908 "line": 133
4870 }, 4909 },
4871 "file": "src/containers/settings/EditSettingsScreen.js", 4910 "file": "src/containers/settings/EditSettingsScreen.js",
4872 "id": "settings.app.form.universalDarkMode", 4911 "id": "settings.app.form.universalDarkMode",
4873 "start": { 4912 "start": {
4874 "column": 21, 4913 "column": 21,
4875 "line": 129 4914 "line": 130
4876 } 4915 }
4877 }, 4916 },
4878 { 4917 {
4879 "defaultMessage": "!!!Sidebar width", 4918 "defaultMessage": "!!!Sidebar width",
4880 "end": { 4919 "end": {
4881 "column": 3, 4920 "column": 3,
4882 "line": 136 4921 "line": 137
4883 }, 4922 },
4884 "file": "src/containers/settings/EditSettingsScreen.js", 4923 "file": "src/containers/settings/EditSettingsScreen.js",
4885 "id": "settings.app.form.serviceRibbonWidth", 4924 "id": "settings.app.form.serviceRibbonWidth",
4886 "start": { 4925 "start": {
4887 "column": 22, 4926 "column": 22,
4888 "line": 133 4927 "line": 134
4889 } 4928 }
4890 }, 4929 },
4891 { 4930 {
4892 "defaultMessage": "!!!Service icon size", 4931 "defaultMessage": "!!!Service icon size",
4893 "end": { 4932 "end": {
4894 "column": 3, 4933 "column": 3,
4895 "line": 140 4934 "line": 141
4896 }, 4935 },
4897 "file": "src/containers/settings/EditSettingsScreen.js", 4936 "file": "src/containers/settings/EditSettingsScreen.js",
4898 "id": "settings.app.form.iconSize", 4937 "id": "settings.app.form.iconSize",
4899 "start": { 4938 "start": {
4900 "column": 12, 4939 "column": 12,
4901 "line": 137 4940 "line": 138
4902 } 4941 }
4903 }, 4942 },
4904 { 4943 {
4905 "defaultMessage": "!!!Accent color", 4944 "defaultMessage": "!!!Accent color",
4906 "end": { 4945 "end": {
4907 "column": 3, 4946 "column": 3,
4908 "line": 144 4947 "line": 145
4909 }, 4948 },
4910 "file": "src/containers/settings/EditSettingsScreen.js", 4949 "file": "src/containers/settings/EditSettingsScreen.js",
4911 "id": "settings.app.form.accentColor", 4950 "id": "settings.app.form.accentColor",
4912 "start": { 4951 "start": {
4913 "column": 15, 4952 "column": 15,
4914 "line": 141 4953 "line": 142
4915 } 4954 }
4916 }, 4955 },
4917 { 4956 {
4918 "defaultMessage": "!!!Display disabled services tabs", 4957 "defaultMessage": "!!!Display disabled services tabs",
4919 "end": { 4958 "end": {
4920 "column": 3, 4959 "column": 3,
4921 "line": 148 4960 "line": 149
4922 }, 4961 },
4923 "file": "src/containers/settings/EditSettingsScreen.js", 4962 "file": "src/containers/settings/EditSettingsScreen.js",
4924 "id": "settings.app.form.showDisabledServices", 4963 "id": "settings.app.form.showDisabledServices",
4925 "start": { 4964 "start": {
4926 "column": 24, 4965 "column": 24,
4927 "line": 145 4966 "line": 146
4928 } 4967 }
4929 }, 4968 },
4930 { 4969 {
4931 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 4970 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
4932 "end": { 4971 "end": {
4933 "column": 3, 4972 "column": 3,
4934 "line": 152 4973 "line": 153
4935 }, 4974 },
4936 "file": "src/containers/settings/EditSettingsScreen.js", 4975 "file": "src/containers/settings/EditSettingsScreen.js",
4937 "id": "settings.app.form.showMessagesBadgesWhenMuted", 4976 "id": "settings.app.form.showMessagesBadgesWhenMuted",
4938 "start": { 4977 "start": {
4939 "column": 29, 4978 "column": 29,
4940 "line": 149 4979 "line": 150
4941 } 4980 }
4942 }, 4981 },
4943 { 4982 {
4944 "defaultMessage": "!!!Show draggable area on window", 4983 "defaultMessage": "!!!Show draggable area on window",
4945 "end": { 4984 "end": {
4946 "column": 3, 4985 "column": 3,
4947 "line": 156 4986 "line": 157
4948 }, 4987 },
4949 "file": "src/containers/settings/EditSettingsScreen.js", 4988 "file": "src/containers/settings/EditSettingsScreen.js",
4950 "id": "settings.app.form.showDragArea", 4989 "id": "settings.app.form.showDragArea",
4951 "start": { 4990 "start": {
4952 "column": 16, 4991 "column": 16,
4953 "line": 153 4992 "line": 154
4954 } 4993 }
4955 }, 4994 },
4956 { 4995 {
4957 "defaultMessage": "!!!Enable spell checking", 4996 "defaultMessage": "!!!Enable spell checking",
4958 "end": { 4997 "end": {
4959 "column": 3, 4998 "column": 3,
4960 "line": 160 4999 "line": 161
4961 }, 5000 },
4962 "file": "src/containers/settings/EditSettingsScreen.js", 5001 "file": "src/containers/settings/EditSettingsScreen.js",
4963 "id": "settings.app.form.enableSpellchecking", 5002 "id": "settings.app.form.enableSpellchecking",
4964 "start": { 5003 "start": {
4965 "column": 23, 5004 "column": 23,
4966 "line": 157 5005 "line": 158
4967 } 5006 }
4968 }, 5007 },
4969 { 5008 {
4970 "defaultMessage": "!!!Enable GPU Acceleration", 5009 "defaultMessage": "!!!Enable GPU Acceleration",
4971 "end": { 5010 "end": {
4972 "column": 3, 5011 "column": 3,
4973 "line": 164 5012 "line": 165
4974 }, 5013 },
4975 "file": "src/containers/settings/EditSettingsScreen.js", 5014 "file": "src/containers/settings/EditSettingsScreen.js",
4976 "id": "settings.app.form.enableGPUAcceleration", 5015 "id": "settings.app.form.enableGPUAcceleration",
4977 "start": { 5016 "start": {
4978 "column": 25, 5017 "column": 25,
4979 "line": 161 5018 "line": 162
4980 } 5019 }
4981 }, 5020 },
4982 { 5021 {
4983 "defaultMessage": "!!!Include beta versions", 5022 "defaultMessage": "!!!Include beta versions",
4984 "end": { 5023 "end": {
4985 "column": 3, 5024 "column": 3,
4986 "line": 168 5025 "line": 169
4987 }, 5026 },
4988 "file": "src/containers/settings/EditSettingsScreen.js", 5027 "file": "src/containers/settings/EditSettingsScreen.js",
4989 "id": "settings.app.form.beta", 5028 "id": "settings.app.form.beta",
4990 "start": { 5029 "start": {
4991 "column": 8, 5030 "column": 8,
4992 "line": 165 5031 "line": 166
4993 } 5032 }
4994 }, 5033 },
4995 { 5034 {
4996 "defaultMessage": "!!!Enable updates", 5035 "defaultMessage": "!!!Enable updates",
4997 "end": { 5036 "end": {
4998 "column": 3, 5037 "column": 3,
4999 "line": 172 5038 "line": 173
5000 }, 5039 },
5001 "file": "src/containers/settings/EditSettingsScreen.js", 5040 "file": "src/containers/settings/EditSettingsScreen.js",
5002 "id": "settings.app.form.automaticUpdates", 5041 "id": "settings.app.form.automaticUpdates",
5003 "start": { 5042 "start": {
5004 "column": 20, 5043 "column": 20,
5005 "line": 169 5044 "line": 170
5006 } 5045 }
5007 }, 5046 },
5008 { 5047 {
5009 "defaultMessage": "!!!Enable Franz Todos", 5048 "defaultMessage": "!!!Enable Franz Todos",
5010 "end": { 5049 "end": {
5011 "column": 3, 5050 "column": 3,
5012 "line": 176 5051 "line": 177
5013 }, 5052 },
5014 "file": "src/containers/settings/EditSettingsScreen.js", 5053 "file": "src/containers/settings/EditSettingsScreen.js",
5015 "id": "settings.app.form.enableTodos", 5054 "id": "settings.app.form.enableTodos",
5016 "start": { 5055 "start": {
5017 "column": 15, 5056 "column": 15,
5018 "line": 173 5057 "line": 174
5019 } 5058 }
5020 }, 5059 },
5021 { 5060 {
5022 "defaultMessage": "!!!Keep all workspaces loaded", 5061 "defaultMessage": "!!!Keep all workspaces loaded",
5023 "end": { 5062 "end": {
5024 "column": 3, 5063 "column": 3,
5025 "line": 180 5064 "line": 181
5026 }, 5065 },
5027 "file": "src/containers/settings/EditSettingsScreen.js", 5066 "file": "src/containers/settings/EditSettingsScreen.js",
5028 "id": "settings.app.form.keepAllWorkspacesLoaded", 5067 "id": "settings.app.form.keepAllWorkspacesLoaded",
5029 "start": { 5068 "start": {
5030 "column": 27, 5069 "column": 27,
5031 "line": 177 5070 "line": 178
5032 } 5071 }
5033 } 5072 }
5034 ], 5073 ],
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index 88fe5a81d..b7fe119aa 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -1,21 +1,24 @@
1{ 1{
2 "app.errorHandler.action": "ΕπαναφόÏτωση", 2 "app.errorHandler.action": "ΕπαναφόÏτωση",
3 "app.errorHandler.headline": "Κάτι δεν λειτουÏγεί", 3 "app.errorHandler.headline": "Κάτι δεν λειτουÏγεί",
4 "changeserver.customServerLabel": "ΠÏοσαÏμοσμένος διακομιστής",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Διακομιστής",
6 "changeserver.submit": "Υποβολή", 7 "changeserver.submit": "Υποβολή",
8 "changeserver.urlError": "Εισάγετε μια έγκυÏη διεÏθυνση URL",
9 "changeserver.warning": "Οι επιπλέον Ïυθμίσεις από το Ferdi δεν θα αποθηκευτοÏν",
7 "connectionLostBanner.cta": "Ανανέωση ΥπηÏεσίας", 10 "connectionLostBanner.cta": "Ανανέωση ΥπηÏεσίας",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "Τι συνέβη;",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Ωχ όχι! Ο Ferdi έχασε την επικοινωνία με το",
10 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Αλλαγές σχετικά με το Ferdi",
11 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "ΕγγÏαφή πληÏοφοÏιών ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½",
12 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting", 15 "feature.delayApp.headline": "ΠαÏακαλοÏμε αγοÏάστε μία άδεια Ferdi για να παÏαλείψετε την αναμονή",
13 "feature.delayApp.text": "Ferdi θα συνεχίσει σε {seconds} δευτεÏόλεπτα.", 16 "feature.delayApp.text": "Ferdi θα συνεχίσει σε {seconds} δευτεÏόλεπτα.",
14 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional", 17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
15 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial", 18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
16 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line", 19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
17 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License", 20 "feature.delayApp.upgrade.action": "ΑγοÏάστε μία άδεια Ferdi",
18 "feature.delayApp.upgrade.actionShort": "Upgrade account", 21 "feature.delayApp.upgrade.actionShort": "Αναβαθμίστε τον λογαÏιασμό σας ",
19 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 22 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
20 "feature.planSelection.cta.stayOnFree": "Stay on Free", 23 "feature.planSelection.cta.stayOnFree": "Stay on Free",
21 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 24 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
@@ -182,7 +185,7 @@
182 "password.noUser": "Δεν βÏέθηκε χÏήστης με τη συγκεκÏιμένη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", 185 "password.noUser": "Δεν βÏέθηκε χÏήστης με τη συγκεκÏιμένη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου",
183 "password.submit.label": "Υποβολή", 186 "password.submit.label": "Υποβολή",
184 "password.successInfo": "Ελέγξτε το email σας", 187 "password.successInfo": "Ελέγξτε το email σας",
185 "premiumFeature.button.upgradeAccount": "Upgrade account", 188 "premiumFeature.button.upgradeAccount": "Αναβαθμίστε τον λογαÏιασμό σας ",
186 "pricing.features.accountSync": "Account Synchronisation", 189 "pricing.features.accountSync": "Account Synchronisation",
187 "pricing.features.adFree": "Forever ad-free", 190 "pricing.features.adFree": "Forever ad-free",
188 "pricing.features.appDelays": "No Waiting Screens", 191 "pricing.features.appDelays": "No Waiting Screens",
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 5c33daf86..dcaa2466a 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index a8518b5e3..03207e904 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Volver a cargar", 2 "app.errorHandler.action": "Recargar",
3 "app.errorHandler.headline": "Algo salió mal.", 3 "app.errorHandler.headline": "Algo salió mal.",
4 "changeserver.customServerLabel": "Servidor personalizado",
4 "changeserver.headline": "Cambiar servidor", 5 "changeserver.headline": "Cambiar servidor",
5 "changeserver.label": "Servidor", 6 "changeserver.label": "Servidor",
6 "changeserver.submit": "Enviar", 7 "changeserver.submit": "Enviar",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Recargar Servicio", 10 "connectionLostBanner.cta": "Recargar Servicio",
8 "connectionLostBanner.informationLink": "¿Qué ocurrió?", 11 "connectionLostBanner.informationLink": "¿Qué ocurrió?",
9 "connectionLostBanner.message": "¡Oh no! Ferdi perdió la conexión con {name}.", 12 "connectionLostBanner.message": "¡Oh no! Ferdi perdió la conexión con {name}.",
@@ -276,7 +279,7 @@
276 "settings.app.buttonInstallUpdate": "Reiniciar e instalar actualización", 279 "settings.app.buttonInstallUpdate": "Reiniciar e instalar actualización",
277 "settings.app.buttonSearchForUpdate": "Comprobar actualizaciones", 280 "settings.app.buttonSearchForUpdate": "Comprobar actualizaciones",
278 "settings.app.cacheInfo": "El cache de Ferdi actualmente usa {size} de espacio en disco.", 281 "settings.app.cacheInfo": "El cache de Ferdi actualmente usa {size} de espacio en disco.",
279 "settings.app.cacheNotCleared": "Couldn't clear all cache", 282 "settings.app.cacheNotCleared": "No se ha podido eliminar el cache",
280 "settings.app.currentVersion": "Versión actual:", 283 "settings.app.currentVersion": "Versión actual:",
281 "settings.app.form.accentColor": "Color de realce", 284 "settings.app.form.accentColor": "Color de realce",
282 "settings.app.form.adaptableDarkMode": "Sincroniza el modo oscuro con el ajuste del modo oscuro de mi Sistema Operativo", 285 "settings.app.form.adaptableDarkMode": "Sincroniza el modo oscuro con el ajuste del modo oscuro de mi Sistema Operativo",
@@ -292,7 +295,7 @@
292 "settings.app.form.enableSystemTray": "Mostrar Ferdi en la bandeja del sistema", 295 "settings.app.form.enableSystemTray": "Mostrar Ferdi en la bandeja del sistema",
293 "settings.app.form.enableTodos": "Activar Ferdi Todos", 296 "settings.app.form.enableTodos": "Activar Ferdi Todos",
294 "settings.app.form.hibernate": "Habilitar hibernación del servicio", 297 "settings.app.form.hibernate": "Habilitar hibernación del servicio",
295 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 298 "settings.app.form.hibernateOnStartup": "Mantener los servicios en hibernación al iniciar",
296 "settings.app.form.hibernationStrategy": "Estrategia de hibernación", 299 "settings.app.form.hibernationStrategy": "Estrategia de hibernación",
297 "settings.app.form.iconSize": "Tamaño del icono del servicio", 300 "settings.app.form.iconSize": "Tamaño del icono del servicio",
298 "settings.app.form.inactivityLock": "Bloquear tras inactividad", 301 "settings.app.form.inactivityLock": "Bloquear tras inactividad",
@@ -371,9 +374,9 @@
371 "settings.service.form.customUrlPremiumInfo": "Para añadir tus propios servicios, necesitas una Cuenta Colaborador Premium de Ferdi.", 374 "settings.service.form.customUrlPremiumInfo": "Para añadir tus propios servicios, necesitas una Cuenta Colaborador Premium de Ferdi.",
372 "settings.service.form.customUrlUpgradeAccount": "Mejora tu cuenta", 375 "settings.service.form.customUrlUpgradeAccount": "Mejora tu cuenta",
373 "settings.service.form.customUrlValidationError": "No se pudo validar el servidor personalizado {name}.", 376 "settings.service.form.customUrlValidationError": "No se pudo validar el servidor personalizado {name}.",
374 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 377 "settings.service.form.darkReaderBrightness": "Brillo del Lector Oscuro",
375 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 378 "settings.service.form.darkReaderContrast": "Contraste del Lector Oscuro",
376 "settings.service.form.darkReaderSepia": "Dark Reader Sepia", 379 "settings.service.form.darkReaderSepia": "Lector Oscuro Sepia",
377 "settings.service.form.deleteButton": "Eliminar servicio", 380 "settings.service.form.deleteButton": "Eliminar servicio",
378 "settings.service.form.disableHibernation": "Desactivar hibernación", 381 "settings.service.form.disableHibernation": "Desactivar hibernación",
379 "settings.service.form.disableHibernationInfo": "Actualmente tienes la hibernación habilitada, pero puedes desactivar la hibernación para servicios individuales usando esta opción.", 382 "settings.service.form.disableHibernationInfo": "Actualmente tienes la hibernación habilitada, pero puedes desactivar la hibernación para servicios individuales usando esta opción.",
@@ -384,7 +387,7 @@
384 "settings.service.form.enableNotification": "Activar notificaciones", 387 "settings.service.form.enableNotification": "Activar notificaciones",
385 "settings.service.form.enableService": "Activar servicio", 388 "settings.service.form.enableService": "Activar servicio",
386 "settings.service.form.headlineBadges": "Insignias de mensaje no leídos", 389 "settings.service.form.headlineBadges": "Insignias de mensaje no leídos",
387 "settings.service.form.headlineDarkReaderSettings": "Dark Reader Settings", 390 "settings.service.form.headlineDarkReaderSettings": "Configuración del Lector Oscuro",
388 "settings.service.form.headlineGeneral": "General", 391 "settings.service.form.headlineGeneral": "General",
389 "settings.service.form.headlineNotifications": "Notificaciones", 392 "settings.service.form.headlineNotifications": "Notificaciones",
390 "settings.service.form.icon": "Icono Personalizado", 393 "settings.service.form.icon": "Icono Personalizado",
@@ -447,8 +450,8 @@
447 "settings.workspace.add.form.submitButton": "Crear un sitio de trabajo", 450 "settings.workspace.add.form.submitButton": "Crear un sitio de trabajo",
448 "settings.workspace.form.buttonDelete": "Eliminar espacio de trabajo", 451 "settings.workspace.form.buttonDelete": "Eliminar espacio de trabajo",
449 "settings.workspace.form.buttonSave": "Guardar espacio de trabajo", 452 "settings.workspace.form.buttonSave": "Guardar espacio de trabajo",
450 "settings.workspace.form.keepLoaded": "Keep this workspace loaded*", 453 "settings.workspace.form.keepLoaded": "Mantener este espacio de trabajo cargado*",
451 "settings.workspace.form.keepLoadedInfo": "*This option will be overwritten by the global \"Keep all workspaces loaded\" option.", 454 "settings.workspace.form.keepLoadedInfo": "*Esta opción será sobrescrita por la opción global \"Mantener todas las áreas de trabajo cargadas\".",
452 "settings.workspace.form.name": "Nombre", 455 "settings.workspace.form.name": "Nombre",
453 "settings.workspace.form.servicesInWorkspaceHeadline": "Servicios en este espacio de trabajo", 456 "settings.workspace.form.servicesInWorkspaceHeadline": "Servicios en este espacio de trabajo",
454 "settings.workspace.form.yourWorkspaces": "Tus espacios de trabajo", 457 "settings.workspace.form.yourWorkspaces": "Tus espacios de trabajo",
@@ -458,10 +461,10 @@
458 "settings.workspaces.tryReloadWorkspaces": "Intentar de nuevo", 461 "settings.workspaces.tryReloadWorkspaces": "Intentar de nuevo",
459 "settings.workspaces.updatedInfo": "Tus cambios han sido guardados", 462 "settings.workspaces.updatedInfo": "Tus cambios han sido guardados",
460 "settings.workspaces.workspaceFeatureHeadline": "Menos es más: Presentación de Ferdi Workspaces", 463 "settings.workspaces.workspaceFeatureHeadline": "Menos es más: Presentación de Ferdi Workspaces",
461 "settings.workspaces.workspaceFeatureInfo": "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 464 "settings.workspaces.workspaceFeatureInfo": "Los espacios de trabajo Ferdi permiten centrarse en lo que es importante. Configure diferentes conjuntos de servicios y cambie fácilmente entre ellos en cualquier momento. Usted decide qué servicios necesita, cuándo y dónde, para que podamos ayudarte a mantenerte al tanto - o apartarte fácilmente del trabajo cuando asi lo desees.",
462 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", 465 "settings.workspaces.workspacesRequestFailed": "No se han podido cargar sus áreas de trabajo",
463 "sidebar.addNewService": "Añadir nuevo servicio", 466 "sidebar.addNewService": "Añadir nuevo servicio",
464 "sidebar.closeTodosDrawer": "Close Ferdi Todos", 467 "sidebar.closeTodosDrawer": "Cerrar Ferdi Todos",
465 "sidebar.closeWorkspaceDrawer": "Cerrar cajón de espacio de trabajo", 468 "sidebar.closeWorkspaceDrawer": "Cerrar cajón de espacio de trabajo",
466 "sidebar.lockFerdi": "Bloquear Ferdi", 469 "sidebar.lockFerdi": "Bloquear Ferdi",
467 "sidebar.muteApp": "Desactivar notificaciones y sonido", 470 "sidebar.muteApp": "Desactivar notificaciones y sonido",
@@ -482,15 +485,15 @@
482 "signup.submit.label": "Crear cuenta", 485 "signup.submit.label": "Crear cuenta",
483 "subscription.bestValue": "Best value", 486 "subscription.bestValue": "Best value",
484 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial", 487 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
485 "subscription.cta.allOptions": "See all options", 488 "subscription.cta.allOptions": "Ver todas las opciones",
486 "subscription.cta.choosePlan": "Choose your plan", 489 "subscription.cta.choosePlan": "Elije tu plan",
487 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:", 490 "subscription.includedProFeatures": "El Plan Profesional de Ferdi incluye:",
488 "subscription.interval.per": "per {interval}", 491 "subscription.interval.per": "por {interval}",
489 "subscription.interval.perMonth": "per month", 492 "subscription.interval.perMonth": "al mes",
490 "subscription.interval.perMonthPerUser": "per month & user", 493 "subscription.interval.perMonthPerUser": "por mes y usuario",
491 "subscription.planItem.upgradeAccount": "Actualizar cuenta", 494 "subscription.planItem.upgradeAccount": "Actualizar cuenta",
492 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:", 495 "subscription.teaser.includedFeatures": "Los planes de pago de Ferdi incluyen:",
493 "subscription.teaser.intro": "Ferdi 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!", 496 "subscription.teaser.intro": "Ferdi 5 viene con una amplia gama de nuevas características para mejorar tu comunicación diaria - baterías incluidas. ¡Echa un vistazo a nuestros nuevos planes y descubra cuál le conviene más!",
494 "subscriptionPopup.buttonCancel": "Cancelar", 497 "subscriptionPopup.buttonCancel": "Cancelar",
495 "subscriptionPopup.buttonDone": "Listo", 498 "subscriptionPopup.buttonDone": "Listo",
496 "tabs.item.deleteService": "Eliminar servicio", 499 "tabs.item.deleteService": "Eliminar servicio",
@@ -501,7 +504,7 @@
501 "tabs.item.enableAudio": "Habilitar audio", 504 "tabs.item.enableAudio": "Habilitar audio",
502 "tabs.item.enableNotification": "Activar notificaciones", 505 "tabs.item.enableNotification": "Activar notificaciones",
503 "tabs.item.enableService": "Activar servicio", 506 "tabs.item.enableService": "Activar servicio",
504 "tabs.item.reload": "Volver a cargar", 507 "tabs.item.reload": "Recargar",
505 "validation.email": "{field} no es válido", 508 "validation.email": "{field} no es válido",
506 "validation.minLength": "{field} debería tener al menos {length} caracteres", 509 "validation.minLength": "{field} debería tener al menos {length} caracteres",
507 "validation.oneRequired": "Al menos uno es requerido", 510 "validation.oneRequired": "Al menos uno es requerido",
@@ -510,19 +513,19 @@
510 "webControls.back": "Volver", 513 "webControls.back": "Volver",
511 "webControls.forward": "Siguiente", 514 "webControls.forward": "Siguiente",
512 "webControls.goHome": "Inicio", 515 "webControls.goHome": "Inicio",
513 "webControls.openInBrowser": "Open in Browser", 516 "webControls.openInBrowser": "Abrir en navegador",
514 "webControls.reload": "Volver a cargar", 517 "webControls.reload": "Recargar",
515 "welcome.loginButton": "Accede a tu cuenta", 518 "welcome.loginButton": "Accede a tu cuenta",
516 "welcome.signupButton": "Crear una cuenta gratuita", 519 "welcome.signupButton": "Crear una cuenta gratuita",
517 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace", 520 "workspaceDrawer.addNewWorkspaceLabel": "Añadir nuevo espacio de trabajo",
518 "workspaceDrawer.allServices": "Todos los servicios", 521 "workspaceDrawer.allServices": "Todos los servicios",
519 "workspaceDrawer.headline": "Espacios de trabajo", 522 "workspaceDrawer.headline": "Espacios de trabajo",
520 "workspaceDrawer.item.contextMenuEdit": "edit", 523 "workspaceDrawer.item.contextMenuEdit": "editar",
521 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 524 "workspaceDrawer.item.noServicesAddedYet": "Ningún servicio ha sido añadido",
522 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 525 "workspaceDrawer.premiumCtaButtonLabel": "Crea tu primer área de trabajo",
523 "workspaceDrawer.proFeatureBadge": "Premium feature", 526 "workspaceDrawer.proFeatureBadge": "Función Premium",
524 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 527 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivar cuenta premium",
525 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>", 528 "workspaceDrawer.workspaceFeatureInfo": "<p>Los espacios de trabajo Ferdi permiten centrarse en lo que es importante. Configure diferentes conjuntos de servicios y cambie fácilmente entre ellos en cualquier momento. </p><p>Usted decide qué servicios necesita, cuándo y dónde, para que podamos ayudarte a mantenerte al tanto - o apartarte fácilmente del trabajo cuando asi lo desees.</p>",
526 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 529 "workspaceDrawer.workspacesSettingsTooltip": "Editar ajustes de áreas de trabajo",
527 "workspaces.switchingIndicator.switchingTo": "Switching to" 530 "workspaces.switchingIndicator.switchingTo": "Cambiando a"
528} 531}
diff --git a/src/i18n/locales/fi.json b/src/i18n/locales/fi.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/fi.json
+++ b/src/i18n/locales/fi.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index c898f47f2..78c08558e 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Actualiser", 2 "app.errorHandler.action": "Actualiser",
3 "app.errorHandler.headline": "On dirait que quelque chose ne va pas", 3 "app.errorHandler.headline": "On dirait que quelque chose ne va pas",
4 "changeserver.customServerLabel": "Serveur personnalisé",
4 "changeserver.headline": "Changer de serveur", 5 "changeserver.headline": "Changer de serveur",
5 "changeserver.label": "Serveur", 6 "changeserver.label": "Serveur",
6 "changeserver.submit": "Soumettre", 7 "changeserver.submit": "Soumettre",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Redémarrer le service", 10 "connectionLostBanner.cta": "Redémarrer le service",
8 "connectionLostBanner.informationLink": "Que s'est-il passé?", 11 "connectionLostBanner.informationLink": "Que s'est-il passé?",
9 "connectionLostBanner.message": "Oh non ! Ferdi a perdu la connexion avec {name}.", 12 "connectionLostBanner.message": "Oh non ! Ferdi a perdu la connexion avec {name}.",
@@ -276,7 +279,7 @@
276 "settings.app.buttonInstallUpdate": "Redémarrer et installer la mise à jour", 279 "settings.app.buttonInstallUpdate": "Redémarrer et installer la mise à jour",
277 "settings.app.buttonSearchForUpdate": "Vérifier les mises à jour", 280 "settings.app.buttonSearchForUpdate": "Vérifier les mises à jour",
278 "settings.app.cacheInfo": "Le cache de Ferdi occupe actuellement {size} en espace disque.", 281 "settings.app.cacheInfo": "Le cache de Ferdi occupe actuellement {size} en espace disque.",
279 "settings.app.cacheNotCleared": "Couldn't clear all cache", 282 "settings.app.cacheNotCleared": "Impossible de vider toute la cache",
280 "settings.app.currentVersion": "Version actuelle :", 283 "settings.app.currentVersion": "Version actuelle :",
281 "settings.app.form.accentColor": "Couleur d'accentuation", 284 "settings.app.form.accentColor": "Couleur d'accentuation",
282 "settings.app.form.adaptableDarkMode": "Synchroniser le mode sombre avec l'option mode sombre du système", 285 "settings.app.form.adaptableDarkMode": "Synchroniser le mode sombre avec l'option mode sombre du système",
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index d930ab415..a937b084e 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Athlódáil", 2 "app.errorHandler.action": "Athlódáil",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Freastalaí saincheaptha",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Cuir isteach", 7 "changeserver.submit": "Cuir isteach",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Athlódáil seirbhís", 10 "connectionLostBanner.cta": "Athlódáil seirbhís",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/he.json
+++ b/src/i18n/locales/he.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index 79616f9f5..99916d529 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Ponovno uÄitavanje", 2 "app.errorHandler.action": "Ponovno uÄitavanje",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Prilagođen server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Pošalji", 7 "changeserver.submit": "Pošalji",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 07603df52..0c27f706d 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -1,14 +1,17 @@
1{ 1{
2 "app.errorHandler.action": "Újratöltés", 2 "app.errorHandler.action": "Újratöltés",
3 "app.errorHandler.headline": "Valami nem jött össze", 3 "app.errorHandler.headline": "Valami nem jött össze",
4 "changeserver.customServerLabel": "Egyéni szerver",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Szerver",
6 "changeserver.submit": "Küldés", 7 "changeserver.submit": "Küldés",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Szolgáltatás újraindítása", 10 "connectionLostBanner.cta": "Szolgáltatás újraindítása",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "Mi történt?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Ja ne! Ferdi nem tud kapcsolodni {name}-hez.",
10 "feature.announcements.changelog.headline": "Ferdi {version} változásai", 13 "feature.announcements.changelog.headline": "Ferdi {version} változásai",
11 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Hibakeresési napló publikálása",
12 "feature.delayApp.headline": "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához", 15 "feature.delayApp.headline": "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához",
13 "feature.delayApp.text": "A Ferdi továbblép {seconds} másodperc múlva.", 16 "feature.delayApp.text": "A Ferdi továbblép {seconds} másodperc múlva.",
14 "feature.delayApp.trial.action": "Igen, szeretném kipróbálni 14 napig a Ferdi Professional-t ingyen", 17 "feature.delayApp.trial.action": "Igen, szeretném kipróbálni 14 napig a Ferdi Professional-t ingyen",
@@ -32,15 +35,15 @@
32 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", 35 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
33 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment", 36 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
34 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", 37 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
35 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 38 "feature.publishDebugInfo.error": "Hiba történt a hibakeresési napló publikálása közben. Kérem próbálja meg később.",
36 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 39 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
37 "feature.publishDebugInfo.privacy": "Privacy policy", 40 "feature.publishDebugInfo.privacy": "Adatvédelmi szabályzat",
38 "feature.publishDebugInfo.publish": "Accept and publish", 41 "feature.publishDebugInfo.publish": "Elfogadás és közzététel",
39 "feature.publishDebugInfo.published": "Your debug log was published and is now availible at", 42 "feature.publishDebugInfo.published": "Your debug log was published and is now availible at",
40 "feature.publishDebugInfo.terms": "Felhasználási Feltételeket", 43 "feature.publishDebugInfo.terms": "Felhasználási Feltételeket",
41 "feature.publishDebugInfo.title": "Publish debug information", 44 "feature.publishDebugInfo.title": "Hibakeresési napló publikálása",
42 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 45 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
43 "feature.quickSwitch.search": "Search...", 46 "feature.quickSwitch.search": "Keresés...",
44 "feature.quickSwitch.title": "QuickSwitch", 47 "feature.quickSwitch.title": "QuickSwitch",
45 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", 48 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
46 "feature.shareFranz.action.email": "Küldés email-ben", 49 "feature.shareFranz.action.email": "Küldés email-ben",
@@ -86,14 +89,14 @@
86 "invite.skip.label": "Későbbre halasztom", 89 "invite.skip.label": "Későbbre halasztom",
87 "invite.submit.label": "Meghívók küldése", 90 "invite.submit.label": "Meghívók küldése",
88 "invite.successInfo": "Meghívás sikeresen elküldve", 91 "invite.successInfo": "Meghívás sikeresen elküldve",
89 "locked.headline": "Locked", 92 "locked.headline": "Zárolva",
90 "locked.info": "Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.", 93 "locked.info": "Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.",
91 "locked.invalidCredentials": "Password invalid", 94 "locked.invalidCredentials": "Password invalid",
92 "locked.password.label": "Password", 95 "locked.password.label": "Password",
93 "locked.submit.label": "Unlock", 96 "locked.submit.label": "Feloldás",
94 "locked.touchId": "Unlock with Touch ID", 97 "locked.touchId": "Feloldás ujjlenyomattal",
95 "locked.touchIdPrompt": "unlock via Touch ID", 98 "locked.touchIdPrompt": "feloldás ujjlenyomattal",
96 "locked.unlockWithPassword": "Unlock with Password", 99 "locked.unlockWithPassword": "Feloldás jelszóval",
97 "login.changeServer": "Change server", 100 "login.changeServer": "Change server",
98 "login.customServerQuestion": "Using a custom Ferdi server?", 101 "login.customServerQuestion": "Using a custom Ferdi server?",
99 "login.customServerSuggestion": "Try importing your Franz account", 102 "login.customServerSuggestion": "Try importing your Franz account",
@@ -151,10 +154,10 @@
151 "menu.todos": "Tennivalók", 154 "menu.todos": "Tennivalók",
152 "menu.todos.enableTodos": "Enable Todos", 155 "menu.todos.enableTodos": "Enable Todos",
153 "menu.view": "Nézet", 156 "menu.view": "Nézet",
154 "menu.view.back": "Back", 157 "menu.view.back": "Vissza",
155 "menu.view.enterFullScreen": "Kilépés a teljes képernyős módból", 158 "menu.view.enterFullScreen": "Kilépés a teljes képernyős módból",
156 "menu.view.exitFullScreen": "Kilépés a teljes képernyős módból", 159 "menu.view.exitFullScreen": "Kilépés a teljes képernyős módból",
157 "menu.view.forward": "Forward", 160 "menu.view.forward": "Előre",
158 "menu.view.lockFerdi": "Lock Ferdi", 161 "menu.view.lockFerdi": "Lock Ferdi",
159 "menu.view.openQuickSwitch": "Open Quick Switch", 162 "menu.view.openQuickSwitch": "Open Quick Switch",
160 "menu.view.reloadFranz": "Ferdi újrainditása", 163 "menu.view.reloadFranz": "Ferdi újrainditása",
@@ -200,7 +203,7 @@
200 "pricing.features.upToThreeServices": "Add up to 3 services", 203 "pricing.features.upToThreeServices": "Add up to 3 services",
201 "pricing.features.workspaces": "Munkaterületek", 204 "pricing.features.workspaces": "Munkaterületek",
202 "pricing.plan.free": "Ingyenes Ferdi", 205 "pricing.plan.free": "Ingyenes Ferdi",
203 "pricing.plan.legacy": "Ferdi Premium", 206 "pricing.plan.legacy": "Ferdi Prémium",
204 "pricing.plan.personal": "Ferdi Personal", 207 "pricing.plan.personal": "Ferdi Personal",
205 "pricing.plan.personal-monthly": "Ferdi Personal Monthly", 208 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
206 "pricing.plan.personal-yearly": "Ferdi Personal Yearly", 209 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
@@ -507,8 +510,8 @@
507 "validation.oneRequired": "Legalább egy kitöltése szükséges", 510 "validation.oneRequired": "Legalább egy kitöltése szükséges",
508 "validation.required": "{field} kitöltése kötelező", 511 "validation.required": "{field} kitöltése kötelező",
509 "validation.url": "{field} nem érvényes URL", 512 "validation.url": "{field} nem érvényes URL",
510 "webControls.back": "Back", 513 "webControls.back": "Vissza",
511 "webControls.forward": "Forward", 514 "webControls.forward": "Előre",
512 "webControls.goHome": "Home", 515 "webControls.goHome": "Home",
513 "webControls.openInBrowser": "Open in Browser", 516 "webControls.openInBrowser": "Open in Browser",
514 "webControls.reload": "Újratöltés", 517 "webControls.reload": "Újratöltés",
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 433fde229..566139d1f 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Muat Ulang", 2 "app.errorHandler.action": "Muat Ulang",
3 "app.errorHandler.headline": "Terjadi kesalahan", 3 "app.errorHandler.headline": "Terjadi kesalahan",
4 "changeserver.customServerLabel": "Server khusus",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Kirim", 7 "changeserver.submit": "Kirim",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Muat ulang Layanan", 10 "connectionLostBanner.cta": "Muat ulang Layanan",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 78474b496..ac9d410e0 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -1,14 +1,17 @@
1{ 1{
2 "app.errorHandler.action": "Ricarica", 2 "app.errorHandler.action": "Ricarica",
3 "app.errorHandler.headline": "Qualcosa è andato storto", 3 "app.errorHandler.headline": "Qualcosa è andato storto",
4 "changeserver.customServerLabel": "Server personalizzato",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Invia", 7 "changeserver.submit": "Invia",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Ricarica Servizio", 10 "connectionLostBanner.cta": "Ricarica Servizio",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "Cos'è successo?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi ha perso la connessione con {name}.",
10 "feature.announcements.changelog.headline": "Modifiche in Ferdi {Version}", 13 "feature.announcements.changelog.headline": "Modifiche in Ferdi {Version}",
11 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Pubblica informazioni di debug",
12 "feature.delayApp.headline": "Per favore, compra una Licenza Supporter di Ferdi per saltare l'attesa", 15 "feature.delayApp.headline": "Per favore, compra una Licenza Supporter di Ferdi per saltare l'attesa",
13 "feature.delayApp.text": "Ferdi continuerà tra {seconds} secondi.", 16 "feature.delayApp.text": "Ferdi continuerà tra {seconds} secondi.",
14 "feature.delayApp.trial.action": "Sì, voglio la prova gratuita di 14 giorni di Ferdi Professional", 17 "feature.delayApp.trial.action": "Sì, voglio la prova gratuita di 14 giorni di Ferdi Professional",
@@ -32,10 +35,10 @@
32 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", 35 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
33 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment", 36 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
34 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", 37 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
35 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 38 "feature.publishDebugInfo.error": "Si è verificato un errore durante il tentativo di pubblicare le informazioni di debug. Riprova più tardi o vedi la console per maggiori informazioni.",
36 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 39 "feature.publishDebugInfo.info": "Pubblicare le informazioni di debug ci aiuta a trovare problemi ed errori in Ferdi. Pubblicando le informazioni di debug accetti l'informativa sulla privacy e i termini di servizio di Ferdi Debugger",
37 "feature.publishDebugInfo.privacy": "Privacy policy", 40 "feature.publishDebugInfo.privacy": "Informativa sulla privacy",
38 "feature.publishDebugInfo.publish": "Accept and publish", 41 "feature.publishDebugInfo.publish": "Accetta e pubblica",
39 "feature.publishDebugInfo.published": "Your debug log was published and is now availible at", 42 "feature.publishDebugInfo.published": "Your debug log was published and is now availible at",
40 "feature.publishDebugInfo.terms": "Termini di Servizio", 43 "feature.publishDebugInfo.terms": "Termini di Servizio",
41 "feature.publishDebugInfo.title": "Publish debug information", 44 "feature.publishDebugInfo.title": "Publish debug information",
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 3c8f938aa..4ca76c329 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "å†èª­ã¿è¾¼ã¿", 2 "app.errorHandler.action": "å†èª­ã¿è¾¼ã¿",
3 "app.errorHandler.headline": "é–“é•ãˆã¦ã„る部分ãŒã‚ã‚Šã¾ã™", 3 "app.errorHandler.headline": "é–“é•ãˆã¦ã„る部分ãŒã‚ã‚Šã¾ã™",
4 "changeserver.customServerLabel": "独自サーãƒãƒ¼",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "é€ä¿¡", 7 "changeserver.submit": "é€ä¿¡",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "サービスをリロードã™ã‚‹", 10 "connectionLostBanner.cta": "サービスをリロードã™ã‚‹",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 3768274ff..0422f6879 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ", 2 "app.errorHandler.action": "ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "კერძრსერვერი",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ", 7 "changeserver.submit": "დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/ko.json b/src/i18n/locales/ko.json
index 462990547..36aae0dd6 100644
--- a/src/i18n/locales/ko.json
+++ b/src/i18n/locales/ko.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "새로고침", 2 "app.errorHandler.action": "새로고침",
3 "app.errorHandler.headline": "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.", 3 "app.errorHandler.headline": "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index f166fd1c9..dcbd84636 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Herladen", 2 "app.errorHandler.action": "Herladen",
3 "app.errorHandler.headline": "Er ging iets mis", 3 "app.errorHandler.headline": "Er ging iets mis",
4 "changeserver.customServerLabel": "Aangepaste server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Verzenden", 7 "changeserver.submit": "Verzenden",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Service Herladen", 10 "connectionLostBanner.cta": "Service Herladen",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index 3ac8186bd..9de45b28c 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Herladen", 2 "app.errorHandler.action": "Herladen",
3 "app.errorHandler.headline": "Er is iets mis gegaan", 3 "app.errorHandler.headline": "Er is iets mis gegaan",
4 "changeserver.customServerLabel": "Aangepaste server",
4 "changeserver.headline": "Server wijzigen", 5 "changeserver.headline": "Server wijzigen",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Verzenden", 7 "changeserver.submit": "Verzenden",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Een service opnieuw laden", 10 "connectionLostBanner.cta": "Een service opnieuw laden",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/no.json b/src/i18n/locales/no.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/no.json
+++ b/src/i18n/locales/no.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index f6193a1fd..7a28f7cac 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Odśwież", 2 "app.errorHandler.action": "Odśwież",
3 "app.errorHandler.headline": "Coś poszło nie tak.", 3 "app.errorHandler.headline": "Coś poszło nie tak.",
4 "changeserver.customServerLabel": "Spersonalizowany serwer",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Wyślij", 7 "changeserver.submit": "Wyślij",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Przeładuj usługę", 10 "connectionLostBanner.cta": "Przeładuj usługę",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 190ef31de..bce72e369 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Recarregar", 2 "app.errorHandler.action": "Recarregar",
3 "app.errorHandler.headline": "Algo deu errado", 3 "app.errorHandler.headline": "Algo deu errado",
4 "changeserver.customServerLabel": "Servidor personalizado",
4 "changeserver.headline": "Alterar servidor", 5 "changeserver.headline": "Alterar servidor",
5 "changeserver.label": "Servidor", 6 "changeserver.label": "Servidor",
6 "changeserver.submit": "Submeter", 7 "changeserver.submit": "Submeter",
8 "changeserver.urlError": "Informe uma URL válida",
9 "changeserver.warning": "As configurações extras oferecidas pelo Ferdi não serão salvas",
7 "connectionLostBanner.cta": "Recarregar serviço", 10 "connectionLostBanner.cta": "Recarregar serviço",
8 "connectionLostBanner.informationLink": "O que aconteceu?", 11 "connectionLostBanner.informationLink": "O que aconteceu?",
9 "connectionLostBanner.message": "Ah não! Ferdi perdeu a conexão com {name}.", 12 "connectionLostBanner.message": "Ah não! Ferdi perdeu a conexão com {name}.",
@@ -186,7 +189,7 @@
186 "pricing.features.accountSync": "Sincronização Automática", 189 "pricing.features.accountSync": "Sincronização Automática",
187 "pricing.features.adFree": "Sem publicidade para sempre", 190 "pricing.features.adFree": "Sem publicidade para sempre",
188 "pricing.features.appDelays": "Sem Telas de Espera", 191 "pricing.features.appDelays": "Sem Telas de Espera",
189 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens", 192 "pricing.features.appDelaysEnabled": "Telas de Carregamento Ocasionais",
190 "pricing.features.customWebsites": "Adicionar Websites Personalizados", 193 "pricing.features.customWebsites": "Adicionar Websites Personalizados",
191 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho", 194 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho",
192 "pricing.features.onPremise": "On-Premise & Outros serviços hospedados", 195 "pricing.features.onPremise": "On-Premise & Outros serviços hospedados",
@@ -328,7 +331,7 @@
328 "settings.app.lockInfo": "O bloqueio por senha permite a você proteger suas mensagens.\nUsando o bloqueio por senha, será necessário informar sua senha toda veze que o Ferdi for iniciado ou você solicite o bloqueio.", 331 "settings.app.lockInfo": "O bloqueio por senha permite a você proteger suas mensagens.\nUsando o bloqueio por senha, será necessário informar sua senha toda veze que o Ferdi for iniciado ou você solicite o bloqueio.",
329 "settings.app.lockedPassword": "Senha", 332 "settings.app.lockedPassword": "Senha",
330 "settings.app.lockedPasswordInfo": "Tenha certeza que a senha definida será lembrada.\nCaso você esqueça a senha, será necessário reinstalar o Ferdi.", 333 "settings.app.lockedPasswordInfo": "Tenha certeza que a senha definida será lembrada.\nCaso você esqueça a senha, será necessário reinstalar o Ferdi.",
331 "settings.app.restartRequired": "Alterações requerem reinício", 334 "settings.app.restartRequired": "Essa alteração requer uma reinicialização",
332 "settings.app.scheduledDNDInfo": "O modo Não perturbe agendado permite definir um período de tempo em que você não deseja receber notificações do Ferdi.", 335 "settings.app.scheduledDNDInfo": "O modo Não perturbe agendado permite definir um período de tempo em que você não deseja receber notificações do Ferdi.",
333 "settings.app.scheduledDNDTimeInfo": "Horários no formato de 24 horas. O horário de término pode ser anterior ao horário de início (por exemplo, início às 17:00 e término às 09:00) para ativar a opção Não perturbe da noite para o dia.", 336 "settings.app.scheduledDNDTimeInfo": "Horários no formato de 24 horas. O horário de término pode ser anterior ao horário de início (por exemplo, início às 17:00 e término às 09:00) para ativar a opção Não perturbe da noite para o dia.",
334 "settings.app.sentryInfo": "O envio de dados de telemetria nos permite encontrar erros no Ferdi. Não enviaremos nenhuma informação pessoal como seus dados de mensagem! Alterar esta opção requer que você reinicie o Ferdi.", 337 "settings.app.sentryInfo": "O envio de dados de telemetria nos permite encontrar erros no Ferdi. Não enviaremos nenhuma informação pessoal como seus dados de mensagem! Alterar esta opção requer que você reinicie o Ferdi.",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 7a6ed77cc..785d95b48 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Actualizar", 2 "app.errorHandler.action": "Actualizar",
3 "app.errorHandler.headline": "Alguma coisa correu mal", 3 "app.errorHandler.headline": "Alguma coisa correu mal",
4 "changeserver.customServerLabel": "Servidor personalizado",
4 "changeserver.headline": "Alterar servidor", 5 "changeserver.headline": "Alterar servidor",
5 "changeserver.label": "Servidor", 6 "changeserver.label": "Servidor",
6 "changeserver.submit": "Enviar", 7 "changeserver.submit": "Enviar",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reiniciar serviço", 10 "connectionLostBanner.cta": "Reiniciar serviço",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/ro.json b/src/i18n/locales/ro.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/ro.json
+++ b/src/i18n/locales/ro.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index a16bde739..beecb46e6 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Перезагрузить", 2 "app.errorHandler.action": "Перезагрузить",
3 "app.errorHandler.headline": "Что-то пошло не так", 3 "app.errorHandler.headline": "Что-то пошло не так",
4 "changeserver.customServerLabel": "ПользовательÑкий Ñервер",
4 "changeserver.headline": "Изменить Ñервер", 5 "changeserver.headline": "Изменить Ñервер",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "ПринÑÑ‚ÑŒ", 7 "changeserver.submit": "ПринÑÑ‚ÑŒ",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "ПерезапуÑтить ÑервиÑ", 10 "connectionLostBanner.cta": "ПерезапуÑтить ÑервиÑ",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index fd73bc773..3810cb235 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Obnoviť", 2 "app.errorHandler.action": "Obnoviť",
3 "app.errorHandler.headline": "NieÄo sa pokazilo", 3 "app.errorHandler.headline": "NieÄo sa pokazilo",
4 "changeserver.customServerLabel": "Vlastný server",
4 "changeserver.headline": "Zmeniť server", 5 "changeserver.headline": "Zmeniť server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Odoslať", 7 "changeserver.submit": "Odoslať",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Obnoviť službu", 10 "connectionLostBanner.cta": "Obnoviť službu",
8 "connectionLostBanner.informationLink": "ÄŒo sa stalo?", 11 "connectionLostBanner.informationLink": "ÄŒo sa stalo?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/sl.json b/src/i18n/locales/sl.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/sl.json
+++ b/src/i18n/locales/sl.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index 33cde814c..62c4d40a4 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Ponovno uÄitavanje", 2 "app.errorHandler.action": "Ponovno uÄitavanje",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Prilagođen server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Pošalji", 7 "changeserver.submit": "Pošalji",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Поново учирај уÑлугу", 10 "connectionLostBanner.cta": "Поново учирај уÑлугу",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/sv.json b/src/i18n/locales/sv.json
index 418624a66..0ef654419 100644
--- a/src/i18n/locales/sv.json
+++ b/src/i18n/locales/sv.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Ladda om", 2 "app.errorHandler.action": "Ladda om",
3 "app.errorHandler.headline": "NÃ¥gonting gick snett", 3 "app.errorHandler.headline": "NÃ¥gonting gick snett",
4 "changeserver.customServerLabel": "Anpassad server",
4 "changeserver.headline": "Byt server", 5 "changeserver.headline": "Byt server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Skicka", 7 "changeserver.submit": "Skicka",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Ladda om tjänst", 10 "connectionLostBanner.cta": "Ladda om tjänst",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 428d9f18f..784c80c57 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Yenile", 2 "app.errorHandler.action": "Yenile",
3 "app.errorHandler.headline": "Bir terslik çıktı", 3 "app.errorHandler.headline": "Bir terslik çıktı",
4 "changeserver.customServerLabel": "Özel sunucu",
4 "changeserver.headline": "Sunucuyu deÄŸiÅŸtir", 5 "changeserver.headline": "Sunucuyu deÄŸiÅŸtir",
5 "changeserver.label": "Sunucu", 6 "changeserver.label": "Sunucu",
6 "changeserver.submit": "Gönder", 7 "changeserver.submit": "Gönder",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Servisi Tekrar Yükle", 10 "connectionLostBanner.cta": "Servisi Tekrar Yükle",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 25e09ea49..e481eee8c 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Перезавантажити", 2 "app.errorHandler.action": "Перезавантажити",
3 "app.errorHandler.headline": "ЩоÑÑŒ пішло не так", 3 "app.errorHandler.headline": "ЩоÑÑŒ пішло не так",
4 "changeserver.customServerLabel": "КориÑтувацький Ñервер",
4 "changeserver.headline": "Змінити Ñервер", 5 "changeserver.headline": "Змінити Ñервер",
5 "changeserver.label": "Сервер", 6 "changeserver.label": "Сервер",
6 "changeserver.submit": "Подати", 7 "changeserver.submit": "Подати",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Перезавантажити ÑервіÑ", 10 "connectionLostBanner.cta": "Перезавантажити ÑервіÑ",
8 "connectionLostBanner.informationLink": "Що трапилоÑÑŒ?", 11 "connectionLostBanner.informationLink": "Що трапилоÑÑŒ?",
9 "connectionLostBanner.message": "О ні! Ферді втратив з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· {name}.", 12 "connectionLostBanner.message": "О ні! Ферді втратив з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· {name}.",
diff --git a/src/i18n/locales/vi.json b/src/i18n/locales/vi.json
index 9d676c0a9..356c1fc1e 100644
--- a/src/i18n/locales/vi.json
+++ b/src/i18n/locales/vi.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "Server", 6 "changeserver.label": "Server",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "Reload Service", 10 "connectionLostBanner.cta": "Reload Service",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/zh-HANT.json b/src/i18n/locales/zh-HANT.json
index 3bba232fd..9e1c43a0f 100644
--- a/src/i18n/locales/zh-HANT.json
+++ b/src/i18n/locales/zh-HANT.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "é‡æ–°åŠ è¼‰", 2 "app.errorHandler.action": "é‡æ–°åŠ è¼‰",
3 "app.errorHandler.headline": "出ç¾éŒ¯èª¤", 3 "app.errorHandler.headline": "出ç¾éŒ¯èª¤",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "切æ›æœå‹™å™¨", 5 "changeserver.headline": "切æ›æœå‹™å™¨",
5 "changeserver.label": "伺æœå™¨", 6 "changeserver.label": "伺æœå™¨",
6 "changeserver.submit": "é€å‡º", 7 "changeserver.submit": "é€å‡º",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "é‡æ–°è¼‰å…¥", 10 "connectionLostBanner.cta": "é‡æ–°è¼‰å…¥",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json
index 2c7b75e42..c5b65d015 100644
--- a/src/i18n/locales/zh.json
+++ b/src/i18n/locales/zh.json
@@ -1,9 +1,12 @@
1{ 1{
2 "app.errorHandler.action": "é‡æ–°åŠ è½½", 2 "app.errorHandler.action": "é‡æ–°åŠ è½½",
3 "app.errorHandler.headline": "出了些问题", 3 "app.errorHandler.headline": "出了些问题",
4 "changeserver.customServerLabel": "Custom server",
4 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
5 "changeserver.label": "æœåŠ¡å™¨ï¼š", 6 "changeserver.label": "æœåŠ¡å™¨ï¼š",
6 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved",
7 "connectionLostBanner.cta": "é‡æ–°åŠ è½½æœåŠ¡", 10 "connectionLostBanner.cta": "é‡æ–°åŠ è½½æœåŠ¡",
8 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "What happened?",
9 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
diff --git a/src/i18n/messages/src/components/auth/ChangeServer.json b/src/i18n/messages/src/components/auth/ChangeServer.json
index 3a122d50c..8cdfc6623 100644
--- a/src/i18n/messages/src/components/auth/ChangeServer.json
+++ b/src/i18n/messages/src/components/auth/ChangeServer.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Change server", 4 "defaultMessage": "!!!Change server",
5 "file": "src/components/auth/ChangeServer.js", 5 "file": "src/components/auth/ChangeServer.js",
6 "start": { 6 "start": {
7 "line": 11, 7 "line": 13,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 14, 11 "line": 16,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,50 @@
17 "defaultMessage": "!!!Server", 17 "defaultMessage": "!!!Server",
18 "file": "src/components/auth/ChangeServer.js", 18 "file": "src/components/auth/ChangeServer.js",
19 "start": { 19 "start": {
20 "line": 15, 20 "line": 17,
21 "column": 9 21 "column": 9
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 18, 24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "changeserver.warning",
30 "defaultMessage": "!!!Extra settings offered by Ferdi will not be saved",
31 "file": "src/components/auth/ChangeServer.js",
32 "start": {
33 "line": 21,
34 "column": 11
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "changeserver.customServerLabel",
43 "defaultMessage": "!!!Custom server",
44 "file": "src/components/auth/ChangeServer.js",
45 "start": {
46 "line": 25,
47 "column": 21
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 },
54 {
55 "id": "changeserver.urlError",
56 "defaultMessage": "!!!Enter a valid URL",
57 "file": "src/components/auth/ChangeServer.js",
58 "start": {
59 "line": 29,
60 "column": 12
61 },
62 "end": {
63 "line": 32,
25 "column": 3 64 "column": 3
26 } 65 }
27 }, 66 },
@@ -30,11 +69,11 @@
30 "defaultMessage": "!!!Submit", 69 "defaultMessage": "!!!Submit",
31 "file": "src/components/auth/ChangeServer.js", 70 "file": "src/components/auth/ChangeServer.js",
32 "start": { 71 "start": {
33 "line": 19, 72 "line": 33,
34 "column": 10 73 "column": 10
35 }, 74 },
36 "end": { 75 "end": {
37 "line": 22, 76 "line": 36,
38 "column": 3 77 "column": 3
39 } 78 }
40 } 79 }
diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json
index ddd9cd094..0495aa970 100644
--- a/src/i18n/messages/src/components/layout/Sidebar.json
+++ b/src/i18n/messages/src/components/layout/Sidebar.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Settings", 4 "defaultMessage": "!!!Settings",
5 "file": "src/components/layout/Sidebar.js", 5 "file": "src/components/layout/Sidebar.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 18,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 21,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Add new service", 17 "defaultMessage": "!!!Add new service",
18 "file": "src/components/layout/Sidebar.js", 18 "file": "src/components/layout/Sidebar.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 22,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 25,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Disable notifications & audio", 30 "defaultMessage": "!!!Disable notifications & audio",
31 "file": "src/components/layout/Sidebar.js", 31 "file": "src/components/layout/Sidebar.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 26,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 29,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Enable notifications & audio", 43 "defaultMessage": "!!!Enable notifications & audio",
44 "file": "src/components/layout/Sidebar.js", 44 "file": "src/components/layout/Sidebar.js",
45 "start": { 45 "start": {
46 "line": 27, 46 "line": 30,
47 "column": 10 47 "column": 10
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 30, 50 "line": 33,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Open workspace drawer", 56 "defaultMessage": "!!!Open workspace drawer",
57 "file": "src/components/layout/Sidebar.js", 57 "file": "src/components/layout/Sidebar.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 34,
60 "column": 23 60 "column": 23
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 34, 63 "line": 37,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Close workspace drawer", 69 "defaultMessage": "!!!Close workspace drawer",
70 "file": "src/components/layout/Sidebar.js", 70 "file": "src/components/layout/Sidebar.js",
71 "start": { 71 "start": {
72 "line": 35, 72 "line": 38,
73 "column": 24 73 "column": 24
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 38, 76 "line": 41,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Open Franz Todos", 82 "defaultMessage": "!!!Open Franz Todos",
83 "file": "src/components/layout/Sidebar.js", 83 "file": "src/components/layout/Sidebar.js",
84 "start": { 84 "start": {
85 "line": 39, 85 "line": 42,
86 "column": 19 86 "column": 19
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 42, 89 "line": 45,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Close Franz Todos", 95 "defaultMessage": "!!!Close Franz Todos",
96 "file": "src/components/layout/Sidebar.js", 96 "file": "src/components/layout/Sidebar.js",
97 "start": { 97 "start": {
98 "line": 43, 98 "line": 46,
99 "column": 20 99 "column": 20
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 46, 102 "line": 49,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Lock Ferdi", 108 "defaultMessage": "!!!Lock Ferdi",
109 "file": "src/components/layout/Sidebar.js", 109 "file": "src/components/layout/Sidebar.js",
110 "start": { 110 "start": {
111 "line": 47, 111 "line": 50,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 50, 115 "line": 53,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index f6afe5246..df5e7714a 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Launch Ferdi on start", 4 "defaultMessage": "!!!Launch Ferdi on start",
5 "file": "src/containers/settings/EditSettingsScreen.js", 5 "file": "src/containers/settings/EditSettingsScreen.js",
6 "start": { 6 "start": {
7 "line": 29, 7 "line": 30,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 32, 11 "line": 33,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Open in background", 17 "defaultMessage": "!!!Open in background",
18 "file": "src/containers/settings/EditSettingsScreen.js", 18 "file": "src/containers/settings/EditSettingsScreen.js",
19 "start": { 19 "start": {
20 "line": 33, 20 "line": 34,
21 "column": 26 21 "column": 26
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 36, 24 "line": 37,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 30 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
31 "file": "src/containers/settings/EditSettingsScreen.js", 31 "file": "src/containers/settings/EditSettingsScreen.js",
32 "start": { 32 "start": {
33 "line": 37, 33 "line": 38,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 40, 37 "line": 41,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Start minimized", 43 "defaultMessage": "!!!Start minimized",
44 "file": "src/containers/settings/EditSettingsScreen.js", 44 "file": "src/containers/settings/EditSettingsScreen.js",
45 "start": { 45 "start": {
46 "line": 41, 46 "line": 42,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 44, 50 "line": 45,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Always show Ferdi in system tray", 56 "defaultMessage": "!!!Always show Ferdi in system tray",
57 "file": "src/containers/settings/EditSettingsScreen.js", 57 "file": "src/containers/settings/EditSettingsScreen.js",
58 "start": { 58 "start": {
59 "line": 45, 59 "line": 46,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 48, 63 "line": 49,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Reload Ferdi after system resume", 69 "defaultMessage": "!!!Reload Ferdi after system resume",
70 "file": "src/containers/settings/EditSettingsScreen.js", 70 "file": "src/containers/settings/EditSettingsScreen.js",
71 "start": { 71 "start": {
72 "line": 49, 72 "line": 50,
73 "column": 21 73 "column": 21
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 52, 76 "line": 53,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Minimize Ferdi to system tray", 82 "defaultMessage": "!!!Minimize Ferdi to system tray",
83 "file": "src/containers/settings/EditSettingsScreen.js", 83 "file": "src/containers/settings/EditSettingsScreen.js",
84 "start": { 84 "start": {
85 "line": 53, 85 "line": 54,
86 "column": 24 86 "column": 24
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 56, 89 "line": 57,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Don't show message content in notifications", 95 "defaultMessage": "!!!Don't show message content in notifications",
96 "file": "src/containers/settings/EditSettingsScreen.js", 96 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": { 97 "start": {
98 "line": 57, 98 "line": 58,
99 "column": 24 99 "column": 24
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 60, 102 "line": 61,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Navigation bar behaviour", 108 "defaultMessage": "!!!Navigation bar behaviour",
109 "file": "src/containers/settings/EditSettingsScreen.js", 109 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": { 110 "start": {
111 "line": 61, 111 "line": 62,
112 "column": 26 112 "column": 26
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 64, 115 "line": 65,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Send telemetry data", 121 "defaultMessage": "!!!Send telemetry data",
122 "file": "src/containers/settings/EditSettingsScreen.js", 122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": { 123 "start": {
124 "line": 65, 124 "line": 66,
125 "column": 10 125 "column": 10
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 68, 128 "line": 69,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Enable service hibernation", 134 "defaultMessage": "!!!Enable service hibernation",
135 "file": "src/containers/settings/EditSettingsScreen.js", 135 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": { 136 "start": {
137 "line": 69, 137 "line": 70,
138 "column": 13 138 "column": 13
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 72, 141 "line": 73,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Keep services in hibernation on startup", 147 "defaultMessage": "!!!Keep services in hibernation on startup",
148 "file": "src/containers/settings/EditSettingsScreen.js", 148 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": { 149 "start": {
150 "line": 73, 150 "line": 74,
151 "column": 22 151 "column": 22
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 76, 154 "line": 77,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Hibernation strategy", 160 "defaultMessage": "!!!Hibernation strategy",
161 "file": "src/containers/settings/EditSettingsScreen.js", 161 "file": "src/containers/settings/EditSettingsScreen.js",
162 "start": { 162 "start": {
163 "line": 77, 163 "line": 78,
164 "column": 23 164 "column": 23
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 80, 167 "line": 81,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Todo Server", 173 "defaultMessage": "!!!Todo Server",
174 "file": "src/containers/settings/EditSettingsScreen.js", 174 "file": "src/containers/settings/EditSettingsScreen.js",
175 "start": { 175 "start": {
176 "line": 81, 176 "line": 82,
177 "column": 24 177 "column": 24
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 84, 180 "line": 85,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Custom TodoServer", 186 "defaultMessage": "!!!Custom TodoServer",
187 "file": "src/containers/settings/EditSettingsScreen.js", 187 "file": "src/containers/settings/EditSettingsScreen.js",
188 "start": { 188 "start": {
189 "line": 85, 189 "line": 86,
190 "column": 20 190 "column": 20
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 88, 193 "line": 89,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Enable Password Lock", 199 "defaultMessage": "!!!Enable Password Lock",
200 "file": "src/containers/settings/EditSettingsScreen.js", 200 "file": "src/containers/settings/EditSettingsScreen.js",
201 "start": { 201 "start": {
202 "line": 89, 202 "line": 90,
203 "column": 14 203 "column": 14
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 92, 206 "line": 93,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Password", 212 "defaultMessage": "!!!Password",
213 "file": "src/containers/settings/EditSettingsScreen.js", 213 "file": "src/containers/settings/EditSettingsScreen.js",
214 "start": { 214 "start": {
215 "line": 93, 215 "line": 94,
216 "column": 16 216 "column": 16
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 96, 219 "line": 97,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Allow using Touch ID to unlock", 225 "defaultMessage": "!!!Allow using Touch ID to unlock",
226 "file": "src/containers/settings/EditSettingsScreen.js", 226 "file": "src/containers/settings/EditSettingsScreen.js",
227 "start": { 227 "start": {
228 "line": 97, 228 "line": 98,
229 "column": 22 229 "column": 22
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 100, 232 "line": 101,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Lock after inactivity", 238 "defaultMessage": "!!!Lock after inactivity",
239 "file": "src/containers/settings/EditSettingsScreen.js", 239 "file": "src/containers/settings/EditSettingsScreen.js",
240 "start": { 240 "start": {
241 "line": 101, 241 "line": 102,
242 "column": 18 242 "column": 18
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 104, 245 "line": 105,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 251 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
252 "file": "src/containers/settings/EditSettingsScreen.js", 252 "file": "src/containers/settings/EditSettingsScreen.js",
253 "start": { 253 "start": {
254 "line": 105, 254 "line": 106,
255 "column": 23 255 "column": 23
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 108, 258 "line": 109,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!From", 264 "defaultMessage": "!!!From",
265 "file": "src/containers/settings/EditSettingsScreen.js", 265 "file": "src/containers/settings/EditSettingsScreen.js",
266 "start": { 266 "start": {
267 "line": 109, 267 "line": 110,
268 "column": 21 268 "column": 21
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 112, 271 "line": 113,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!To", 277 "defaultMessage": "!!!To",
278 "file": "src/containers/settings/EditSettingsScreen.js", 278 "file": "src/containers/settings/EditSettingsScreen.js",
279 "start": { 279 "start": {
280 "line": 113, 280 "line": 114,
281 "column": 19 281 "column": 19
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 116, 284 "line": 117,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Language", 290 "defaultMessage": "!!!Language",
291 "file": "src/containers/settings/EditSettingsScreen.js", 291 "file": "src/containers/settings/EditSettingsScreen.js",
292 "start": { 292 "start": {
293 "line": 117, 293 "line": 118,
294 "column": 12 294 "column": 12
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 120, 297 "line": 121,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Dark Mode", 303 "defaultMessage": "!!!Dark Mode",
304 "file": "src/containers/settings/EditSettingsScreen.js", 304 "file": "src/containers/settings/EditSettingsScreen.js",
305 "start": { 305 "start": {
306 "line": 121, 306 "line": 122,
307 "column": 12 307 "column": 12
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 124, 310 "line": 125,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 316 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
317 "file": "src/containers/settings/EditSettingsScreen.js", 317 "file": "src/containers/settings/EditSettingsScreen.js",
318 "start": { 318 "start": {
319 "line": 125, 319 "line": 126,
320 "column": 21 320 "column": 21
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 128, 323 "line": 129,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Enable universal Dark Mode", 329 "defaultMessage": "!!!Enable universal Dark Mode",
330 "file": "src/containers/settings/EditSettingsScreen.js", 330 "file": "src/containers/settings/EditSettingsScreen.js",
331 "start": { 331 "start": {
332 "line": 129, 332 "line": 130,
333 "column": 21 333 "column": 21
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 132, 336 "line": 133,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Sidebar width", 342 "defaultMessage": "!!!Sidebar width",
343 "file": "src/containers/settings/EditSettingsScreen.js", 343 "file": "src/containers/settings/EditSettingsScreen.js",
344 "start": { 344 "start": {
345 "line": 133, 345 "line": 134,
346 "column": 22 346 "column": 22
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 136, 349 "line": 137,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Service icon size", 355 "defaultMessage": "!!!Service icon size",
356 "file": "src/containers/settings/EditSettingsScreen.js", 356 "file": "src/containers/settings/EditSettingsScreen.js",
357 "start": { 357 "start": {
358 "line": 137, 358 "line": 138,
359 "column": 12 359 "column": 12
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 140, 362 "line": 141,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Accent color", 368 "defaultMessage": "!!!Accent color",
369 "file": "src/containers/settings/EditSettingsScreen.js", 369 "file": "src/containers/settings/EditSettingsScreen.js",
370 "start": { 370 "start": {
371 "line": 141, 371 "line": 142,
372 "column": 15 372 "column": 15
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 144, 375 "line": 145,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Display disabled services tabs", 381 "defaultMessage": "!!!Display disabled services tabs",
382 "file": "src/containers/settings/EditSettingsScreen.js", 382 "file": "src/containers/settings/EditSettingsScreen.js",
383 "start": { 383 "start": {
384 "line": 145, 384 "line": 146,
385 "column": 24 385 "column": 24
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 148, 388 "line": 149,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 394 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
395 "file": "src/containers/settings/EditSettingsScreen.js", 395 "file": "src/containers/settings/EditSettingsScreen.js",
396 "start": { 396 "start": {
397 "line": 149, 397 "line": 150,
398 "column": 29 398 "column": 29
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 152, 401 "line": 153,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!Show draggable area on window", 407 "defaultMessage": "!!!Show draggable area on window",
408 "file": "src/containers/settings/EditSettingsScreen.js", 408 "file": "src/containers/settings/EditSettingsScreen.js",
409 "start": { 409 "start": {
410 "line": 153, 410 "line": 154,
411 "column": 16 411 "column": 16
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 156, 414 "line": 157,
415 "column": 3 415 "column": 3
416 } 416 }
417 }, 417 },
@@ -420,11 +420,11 @@
420 "defaultMessage": "!!!Enable spell checking", 420 "defaultMessage": "!!!Enable spell checking",
421 "file": "src/containers/settings/EditSettingsScreen.js", 421 "file": "src/containers/settings/EditSettingsScreen.js",
422 "start": { 422 "start": {
423 "line": 157, 423 "line": 158,
424 "column": 23 424 "column": 23
425 }, 425 },
426 "end": { 426 "end": {
427 "line": 160, 427 "line": 161,
428 "column": 3 428 "column": 3
429 } 429 }
430 }, 430 },
@@ -433,11 +433,11 @@
433 "defaultMessage": "!!!Enable GPU Acceleration", 433 "defaultMessage": "!!!Enable GPU Acceleration",
434 "file": "src/containers/settings/EditSettingsScreen.js", 434 "file": "src/containers/settings/EditSettingsScreen.js",
435 "start": { 435 "start": {
436 "line": 161, 436 "line": 162,
437 "column": 25 437 "column": 25
438 }, 438 },
439 "end": { 439 "end": {
440 "line": 164, 440 "line": 165,
441 "column": 3 441 "column": 3
442 } 442 }
443 }, 443 },
@@ -446,11 +446,11 @@
446 "defaultMessage": "!!!Include beta versions", 446 "defaultMessage": "!!!Include beta versions",
447 "file": "src/containers/settings/EditSettingsScreen.js", 447 "file": "src/containers/settings/EditSettingsScreen.js",
448 "start": { 448 "start": {
449 "line": 165, 449 "line": 166,
450 "column": 8 450 "column": 8
451 }, 451 },
452 "end": { 452 "end": {
453 "line": 168, 453 "line": 169,
454 "column": 3 454 "column": 3
455 } 455 }
456 }, 456 },
@@ -459,11 +459,11 @@
459 "defaultMessage": "!!!Enable updates", 459 "defaultMessage": "!!!Enable updates",
460 "file": "src/containers/settings/EditSettingsScreen.js", 460 "file": "src/containers/settings/EditSettingsScreen.js",
461 "start": { 461 "start": {
462 "line": 169, 462 "line": 170,
463 "column": 20 463 "column": 20
464 }, 464 },
465 "end": { 465 "end": {
466 "line": 172, 466 "line": 173,
467 "column": 3 467 "column": 3
468 } 468 }
469 }, 469 },
@@ -472,11 +472,11 @@
472 "defaultMessage": "!!!Enable Franz Todos", 472 "defaultMessage": "!!!Enable Franz Todos",
473 "file": "src/containers/settings/EditSettingsScreen.js", 473 "file": "src/containers/settings/EditSettingsScreen.js",
474 "start": { 474 "start": {
475 "line": 173, 475 "line": 174,
476 "column": 15 476 "column": 15
477 }, 477 },
478 "end": { 478 "end": {
479 "line": 176, 479 "line": 177,
480 "column": 3 480 "column": 3
481 } 481 }
482 }, 482 },
@@ -485,11 +485,11 @@
485 "defaultMessage": "!!!Keep all workspaces loaded", 485 "defaultMessage": "!!!Keep all workspaces loaded",
486 "file": "src/containers/settings/EditSettingsScreen.js", 486 "file": "src/containers/settings/EditSettingsScreen.js",
487 "start": { 487 "start": {
488 "line": 177, 488 "line": 178,
489 "column": 27 489 "column": 27
490 }, 490 },
491 "end": { 491 "end": {
492 "line": 180, 492 "line": 181,
493 "column": 3 493 "column": 3
494 } 494 }
495 } 495 }
diff --git a/src/index.js b/src/index.js
index 027884826..dac8ec770 100644
--- a/src/index.js
+++ b/src/index.js
@@ -35,6 +35,7 @@ import {
35import { mainIpcHandler as basicAuthHandler } from './features/basicAuth'; 35import { mainIpcHandler as basicAuthHandler } from './features/basicAuth';
36import ipcApi from './electron/ipc-api'; 36import ipcApi from './electron/ipc-api';
37import Tray from './lib/Tray'; 37import Tray from './lib/Tray';
38import DBus from './lib/DBus';
38import Settings from './electron/Settings'; 39import Settings from './electron/Settings';
39import handleDeepLink from './electron/deepLinking'; 40import handleDeepLink from './electron/deepLinking';
40import { isPositionValid } from './electron/windowUtils'; 41import { isPositionValid } from './electron/windowUtils';
@@ -152,8 +153,8 @@ const createWindow = () => {
152 const mainWindowState = windowStateKeeper({ 153 const mainWindowState = windowStateKeeper({
153 defaultWidth: DEFAULT_WINDOW_OPTIONS.width, 154 defaultWidth: DEFAULT_WINDOW_OPTIONS.width,
154 defaultHeight: DEFAULT_WINDOW_OPTIONS.height, 155 defaultHeight: DEFAULT_WINDOW_OPTIONS.height,
155 maximize: false, 156 maximize: true, // Automatically maximizes the window, if it was last clsoed maximized
156 fullScreen: false, 157 fullScreen: true, // Automatically restores the window to full screen, if it was last closed full screen
157 }); 158 });
158 159
159 let posX = mainWindowState.x || DEFAULT_WINDOW_OPTIONS.x; 160 let posX = mainWindowState.x || DEFAULT_WINDOW_OPTIONS.x;
@@ -192,6 +193,14 @@ const createWindow = () => {
192 }, 193 },
193 }); 194 });
194 195
196 app.on('web-contents-created', (e, contents) => {
197 if (contents.getType() === 'webview') {
198 contents.on('new-window', (event) => {
199 event.preventDefault();
200 });
201 }
202 });
203
195 mainWindow.webContents.on('did-finish-load', () => { 204 mainWindow.webContents.on('did-finish-load', () => {
196 const fns = onDidLoadFns; 205 const fns = onDidLoadFns;
197 onDidLoadFns = null; 206 onDidLoadFns = null;
@@ -205,6 +214,9 @@ const createWindow = () => {
205 // Initialize System Tray 214 // Initialize System Tray
206 const trayIcon = new Tray(); 215 const trayIcon = new Tray();
207 216
217 // Initialize DBus interface
218 const dbus = new DBus(trayIcon);
219
208 // Initialize ipcApi 220 // Initialize ipcApi
209 ipcApi({ 221 ipcApi({
210 mainWindow, 222 mainWindow,
@@ -215,6 +227,9 @@ const createWindow = () => {
215 trayIcon, 227 trayIcon,
216 }); 228 });
217 229
230 // Connect to the DBus after ipcApi took care of the System Tray
231 dbus.start();
232
218 // Manage Window State 233 // Manage Window State
219 mainWindowState.manage(mainWindow); 234 mainWindowState.manage(mainWindow);
220 235
@@ -257,6 +272,7 @@ const createWindow = () => {
257 mainWindow.hide(); 272 mainWindow.hide();
258 } 273 }
259 } else { 274 } else {
275 dbus.stop();
260 app.quit(); 276 app.quit();
261 } 277 }
262 }); 278 });
@@ -316,7 +332,7 @@ const createWindow = () => {
316 e.preventDefault(); 332 e.preventDefault();
317 333
318 if (isValidExternalURL(url)) { 334 if (isValidExternalURL(url)) {
319 shell.openExternal(url); 335 shell.openExternal(url);
320 } 336 }
321 }); 337 });
322 338
@@ -395,6 +411,15 @@ ipcMain.on('feature-basic-auth-credentials', (e, { user, password }) => {
395 authCallback = noop; 411 authCallback = noop;
396}); 412});
397 413
414ipcMain.on('open-browser-window', (e, {disposition, url}, serviceId) => {
415 if (disposition === 'foreground-tab') {
416 let serviceSession = session.fromPartition(`persist:service-${serviceId}`)
417 let child = new BrowserWindow({ parent: mainWindow, webPreferences: {session: serviceSession}});
418 child.show();
419 child.loadURL(url);
420 }
421 debug('Received open-browser-window', disposition, url);
422});
398 423
399ipcMain.on('modifyRequestHeaders', (e, { modifiedRequestHeaders, serviceId }) => { 424ipcMain.on('modifyRequestHeaders', (e, { modifiedRequestHeaders, serviceId }) => {
400 debug('Received modifyRequestHeaders', modifiedRequestHeaders, serviceId); 425 debug('Received modifyRequestHeaders', modifiedRequestHeaders, serviceId);
diff --git a/src/lib/DBus.js b/src/lib/DBus.js
new file mode 100644
index 000000000..957912efa
--- /dev/null
+++ b/src/lib/DBus.js
@@ -0,0 +1,49 @@
1import {
2 sessionBus,
3} from 'dbus-next';
4import {
5 isLinux,
6} from '../environment';
7
8export default class DBus {
9 bus = null;
10
11 constructor(trayIcon) {
12 this.trayIcon = trayIcon;
13 }
14
15 start() {
16 if (!isLinux || this.bus) return;
17
18 try {
19 this.bus = sessionBus();
20 } catch {
21 // Error connecting to the bus.
22 return;
23 }
24
25 // HACK Hook onto the MessageBus to track StatusNotifierWatchers
26 this.bus._addMatch("type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',path='/org/freedesktop/DBus',member='NameOwnerChanged'");
27 const mangled = JSON.stringify({
28 path: '/org/freedesktop/DBus',
29 interface: 'org.freedesktop.DBus',
30 member: 'NameOwnerChanged',
31 });
32 this.bus._signals.on(mangled, (msg) => {
33 const [name, oldOwner, newOwner] = msg.body;
34 if (name === 'org.kde.StatusNotifierWatcher' && oldOwner !== newOwner && newOwner !== '') {
35 // Leave ample time for the StatusNotifierWatcher to be initialized
36 setTimeout(() => {
37 this.trayIcon.recreateIfVisible();
38 }, 400);
39 }
40 });
41 }
42
43 stop() {
44 if (!this.bus) return;
45
46 this.bus.disconnect();
47 this.bus = null;
48 }
49}
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 07a29a224..3c5fc6530 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -921,7 +921,7 @@ export default class FranzMenu {
921 tpl[5].submenu = this.todosMenu(); 921 tpl[5].submenu = this.todosMenu();
922 } 922 }
923 } else { 923 } else {
924 const touchIdEnabled = this.stores.settings.app.useTouchIdToUnlock && systemPreferences.canPromptTouchID(); 924 const touchIdEnabled = isMac ? (this.stores.settings.app.useTouchIdToUnlock && systemPreferences.canPromptTouchID()) : false;
925 925
926 tpl[0].submenu.unshift({ 926 tpl[0].submenu.unshift({
927 label: intl.formatMessage(menuItems.touchId), 927 label: intl.formatMessage(menuItems.touchId),
diff --git a/src/lib/Tray.js b/src/lib/Tray.js
index d6d49b0c8..c6d9db004 100644
--- a/src/lib/Tray.js
+++ b/src/lib/Tray.js
@@ -2,6 +2,11 @@ import {
2 app, Menu, nativeImage, nativeTheme, systemPreferences, Tray, ipcMain, 2 app, Menu, nativeImage, nativeTheme, systemPreferences, Tray, ipcMain,
3} from 'electron'; 3} from 'electron';
4import path from 'path'; 4import path from 'path';
5import {
6 isMac,
7 isWindows,
8 isLinux,
9} from '../environment';
5 10
6const FILE_EXTENSION = process.platform === 'win32' ? 'ico' : 'png'; 11const FILE_EXTENSION = process.platform === 'win32' ? 'ico' : 'png';
7const INDICATOR_TRAY_PLAIN = 'tray'; 12const INDICATOR_TRAY_PLAIN = 'tray';
@@ -17,15 +22,20 @@ export default class TrayIcon {
17 22
18 trayMenu = null; 23 trayMenu = null;
19 24
25 visible = false;
26
20 trayMenuTemplate = [ 27 trayMenuTemplate = [
21 { 28 {
22 label: 'Show Ferdi', 29 label: 'Show Ferdi',
23 click() { 30 click() {
24 if (app.mainWindow.isMinimized()) { 31 if (app.mainWindow.isMinimized()) {
25 app.mainWindow.restore(); 32 app.mainWindow.restore();
33 } else if (app.mainWindow.isVisible()) {
34 app.mainWindow.hide();
35 } else {
36 app.mainWindow.show();
37 app.mainWindow.focus();
26 } 38 }
27 app.mainWindow.show();
28 app.mainWindow.focus();
29 }, 39 },
30 }, 40 },
31 { 41 {
@@ -42,15 +52,35 @@ export default class TrayIcon {
42 }, 52 },
43 ]; 53 ];
44 54
55 constructor() {
56 ipcMain.on('initialAppSettings', (event, appSettings) => {
57 this._updateTrayMenu(appSettings);
58 });
59
60 ipcMain.on('updateAppSettings', (event, appSettings) => {
61 this._updateTrayMenu(appSettings);
62 });
63 }
64
45 _updateTrayMenu(appSettings) { 65 _updateTrayMenu(appSettings) {
66 if (!this.trayIcon) return;
67
46 if (appSettings.type === 'app') { 68 if (appSettings.type === 'app') {
47 const { isAppMuted } = appSettings.data; 69 const { isAppMuted } = appSettings.data;
48 this.trayMenuTemplate[1].label = isAppMuted ? 'Enable Notifications && Audio' : 'Disable Notifications && Audio'; 70 this.trayMenuTemplate[1].label = isAppMuted ? 'Enable Notifications && Audio' : 'Disable Notifications && Audio';
49 this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate); 71 this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate);
72 if (isLinux) {
73 this.trayIcon.setContextMenu(this.trayMenu);
74 }
50 } 75 }
51 } 76 }
52 77
53 show() { 78 show() {
79 this.visible = true;
80 this._show();
81 }
82
83 _show() {
54 if (this.trayIcon) return; 84 if (this.trayIcon) return;
55 85
56 this.trayIcon = new Tray(this._getAsset('tray', INDICATOR_TRAY_PLAIN)); 86 this.trayIcon = new Tray(this._getAsset('tray', INDICATOR_TRAY_PLAIN));
@@ -58,14 +88,9 @@ export default class TrayIcon {
58 this.trayIcon.setToolTip('Ferdi'); 88 this.trayIcon.setToolTip('Ferdi');
59 89
60 this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate); 90 this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate);
61 91 if (isLinux) {
62 ipcMain.on('initialAppSettings', (event, appSettings) => { 92 this.trayIcon.setContextMenu(this.trayMenu);
63 this._updateTrayMenu(appSettings); 93 }
64 });
65
66 ipcMain.on('updateAppSettings', (event, appSettings) => {
67 this._updateTrayMenu(appSettings);
68 });
69 94
70 this.trayIcon.on('click', () => { 95 this.trayIcon.on('click', () => {
71 if (app.mainWindow.isMinimized()) { 96 if (app.mainWindow.isMinimized()) {
@@ -78,9 +103,11 @@ export default class TrayIcon {
78 } 103 }
79 }); 104 });
80 105
81 this.trayIcon.on('right-click', () => { 106 if (isMac || isWindows) {
82 this.trayIcon.popUpContextMenu(this.trayMenu); 107 this.trayIcon.on('right-click', () => {
83 }); 108 this.trayIcon.popUpContextMenu(this.trayMenu);
109 });
110 }
84 111
85 if (process.platform === 'darwin') { 112 if (process.platform === 'darwin') {
86 this.themeChangeSubscriberId = systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', () => { 113 this.themeChangeSubscriberId = systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', () => {
@@ -90,6 +117,11 @@ export default class TrayIcon {
90 } 117 }
91 118
92 hide() { 119 hide() {
120 this.visible = false;
121 this._hide();
122 }
123
124 _hide() {
93 if (!this.trayIcon) return; 125 if (!this.trayIcon) return;
94 126
95 this.trayIcon.destroy(); 127 this.trayIcon.destroy();
@@ -101,6 +133,17 @@ export default class TrayIcon {
101 } 133 }
102 } 134 }
103 135
136 recreateIfVisible() {
137 if (this.visible) {
138 this._hide();
139 setTimeout(() => {
140 if (this.visible) {
141 this._show();
142 }
143 }, 100);
144 }
145 }
146
104 setIndicator(indicator) { 147 setIndicator(indicator) {
105 this.indicator = indicator; 148 this.indicator = indicator;
106 this._refreshIcon(); 149 this._refreshIcon();
diff --git a/src/models/Service.js b/src/models/Service.js
index 5b3ad7bd8..45dc55fce 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -77,7 +77,7 @@ export default class Service {
77 77
78 @observable restrictionType = null; 78 @observable restrictionType = null;
79 79
80 @observable isHibernationEnabled = false; 80 @observable disableHibernation = false;
81 81
82 @observable lastUsed = Date.now(); // timestamp 82 @observable lastUsed = Date.now(); // timestamp
83 83
@@ -136,7 +136,7 @@ export default class Service {
136 136
137 this.spellcheckerLanguage = data.spellcheckerLanguage !== undefined ? data.spellcheckerLanguage : this.spellcheckerLanguage; 137 this.spellcheckerLanguage = data.spellcheckerLanguage !== undefined ? data.spellcheckerLanguage : this.spellcheckerLanguage;
138 138
139 this.isHibernationEnabled = data.isHibernationEnabled !== undefined ? data.isHibernationEnabled : this.isHibernationEnabled; 139 this.disableHibernation = data.disableHibernation !== undefined ? data.disableHibernation : this.disableHibernation;
140 140
141 this.recipe = recipe; 141 this.recipe = recipe;
142 142
@@ -266,12 +266,17 @@ export default class Service {
266 })); 266 }));
267 267
268 this.webview.addEventListener('new-window', (event, url, frameName, options) => { 268 this.webview.addEventListener('new-window', (event, url, frameName, options) => {
269 openWindow({ 269 debug('new-window', event, url, frameName, options);
270 event, 270 if (event.disposition === 'foreground-tab') {
271 url, 271 ipcRenderer.send('open-browser-window', event, this.id);
272 frameName, 272 } else {
273 options, 273 openWindow({
274 }); 274 event,
275 url,
276 frameName,
277 options,
278 });
279 }
275 }); 280 });
276 281
277 282
diff --git a/src/routes.js b/src/routes.js
new file mode 100644
index 000000000..9986cdde5
--- /dev/null
+++ b/src/routes.js
@@ -0,0 +1,100 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import {
5 Router, Route, IndexRedirect,
6} from 'react-router';
7
8import AppLayoutContainer from './containers/layout/AppLayoutContainer';
9import SettingsWindow from './containers/settings/SettingsWindow';
10import RecipesScreen from './containers/settings/RecipesScreen';
11import ServicesScreen from './containers/settings/ServicesScreen';
12import EditServiceScreen from './containers/settings/EditServiceScreen';
13import AccountScreen from './containers/settings/AccountScreen';
14import TeamScreen from './containers/settings/TeamScreen';
15import EditUserScreen from './containers/settings/EditUserScreen';
16import EditSettingsScreen from './containers/settings/EditSettingsScreen';
17import InviteSettingsScreen from './containers/settings/InviteScreen';
18import SupportFerdiScreen from './containers/settings/SupportScreen';
19import WelcomeScreen from './containers/auth/WelcomeScreen';
20import LoginScreen from './containers/auth/LoginScreen';
21import LockedScreen from './containers/auth/LockedScreen';
22import PasswordScreen from './containers/auth/PasswordScreen';
23import ChangeServerScreen from './containers/auth/ChangeServerScreen';
24import SignupScreen from './containers/auth/SignupScreen';
25import ImportScreen from './containers/auth/ImportScreen';
26import PricingScreen from './containers/auth/PricingScreen';
27import InviteScreen from './containers/auth/InviteScreen';
28import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
29import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
30import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
31import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
32import { WORKSPACES_ROUTES } from './features/workspaces';
33import AnnouncementScreen from './features/announcements/components/AnnouncementScreen';
34import { ANNOUNCEMENTS_ROUTES } from './features/announcements';
35
36import SettingsStore from './stores/SettingsStore';
37
38export default @inject('stores', 'actions') @observer class Routes extends Component {
39 render() {
40 const {
41 locked,
42 lockingFeatureEnabled,
43 } = this.props.stores.settings.app;
44
45 const { history } = this.props;
46
47 if (lockingFeatureEnabled && locked) {
48 return (
49 <LockedScreen />
50 );
51 }
52
53 return (
54 <Router history={history}>
55 <Route path="/" component={AppLayoutContainer}>
56 <Route path={ANNOUNCEMENTS_ROUTES.TARGET} component={AnnouncementScreen} />
57 <Route path="/settings" component={SettingsWindow}>
58 <IndexRedirect to="/settings/recipes" />
59 <Route path="/settings/recipes" component={RecipesScreen} />
60 <Route path="/settings/recipes/:filter" component={RecipesScreen} />
61 <Route path="/settings/services" component={ServicesScreen} />
62 <Route path="/settings/services/:action/:id" component={EditServiceScreen} />
63 <Route path={WORKSPACES_ROUTES.ROOT} component={WorkspacesScreen} />
64 <Route path={WORKSPACES_ROUTES.EDIT} component={EditWorkspaceScreen} />
65 <Route path="/settings/user" component={AccountScreen} />
66 <Route path="/settings/user/edit" component={EditUserScreen} />
67 <Route path="/settings/team" component={TeamScreen} />
68 <Route path="/settings/app" component={EditSettingsScreen} />
69 <Route path="/settings/invite" component={InviteSettingsScreen} />
70 <Route path="/settings/support" component={SupportFerdiScreen} />
71 </Route>
72 </Route>
73 <Route path="/auth" component={AuthLayoutContainer}>
74 <IndexRedirect to="/auth/welcome" />
75 <Route path="/auth/welcome" component={WelcomeScreen} />
76 <Route path="/auth/login" component={LoginScreen} />
77 <Route path="/auth/server" component={ChangeServerScreen} />
78 <Route path="/auth/signup">
79 <IndexRedirect to="/auth/signup/form" />
80 <Route path="/auth/signup/form" component={SignupScreen} />
81 <Route path="/auth/signup/pricing" component={PricingScreen} />
82 <Route path="/auth/signup/import" component={ImportScreen} />
83 <Route path="/auth/signup/invite" component={InviteScreen} />
84 </Route>
85 <Route path="/auth/password" component={PasswordScreen} />
86 <Route path="/auth/logout" component={LoginScreen} />
87 </Route>
88 <Route path="/payment/:url" component={SubscriptionPopupScreen} />
89 <Route path="*" component={AppLayoutContainer} />
90 </Router>
91 );
92 }
93}
94
95Routes.wrappedComponent.propTypes = {
96 stores: PropTypes.shape({
97 settings: PropTypes.instanceOf(SettingsStore).isRequired,
98 }).isRequired,
99 history: PropTypes.any.isRequired,
100};
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 96142787e..153fdb2c8 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -33,8 +33,11 @@ const {
33const mainWindow = remote.getCurrentWindow(); 33const mainWindow = remote.getCurrentWindow();
34 34
35const defaultLocale = DEFAULT_APP_SETTINGS.locale; 35const defaultLocale = DEFAULT_APP_SETTINGS.locale;
36
37const executablePath = isMac ? remote.process.execPath : process.execPath;
36const autoLauncher = new AutoLaunch({ 38const autoLauncher = new AutoLaunch({
37 name: 'Ferdi', 39 name: 'Ferdi',
40 path: executablePath,
38}); 41});
39 42
40const CATALINA_NOTIFICATION_HACK_KEY = '_temp_askedForCatalinaNotificationPermissions'; 43const CATALINA_NOTIFICATION_HACK_KEY = '_temp_askedForCatalinaNotificationPermissions';
@@ -324,8 +327,10 @@ export default class AppStore extends Store {
324 327
325 try { 328 try {
326 if (enable) { 329 if (enable) {
330 debug('enabling launch on startup', executablePath);
327 autoLauncher.enable(); 331 autoLauncher.enable();
328 } else { 332 } else {
333 debug('disabling launch on startup');
329 autoLauncher.disable(); 334 autoLauncher.disable();
330 } 335 }
331 } catch (err) { 336 } catch (err) {
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 0ad523374..a8d9cc1fb 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -631,7 +631,8 @@ export default class ServicesStore extends Store {
631 } 631 }
632 632
633 @action _openWindow({ event }) { 633 @action _openWindow({ event }) {
634 if (event.disposition !== 'new-window' && event.url !== 'about:blank') { 634 if (event.url !== 'about:blank') {
635 event.preventDefault();
635 this.actions.app.openExternalUrl({ url: event.url }); 636 this.actions.app.openExternalUrl({ url: event.url });
636 } 637 }
637 } 638 }
diff --git a/src/stores/SettingsStore.js b/src/stores/SettingsStore.js
index 227eb2145..c50475819 100644
--- a/src/stores/SettingsStore.js
+++ b/src/stores/SettingsStore.js
@@ -6,6 +6,7 @@ import localStorage from 'mobx-localstorage';
6import { DEFAULT_APP_SETTINGS, FILE_SYSTEM_SETTINGS_TYPES, LOCAL_SERVER } from '../config'; 6import { DEFAULT_APP_SETTINGS, FILE_SYSTEM_SETTINGS_TYPES, LOCAL_SERVER } from '../config';
7import { API } from '../environment'; 7import { API } from '../environment';
8import { getLocale } from '../helpers/i18n-helpers'; 8import { getLocale } from '../helpers/i18n-helpers';
9import { hash } from '../helpers/password-helpers';
9import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 10import { SPELLCHECKER_LOCALES } from '../i18n/languages';
10import Request from './lib/Request'; 11import Request from './lib/Request';
11import Store from './lib/Store'; 12import Store from './lib/Store';
@@ -56,21 +57,6 @@ export default class SettingsStore extends Store {
56 }, 57 },
57 ); 58 );
58 59
59 reaction(
60 () => this.all.app.locked,
61 () => {
62 const { router } = window.ferdi.stores;
63 if (this.all.app.locked && this.all.app.lockingFeatureEnabled) {
64 // App just got locked, redirect to unlock screen
65 router.push('/auth/locked');
66 } else if (router.location.pathname.includes('/auth/locked')) {
67 // App is unlocked but user is still on locked screen
68 // Redirect to homepage
69 router.push('/');
70 }
71 },
72 );
73
74 // Inactivity lock timer 60 // Inactivity lock timer
75 let inactivityTimer; 61 let inactivityTimer;
76 remote.getCurrentWindow().on('blur', () => { 62 remote.getCurrentWindow().on('blur', () => {
@@ -96,15 +82,8 @@ export default class SettingsStore extends Store {
96 if (this.startup && resp.type === 'app' && resp.data.lockingFeatureEnabled) { 82 if (this.startup && resp.type === 'app' && resp.data.lockingFeatureEnabled) {
97 this.startup = false; 83 this.startup = false;
98 process.nextTick(() => { 84 process.nextTick(() => {
99 // If the app was previously closed unlocked
100 // we can update the `locked` setting and rely on the reaction to lock at startup
101 if (!this.all.app.locked) { 85 if (!this.all.app.locked) {
102 this.all.app.locked = true; 86 this.all.app.locked = true;
103 } else {
104 // Otherwise the app previously closed in a locked state
105 // We can't rely on updating the locked setting for the reaction to be triggered
106 // So we lock manually
107 window.ferdi.stores.router.push('/auth/locked');
108 } 87 }
109 }); 88 });
110 } 89 }
@@ -301,5 +280,25 @@ export default class SettingsStore extends Store {
301 280
302 debug('Migrated updates settings'); 281 debug('Migrated updates settings');
303 } 282 }
283
284 if (!this.all.migration['password-hashing']) {
285 if (this.stores.settings.app.lockedPassword !== '') {
286 this.actions.settings.update({
287 type: 'app',
288 data: {
289 lockedPassword: hash(String(legacySettings.lockedPassword)),
290 },
291 });
292 }
293
294 this.actions.settings.update({
295 type: 'migration',
296 data: {
297 'password-hashing': true,
298 },
299 });
300
301 debug('Migrated updates settings');
302 }
304 } 303 }
305} 304}