aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.all-contributorsrc85
-rw-r--r--.gitmodules2
-rw-r--r--.nvmrc2
-rw-r--r--.travis.yml30
-rw-r--r--README.md133
-rw-r--r--appveyor.yml4
-rw-r--r--branding/screenshots/hero.pngbin352745 -> 321357 bytes
-rw-r--r--build-helpers/images/win-app-ico.icobin4286 -> 162459 bytes
-rw-r--r--electron-builder.yml1
-rw-r--r--next_release.md47
-rw-r--r--package-lock.json193
-rw-r--r--package.json3
m---------recipes0
-rw-r--r--src/api/apiBase.js21
-rw-r--r--src/api/server/ServerApi.js27
-rw-r--r--src/assets/themeInfo.json2
-rw-r--r--src/components/services/content/ServiceView.js30
-rw-r--r--src/components/services/content/ServiceWebview.js5
-rw-r--r--src/components/settings/settings/EditSettingsForm.js3
-rw-r--r--src/components/ui/FeatureList.js2
-rw-r--r--src/config.js13
-rw-r--r--src/containers/settings/EditSettingsScreen.js10
-rw-r--r--src/features/accentColor/index.js12
-rw-r--r--src/features/serviceProxy/index.js3
-rw-r--r--src/i18n/locales/af.json1
-rw-r--r--src/i18n/locales/ar.json1
-rw-r--r--src/i18n/locales/bs.json1
-rw-r--r--src/i18n/locales/ca.json1
-rw-r--r--src/i18n/locales/cs.json1
-rw-r--r--src/i18n/locales/da.json1
-rw-r--r--src/i18n/locales/de.json37
-rw-r--r--src/i18n/locales/defaultMessages.json169
-rw-r--r--src/i18n/locales/el.json1
-rw-r--r--src/i18n/locales/en-US.json1
-rw-r--r--src/i18n/locales/es.json1
-rw-r--r--src/i18n/locales/fi.json1
-rw-r--r--src/i18n/locales/fr.json79
-rw-r--r--src/i18n/locales/ga.json1
-rw-r--r--src/i18n/locales/he.json1
-rw-r--r--src/i18n/locales/hr.json1
-rw-r--r--src/i18n/locales/hu.json1
-rw-r--r--src/i18n/locales/id.json1
-rw-r--r--src/i18n/locales/it.json1
-rw-r--r--src/i18n/locales/ja.json1
-rw-r--r--src/i18n/locales/ka.json1
-rw-r--r--src/i18n/locales/ko.json1
-rw-r--r--src/i18n/locales/nl-BE.json1
-rw-r--r--src/i18n/locales/nl.json1
-rw-r--r--src/i18n/locales/no.json1
-rw-r--r--src/i18n/locales/pl.json1
-rw-r--r--src/i18n/locales/pt-BR.json165
-rw-r--r--src/i18n/locales/pt.json1
-rw-r--r--src/i18n/locales/ro.json1
-rw-r--r--src/i18n/locales/ru.json1
-rw-r--r--src/i18n/locales/sk.json1
-rw-r--r--src/i18n/locales/sl.json1
-rw-r--r--src/i18n/locales/sr.json1
-rw-r--r--src/i18n/locales/sv.json1
-rw-r--r--src/i18n/locales/tr.json1
-rw-r--r--src/i18n/locales/uk.json1
-rw-r--r--src/i18n/locales/vi.json1
-rw-r--r--src/i18n/locales/zh-HANT.json1
-rw-r--r--src/i18n/locales/zh.json1
-rw-r--r--src/i18n/messages/src/components/settings/settings/EditSettingsForm.json116
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json53
-rw-r--r--src/index.html1
-rw-r--r--src/index.js15
-rw-r--r--src/lib/Menu.js18
-rw-r--r--src/sentry.js5
m---------src/server0
-rw-r--r--src/stores/AppStore.js23
-rw-r--r--src/stores/FeaturesStore.js5
-rw-r--r--src/stores/GlobalErrorStore.js52
-rw-r--r--src/stores/ServicesStore.js8
-rw-r--r--src/stores/UIStore.js15
-rw-r--r--src/stores/UserStore.js13
-rw-r--r--src/stores/lib/CachedRequest.js4
-rw-r--r--src/styles/tabs.scss2
-rw-r--r--src/webview/recipe.js14
79 files changed, 1004 insertions, 453 deletions
diff --git a/.all-contributorsrc b/.all-contributorsrc
index cd9704edf..487175335 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -1,6 +1,6 @@
1{ 1{
2 "projectName": "ferdi", 2 "projectName": "ferdi",
3 "projectOwner": "kytwb", 3 "projectOwner": "getferdi",
4 "repoType": "github", 4 "repoType": "github",
5 "repoHost": "https://github.com", 5 "repoHost": "https://github.com",
6 "files": [ 6 "files": [
@@ -63,7 +63,8 @@
63 "projectManagement", 63 "projectManagement",
64 "review", 64 "review",
65 "infra", 65 "infra",
66 "fundingFinding" 66 "fundingFinding",
67 "blog"
67 ] 68 ]
68 }, 69 },
69 { 70 {
@@ -158,7 +159,10 @@
158 "contributions": [ 159 "contributions": [
159 "bug", 160 "bug",
160 "code", 161 "code",
161 "translation" 162 "translation",
163 "content",
164 "doc",
165 "platform"
162 ] 166 ]
163 }, 167 },
164 { 168 {
@@ -172,6 +176,81 @@
172 "infra", 176 "infra",
173 "platform" 177 "platform"
174 ] 178 ]
179 },
180 {
181 "login": "Gaboris",
182 "name": "Gaboris",
183 "avatar_url": "https://avatars2.githubusercontent.com/u/9462372?v=4",
184 "profile": "https://github.com/Gaboris",
185 "contributions": [
186 "question",
187 "bug"
188 ]
189 },
190 {
191 "login": "incace",
192 "name": "Ce",
193 "avatar_url": "https://avatars1.githubusercontent.com/u/61343?v=4",
194 "profile": "http://www.cu3ed.com/",
195 "contributions": [
196 "bug"
197 ]
198 },
199 {
200 "login": "pztrn",
201 "name": "Stanislav N.",
202 "avatar_url": "https://avatars1.githubusercontent.com/u/869402?v=4",
203 "profile": "http://pztrn.name/",
204 "contributions": [
205 "bug"
206 ]
207 },
208 {
209 "login": "patrickcurl",
210 "name": "Patrick Curl",
211 "avatar_url": "https://avatars1.githubusercontent.com/u/1470061?v=4",
212 "profile": "http://www.patrickcurl.com",
213 "contributions": [
214 "ideas"
215 ]
216 },
217 {
218 "login": "Stanzilla",
219 "name": "Benjamin Staneck",
220 "avatar_url": "https://avatars3.githubusercontent.com/u/75278?v=4",
221 "profile": "https://github.com/Stanzilla",
222 "contributions": [
223 "design"
224 ]
225 },
226 {
227 "login": "ammarmalhas",
228 "name": "ammarmalhas",
229 "avatar_url": "https://avatars1.githubusercontent.com/u/57057209?v=4",
230 "profile": "https://github.com/ammarmalhas",
231 "contributions": [
232 "bug",
233 "security"
234 ]
235 },
236 {
237 "login": "steliyan",
238 "name": "Steliyan Stoyanov",
239 "avatar_url": "https://avatars1.githubusercontent.com/u/1850292?v=4",
240 "profile": "https://github.com/steliyan",
241 "contributions": [
242 "code",
243 "ideas"
244 ]
245 },
246 {
247 "login": "brorbw",
248 "name": "Bror Winther",
249 "avatar_url": "https://avatars2.githubusercontent.com/u/5909562?v=4",
250 "profile": "https://github.com/brorbw",
251 "contributions": [
252 "doc"
253 ]
175 } 254 }
176 ], 255 ],
177 "contributorsPerLine": 6 256 "contributorsPerLine": 6
diff --git a/.gitmodules b/.gitmodules
index 00bc1d26d..78e0c5221 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -2,7 +2,9 @@
2 path = recipes 2 path = recipes
3 url = https://github.com/getferdi/recipes.git 3 url = https://github.com/getferdi/recipes.git
4 ignore = all 4 ignore = all
5 branch = master
5[submodule "src/server"] 6[submodule "src/server"]
6 path = src/server 7 path = src/server
7 url = https://github.com/getferdi/internal-server.git 8 url = https://github.com/getferdi/internal-server.git
8 ignore = all 9 ignore = all
10 branch = master
diff --git a/.nvmrc b/.nvmrc
index 0ca1348de..73bffb039 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
10.14.0 10.17.0
diff --git a/.travis.yml b/.travis.yml
index ebc96d2cd..d44187e75 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,25 +1,31 @@
1matrix: 1matrix:
2 include: 2 include:
3 - os: linux 3 - os: linux
4 dist: xenial 4 dist: xenial
5 addons: 5 addons:
6 apt: 6 apt:
7 packages: 7 packages:
8 - libx11-dev 8 - libx11-dev
9 - libxext-dev 9 - libxext-dev
10 - libxss-dev 10 - libxss-dev
11 - libxkbfile-dev 11 - libxkbfile-dev
12 - os: osx 12 - rpm
13 osx_image: xcode11 13 - os: osx
14 osx_image: xcode11
14 15
15language: node_js 16language: node_js
17# Handle git submodules yourself
18git:
19 submodules: false
20# Use sed to replace the SSH URL with the public URL, then initialize submodules
21before_install:
22 - git submodule update --init --recursive
16install: 23install:
17 - echo do nothing 24 - echo do nothing
18before_script: 25before_script:
19 - travis_wait 60 npx lerna bootstrap 26 - travis_wait 60 npx lerna bootstrap
20 - npm install node-sass -g 27 - npm install node-sass -g
21script: 28script:
22 - npm run test
23 - travis_wait 30 npm run build 29 - travis_wait 30 npm run build
24cache: npm 30cache: npm
25 31
diff --git a/README.md b/README.md
index 285c80bb0..662fc37f3 100644
--- a/README.md
+++ b/README.md
@@ -4,14 +4,67 @@
4 4
5# Ferdi 5# Ferdi
6 6
7[![Backers on Open Collective](https://opencollective.com/getferdi/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/getferdi/sponsors/badge.svg)](#sponsors) [![Build Status Windows](https://ci.appveyor.com/api/projects/status/2ckfbmoxp36fye5b?svg=true)](https://ci.appveyor.com/project/kytwb/ferdi) 7<p align="center">
8[![Build Status Mac & Linux](https://travis-ci.org/getferdi/ferdi.svg?branch=master)](https://travis-ci.org/getferdi/ferdi) 8<a href="#backers-via-opencollective"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective"></a>
9<a href="#sponsors-via-opencollective"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective"></a>
10<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>
11<a href="https://travis-ci.org/getferdi/ferdi"><img alt="Build Status Mac & Linux" src="https://img.shields.io/travis/getferdi/ferdi/master?logo=travis"></a>
12</p>
9 13
10🤴🽠Hard-fork of [Franz](https://github.com/meetfranz/franz), adding awesome features and removing unwanted ones. 14🤴🽠Hard-fork of [Franz](https://github.com/meetfranz/franz), adding awesome features and removing unwanted ones.
11 15
16### Table of contents
17
18<details>
19<summary>Ferdi</summary>
20<ul>
21<li><a href="#what-is-ferdi-">What is Ferdi ?</a></li>
22<li><a href="#what-ferdi-looks-like-">What Ferdi looks like ?</a></li>
23<li><a href="#download-ferdi">Download Ferdi</a>
24<ul>
25<li><a href="#or-use-homebrew-macos-only">Or use homebrew</a></li>
26</ul>
27</li>
28<li><a href="#ferdi-specific-features">Ferdi-specific Features</a></li>
29<li><a href="#development">Development</a></li>
30<ul>
31<li><a href="#install-os-dependencies">Install OS dependencies</a></li>
32<li><a href="#clone-repository-with-submodule">Clone repository with submodule</a></li>
33<li><a href="#install-dependencies">Install dependencies</a></li>
34<li><a href="#fix-native-modules-to-match-current-electron-node-version">Fix native modules to match current electron node version</a></li>
35<li><a href="#start-development-app">Start development app</a></li>
36<li><a href="#packaging">Packaging</a></li>
37<li><a href="#release">Release</a></li>
38</ul>
39<li><a href="#contributors-">Contributors ✨</a></li>
40<li><a href="#backers-via-opencollective">Backers via OpenCollective</a></li>
41<li><a href="#sponsors-via-opencollective">Sponsors via OpenCollective</a></li>
42</ul>
43</details>
44
45### What is Ferdi ?
46
47Ferdi is a messaging browser that allows you to combine your favorite messaging services into one application. It is based on Franz - a software already used by thousands of people - with the difference that Ferdi gives you many additonal features and doesn't restrict its usage! Ferdi is compatible with your existing Franz account so you can continue right where you left off. Find out more about Ferdi and its features on [getferdi.com](https://getferdi.com).
48
49### What Ferdi looks like ?
50
51<details>
52<summary>Screenshots</summary>
53<p align="center">
54<img alt="Keep all your messaging services in one place." src="./branding/screenshots/hero.png">
55<em>"Keep all your messaging services in one place."</em>
56<img alt="Order your services with Ferdi Workspaces." src="./branding/screenshots/workspaces.png">
57<em>"Order your services with Ferdi Workspaces."</em>
58<img alt="Always keep your Todo list open with Ferdi Todos." src="./branding/screenshots/todos.png">
59<em>"Always keep your Todo list open with Ferdi Todos."</em>
60<img alt="Supporting all your services." src="./branding/screenshots/service-store.png">
61<em>"Supporting all your services."</em>
62</p>
63</details>
64
12## Download Ferdi 65## Download Ferdi
13 66
14You can find the installers in the [latest release](https://github.com/getferdi/ferdi/releases) assets. 67You can find the installers in the [latest stable release](https://github.com/getferdi/ferdi/releases/latest) assets and [all the other release here](https://github.com/getferdi/ferdi/releases).
15 68
16### Or use homebrew (macOS only) 69### Or use homebrew (macOS only)
17 70
@@ -19,6 +72,16 @@ You can find the installers in the [latest release](https://github.com/getferdi/
19 72
20(Don't know homebrew? [brew.sh](https://brew.sh/)) 73(Don't know homebrew? [brew.sh](https://brew.sh/))
21 74
75### Or use AUR (Arch Linux)
76
77Ferdi has two seperate AUR packages you can use:
78- **ferdi-build**: Uses your debian build and extracts it to Arch
79- **ferdi-git**: Uses system electron version
80
81If you use a AUR Helper e.g. yay, simply install it via ´yay -S ferdi-bin´
82
83`ferdi-git` may not work on all systems so we advice you to use `ferdi-bin` instead.
84
22## Ferdi-specific Features 85## Ferdi-specific Features
23 86
24- [x] Removes the counter-productive fullscreen app delay inviting users to upgrade 87- [x] Removes the counter-productive fullscreen app delay inviting users to upgrade
@@ -33,6 +96,7 @@ You can find the installers in the [latest release](https://github.com/getferdi/
33- [x] Add Password Lock feature to keep your messages protected ([#41](https://github.com/getferdi/ferdi/issues/41), [franz#810](https://github.com/meetfranz/franz/issues/810), [franz#950](https://github.com/meetfranz/franz/issues/950), [franz#1430](https://github.com/meetfranz/franz/issues/1430)) 96- [x] Add Password Lock feature to keep your messages protected ([#41](https://github.com/getferdi/ferdi/issues/41), [franz#810](https://github.com/meetfranz/franz/issues/810), [franz#950](https://github.com/meetfranz/franz/issues/950), [franz#1430](https://github.com/meetfranz/franz/issues/1430))
34- [x] Add an option to keep individual workspaces always loaded ([#37](https://github.com/getferdi/ferdi/issues/37)) 97- [x] Add an option to keep individual workspaces always loaded ([#37](https://github.com/getferdi/ferdi/issues/37))
35- [x] Add universal Dark-Mode via the [DarkReader extension](https://github.com/darkreader/darkreader) ([#71](https://github.com/getferdi/ferdi/issues/71)) 98- [x] Add universal Dark-Mode via the [DarkReader extension](https://github.com/darkreader/darkreader) ([#71](https://github.com/getferdi/ferdi/issues/71))
99- [x] Add adaptable Dark Mode that will respect the system's darkmode setting ([#173](https://github.com/getferdi/ferdi/issues/173))
36- [x] Add an option to auto-hide the menubar ([#7](https://github.com/getferdi/ferdi/issues/7), [franz#833](https://github.com/meetfranz/franz/issues/833)) 100- [x] Add an option to auto-hide the menubar ([#7](https://github.com/getferdi/ferdi/issues/7), [franz#833](https://github.com/meetfranz/franz/issues/833))
37- [x] Add "Quick Switch" feature to help you navigate a long list of services (similar to Rambox's [Quick Switcher](https://rambox.pro/#feature-details/quick_switcher)) 101- [x] Add "Quick Switch" feature to help you navigate a long list of services (similar to Rambox's [Quick Switcher](https://rambox.pro/#feature-details/quick_switcher))
38- [x] Add "Service Hibernation" that will automatically unload services when they are unused 102- [x] Add "Service Hibernation" that will automatically unload services when they are unused
@@ -44,7 +108,7 @@ You can find the installers in the [latest release](https://github.com/getferdi/
44- [x] Add Process Manager to find services using a lot of resources 108- [x] Add Process Manager to find services using a lot of resources
45- [x] Add "npm run prepare-code" command for development to lint and beautify code 109- [x] Add "npm run prepare-code" command for development to lint and beautify code
46- [x] Add button to open darkmode.css for a service 110- [x] Add button to open darkmode.css for a service
47- [x] Switch to [`electron-spellchecker`](https://github.com/electron-userland/electron-spellchecker) ti improve application size 111- [x] Switch to [`electron-spellchecker`](https://github.com/electron-userland/electron-spellchecker) to improve application size
48- [x] Improve "About Ferdi" screen to better display versions 112- [x] Improve "About Ferdi" screen to better display versions
49- [x] Minifying build files to improve app size 113- [x] Minifying build files to improve app size
50- [x] [Makes it possible to edit the "Franz Todo" server](https://github.com/getferdi/ferdi/wiki/Custom-Todo) 114- [x] [Makes it possible to edit the "Franz Todo" server](https://github.com/getferdi/ferdi/wiki/Custom-Todo)
@@ -53,38 +117,35 @@ You can find the installers in the [latest release](https://github.com/getferdi/
53 117
54## Development 118## Development
55 119
56### Preparations 120### Install OS dependencies
57
58#### Install OS dependencies
59 121
60##### Node.js 122#### Node.js
61 123
62Please make sure you are running NodeJS v10 ([v10.16.3](https://nodejs.org/dist/v10.16.3/) suggested). Versions above will throw an errow when trying to install due to an [old fsevent dependency](https://github.com/fsevents/fsevents/issues/278). 124Please make sure you are running NodeJS v10 ([v10.16.3](https://nodejs.org/dist/v10.16.3/) suggested). Versions above will throw an errow when trying to install due to an [old fsevent dependency](https://github.com/fsevents/fsevents/issues/278).
63 125
64##### Git 126#### Git
65 127
66The version [2.23.0](https://github.com/git-for-windows/git/releases/tag/v2.23.0.windows.1) for Git is working fine for development. You can then use the console from Git to do the development procedure. 128The version [2.23.0](https://github.com/git-for-windows/git/releases/tag/v2.23.0.windows.1) for Git is working fine for development. You can then use the console from Git to do the development procedure.
67 129
68##### Debian/Ubuntu 130#### Debian/Ubuntu
69 131
70```bash 132```bash
71$ apt install libx11-dev libxext-dev libxss-dev libxkbfile-dev 133$ apt install libx11-dev libxext-dev libxss-dev libxkbfile-dev
72``` 134```
73 135
74##### Fedora 136#### Fedora
75 137
76```bash 138```bash
77$ dnf install libX11-devel libXext-devel libXScrnSaver-devel libxkbfile-devel 139$ dnf install libX11-devel libXext-devel libXScrnSaver-devel libxkbfile-devel
78``` 140```
79 141
80##### Windows 142#### Windows
81 143
82```bash 144```bash
83$ npm install --global windows-build-tools // Windows 10 145$ npm install --global windows-build-tools --vs2015
84$ npm install --global windows-build-tools --vs2015 // Windows 7
85``` 146```
86 147
87#### Clone repository with submodule 148### Clone repository with submodule
88 149
89```bash 150```bash
90$ git clone https://github.com/getferdi/ferdi.git 151$ git clone https://github.com/getferdi/ferdi.git
@@ -145,34 +206,40 @@ When pushing a new tag, the CI builds will create a draft GitHub release and upl
145Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 206Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
146 207
147<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> 208<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
148<!-- prettier-ignore-start --> 209<!-- prettier-ignore -->
149<!-- markdownlint-disable -->
150<table> 210<table>
151 <tr> 211 <tr>
152 <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/kytwb/ferdi/commits?author=vantezzen" title="Code">💻</a> <a href="#design-vantezzen" title="Design">🎨</a> <a href="https://github.com/kytwb/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/kytwb/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="#review-vantezzen" title="Reviewed Pull Requests">👀</a></td> 212 <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="#review-vantezzen" title="Reviewed Pull Requests">👀</a></td>
153 <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/kytwb/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/kytwb/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/kytwb/ferdi/commits?author=adlk" title="Tests">âš ï¸</a> <a href="#translation-adlk" title="Translation">ðŸŒ</a></td> 213 <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>
154 <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="#question-kytwb" title="Answering Questions">💬</a> <a href="https://github.com/kytwb/ferdi/commits?author=kytwb" title="Code">💻</a> <a href="https://github.com/kytwb/ferdi/commits?author=kytwb" title="Documentation">📖</a> <a href="#ideas-kytwb" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-kytwb" title="Maintenance">🚧</a> <a href="#platform-kytwb" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-kytwb" title="Project Management">📆</a> <a href="#review-kytwb" title="Reviewed Pull Requests">👀</a> <a href="#infra-kytwb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#fundingFinding-kytwb" title="Funding Finding">ðŸ”</a></td> 214 <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="#question-kytwb" title="Answering Questions">💬</a> <a href="https://github.com/getferdi/ferdi/commits?author=kytwb" title="Code">💻</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="#maintenance-kytwb" title="Maintenance">🚧</a> <a href="#platform-kytwb" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-kytwb" title="Project Management">📆</a> <a href="#review-kytwb" title="Reviewed Pull Requests">👀</a> <a href="#infra-kytwb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#fundingFinding-kytwb" title="Funding Finding">ðŸ”</a> <a href="#blog-kytwb" title="Blogposts">ðŸ“</a></td>
155 <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/kytwb/ferdi/commits?author=ZeroCool940711" title="Code">💻</a> <a href="#ideas-ZeroCool940711" title="Ideas, Planning, & Feedback">🤔</a></td> 215 <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>
156 <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/kytwb/ferdi/commits?author=rseitbekov" title="Code">💻</a></td> 216 <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>
157 <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/kytwb/ferdi/issues?q=author%3Abittner" title="Bug reports">ðŸ›</a></td> 217 <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>
158 </tr> 218 </tr>
159 <tr> 219 <tr>
160 <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/kytwb/ferdi/issues?q=author%3Ajustus-saul" title="Bug reports">ðŸ›</a> <a href="#ideas-justus-saul" title="Ideas, Planning, & Feedback">🤔</a></td> 220 <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>
161 <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> 221 <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>
162 <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> 222 <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>
163 <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/kytwb/ferdi/issues?q=author%3Adayzlun" title="Bug reports">ðŸ›</a></td> 223 <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>
164 <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> 224 <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>
165 <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> 225 <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>
166 </tr> 226 </tr>
167 <tr> 227 <tr>
168 <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/kytwb/ferdi/issues?q=author%3AMakazzz" title="Bug reports">ðŸ›</a> <a href="https://github.com/kytwb/ferdi/commits?author=Makazzz" title="Code">💻</a> <a href="#translation-Makazzz" title="Translation">ðŸŒ</a></td> 228 <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>
169 <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/kytwb/ferdi/commits?author=xthursdayx" title="Code">💻</a> <a href="https://github.com/kytwb/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> 229 <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>
230 <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>
231 <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>
232 <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>
233 <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>
234 </tr>
235 <tr>
236 <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>
237 <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>
238 <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>
239 <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>
170 </tr> 240 </tr>
171</table> 241</table>
172 242
173<!-- markdownlint-enable -->
174<!-- prettier-ignore-end -->
175
176<!-- ALL-CONTRIBUTORS-LIST:END --> 243<!-- ALL-CONTRIBUTORS-LIST:END -->
177 244
178<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> 245<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
@@ -187,4 +254,8 @@ This project follows the [all-contributors](https://github.com/all-contributors/
187 254
188## Backers via OpenCollective 255## Backers via OpenCollective
189 256
190<a href="https://opencollective.com/getferdi#backers" target="_blank"><img src="https://opencollective.com/getferdi/backers.svg?width=890"></a> 257<a href="https://opencollective.com/getferdi#section-contribute" target="_blank"><img src="https://opencollective.com/getferdi/backers.svg?width=890"></a>
258
259## Sponsors via OpenCollective
260
261<a href="https://opencollective.com/getferdi#section-contribute" target="_blank"><img src="https://opencollective.com/getferdi/sponsors.svg?width=890"></a>
diff --git a/appveyor.yml b/appveyor.yml
index 1034565ed..c367baeb3 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,7 +1,7 @@
1environment: 1environment:
2 APPVEYOR_CACHE_SKIP_RESTORE: true 2 APPVEYOR_CACHE_SKIP_RESTORE: true
3 3
4version: 5.0.1.{build} 4version: 5.4.0.{build}
5 5
6install: 6install:
7 - git submodule update --init --recursive 7 - git submodule update --init --recursive
@@ -13,7 +13,7 @@ cache:
13 13
14before_build: 14before_build:
15 - npm run lint 15 - npm run lint
16 - npm run test 16 - cmd: set NODE_ENV=production
17 17
18build_script: 18build_script:
19 - npm run build 19 - npm run build
diff --git a/branding/screenshots/hero.png b/branding/screenshots/hero.png
index f21e2abb6..09f509ca7 100644
--- a/branding/screenshots/hero.png
+++ b/branding/screenshots/hero.png
Binary files differ
diff --git a/build-helpers/images/win-app-ico.ico b/build-helpers/images/win-app-ico.ico
index 658826324..3731f6425 100644
--- a/build-helpers/images/win-app-ico.ico
+++ b/build-helpers/images/win-app-ico.ico
Binary files differ
diff --git a/electron-builder.yml b/electron-builder.yml
index f6dceabce..4fa6c0b15 100644
--- a/electron-builder.yml
+++ b/electron-builder.yml
@@ -43,6 +43,7 @@ linux:
43 - target: AppImage 43 - target: AppImage
44 - target: deb 44 - target: deb
45 - target: tar.gz 45 - target: tar.gz
46 - target: rpm
46 47
47nsis: 48nsis:
48 perMachine: false 49 perMachine: false
diff --git a/next_release.md b/next_release.md
new file mode 100644
index 000000000..ae472bce9
--- /dev/null
+++ b/next_release.md
@@ -0,0 +1,47 @@
1# Next release
2Infos about the next release:
3
4## Beta
5v5.4.0-beta.5:
6- Updated translations
7- Remove "&" sign from window menu bar (#65)
8- Extend debug information
9- Use SSH for submodules
10- Move hibernation indicator to bottom left (#129 (comment))
11- Add fix for 1.1.1.1 hack (#146)
12- Fix darkmode not loading correctly (#158)
13- Add adaptable Dark Mode that will respect the system's darkmode setting ([#173](https://github.com/getferdi/ferdi/issues/173))
14
15## Minor
16v5.4.0
17
18### Features
19- **Merge Franz 5.4.0**
20- **Use Ferdi without an Account**: Simply choose "Use Ferdi without an Account" on the login screen
21- **Accent color**: Change Ferdi's accent color
22- **Darkmode**:
23 - Easily open and edit any service's `darkmode.css` through the new "Open darkmode.css" button
24 - Add adaptable Dark Mode that will respect the system's darkmode setting ([#173](https://github.com/getferdi/ferdi/issues/173) - @steliyan)
25- **Hibernation**: Activate service hibernation to save battery
26- **Smaller file size**: Ferdi is now 17% smaller
27- **Annoucements**: Always get notified about the latest features of Ferdi
28- **Navigation bar**: Add option to always show a service navigation bar
29
30### Minor changes
31- Sorting applications in QuickSwitch by last used
32- Add info about teams only being available on Franz servers
33- Add toggle to disable dark mode on per-service basis
34- Add toggle to disable universal Dark Mode
35- Improve switching between accounts
36- Extend debug information
37- Add fix for 1.1.1.1 hack (#146)
38
39### Bug fixes
40- Fix universal darkmode for WhatsApp and Threema QR Codes
41- Fix darkmode not activating on reload
42- Fix disabling/enabling service not correctly reloading webview (#116)
43- Remove "&" sign from window menu bar (#65)
44
45### Changes in building Ferdi
46- Update Building Node Version
47- Use SSH for submodules \ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 2cbbe8939..c84c1afbc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "ferdi", 2 "name": "ferdi",
3 "version": "5.4.0-beta.2", 3 "version": "5.4.0-beta.5",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
@@ -3071,14 +3071,6 @@
3071 "version": "3.9.97", 3071 "version": "3.9.97",
3072 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.9.97.tgz", 3072 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.9.97.tgz",
3073 "integrity": "sha512-JzX6rDlUcNZHaoUg9sAzdg5Js287tvgRbNmMIyKoJK2ZCP9JupeWTYlpbX4oNJ9Zg9v8YH76WuWLALKOospQgw==" 3073 "integrity": "sha512-JzX6rDlUcNZHaoUg9sAzdg5Js287tvgRbNmMIyKoJK2ZCP9JupeWTYlpbX4oNJ9Zg9v8YH76WuWLALKOospQgw=="
3074 },
3075 "@meetfranz/theme": {
3076 "version": "1.0.14",
3077 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
3078 "integrity": "sha512-iWP+3ifiNum98sHKiNdUJK+R0p4Z7TT8OenA1N2BnSC6CFob+dLhzAK+o5lxcyEcKZKYDwd7JKRZj93wqpBPpg==",
3079 "requires": {
3080 "color": "^3.1.0"
3081 }
3082 } 3074 }
3083 } 3075 }
3084 }, 3076 },
@@ -3101,14 +3093,6 @@
3101 "version": "3.9.97", 3093 "version": "3.9.97",
3102 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.9.97.tgz", 3094 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.9.97.tgz",
3103 "integrity": "sha512-JzX6rDlUcNZHaoUg9sAzdg5Js287tvgRbNmMIyKoJK2ZCP9JupeWTYlpbX4oNJ9Zg9v8YH76WuWLALKOospQgw==" 3095 "integrity": "sha512-JzX6rDlUcNZHaoUg9sAzdg5Js287tvgRbNmMIyKoJK2ZCP9JupeWTYlpbX4oNJ9Zg9v8YH76WuWLALKOospQgw=="
3104 },
3105 "@meetfranz/theme": {
3106 "version": "1.0.14",
3107 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
3108 "integrity": "sha512-iWP+3ifiNum98sHKiNdUJK+R0p4Z7TT8OenA1N2BnSC6CFob+dLhzAK+o5lxcyEcKZKYDwd7JKRZj93wqpBPpg==",
3109 "requires": {
3110 "color": "^3.1.0"
3111 }
3112 } 3096 }
3113 } 3097 }
3114 }, 3098 },
@@ -3229,6 +3213,136 @@
3229 "universal-user-agent": "^4.0.0" 3213 "universal-user-agent": "^4.0.0"
3230 } 3214 }
3231 }, 3215 },
3216 "@sentry/browser": {
3217 "version": "4.6.6",
3218 "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.6.6.tgz",
3219 "integrity": "sha512-+9VsQ+oQYU+PYlLJG2ex7JCMSVQbnUvWPI2uZOofWdI9sWIPUub3boWItMzRQNQ1T4S3FZd4FqAWNFd3azdnBw==",
3220 "requires": {
3221 "@sentry/core": "4.6.6",
3222 "@sentry/types": "4.5.3",
3223 "@sentry/utils": "4.6.5",
3224 "tslib": "^1.9.3"
3225 }
3226 },
3227 "@sentry/core": {
3228 "version": "4.6.6",
3229 "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.6.6.tgz",
3230 "integrity": "sha512-7z9HKLTNr3zVBR3tBRheTxkkkuK2IqISUc5Iyo3crN2OecOLtpptT96f5XjLndBEL2ab39eCBPpA5OFjbpzrIA==",
3231 "requires": {
3232 "@sentry/hub": "4.6.5",
3233 "@sentry/minimal": "4.6.5",
3234 "@sentry/types": "4.5.3",
3235 "@sentry/utils": "4.6.5",
3236 "tslib": "^1.9.3"
3237 }
3238 },
3239 "@sentry/electron": {
3240 "version": "0.17.4",
3241 "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-0.17.4.tgz",
3242 "integrity": "sha512-1IU0o+E8eY5Lrthj6Pqf+Dh8MptddHsFFmcOwKlft/bbZ+6RTKEefLtFOclKUMLR64C7GTqa80Yddq0ssjOv5w==",
3243 "requires": {
3244 "@sentry/browser": "4.6.2 || ~4.6.4",
3245 "@sentry/core": "4.6.2 || ~4.6.4",
3246 "@sentry/minimal": "^4.5.0",
3247 "@sentry/node": "4.6.2 || ~4.6.4",
3248 "@sentry/types": "^4.5.0",
3249 "@sentry/utils": "4.6.2 || ~4.6.4",
3250 "electron-fetch": "1.3.0",
3251 "form-data": "2.3.2",
3252 "util.promisify": "1.0.0"
3253 },
3254 "dependencies": {
3255 "combined-stream": {
3256 "version": "1.0.6",
3257 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
3258 "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
3259 "requires": {
3260 "delayed-stream": "~1.0.0"
3261 }
3262 },
3263 "form-data": {
3264 "version": "2.3.2",
3265 "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
3266 "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
3267 "requires": {
3268 "asynckit": "^0.4.0",
3269 "combined-stream": "1.0.6",
3270 "mime-types": "^2.1.12"
3271 }
3272 }
3273 }
3274 },
3275 "@sentry/hub": {
3276 "version": "4.6.5",
3277 "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.6.5.tgz",
3278 "integrity": "sha512-v9vee8s8C1fK/DPtNOzv6r+AMbPDOWfnasouNcBUkbQUSN5wUNyCDvt51QbWaw5kMMY5TSqjdVqY6gXQZI0APQ==",
3279 "requires": {
3280 "@sentry/types": "4.5.3",
3281 "@sentry/utils": "4.6.5",
3282 "tslib": "^1.9.3"
3283 }
3284 },
3285 "@sentry/minimal": {
3286 "version": "4.6.5",
3287 "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.6.5.tgz",
3288 "integrity": "sha512-tf+J+uUNmSgzC7d9JSN8Ekw1HeBAX87Efa/jyFbzLvaw80oibvTiLSLqDjQ9PgvyIzBUuuPImkS2NpvPQGWFtg==",
3289 "requires": {
3290 "@sentry/hub": "4.6.5",
3291 "@sentry/types": "4.5.3",
3292 "tslib": "^1.9.3"
3293 }
3294 },
3295 "@sentry/node": {
3296 "version": "4.6.6",
3297 "resolved": "https://registry.npmjs.org/@sentry/node/-/node-4.6.6.tgz",
3298 "integrity": "sha512-+zZHE2uOwQTgypP6N9oBd0Io6BKXaJh6mdmZBauF0G46/8V28sBQ/dXBtJJNZ8tW7eVlLGpLSGuJb9Ai7c/rNw==",
3299 "requires": {
3300 "@sentry/core": "4.6.6",
3301 "@sentry/hub": "4.6.5",
3302 "@sentry/types": "4.5.3",
3303 "@sentry/utils": "4.6.5",
3304 "@types/stack-trace": "0.0.29",
3305 "cookie": "0.3.1",
3306 "https-proxy-agent": "2.2.1",
3307 "lru_map": "0.3.3",
3308 "lsmod": "1.0.0",
3309 "stack-trace": "0.0.10",
3310 "tslib": "^1.9.3"
3311 },
3312 "dependencies": {
3313 "debug": {
3314 "version": "3.2.6",
3315 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
3316 "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
3317 "requires": {
3318 "ms": "^2.1.1"
3319 }
3320 },
3321 "https-proxy-agent": {
3322 "version": "2.2.1",
3323 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
3324 "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
3325 "requires": {
3326 "agent-base": "^4.1.0",
3327 "debug": "^3.1.0"
3328 }
3329 }
3330 }
3331 },
3332 "@sentry/types": {
3333 "version": "4.5.3",
3334 "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.5.3.tgz",
3335 "integrity": "sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag=="
3336 },
3337 "@sentry/utils": {
3338 "version": "4.6.5",
3339 "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.6.5.tgz",
3340 "integrity": "sha512-rTISJtRRbWsd3UE+TkA3QG1C0VzPKPW8w74tieBwYhtTCGmOHNwz2nDC/MZGbGj4OgDmNKKl4CCyQr88EX08hA==",
3341 "requires": {
3342 "@sentry/types": "4.5.3",
3343 "tslib": "^1.9.3"
3344 }
3345 },
3232 "@sindresorhus/is": { 3346 "@sindresorhus/is": {
3233 "version": "0.14.0", 3347 "version": "0.14.0",
3234 "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 3348 "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
@@ -3456,6 +3570,11 @@
3456 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.2.tgz", 3570 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.2.tgz",
3457 "integrity": "sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ==" 3571 "integrity": "sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ=="
3458 }, 3572 },
3573 "@types/stack-trace": {
3574 "version": "0.0.29",
3575 "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz",
3576 "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g=="
3577 },
3459 "@types/stack-utils": { 3578 "@types/stack-utils": {
3460 "version": "1.0.1", 3579 "version": "1.0.1",
3461 "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", 3580 "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
@@ -3820,7 +3939,6 @@
3820 "version": "4.3.0", 3939 "version": "4.3.0",
3821 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 3940 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
3822 "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 3941 "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
3823 "dev": true,
3824 "requires": { 3942 "requires": {
3825 "es6-promisify": "^5.0.0" 3943 "es6-promisify": "^5.0.0"
3826 } 3944 }
@@ -7529,7 +7647,6 @@
7529 "version": "1.1.3", 7647 "version": "1.1.3",
7530 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 7648 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
7531 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 7649 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
7532 "dev": true,
7533 "requires": { 7650 "requires": {
7534 "object-keys": "^1.0.12" 7651 "object-keys": "^1.0.12"
7535 } 7652 }
@@ -8946,7 +9063,6 @@
8946 "version": "1.14.2", 9063 "version": "1.14.2",
8947 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", 9064 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz",
8948 "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", 9065 "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==",
8949 "dev": true,
8950 "requires": { 9066 "requires": {
8951 "es-to-primitive": "^1.2.0", 9067 "es-to-primitive": "^1.2.0",
8952 "function-bind": "^1.1.1", 9068 "function-bind": "^1.1.1",
@@ -8964,7 +9080,6 @@
8964 "version": "1.2.0", 9080 "version": "1.2.0",
8965 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 9081 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
8966 "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 9082 "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
8967 "dev": true,
8968 "requires": { 9083 "requires": {
8969 "is-callable": "^1.1.4", 9084 "is-callable": "^1.1.4",
8970 "is-date-object": "^1.0.1", 9085 "is-date-object": "^1.0.1",
@@ -8994,14 +9109,12 @@
8994 "es6-promise": { 9109 "es6-promise": {
8995 "version": "4.2.8", 9110 "version": "4.2.8",
8996 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 9111 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
8997 "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 9112 "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
8998 "dev": true
8999 }, 9113 },
9000 "es6-promisify": { 9114 "es6-promisify": {
9001 "version": "5.0.0", 9115 "version": "5.0.0",
9002 "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 9116 "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
9003 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 9117 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
9004 "dev": true,
9005 "requires": { 9118 "requires": {
9006 "es6-promise": "^4.0.3" 9119 "es6-promise": "^4.0.3"
9007 } 9120 }
@@ -11224,8 +11337,7 @@
11224 "function-bind": { 11337 "function-bind": {
11225 "version": "1.1.1", 11338 "version": "1.1.1",
11226 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 11339 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
11227 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 11340 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
11228 "dev": true
11229 }, 11341 },
11230 "functional-red-black-tree": { 11342 "functional-red-black-tree": {
11231 "version": "1.0.1", 11343 "version": "1.0.1",
@@ -13397,7 +13509,6 @@
13397 "version": "1.0.3", 13509 "version": "1.0.3",
13398 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 13510 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
13399 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 13511 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
13400 "dev": true,
13401 "requires": { 13512 "requires": {
13402 "function-bind": "^1.1.1" 13513 "function-bind": "^1.1.1"
13403 } 13514 }
@@ -13458,8 +13569,7 @@
13458 "has-symbols": { 13569 "has-symbols": {
13459 "version": "1.0.0", 13570 "version": "1.0.0",
13460 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 13571 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
13461 "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 13572 "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
13462 "dev": true
13463 }, 13573 },
13464 "has-unicode": { 13574 "has-unicode": {
13465 "version": "2.0.1", 13575 "version": "2.0.1",
@@ -14331,8 +14441,7 @@
14331 "is-date-object": { 14441 "is-date-object": {
14332 "version": "1.0.1", 14442 "version": "1.0.1",
14333 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 14443 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
14334 "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 14444 "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
14335 "dev": true
14336 }, 14445 },
14337 "is-descriptor": { 14446 "is-descriptor": {
14338 "version": "0.1.6", 14447 "version": "0.1.6",
@@ -14525,7 +14634,6 @@
14525 "version": "1.0.4", 14634 "version": "1.0.4",
14526 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 14635 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
14527 "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 14636 "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
14528 "dev": true,
14529 "requires": { 14637 "requires": {
14530 "has": "^1.0.1" 14638 "has": "^1.0.1"
14531 } 14639 }
@@ -14556,7 +14664,6 @@
14556 "version": "1.0.2", 14664 "version": "1.0.2",
14557 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 14665 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
14558 "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 14666 "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
14559 "dev": true,
14560 "requires": { 14667 "requires": {
14561 "has-symbols": "^1.0.0" 14668 "has-symbols": "^1.0.0"
14562 } 14669 }
@@ -16513,6 +16620,16 @@
16513 "es5-ext": "~0.10.2" 16620 "es5-ext": "~0.10.2"
16514 } 16621 }
16515 }, 16622 },
16623 "lru_map": {
16624 "version": "0.3.3",
16625 "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
16626 "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0="
16627 },
16628 "lsmod": {
16629 "version": "1.0.0",
16630 "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz",
16631 "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks="
16632 },
16516 "macos-notification-state": { 16633 "macos-notification-state": {
16517 "version": "1.3.1", 16634 "version": "1.3.1",
16518 "resolved": "https://registry.npmjs.org/macos-notification-state/-/macos-notification-state-1.3.1.tgz", 16635 "resolved": "https://registry.npmjs.org/macos-notification-state/-/macos-notification-state-1.3.1.tgz",
@@ -18555,8 +18672,7 @@
18555 "object-inspect": { 18672 "object-inspect": {
18556 "version": "1.6.0", 18673 "version": "1.6.0",
18557 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 18674 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
18558 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 18675 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ=="
18559 "dev": true
18560 }, 18676 },
18561 "object-is": { 18677 "object-is": {
18562 "version": "1.0.1", 18678 "version": "1.0.1",
@@ -18567,8 +18683,7 @@
18567 "object-keys": { 18683 "object-keys": {
18568 "version": "1.1.1", 18684 "version": "1.1.1",
18569 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 18685 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
18570 "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 18686 "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
18571 "dev": true
18572 }, 18687 },
18573 "object-visit": { 18688 "object-visit": {
18574 "version": "1.0.1", 18689 "version": "1.0.1",
@@ -18617,7 +18732,6 @@
18617 "version": "2.0.3", 18732 "version": "2.0.3",
18618 "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 18733 "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
18619 "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 18734 "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
18620 "dev": true,
18621 "requires": { 18735 "requires": {
18622 "define-properties": "^1.1.2", 18736 "define-properties": "^1.1.2",
18623 "es-abstract": "^1.5.1" 18737 "es-abstract": "^1.5.1"
@@ -23134,7 +23248,6 @@
23134 "version": "2.1.0", 23248 "version": "2.1.0",
23135 "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 23249 "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
23136 "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 23250 "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
23137 "dev": true,
23138 "requires": { 23251 "requires": {
23139 "define-properties": "^1.1.3", 23252 "define-properties": "^1.1.3",
23140 "function-bind": "^1.1.1" 23253 "function-bind": "^1.1.1"
@@ -23144,7 +23257,6 @@
23144 "version": "2.1.0", 23257 "version": "2.1.0",
23145 "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 23258 "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
23146 "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 23259 "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
23147 "dev": true,
23148 "requires": { 23260 "requires": {
23149 "define-properties": "^1.1.3", 23261 "define-properties": "^1.1.3",
23150 "function-bind": "^1.1.1" 23262 "function-bind": "^1.1.1"
@@ -24738,7 +24850,6 @@
24738 "version": "1.0.0", 24850 "version": "1.0.0",
24739 "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", 24851 "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
24740 "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", 24852 "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
24741 "dev": true,
24742 "requires": { 24853 "requires": {
24743 "define-properties": "^1.1.2", 24854 "define-properties": "^1.1.2",
24744 "object.getownpropertydescriptors": "^2.0.3" 24855 "object.getownpropertydescriptors": "^2.0.3"
diff --git a/package.json b/package.json
index 1198da4f6..fe4950776 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
2 "name": "ferdi", 2 "name": "ferdi",
3 "productName": "Ferdi", 3 "productName": "Ferdi",
4 "appId": "com.kytwb.ferdi", 4 "appId": "com.kytwb.ferdi",
5 "version": "5.4.0-beta.4", 5 "version": "5.4.0",
6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.", 6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.",
7 "copyright": "kytwb", 7 "copyright": "kytwb",
8 "main": "index.js", 8 "main": "index.js",
@@ -56,6 +56,7 @@
56 "@meetfranz/forms": "file:packages/forms", 56 "@meetfranz/forms": "file:packages/forms",
57 "@meetfranz/theme": "file:packages/theme", 57 "@meetfranz/theme": "file:packages/theme",
58 "@meetfranz/ui": "file:packages/ui", 58 "@meetfranz/ui": "file:packages/ui",
59 "@sentry/electron": "0.17.4",
59 "address-rfc2822": "^2.0.1", 60 "address-rfc2822": "^2.0.1",
60 "atob": "2.1.2", 61 "atob": "2.1.2",
61 "auto-launch": "5.0.5", 62 "auto-launch": "5.0.5",
diff --git a/recipes b/recipes
Subproject 7aa76feba8bd94368d27bee556480313c636f94 Subproject 922b980f941dfbae0181595d35fa4618d1714e7
diff --git a/src/api/apiBase.js b/src/api/apiBase.js
index 561b025f0..85dd0f3df 100644
--- a/src/api/apiBase.js
+++ b/src/api/apiBase.js
@@ -6,25 +6,19 @@ import {
6} from '../environment'; 6} from '../environment';
7import { 7import {
8 LOCAL_SERVER, 8 LOCAL_SERVER,
9 SERVER_NOT_LOADED,
9} from '../config'; 10} from '../config';
10 11
11const apiBase = () => { 12const apiBase = (withVersion = true) => {
12 let url; 13 let url;
13 14
14 if (!window.ferdi 15 if (!window.ferdi
15 || !window.ferdi.stores.settings 16 || !window.ferdi.stores.settings
16 || !window.ferdi.stores.settings.all 17 || !window.ferdi.stores.settings.all
17 || !window.ferdi.stores.settings.all.app.server) { 18 || !window.ferdi.stores.settings.all.app.server) {
18 // Stores have not yet been loaded - send invalid URL to force a retry when stores are loaded 19 // Stores have not yet been loaded - return SERVER_NOT_LOADED to force a retry when stores are loaded
19 // "Why 1.1.1.1 as the default, invalid URL?" 20 return SERVER_NOT_LOADED;
20 // 1.1.1.1 is the server for Cloudflare's DNS service and will be the same across most networks. 21 } if (window.ferdi.stores.settings.all.app.server === LOCAL_SERVER) {
21 // Using a random IP could result in unwanted connections, using localhost could unwantedly
22 // connect to local develoment servers.
23 // 1.1.1.1 also sends a status 400 response for invalid routes. Other servers may return status 401
24 // on some routes. This would result in Ferdi deleting its current authToken as it thinks it
25 // has gone invalid.
26 url = 'https://1.1.1.1';
27 } else if (window.ferdi.stores.settings.all.app.server === LOCAL_SERVER) {
28 // Use URL for local server 22 // Use URL for local server
29 url = `http://127.0.0.1:${window.ferdi.stores.requests.localServerPort}`; 23 url = `http://127.0.0.1:${window.ferdi.stores.requests.localServerPort}`;
30 } else { 24 } else {
@@ -32,7 +26,10 @@ const apiBase = () => {
32 url = window.ferdi.stores.settings.all.app.server; 26 url = window.ferdi.stores.settings.all.app.server;
33 } 27 }
34 28
35 return `${url}/${API_VERSION}`; 29 if (withVersion) {
30 return `${url}/${API_VERSION}`;
31 }
32 return url;
36}; 33};
37 34
38export default apiBase; 35export default apiBase;
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index a5d636b4e..627425948 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -14,8 +14,7 @@ import OrderModel from '../../models/Order';
14 14
15import { sleep } from '../../helpers/async-helpers'; 15import { sleep } from '../../helpers/async-helpers';
16 16
17import { API } from '../../environment'; 17import { RECIPES_PATH, SERVER_NOT_LOADED } from '../../config';
18import { RECIPES_PATH } from '../../config';
19import apiBase from '../apiBase'; 18import apiBase from '../apiBase';
20import { prepareAuthRequest, sendAuthRequest } from '../utils/auth'; 19import { prepareAuthRequest, sendAuthRequest } from '../utils/auth';
21 20
@@ -39,8 +38,6 @@ module.paths.unshift(
39const { app } = remote; 38const { app } = remote;
40const { default: fetch } = remote.require('electron-fetch'); 39const { default: fetch } = remote.require('electron-fetch');
41 40
42const SERVER_URL = API;
43
44export default class ServerApi { 41export default class ServerApi {
45 recipePreviews = []; 42 recipePreviews = [];
46 43
@@ -121,6 +118,10 @@ export default class ServerApi {
121 } 118 }
122 119
123 async userInfo() { 120 async userInfo() {
121 if (apiBase() === SERVER_NOT_LOADED) {
122 throw new Error('Server not loaded');
123 }
124
124 const request = await sendAuthRequest(`${apiBase()}/me`); 125 const request = await sendAuthRequest(`${apiBase()}/me`);
125 if (!request.ok) { 126 if (!request.ok) {
126 throw request; 127 throw request;
@@ -163,6 +164,10 @@ export default class ServerApi {
163 164
164 // Services 165 // Services
165 async getServices() { 166 async getServices() {
167 if (apiBase() === SERVER_NOT_LOADED) {
168 throw new Error('Server not loaded');
169 }
170
166 const request = await sendAuthRequest(`${apiBase()}/me/services`); 171 const request = await sendAuthRequest(`${apiBase()}/me/services`);
167 if (!request.ok) { 172 if (!request.ok) {
168 throw request; 173 throw request;
@@ -287,6 +292,10 @@ export default class ServerApi {
287 } 292 }
288 293
289 async getFeatures() { 294 async getFeatures() {
295 if (apiBase() === SERVER_NOT_LOADED) {
296 throw new Error('Server not loaded');
297 }
298
290 const request = await sendAuthRequest(`${apiBase()}/features`); 299 const request = await sendAuthRequest(`${apiBase()}/features`);
291 if (!request.ok) { 300 if (!request.ok) {
292 throw request; 301 throw request;
@@ -449,7 +458,7 @@ export default class ServerApi {
449 458
450 // News 459 // News
451 async getLatestNews() { 460 async getLatestNews() {
452 const url = `${apiBase()}/news?platform=${os.platform()}&arch=${os.arch()}&version=${app.getVersion()}`; 461 const url = `https://api.getferdi.com/v1/news?platform=${os.platform()}&arch=${os.arch()}&version=${app.getVersion()}`;
453 const request = await sendAuthRequest(url); 462 const request = await sendAuthRequest(url);
454 if (!request.ok) throw request; 463 if (!request.ok) throw request;
455 const data = await request.json(); 464 const data = await request.json();
@@ -459,14 +468,18 @@ export default class ServerApi {
459 } 468 }
460 469
461 async hideNews(id) { 470 async hideNews(id) {
462 const request = await sendAuthRequest(`${apiBase()}/news/${id}/read`); 471 const request = await sendAuthRequest(`https://api.getferdi.com/v1/news/${id}/read`);
463 if (!request.ok) throw request; 472 if (!request.ok) throw request;
464 debug('ServerApi::hideNews resolves', id); 473 debug('ServerApi::hideNews resolves', id);
465 } 474 }
466 475
467 // Health Check 476 // Health Check
468 async healthCheck() { 477 async healthCheck() {
469 const request = await sendAuthRequest(`${SERVER_URL}/health`, { 478 if (apiBase() === SERVER_NOT_LOADED) {
479 throw new Error('Server not loaded');
480 }
481
482 const request = await sendAuthRequest(`${apiBase(false)}/health`, {
470 method: 'GET', 483 method: 'GET',
471 }, false); 484 }, false);
472 if (!request.ok) { 485 if (!request.ok) {
diff --git a/src/assets/themeInfo.json b/src/assets/themeInfo.json
index d6017de23..eaea65ca7 100644
--- a/src/assets/themeInfo.json
+++ b/src/assets/themeInfo.json
@@ -1 +1 @@
{"color":".theme__dark .app .sidebar .sidebar__button.is-muted, .theme__dark .app .sidebar .sidebar__button.is-active, .sidebar .sidebar__button.is-muted, .sidebar .sidebar__button.is-active, .settings .account .invoices .invoices__action button, .settings-navigation .settings-navigation__link.is-active .badge, a.button, a.link, .auth .welcome .button:hover, .auth .welcome .button__inverted, .franz-form .franz-form__radio.is-selected, .theme__dark .franz-form__button.franz-form__button--inverted, .franz-form__button.franz-form__button--inverted","border-left-color":".tab-item.is-active","border-color":".theme__dark .settings .premium-info, a.button, .franz-form .franz-form__radio.is-selected","background":".settings .settings__header, .settings .settings__close, .settings .settings__close:hover, .settings-navigation .settings-navigation__link.is-active, a.button:hover, .info-bar, .info-bar.info-bar--primary, .infobox.infobox--primary, .theme__dark .badge.badge--primary, .theme__dark .badge.badge--premium, .badge.badge--primary, .badge.badge--premium, .content-tabs .content-tabs__tabs .content-tabs__item.is-active, #electron-app-title-bar .toolbar-dropdown:not(.open) > .toolbar-button > button:hover, #electron-app-title-bar .list-item.selected .menu-item, #electron-app-title-bar .list-item.selected:focus .menu-item, .theme__dark .quick-switch .active, .franz-form .franz-form__toggle-wrapper .franz-form__toggle.is-active .franz-form__toggle-button, .theme__dark .franz-form__button, .theme__dark .franz-form__button:hover, .theme__dark .franz-form__button.franz-form__button--inverted:hover, .franz-form__button, .franz-form__button:hover, .franz-form__button.franz-form__button--inverted:hover","border-right-color":".settings .settings__header .separator"} \ No newline at end of file {"color":".theme__dark .app .sidebar .sidebar__button.is-muted, .theme__dark .app .sidebar .sidebar__button.is-active, .sidebar .sidebar__button.is-muted, .sidebar .sidebar__button.is-active, .settings .account .invoices .invoices__action button, .settings-navigation .settings-navigation__link.is-active .badge, a.button, button.button, a.link, button.link, .auth .welcome .button:hover, .auth .welcome .button__inverted, .franz-form .franz-form__radio.is-selected, .theme__dark .franz-form__button.franz-form__button--inverted, .franz-form__button.franz-form__button--inverted","border-left-color":".tab-item.is-active","border-color":".theme__dark .settings .premium-info, a.button, button.button, .franz-form .franz-form__radio.is-selected","background":".settings .settings__header, .settings .settings__close, .settings .settings__close:hover, .settings-navigation .settings-navigation__link.is-active, a.button:hover, button.button:hover, .info-bar, .info-bar.info-bar--primary, .infobox.infobox--primary, .theme__dark .badge.badge--primary, .theme__dark .badge.badge--premium, .badge.badge--primary, .badge.badge--premium, .content-tabs .content-tabs__tabs .content-tabs__item.is-active, #electron-app-title-bar .toolbar-dropdown:not(.open) > .toolbar-button > button:hover, #electron-app-title-bar .list-item.selected .menu-item, #electron-app-title-bar .list-item.selected:focus .menu-item, .theme__dark .quick-switch .active, .franz-form .franz-form__toggle-wrapper .franz-form__toggle.is-active .franz-form__toggle-button, .theme__dark .franz-form__button, .theme__dark .franz-form__button:hover, .theme__dark .franz-form__button.franz-form__button--inverted:hover, .franz-form__button, .franz-form__button:hover, .franz-form__button.franz-form__button--inverted:hover","border-right-color":".settings .settings__header .separator"} \ No newline at end of file
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index 49ee24361..1fff5ef7a 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -42,10 +42,10 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
42 forceRepaint: false, 42 forceRepaint: false,
43 targetUrl: '', 43 targetUrl: '',
44 statusBarVisible: false, 44 statusBarVisible: false,
45 hibernate: false,
46 hibernationTimer: null,
47 }; 45 };
48 46
47 hibernationTimer = null;
48
49 autorunDisposer = null; 49 autorunDisposer = null;
50 50
51 forceRepaintTimeout = null; 51 forceRepaintTimeout = null;
@@ -73,15 +73,12 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
73 // Service is inactive - start hibernation countdown 73 // Service is inactive - start hibernation countdown
74 this.startHibernationTimer(); 74 this.startHibernationTimer();
75 } else { 75 } else {
76 if (this.state.hibernationTimer) { 76 if (this.hibernationTimer) {
77 // Service is active but we have an active hibernation timer: Clear timeout 77 // Service is active but we have an active hibernation timer: Clear timeout
78 clearTimeout(this.state.hibernationTimer); 78 clearTimeout(this.hibernationTimer);
79 } 79 }
80 80
81 // Service is active, wake up service from hibernation 81 // Service is active, wake up service from hibernation
82 this.setState({
83 hibernate: false,
84 });
85 this.props.actions.service.setHibernation({ 82 this.props.actions.service.setHibernation({
86 serviceId: this.props.service.id, 83 serviceId: this.props.service.id,
87 hibernating: false, 84 hibernating: false,
@@ -90,16 +87,6 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
90 }, 87 },
91 ); 88 );
92 89
93 // Store hibernation status to state, otherwise the webview won't get unloaded correctly
94 reaction(
95 () => this.props.service.isHibernating,
96 () => {
97 this.setState({
98 hibernate: this.props.service.isHibernating,
99 });
100 },
101 );
102
103 // Start hibernation counter if we are in background 90 // Start hibernation counter if we are in background
104 if (!this.props.service.isActive && this.props.stores.settings.all.app.hibernate) { 91 if (!this.props.service.isActive && this.props.stores.settings.all.app.hibernate) {
105 this.startHibernationTimer(); 92 this.startHibernationTimer();
@@ -126,18 +113,13 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
126 const timerDuration = (Number(this.props.stores.settings.all.app.hibernationStrategy) || 300) * 1000; 113 const timerDuration = (Number(this.props.stores.settings.all.app.hibernationStrategy) || 300) * 1000;
127 114
128 const hibernationTimer = setTimeout(() => { 115 const hibernationTimer = setTimeout(() => {
129 this.setState({
130 hibernate: true,
131 });
132 this.props.actions.service.setHibernation({ 116 this.props.actions.service.setHibernation({
133 serviceId: this.props.service.id, 117 serviceId: this.props.service.id,
134 hibernating: true, 118 hibernating: true,
135 }); 119 });
136 }, timerDuration); 120 }, timerDuration);
137 121
138 this.setState({ 122 this.hibernationTimer = hibernationTimer;
139 hibernationTimer,
140 });
141 } 123 }
142 124
143 render() { 125 render() {
@@ -208,7 +190,7 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
208 </Fragment> 190 </Fragment>
209 ) : ( 191 ) : (
210 <> 192 <>
211 {!this.state.hibernate ? ( 193 {!service.isHibernating ? (
212 <> 194 <>
213 {(service.recipe.id === CUSTOM_WEBSITE_ID || showServiceNavigationBar) && ( 195 {(service.recipe.id === CUSTOM_WEBSITE_ID || showServiceNavigationBar) && (
214 <WebControlsScreen service={service} /> 196 <WebControlsScreen service={service} />
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index e6ebb6afb..652647470 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { observable, reaction } from 'mobx'; 4import { observable, reaction } from 'mobx';
5import ElectronWebView from 'react-electron-web-view'; 5import ElectronWebView from 'react-electron-web-view';
6import path from 'path';
6 7
7import ServiceModel from '../../../models/Service'; 8import ServiceModel from '../../../models/Service';
8 9
@@ -51,6 +52,8 @@ class ServiceWebview extends Component {
51 setWebviewReference, 52 setWebviewReference,
52 } = this.props; 53 } = this.props;
53 54
55 const preloadScript = path.join(__dirname, '../../../', 'webview', 'recipe.js');
56
54 return ( 57 return (
55 <ElectronWebView 58 <ElectronWebView
56 ref={(webview) => { 59 ref={(webview) => {
@@ -61,7 +64,7 @@ class ServiceWebview extends Component {
61 }} 64 }}
62 autosize 65 autosize
63 src={service.url} 66 src={service.url}
64 preload="./webview/recipe.js" 67 preload={preloadScript}
65 partition={`persist:service-${service.id}`} 68 partition={`persist:service-${service.id}`}
66 onDidAttach={() => { 69 onDidAttach={() => {
67 setWebviewReference({ 70 setWebviewReference({
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 2be5c4ed7..d567a47d1 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -12,6 +12,7 @@ import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
12import Input from '../../ui/Input'; 12import Input from '../../ui/Input';
13 13
14import { FRANZ_TRANSLATION } from '../../../config'; 14import { FRANZ_TRANSLATION } from '../../../config';
15import { isMac } from '../../../environment';
15 16
16function escapeHtml(unsafe) { 17function escapeHtml(unsafe) {
17 return unsafe 18 return unsafe
@@ -383,8 +384,10 @@ export default @observer class EditSettingsForm extends Component {
383 <Toggle field={form.$('showDisabledServices')} /> 384 <Toggle field={form.$('showDisabledServices')} />
384 <Toggle field={form.$('showMessageBadgeWhenMuted')} /> 385 <Toggle field={form.$('showMessageBadgeWhenMuted')} />
385 <Toggle field={form.$('darkMode')} /> 386 <Toggle field={form.$('darkMode')} />
387 {isMac && <Toggle field={form.$('adaptableDarkMode')} disabled={isDarkmodeEnabled} />}
386 {isDarkmodeEnabled && ( 388 {isDarkmodeEnabled && (
387 <> 389 <>
390 <Toggle field={form.$('adaptableDarkMode')} />
388 <Toggle field={form.$('universalDarkMode')} /> 391 <Toggle field={form.$('universalDarkMode')} />
389 <p 392 <p
390 className="settings__message" 393 className="settings__message"
diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js
index 7ba8b54d7..f1039709c 100644
--- a/src/components/ui/FeatureList.js
+++ b/src/components/ui/FeatureList.js
@@ -72,7 +72,7 @@ export class FeatureList extends Component {
72 static propTypes = { 72 static propTypes = {
73 className: PropTypes.string, 73 className: PropTypes.string,
74 featureClassName: PropTypes.string, 74 featureClassName: PropTypes.string,
75 plan: PropTypes.oneOf(PLANS), 75 plan: PropTypes.oneOf(Object.values(PLANS)),
76 }; 76 };
77 77
78 static defaultProps = { 78 static defaultProps = {
diff --git a/src/config.js b/src/config.js
index 761d26eea..bd67aee6b 100644
--- a/src/config.js
+++ b/src/config.js
@@ -112,6 +112,19 @@ export const FILE_SYSTEM_SETTINGS_TYPES = [
112]; 112];
113 113
114export const LOCAL_SERVER = 'You are using Ferdi without a server'; 114export const LOCAL_SERVER = 'You are using Ferdi without a server';
115export const SERVER_NOT_LOADED = 'Ferdi::SERVER_NOT_LOADED';
116
117// Set app directory before loading user modules
118if (process.env.FERDI_APPDATA_DIR != null) {
119 app.setPath('appData', process.env.FERDI_APPDATA_DIR);
120 app.setPath('userData', path.join(app.getPath('appData')));
121} else if (process.env.PORTABLE_EXECUTABLE_DIR != null) {
122 app.setPath('appData', process.env.PORTABLE_EXECUTABLE_DIR, `${app.getName()}AppData`);
123 app.setPath('userData', path.join(app.getPath('appData'), `${app.getName()}AppData`));
124} else if (process.platform === 'win32') {
125 app.setPath('appData', process.env.APPDATA);
126 app.setPath('userData', path.join(app.getPath('appData'), app.getName()));
127}
115 128
116export const SETTINGS_PATH = path.join(app.getPath('userData'), 'config'); 129export const SETTINGS_PATH = path.join(app.getPath('userData'), 'config');
117 130
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index ddee82e45..07efbb881 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -98,6 +98,10 @@ const messages = defineMessages({
98 id: 'settings.app.form.darkMode', 98 id: 'settings.app.form.darkMode',
99 defaultMessage: '!!!Dark Mode', 99 defaultMessage: '!!!Dark Mode',
100 }, 100 },
101 adaptableDarkMode: {
102 id: 'settings.app.form.adaptableDarkMode',
103 defaultMessage: '!!!Enable adaptable Dark Mode',
104 },
101 universalDarkMode: { 105 universalDarkMode: {
102 id: 'settings.app.form.universalDarkMode', 106 id: 'settings.app.form.universalDarkMode',
103 defaultMessage: '!!!Enable universal Dark Mode', 107 defaultMessage: '!!!Enable universal Dark Mode',
@@ -180,6 +184,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
180 enableGPUAcceleration: settingsData.enableGPUAcceleration, 184 enableGPUAcceleration: settingsData.enableGPUAcceleration,
181 showDisabledServices: settingsData.showDisabledServices, 185 showDisabledServices: settingsData.showDisabledServices,
182 darkMode: settingsData.darkMode, 186 darkMode: settingsData.darkMode,
187 adaptableDarkMode: settingsData.adaptableDarkMode,
183 universalDarkMode: settingsData.universalDarkMode, 188 universalDarkMode: settingsData.universalDarkMode,
184 accentColor: settingsData.accentColor, 189 accentColor: settingsData.accentColor,
185 showMessageBadgeWhenMuted: settingsData.showMessageBadgeWhenMuted, 190 showMessageBadgeWhenMuted: settingsData.showMessageBadgeWhenMuted,
@@ -350,6 +355,11 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
350 value: settings.all.app.darkMode, 355 value: settings.all.app.darkMode,
351 default: DEFAULT_APP_SETTINGS.darkMode, 356 default: DEFAULT_APP_SETTINGS.darkMode,
352 }, 357 },
358 adaptableDarkMode: {
359 label: intl.formatMessage(messages.adaptableDarkMode),
360 value: settings.all.app.adaptableDarkMode,
361 default: DEFAULT_APP_SETTINGS.adaptableDarkMode,
362 },
353 universalDarkMode: { 363 universalDarkMode: {
354 label: intl.formatMessage(messages.universalDarkMode), 364 label: intl.formatMessage(messages.universalDarkMode),
355 value: settings.all.app.universalDarkMode, 365 value: settings.all.app.universalDarkMode,
diff --git a/src/features/accentColor/index.js b/src/features/accentColor/index.js
index a0f57a2fa..90fbcab43 100644
--- a/src/features/accentColor/index.js
+++ b/src/features/accentColor/index.js
@@ -4,6 +4,15 @@ import { DEFAULT_APP_SETTINGS } from '../../config';
4 4
5const STYLE_ELEMENT_ID = 'accent-color'; 5const STYLE_ELEMENT_ID = 'accent-color';
6 6
7// Additional styles needed to make accent colors work properly
8// "[ACCENT]" will be replaced with the accent color
9const ADDITIONAL_STYLES = `
10.franz-form__button {
11 background: inherit !important;
12 border: 2px solid [ACCENT] !important;
13}
14`;
15
7function createAccentStyleElement() { 16function createAccentStyleElement() {
8 const styles = document.createElement('style'); 17 const styles = document.createElement('style');
9 styles.id = STYLE_ELEMENT_ID; 18 styles.id = STYLE_ELEMENT_ID;
@@ -13,6 +22,7 @@ function createAccentStyleElement() {
13 22
14function setAccentStyle(style) { 23function setAccentStyle(style) {
15 const styleElement = document.getElementById(STYLE_ELEMENT_ID); 24 const styleElement = document.getElementById(STYLE_ELEMENT_ID);
25
16 styleElement.innerHTML = style; 26 styleElement.innerHTML = style;
17} 27}
18 28
@@ -27,6 +37,8 @@ function generateAccentStyle(color) {
27 `; 37 `;
28 }); 38 });
29 39
40 style += ADDITIONAL_STYLES.replace(/\[ACCENT\]/g, color);
41
30 return style; 42 return style;
31} 43}
32 44
diff --git a/src/features/serviceProxy/index.js b/src/features/serviceProxy/index.js
index e9a01b156..e78607667 100644
--- a/src/features/serviceProxy/index.js
+++ b/src/features/serviceProxy/index.js
@@ -22,7 +22,6 @@ export default function init(stores) {
22 config.isIncludedInCurrentPlan = true; 22 config.isIncludedInCurrentPlan = true;
23 23
24 const services = stores.services.enabled; 24 const services = stores.services.enabled;
25 const isPremiumUser = stores.user.data.isPremium;
26 const proxySettings = stores.settings.proxy; 25 const proxySettings = stores.settings.proxy;
27 26
28 debug('Service Proxy autorun'); 27 debug('Service Proxy autorun');
@@ -30,7 +29,7 @@ export default function init(stores) {
30 services.forEach((service) => { 29 services.forEach((service) => {
31 const s = session.fromPartition(`persist:service-${service.id}`); 30 const s = session.fromPartition(`persist:service-${service.id}`);
32 31
33 if (config.isEnabled && (isPremiumUser || !config.isIncludedInCurrentPlan)) { 32 if (config.isEnabled) {
34 const serviceProxyConfig = proxySettings[service.id]; 33 const serviceProxyConfig = proxySettings[service.id];
35 34
36 if (serviceProxyConfig && serviceProxyConfig.isEnabled && serviceProxyConfig.host) { 35 if (serviceProxyConfig && serviceProxyConfig.isEnabled && serviceProxyConfig.host) {
diff --git a/src/i18n/locales/af.json b/src/i18n/locales/af.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/af.json
+++ b/src/i18n/locales/af.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/ar.json
+++ b/src/i18n/locales/ar.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/bs.json b/src/i18n/locales/bs.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/bs.json
+++ b/src/i18n/locales/bs.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index 5f55f804a..f7de90243 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "La memòria cau de Ferdi està utilitzant {size} d'espai al disc", 255 "settings.app.cacheInfo": "La memòria cau de Ferdi està utilitzant {size} d'espai al disc",
256 "settings.app.currentVersion": "Versió actual:", 256 "settings.app.currentVersion": "Versió actual:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Obrir en segon plà", 259 "settings.app.form.autoLaunchInBackground": "Obrir en segon plà",
259 "settings.app.form.autoLaunchOnStart": "Iniciar Ferdi a l'inici", 260 "settings.app.form.autoLaunchOnStart": "Iniciar Ferdi a l'inici",
260 "settings.app.form.beta": "Inclou versions beta", 261 "settings.app.form.beta": "Inclou versions beta",
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index e8d3827dd..7ec1ce369 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi momentálně používá {size} místa na disku.", 255 "settings.app.cacheInfo": "Ferdi momentálně používá {size} místa na disku.",
256 "settings.app.currentVersion": "Aktuální verze:", 256 "settings.app.currentVersion": "Aktuální verze:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Spustit na pozadí", 259 "settings.app.form.autoLaunchInBackground": "Spustit na pozadí",
259 "settings.app.form.autoLaunchOnStart": "Spustit Ferdi při startu", 260 "settings.app.form.autoLaunchOnStart": "Spustit Ferdi při startu",
260 "settings.app.form.beta": "Zahrnout beta verze", 261 "settings.app.form.beta": "Zahrnout beta verze",
diff --git a/src/i18n/locales/da.json b/src/i18n/locales/da.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/da.json
+++ b/src/i18n/locales/da.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 02e9b2a8e..2709f7788 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -9,17 +9,17 @@
9 "feature.delayApp.trial.headline": "Hol dir die kostenlose Ferdi Professional Testlizenz und es geht ohne Warten weiter", 9 "feature.delayApp.trial.headline": "Hol dir die kostenlose Ferdi Professional Testlizenz und es geht ohne Warten weiter",
10 "feature.delayApp.upgrade.action": "Hol dir Ferdi Premium", 10 "feature.delayApp.upgrade.action": "Hol dir Ferdi Premium",
11 "feature.delayApp.upgrade.actionShort": "Account erweitern", 11 "feature.delayApp.upgrade.actionShort": "Account erweitern",
12 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 12 "feature.planSelection.cta.ctaDowngradeFree": "Auf kostenlosen Plan herunterstufen",
13 "feature.planSelection.cta.stayOnFree": "Stay on Free", 13 "feature.planSelection.cta.stayOnFree": "Auf kostenlosem Plan bleiben",
14 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 14 "feature.planSelection.cta.trial": "Starte meine 14-Tage Testversion",
15 "feature.planSelection.cta.upgradePersonal": "Choose Personal", 15 "feature.planSelection.cta.upgradePersonal": "Personal Plan wählen",
16 "feature.planSelection.cta.upgradePro": "Choose Professional", 16 "feature.planSelection.cta.upgradePro": "Professional Plan wählen",
17 "feature.planSelection.free.text": "Basic functionality", 17 "feature.planSelection.free.text": "Einfache Funktionalität",
18 "feature.planSelection.fullFeatureList": "Complete comparison of all plans", 18 "feature.planSelection.fullFeatureList": "Kompletter Vergleich aller Pläne",
19 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 19 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Auf kostenlosen Plan herunterstufen",
20 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal", 20 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Personal Plan wählen",
21 "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 21 "feature.planSelection.fullscreen.dialog.message": "Du bist dabei, auf ein kostenloses Konto herunterzustufen. Bist du sicher? Klicke stattdessen hier, um mehr Dienste und Funktionen für nur {currency}{price} pro Monat zu erhalten.",
22 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 22 "feature.planSelection.fullscreen.dialog.title": "Deinen Ferdi Plan herunterstufen",
23 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.", 23 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
24 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}", 24 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
25 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", 25 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
@@ -41,10 +41,10 @@
41 "feature.todos.premium.upgrade": "Account Upgrade", 41 "feature.todos.premium.upgrade": "Account Upgrade",
42 "feature.trialStatusBar.cta": "Upgrade now", 42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.", 43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Auf kostenlosen Plan herunterstufen",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal", 45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Personal Plan wählen",
46 "feature.trialStatusBar.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 46 "feature.trialStatusBar.fullscreen.dialog.message": "Du bist dabei, auf ein kostenloses Konto herunterzustufen. Bist du sicher? Klicke stattdessen hier, um mehr Dienste und Funktionen für nur {currency}{price} pro Monat zu erhalten.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 47 "feature.trialStatusBar.fullscreen.dialog.title": "Deinen Ferdi Plan herunterstufen",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.", 48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "Verbindung zu den Ferdi Online Services fehlgeschlagen", 49 "global.api.unhealthy": "Verbindung zu den Ferdi Online Services fehlgeschlagen",
50 "global.franzProRequired": "Ferdi Professional benötigt", 50 "global.franzProRequired": "Ferdi Professional benötigt",
@@ -188,11 +188,11 @@
188 "pricing.plan.pro-yearly": "Ferdi Professional jährlich", 188 "pricing.plan.pro-yearly": "Ferdi Professional jährlich",
189 "pricing.trial.cta.accept": "Ja, Upgrade zu Ferdi Professional durchführen", 189 "pricing.trial.cta.accept": "Ja, Upgrade zu Ferdi Professional durchführen",
190 "pricing.trial.cta.skip": "Weiter zu Ferdi", 190 "pricing.trial.cta.skip": "Weiter zu Ferdi",
191 "pricing.trial.cta.start": "Start using Ferdi", 191 "pricing.trial.cta.start": "Ferdi verwenden",
192 "pricing.trial.error": "Tut uns leid, wir konnten deine kostenlose Testlizenz nicht aktivieren!", 192 "pricing.trial.error": "Tut uns leid, wir konnten deine kostenlose Testlizenz nicht aktivieren!",
193 "pricing.trial.features.headline": "Ferdi Professional beinhaltet:", 193 "pricing.trial.features.headline": "Ferdi Professional beinhaltet:",
194 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi", 194 "pricing.trial.headline.pro": "Hi {name}, willkommen bei Ferdi",
195 "pricing.trial.intro.happyMessaging": "Happy messaging,", 195 "pricing.trial.intro.happyMessaging": "Viel Spaß beim Nachrichten schreiben",
196 "pricing.trial.intro.specialTreat": "We have a special treat for you.", 196 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
197 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.", 197 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
198 "pricing.trial.terms.automaticTrialEnd": "Deine kostenlose Testlizenz endet automatisch nach 14 Tagen", 198 "pricing.trial.terms.automaticTrialEnd": "Deine kostenlose Testlizenz endet automatisch nach 14 Tagen",
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Der Ferdi Cache belegt derzeit {size}.", 255 "settings.app.cacheInfo": "Der Ferdi Cache belegt derzeit {size}.",
256 "settings.app.currentVersion": "Aktuelle Version:", 256 "settings.app.currentVersion": "Aktuelle Version:",
257 "settings.app.form.accentColor": "Akzentfarbe", 257 "settings.app.form.accentColor": "Akzentfarbe",
258 "settings.app.form.adaptableDarkMode": "Angepassten DarkMode aktivieren",
258 "settings.app.form.autoLaunchInBackground": "Im Hintergrund öffnen", 259 "settings.app.form.autoLaunchInBackground": "Im Hintergrund öffnen",
259 "settings.app.form.autoLaunchOnStart": "Ferdi beim Systemstart ausführen", 260 "settings.app.form.autoLaunchOnStart": "Ferdi beim Systemstart ausführen",
260 "settings.app.form.beta": "Beta-Versionen einbeziehen", 261 "settings.app.form.beta": "Beta-Versionen einbeziehen",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index bb65ccdf2..10092cd9e 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -2608,377 +2608,377 @@
2608 "defaultMessage": "!!!Settings", 2608 "defaultMessage": "!!!Settings",
2609 "end": { 2609 "end": {
2610 "column": 3, 2610 "column": 3,
2611 "line": 29 2611 "line": 30
2612 }, 2612 },
2613 "file": "src/components/settings/settings/EditSettingsForm.js", 2613 "file": "src/components/settings/settings/EditSettingsForm.js",
2614 "id": "settings.app.headline", 2614 "id": "settings.app.headline",
2615 "start": { 2615 "start": {
2616 "column": 12, 2616 "column": 12,
2617 "line": 26 2617 "line": 27
2618 } 2618 }
2619 }, 2619 },
2620 { 2620 {
2621 "defaultMessage": "!!!General", 2621 "defaultMessage": "!!!General",
2622 "end": { 2622 "end": {
2623 "column": 3, 2623 "column": 3,
2624 "line": 33 2624 "line": 34
2625 }, 2625 },
2626 "file": "src/components/settings/settings/EditSettingsForm.js", 2626 "file": "src/components/settings/settings/EditSettingsForm.js",
2627 "id": "settings.app.headlineGeneral", 2627 "id": "settings.app.headlineGeneral",
2628 "start": { 2628 "start": {
2629 "column": 19, 2629 "column": 19,
2630 "line": 30 2630 "line": 31
2631 } 2631 }
2632 }, 2632 },
2633 { 2633 {
2634 "defaultMessage": "!!!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.", 2634 "defaultMessage": "!!!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.",
2635 "end": { 2635 "end": {
2636 "column": 3, 2636 "column": 3,
2637 "line": 37 2637 "line": 38
2638 }, 2638 },
2639 "file": "src/components/settings/settings/EditSettingsForm.js", 2639 "file": "src/components/settings/settings/EditSettingsForm.js",
2640 "id": "settings.app.hibernateInfo", 2640 "id": "settings.app.hibernateInfo",
2641 "start": { 2641 "start": {
2642 "column": 17, 2642 "column": 17,
2643 "line": 34 2643 "line": 35
2644 } 2644 }
2645 }, 2645 },
2646 { 2646 {
2647 "defaultMessage": "!!!We advice you to logout after changing your server as your settings might not be saved otherwise.", 2647 "defaultMessage": "!!!We advice you to logout after changing your server as your settings might not be saved otherwise.",
2648 "end": { 2648 "end": {
2649 "column": 3, 2649 "column": 3,
2650 "line": 41 2650 "line": 42
2651 }, 2651 },
2652 "file": "src/components/settings/settings/EditSettingsForm.js", 2652 "file": "src/components/settings/settings/EditSettingsForm.js",
2653 "id": "settings.app.serverInfo", 2653 "id": "settings.app.serverInfo",
2654 "start": { 2654 "start": {
2655 "column": 14, 2655 "column": 14,
2656 "line": 38 2656 "line": 39
2657 } 2657 }
2658 }, 2658 },
2659 { 2659 {
2660 "defaultMessage": "!!!You are using the official Franz Server for Ferdi.\nWe know that Ferdi allows you to use all its features for free but you are still using Franz's server resources - which Franz's creator has to pay for.\nPlease still consider [Link 1]paying for a Franz account[/Link] or [Link 2]using a self-hosted ferdi-server[/Link] (if you have the knowledge and resources to do so). \nBy using Ferdi, you still profit greatly from Franz's recipe store, server resources and its development.", 2660 "defaultMessage": "!!!You are using the official Franz Server for Ferdi.\nWe know that Ferdi allows you to use all its features for free but you are still using Franz's server resources - which Franz's creator has to pay for.\nPlease still consider [Link 1]paying for a Franz account[/Link] or [Link 2]using a self-hosted ferdi-server[/Link] (if you have the knowledge and resources to do so). \nBy using Ferdi, you still profit greatly from Franz's recipe store, server resources and its development.",
2661 "end": { 2661 "end": {
2662 "column": 3, 2662 "column": 3,
2663 "line": 45 2663 "line": 46
2664 }, 2664 },
2665 "file": "src/components/settings/settings/EditSettingsForm.js", 2665 "file": "src/components/settings/settings/EditSettingsForm.js",
2666 "id": "settings.app.serverMoneyInfo", 2666 "id": "settings.app.serverMoneyInfo",
2667 "start": { 2667 "start": {
2668 "column": 19, 2668 "column": 19,
2669 "line": 42 2669 "line": 43
2670 } 2670 }
2671 }, 2671 },
2672 { 2672 {
2673 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 2673 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
2674 "end": { 2674 "end": {
2675 "column": 3, 2675 "column": 3,
2676 "line": 49 2676 "line": 50
2677 }, 2677 },
2678 "file": "src/components/settings/settings/EditSettingsForm.js", 2678 "file": "src/components/settings/settings/EditSettingsForm.js",
2679 "id": "settings.app.todoServerInfo", 2679 "id": "settings.app.todoServerInfo",
2680 "start": { 2680 "start": {
2681 "column": 18, 2681 "column": 18,
2682 "line": 46 2682 "line": 47
2683 } 2683 }
2684 }, 2684 },
2685 { 2685 {
2686 "defaultMessage": "!!!Ferdi Lock Password", 2686 "defaultMessage": "!!!Ferdi Lock Password",
2687 "end": { 2687 "end": {
2688 "column": 3, 2688 "column": 3,
2689 "line": 53 2689 "line": 54
2690 }, 2690 },
2691 "file": "src/components/settings/settings/EditSettingsForm.js", 2691 "file": "src/components/settings/settings/EditSettingsForm.js",
2692 "id": "settings.app.lockedPassword", 2692 "id": "settings.app.lockedPassword",
2693 "start": { 2693 "start": {
2694 "column": 18, 2694 "column": 18,
2695 "line": 50 2695 "line": 51
2696 } 2696 }
2697 }, 2697 },
2698 { 2698 {
2699 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 2699 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
2700 "end": { 2700 "end": {
2701 "column": 3, 2701 "column": 3,
2702 "line": 57 2702 "line": 58
2703 }, 2703 },
2704 "file": "src/components/settings/settings/EditSettingsForm.js", 2704 "file": "src/components/settings/settings/EditSettingsForm.js",
2705 "id": "settings.app.lockedPasswordInfo", 2705 "id": "settings.app.lockedPasswordInfo",
2706 "start": { 2706 "start": {
2707 "column": 22, 2707 "column": 22,
2708 "line": 54 2708 "line": 55
2709 } 2709 }
2710 }, 2710 },
2711 { 2711 {
2712 "defaultMessage": "!!!Ferdi password lock allows you to keep your messages protected.\nUsing Ferdi 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.", 2712 "defaultMessage": "!!!Ferdi password lock allows you to keep your messages protected.\nUsing Ferdi 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.",
2713 "end": { 2713 "end": {
2714 "column": 3, 2714 "column": 3,
2715 "line": 61 2715 "line": 62
2716 }, 2716 },
2717 "file": "src/components/settings/settings/EditSettingsForm.js", 2717 "file": "src/components/settings/settings/EditSettingsForm.js",
2718 "id": "settings.app.lockInfo", 2718 "id": "settings.app.lockInfo",
2719 "start": { 2719 "start": {
2720 "column": 12, 2720 "column": 12,
2721 "line": 58 2721 "line": 59
2722 } 2722 }
2723 }, 2723 },
2724 { 2724 {
2725 "defaultMessage": "!!!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.", 2725 "defaultMessage": "!!!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.",
2726 "end": { 2726 "end": {
2727 "column": 3, 2727 "column": 3,
2728 "line": 65 2728 "line": 66
2729 }, 2729 },
2730 "file": "src/components/settings/settings/EditSettingsForm.js", 2730 "file": "src/components/settings/settings/EditSettingsForm.js",
2731 "id": "settings.app.scheduledDNDTimeInfo", 2731 "id": "settings.app.scheduledDNDTimeInfo",
2732 "start": { 2732 "start": {
2733 "column": 24, 2733 "column": 24,
2734 "line": 62 2734 "line": 63
2735 } 2735 }
2736 }, 2736 },
2737 { 2737 {
2738 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 2738 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
2739 "end": { 2739 "end": {
2740 "column": 3, 2740 "column": 3,
2741 "line": 69 2741 "line": 70
2742 }, 2742 },
2743 "file": "src/components/settings/settings/EditSettingsForm.js", 2743 "file": "src/components/settings/settings/EditSettingsForm.js",
2744 "id": "settings.app.scheduledDNDInfo", 2744 "id": "settings.app.scheduledDNDInfo",
2745 "start": { 2745 "start": {
2746 "column": 20, 2746 "column": 20,
2747 "line": 66 2747 "line": 67
2748 } 2748 }
2749 }, 2749 },
2750 { 2750 {
2751 "defaultMessage": "!!!Language", 2751 "defaultMessage": "!!!Language",
2752 "end": { 2752 "end": {
2753 "column": 3, 2753 "column": 3,
2754 "line": 73 2754 "line": 74
2755 }, 2755 },
2756 "file": "src/components/settings/settings/EditSettingsForm.js", 2756 "file": "src/components/settings/settings/EditSettingsForm.js",
2757 "id": "settings.app.headlineLanguage", 2757 "id": "settings.app.headlineLanguage",
2758 "start": { 2758 "start": {
2759 "column": 20, 2759 "column": 20,
2760 "line": 70 2760 "line": 71
2761 } 2761 }
2762 }, 2762 },
2763 { 2763 {
2764 "defaultMessage": "!!!Updates", 2764 "defaultMessage": "!!!Updates",
2765 "end": { 2765 "end": {
2766 "column": 3, 2766 "column": 3,
2767 "line": 77 2767 "line": 78
2768 }, 2768 },
2769 "file": "src/components/settings/settings/EditSettingsForm.js", 2769 "file": "src/components/settings/settings/EditSettingsForm.js",
2770 "id": "settings.app.headlineUpdates", 2770 "id": "settings.app.headlineUpdates",
2771 "start": { 2771 "start": {
2772 "column": 19, 2772 "column": 19,
2773 "line": 74 2773 "line": 75
2774 } 2774 }
2775 }, 2775 },
2776 { 2776 {
2777 "defaultMessage": "!!!Appearance", 2777 "defaultMessage": "!!!Appearance",
2778 "end": { 2778 "end": {
2779 "column": 3, 2779 "column": 3,
2780 "line": 81 2780 "line": 82
2781 }, 2781 },
2782 "file": "src/components/settings/settings/EditSettingsForm.js", 2782 "file": "src/components/settings/settings/EditSettingsForm.js",
2783 "id": "settings.app.headlineAppearance", 2783 "id": "settings.app.headlineAppearance",
2784 "start": { 2784 "start": {
2785 "column": 22, 2785 "column": 22,
2786 "line": 78 2786 "line": 79
2787 } 2787 }
2788 }, 2788 },
2789 { 2789 {
2790 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 2790 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
2791 "end": { 2791 "end": {
2792 "column": 3, 2792 "column": 3,
2793 "line": 85 2793 "line": 86
2794 }, 2794 },
2795 "file": "src/components/settings/settings/EditSettingsForm.js", 2795 "file": "src/components/settings/settings/EditSettingsForm.js",
2796 "id": "settings.app.universalDarkModeInfo", 2796 "id": "settings.app.universalDarkModeInfo",
2797 "start": { 2797 "start": {
2798 "column": 25, 2798 "column": 25,
2799 "line": 82 2799 "line": 83
2800 } 2800 }
2801 }, 2801 },
2802 { 2802 {
2803 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)", 2803 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)",
2804 "end": { 2804 "end": {
2805 "column": 3, 2805 "column": 3,
2806 "line": 89 2806 "line": 90
2807 }, 2807 },
2808 "file": "src/components/settings/settings/EditSettingsForm.js", 2808 "file": "src/components/settings/settings/EditSettingsForm.js",
2809 "id": "settings.app.accentColorInfo", 2809 "id": "settings.app.accentColorInfo",
2810 "start": { 2810 "start": {
2811 "column": 19, 2811 "column": 19,
2812 "line": 86 2812 "line": 87
2813 } 2813 }
2814 }, 2814 },
2815 { 2815 {
2816 "defaultMessage": "!!!Advanced", 2816 "defaultMessage": "!!!Advanced",
2817 "end": { 2817 "end": {
2818 "column": 3, 2818 "column": 3,
2819 "line": 93 2819 "line": 94
2820 }, 2820 },
2821 "file": "src/components/settings/settings/EditSettingsForm.js", 2821 "file": "src/components/settings/settings/EditSettingsForm.js",
2822 "id": "settings.app.headlineAdvanced", 2822 "id": "settings.app.headlineAdvanced",
2823 "start": { 2823 "start": {
2824 "column": 20, 2824 "column": 20,
2825 "line": 90 2825 "line": 91
2826 } 2826 }
2827 }, 2827 },
2828 { 2828 {
2829 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 2829 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
2830 "end": { 2830 "end": {
2831 "column": 3, 2831 "column": 3,
2832 "line": 97 2832 "line": 98
2833 }, 2833 },
2834 "file": "src/components/settings/settings/EditSettingsForm.js", 2834 "file": "src/components/settings/settings/EditSettingsForm.js",
2835 "id": "settings.app.translationHelp", 2835 "id": "settings.app.translationHelp",
2836 "start": { 2836 "start": {
2837 "column": 19, 2837 "column": 19,
2838 "line": 94 2838 "line": 95
2839 } 2839 }
2840 }, 2840 },
2841 { 2841 {
2842 "defaultMessage": "!!!Cache", 2842 "defaultMessage": "!!!Cache",
2843 "end": { 2843 "end": {
2844 "column": 3, 2844 "column": 3,
2845 "line": 101 2845 "line": 102
2846 }, 2846 },
2847 "file": "src/components/settings/settings/EditSettingsForm.js", 2847 "file": "src/components/settings/settings/EditSettingsForm.js",
2848 "id": "settings.app.subheadlineCache", 2848 "id": "settings.app.subheadlineCache",
2849 "start": { 2849 "start": {
2850 "column": 20, 2850 "column": 20,
2851 "line": 98 2851 "line": 99
2852 } 2852 }
2853 }, 2853 },
2854 { 2854 {
2855 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 2855 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
2856 "end": { 2856 "end": {
2857 "column": 3, 2857 "column": 3,
2858 "line": 105 2858 "line": 106
2859 }, 2859 },
2860 "file": "src/components/settings/settings/EditSettingsForm.js", 2860 "file": "src/components/settings/settings/EditSettingsForm.js",
2861 "id": "settings.app.cacheInfo", 2861 "id": "settings.app.cacheInfo",
2862 "start": { 2862 "start": {
2863 "column": 13, 2863 "column": 13,
2864 "line": 102 2864 "line": 103
2865 } 2865 }
2866 }, 2866 },
2867 { 2867 {
2868 "defaultMessage": "!!!Clear cache", 2868 "defaultMessage": "!!!Clear cache",
2869 "end": { 2869 "end": {
2870 "column": 3, 2870 "column": 3,
2871 "line": 109 2871 "line": 110
2872 }, 2872 },
2873 "file": "src/components/settings/settings/EditSettingsForm.js", 2873 "file": "src/components/settings/settings/EditSettingsForm.js",
2874 "id": "settings.app.buttonClearAllCache", 2874 "id": "settings.app.buttonClearAllCache",
2875 "start": { 2875 "start": {
2876 "column": 23, 2876 "column": 23,
2877 "line": 106 2877 "line": 107
2878 } 2878 }
2879 }, 2879 },
2880 { 2880 {
2881 "defaultMessage": "!!!Check for updates", 2881 "defaultMessage": "!!!Check for updates",
2882 "end": { 2882 "end": {
2883 "column": 3, 2883 "column": 3,
2884 "line": 113 2884 "line": 114
2885 }, 2885 },
2886 "file": "src/components/settings/settings/EditSettingsForm.js", 2886 "file": "src/components/settings/settings/EditSettingsForm.js",
2887 "id": "settings.app.buttonSearchForUpdate", 2887 "id": "settings.app.buttonSearchForUpdate",
2888 "start": { 2888 "start": {
2889 "column": 25, 2889 "column": 25,
2890 "line": 110 2890 "line": 111
2891 } 2891 }
2892 }, 2892 },
2893 { 2893 {
2894 "defaultMessage": "!!!Restart & install update", 2894 "defaultMessage": "!!!Restart & install update",
2895 "end": { 2895 "end": {
2896 "column": 3, 2896 "column": 3,
2897 "line": 117 2897 "line": 118
2898 }, 2898 },
2899 "file": "src/components/settings/settings/EditSettingsForm.js", 2899 "file": "src/components/settings/settings/EditSettingsForm.js",
2900 "id": "settings.app.buttonInstallUpdate", 2900 "id": "settings.app.buttonInstallUpdate",
2901 "start": { 2901 "start": {
2902 "column": 23, 2902 "column": 23,
2903 "line": 114 2903 "line": 115
2904 } 2904 }
2905 }, 2905 },
2906 { 2906 {
2907 "defaultMessage": "!!!Is searching for update", 2907 "defaultMessage": "!!!Is searching for update",
2908 "end": { 2908 "end": {
2909 "column": 3, 2909 "column": 3,
2910 "line": 121 2910 "line": 122
2911 }, 2911 },
2912 "file": "src/components/settings/settings/EditSettingsForm.js", 2912 "file": "src/components/settings/settings/EditSettingsForm.js",
2913 "id": "settings.app.updateStatusSearching", 2913 "id": "settings.app.updateStatusSearching",
2914 "start": { 2914 "start": {
2915 "column": 25, 2915 "column": 25,
2916 "line": 118 2916 "line": 119
2917 } 2917 }
2918 }, 2918 },
2919 { 2919 {
2920 "defaultMessage": "!!!Update available, downloading...", 2920 "defaultMessage": "!!!Update available, downloading...",
2921 "end": { 2921 "end": {
2922 "column": 3, 2922 "column": 3,
2923 "line": 125 2923 "line": 126
2924 }, 2924 },
2925 "file": "src/components/settings/settings/EditSettingsForm.js", 2925 "file": "src/components/settings/settings/EditSettingsForm.js",
2926 "id": "settings.app.updateStatusAvailable", 2926 "id": "settings.app.updateStatusAvailable",
2927 "start": { 2927 "start": {
2928 "column": 25, 2928 "column": 25,
2929 "line": 122 2929 "line": 123
2930 } 2930 }
2931 }, 2931 },
2932 { 2932 {
2933 "defaultMessage": "!!!You are using the latest version of Ferdi", 2933 "defaultMessage": "!!!You are using the latest version of Ferdi",
2934 "end": { 2934 "end": {
2935 "column": 3, 2935 "column": 3,
2936 "line": 129 2936 "line": 130
2937 }, 2937 },
2938 "file": "src/components/settings/settings/EditSettingsForm.js", 2938 "file": "src/components/settings/settings/EditSettingsForm.js",
2939 "id": "settings.app.updateStatusUpToDate", 2939 "id": "settings.app.updateStatusUpToDate",
2940 "start": { 2940 "start": {
2941 "column": 24, 2941 "column": 24,
2942 "line": 126 2942 "line": 127
2943 } 2943 }
2944 }, 2944 },
2945 { 2945 {
2946 "defaultMessage": "!!!Current version:", 2946 "defaultMessage": "!!!Current version:",
2947 "end": { 2947 "end": {
2948 "column": 3, 2948 "column": 3,
2949 "line": 133 2949 "line": 134
2950 }, 2950 },
2951 "file": "src/components/settings/settings/EditSettingsForm.js", 2951 "file": "src/components/settings/settings/EditSettingsForm.js",
2952 "id": "settings.app.currentVersion", 2952 "id": "settings.app.currentVersion",
2953 "start": { 2953 "start": {
2954 "column": 18, 2954 "column": 18,
2955 "line": 130 2955 "line": 131
2956 } 2956 }
2957 }, 2957 },
2958 { 2958 {
2959 "defaultMessage": "!!!Changes require restart", 2959 "defaultMessage": "!!!Changes require restart",
2960 "end": { 2960 "end": {
2961 "column": 3, 2961 "column": 3,
2962 "line": 137 2962 "line": 138
2963 }, 2963 },
2964 "file": "src/components/settings/settings/EditSettingsForm.js", 2964 "file": "src/components/settings/settings/EditSettingsForm.js",
2965 "id": "settings.app.restartRequired", 2965 "id": "settings.app.restartRequired",
2966 "start": { 2966 "start": {
2967 "column": 29, 2967 "column": 29,
2968 "line": 134 2968 "line": 135
2969 } 2969 }
2970 }, 2970 },
2971 { 2971 {
2972 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 2972 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
2973 "end": { 2973 "end": {
2974 "column": 3, 2974 "column": 3,
2975 "line": 141 2975 "line": 142
2976 }, 2976 },
2977 "file": "src/components/settings/settings/EditSettingsForm.js", 2977 "file": "src/components/settings/settings/EditSettingsForm.js",
2978 "id": "settings.app.languageDisclaimer", 2978 "id": "settings.app.languageDisclaimer",
2979 "start": { 2979 "start": {
2980 "column": 22, 2980 "column": 22,
2981 "line": 138 2981 "line": 139
2982 } 2982 }
2983 } 2983 }
2984 ], 2984 ],
@@ -4266,133 +4266,146 @@
4266 } 4266 }
4267 }, 4267 },
4268 { 4268 {
4269 "defaultMessage": "!!!Enable universal Dark Mode", 4269 "defaultMessage": "!!!Enable adaptable Dark Mode",
4270 "end": { 4270 "end": {
4271 "column": 3, 4271 "column": 3,
4272 "line": 104 4272 "line": 104
4273 }, 4273 },
4274 "file": "src/containers/settings/EditSettingsScreen.js", 4274 "file": "src/containers/settings/EditSettingsScreen.js",
4275 "id": "settings.app.form.universalDarkMode", 4275 "id": "settings.app.form.adaptableDarkMode",
4276 "start": { 4276 "start": {
4277 "column": 21, 4277 "column": 21,
4278 "line": 101 4278 "line": 101
4279 } 4279 }
4280 }, 4280 },
4281 { 4281 {
4282 "defaultMessage": "!!!Accent color", 4282 "defaultMessage": "!!!Enable universal Dark Mode",
4283 "end": { 4283 "end": {
4284 "column": 3, 4284 "column": 3,
4285 "line": 108 4285 "line": 108
4286 }, 4286 },
4287 "file": "src/containers/settings/EditSettingsScreen.js", 4287 "file": "src/containers/settings/EditSettingsScreen.js",
4288 "id": "settings.app.form.universalDarkMode",
4289 "start": {
4290 "column": 21,
4291 "line": 105
4292 }
4293 },
4294 {
4295 "defaultMessage": "!!!Accent color",
4296 "end": {
4297 "column": 3,
4298 "line": 112
4299 },
4300 "file": "src/containers/settings/EditSettingsScreen.js",
4288 "id": "settings.app.form.accentColor", 4301 "id": "settings.app.form.accentColor",
4289 "start": { 4302 "start": {
4290 "column": 15, 4303 "column": 15,
4291 "line": 105 4304 "line": 109
4292 } 4305 }
4293 }, 4306 },
4294 { 4307 {
4295 "defaultMessage": "!!!Display disabled services tabs", 4308 "defaultMessage": "!!!Display disabled services tabs",
4296 "end": { 4309 "end": {
4297 "column": 3, 4310 "column": 3,
4298 "line": 112 4311 "line": 116
4299 }, 4312 },
4300 "file": "src/containers/settings/EditSettingsScreen.js", 4313 "file": "src/containers/settings/EditSettingsScreen.js",
4301 "id": "settings.app.form.showDisabledServices", 4314 "id": "settings.app.form.showDisabledServices",
4302 "start": { 4315 "start": {
4303 "column": 24, 4316 "column": 24,
4304 "line": 109 4317 "line": 113
4305 } 4318 }
4306 }, 4319 },
4307 { 4320 {
4308 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 4321 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
4309 "end": { 4322 "end": {
4310 "column": 3, 4323 "column": 3,
4311 "line": 116 4324 "line": 120
4312 }, 4325 },
4313 "file": "src/containers/settings/EditSettingsScreen.js", 4326 "file": "src/containers/settings/EditSettingsScreen.js",
4314 "id": "settings.app.form.showMessagesBadgesWhenMuted", 4327 "id": "settings.app.form.showMessagesBadgesWhenMuted",
4315 "start": { 4328 "start": {
4316 "column": 29, 4329 "column": 29,
4317 "line": 113 4330 "line": 117
4318 } 4331 }
4319 }, 4332 },
4320 { 4333 {
4321 "defaultMessage": "!!!Enable spell checking", 4334 "defaultMessage": "!!!Enable spell checking",
4322 "end": { 4335 "end": {
4323 "column": 3, 4336 "column": 3,
4324 "line": 120 4337 "line": 124
4325 }, 4338 },
4326 "file": "src/containers/settings/EditSettingsScreen.js", 4339 "file": "src/containers/settings/EditSettingsScreen.js",
4327 "id": "settings.app.form.enableSpellchecking", 4340 "id": "settings.app.form.enableSpellchecking",
4328 "start": { 4341 "start": {
4329 "column": 23, 4342 "column": 23,
4330 "line": 117 4343 "line": 121
4331 } 4344 }
4332 }, 4345 },
4333 { 4346 {
4334 "defaultMessage": "!!!Enable GPU Acceleration", 4347 "defaultMessage": "!!!Enable GPU Acceleration",
4335 "end": { 4348 "end": {
4336 "column": 3, 4349 "column": 3,
4337 "line": 124 4350 "line": 128
4338 }, 4351 },
4339 "file": "src/containers/settings/EditSettingsScreen.js", 4352 "file": "src/containers/settings/EditSettingsScreen.js",
4340 "id": "settings.app.form.enableGPUAcceleration", 4353 "id": "settings.app.form.enableGPUAcceleration",
4341 "start": { 4354 "start": {
4342 "column": 25, 4355 "column": 25,
4343 "line": 121 4356 "line": 125
4344 } 4357 }
4345 }, 4358 },
4346 { 4359 {
4347 "defaultMessage": "!!!Include beta versions", 4360 "defaultMessage": "!!!Include beta versions",
4348 "end": { 4361 "end": {
4349 "column": 3, 4362 "column": 3,
4350 "line": 128 4363 "line": 132
4351 }, 4364 },
4352 "file": "src/containers/settings/EditSettingsScreen.js", 4365 "file": "src/containers/settings/EditSettingsScreen.js",
4353 "id": "settings.app.form.beta", 4366 "id": "settings.app.form.beta",
4354 "start": { 4367 "start": {
4355 "column": 8, 4368 "column": 8,
4356 "line": 125 4369 "line": 129
4357 } 4370 }
4358 }, 4371 },
4359 { 4372 {
4360 "defaultMessage": "!!!Disable updates", 4373 "defaultMessage": "!!!Disable updates",
4361 "end": { 4374 "end": {
4362 "column": 3, 4375 "column": 3,
4363 "line": 132 4376 "line": 136
4364 }, 4377 },
4365 "file": "src/containers/settings/EditSettingsScreen.js", 4378 "file": "src/containers/settings/EditSettingsScreen.js",
4366 "id": "settings.app.form.noUpdates", 4379 "id": "settings.app.form.noUpdates",
4367 "start": { 4380 "start": {
4368 "column": 13, 4381 "column": 13,
4369 "line": 129 4382 "line": 133
4370 } 4383 }
4371 }, 4384 },
4372 { 4385 {
4373 "defaultMessage": "!!!Enable Franz Todos", 4386 "defaultMessage": "!!!Enable Franz Todos",
4374 "end": { 4387 "end": {
4375 "column": 3, 4388 "column": 3,
4376 "line": 136 4389 "line": 140
4377 }, 4390 },
4378 "file": "src/containers/settings/EditSettingsScreen.js", 4391 "file": "src/containers/settings/EditSettingsScreen.js",
4379 "id": "settings.app.form.enableTodos", 4392 "id": "settings.app.form.enableTodos",
4380 "start": { 4393 "start": {
4381 "column": 15, 4394 "column": 15,
4382 "line": 133 4395 "line": 137
4383 } 4396 }
4384 }, 4397 },
4385 { 4398 {
4386 "defaultMessage": "!!!Keep all workspaces loaded", 4399 "defaultMessage": "!!!Keep all workspaces loaded",
4387 "end": { 4400 "end": {
4388 "column": 3, 4401 "column": 3,
4389 "line": 140 4402 "line": 144
4390 }, 4403 },
4391 "file": "src/containers/settings/EditSettingsScreen.js", 4404 "file": "src/containers/settings/EditSettingsScreen.js",
4392 "id": "settings.app.form.keepAllWorkspacesLoaded", 4405 "id": "settings.app.form.keepAllWorkspacesLoaded",
4393 "start": { 4406 "start": {
4394 "column": 27, 4407 "column": 27,
4395 "line": 137 4408 "line": 141
4396 } 4409 }
4397 } 4410 }
4398 ], 4411 ],
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index 89c0d62b6..c383a18fb 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Το Ferdi χÏησιμοποιεί αυτήν τη στιγμή {size} χώÏου στο δίσκο.", 255 "settings.app.cacheInfo": "Το Ferdi χÏησιμοποιεί αυτήν τη στιγμή {size} χώÏου στο δίσκο.",
256 "settings.app.currentVersion": "ΤÏέχουσα έκδοση:", 256 "settings.app.currentVersion": "ΤÏέχουσα έκδοση:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Άνοιγμα στο παÏασκήνιο", 259 "settings.app.form.autoLaunchInBackground": "Άνοιγμα στο παÏασκήνιο",
259 "settings.app.form.autoLaunchOnStart": "Εκκίνηση του Ferdi κατά την εκκίνηση του συστήματος", 260 "settings.app.form.autoLaunchOnStart": "Εκκίνηση του Ferdi κατά την εκκίνηση του συστήματος",
260 "settings.app.form.beta": "ΣυμπεÏιλάβετε εκδόσεις beta", 261 "settings.app.form.beta": "ΣυμπεÏιλάβετε εκδόσεις beta",
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index a34da1848..b7d81356e 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index e3aad888f..462d74d39 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "El cache de Ferdi actualmente usa {size} de espacio en disco.", 255 "settings.app.cacheInfo": "El cache de Ferdi actualmente usa {size} de espacio en disco.",
256 "settings.app.currentVersion": "Versión actual:", 256 "settings.app.currentVersion": "Versión actual:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Abrir en segundo plano", 259 "settings.app.form.autoLaunchInBackground": "Abrir en segundo plano",
259 "settings.app.form.autoLaunchOnStart": "Iniciar Ferdi al iniciar", 260 "settings.app.form.autoLaunchOnStart": "Iniciar Ferdi al iniciar",
260 "settings.app.form.beta": "Incluir versiones beta", 261 "settings.app.form.beta": "Incluir versiones beta",
diff --git a/src/i18n/locales/fi.json b/src/i18n/locales/fi.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/fi.json
+++ b/src/i18n/locales/fi.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 1ae8d6164..2edf358f5 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -9,22 +9,22 @@
9 "feature.delayApp.trial.headline": "Prendre l'essai gratuit de 14 jours de Ferdi Professionnel et esquiver la ligne", 9 "feature.delayApp.trial.headline": "Prendre l'essai gratuit de 14 jours de Ferdi Professionnel et esquiver la ligne",
10 "feature.delayApp.upgrade.action": "Acheter une license Ferdi", 10 "feature.delayApp.upgrade.action": "Acheter une license Ferdi",
11 "feature.delayApp.upgrade.actionShort": "Augmenter le niveau de mon compte", 11 "feature.delayApp.upgrade.actionShort": "Augmenter le niveau de mon compte",
12 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 12 "feature.planSelection.cta.ctaDowngradeFree": "Rétrograder à la version gratuite",
13 "feature.planSelection.cta.stayOnFree": "Stay on Free", 13 "feature.planSelection.cta.stayOnFree": "Rester en version gratuite",
14 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 14 "feature.planSelection.cta.trial": "Commencez mon essai gratuit de 14 jours",
15 "feature.planSelection.cta.upgradePersonal": "Choose Personal", 15 "feature.planSelection.cta.upgradePersonal": "Choisir Personnel",
16 "feature.planSelection.cta.upgradePro": "Choose Professional", 16 "feature.planSelection.cta.upgradePro": "Choisir Professionnel",
17 "feature.planSelection.free.text": "Basic functionality", 17 "feature.planSelection.free.text": "Fonctionnalité basique",
18 "feature.planSelection.fullFeatureList": "Complete comparison of all plans", 18 "feature.planSelection.fullFeatureList": "Comparaison complète de tous les plans",
19 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 19 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Rétrograder à la version gratuite",
20 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal", 20 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choisir Personnel",
21 "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 21 "feature.planSelection.fullscreen.dialog.message": "Vous êtes sur le point de rétrograder vers notre compte gratuit. Êtes-vous sûr ? Cliquez ici pour obtenir plus de services et de fonctionnalités pour seulement {currency}{price} par mois.",
22 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 22 "feature.planSelection.fullscreen.dialog.title": "Rétrograder votre plan Ferdi",
23 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.", 23 "feature.planSelection.fullscreen.subheadline": "Il est temps de faire un choix. Ferdi fonctionne mieux sur nos plans Personnels et Professionnels. Veuillez consulter et choisir le meilleur pour vous.",
24 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}", 24 "feature.planSelection.fullscreen.welcome": "Êtes-vous prêt à choisir, {name}",
25 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", 25 "feature.planSelection.personal.text": "Plus de services, pas d'attente - idéal pour un usage personnel.",
26 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment", 26 "feature.planSelection.pricesBasedOnAnnualPayment": "Tous les prix basés sur un paiement annuel",
27 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", 27 "feature.planSelection.pro.text": "Des services illimités et des fonctionnalités professionnelles pour vous - et votre équipe.",
28 "feature.quickSwitch.info": "Sélectionner un service avec TAB, ↑ et ↓. Ouvrir un service avec ENTER.", 28 "feature.quickSwitch.info": "Sélectionner un service avec TAB, ↑ et ↓. Ouvrir un service avec ENTER.",
29 "feature.quickSwitch.search": "Rechercher...", 29 "feature.quickSwitch.search": "Rechercher...",
30 "feature.quickSwitch.title": "Changement rapide", 30 "feature.quickSwitch.title": "Changement rapide",
@@ -39,13 +39,13 @@
39 "feature.todos.premium.info": "Ferdi Todos est disponible aux utilisateurs premium maintenant!", 39 "feature.todos.premium.info": "Ferdi Todos est disponible aux utilisateurs premium maintenant!",
40 "feature.todos.premium.rollout": "Tous le monde devra attendre un peux plus longtemps.", 40 "feature.todos.premium.rollout": "Tous le monde devra attendre un peux plus longtemps.",
41 "feature.todos.premium.upgrade": "Améliorez votre compte", 41 "feature.todos.premium.upgrade": "Améliorez votre compte",
42 "feature.trialStatusBar.cta": "Upgrade now", 42 "feature.trialStatusBar.cta": "Améliorer maintenant",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.", 43 "feature.trialStatusBar.expired": "Votre essai gratuit Ferdi {plan} a expiré, veuillez mettre à jour votre compte.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Rétrograder à la version gratuite",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal", 45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choisir Personnel",
46 "feature.trialStatusBar.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 46 "feature.trialStatusBar.fullscreen.dialog.message": "Vous êtes sur le point de rétrograder vers notre compte gratuit. Êtes-vous sûr ? Cliquez ici pour obtenir plus de services et de fonctionnalités pour seulement {currency}{price} par mois.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 47 "feature.trialStatusBar.fullscreen.dialog.title": "Rétrograder votre plan Ferdi",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.", 48 "feature.trialStatusBar.restTime": "Votre essai gratuit de Ferdi {plan} se termine dans {time}.",
49 "global.api.unhealthy": "Impossible de se connecter aux services en ligne de Ferdi", 49 "global.api.unhealthy": "Impossible de se connecter aux services en ligne de Ferdi",
50 "global.franzProRequired": "Ferdi Professionnel Requis", 50 "global.franzProRequired": "Ferdi Professionnel Requis",
51 "global.notConnectedToTheInternet": "Vous n'êtes pas connecté à Internet.", 51 "global.notConnectedToTheInternet": "Vous n'êtes pas connecté à Internet.",
@@ -163,20 +163,20 @@
163 "password.submit.label": "Soumettre", 163 "password.submit.label": "Soumettre",
164 "password.successInfo": "Merci de consulter vos emails", 164 "password.successInfo": "Merci de consulter vos emails",
165 "premiumFeature.button.upgradeAccount": "Augmenter le niveau de mon compte", 165 "premiumFeature.button.upgradeAccount": "Augmenter le niveau de mon compte",
166 "pricing.features.accountSync": "Account Synchronisation", 166 "pricing.features.accountSync": "Synchronisation de compte",
167 "pricing.features.adFree": "Toujours sans pub", 167 "pricing.features.adFree": "Toujours sans pub",
168 "pricing.features.appDelays": "Plus d'écrans d'attente", 168 "pricing.features.appDelays": "Plus d'écrans d'attente",
169 "pricing.features.customWebsites": "Ajouter des sites web modifiés", 169 "pricing.features.customWebsites": "Ajouter des sites web modifiés",
170 "pricing.features.desktopNotifications": "Desktop Notifications", 170 "pricing.features.desktopNotifications": "Notifications de bureau",
171 "pricing.features.onPremise": "Services hébergés sur place et autre", 171 "pricing.features.onPremise": "Services hébergés sur place et autre",
172 "pricing.features.recipes": "Choose from more than 70 Services", 172 "pricing.features.recipes": "Choisissez parmi de plus de 70 services",
173 "pricing.features.serviceProxies": "Service Proxy", 173 "pricing.features.serviceProxies": "Service Proxy",
174 "pricing.features.spellchecker": "Support du correcteur orthographique", 174 "pricing.features.spellchecker": "Support du correcteur orthographique",
175 "pricing.features.teamManagement": "Gestion d'équipe", 175 "pricing.features.teamManagement": "Gestion d'équipe",
176 "pricing.features.thirdPartyServices": "Installer des services tiers", 176 "pricing.features.thirdPartyServices": "Installer des services tiers",
177 "pricing.features.unlimitedServices": "Ajouter des services illimités", 177 "pricing.features.unlimitedServices": "Ajouter des services illimités",
178 "pricing.features.upToSixServices": "Add up to 6 services", 178 "pricing.features.upToSixServices": "Ajouter jusqu'à 6 services",
179 "pricing.features.upToThreeServices": "Add up to 3 services", 179 "pricing.features.upToThreeServices": "Ajouter jusqu'à 3 services",
180 "pricing.features.workspaces": "Espace de travail", 180 "pricing.features.workspaces": "Espace de travail",
181 "pricing.plan.free": "Ferdi Gratuit", 181 "pricing.plan.free": "Ferdi Gratuit",
182 "pricing.plan.legacy": "Ferdi Premium", 182 "pricing.plan.legacy": "Ferdi Premium",
@@ -188,17 +188,17 @@
188 "pricing.plan.pro-yearly": "Ferdi Professionnel à l'année", 188 "pricing.plan.pro-yearly": "Ferdi Professionnel à l'année",
189 "pricing.trial.cta.accept": "Oui, améliorer mon compte à Ferdi Professionnel", 189 "pricing.trial.cta.accept": "Oui, améliorer mon compte à Ferdi Professionnel",
190 "pricing.trial.cta.skip": "Continuer à Ferdi", 190 "pricing.trial.cta.skip": "Continuer à Ferdi",
191 "pricing.trial.cta.start": "Start using Ferdi", 191 "pricing.trial.cta.start": "Commencez à utiliser Ferdi",
192 "pricing.trial.error": "Désoler, nous ne pouvons pas activé votre essai!", 192 "pricing.trial.error": "Désoler, nous ne pouvons pas activé votre essai!",
193 "pricing.trial.features.headline": "Ferdi Professionnel inclus:", 193 "pricing.trial.features.headline": "Ferdi Professionnel inclus:",
194 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi", 194 "pricing.trial.headline.pro": "Bonjour {name}, bienvenue dans Ferdi",
195 "pricing.trial.intro.happyMessaging": "Happy messaging,", 195 "pricing.trial.intro.happyMessaging": "Bonne messagerie,",
196 "pricing.trial.intro.specialTreat": "We have a special treat for you.", 196 "pricing.trial.intro.specialTreat": "Nous avons une offre spéciale pour vous.",
197 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.", 197 "pricing.trial.intro.tryPro": "Profitez de l'expérience complète de Ferdi Professional pendant 14 jours.",
198 "pricing.trial.terms.automaticTrialEnd": "Votre essai gratuit se finis automatiquement après 14 jours", 198 "pricing.trial.terms.automaticTrialEnd": "Votre essai gratuit se finis automatiquement après 14 jours",
199 "pricing.trial.terms.headline": "Sans condition", 199 "pricing.trial.terms.headline": "Sans condition",
200 "pricing.trial.terms.noCreditCard": "Pas de carte de crédit requis", 200 "pricing.trial.terms.noCreditCard": "Pas de carte de crédit requis",
201 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)", 201 "pricing.trial.terms.trialWorth": "Essai gratuit (normalement {currency}{price} par mois)",
202 "service.crashHandler.action": "Recharger {name}", 202 "service.crashHandler.action": "Recharger {name}",
203 "service.crashHandler.autoReload": "Tentative de restauration automatique de {name} dans {seconds} secondes", 203 "service.crashHandler.autoReload": "Tentative de restauration automatique de {name} dans {seconds} secondes",
204 "service.crashHandler.headline": "Oh non!", 204 "service.crashHandler.headline": "Oh non!",
@@ -255,10 +255,11 @@
255 "settings.app.cacheInfo": "Le cache de Ferdi occupe actuellement {size} en espace disque.", 255 "settings.app.cacheInfo": "Le cache de Ferdi occupe actuellement {size} en espace disque.",
256 "settings.app.currentVersion": "Version actuelle :", 256 "settings.app.currentVersion": "Version actuelle :",
257 "settings.app.form.accentColor": "Accent de couleur", 257 "settings.app.form.accentColor": "Accent de couleur",
258 "settings.app.form.adaptableDarkMode": "Activer le mode sombre adaptable",
258 "settings.app.form.autoLaunchInBackground": "Ouvrir en arrière-plan", 259 "settings.app.form.autoLaunchInBackground": "Ouvrir en arrière-plan",
259 "settings.app.form.autoLaunchOnStart": "Lancer Ferdi au démarrage", 260 "settings.app.form.autoLaunchOnStart": "Lancer Ferdi au démarrage",
260 "settings.app.form.beta": "Accepter les versions bêta", 261 "settings.app.form.beta": "Accepter les versions bêta",
261 "settings.app.form.darkMode": "Activer le thème sombre", 262 "settings.app.form.darkMode": "Joindre le cô© obscure",
262 "settings.app.form.enableGPUAcceleration": "Activer l'accélération GPU", 263 "settings.app.form.enableGPUAcceleration": "Activer l'accélération GPU",
263 "settings.app.form.enableLock": "Activer le verrouillage de Ferdi", 264 "settings.app.form.enableLock": "Activer le verrouillage de Ferdi",
264 "settings.app.form.enableSpellchecking": "Activer la vérification orthographique", 265 "settings.app.form.enableSpellchecking": "Activer la vérification orthographique",
@@ -437,14 +438,14 @@
437 "signup.link.login": "Vous avez déjà un compte? Connectez-vous", 438 "signup.link.login": "Vous avez déjà un compte? Connectez-vous",
438 "signup.password.label": "Mot de passe", 439 "signup.password.label": "Mot de passe",
439 "signup.submit.label": "Créer un compte", 440 "signup.submit.label": "Créer un compte",
440 "subscription.bestValue": "Best value", 441 "subscription.bestValue": "Le meilleur prix",
441 "subscription.cta.activateTrial": "Oui, commencer l'essai gratuit de Ferdi Professionnel", 442 "subscription.cta.activateTrial": "Oui, commencer l'essai gratuit de Ferdi Professionnel",
442 "subscription.cta.allOptions": "Voir toutes les options", 443 "subscription.cta.allOptions": "Voir toutes les options",
443 "subscription.cta.choosePlan": "Choisissez votre plan", 444 "subscription.cta.choosePlan": "Choisissez votre plan",
444 "subscription.includedProFeatures": "Le plan Ferdi Professionnel inclus:", 445 "subscription.includedProFeatures": "Le plan Ferdi Professionnel inclus:",
445 "subscription.interval.per": "per {interval}", 446 "subscription.interval.per": "par {interval}",
446 "subscription.interval.perMonth": "per month", 447 "subscription.interval.perMonth": "par mois",
447 "subscription.interval.perMonthPerUser": "per month & user", 448 "subscription.interval.perMonthPerUser": "par mois et utilisateur",
448 "subscription.planItem.upgradeAccount": "Améliorez votre compte", 449 "subscription.planItem.upgradeAccount": "Améliorez votre compte",
449 "subscription.teaser.includedFeatures": "Les plans de Ferdi payés inclus:", 450 "subscription.teaser.includedFeatures": "Les plans de Ferdi payés inclus:",
450 "subscription.teaser.intro": "Ferdi 5 viens avec une large plage de nouvelles fonctionnalités pour renforcer votre communication quotidienne - batteries inclus. Aller voir nos nouveaux plans et trouver celui qui vous satisfait le mieux!", 451 "subscription.teaser.intro": "Ferdi 5 viens avec une large plage de nouvelles fonctionnalités pour renforcer votre communication quotidienne - batteries inclus. Aller voir nos nouveaux plans et trouver celui qui vous satisfait le mieux!",
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index e96d9e14f..ebc7b1dbe 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Tá taisce Ferdi ag baint úsáid as {size} den spás diosca.", 255 "settings.app.cacheInfo": "Tá taisce Ferdi ag baint úsáid as {size} den spás diosca.",
256 "settings.app.currentVersion": "Leagan reatha:", 256 "settings.app.currentVersion": "Leagan reatha:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Oscail sa chúlra", 259 "settings.app.form.autoLaunchInBackground": "Oscail sa chúlra",
259 "settings.app.form.autoLaunchOnStart": "Láinseáil Ferdi ón tús", 260 "settings.app.form.autoLaunchOnStart": "Láinseáil Ferdi ón tús",
260 "settings.app.form.beta": "Cuir leagain béite san áireamh", 261 "settings.app.form.beta": "Cuir leagain béite san áireamh",
diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/he.json
+++ b/src/i18n/locales/he.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index 5ad85cc1a..5d6f353f0 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi predmemorija trenutno koristi {size} prostora na disku", 255 "settings.app.cacheInfo": "Ferdi predmemorija trenutno koristi {size} prostora na disku",
256 "settings.app.currentVersion": "Trenutna verzija:", 256 "settings.app.currentVersion": "Trenutna verzija:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Otvori u pozadini", 259 "settings.app.form.autoLaunchInBackground": "Otvori u pozadini",
259 "settings.app.form.autoLaunchOnStart": "Pokreni Ferdi sa sistemom", 260 "settings.app.form.autoLaunchOnStart": "Pokreni Ferdi sa sistemom",
260 "settings.app.form.beta": "Obuhvati i beta verzije", 261 "settings.app.form.beta": "Obuhvati i beta verzije",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 940db5dff..7695f5fc4 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "A Ferdi gyorsítótár jelenleg {size} lemezterületet használ.", 255 "settings.app.cacheInfo": "A Ferdi gyorsítótár jelenleg {size} lemezterületet használ.",
256 "settings.app.currentVersion": "Aktuális verzió:", 256 "settings.app.currentVersion": "Aktuális verzió:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Megnyitás háttérben", 259 "settings.app.form.autoLaunchInBackground": "Megnyitás háttérben",
259 "settings.app.form.autoLaunchOnStart": "Ferdi betöltése indításkor", 260 "settings.app.form.autoLaunchOnStart": "Ferdi betöltése indításkor",
260 "settings.app.form.beta": "Béta verziók keresése", 261 "settings.app.form.beta": "Béta verziók keresése",
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 2378bfbad..e48458d07 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Singgahan Ferdi sedang menggunakan ruang disk {size}.", 255 "settings.app.cacheInfo": "Singgahan Ferdi sedang menggunakan ruang disk {size}.",
256 "settings.app.currentVersion": "Versi saat ini:", 256 "settings.app.currentVersion": "Versi saat ini:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Buka di latar belakang", 259 "settings.app.form.autoLaunchInBackground": "Buka di latar belakang",
259 "settings.app.form.autoLaunchOnStart": "Jalankan Ferdi saat komputer dimulai", 260 "settings.app.form.autoLaunchOnStart": "Jalankan Ferdi saat komputer dimulai",
260 "settings.app.form.beta": "Sertakan versi beta", 261 "settings.app.form.beta": "Sertakan versi beta",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index f3ed42e3a..07a4dc98d 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi sta utilizzando {size} di spazio su disco.", 255 "settings.app.cacheInfo": "Ferdi sta utilizzando {size} di spazio su disco.",
256 "settings.app.currentVersion": "Versione attuale:", 256 "settings.app.currentVersion": "Versione attuale:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Apri in background", 259 "settings.app.form.autoLaunchInBackground": "Apri in background",
259 "settings.app.form.autoLaunchOnStart": "Esegui Ferdi all'avvio", 260 "settings.app.form.autoLaunchOnStart": "Esegui Ferdi all'avvio",
260 "settings.app.form.beta": "Includi versioni beta", 261 "settings.app.form.beta": "Includi versioni beta",
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index b9b6da6c3..0f5a14be1 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "ç¾åœ¨ã€Ferdiã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯ãƒ‡ã‚£ã‚¹ã‚¯ã®{size}分を使用ã—ã¦ã„ã¾ã™ã€‚", 255 "settings.app.cacheInfo": "ç¾åœ¨ã€Ferdiã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯ãƒ‡ã‚£ã‚¹ã‚¯ã®{size}分を使用ã—ã¦ã„ã¾ã™ã€‚",
256 "settings.app.currentVersion": "ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³:", 256 "settings.app.currentVersion": "ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§é–‹ã", 259 "settings.app.form.autoLaunchInBackground": "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§é–‹ã",
259 "settings.app.form.autoLaunchOnStart": "システム起動時ã«Ferdiã‚’é–‹ã", 260 "settings.app.form.autoLaunchOnStart": "システム起動時ã«Ferdiã‚’é–‹ã",
260 "settings.app.form.beta": "Betaãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã‚‹", 261 "settings.app.form.beta": "Betaãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã‚‹",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 2f0aaa5ae..302b513d2 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი ვერსიáƒ:", 256 "settings.app.currentVersion": "áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი ვერსიáƒ:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "გáƒáƒ®áƒ¡áƒ”ნით ფáƒáƒœáƒ–ე", 259 "settings.app.form.autoLaunchInBackground": "გáƒáƒ®áƒ¡áƒ”ნით ფáƒáƒœáƒ–ე",
259 "settings.app.form.autoLaunchOnStart": "გáƒáƒ”შვáƒáƒ¡ Ferdi სისტემის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡", 260 "settings.app.form.autoLaunchOnStart": "გáƒáƒ”შვáƒáƒ¡ Ferdi სისტემის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡",
260 "settings.app.form.beta": "ჩáƒáƒ áƒ—ეთ ბეტრვერსიები", 261 "settings.app.form.beta": "ჩáƒáƒ áƒ—ეთ ბეტრვერსიები",
diff --git a/src/i18n/locales/ko.json b/src/i18n/locales/ko.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/ko.json
+++ b/src/i18n/locales/ko.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index ce8a35ce8..80f33d583 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache gebruikt momenteel {size} schijfruimte.", 255 "settings.app.cacheInfo": "Ferdi cache gebruikt momenteel {size} schijfruimte.",
256 "settings.app.currentVersion": "Huidige versie:", 256 "settings.app.currentVersion": "Huidige versie:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open op de achtergrond", 259 "settings.app.form.autoLaunchInBackground": "Open op de achtergrond",
259 "settings.app.form.autoLaunchOnStart": "Lanceer Ferdi bij opstarten", 260 "settings.app.form.autoLaunchOnStart": "Lanceer Ferdi bij opstarten",
260 "settings.app.form.beta": "Inclusief beta versies", 261 "settings.app.form.beta": "Inclusief beta versies",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index e5467c877..c71954427 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi gebruikt op dit moment {size} schijfruimte aan tijdelijke bestanden.", 255 "settings.app.cacheInfo": "Ferdi gebruikt op dit moment {size} schijfruimte aan tijdelijke bestanden.",
256 "settings.app.currentVersion": "Huidige versie:", 256 "settings.app.currentVersion": "Huidige versie:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open op de achtergrond", 259 "settings.app.form.autoLaunchInBackground": "Open op de achtergrond",
259 "settings.app.form.autoLaunchOnStart": "Open Ferdi bij opstarten", 260 "settings.app.form.autoLaunchOnStart": "Open Ferdi bij opstarten",
260 "settings.app.form.beta": "Inclusief bètaversies", 261 "settings.app.form.beta": "Inclusief bètaversies",
diff --git a/src/i18n/locales/no.json b/src/i18n/locales/no.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/no.json
+++ b/src/i18n/locales/no.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index 6cc75eaf3..e29e80e9f 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Pamięć podręczna zajmuje obecnie {size} przestrzeni dyskowej", 255 "settings.app.cacheInfo": "Pamięć podręczna zajmuje obecnie {size} przestrzeni dyskowej",
256 "settings.app.currentVersion": "Aktualna wersja:", 256 "settings.app.currentVersion": "Aktualna wersja:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Otwórz w tle", 259 "settings.app.form.autoLaunchInBackground": "Otwórz w tle",
259 "settings.app.form.autoLaunchOnStart": "Uruchom Ferdi na poczÄ…tku", 260 "settings.app.form.autoLaunchOnStart": "Uruchom Ferdi na poczÄ…tku",
260 "settings.app.form.beta": "Uwzględnij wersje beta", 261 "settings.app.form.beta": "Uwzględnij wersje beta",
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 9dec7e7a3..591b35610 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,33 +1,33 @@
1{ 1{
2 "app.errorHandler.action": "Recarregar", 2 "app.errorHandler.action": "Actualizar",
3 "app.errorHandler.headline": "Opa! Algo deu errado.", 3 "app.errorHandler.headline": "Uoops! Algo correu mal",
4 "feature.announcements.changelog.headline": "Mudanças no Ferdi {version}", 4 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}",
5 "feature.delayApp.headline": "Por favor, adquira uma licença para pular o tempo de espera", 5 "feature.delayApp.headline": "Por favor, adquira uma licença Ferdi para não ter tempo de espera",
6 "feature.delayApp.text": "Ferdi continuará em {seconds} segundos.", 6 "feature.delayApp.text": "Ferdi continuará em {seconds} segundos.",
7 "feature.delayApp.trial.action": "Sim, eu quero o período de testes gratuito de 14 dias do Ferdi Professional", 7 "feature.delayApp.trial.action": "Sim, eu quero o período de testes gratuito de 14 dias do Ferdi Professional",
8 "feature.delayApp.trial.actionShort": "Ativar período de testes gratuito do Ferdi Professional", 8 "feature.delayApp.trial.actionShort": "Ativar período de testes gratuito do Ferdi Professional",
9 "feature.delayApp.trial.headline": "Empieza el periodo de prueba de Ferdi Profesional por 14 días y cruza la linea.", 9 "feature.delayApp.trial.headline": "Empieza el periodo de prueba de Ferdi Profesional por 14 días y cruza la linea.",
10 "feature.delayApp.upgrade.action": "Adquira uma licença de suporte Ferdi", 10 "feature.delayApp.upgrade.action": "Adquira uma licença de suporte Ferdi",
11 "feature.delayApp.upgrade.actionShort": "Atualizar conta", 11 "feature.delayApp.upgrade.actionShort": "Atualizar conta",
12 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 12 "feature.planSelection.cta.ctaDowngradeFree": "Despromover para Gratuito",
13 "feature.planSelection.cta.stayOnFree": "Stay on Free", 13 "feature.planSelection.cta.stayOnFree": "Continuar em Gratuito",
14 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 14 "feature.planSelection.cta.trial": "Iniciar meu teste grátis de 14 dias",
15 "feature.planSelection.cta.upgradePersonal": "Choose Personal", 15 "feature.planSelection.cta.upgradePersonal": "Escolha Pessoal",
16 "feature.planSelection.cta.upgradePro": "Choose Professional", 16 "feature.planSelection.cta.upgradePro": "Escolha Profissional",
17 "feature.planSelection.free.text": "Basic functionality", 17 "feature.planSelection.free.text": "Funcionalidade básica",
18 "feature.planSelection.fullFeatureList": "Complete comparison of all plans", 18 "feature.planSelection.fullFeatureList": "Comparação completa de todos os planos",
19 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 19 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Despromover para Gratuito",
20 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal", 20 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Escolha Pessoal",
21 "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 21 "feature.planSelection.fullscreen.dialog.message": "Você está prestes a fazer a despromoção para nossa conta gratuita. Você tem certeza? Clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.",
22 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 22 "feature.planSelection.fullscreen.dialog.title": "Despromover o seu Plano Ferdi",
23 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.", 23 "feature.planSelection.fullscreen.subheadline": "Agora tem de fazer uma escolha. O Ferdi trabalha melhor em nossos planos pessoais e profissionais. Por favor, compare estes planos e escolha o que melhor se adapta a si.",
24 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}", 24 "feature.planSelection.fullscreen.welcome": "Está prestes a escolher, {name}",
25 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", 25 "feature.planSelection.personal.text": "Mais serviços, sem espera - ideal para uso pessoal.",
26 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment", 26 "feature.planSelection.pricesBasedOnAnnualPayment": "Todos os preços são baseados no pagamento anual",
27 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", 27 "feature.planSelection.pro.text": "Serviços ilimitados e recursos profissionais para si - e para a sua equipa.",
28 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 28 "feature.quickSwitch.info": "Seleccione um serviço com TAB, ↑ e ↓. Abra um serviço com ENTER.",
29 "feature.quickSwitch.search": "Search...", 29 "feature.quickSwitch.search": "A procurar...",
30 "feature.quickSwitch.title": "QuickSwitch", 30 "feature.quickSwitch.title": "Troca Rápida",
31 "feature.serviceLimit.limitReached": "Você adicionou {amount} serviços de um total de {limit} que estão inclusos no seu plano. Por favor, atualize sua conta para adicionar mais serviços.", 31 "feature.serviceLimit.limitReached": "Você adicionou {amount} serviços de um total de {limit} que estão inclusos no seu plano. Por favor, atualize sua conta para adicionar mais serviços.",
32 "feature.shareFranz.action.email": "Enviar por e-mail", 32 "feature.shareFranz.action.email": "Enviar por e-mail",
33 "feature.shareFranz.action.facebook": "Compartilhar no Facebook", 33 "feature.shareFranz.action.facebook": "Compartilhar no Facebook",
@@ -39,13 +39,13 @@
39 "feature.todos.premium.info": "As Listas de Tarefa do Ferdi estão disponíveis para usuários premium!", 39 "feature.todos.premium.info": "As Listas de Tarefa do Ferdi estão disponíveis para usuários premium!",
40 "feature.todos.premium.rollout": "As outras pessoas terão que esperar um pouquinho mais.", 40 "feature.todos.premium.rollout": "As outras pessoas terão que esperar um pouquinho mais.",
41 "feature.todos.premium.upgrade": "Actualizar cuenta", 41 "feature.todos.premium.upgrade": "Actualizar cuenta",
42 "feature.trialStatusBar.cta": "Upgrade now", 42 "feature.trialStatusBar.cta": "Promover agora",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.", 43 "feature.trialStatusBar.expired": "Seu teste grátis Ferdi {plan} expirou, por favor actualize sua conta.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free", 44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Despromover para Gratuito",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal", 45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Escolha Pessoal",
46 "feature.trialStatusBar.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 46 "feature.trialStatusBar.fullscreen.dialog.message": "Você está prestes a fazer a despromoção para nossa conta gratuita. Você tem certeza? Clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan", 47 "feature.trialStatusBar.fullscreen.dialog.title": "Despromover o seu Plano Ferdi",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.", 48 "feature.trialStatusBar.restTime": "Seu teste grátis Ferdi {plan} termina em {time}.",
49 "global.api.unhealthy": "Não foi possível conectar-se aos serviços on-line do Ferdi.", 49 "global.api.unhealthy": "Não foi possível conectar-se aos serviços on-line do Ferdi.",
50 "global.franzProRequired": "Se requiere una cuenta Ferdi Profesional", 50 "global.franzProRequired": "Se requiere una cuenta Ferdi Profesional",
51 "global.notConnectedToTheInternet": "Você não está conectado à internet", 51 "global.notConnectedToTheInternet": "Você não está conectado à internet",
@@ -58,7 +58,7 @@
58 "import.notSupportedHeadline": "Serviços ainda não suportados pelo Ferdi 5 ", 58 "import.notSupportedHeadline": "Serviços ainda não suportados pelo Ferdi 5 ",
59 "import.skip.label": "Quero adicionar serviços manualmente", 59 "import.skip.label": "Quero adicionar serviços manualmente",
60 "import.submit.label": "Importar serviços", 60 "import.submit.label": "Importar serviços",
61 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 61 "infobar.authRequestFailed": "Houve erros ao tentar autenticar. Por favor, tente desconectar e autenticar novamente se o erro persistir.",
62 "infobar.buttonChangelog": "O que há de novo?", 62 "infobar.buttonChangelog": "O que há de novo?",
63 "infobar.buttonInstallUpdate": "Reiniciar e instalar atualizações ", 63 "infobar.buttonInstallUpdate": "Reiniciar e instalar atualizações ",
64 "infobar.buttonReloadServices": "Recarregar serviços", 64 "infobar.buttonReloadServices": "Recarregar serviços",
@@ -72,12 +72,12 @@
72 "invite.skip.label": "Quero fazer isso depois", 72 "invite.skip.label": "Quero fazer isso depois",
73 "invite.submit.label": "Enviar convites", 73 "invite.submit.label": "Enviar convites",
74 "invite.successInfo": "Convites enviados com sucesso", 74 "invite.successInfo": "Convites enviados com sucesso",
75 "locked.headline": "Locked", 75 "locked.headline": "Bloqueado",
76 "locked.info": "Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.", 76 "locked.info": "Ferdi está bloqueado no momento. Por favor, desbloqueie Ferdi com sua senha para ver suas mensagens.",
77 "locked.invalidCredentials": "Password invalid", 77 "locked.invalidCredentials": "Senha inválida",
78 "locked.password.label": "Password", 78 "locked.password.label": "Senha",
79 "locked.submit.label": "Unlock", 79 "locked.submit.label": "Desbloquear",
80 "login.changeServer": "Change server", 80 "login.changeServer": "Alterar servidor",
81 "login.customServerQuestion": "Using a custom Ferdi server?", 81 "login.customServerQuestion": "Using a custom Ferdi server?",
82 "login.customServerSuggestion": "Try importing your Franz account", 82 "login.customServerSuggestion": "Try importing your Franz account",
83 "login.email.label": "Endereço de E-mail", 83 "login.email.label": "Endereço de E-mail",
@@ -85,7 +85,7 @@
85 "login.invalidCredentials": "E-mail ou senha inválida", 85 "login.invalidCredentials": "E-mail ou senha inválida",
86 "login.link.password": "Trocar a senha", 86 "login.link.password": "Trocar a senha",
87 "login.link.signup": "Criar uma conta gratuita", 87 "login.link.signup": "Criar uma conta gratuita",
88 "login.password.label": "Password", 88 "login.password.label": "Senha",
89 "login.serverLogout": "Sua sessão expirou, faça o login novamente.", 89 "login.serverLogout": "Sua sessão expirou, faça o login novamente.",
90 "login.submit.label": "Entrar", 90 "login.submit.label": "Entrar",
91 "login.tokenExpired": "Sua sessão expirou, faça o login novamente.", 91 "login.tokenExpired": "Sua sessão expirou, faça o login novamente.",
@@ -93,7 +93,7 @@
93 "menu.Todoss.openTodosDrawer": "Abrir a gaveta de Listas de Tarefa", 93 "menu.Todoss.openTodosDrawer": "Abrir a gaveta de Listas de Tarefa",
94 "menu.app.about": "Sobre Ferdi", 94 "menu.app.about": "Sobre Ferdi",
95 "menu.app.announcement": "Quais as novidades?", 95 "menu.app.announcement": "Quais as novidades?",
96 "menu.app.autohideMenuBar": "Auto-hide menu bar", 96 "menu.app.autohideMenuBar": "Auto-ocultar barra de menu",
97 "menu.app.checkForUpdates": "Verificar se há atualizações", 97 "menu.app.checkForUpdates": "Verificar se há atualizações",
98 "menu.app.hide": "Ocultar", 98 "menu.app.hide": "Ocultar",
99 "menu.app.hideOthers": "Ocultar Outros", 99 "menu.app.hideOthers": "Ocultar Outros",
@@ -127,17 +127,17 @@
127 "menu.services": "Serviços", 127 "menu.services": "Serviços",
128 "menu.services.activatePreviousService": "Pular para serviço anterior", 128 "menu.services.activatePreviousService": "Pular para serviço anterior",
129 "menu.services.addNewService": "Adicionar Novo Serviço", 129 "menu.services.addNewService": "Adicionar Novo Serviço",
130 "menu.services.goHome": "Home", 130 "menu.services.goHome": "Início",
131 "menu.services.setNextServiceActive": "Pular para próximo serviço", 131 "menu.services.setNextServiceActive": "Pular para próximo serviço",
132 "menu.todos": "Tareas pendientes", 132 "menu.todos": "Tareas pendientes",
133 "menu.todos.enableTodos": "Habilitar Tareas pendientes", 133 "menu.todos.enableTodos": "Habilitar Tareas pendientes",
134 "menu.view": "Visualizar ", 134 "menu.view": "Visualizar ",
135 "menu.view.back": "Back", 135 "menu.view.back": "Anterior",
136 "menu.view.enterFullScreen": "Modo Tela Cheia", 136 "menu.view.enterFullScreen": "Modo Tela Cheia",
137 "menu.view.exitFullScreen": "Sair da Tela Cheia", 137 "menu.view.exitFullScreen": "Sair da Tela Cheia",
138 "menu.view.forward": "Forward", 138 "menu.view.forward": "Seguinte",
139 "menu.view.lockFerdi": "Lock Ferdi", 139 "menu.view.lockFerdi": "Bloquear Ferdi",
140 "menu.view.openQuickSwitch": "Open Quick Switch", 140 "menu.view.openQuickSwitch": "Abrir Troca Rápida",
141 "menu.view.reloadFranz": "Recarregar Ferdi", 141 "menu.view.reloadFranz": "Recarregar Ferdi",
142 "menu.view.reloadService": "Reiniciar o Serviço", 142 "menu.view.reloadService": "Reiniciar o Serviço",
143 "menu.view.resetZoom": "Tamanho real", 143 "menu.view.resetZoom": "Tamanho real",
@@ -163,20 +163,20 @@
163 "password.submit.label": "Enviar", 163 "password.submit.label": "Enviar",
164 "password.successInfo": "Por favor, verifique o seu e-mail", 164 "password.successInfo": "Por favor, verifique o seu e-mail",
165 "premiumFeature.button.upgradeAccount": "Atualizar conta", 165 "premiumFeature.button.upgradeAccount": "Atualizar conta",
166 "pricing.features.accountSync": "Account Synchronisation", 166 "pricing.features.accountSync": "Sincronização Automática",
167 "pricing.features.adFree": "Sin anuncios para siempre!", 167 "pricing.features.adFree": "Sin anuncios para siempre!",
168 "pricing.features.appDelays": "Sem Telas de Espera", 168 "pricing.features.appDelays": "Sem Telas de Espera",
169 "pricing.features.customWebsites": "Adicionar Websites Personalizados", 169 "pricing.features.customWebsites": "Adicionar Websites Personalizados",
170 "pricing.features.desktopNotifications": "Desktop Notifications", 170 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho",
171 "pricing.features.onPremise": "En sitio y otros servicios alojados", 171 "pricing.features.onPremise": "En sitio y otros servicios alojados",
172 "pricing.features.recipes": "Choose from more than 70 Services", 172 "pricing.features.recipes": "Escolha entre mais de 70 serviços",
173 "pricing.features.serviceProxies": "Apoderados de Servicio", 173 "pricing.features.serviceProxies": "Apoderados de Servicio",
174 "pricing.features.spellchecker": "Soporte de corrector ortográfico", 174 "pricing.features.spellchecker": "Soporte de corrector ortográfico",
175 "pricing.features.teamManagement": "Gestão de Time", 175 "pricing.features.teamManagement": "Gestão de Time",
176 "pricing.features.thirdPartyServices": "Instalar servicios de terceros", 176 "pricing.features.thirdPartyServices": "Instalar servicios de terceros",
177 "pricing.features.unlimitedServices": "Agregar servicios ilimitados", 177 "pricing.features.unlimitedServices": "Agregar servicios ilimitados",
178 "pricing.features.upToSixServices": "Add up to 6 services", 178 "pricing.features.upToSixServices": "Adicionar até 6 serviços",
179 "pricing.features.upToThreeServices": "Add up to 3 services", 179 "pricing.features.upToThreeServices": "Adicionar até 3 serviços",
180 "pricing.features.workspaces": "Ãreas de trabalho", 180 "pricing.features.workspaces": "Ãreas de trabalho",
181 "pricing.plan.free": "Ferdi Gratuito", 181 "pricing.plan.free": "Ferdi Gratuito",
182 "pricing.plan.legacy": "Ferdi Premium", 182 "pricing.plan.legacy": "Ferdi Premium",
@@ -188,17 +188,17 @@
188 "pricing.plan.pro-yearly": "Ferdi Profissional Anual", 188 "pricing.plan.pro-yearly": "Ferdi Profissional Anual",
189 "pricing.trial.cta.accept": "Sim, atualizar minha conta para o Ferdi Profissional", 189 "pricing.trial.cta.accept": "Sim, atualizar minha conta para o Ferdi Profissional",
190 "pricing.trial.cta.skip": "Continuar para o Ferdi", 190 "pricing.trial.cta.skip": "Continuar para o Ferdi",
191 "pricing.trial.cta.start": "Start using Ferdi", 191 "pricing.trial.cta.start": "Começar a usar Ferdi",
192 "pricing.trial.error": "Desculpe, não conseguimos ativar o seu período de testes", 192 "pricing.trial.error": "Desculpe, não conseguimos ativar o seu período de testes",
193 "pricing.trial.features.headline": "Incluso no Ferdi Profissional:", 193 "pricing.trial.features.headline": "Incluso no Ferdi Profissional:",
194 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi", 194 "pricing.trial.headline.pro": "Olá {name}, bem-vindo/a ao Ferdi",
195 "pricing.trial.intro.happyMessaging": "Happy messaging,", 195 "pricing.trial.intro.happyMessaging": "Mensagens felizes,",
196 "pricing.trial.intro.specialTreat": "We have a special treat for you.", 196 "pricing.trial.intro.specialTreat": "Temos uma oferta especial para si.",
197 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.", 197 "pricing.trial.intro.tryPro": "Aproveite a experiência completa de Ferdi Profissional completamente gratuita durante 14 dias.",
198 "pricing.trial.terms.automaticTrialEnd": "Seu período de testes encerra automaticamente em 14 dias", 198 "pricing.trial.terms.automaticTrialEnd": "Seu período de testes encerra automaticamente em 14 dias",
199 "pricing.trial.terms.headline": "Sem vínculos", 199 "pricing.trial.terms.headline": "Sem vínculos",
200 "pricing.trial.terms.noCreditCard": "No necesita tarjeta de crédito", 200 "pricing.trial.terms.noCreditCard": "No necesita tarjeta de crédito",
201 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)", 201 "pricing.trial.terms.trialWorth": "Teste gratuito (normalmente {currency}{price} por mês)",
202 "service.crashHandler.action": "Recarregar {name}", 202 "service.crashHandler.action": "Recarregar {name}",
203 "service.crashHandler.autoReload": "Tentando reestabelecer {name} automaticamente em {seconds} segundos", 203 "service.crashHandler.autoReload": "Tentando reestabelecer {name} automaticamente em {seconds} segundos",
204 "service.crashHandler.headline": "Ah, não!", 204 "service.crashHandler.headline": "Ah, não!",
@@ -217,9 +217,9 @@
217 "service.restrictedHandler.serviceLimit.text": "Por favor mejore su cuenta para poder utilizar más de {count} servicios.", 217 "service.restrictedHandler.serviceLimit.text": "Por favor mejore su cuenta para poder utilizar más de {count} servicios.",
218 "service.webviewLoader.loading": "Carregando", 218 "service.webviewLoader.loading": "Carregando",
219 "services.getStarted": "Iniciar", 219 "services.getStarted": "Iniciar",
220 "services.login": "Please login to use Ferdi.", 220 "services.login": "Por favor, inicie sua sessão para usar Ferdi.",
221 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 221 "services.serverInfo": "Opcionalmente, você pode mudar seu servidor Ferdi clicando no icon de roda dentada no canto inferior esquerdo.",
222 "services.serverless": "Use Ferdi without an Account", 222 "services.serverless": "Use Ferdi sem uma conta",
223 "services.welcome": "Bem-vindo ao Ferdi!", 223 "services.welcome": "Bem-vindo ao Ferdi!",
224 "settings.account.account.editButton": "Editar conta", 224 "settings.account.account.editButton": "Editar conta",
225 "settings.account.accountType.basic": "Conta Básica", 225 "settings.account.accountType.basic": "Conta Básica",
@@ -248,39 +248,40 @@
248 "settings.account.upgradeToPro.label": "Atualizar para o Ferdi Profissional", 248 "settings.account.upgradeToPro.label": "Atualizar para o Ferdi Profissional",
249 "settings.account.userInfoRequestFailed": "Não foi possível carregar as informações do usuário", 249 "settings.account.userInfoRequestFailed": "Não foi possível carregar as informações do usuário",
250 "settings.account.yourLicense": "Su Licencia Ferdi", 250 "settings.account.yourLicense": "Su Licencia Ferdi",
251 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: #7367f0)", 251 "settings.app.accentColorInfo": "Escreva sua cor de destaque em um formato compatível com CSS. (Padrão: #7367f0)",
252 "settings.app.buttonClearAllCache": "Limpar cache", 252 "settings.app.buttonClearAllCache": "Limpar cache",
253 "settings.app.buttonInstallUpdate": "Reiniciar e instalar atualizações ", 253 "settings.app.buttonInstallUpdate": "Reiniciar e instalar atualizações ",
254 "settings.app.buttonSearchForUpdate": "Verificar se há atualizações", 254 "settings.app.buttonSearchForUpdate": "Verificar se há atualizações",
255 "settings.app.cacheInfo": "O cache do Ferdi está usando {size} de espaço em disco atualmente.", 255 "settings.app.cacheInfo": "O cache do Ferdi está usando {size} de espaço em disco atualmente.",
256 "settings.app.currentVersion": "Versão atual:", 256 "settings.app.currentVersion": "Versão atual:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Cor de destaque",
258 "settings.app.form.adaptableDarkMode": "Activar modo de escuridão adaptável",
258 "settings.app.form.autoLaunchInBackground": "Abrir em segundo plano", 259 "settings.app.form.autoLaunchInBackground": "Abrir em segundo plano",
259 "settings.app.form.autoLaunchOnStart": "Abrir o Ferdi ao iniciar o sistema", 260 "settings.app.form.autoLaunchOnStart": "Abrir o Ferdi ao iniciar o sistema",
260 "settings.app.form.beta": "Incluir versões beta", 261 "settings.app.form.beta": "Incluir versões beta",
261 "settings.app.form.darkMode": "Venha para o Lado Negro da força", 262 "settings.app.form.darkMode": "Venha para o Lado Negro da força",
262 "settings.app.form.enableGPUAcceleration": "Ativar Aceleração de GPU", 263 "settings.app.form.enableGPUAcceleration": "Ativar Aceleração de GPU",
263 "settings.app.form.enableLock": "Enable Ferdi password lock", 264 "settings.app.form.enableLock": "Activar o bloqueio com palavra-passe do Ferdi",
264 "settings.app.form.enableSpellchecking": "Ativar correção ortográfica", 265 "settings.app.form.enableSpellchecking": "Ativar correção ortográfica",
265 "settings.app.form.enableSystemTray": "Exibir o Ferdi na barra de sistema", 266 "settings.app.form.enableSystemTray": "Exibir o Ferdi na barra de sistema",
266 "settings.app.form.enableTodos": "Activar Ferdi Todos", 267 "settings.app.form.enableTodos": "Activar Ferdi Todos",
267 "settings.app.form.hibernate": "Enable service hibernation", 268 "settings.app.form.hibernate": "Activar hibernação do serviço",
268 "settings.app.form.hibernationStrategy": "Hibernation strategy", 269 "settings.app.form.hibernationStrategy": "Estratégia de Hibernação",
269 "settings.app.form.keepAllWorkspacesLoaded": "Mantener todas las Ãreas de trabajo cargadas", 270 "settings.app.form.keepAllWorkspacesLoaded": "Mantener todas las Ãreas de trabajo cargadas",
270 "settings.app.form.language": "Idioma", 271 "settings.app.form.language": "Idioma",
271 "settings.app.form.lockPassword": "Ferdi Lock password", 272 "settings.app.form.lockPassword": "Palavra-passe para bloqueio do Ferdi",
272 "settings.app.form.minimizeToSystemTray": "Minimizar o Ferdi para a área de sistema", 273 "settings.app.form.minimizeToSystemTray": "Minimizar o Ferdi para a área de sistema",
273 "settings.app.form.noUpdates": "Disable updates", 274 "settings.app.form.noUpdates": "Desactivar actualizações",
274 "settings.app.form.privateNotifications": "Don't show message content in notifications", 275 "settings.app.form.privateNotifications": "Não mostrar o conteúdo das mensagens nas notificações",
275 "settings.app.form.runInBackground": "Manter o Ferdi no fundo quando fechar a janela", 276 "settings.app.form.runInBackground": "Manter o Ferdi no fundo quando fechar a janela",
276 "settings.app.form.scheduledDNDEnabled": "Enable scheduled Do-not-Disturb", 277 "settings.app.form.scheduledDNDEnabled": "Activar Não-Perturbar agendado",
277 "settings.app.form.scheduledDNDEnd": "To", 278 "settings.app.form.scheduledDNDEnd": "Até",
278 "settings.app.form.scheduledDNDStart": "From", 279 "settings.app.form.scheduledDNDStart": "Desde",
279 "settings.app.form.server": "Server", 280 "settings.app.form.server": "Servidor",
280 "settings.app.form.showDisabledServices": "Mostrar abas de serviços desativados", 281 "settings.app.form.showDisabledServices": "Mostrar abas de serviços desativados",
281 "settings.app.form.showMessagesBadgesWhenMuted": "Mostrar ícone de mensagem não lida quando as notificações estiverem desativadas", 282 "settings.app.form.showMessagesBadgesWhenMuted": "Mostrar ícone de mensagem não lida quando as notificações estiverem desativadas",
282 "settings.app.form.showServiceNavigationBar": "Always show service navigation bar", 283 "settings.app.form.showServiceNavigationBar": "Sempre mostrar a barra de navegação do serviço",
283 "settings.app.form.todoServer": "Todo Server", 284 "settings.app.form.todoServer": "Tarefa do Servidor",
284 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 285 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
285 "settings.app.headline": "Configurações", 286 "settings.app.headline": "Configurações",
286 "settings.app.headlineAdvanced": "Avançado", 287 "settings.app.headlineAdvanced": "Avançado",
@@ -420,7 +421,7 @@
420 "sidebar.addNewService": "Adicionar novo serviço", 421 "sidebar.addNewService": "Adicionar novo serviço",
421 "sidebar.closeTodosDrawer": "Close Ferdi Todos", 422 "sidebar.closeTodosDrawer": "Close Ferdi Todos",
422 "sidebar.closeWorkspaceDrawer": "Fechar menu da área de trabalho", 423 "sidebar.closeWorkspaceDrawer": "Fechar menu da área de trabalho",
423 "sidebar.lockFerdi": "Lock Ferdi", 424 "sidebar.lockFerdi": "Bloquear Ferdi",
424 "sidebar.muteApp": "Desativar notificações e áudio", 425 "sidebar.muteApp": "Desativar notificações e áudio",
425 "sidebar.openTodosDrawer": "Open Ferdi Todos", 426 "sidebar.openTodosDrawer": "Open Ferdi Todos",
426 "sidebar.openWorkspaceDrawer": "Abrir o menu da área de trabalho", 427 "sidebar.openWorkspaceDrawer": "Abrir o menu da área de trabalho",
@@ -435,7 +436,7 @@
435 "signup.legal.privacy": "Declaração de Privacidade ", 436 "signup.legal.privacy": "Declaração de Privacidade ",
436 "signup.legal.terms": "Termos de serviço", 437 "signup.legal.terms": "Termos de serviço",
437 "signup.link.login": "Já tem uma conta?", 438 "signup.link.login": "Já tem uma conta?",
438 "signup.password.label": "Password", 439 "signup.password.label": "Senha",
439 "signup.submit.label": "Criar uma conta", 440 "signup.submit.label": "Criar uma conta",
440 "subscription.bestValue": "Best value", 441 "subscription.bestValue": "Best value",
441 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial", 442 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
@@ -444,9 +445,9 @@
444 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:", 445 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
445 "subscription.interval.per": "per {interval}", 446 "subscription.interval.per": "per {interval}",
446 "subscription.interval.perMonth": "per month", 447 "subscription.interval.perMonth": "per month",
447 "subscription.interval.perMonthPerUser": "per month & user", 448 "subscription.interval.perMonthPerUser": "por mês e por utilizador",
448 "subscription.planItem.upgradeAccount": "Actualizar cuenta", 449 "subscription.planItem.upgradeAccount": "Actualizar cuenta",
449 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:", 450 "subscription.teaser.includedFeatures": "Planos pagos Ferdi incluem:",
450 "subscription.teaser.intro": "O Ferdi 5 vem com uma variedade de novas funcionalidades para melhorar a sua comunicação diária - pilhas inclusas. Confira os nossos novos planos e encontre aquele que melhor serve para você!", 451 "subscription.teaser.intro": "O Ferdi 5 vem com uma variedade de novas funcionalidades para melhorar a sua comunicação diária - pilhas inclusas. Confira os nossos novos planos e encontre aquele que melhor serve para você!",
451 "subscriptionPopup.buttonCancel": "Cancelar", 452 "subscriptionPopup.buttonCancel": "Cancelar",
452 "subscriptionPopup.buttonDone": "Feito", 453 "subscriptionPopup.buttonDone": "Feito",
@@ -458,17 +459,17 @@
458 "tabs.item.enableAudio": "Ativar áudio", 459 "tabs.item.enableAudio": "Ativar áudio",
459 "tabs.item.enableNotification": "Ativar notificações", 460 "tabs.item.enableNotification": "Ativar notificações",
460 "tabs.item.enableService": "Ativar serviço", 461 "tabs.item.enableService": "Ativar serviço",
461 "tabs.item.reload": "Recarregar", 462 "tabs.item.reload": "Actualizar",
462 "validation.email": "inválido", 463 "validation.email": "inválido",
463 "validation.minLength": "{campo} deve ter pelo menos {comprimento} mais caracteres ", 464 "validation.minLength": "{campo} deve ter pelo menos {comprimento} mais caracteres ",
464 "validation.oneRequired": "Necessário pelo menos um", 465 "validation.oneRequired": "Necessário pelo menos um",
465 "validation.required": "{campo} obrigatório", 466 "validation.required": "{campo} obrigatório",
466 "validation.url": "{campo} essa URL não é válida", 467 "validation.url": "{campo} essa URL não é válida",
467 "webControls.back": "Back", 468 "webControls.back": "Anterior",
468 "webControls.forward": "Forward", 469 "webControls.forward": "Seguinte",
469 "webControls.goHome": "Home", 470 "webControls.goHome": "Início",
470 "webControls.openInBrowser": "Open in Browser", 471 "webControls.openInBrowser": "Abrir no navegador",
471 "webControls.reload": "Recarregar", 472 "webControls.reload": "Actualizar",
472 "welcome.loginButton": "Entrar na sua conta", 473 "welcome.loginButton": "Entrar na sua conta",
473 "welcome.signupButton": "Criar uma conta gratuita", 474 "welcome.signupButton": "Criar uma conta gratuita",
474 "workspaceDrawer.addNewWorkspaceLabel": "Adicionar uma nova área de trabalho", 475 "workspaceDrawer.addNewWorkspaceLabel": "Adicionar uma nova área de trabalho",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index f5beac6b3..3d14d5414 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "A cache do Ferdi está a usar {size} de espaço em disco.", 255 "settings.app.cacheInfo": "A cache do Ferdi está a usar {size} de espaço em disco.",
256 "settings.app.currentVersion": "Versão atual", 256 "settings.app.currentVersion": "Versão atual",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Abrir em segundo plano", 259 "settings.app.form.autoLaunchInBackground": "Abrir em segundo plano",
259 "settings.app.form.autoLaunchOnStart": "Iniciar o Ferdi após iniciar o computador", 260 "settings.app.form.autoLaunchOnStart": "Iniciar o Ferdi após iniciar o computador",
260 "settings.app.form.beta": "Incluir versões instáveis (beta)", 261 "settings.app.form.beta": "Incluir versões instáveis (beta)",
diff --git a/src/i18n/locales/ro.json b/src/i18n/locales/ro.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/ro.json
+++ b/src/i18n/locales/ro.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index b329522f4..5d3636d9e 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "КÑш занимает {size} на диÑке.", 255 "settings.app.cacheInfo": "КÑш занимает {size} на диÑке.",
256 "settings.app.currentVersion": "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ:", 256 "settings.app.currentVersion": "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Открывать в фоне", 259 "settings.app.form.autoLaunchInBackground": "Открывать в фоне",
259 "settings.app.form.autoLaunchOnStart": "ЗапуÑкать Ferdi при Ñтарте", 260 "settings.app.form.autoLaunchOnStart": "ЗапуÑкать Ferdi при Ñтарте",
260 "settings.app.form.beta": "Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÑ‚Ð° верÑии", 261 "settings.app.form.beta": "Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÑ‚Ð° верÑии",
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index 0b4c0d3fa..b9805e2a6 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Vyrovnávacia pamäť Ferdi momentálne používa {size} miesta na disku.", 255 "settings.app.cacheInfo": "Vyrovnávacia pamäť Ferdi momentálne používa {size} miesta na disku.",
256 "settings.app.currentVersion": "SúÄasná verzia:", 256 "settings.app.currentVersion": "SúÄasná verzia:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Otvoriť na pozadí", 259 "settings.app.form.autoLaunchInBackground": "Otvoriť na pozadí",
259 "settings.app.form.autoLaunchOnStart": "Spustiť Ferdi pri štarte", 260 "settings.app.form.autoLaunchOnStart": "Spustiť Ferdi pri štarte",
260 "settings.app.form.beta": "Vrátane beta verzií", 261 "settings.app.form.beta": "Vrátane beta verzií",
diff --git a/src/i18n/locales/sl.json b/src/i18n/locales/sl.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/sl.json
+++ b/src/i18n/locales/sl.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index 1190fee0a..f1257ac1e 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Франз кеш тренутно кориÑти {величина} проÑтора на диÑку.", 255 "settings.app.cacheInfo": "Франз кеш тренутно кориÑти {величина} проÑтора на диÑку.",
256 "settings.app.currentVersion": "Trenutna verzija:", 256 "settings.app.currentVersion": "Trenutna verzija:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Otvori u pozadini", 259 "settings.app.form.autoLaunchInBackground": "Otvori u pozadini",
259 "settings.app.form.autoLaunchOnStart": "Pokreni Ferdi sa sistemom", 260 "settings.app.form.autoLaunchOnStart": "Pokreni Ferdi sa sistemom",
260 "settings.app.form.beta": "Obuhvati i beta verzije", 261 "settings.app.form.beta": "Obuhvati i beta verzije",
diff --git a/src/i18n/locales/sv.json b/src/i18n/locales/sv.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/sv.json
+++ b/src/i18n/locales/sv.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 8e55a66f9..34c406981 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi önbelleği şu anda {size} disk alanı kullanıyor.", 255 "settings.app.cacheInfo": "Ferdi önbelleği şu anda {size} disk alanı kullanıyor.",
256 "settings.app.currentVersion": "Geçerli sürüm:", 256 "settings.app.currentVersion": "Geçerli sürüm:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Arka planda aç", 259 "settings.app.form.autoLaunchInBackground": "Arka planda aç",
259 "settings.app.form.autoLaunchOnStart": "Ferdi'ı başlangıçta aç", 260 "settings.app.form.autoLaunchOnStart": "Ferdi'ı başlangıçta aç",
260 "settings.app.form.beta": "Beta versiyonları dahil et", 261 "settings.app.form.beta": "Beta versiyonları dahil et",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 1deed25fe..c1657b2c0 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Кеш, Ñкий викориÑтовує Ferdi, займає {size} диÑкового проÑтору.", 255 "settings.app.cacheInfo": "Кеш, Ñкий викориÑтовує Ferdi, займає {size} диÑкового проÑтору.",
256 "settings.app.currentVersion": "Поточна верÑÑ–Ñ:", 256 "settings.app.currentVersion": "Поточна верÑÑ–Ñ:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Відкрити у фоновому режимі", 259 "settings.app.form.autoLaunchInBackground": "Відкрити у фоновому режимі",
259 "settings.app.form.autoLaunchOnStart": "ЗапуÑкати Ferdi на початку", 260 "settings.app.form.autoLaunchOnStart": "ЗапуÑкати Ferdi на початку",
260 "settings.app.form.beta": "Включити бета-верÑÑ–Ñ—", 261 "settings.app.form.beta": "Включити бета-верÑÑ–Ñ—",
diff --git a/src/i18n/locales/vi.json b/src/i18n/locales/vi.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/vi.json
+++ b/src/i18n/locales/vi.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/locales/zh-HANT.json b/src/i18n/locales/zh-HANT.json
index 872bfd9d7..fd1ea9977 100644
--- a/src/i18n/locales/zh-HANT.json
+++ b/src/i18n/locales/zh-HANT.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "當å‰ç‰ˆæœ¬ï¼š", 256 "settings.app.currentVersion": "當å‰ç‰ˆæœ¬ï¼š",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "背景啟動", 259 "settings.app.form.autoLaunchInBackground": "背景啟動",
259 "settings.app.form.autoLaunchOnStart": "開機時啟動", 260 "settings.app.form.autoLaunchOnStart": "開機時啟動",
260 "settings.app.form.beta": "包å«é–‹ç™¼ä¸­ç‰ˆæœ¬", 261 "settings.app.form.beta": "包å«é–‹ç™¼ä¸­ç‰ˆæœ¬",
diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json
index edcc67771..8eb2053bc 100644
--- a/src/i18n/locales/zh.json
+++ b/src/i18n/locales/zh.json
@@ -255,6 +255,7 @@
255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 255 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
256 "settings.app.currentVersion": "Current version:", 256 "settings.app.currentVersion": "Current version:",
257 "settings.app.form.accentColor": "Accent color", 257 "settings.app.form.accentColor": "Accent color",
258 "settings.app.form.adaptableDarkMode": "Enable adaptable Dark Mode",
258 "settings.app.form.autoLaunchInBackground": "Open in background", 259 "settings.app.form.autoLaunchInBackground": "Open in background",
259 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 260 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
260 "settings.app.form.beta": "Include beta versions", 261 "settings.app.form.beta": "Include beta versions",
diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
index 70c4fb87f..5bf9f0b31 100644
--- a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
+++ b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Settings", 4 "defaultMessage": "!!!Settings",
5 "file": "src/components/settings/settings/EditSettingsForm.js", 5 "file": "src/components/settings/settings/EditSettingsForm.js",
6 "start": { 6 "start": {
7 "line": 26, 7 "line": 27,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 29, 11 "line": 30,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!General", 17 "defaultMessage": "!!!General",
18 "file": "src/components/settings/settings/EditSettingsForm.js", 18 "file": "src/components/settings/settings/EditSettingsForm.js",
19 "start": { 19 "start": {
20 "line": 30, 20 "line": 31,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 33, 24 "line": 34,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!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.", 30 "defaultMessage": "!!!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.",
31 "file": "src/components/settings/settings/EditSettingsForm.js", 31 "file": "src/components/settings/settings/EditSettingsForm.js",
32 "start": { 32 "start": {
33 "line": 34, 33 "line": 35,
34 "column": 17 34 "column": 17
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 37, 37 "line": 38,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!We advice you to logout after changing your server as your settings might not be saved otherwise.", 43 "defaultMessage": "!!!We advice you to logout after changing your server as your settings might not be saved otherwise.",
44 "file": "src/components/settings/settings/EditSettingsForm.js", 44 "file": "src/components/settings/settings/EditSettingsForm.js",
45 "start": { 45 "start": {
46 "line": 38, 46 "line": 39,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 41, 50 "line": 42,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!You are using the official Franz Server for Ferdi.\nWe know that Ferdi allows you to use all its features for free but you are still using Franz's server resources - which Franz's creator has to pay for.\nPlease still consider [Link 1]paying for a Franz account[/Link] or [Link 2]using a self-hosted ferdi-server[/Link] (if you have the knowledge and resources to do so). \nBy using Ferdi, you still profit greatly from Franz's recipe store, server resources and its development.", 56 "defaultMessage": "!!!You are using the official Franz Server for Ferdi.\nWe know that Ferdi allows you to use all its features for free but you are still using Franz's server resources - which Franz's creator has to pay for.\nPlease still consider [Link 1]paying for a Franz account[/Link] or [Link 2]using a self-hosted ferdi-server[/Link] (if you have the knowledge and resources to do so). \nBy using Ferdi, you still profit greatly from Franz's recipe store, server resources and its development.",
57 "file": "src/components/settings/settings/EditSettingsForm.js", 57 "file": "src/components/settings/settings/EditSettingsForm.js",
58 "start": { 58 "start": {
59 "line": 42, 59 "line": 43,
60 "column": 19 60 "column": 19
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 45, 63 "line": 46,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 69 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
70 "file": "src/components/settings/settings/EditSettingsForm.js", 70 "file": "src/components/settings/settings/EditSettingsForm.js",
71 "start": { 71 "start": {
72 "line": 46, 72 "line": 47,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 49, 76 "line": 50,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Ferdi Lock Password", 82 "defaultMessage": "!!!Ferdi Lock Password",
83 "file": "src/components/settings/settings/EditSettingsForm.js", 83 "file": "src/components/settings/settings/EditSettingsForm.js",
84 "start": { 84 "start": {
85 "line": 50, 85 "line": 51,
86 "column": 18 86 "column": 18
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 53, 89 "line": 54,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 95 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
96 "file": "src/components/settings/settings/EditSettingsForm.js", 96 "file": "src/components/settings/settings/EditSettingsForm.js",
97 "start": { 97 "start": {
98 "line": 54, 98 "line": 55,
99 "column": 22 99 "column": 22
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 57, 102 "line": 58,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Ferdi password lock allows you to keep your messages protected.\nUsing Ferdi 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.", 108 "defaultMessage": "!!!Ferdi password lock allows you to keep your messages protected.\nUsing Ferdi 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.",
109 "file": "src/components/settings/settings/EditSettingsForm.js", 109 "file": "src/components/settings/settings/EditSettingsForm.js",
110 "start": { 110 "start": {
111 "line": 58, 111 "line": 59,
112 "column": 12 112 "column": 12
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 61, 115 "line": 62,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!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.", 121 "defaultMessage": "!!!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.",
122 "file": "src/components/settings/settings/EditSettingsForm.js", 122 "file": "src/components/settings/settings/EditSettingsForm.js",
123 "start": { 123 "start": {
124 "line": 62, 124 "line": 63,
125 "column": 24 125 "column": 24
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 65, 128 "line": 66,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 134 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
135 "file": "src/components/settings/settings/EditSettingsForm.js", 135 "file": "src/components/settings/settings/EditSettingsForm.js",
136 "start": { 136 "start": {
137 "line": 66, 137 "line": 67,
138 "column": 20 138 "column": 20
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 69, 141 "line": 70,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Language", 147 "defaultMessage": "!!!Language",
148 "file": "src/components/settings/settings/EditSettingsForm.js", 148 "file": "src/components/settings/settings/EditSettingsForm.js",
149 "start": { 149 "start": {
150 "line": 70, 150 "line": 71,
151 "column": 20 151 "column": 20
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 73, 154 "line": 74,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Updates", 160 "defaultMessage": "!!!Updates",
161 "file": "src/components/settings/settings/EditSettingsForm.js", 161 "file": "src/components/settings/settings/EditSettingsForm.js",
162 "start": { 162 "start": {
163 "line": 74, 163 "line": 75,
164 "column": 19 164 "column": 19
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 77, 167 "line": 78,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Appearance", 173 "defaultMessage": "!!!Appearance",
174 "file": "src/components/settings/settings/EditSettingsForm.js", 174 "file": "src/components/settings/settings/EditSettingsForm.js",
175 "start": { 175 "start": {
176 "line": 78, 176 "line": 79,
177 "column": 22 177 "column": 22
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 81, 180 "line": 82,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 186 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
187 "file": "src/components/settings/settings/EditSettingsForm.js", 187 "file": "src/components/settings/settings/EditSettingsForm.js",
188 "start": { 188 "start": {
189 "line": 82, 189 "line": 83,
190 "column": 25 190 "column": 25
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 85, 193 "line": 86,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)", 199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)",
200 "file": "src/components/settings/settings/EditSettingsForm.js", 200 "file": "src/components/settings/settings/EditSettingsForm.js",
201 "start": { 201 "start": {
202 "line": 86, 202 "line": 87,
203 "column": 19 203 "column": 19
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 89, 206 "line": 90,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Advanced", 212 "defaultMessage": "!!!Advanced",
213 "file": "src/components/settings/settings/EditSettingsForm.js", 213 "file": "src/components/settings/settings/EditSettingsForm.js",
214 "start": { 214 "start": {
215 "line": 90, 215 "line": 91,
216 "column": 20 216 "column": 20
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 93, 219 "line": 94,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 225 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
226 "file": "src/components/settings/settings/EditSettingsForm.js", 226 "file": "src/components/settings/settings/EditSettingsForm.js",
227 "start": { 227 "start": {
228 "line": 94, 228 "line": 95,
229 "column": 19 229 "column": 19
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 97, 232 "line": 98,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Cache", 238 "defaultMessage": "!!!Cache",
239 "file": "src/components/settings/settings/EditSettingsForm.js", 239 "file": "src/components/settings/settings/EditSettingsForm.js",
240 "start": { 240 "start": {
241 "line": 98, 241 "line": 99,
242 "column": 20 242 "column": 20
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 101, 245 "line": 102,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 251 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
252 "file": "src/components/settings/settings/EditSettingsForm.js", 252 "file": "src/components/settings/settings/EditSettingsForm.js",
253 "start": { 253 "start": {
254 "line": 102, 254 "line": 103,
255 "column": 13 255 "column": 13
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 105, 258 "line": 106,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Clear cache", 264 "defaultMessage": "!!!Clear cache",
265 "file": "src/components/settings/settings/EditSettingsForm.js", 265 "file": "src/components/settings/settings/EditSettingsForm.js",
266 "start": { 266 "start": {
267 "line": 106, 267 "line": 107,
268 "column": 23 268 "column": 23
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 109, 271 "line": 110,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Check for updates", 277 "defaultMessage": "!!!Check for updates",
278 "file": "src/components/settings/settings/EditSettingsForm.js", 278 "file": "src/components/settings/settings/EditSettingsForm.js",
279 "start": { 279 "start": {
280 "line": 110, 280 "line": 111,
281 "column": 25 281 "column": 25
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 113, 284 "line": 114,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Restart & install update", 290 "defaultMessage": "!!!Restart & install update",
291 "file": "src/components/settings/settings/EditSettingsForm.js", 291 "file": "src/components/settings/settings/EditSettingsForm.js",
292 "start": { 292 "start": {
293 "line": 114, 293 "line": 115,
294 "column": 23 294 "column": 23
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 117, 297 "line": 118,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Is searching for update", 303 "defaultMessage": "!!!Is searching for update",
304 "file": "src/components/settings/settings/EditSettingsForm.js", 304 "file": "src/components/settings/settings/EditSettingsForm.js",
305 "start": { 305 "start": {
306 "line": 118, 306 "line": 119,
307 "column": 25 307 "column": 25
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 121, 310 "line": 122,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Update available, downloading...", 316 "defaultMessage": "!!!Update available, downloading...",
317 "file": "src/components/settings/settings/EditSettingsForm.js", 317 "file": "src/components/settings/settings/EditSettingsForm.js",
318 "start": { 318 "start": {
319 "line": 122, 319 "line": 123,
320 "column": 25 320 "column": 25
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 125, 323 "line": 126,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!You are using the latest version of Ferdi", 329 "defaultMessage": "!!!You are using the latest version of Ferdi",
330 "file": "src/components/settings/settings/EditSettingsForm.js", 330 "file": "src/components/settings/settings/EditSettingsForm.js",
331 "start": { 331 "start": {
332 "line": 126, 332 "line": 127,
333 "column": 24 333 "column": 24
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 129, 336 "line": 130,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Current version:", 342 "defaultMessage": "!!!Current version:",
343 "file": "src/components/settings/settings/EditSettingsForm.js", 343 "file": "src/components/settings/settings/EditSettingsForm.js",
344 "start": { 344 "start": {
345 "line": 130, 345 "line": 131,
346 "column": 18 346 "column": 18
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 133, 349 "line": 134,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Changes require restart", 355 "defaultMessage": "!!!Changes require restart",
356 "file": "src/components/settings/settings/EditSettingsForm.js", 356 "file": "src/components/settings/settings/EditSettingsForm.js",
357 "start": { 357 "start": {
358 "line": 134, 358 "line": 135,
359 "column": 29 359 "column": 29
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 137, 362 "line": 138,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 368 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
369 "file": "src/components/settings/settings/EditSettingsForm.js", 369 "file": "src/components/settings/settings/EditSettingsForm.js",
370 "start": { 370 "start": {
371 "line": 138, 371 "line": 139,
372 "column": 22 372 "column": 22
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 141, 375 "line": 142,
376 "column": 3 376 "column": 3
377 } 377 }
378 } 378 }
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index 5ec8fdba7..411e35dab 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -234,8 +234,8 @@
234 } 234 }
235 }, 235 },
236 { 236 {
237 "id": "settings.app.form.universalDarkMode", 237 "id": "settings.app.form.adaptableDarkMode",
238 "defaultMessage": "!!!Enable universal Dark Mode", 238 "defaultMessage": "!!!Enable adaptable Dark Mode",
239 "file": "src/containers/settings/EditSettingsScreen.js", 239 "file": "src/containers/settings/EditSettingsScreen.js",
240 "start": { 240 "start": {
241 "line": 101, 241 "line": 101,
@@ -247,15 +247,28 @@
247 } 247 }
248 }, 248 },
249 { 249 {
250 "id": "settings.app.form.universalDarkMode",
251 "defaultMessage": "!!!Enable universal Dark Mode",
252 "file": "src/containers/settings/EditSettingsScreen.js",
253 "start": {
254 "line": 105,
255 "column": 21
256 },
257 "end": {
258 "line": 108,
259 "column": 3
260 }
261 },
262 {
250 "id": "settings.app.form.accentColor", 263 "id": "settings.app.form.accentColor",
251 "defaultMessage": "!!!Accent color", 264 "defaultMessage": "!!!Accent color",
252 "file": "src/containers/settings/EditSettingsScreen.js", 265 "file": "src/containers/settings/EditSettingsScreen.js",
253 "start": { 266 "start": {
254 "line": 105, 267 "line": 109,
255 "column": 15 268 "column": 15
256 }, 269 },
257 "end": { 270 "end": {
258 "line": 108, 271 "line": 112,
259 "column": 3 272 "column": 3
260 } 273 }
261 }, 274 },
@@ -264,11 +277,11 @@
264 "defaultMessage": "!!!Display disabled services tabs", 277 "defaultMessage": "!!!Display disabled services tabs",
265 "file": "src/containers/settings/EditSettingsScreen.js", 278 "file": "src/containers/settings/EditSettingsScreen.js",
266 "start": { 279 "start": {
267 "line": 109, 280 "line": 113,
268 "column": 24 281 "column": 24
269 }, 282 },
270 "end": { 283 "end": {
271 "line": 112, 284 "line": 116,
272 "column": 3 285 "column": 3
273 } 286 }
274 }, 287 },
@@ -277,11 +290,11 @@
277 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 290 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
278 "file": "src/containers/settings/EditSettingsScreen.js", 291 "file": "src/containers/settings/EditSettingsScreen.js",
279 "start": { 292 "start": {
280 "line": 113, 293 "line": 117,
281 "column": 29 294 "column": 29
282 }, 295 },
283 "end": { 296 "end": {
284 "line": 116, 297 "line": 120,
285 "column": 3 298 "column": 3
286 } 299 }
287 }, 300 },
@@ -290,11 +303,11 @@
290 "defaultMessage": "!!!Enable spell checking", 303 "defaultMessage": "!!!Enable spell checking",
291 "file": "src/containers/settings/EditSettingsScreen.js", 304 "file": "src/containers/settings/EditSettingsScreen.js",
292 "start": { 305 "start": {
293 "line": 117, 306 "line": 121,
294 "column": 23 307 "column": 23
295 }, 308 },
296 "end": { 309 "end": {
297 "line": 120, 310 "line": 124,
298 "column": 3 311 "column": 3
299 } 312 }
300 }, 313 },
@@ -303,11 +316,11 @@
303 "defaultMessage": "!!!Enable GPU Acceleration", 316 "defaultMessage": "!!!Enable GPU Acceleration",
304 "file": "src/containers/settings/EditSettingsScreen.js", 317 "file": "src/containers/settings/EditSettingsScreen.js",
305 "start": { 318 "start": {
306 "line": 121, 319 "line": 125,
307 "column": 25 320 "column": 25
308 }, 321 },
309 "end": { 322 "end": {
310 "line": 124, 323 "line": 128,
311 "column": 3 324 "column": 3
312 } 325 }
313 }, 326 },
@@ -316,11 +329,11 @@
316 "defaultMessage": "!!!Include beta versions", 329 "defaultMessage": "!!!Include beta versions",
317 "file": "src/containers/settings/EditSettingsScreen.js", 330 "file": "src/containers/settings/EditSettingsScreen.js",
318 "start": { 331 "start": {
319 "line": 125, 332 "line": 129,
320 "column": 8 333 "column": 8
321 }, 334 },
322 "end": { 335 "end": {
323 "line": 128, 336 "line": 132,
324 "column": 3 337 "column": 3
325 } 338 }
326 }, 339 },
@@ -329,11 +342,11 @@
329 "defaultMessage": "!!!Disable updates", 342 "defaultMessage": "!!!Disable updates",
330 "file": "src/containers/settings/EditSettingsScreen.js", 343 "file": "src/containers/settings/EditSettingsScreen.js",
331 "start": { 344 "start": {
332 "line": 129, 345 "line": 133,
333 "column": 13 346 "column": 13
334 }, 347 },
335 "end": { 348 "end": {
336 "line": 132, 349 "line": 136,
337 "column": 3 350 "column": 3
338 } 351 }
339 }, 352 },
@@ -342,11 +355,11 @@
342 "defaultMessage": "!!!Enable Franz Todos", 355 "defaultMessage": "!!!Enable Franz Todos",
343 "file": "src/containers/settings/EditSettingsScreen.js", 356 "file": "src/containers/settings/EditSettingsScreen.js",
344 "start": { 357 "start": {
345 "line": 133, 358 "line": 137,
346 "column": 15 359 "column": 15
347 }, 360 },
348 "end": { 361 "end": {
349 "line": 136, 362 "line": 140,
350 "column": 3 363 "column": 3
351 } 364 }
352 }, 365 },
@@ -355,11 +368,11 @@
355 "defaultMessage": "!!!Keep all workspaces loaded", 368 "defaultMessage": "!!!Keep all workspaces loaded",
356 "file": "src/containers/settings/EditSettingsScreen.js", 369 "file": "src/containers/settings/EditSettingsScreen.js",
357 "start": { 370 "start": {
358 "line": 137, 371 "line": 141,
359 "column": 27 372 "column": 27
360 }, 373 },
361 "end": { 374 "end": {
362 "line": 140, 375 "line": 144,
363 "column": 3 376 "column": 3
364 } 377 }
365 } 378 }
diff --git a/src/index.html b/src/index.html
index 7f223b662..31e8aa553 100644
--- a/src/index.html
+++ b/src/index.html
@@ -14,6 +14,7 @@
14 <script> 14 <script>
15 document.querySelector('body').classList.add(process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform); 15 document.querySelector('body').classList.add(process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform);
16 16
17 require('./sentry')
17 const { isDevMode } = require('./environment'); 18 const { isDevMode } = require('./environment');
18 if (isDevMode) { 19 if (isDevMode) {
19 const debugging = require('debug'); 20 const debugging = require('debug');
diff --git a/src/index.js b/src/index.js
index 87aa6357b..12ea7f646 100644
--- a/src/index.js
+++ b/src/index.js
@@ -9,9 +9,16 @@ import fs from 'fs-extra';
9import path from 'path'; 9import path from 'path';
10import windowStateKeeper from 'electron-window-state'; 10import windowStateKeeper from 'electron-window-state';
11 11
12if (process.platform === 'win32') { 12// Set app directory before loading user modules
13 app.setPath('appData', process.env.LOCALAPPDATA); 13if (process.env.FERDI_APPDATA_DIR != null) {
14 app.setPath('userData', path.join(process.env.LOCALAPPDATA, app.getName())); 14 app.setPath('appData', process.env.FERDI_APPDATA_DIR);
15 app.setPath('userData', path.join(app.getPath('appData')));
16} else if (process.env.PORTABLE_EXECUTABLE_DIR != null) {
17 app.setPath('appData', process.env.PORTABLE_EXECUTABLE_DIR, `${app.getName()}AppData`);
18 app.setPath('userData', path.join(app.getPath('appData'), `${app.getName()}AppData`));
19} else if (process.platform === 'win32') {
20 app.setPath('appData', process.env.APPDATA);
21 app.setPath('userData', path.join(app.getPath('appData'), app.getName()));
15} 22}
16 23
17if (isDevMode) { 24if (isDevMode) {
@@ -32,6 +39,7 @@ import handleDeepLink from './electron/deepLinking';
32import { isPositionValid } from './electron/windowUtils'; 39import { isPositionValid } from './electron/windowUtils';
33import { appId } from './package.json'; // eslint-disable-line import/no-unresolved 40import { appId } from './package.json'; // eslint-disable-line import/no-unresolved
34import './electron/exception'; 41import './electron/exception';
42import './sentry';
35 43
36import { 44import {
37 DEFAULT_APP_SETTINGS, 45 DEFAULT_APP_SETTINGS,
@@ -166,6 +174,7 @@ const createWindow = () => {
166 webPreferences: { 174 webPreferences: {
167 nodeIntegration: true, 175 nodeIntegration: true,
168 webviewTag: true, 176 webviewTag: true,
177 preload: path.join(__dirname, 'sentry.js'),
169 }, 178 },
170 }); 179 });
171 180
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index d7398a126..826fe843f 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -487,7 +487,8 @@ const _templateFactory = intl => [
487 487
488const _titleBarTemplateFactory = intl => [ 488const _titleBarTemplateFactory = intl => [
489 { 489 {
490 label: `&${intl.formatMessage(menuItems.edit)}`, 490 label: intl.formatMessage(menuItems.edit),
491 accelerator: 'Alt+E',
491 submenu: [ 492 submenu: [
492 { 493 {
493 label: intl.formatMessage(menuItems.undo), 494 label: intl.formatMessage(menuItems.undo),
@@ -550,7 +551,8 @@ const _titleBarTemplateFactory = intl => [
550 ], 551 ],
551 }, 552 },
552 { 553 {
553 label: `&${intl.formatMessage(menuItems.view)}`, 554 label: intl.formatMessage(menuItems.view),
555 accelerator: 'Alt+V',
554 submenu: [ 556 submenu: [
555 { 557 {
556 type: 'separator', 558 type: 'separator',
@@ -641,11 +643,13 @@ const _titleBarTemplateFactory = intl => [
641 ], 643 ],
642 }, 644 },
643 { 645 {
644 label: `&${intl.formatMessage(menuItems.services)}`, 646 label: intl.formatMessage(menuItems.services),
647 accelerator: 'Alt+S',
645 submenu: [], 648 submenu: [],
646 }, 649 },
647 { 650 {
648 label: `&${intl.formatMessage(menuItems.workspaces)}`, 651 label: intl.formatMessage(menuItems.workspaces),
652 accelerator: 'Alt+W',
649 submenu: [], 653 submenu: [],
650 visible: workspaceStore.isFeatureEnabled, 654 visible: workspaceStore.isFeatureEnabled,
651 }, 655 },
@@ -674,7 +678,8 @@ const _titleBarTemplateFactory = intl => [
674 ], 678 ],
675 }, 679 },
676 { 680 {
677 label: '&?', 681 label: '?',
682 accelerator: 'Alt+?',
678 submenu: [ 683 submenu: [
679 { 684 {
680 label: intl.formatMessage(menuItems.learnMore), 685 label: intl.formatMessage(menuItems.learnMore),
@@ -816,7 +821,8 @@ export default class FranzMenu {
816 }); 821 });
817 822
818 tpl.unshift({ 823 tpl.unshift({
819 label: isMac ? app.getName() : `&${intl.formatMessage(menuItems.file)}`, 824 label: isMac ? app.getName() : intl.formatMessage(menuItems.file),
825 accelerator: 'Alt+F',
820 submenu: [ 826 submenu: [
821 { 827 {
822 label: intl.formatMessage(menuItems.about), 828 label: intl.formatMessage(menuItems.about),
diff --git a/src/sentry.js b/src/sentry.js
new file mode 100644
index 000000000..4f6d7205d
--- /dev/null
+++ b/src/sentry.js
@@ -0,0 +1,5 @@
1import * as Sentry from '@sentry/electron';
2
3Sentry.init({
4 dsn: 'https://f3d022fbcf6243a68a58d681c2122ee4@sentry.io/1803053',
5});
diff --git a/src/server b/src/server
Subproject b5973cdc4cdd60e61d2fba25a317bb4d216a0d1 Subproject cca6cd984caf729722153e58f44c01319c4bd63
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index c6724c20f..0756a05eb 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -181,7 +181,9 @@ export default class AppStore extends Store {
181 181
182 this.locale = this._getDefaultLocale(); 182 this.locale = this._getDefaultLocale();
183 183
184 this._healthCheck(); 184 setTimeout(() => {
185 this._healthCheck();
186 }, 1000);
185 187
186 this.isSystemDarkModeEnabled = systemPreferences.isDarkMode(); 188 this.isSystemDarkModeEnabled = systemPreferences.isDarkMode();
187 189
@@ -227,20 +229,35 @@ export default class AppStore extends Store {
227 } 229 }
228 230
229 @computed get debugInfo() { 231 @computed get debugInfo() {
232 const settings = JSON.parse(JSON.stringify(this.stores.settings.app));
233 settings.lockedPassword = '******';
234
230 return { 235 return {
231 host: { 236 host: {
232 platform: process.platform, 237 platform: process.platform,
233 release: os.release(), 238 release: os.release(),
234 screens: screen.getAllDisplays(), 239 screens: screen.getAllDisplays(),
235 }, 240 },
236 franz: { 241 ferdi: {
237 version: app.getVersion(), 242 version: app.getVersion(),
238 electron: process.versions.electron, 243 electron: process.versions.electron,
239 installedRecipes: this.stores.recipes.all.map(recipe => ({ id: recipe.id, version: recipe.version })), 244 installedRecipes: this.stores.recipes.all.map(recipe => ({ id: recipe.id, version: recipe.version })),
240 devRecipes: this.stores.recipePreviews.dev.map(recipe => ({ id: recipe.id, version: recipe.version })), 245 devRecipes: this.stores.recipePreviews.dev.map(recipe => ({ id: recipe.id, version: recipe.version })),
241 services: this.stores.services.all.map(service => ({ id: service.id, recipe: service.recipe.id })), 246 services: this.stores.services.all.map(service => ({
247 id: service.id,
248 recipe: service.recipe.id,
249 isAttached: service.isAttached,
250 isActive: service.isActive,
251 isEnabled: service.isEnabled,
252 isHibernating: service.isHibernating,
253 hasCrashed: service.hasCrashed,
254 isDarkModeEnabled: service.isDarkModeEnabled,
255 })),
256 messages: this.stores.globalError.messages,
242 workspaces: this.stores.workspaces.workspaces.map(workspace => ({ id: workspace.id, services: workspace.services })), 257 workspaces: this.stores.workspaces.workspaces.map(workspace => ({ id: workspace.id, services: workspace.services })),
243 windowSettings: readJsonSync(path.join(app.getPath('userData'), 'window-state.json')), 258 windowSettings: readJsonSync(path.join(app.getPath('userData'), 'window-state.json')),
259 settings,
260 features: this.stores.features.features,
244 user: this.stores.user.data.id, 261 user: this.stores.user.data.id,
245 }, 262 },
246 }; 263 };
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index ab5d762c7..780cde3a7 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -57,7 +57,10 @@ export default class FeaturesStore extends Store {
57 _updateFeatures = () => { 57 _updateFeatures = () => {
58 const features = Object.assign({}, DEFAULT_FEATURES_CONFIG); 58 const features = Object.assign({}, DEFAULT_FEATURES_CONFIG);
59 if (this.stores.user.isLoggedIn) { 59 if (this.stores.user.isLoggedIn) {
60 const requestResult = this.featuresRequest.execute().result; 60 let requestResult = {};
61 try {
62 requestResult = this.featuresRequest.execute().result;
63 } catch (e) {} // eslint-disable-line no-empty
61 Object.assign(features, requestResult); 64 Object.assign(features, requestResult);
62 } 65 }
63 runInAction('FeaturesStore::_updateFeatures', () => { 66 runInAction('FeaturesStore::_updateFeatures', () => {
diff --git a/src/stores/GlobalErrorStore.js b/src/stores/GlobalErrorStore.js
index 8bdafb68c..aacaa247f 100644
--- a/src/stores/GlobalErrorStore.js
+++ b/src/stores/GlobalErrorStore.js
@@ -5,14 +5,54 @@ import Request from './lib/Request';
5export default class GlobalErrorStore extends Store { 5export default class GlobalErrorStore extends Store {
6 @observable error = null; 6 @observable error = null;
7 7
8 @observable messages = [];
9
8 @observable response = {}; 10 @observable response = {};
9 11
10 constructor(...args) { 12 constructor(...args) {
11 super(...args); 13 super(...args);
12 14
15 window.onerror = (...errorArgs) => {
16 this._handleConsoleError.call(this, ['error', ...errorArgs]);
17 };
18
19 const origConsoleError = console.error;
20 window.console.error = (...errorArgs) => {
21 this._handleConsoleError.call(this, ['error', ...errorArgs]);
22 origConsoleError.apply(this, errorArgs);
23 };
24
25 const origConsoleLog = console.log;
26 window.console.log = (...logArgs) => {
27 this._handleConsoleError.call(this, ['log', ...logArgs]);
28 origConsoleLog.apply(this, logArgs);
29 };
30
31 const origConsoleInfo = console.info;
32 window.console.info = (...infoArgs) => {
33 this._handleConsoleError.call(this, ['info', ...infoArgs]);
34 origConsoleInfo.apply(this, infoArgs);
35 };
36
13 Request.registerHook(this._handleRequests); 37 Request.registerHook(this._handleRequests);
14 } 38 }
15 39
40 _handleConsoleError(type, error, url, line) {
41 if (typeof type === 'object' && type.length && type.length >= 1) {
42 this.messages.push({
43 type: type[0],
44 info: type,
45 });
46 } else {
47 this.messages.push({
48 type,
49 error,
50 url,
51 line,
52 });
53 }
54 }
55
16 _handleRequests = action(async (request) => { 56 _handleRequests = action(async (request) => {
17 if (request.isError) { 57 if (request.isError) {
18 this.error = request.error; 58 this.error = request.error;
@@ -28,6 +68,18 @@ export default class GlobalErrorStore extends Store {
28 // this.actions.user.logout({ serverLogout: true }); 68 // this.actions.user.logout({ serverLogout: true });
29 } 69 }
30 } 70 }
71
72 this.messages.push({
73 type: 'error',
74 request: {
75 result: request.result,
76 wasExecuted: request.wasExecuted,
77 method: request._method,
78 },
79 error: this.error,
80 response: this.response,
81 server: window.ferdi.stores.settings.app.server,
82 });
31 } else { 83 } else {
32 window.ferdi.stores.app.authRequestFailed = false; 84 window.ferdi.stores.app.authRequestFailed = false;
33 } 85 }
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 934a8a6e0..3dd601bc3 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -116,6 +116,11 @@ export default class ServicesStore extends Store {
116 ); 116 );
117 117
118 reaction( 118 reaction(
119 () => this.stores.settings.app.adaptableDarkMode,
120 () => this._shareSettingsWithServiceProcess(),
121 );
122
123 reaction(
119 () => this.stores.settings.app.universalDarkMode, 124 () => this.stores.settings.app.universalDarkMode,
120 () => this._shareSettingsWithServiceProcess(), 125 () => this._shareSettingsWithServiceProcess(),
121 ); 126 );
@@ -585,7 +590,8 @@ export default class ServicesStore extends Store {
585 590
586 service.resetMessageCount(); 591 service.resetMessageCount();
587 592
588 service.webview.loadURL(service.url); 593 // service.webview.loadURL(service.url);
594 service.webview.reload();
589 } 595 }
590 596
591 @action _reloadActive() { 597 @action _reloadActive() {
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index 9680c5bcc..44bc7c974 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -5,12 +5,18 @@ import {
5 reaction, 5 reaction,
6} from 'mobx'; 6} from 'mobx';
7import { theme } from '@meetfranz/theme'; 7import { theme } from '@meetfranz/theme';
8import { remote } from 'electron';
8 9
9import Store from './lib/Store'; 10import Store from './lib/Store';
11import { isMac } from '../environment';
12
13const { systemPreferences } = remote;
10 14
11export default class UIStore extends Store { 15export default class UIStore extends Store {
12 @observable showServicesUpdatedInfoBar = false; 16 @observable showServicesUpdatedInfoBar = false;
13 17
18 @observable isOsDarkThemeActive = isMac ? systemPreferences.isDarkMode() : false;
19
14 constructor(...args) { 20 constructor(...args) {
15 super(...args); 21 super(...args);
16 22
@@ -18,6 +24,13 @@ export default class UIStore extends Store {
18 this.actions.ui.openSettings.listen(this._openSettings.bind(this)); 24 this.actions.ui.openSettings.listen(this._openSettings.bind(this));
19 this.actions.ui.closeSettings.listen(this._closeSettings.bind(this)); 25 this.actions.ui.closeSettings.listen(this._closeSettings.bind(this));
20 this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this)); 26 this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this));
27
28 // Listen for theme change on MacOS
29 if (isMac) {
30 systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', () => {
31 this.isOsDarkThemeActive = systemPreferences.isDarkMode();
32 });
33 }
21 } 34 }
22 35
23 setup() { 36 setup() {
@@ -35,7 +48,7 @@ export default class UIStore extends Store {
35 } 48 }
36 49
37 @computed get isDarkThemeActive() { 50 @computed get isDarkThemeActive() {
38 return this.stores.settings.all.app.darkMode; 51 return this.stores.settings.all.app.darkMode || (this.stores.settings.all.app.adaptableDarkMode && this.isOsDarkThemeActive);
39 } 52 }
40 53
41 @computed get theme() { 54 @computed get theme() {
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index d6a2e5fde..ec0b0cf8d 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -348,7 +348,12 @@ export default class UserStore extends Store {
348 // Reactions 348 // Reactions
349 async _getUserData() { 349 async _getUserData() {
350 if (this.isLoggedIn) { 350 if (this.isLoggedIn) {
351 const data = await this.getUserInfoRequest.execute()._promise; 351 let data;
352 try {
353 data = await this.getUserInfoRequest.execute()._promise;
354 } catch (e) {
355 return false;
356 }
352 357
353 // We need to set the beta flag for the SettingsStore 358 // We need to set the beta flag for the SettingsStore
354 this.actions.settings.update({ 359 this.actions.settings.update({
@@ -408,7 +413,11 @@ export default class UserStore extends Store {
408 } 413 }
409 414
410 async _migrateUserLocale() { 415 async _migrateUserLocale() {
411 await this.getUserInfoRequest._promise; 416 try {
417 await this.getUserInfoRequest._promise;
418 } catch (e) {
419 return false;
420 }
412 421
413 if (!this.data.locale) { 422 if (!this.data.locale) {
414 debug('Migrate "locale" to user data'); 423 debug('Migrate "locale" to user data');
diff --git a/src/stores/lib/CachedRequest.js b/src/stores/lib/CachedRequest.js
index ac8b2bd81..31c7ce241 100644
--- a/src/stores/lib/CachedRequest.js
+++ b/src/stores/lib/CachedRequest.js
@@ -39,7 +39,7 @@ export default class CachedRequest extends Request {
39 }), 0); 39 }), 0);
40 40
41 // Issue api call & save it as promise that is handled to update the results of the operation 41 // Issue api call & save it as promise that is handled to update the results of the operation
42 this._promise = new Promise((resolve, reject) => { 42 this._promise = new Promise((resolve) => {
43 this._api[this._method](...callArgs) 43 this._api[this._method](...callArgs)
44 .then((result) => { 44 .then((result) => {
45 setTimeout(action(() => { 45 setTimeout(action(() => {
@@ -63,7 +63,7 @@ export default class CachedRequest extends Request {
63 this.wasExecuted = true; 63 this.wasExecuted = true;
64 this._isWaitingForResponse = false; 64 this._isWaitingForResponse = false;
65 this._triggerHooks(); 65 this._triggerHooks();
66 reject(error); 66 // reject(error);
67 }), 1); 67 }), 1);
68 })); 68 }));
69 }); 69 });
diff --git a/src/styles/tabs.scss b/src/styles/tabs.scss
index e500830ed..5bd0555d2 100644
--- a/src/styles/tabs.scss
+++ b/src/styles/tabs.scss
@@ -72,6 +72,8 @@
72 font-size: 0px; 72 font-size: 0px;
73 min-height: 10px; 73 min-height: 10px;
74 min-width: 10px; 74 min-width: 10px;
75 right: auto;
76 left: 8px;
75 } 77 }
76 } 78 }
77 79
diff --git a/src/webview/recipe.js b/src/webview/recipe.js
index 2bf8f757a..1e290f8be 100644
--- a/src/webview/recipe.js
+++ b/src/webview/recipe.js
@@ -120,6 +120,7 @@ class RecipeController {
120 } 120 }
121 } 121 }
122 122
123 console.log('Set theme to: ', this.settings.service.isDarkModeEnabled ? 'Dark' : 'Light');
123 if (this.settings.service.isDarkModeEnabled) { 124 if (this.settings.service.isDarkModeEnabled) {
124 debug('Enable dark mode'); 125 debug('Enable dark mode');
125 126
@@ -127,9 +128,18 @@ class RecipeController {
127 const darkModeStyle = path.join(this.settings.service.recipe.path, 'darkmode.css'); 128 const darkModeStyle = path.join(this.settings.service.recipe.path, 'darkmode.css');
128 const darkModeExists = fs.pathExistsSync(darkModeStyle); 129 const darkModeExists = fs.pathExistsSync(darkModeStyle);
129 130
131 console.log('darkmode.css exists? ', darkModeExists ? 'Yes' : 'No');
132
130 if (darkModeExists) { 133 if (darkModeExists) {
134 console.log('Injecting darkmode.css');
131 injectDarkModeStyle(this.settings.service.recipe.path); 135 injectDarkModeStyle(this.settings.service.recipe.path);
136
137 // Make sure universal dark mode is disabled
138 disableDarkMode();
139 this.universalDarkModeInjected = false;
132 } else if (this.settings.app.universalDarkMode && !ignoreList.includes(window.location.host)) { 140 } else if (this.settings.app.universalDarkMode && !ignoreList.includes(window.location.host)) {
141 console.log('Injecting DarkReader');
142
133 // Use darkreader instead 143 // Use darkreader instead
134 enableDarkMode({}, { 144 enableDarkMode({}, {
135 css: customDarkModeCss[window.location.host] || '', 145 css: customDarkModeCss[window.location.host] || '',
@@ -138,10 +148,14 @@ class RecipeController {
138 } 148 }
139 } else { 149 } else {
140 debug('Remove dark mode'); 150 debug('Remove dark mode');
151 console.log('DarkMode disabled - removing remaining styles');
141 152
142 if (isDarkModeStyleInjected()) { 153 if (isDarkModeStyleInjected()) {
154 console.log('Removing injected darkmode.css');
143 removeDarkModeStyle(); 155 removeDarkModeStyle();
144 } else { 156 } else {
157 console.log('Removing DarkReader');
158
145 disableDarkMode(); 159 disableDarkMode();
146 this.universalDarkModeInjected = false; 160 this.universalDarkModeInjected = false;
147 } 161 }