aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2019-06-13 13:22:27 +0200
committerLibravatar Stefan Malzner <stefan@adlk.io>2019-06-13 13:22:27 +0200
commitf65677735b02326870ada2100b55222fa69a401d (patch)
tree53adfc38c0a493e5e8fef3211d0e82b7d164d9ff
parentEnforce service limit (diff)
parentMerge branch 'release/5.2.0-beta.2' (diff)
downloadferdium-app-f65677735b02326870ada2100b55222fa69a401d.tar.gz
ferdium-app-f65677735b02326870ada2100b55222fa69a401d.tar.zst
ferdium-app-f65677735b02326870ada2100b55222fa69a401d.zip
Merge branch 'develop' into feature/service-limit
-rw-r--r--.travis.yml2
-rw-r--r--CHANGELOG.md29
-rw-r--r--appveyor.yml3
-rw-r--r--package-lock.json766
-rw-r--r--package.json15
-rw-r--r--packages/forms/package.json6
-rw-r--r--packages/forms/src/button/index.tsx8
-rw-r--r--packages/forms/src/input/index.tsx4
-rw-r--r--packages/forms/src/typings/generic.ts1
-rw-r--r--packages/forms/src/wrapper/index.tsx9
-rw-r--r--packages/forms/src/wrapper/styles.ts5
-rw-r--r--packages/theme/package.json4
-rw-r--r--packages/theme/src/themes/dark/index.ts2
-rw-r--r--packages/ui/package.json6
-rw-r--r--src/actions/service.js1
-rw-r--r--src/app.js3
-rw-r--r--src/assets/images/tray/win32/tray-unread.icobin1150 -> 39006 bytes
-rw-r--r--src/assets/images/tray/win32/tray-unread@2x.icobin5430 -> 0 bytes
-rw-r--r--src/assets/images/tray/win32/tray.icobin1150 -> 33292 bytes
-rw-r--r--src/assets/images/tray/win32/tray@2x.icobin5430 -> 0 bytes
-rw-r--r--src/components/AppUpdateInfoBar.js66
-rw-r--r--src/components/auth/AuthLayout.js17
-rw-r--r--src/components/layout/AppLayout.js41
-rw-r--r--src/containers/auth/AuthLayoutContainer.js3
-rw-r--r--src/containers/layout/AppLayoutContainer.js2
-rw-r--r--src/containers/settings/AccountScreen.js1
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js1
-rw-r--r--src/containers/subscription/SubscriptionPopupScreen.js2
-rw-r--r--src/dev-app-update.yml3
-rw-r--r--src/features/announcements/components/AnnouncementScreen.js2
-rw-r--r--src/features/announcements/index.js4
-rw-r--r--src/features/announcements/store.js61
-rw-r--r--src/features/workspaces/store.js31
-rw-r--r--src/helpers/validation-helpers.js10
-rw-r--r--src/i18n/locales/ca.json17
-rw-r--r--src/i18n/locales/cs.json9
-rw-r--r--src/i18n/locales/de.json5
-rw-r--r--src/i18n/locales/defaultMessages.json184
-rw-r--r--src/i18n/locales/el.json1
-rw-r--r--src/i18n/locales/en-US.json1
-rw-r--r--src/i18n/locales/es.json37
-rw-r--r--src/i18n/locales/fr.json41
-rw-r--r--src/i18n/locales/ga.json1
-rw-r--r--src/i18n/locales/hr.json1
-rw-r--r--src/i18n/locales/hu.json21
-rw-r--r--src/i18n/locales/id.json1
-rw-r--r--src/i18n/locales/it.json89
-rw-r--r--src/i18n/locales/ja.json1
-rw-r--r--src/i18n/locales/ka.json1
-rw-r--r--src/i18n/locales/nl-BE.json1
-rw-r--r--src/i18n/locales/nl.json55
-rw-r--r--src/i18n/locales/pl.json87
-rw-r--r--src/i18n/locales/pt-BR.json91
-rw-r--r--src/i18n/locales/pt.json55
-rw-r--r--src/i18n/locales/ru.json1
-rw-r--r--src/i18n/locales/sk.json89
-rw-r--r--src/i18n/locales/sr.json1
-rw-r--r--src/i18n/locales/tr.json1
-rw-r--r--src/i18n/locales/uk.json1
-rw-r--r--src/i18n/locales/zh-TW.json1
-rw-r--r--src/i18n/messages/src/components/AppUpdateInfoBar.json41
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json51
-rw-r--r--src/i18n/messages/src/helpers/validation-helpers.json20
-rw-r--r--src/i18n/messages/src/lib/Menu.json69
-rw-r--r--src/index.html4
-rw-r--r--src/index.js11
-rw-r--r--src/lib/Menu.js15
-rw-r--r--src/models/Service.js5
-rw-r--r--src/stores/GlobalErrorStore.js7
-rw-r--r--src/stores/NewsStore.js12
-rw-r--r--src/stores/RecipesStore.js27
-rw-r--r--src/stores/ServicesStore.js32
-rw-r--r--src/stores/UserStore.js3
-rw-r--r--src/webview/contextMenu.js5
-rw-r--r--src/webview/recipe.js3
-rw-r--r--src/webview/spellchecker.js17
-rw-r--r--uidev/src/app.tsx2
-rw-r--r--uidev/src/stories/button.stories.tsx40
78 files changed, 1471 insertions, 794 deletions
diff --git a/.travis.yml b/.travis.yml
index 3be759099..c7e2c714c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -30,7 +30,7 @@ cache: npm
30notifications: 30notifications:
31 email: false 31 email: false
32 slack: 32 slack:
33 secure: NjEDG+6YvJvFNwRT8t8XyVR145m+Pb1pmYgdBeuhqtJbMAr0IOb0lLLW9ixKEsL1NU+0R58QGiG9qqY+lLnMNpDYjzluFo0gQtl2NJrULT4xUFDSu65XTwoutKyvj+hoCsHiwrSrO2dHTx3ZK2vsSueg+8jM/xss7dTLA6BcTYl14wTOU37PqFQZk9JYR+Dfq1Jjhy/mq4BiAsb/1clNIulkjmRjSm6R0XT4ZsZZfj0ifXhL4cLGsUv2n+iePiX6bLwZPFjXV1COYTBafbCu17gw3nRMdNMMTDLbwrXXdJZFS/EjFOPgOhwF7CkZ3kSpB2ZIcAJxG7iAUl5j+jHBXc5dafRbjzE4oYve1vPexLoV3NjV76uANUFkcli6eHYD0uJoUJGBRbRGWp+8Bbw9EcBsn4s3vbf5XqHX3S46zvGgqX+LyhyMJQtEG/iv+9XOsOql18ryyejij0z1K7DxpI0gLV1ATZCphY1Fyz1yZDGlYN4ej/Rl2P1Q3yXilweJRF7Ts04w4U9iuP1u598/w++CKSu4q4EeEuqT/hIeFQUKUkwCEsO4xa39vhLPaxKrG9UEUH8OXN+NPZyTAK/LKuIX7C56O1kwvWNMWlPmTcvsq2RghvNTwgSGUIO0EKZKrQYAEG3Y/veSt5CgZoNzLgc/6Xj+g7daxUo9heLy26A= 33 secure: GMiD9uhGUNkJbasOMvfUmQx/SKG8wd/MC4IPtiZZnlLkiN6eJQnV3p9OeMaiSCcq19gQ65z898h55PXwFX5pFqmGMQF0zdA3VXlVh7wrUU/Z8cYxCBaZTIOgNwtrteT9V9easV/5BuUGLHVgAFYEhS5tJDu2GU4UKdm6mko4YyxKHdsCsvkRpv+zpFF1a+G2ZUwWHDhTZsBJbx7SW7xzPKYI+vq+bNnbyC6p0kpeTehf29A8CoIgQlDctzk4aOHkj35WHIiKS5yzr/nb8oY/B6vCdfFHCrCkZxQrxPEagyYTfEusWwQRJ4rvwt8dgBO1A3ckO+AC1MEAYRYHgQMI5K86tcQ7/su5iOhu9NDbZ/BfriaTDlrurKMWPhZ/RVnFUT4tn7XVVcMxz6/FYFDYIDSHEn5E20a7qV1ixF7XKoJU6eOfo3qZ7euxiZIbDbHBH+Y2ZmzUGfrQ7DFlefMEM/6Laa0jNGOSvfc6mvk1x63bVTT5KfYEX4ztXnBY77haG4/h5bIHyNDzLsZ5vxXbvmHZb6ToMVn9UT6HS0sZQ/B4bghJbdZuOrPFlz8UNRpwoBS4HpLUndhYCo0ppxd3yCd5gqEhIJzEiJNoMq+LA9/iheLbWlJVdjP2WRQ2/m9VCSxnivTdNhnp6lSATiXAgq2WN2LGhTSGtXgqtcYGXhk=
34 34
35deploy: 35deploy:
36 provider: s3 36 provider: s3
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c7a93f2b3..e1fe2ab45 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,32 @@
1# [5.2.0-beta.2](https://github.com/meetfranz/franz/compare/v5.2.0-beta.1...v5.2.0-beta.2) (2019-06-12)
2
3
4### Bug Fixes
5
6* **Recipes:** Fix recipe install when directly accessing recipe ([eba50bc](https://github.com/meetfranz/franz/commit/eba50bc))
7
8
9
10# [5.2.0-beta.1](https://github.com/meetfranz/franz/compare/v5.1.0...v5.2.0-beta.1) (2019-06-11)
11
12
13### Bug Fixes
14
15* **Workspaces:** Service reordering within workspaces ([17f3a22](https://github.com/meetfranz/franz/commit/17f3a22))
16* **Proxy:** Fix issue with proxy authentication ([b9e5b23](https://github.com/meetfranz/franz/commit/b9e5b23))
17* **Announcements:** Fixes issue with rendering announcements in workspaces ([1e38ec5](https://github.com/meetfranz/franz/commit/1e38ec5))
18* **Windows:** Add Workspaces menu & fix Window menu ([92a61d4](https://github.com/meetfranz/franz/commit/92a61d4))
19* **Windows:** Replace tray icon with high-res version ([a5eb399](https://github.com/meetfranz/franz/commit/a5eb399))
20* **App:** Improved email validation ([dd8ddcc](https://github.com/meetfranz/franz/commit/dd8ddcc)) ([@Snuggle](https://github.com/Snuggle))
21
22
23### General
24
25* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
26* **App:** Update electron to 5.0.2 ([5828062](https://github.com/meetfranz/franz/commit/5828062))
27
28
29
1# [5.1.0](https://github.com/meetfranz/franz/compare/v5.1.0...v5.1.0-beta.1) (2019-04-16) 30# [5.1.0](https://github.com/meetfranz/franz/compare/v5.1.0...v5.1.0-beta.1) (2019-04-16)
2 31
3### Features 32### Features
diff --git a/appveyor.yml b/appveyor.yml
index 77c25df7e..1dd0dbd92 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -5,6 +5,7 @@ environment:
5 secure: NEYFWgUIAB//y2GR4AJOaegwuNjkxyNsdDf5A40dYovebTUsnIB5k4GCbU3I6JKW9iwH2ldU7Z+QawfyFerNgw== 5 secure: NEYFWgUIAB//y2GR4AJOaegwuNjkxyNsdDf5A40dYovebTUsnIB5k4GCbU3I6JKW9iwH2ldU7Z+QawfyFerNgw==
6 CSC_KEY_PASSWORD: 6 CSC_KEY_PASSWORD:
7 secure: t8ypNTPKTmvRfd3hHA4aMOtC5KOFqOw3AsKhpU7140Q= 7 secure: t8ypNTPKTmvRfd3hHA4aMOtC5KOFqOw3AsKhpU7140Q=
8 APPVEYOR_CACHE_SKIP_RESTORE: true
8 9
9version: 5.0.1.{build} 10version: 5.0.1.{build}
10 11
@@ -25,7 +26,7 @@ build_script:
25notifications: 26notifications:
26 - provider: Slack 27 - provider: Slack
27 incoming_webhook: 28 incoming_webhook:
28 secure: 2NnhP/L7Jk9PDE0JvdNnYVBnmDHFRWHmTQBQ1492ZQ5O0Ok/97FAbk/FbGZVEalli8xcaPkVu3jiOD7IPVvHLKUrmyvficRgmL+qf4lhD1s= 29 secure: 2NnhP/L7Jk9PDE0JvdNnYVBnmDHFRWHmTQBQ1492ZQ7TpD2xQ/cXi3+G1Spr8zN5O8H+MQi4oMn3Ih2w0e8ZkHgQw138jvK/OfZO+FlF/mI=
29 30
30artifacts: 31artifacts:
31 - path: out\*.exe 32 - path: out\*.exe
diff --git a/package-lock.json b/package-lock.json
index cd43fcda6..77575ad56 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "franz", 2 "name": "franz",
3 "version": "5.0.1", 3 "version": "5.2.0-beta.1",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
@@ -932,12 +932,19 @@
932 } 932 }
933 }, 933 },
934 "@babel/polyfill": { 934 "@babel/polyfill": {
935 "version": "7.2.5", 935 "version": "7.4.4",
936 "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.2.5.tgz", 936 "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz",
937 "integrity": "sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug==", 937 "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==",
938 "requires": { 938 "requires": {
939 "core-js": "^2.5.7", 939 "core-js": "^2.6.5",
940 "regenerator-runtime": "^0.12.0" 940 "regenerator-runtime": "^0.13.2"
941 },
942 "dependencies": {
943 "core-js": {
944 "version": "2.6.9",
945 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
946 "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
947 }
941 } 948 }
942 }, 949 },
943 "@babel/preset-env": { 950 "@babel/preset-env": {
@@ -1020,11 +1027,11 @@
1020 } 1027 }
1021 }, 1028 },
1022 "@babel/runtime": { 1029 "@babel/runtime": {
1023 "version": "7.3.1", 1030 "version": "7.4.5",
1024 "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", 1031 "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz",
1025 "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", 1032 "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==",
1026 "requires": { 1033 "requires": {
1027 "regenerator-runtime": "^0.12.0" 1034 "regenerator-runtime": "^0.13.2"
1028 } 1035 }
1029 }, 1036 },
1030 "@babel/template": { 1037 "@babel/template": {
@@ -2169,6 +2176,15 @@
2169 "@meetfranz/theme": "^1.0.13", 2176 "@meetfranz/theme": "^1.0.13",
2170 "react-html-attributes": "^1.4.3", 2177 "react-html-attributes": "^1.4.3",
2171 "react-loader": "^2.4.5" 2178 "react-loader": "^2.4.5"
2179 },
2180 "dependencies": {
2181 "@meetfranz/theme": {
2182 "version": "1.0.13",
2183 "bundled": true,
2184 "requires": {
2185 "color": "^3.1.0"
2186 }
2187 }
2172 } 2188 }
2173 }, 2189 },
2174 "@meetfranz/theme": { 2190 "@meetfranz/theme": {
@@ -2184,6 +2200,15 @@
2184 "@mdi/react": "^1.1.0", 2200 "@mdi/react": "^1.1.0",
2185 "@meetfranz/theme": "^1.0.13", 2201 "@meetfranz/theme": "^1.0.13",
2186 "react-loader": "^2.4.5" 2202 "react-loader": "^2.4.5"
2203 },
2204 "dependencies": {
2205 "@meetfranz/theme": {
2206 "version": "1.0.13",
2207 "bundled": true,
2208 "requires": {
2209 "color": "^3.1.0"
2210 }
2211 }
2187 } 2212 }
2188 }, 2213 },
2189 "@mrmlnc/readdir-enhanced": { 2214 "@mrmlnc/readdir-enhanced": {
@@ -2830,52 +2855,67 @@
2830 } 2855 }
2831 }, 2856 },
2832 "app-builder-bin": { 2857 "app-builder-bin": {
2833 "version": "2.6.1", 2858 "version": "2.6.6",
2834 "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.6.1.tgz", 2859 "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.6.6.tgz",
2835 "integrity": "sha512-W0l85O+s6lOaziWqAhszPfwiG0s15FvMBP9j9i/bknsMccUkwN60u4Cy7yYtf6akCUDuJenLqpTX4/xvkq1egw==", 2860 "integrity": "sha512-G0Ee6xkbxV+fvM/7xXWIgSDjWAD4E/d/aNbxerq/TVsCyBIau/0VPmrEqBMyZv0NbTwLDW5aF/yHG+0ZEY77kA==",
2836 "dev": true 2861 "dev": true
2837 }, 2862 },
2838 "app-builder-lib": { 2863 "app-builder-lib": {
2839 "version": "20.38.4", 2864 "version": "20.40.2",
2840 "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.38.4.tgz", 2865 "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.40.2.tgz",
2841 "integrity": "sha512-JbuAJQBndcCW6BJVIb2tPjM5wiuIjz2LUlbyVxNIawM2wFKUBV9kr0N3RNBJFxcrCEuA9oprMUCoymJdrMUVfA==", 2866 "integrity": "sha512-SAbfua8+L3pFbQp3QFpKV0PzHJPJqepROeX/FPrfdL02zxlw+BVOe6KfC3+UV6XUombWvVPG+SwG956vfIx/Cw==",
2842 "dev": true, 2867 "dev": true,
2843 "requires": { 2868 "requires": {
2844 "7zip-bin": "~4.1.0", 2869 "7zip-bin": "~4.1.0",
2845 "app-builder-bin": "2.6.1", 2870 "app-builder-bin": "2.6.6",
2846 "async-exit-hook": "^2.0.1", 2871 "async-exit-hook": "^2.0.1",
2847 "bluebird-lst": "^1.0.6", 2872 "bluebird-lst": "^1.0.7",
2848 "builder-util": "9.6.1", 2873 "builder-util": "9.7.1",
2849 "builder-util-runtime": "8.1.0", 2874 "builder-util-runtime": "8.2.1",
2850 "chromium-pickle-js": "^0.2.0", 2875 "chromium-pickle-js": "^0.2.0",
2851 "debug": "^4.1.0", 2876 "debug": "^4.1.1",
2852 "ejs": "^2.6.1", 2877 "ejs": "^2.6.1",
2853 "electron-osx-sign": "0.4.11", 2878 "electron-osx-sign": "0.4.11",
2854 "electron-publish": "20.38.3", 2879 "electron-publish": "20.40.0",
2855 "fs-extra-p": "^7.0.0", 2880 "fs-extra-p": "^7.0.1",
2856 "hosted-git-info": "^2.7.1", 2881 "hosted-git-info": "^2.7.1",
2857 "is-ci": "^2.0.0", 2882 "is-ci": "^2.0.0",
2858 "isbinaryfile": "^3.0.3", 2883 "isbinaryfile": "^4.0.0",
2859 "js-yaml": "^3.12.0", 2884 "js-yaml": "^3.13.0",
2860 "lazy-val": "^1.0.3", 2885 "lazy-val": "^1.0.4",
2861 "minimatch": "^3.0.4", 2886 "minimatch": "^3.0.4",
2862 "normalize-package-data": "^2.4.0", 2887 "normalize-package-data": "^2.5.0",
2863 "plist": "^3.0.1", 2888 "plist": "^3.0.1",
2864 "read-config-file": "3.2.0", 2889 "read-config-file": "3.2.2",
2865 "sanitize-filename": "^1.6.1", 2890 "sanitize-filename": "^1.6.1",
2866 "semver": "^5.6.0", 2891 "semver": "^6.0.0",
2867 "temp-file": "^3.3.2" 2892 "temp-file": "^3.3.2"
2868 }, 2893 },
2869 "dependencies": { 2894 "dependencies": {
2895 "bluebird": {
2896 "version": "3.5.4",
2897 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
2898 "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
2899 "dev": true
2900 },
2901 "bluebird-lst": {
2902 "version": "1.0.8",
2903 "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.8.tgz",
2904 "integrity": "sha512-InUDOaBaIjIobOa3O4YRAbFgff907uTJZXW0m0rhk3zhVZ4GvsmdCLEAKC1CTWTtUWCM8iWTTfFX9N/xQR/etw==",
2905 "dev": true,
2906 "requires": {
2907 "bluebird": "^3.5.4"
2908 }
2909 },
2870 "builder-util-runtime": { 2910 "builder-util-runtime": {
2871 "version": "8.1.0", 2911 "version": "8.2.1",
2872 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.1.0.tgz", 2912 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.2.1.tgz",
2873 "integrity": "sha512-s1mlJ28mv+56Iebh6c9aXjVe11O3Z0cDTwAGeB0PCcUzHA37fDxGgS8ZGoYNMZP+rBHj21d/od1wuYofTVLaQg==", 2913 "integrity": "sha512-2TkeTcI9bDlK5azRZSJJNxhAgW1DK+JY3jHK0UWPxgJcan4GZSVDNNO3sXntNxrp+JAdPHMF14rzNd/G53lvqw==",
2874 "dev": true, 2914 "dev": true,
2875 "requires": { 2915 "requires": {
2876 "bluebird-lst": "^1.0.6", 2916 "bluebird-lst": "^1.0.7",
2877 "debug": "^4.1.0", 2917 "debug": "^4.1.1",
2878 "fs-extra-p": "^7.0.0", 2918 "fs-extra-p": "^7.0.1",
2879 "sax": "^1.2.4" 2919 "sax": "^1.2.4"
2880 } 2920 }
2881 }, 2921 },
@@ -2888,10 +2928,36 @@
2888 "ms": "^2.1.1" 2928 "ms": "^2.1.1"
2889 } 2929 }
2890 }, 2930 },
2891 "ms": { 2931 "fs-extra-p": {
2892 "version": "2.1.1", 2932 "version": "7.0.1",
2893 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2933 "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz",
2894 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 2934 "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==",
2935 "dev": true,
2936 "requires": {
2937 "bluebird-lst": "^1.0.7",
2938 "fs-extra": "^7.0.1"
2939 }
2940 },
2941 "js-yaml": {
2942 "version": "3.13.1",
2943 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
2944 "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
2945 "dev": true,
2946 "requires": {
2947 "argparse": "^1.0.7",
2948 "esprima": "^4.0.0"
2949 }
2950 },
2951 "lazy-val": {
2952 "version": "1.0.4",
2953 "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz",
2954 "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==",
2955 "dev": true
2956 },
2957 "semver": {
2958 "version": "6.1.0",
2959 "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz",
2960 "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==",
2895 "dev": true 2961 "dev": true
2896 } 2962 }
2897 } 2963 }
@@ -3688,9 +3754,9 @@
3688 "dev": true 3754 "dev": true
3689 }, 3755 },
3690 "bindings": { 3756 "bindings": {
3691 "version": "1.4.0", 3757 "version": "1.5.0",
3692 "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.4.0.tgz", 3758 "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
3693 "integrity": "sha512-7znEVX22Djn+nYjxCWKDne0RRloa9XfYa84yk3s+HkE3LpDYZmhArYr9O9huBoHY3/oXispx5LorIX7Sl2CgSQ==", 3759 "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
3694 "requires": { 3760 "requires": {
3695 "file-uri-to-path": "1.0.0" 3761 "file-uri-to-path": "1.0.0"
3696 } 3762 }
@@ -4068,25 +4134,52 @@
4068 "dev": true 4134 "dev": true
4069 }, 4135 },
4070 "builder-util": { 4136 "builder-util": {
4071 "version": "9.6.1", 4137 "version": "9.7.1",
4072 "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-9.6.1.tgz", 4138 "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-9.7.1.tgz",
4073 "integrity": "sha512-8MljKTjeV+A+LLVexuWEV3EpWbiUcsHHrB4Bg2qNo/3dC+vTo6g/27+W3Ij7Ij1UTobSkNBstFieWijXJCco9A==", 4139 "integrity": "sha512-txpzYIeuHFjrOQWPTJDvhJYisIVGJdSG9ppccE+y7agT0YNhBlVHGnd8+HgFTajYE34xzB5zf1/zxiiDqSKSpA==",
4074 "dev": true, 4140 "dev": true,
4075 "requires": { 4141 "requires": {
4076 "7zip-bin": "~4.1.0", 4142 "7zip-bin": "~4.1.0",
4077 "app-builder-bin": "2.6.1", 4143 "app-builder-bin": "2.6.6",
4078 "bluebird-lst": "^1.0.6", 4144 "bluebird-lst": "^1.0.7",
4079 "builder-util-runtime": "^8.1.0", 4145 "builder-util-runtime": "^8.2.1",
4080 "chalk": "^2.4.1", 4146 "chalk": "^2.4.2",
4081 "debug": "^4.1.0", 4147 "debug": "^4.1.1",
4082 "fs-extra-p": "^7.0.0", 4148 "fs-extra-p": "^7.0.1",
4083 "is-ci": "^2.0.0", 4149 "is-ci": "^2.0.0",
4084 "js-yaml": "^3.12.0", 4150 "js-yaml": "^3.13.0",
4085 "source-map-support": "^0.5.9", 4151 "source-map-support": "^0.5.11",
4086 "stat-mode": "^0.2.2", 4152 "stat-mode": "^0.3.0",
4087 "temp-file": "^3.3.2" 4153 "temp-file": "^3.3.2"
4088 }, 4154 },
4089 "dependencies": { 4155 "dependencies": {
4156 "bluebird": {
4157 "version": "3.5.4",
4158 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
4159 "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
4160 "dev": true
4161 },
4162 "bluebird-lst": {
4163 "version": "1.0.8",
4164 "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.8.tgz",
4165 "integrity": "sha512-InUDOaBaIjIobOa3O4YRAbFgff907uTJZXW0m0rhk3zhVZ4GvsmdCLEAKC1CTWTtUWCM8iWTTfFX9N/xQR/etw==",
4166 "dev": true,
4167 "requires": {
4168 "bluebird": "^3.5.4"
4169 }
4170 },
4171 "builder-util-runtime": {
4172 "version": "8.2.2",
4173 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.2.2.tgz",
4174 "integrity": "sha512-Z0NKlpa5VQBMVXAcZH9n4dx+CY5Ckyv7a0Yr/is1h5hwCWaJbQ2JN9PGT7g6YzE5gM3FyrgGDB4DTyJlLcRKNw==",
4175 "dev": true,
4176 "requires": {
4177 "bluebird-lst": "^1.0.7",
4178 "debug": "^4.1.1",
4179 "fs-extra-p": "^7.0.1",
4180 "sax": "^1.2.4"
4181 }
4182 },
4090 "debug": { 4183 "debug": {
4091 "version": "4.1.1", 4184 "version": "4.1.1",
4092 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 4185 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -4096,11 +4189,35 @@
4096 "ms": "^2.1.1" 4189 "ms": "^2.1.1"
4097 } 4190 }
4098 }, 4191 },
4099 "ms": { 4192 "fs-extra-p": {
4100 "version": "2.1.1", 4193 "version": "7.0.1",
4101 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 4194 "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz",
4102 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 4195 "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==",
4103 "dev": true 4196 "dev": true,
4197 "requires": {
4198 "bluebird-lst": "^1.0.7",
4199 "fs-extra": "^7.0.1"
4200 }
4201 },
4202 "js-yaml": {
4203 "version": "3.13.1",
4204 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
4205 "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
4206 "dev": true,
4207 "requires": {
4208 "argparse": "^1.0.7",
4209 "esprima": "^4.0.0"
4210 }
4211 },
4212 "source-map-support": {
4213 "version": "0.5.12",
4214 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
4215 "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
4216 "dev": true,
4217 "requires": {
4218 "buffer-from": "^1.0.0",
4219 "source-map": "^0.6.0"
4220 }
4104 } 4221 }
4105 } 4222 }
4106 }, 4223 },
@@ -4503,9 +4620,9 @@
4503 } 4620 }
4504 }, 4621 },
4505 "cli-spinners": { 4622 "cli-spinners": {
4506 "version": "1.3.1", 4623 "version": "2.1.0",
4507 "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", 4624 "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.1.0.tgz",
4508 "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", 4625 "integrity": "sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA==",
4509 "dev": true 4626 "dev": true
4510 }, 4627 },
4511 "cli-table3": { 4628 "cli-table3": {
@@ -5969,19 +6086,56 @@
5969 } 6086 }
5970 }, 6087 },
5971 "dmg-builder": { 6088 "dmg-builder": {
5972 "version": "6.5.3", 6089 "version": "6.6.1",
5973 "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.5.3.tgz", 6090 "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.6.1.tgz",
5974 "integrity": "sha512-ZNl4GFBg6rdFplnuoK56iftxh/qgM7rXJUxgl21eK4WsjxgQwtQ0REZo+pDSL4OzVeyOO8MMNWSNQcCsBLiDyA==", 6091 "integrity": "sha512-aIbpQG3es+gHTFtsBQE4fmSYVM60yewxJZsN6FhkAmAmNaoO45bEQNJZsRX0YE49+imiSC92mJmFAEP6iKE0Tg==",
5975 "dev": true, 6092 "dev": true,
5976 "requires": { 6093 "requires": {
5977 "app-builder-lib": "~20.38.3", 6094 "app-builder-lib": "~20.40.0",
5978 "bluebird-lst": "^1.0.6", 6095 "bluebird-lst": "^1.0.7",
5979 "builder-util": "~9.6.0", 6096 "builder-util": "~9.7.1",
5980 "fs-extra-p": "^7.0.0", 6097 "fs-extra-p": "^7.0.1",
5981 "iconv-lite": "^0.4.24", 6098 "iconv-lite": "^0.4.24",
5982 "js-yaml": "^3.12.0", 6099 "js-yaml": "^3.13.0",
5983 "parse-color": "^1.0.0", 6100 "parse-color": "^1.0.0",
5984 "sanitize-filename": "^1.6.1" 6101 "sanitize-filename": "^1.6.1"
6102 },
6103 "dependencies": {
6104 "bluebird": {
6105 "version": "3.5.4",
6106 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
6107 "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
6108 "dev": true
6109 },
6110 "bluebird-lst": {
6111 "version": "1.0.8",
6112 "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.8.tgz",
6113 "integrity": "sha512-InUDOaBaIjIobOa3O4YRAbFgff907uTJZXW0m0rhk3zhVZ4GvsmdCLEAKC1CTWTtUWCM8iWTTfFX9N/xQR/etw==",
6114 "dev": true,
6115 "requires": {
6116 "bluebird": "^3.5.4"
6117 }
6118 },
6119 "fs-extra-p": {
6120 "version": "7.0.1",
6121 "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz",
6122 "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==",
6123 "dev": true,
6124 "requires": {
6125 "bluebird-lst": "^1.0.7",
6126 "fs-extra": "^7.0.1"
6127 }
6128 },
6129 "js-yaml": {
6130 "version": "3.13.1",
6131 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
6132 "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
6133 "dev": true,
6134 "requires": {
6135 "argparse": "^1.0.7",
6136 "esprima": "^4.0.0"
6137 }
6138 }
5985 } 6139 }
5986 }, 6140 },
5987 "dns-equal": { 6141 "dns-equal": {
@@ -6649,9 +6803,9 @@
6649 "dev": true 6803 "dev": true
6650 }, 6804 },
6651 "electron": { 6805 "electron": {
6652 "version": "4.1.4", 6806 "version": "5.0.2",
6653 "resolved": "https://registry.npmjs.org/electron/-/electron-4.1.4.tgz", 6807 "resolved": "https://registry.npmjs.org/electron/-/electron-5.0.2.tgz",
6654 "integrity": "sha512-MelOjntJvd33izEjR6H4N/Uii7y535z/b2BuYXJGLNSHL6o1IlyhUQmfiT87kWABayERgeuYERgvsyf956OOFw==", 6808 "integrity": "sha512-bUHKQhyuOen/q8iHTkrnzqB9CAwBDI+vHbeu21kpq2bqAD+t25yfrmUEcYHaPL4fZOAhk6nnRqskF6/Xd+aZxg==",
6655 "dev": true, 6809 "dev": true,
6656 "requires": { 6810 "requires": {
6657 "@types/node": "^10.12.18", 6811 "@types/node": "^10.12.18",
@@ -6668,38 +6822,70 @@
6668 } 6822 }
6669 }, 6823 },
6670 "electron-builder": { 6824 "electron-builder": {
6671 "version": "20.38.4", 6825 "version": "20.40.2",
6672 "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.38.4.tgz", 6826 "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.40.2.tgz",
6673 "integrity": "sha512-WHOr3Rz2wktxV5TqmRL6woO9/wrIZeRfJPSEXOhgfgLskE5Sp2Aer0zAF7lHNqXuG6JhU+0I9IYFAxa73MTs9w==", 6827 "integrity": "sha512-hnnBzyLXna+WpmT4MIoWVdRli43q09yqKOgzPJj0KrOoJZ7TIoY1aYSPvSg8VL5rSuTgdAWGL4rYd9zcq3YXMQ==",
6674 "dev": true, 6828 "dev": true,
6675 "requires": { 6829 "requires": {
6676 "app-builder-lib": "20.38.4", 6830 "app-builder-lib": "20.40.2",
6677 "bluebird-lst": "^1.0.6", 6831 "bluebird-lst": "^1.0.7",
6678 "builder-util": "9.6.1", 6832 "builder-util": "9.7.1",
6679 "builder-util-runtime": "8.1.0", 6833 "builder-util-runtime": "8.2.1",
6680 "chalk": "^2.4.1", 6834 "chalk": "^2.4.2",
6681 "dmg-builder": "6.5.3", 6835 "dmg-builder": "6.6.1",
6682 "fs-extra-p": "^7.0.0", 6836 "fs-extra-p": "^7.0.1",
6683 "is-ci": "^2.0.0", 6837 "is-ci": "^2.0.0",
6684 "lazy-val": "^1.0.3", 6838 "lazy-val": "^1.0.4",
6685 "read-config-file": "3.2.0", 6839 "read-config-file": "3.2.2",
6686 "sanitize-filename": "^1.6.1", 6840 "sanitize-filename": "^1.6.1",
6687 "update-notifier": "^2.5.0", 6841 "update-notifier": "^2.5.0",
6688 "yargs": "^12.0.5" 6842 "yargs": "^13.2.2"
6689 }, 6843 },
6690 "dependencies": { 6844 "dependencies": {
6845 "ansi-regex": {
6846 "version": "4.1.0",
6847 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
6848 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
6849 "dev": true
6850 },
6851 "bluebird": {
6852 "version": "3.5.4",
6853 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
6854 "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
6855 "dev": true
6856 },
6857 "bluebird-lst": {
6858 "version": "1.0.8",
6859 "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.8.tgz",
6860 "integrity": "sha512-InUDOaBaIjIobOa3O4YRAbFgff907uTJZXW0m0rhk3zhVZ4GvsmdCLEAKC1CTWTtUWCM8iWTTfFX9N/xQR/etw==",
6861 "dev": true,
6862 "requires": {
6863 "bluebird": "^3.5.4"
6864 }
6865 },
6691 "builder-util-runtime": { 6866 "builder-util-runtime": {
6692 "version": "8.1.0", 6867 "version": "8.2.1",
6693 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.1.0.tgz", 6868 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.2.1.tgz",
6694 "integrity": "sha512-s1mlJ28mv+56Iebh6c9aXjVe11O3Z0cDTwAGeB0PCcUzHA37fDxGgS8ZGoYNMZP+rBHj21d/od1wuYofTVLaQg==", 6869 "integrity": "sha512-2TkeTcI9bDlK5azRZSJJNxhAgW1DK+JY3jHK0UWPxgJcan4GZSVDNNO3sXntNxrp+JAdPHMF14rzNd/G53lvqw==",
6695 "dev": true, 6870 "dev": true,
6696 "requires": { 6871 "requires": {
6697 "bluebird-lst": "^1.0.6", 6872 "bluebird-lst": "^1.0.7",
6698 "debug": "^4.1.0", 6873 "debug": "^4.1.1",
6699 "fs-extra-p": "^7.0.0", 6874 "fs-extra-p": "^7.0.1",
6700 "sax": "^1.2.4" 6875 "sax": "^1.2.4"
6701 } 6876 }
6702 }, 6877 },
6878 "cliui": {
6879 "version": "5.0.0",
6880 "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
6881 "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
6882 "dev": true,
6883 "requires": {
6884 "string-width": "^3.1.0",
6885 "strip-ansi": "^5.2.0",
6886 "wrap-ansi": "^5.1.0"
6887 }
6888 },
6703 "debug": { 6889 "debug": {
6704 "version": "4.1.1", 6890 "version": "4.1.1",
6705 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 6891 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -6709,11 +6895,93 @@
6709 "ms": "^2.1.1" 6895 "ms": "^2.1.1"
6710 } 6896 }
6711 }, 6897 },
6712 "ms": { 6898 "fs-extra-p": {
6713 "version": "2.1.1", 6899 "version": "7.0.1",
6714 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 6900 "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz",
6715 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 6901 "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==",
6902 "dev": true,
6903 "requires": {
6904 "bluebird-lst": "^1.0.7",
6905 "fs-extra": "^7.0.1"
6906 }
6907 },
6908 "get-caller-file": {
6909 "version": "2.0.5",
6910 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
6911 "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
6912 "dev": true
6913 },
6914 "lazy-val": {
6915 "version": "1.0.4",
6916 "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz",
6917 "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==",
6918 "dev": true
6919 },
6920 "require-main-filename": {
6921 "version": "2.0.0",
6922 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
6923 "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
6716 "dev": true 6924 "dev": true
6925 },
6926 "string-width": {
6927 "version": "3.1.0",
6928 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
6929 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
6930 "dev": true,
6931 "requires": {
6932 "emoji-regex": "^7.0.1",
6933 "is-fullwidth-code-point": "^2.0.0",
6934 "strip-ansi": "^5.1.0"
6935 }
6936 },
6937 "strip-ansi": {
6938 "version": "5.2.0",
6939 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
6940 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
6941 "dev": true,
6942 "requires": {
6943 "ansi-regex": "^4.1.0"
6944 }
6945 },
6946 "wrap-ansi": {
6947 "version": "5.1.0",
6948 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
6949 "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
6950 "dev": true,
6951 "requires": {
6952 "ansi-styles": "^3.2.0",
6953 "string-width": "^3.0.0",
6954 "strip-ansi": "^5.0.0"
6955 }
6956 },
6957 "yargs": {
6958 "version": "13.2.4",
6959 "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz",
6960 "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==",
6961 "dev": true,
6962 "requires": {
6963 "cliui": "^5.0.0",
6964 "find-up": "^3.0.0",
6965 "get-caller-file": "^2.0.1",
6966 "os-locale": "^3.1.0",
6967 "require-directory": "^2.1.1",
6968 "require-main-filename": "^2.0.0",
6969 "set-blocking": "^2.0.0",
6970 "string-width": "^3.0.0",
6971 "which-module": "^2.0.0",
6972 "y18n": "^4.0.0",
6973 "yargs-parser": "^13.1.0"
6974 }
6975 },
6976 "yargs-parser": {
6977 "version": "13.1.0",
6978 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz",
6979 "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==",
6980 "dev": true,
6981 "requires": {
6982 "camelcase": "^5.0.0",
6983 "decamelize": "^1.2.0"
6984 }
6717 } 6985 }
6718 } 6986 }
6719 }, 6987 },
@@ -6775,14 +7043,12 @@
6775 } 7043 }
6776 }, 7044 },
6777 "electron-hunspell": { 7045 "electron-hunspell": {
6778 "version": "0.1.1", 7046 "version": "1.0.0-beta.7",
6779 "resolved": "https://registry.npmjs.org/electron-hunspell/-/electron-hunspell-0.1.1.tgz", 7047 "resolved": "https://registry.npmjs.org/electron-hunspell/-/electron-hunspell-1.0.0-beta.7.tgz",
6780 "integrity": "sha512-B3nOQqHexIX+8bz72FZkNk+iFBrdqS9DpV2SaH+t7T9SLbONBVBRLJ2Jj2ytXFUzvw81q7vz2dfxPCddh/E3ww==", 7048 "integrity": "sha512-BByCXqU8sZbuzyoxKcBYjycp8ORiqjeYZd2OT8RNjVW+XGPmZkHewXUu4tUa1IXW6ij6IqojV5kr+xhYKLN1DA==",
6781 "requires": { 7049 "requires": {
6782 "hunspell-asm": "1.0.2", 7050 "hunspell-asm": "^2.0.0",
6783 "lodash": "^4.17.11", 7051 "tslib": "1.9.3"
6784 "tslib": "1.9.3",
6785 "unixify": "1.0.0"
6786 } 7052 }
6787 }, 7053 },
6788 "electron-is-dev": { 7054 "electron-is-dev": {
@@ -6802,21 +7068,92 @@
6802 "isbinaryfile": "^3.0.2", 7068 "isbinaryfile": "^3.0.2",
6803 "minimist": "^1.2.0", 7069 "minimist": "^1.2.0",
6804 "plist": "^3.0.1" 7070 "plist": "^3.0.1"
7071 },
7072 "dependencies": {
7073 "isbinaryfile": {
7074 "version": "3.0.3",
7075 "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
7076 "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
7077 "dev": true,
7078 "requires": {
7079 "buffer-alloc": "^1.2.0"
7080 }
7081 }
6805 } 7082 }
6806 }, 7083 },
6807 "electron-publish": { 7084 "electron-publish": {
6808 "version": "20.38.3", 7085 "version": "20.40.0",
6809 "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.38.3.tgz", 7086 "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.40.0.tgz",
6810 "integrity": "sha512-Qomq253NT5DfjUZgFSx6p+gheU5YhM6zZ67fTtBZvwyk0v8HwxNXfa8fZT7h+1c3BwEmjusTbmjZRNW/XZBXFA==", 7087 "integrity": "sha512-mkjtsIgftRszuT/8do8TszmddokDnu254OyTeL8nE780o/A8t68oXHZzvlTJ4AQ8uBOYrA87JDO/BFCWjnVArA==",
6811 "dev": true, 7088 "dev": true,
6812 "requires": { 7089 "requires": {
6813 "bluebird-lst": "^1.0.6", 7090 "bluebird-lst": "^1.0.7",
6814 "builder-util": "~9.6.0", 7091 "builder-util": "~9.7.1",
6815 "builder-util-runtime": "^8.1.0", 7092 "builder-util-runtime": "^8.2.1",
6816 "chalk": "^2.4.1", 7093 "chalk": "^2.4.2",
6817 "fs-extra-p": "^7.0.0", 7094 "fs-extra-p": "^7.0.1",
6818 "lazy-val": "^1.0.3", 7095 "lazy-val": "^1.0.4",
6819 "mime": "^2.4.0" 7096 "mime": "^2.4.1"
7097 },
7098 "dependencies": {
7099 "bluebird": {
7100 "version": "3.5.4",
7101 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
7102 "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
7103 "dev": true
7104 },
7105 "bluebird-lst": {
7106 "version": "1.0.8",
7107 "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.8.tgz",
7108 "integrity": "sha512-InUDOaBaIjIobOa3O4YRAbFgff907uTJZXW0m0rhk3zhVZ4GvsmdCLEAKC1CTWTtUWCM8iWTTfFX9N/xQR/etw==",
7109 "dev": true,
7110 "requires": {
7111 "bluebird": "^3.5.4"
7112 }
7113 },
7114 "builder-util-runtime": {
7115 "version": "8.2.2",
7116 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.2.2.tgz",
7117 "integrity": "sha512-Z0NKlpa5VQBMVXAcZH9n4dx+CY5Ckyv7a0Yr/is1h5hwCWaJbQ2JN9PGT7g6YzE5gM3FyrgGDB4DTyJlLcRKNw==",
7118 "dev": true,
7119 "requires": {
7120 "bluebird-lst": "^1.0.7",
7121 "debug": "^4.1.1",
7122 "fs-extra-p": "^7.0.1",
7123 "sax": "^1.2.4"
7124 }
7125 },
7126 "debug": {
7127 "version": "4.1.1",
7128 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
7129 "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
7130 "dev": true,
7131 "requires": {
7132 "ms": "^2.1.1"
7133 }
7134 },
7135 "fs-extra-p": {
7136 "version": "7.0.1",
7137 "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz",
7138 "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==",
7139 "dev": true,
7140 "requires": {
7141 "bluebird-lst": "^1.0.7",
7142 "fs-extra": "^7.0.1"
7143 }
7144 },
7145 "lazy-val": {
7146 "version": "1.0.4",
7147 "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz",
7148 "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==",
7149 "dev": true
7150 },
7151 "mime": {
7152 "version": "2.4.3",
7153 "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz",
7154 "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==",
7155 "dev": true
7156 }
6820 } 7157 }
6821 }, 7158 },
6822 "electron-react-titlebar": { 7159 "electron-react-titlebar": {
@@ -6853,12 +7190,6 @@
6853 "requires": { 7190 "requires": {
6854 "ms": "^2.1.1" 7191 "ms": "^2.1.1"
6855 } 7192 }
6856 },
6857 "ms": {
6858 "version": "2.1.1",
6859 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
6860 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
6861 "dev": true
6862 } 7193 }
6863 } 7194 }
6864 }, 7195 },
@@ -11048,14 +11379,34 @@
11048 } 11379 }
11049 }, 11380 },
11050 "hunspell-asm": { 11381 "hunspell-asm": {
11051 "version": "1.0.2", 11382 "version": "2.0.0",
11052 "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz", 11383 "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-2.0.0.tgz",
11053 "integrity": "sha512-UTLBvc0yZiIcHl9qrgxnFTZbX3zF4CprzEY+u+N0iXlUKZnUJRIgvgppTdgiQTsucm5b0aN/rHsgXz2q/0kBRA==", 11384 "integrity": "sha512-FMIUBpy+bRREFAvC63RcYEK9U6+FdlEojGSVsvMTpuZ2CekYyUBwEfG4+ExIQOQyEN0U6f1MoVgrFqvgPNSA2g==",
11054 "requires": { 11385 "requires": {
11055 "emscripten-wasm-loader": "^1.0.0", 11386 "emscripten-wasm-loader": "^2.2.3",
11056 "nanoid": "^1.0.2", 11387 "nanoid": "^2.0.1",
11057 "tslib": "^1.9.0", 11388 "tslib": "^1.9.3",
11058 "unixify": "^1.0.0" 11389 "unixify": "^1.0.0"
11390 },
11391 "dependencies": {
11392 "emscripten-wasm-loader": {
11393 "version": "2.2.3",
11394 "resolved": "https://registry.npmjs.org/emscripten-wasm-loader/-/emscripten-wasm-loader-2.2.3.tgz",
11395 "integrity": "sha512-//gI0afvtVnY7smttrPOW/BM+pTJLmdIcXAQV3fgRdQ0o6wm2vdSI0kjLYVOeo/rbtRsGgVuMLu6fT+O//EfaA==",
11396 "requires": {
11397 "getroot": "^1.0.0",
11398 "nanoid": "^1.3.4",
11399 "tslib": "^1.9.3",
11400 "unixify": "^1.0.0"
11401 },
11402 "dependencies": {
11403 "nanoid": {
11404 "version": "1.3.4",
11405 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz",
11406 "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ=="
11407 }
11408 }
11409 }
11059 } 11410 }
11060 }, 11411 },
11061 "husky": { 11412 "husky": {
@@ -11768,13 +12119,10 @@
11768 "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 12119 "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
11769 }, 12120 },
11770 "isbinaryfile": { 12121 "isbinaryfile": {
11771 "version": "3.0.3", 12122 "version": "4.0.0",
11772 "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", 12123 "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.0.tgz",
11773 "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", 12124 "integrity": "sha512-RBtmso6l2mCaEsUvXngMTIjg3oheXo0MgYzzfT6sk44RYggPnm9fT+cQJAmzRnJIxPHXg9FZglqDJGW28dvcqA==",
11774 "dev": true, 12125 "dev": true
11775 "requires": {
11776 "buffer-alloc": "^1.2.0"
11777 }
11778 }, 12126 },
11779 "isexe": { 12127 "isexe": {
11780 "version": "2.0.0", 12128 "version": "2.0.0",
@@ -13394,12 +13742,19 @@
13394 } 13742 }
13395 }, 13743 },
13396 "macos-notification-state": { 13744 "macos-notification-state": {
13397 "version": "1.2.0", 13745 "version": "1.3.1",
13398 "resolved": "https://registry.npmjs.org/macos-notification-state/-/macos-notification-state-1.2.0.tgz", 13746 "resolved": "https://registry.npmjs.org/macos-notification-state/-/macos-notification-state-1.3.1.tgz",
13399 "integrity": "sha512-80nPI5sFOMopZw5yt9tdaRAKd6gtTKdjuAIdQ5cMdA5ZtkC7jZH0yzBjeM3O4g+tt/GgLA2fORKwACje5dyGgA==", 13747 "integrity": "sha512-Zd4fezXN4WaXw0fJnO3dr8Eg72AKI4C+g0Jnm5KcX8o7WWvIMV9rzsl8mtuOL8FT+QPYv1xiaLpElqhXubf3Yw==",
13400 "requires": { 13748 "requires": {
13401 "bindings": "^1.4.0", 13749 "bindings": "^1.4.0",
13402 "nan": "^2.12.1" 13750 "nan": "^2.13.2"
13751 },
13752 "dependencies": {
13753 "nan": {
13754 "version": "2.14.0",
13755 "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
13756 "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
13757 }
13403 } 13758 }
13404 }, 13759 },
13405 "macos-release": { 13760 "macos-release": {
@@ -14030,9 +14385,9 @@
14030 "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" 14385 "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw=="
14031 }, 14386 },
14032 "nanoid": { 14387 "nanoid": {
14033 "version": "1.3.4", 14388 "version": "2.0.3",
14034 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz", 14389 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.3.tgz",
14035 "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ==" 14390 "integrity": "sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw=="
14036 }, 14391 },
14037 "nanomatch": { 14392 "nanomatch": {
14038 "version": "1.2.13", 14393 "version": "1.2.13",
@@ -14111,9 +14466,9 @@
14111 } 14466 }
14112 }, 14467 },
14113 "node-abi": { 14468 "node-abi": {
14114 "version": "2.7.1", 14469 "version": "2.8.0",
14115 "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", 14470 "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz",
14116 "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", 14471 "integrity": "sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ==",
14117 "dev": true, 14472 "dev": true,
14118 "requires": { 14473 "requires": {
14119 "semver": "^5.4.1" 14474 "semver": "^5.4.1"
@@ -15197,32 +15552,32 @@
15197 "dev": true 15552 "dev": true
15198 }, 15553 },
15199 "ora": { 15554 "ora": {
15200 "version": "3.1.0", 15555 "version": "3.4.0",
15201 "resolved": "https://registry.npmjs.org/ora/-/ora-3.1.0.tgz", 15556 "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
15202 "integrity": "sha512-vRBPaNCclUi8pUxRF/G8+5qEQkc6EgzKK1G2ZNJUIGu088Un5qIxFXeDgymvPRM9nmrcUOGzQgS1Vmtz+NtlMw==", 15557 "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
15203 "dev": true, 15558 "dev": true,
15204 "requires": { 15559 "requires": {
15205 "chalk": "^2.4.2", 15560 "chalk": "^2.4.2",
15206 "cli-cursor": "^2.1.0", 15561 "cli-cursor": "^2.1.0",
15207 "cli-spinners": "^1.3.1", 15562 "cli-spinners": "^2.0.0",
15208 "log-symbols": "^2.2.0", 15563 "log-symbols": "^2.2.0",
15209 "strip-ansi": "^5.0.0", 15564 "strip-ansi": "^5.2.0",
15210 "wcwidth": "^1.0.1" 15565 "wcwidth": "^1.0.1"
15211 }, 15566 },
15212 "dependencies": { 15567 "dependencies": {
15213 "ansi-regex": { 15568 "ansi-regex": {
15214 "version": "4.0.0", 15569 "version": "4.1.0",
15215 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", 15570 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
15216 "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", 15571 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
15217 "dev": true 15572 "dev": true
15218 }, 15573 },
15219 "strip-ansi": { 15574 "strip-ansi": {
15220 "version": "5.0.0", 15575 "version": "5.2.0",
15221 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", 15576 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
15222 "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", 15577 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
15223 "dev": true, 15578 "dev": true,
15224 "requires": { 15579 "requires": {
15225 "ansi-regex": "^4.0.0" 15580 "ansi-regex": "^4.1.0"
15226 } 15581 }
15227 } 15582 }
15228 } 15583 }
@@ -16618,27 +16973,70 @@
16618 } 16973 }
16619 }, 16974 },
16620 "read-config-file": { 16975 "read-config-file": {
16621 "version": "3.2.0", 16976 "version": "3.2.2",
16622 "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.0.tgz", 16977 "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.2.tgz",
16623 "integrity": "sha512-i1QRc5jy4sHm9YBGb6ArA5SU1mDrc5wu2mnm3r9gPnm+LVZhBGbpTCKqAXyvV4TJHnBR3Yaaww+9b3DyRZcfww==", 16978 "integrity": "sha512-PuFpMgZF01VB0ydH1dfitAxCP/fh+qnfbA9cYNIPoxPbz0SMngsrafCtaHDWfER7MwlDz4fmrNBhPkakxxFpTg==",
16624 "dev": true, 16979 "dev": true,
16625 "requires": { 16980 "requires": {
16626 "ajv": "^6.5.5", 16981 "ajv": "^6.9.2",
16627 "ajv-keywords": "^3.2.0", 16982 "ajv-keywords": "^3.4.0",
16628 "bluebird-lst": "^1.0.6", 16983 "bluebird-lst": "^1.0.7",
16629 "dotenv": "^6.1.0", 16984 "dotenv": "^6.2.0",
16630 "dotenv-expand": "^4.2.0", 16985 "dotenv-expand": "^4.2.0",
16631 "fs-extra-p": "^7.0.0", 16986 "fs-extra-p": "^7.0.1",
16632 "js-yaml": "^3.12.0", 16987 "js-yaml": "^3.12.1",
16633 "json5": "^2.1.0", 16988 "json5": "^2.1.0",
16634 "lazy-val": "^1.0.3" 16989 "lazy-val": "^1.0.4"
16635 }, 16990 },
16636 "dependencies": { 16991 "dependencies": {
16992 "ajv": {
16993 "version": "6.10.0",
16994 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
16995 "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
16996 "dev": true,
16997 "requires": {
16998 "fast-deep-equal": "^2.0.1",
16999 "fast-json-stable-stringify": "^2.0.0",
17000 "json-schema-traverse": "^0.4.1",
17001 "uri-js": "^4.2.2"
17002 }
17003 },
17004 "bluebird": {
17005 "version": "3.5.4",
17006 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
17007 "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
17008 "dev": true
17009 },
17010 "bluebird-lst": {
17011 "version": "1.0.8",
17012 "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.8.tgz",
17013 "integrity": "sha512-InUDOaBaIjIobOa3O4YRAbFgff907uTJZXW0m0rhk3zhVZ4GvsmdCLEAKC1CTWTtUWCM8iWTTfFX9N/xQR/etw==",
17014 "dev": true,
17015 "requires": {
17016 "bluebird": "^3.5.4"
17017 }
17018 },
16637 "dotenv": { 17019 "dotenv": {
16638 "version": "6.2.0", 17020 "version": "6.2.0",
16639 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", 17021 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz",
16640 "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", 17022 "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==",
16641 "dev": true 17023 "dev": true
17024 },
17025 "fs-extra-p": {
17026 "version": "7.0.1",
17027 "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz",
17028 "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==",
17029 "dev": true,
17030 "requires": {
17031 "bluebird-lst": "^1.0.7",
17032 "fs-extra": "^7.0.1"
17033 }
17034 },
17035 "lazy-val": {
17036 "version": "1.0.4",
17037 "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz",
17038 "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==",
17039 "dev": true
16642 } 17040 }
16643 } 17041 }
16644 }, 17042 },
@@ -16862,9 +17260,9 @@
16862 } 17260 }
16863 }, 17261 },
16864 "regenerator-runtime": { 17262 "regenerator-runtime": {
16865 "version": "0.12.1", 17263 "version": "0.13.2",
16866 "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", 17264 "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
16867 "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" 17265 "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
16868 }, 17266 },
16869 "regenerator-transform": { 17267 "regenerator-transform": {
16870 "version": "0.13.3", 17268 "version": "0.13.3",
@@ -16931,9 +17329,9 @@
16931 } 17329 }
16932 }, 17330 },
16933 "registry-auth-token": { 17331 "registry-auth-token": {
16934 "version": "3.3.2", 17332 "version": "3.4.0",
16935 "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", 17333 "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
16936 "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", 17334 "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
16937 "dev": true, 17335 "dev": true,
16938 "requires": { 17336 "requires": {
16939 "rc": "^1.1.6", 17337 "rc": "^1.1.6",
@@ -18545,9 +18943,9 @@
18545 "dev": true 18943 "dev": true
18546 }, 18944 },
18547 "stat-mode": { 18945 "stat-mode": {
18548 "version": "0.2.2", 18946 "version": "0.3.0",
18549 "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", 18947 "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz",
18550 "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", 18948 "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==",
18551 "dev": true 18949 "dev": true
18552 }, 18950 },
18553 "static-extend": { 18951 "static-extend": {
@@ -20016,6 +20414,11 @@
20016 "builtins": "^1.0.3" 20414 "builtins": "^1.0.3"
20017 } 20415 }
20018 }, 20416 },
20417 "validator": {
20418 "version": "11.0.0",
20419 "resolved": "https://registry.npmjs.org/validator/-/validator-11.0.0.tgz",
20420 "integrity": "sha512-+wnGLYqaKV2++nUv60uGzUJyJQwYVOin6pn1tgEiFCeCQO60yeu3Og9/yPccbBX574kxIcEJicogkzx6s6eyag=="
20421 },
20019 "value-or-function": { 20422 "value-or-function": {
20020 "version": "3.0.0", 20423 "version": "3.0.0",
20021 "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", 20424 "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
@@ -20698,12 +21101,19 @@
20698 "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 21101 "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
20699 }, 21102 },
20700 "windows-notification-state": { 21103 "windows-notification-state": {
20701 "version": "1.3.0", 21104 "version": "1.3.3",
20702 "resolved": "https://registry.npmjs.org/windows-notification-state/-/windows-notification-state-1.3.0.tgz", 21105 "resolved": "https://registry.npmjs.org/windows-notification-state/-/windows-notification-state-1.3.3.tgz",
20703 "integrity": "sha1-n3J3guysjZIKQI8QJr5vjgj9kC4=", 21106 "integrity": "sha512-MVcI09Kjjpd7XkTzp6iG9q+5rIj98r4js1GAIQd3XeCEuyQi+TG3lB3d1RYToZrf28qPkNFO/ChXjvc8ZF/hAQ==",
20704 "requires": { 21107 "requires": {
20705 "bindings": "^1.2.1", 21108 "bindings": "^1.5.0",
20706 "nan": "^2.4.0" 21109 "nan": "^2.14.0"
21110 },
21111 "dependencies": {
21112 "nan": {
21113 "version": "2.14.0",
21114 "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
21115 "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
21116 }
20707 } 21117 }
20708 }, 21118 },
20709 "windows-quiet-hours": { 21119 "windows-quiet-hours": {
diff --git a/package.json b/package.json
index c1a8c310f..9060c32db 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
2 "name": "franz", 2 "name": "franz",
3 "productName": "Franz", 3 "productName": "Franz",
4 "appId": "com.meetfranz.franz", 4 "appId": "com.meetfranz.franz",
5 "version": "5.1.0", 5 "version": "5.2.0-beta.2",
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": "adlk x franz - Stefan Malzner", 7 "copyright": "adlk x franz - Stefan Malzner",
8 "main": "index.js", 8 "main": "index.js",
@@ -34,9 +34,9 @@
34 "author": "Stefan Malzner <stefan@adlk.io>", 34 "author": "Stefan Malzner <stefan@adlk.io>",
35 "license": "Apache-2.0", 35 "license": "Apache-2.0",
36 "dependencies": { 36 "dependencies": {
37 "@babel/polyfill": "^7.0.0", 37 "@babel/polyfill": "7.4.4",
38 "@babel/runtime": "^7.0.0", 38 "@babel/runtime": "7.4.5",
39 "@meetfranz/electron-notification-state": "^1.0.0", 39 "@meetfranz/electron-notification-state": "1.0.0",
40 "@meetfranz/forms": "file:packages/forms", 40 "@meetfranz/forms": "file:packages/forms",
41 "@meetfranz/theme": "file:packages/theme", 41 "@meetfranz/theme": "file:packages/theme",
42 "@meetfranz/ui": "file:packages/ui", 42 "@meetfranz/ui": "file:packages/ui",
@@ -47,7 +47,7 @@
47 "du": "^0.1.0", 47 "du": "^0.1.0",
48 "electron-dl": "1.12.0", 48 "electron-dl": "1.12.0",
49 "electron-fetch": "1.3.0", 49 "electron-fetch": "1.3.0",
50 "electron-hunspell": "0.1.1", 50 "electron-hunspell": "1.0.0-beta.7",
51 "electron-is-dev": "1.0.1", 51 "electron-is-dev": "1.0.1",
52 "electron-react-titlebar": "0.8.1", 52 "electron-react-titlebar": "0.8.1",
53 "electron-updater": "4.0.6", 53 "electron-updater": "4.0.6",
@@ -86,6 +86,7 @@
86 "smoothscroll-polyfill": "^0.3.4", 86 "smoothscroll-polyfill": "^0.3.4",
87 "tar": "^4.0.2", 87 "tar": "^4.0.2",
88 "uuid": "^3.0.1", 88 "uuid": "^3.0.1",
89 "validator": "11.0.0",
89 "ws": "6.2.1" 90 "ws": "6.2.1"
90 }, 91 },
91 "devDependencies": { 92 "devDependencies": {
@@ -117,8 +118,8 @@
117 "cross-env": "^5.0.5", 118 "cross-env": "^5.0.5",
118 "cz-conventional-changelog": "2.1.0", 119 "cz-conventional-changelog": "2.1.0",
119 "dotenv": "^4.0.0", 120 "dotenv": "^4.0.0",
120 "electron": "4.1.4", 121 "electron": "5.0.2",
121 "electron-builder": "20.38.4", 122 "electron-builder": "20.40.2",
122 "electron-rebuild": "1.8.4", 123 "electron-rebuild": "1.8.4",
123 "eslint": "5.10.0", 124 "eslint": "5.10.0",
124 "eslint-config-airbnb": "17.1.0", 125 "eslint-config-airbnb": "17.1.0",
diff --git a/packages/forms/package.json b/packages/forms/package.json
index 0ac9a846f..d50f4c756 100644
--- a/packages/forms/package.json
+++ b/packages/forms/package.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "@meetfranz/forms", 2 "name": "@meetfranz/forms",
3 "version": "1.0.15", 3 "version": "1.0.16",
4 "description": "React form components for Franz", 4 "description": "React form components for Franz",
5 "main": "lib/index.js", 5 "main": "lib/index.js",
6 "scripts": { 6 "scripts": {
@@ -25,7 +25,7 @@
25 "dependencies": { 25 "dependencies": {
26 "@mdi/js": "^3.3.92", 26 "@mdi/js": "^3.3.92",
27 "@mdi/react": "^1.1.0", 27 "@mdi/react": "^1.1.0",
28 "@meetfranz/theme": "^1.0.13", 28 "@meetfranz/theme": "^1.0.14",
29 "react-html-attributes": "^1.4.3", 29 "react-html-attributes": "^1.4.3",
30 "react-loader": "^2.4.5" 30 "react-loader": "^2.4.5"
31 }, 31 },
@@ -35,5 +35,5 @@
35 "react-dom": "16.7.0", 35 "react-dom": "16.7.0",
36 "react-jss": "^8.6.1" 36 "react-jss": "^8.6.1"
37 }, 37 },
38 "gitHead": "e9b9079dc921e85961954727a7b2a8eabe5b9798" 38 "gitHead": "9f2ab40b7602bc3df26ebb093b484b9917768f69"
39} 39}
diff --git a/packages/forms/src/button/index.tsx b/packages/forms/src/button/index.tsx
index 6959cde73..9faedc8f1 100644
--- a/packages/forms/src/button/index.tsx
+++ b/packages/forms/src/button/index.tsx
@@ -44,7 +44,7 @@ const styles = (theme: Theme) => ({
44 width: (props: IProps) => (props.stretch ? '100%' : 'auto') as CSS.WidthProperty<string>, 44 width: (props: IProps) => (props.stretch ? '100%' : 'auto') as CSS.WidthProperty<string>,
45 fontSize: theme.uiFontSize, 45 fontSize: theme.uiFontSize,
46 textDecoration: 'none', 46 textDecoration: 'none',
47 height: theme.buttonHeight, 47 // height: theme.buttonHeight,
48 48
49 '&:hover': { 49 '&:hover': {
50 opacity: 0.8, 50 opacity: 0.8,
@@ -129,8 +129,7 @@ const styles = (theme: Theme) => ({
129 position: (props: IProps): CSS.PositionProperty => props.stretch ? 'absolute' : 'inherit', 129 position: (props: IProps): CSS.PositionProperty => props.stretch ? 'absolute' : 'inherit',
130 }, 130 },
131 icon: { 131 icon: {
132 marginLeft: -5, 132 margin: [1, 10, 0, -5],
133 marginRight: 10,
134 }, 133 },
135}); 134});
136 135
@@ -142,7 +141,6 @@ class ButtonComponent extends Component<IProps> {
142 buttonType: 'primary' as ButtonType, 141 buttonType: 'primary' as ButtonType,
143 stretch: false, 142 stretch: false,
144 busy: false, 143 busy: false,
145 // target: '_self'
146 }; 144 };
147 145
148 state = { 146 state = {
@@ -220,7 +218,7 @@ class ButtonComponent extends Component<IProps> {
220 {icon && ( 218 {icon && (
221 <Icon 219 <Icon
222 path={icon} 220 path={icon}
223 size={1} 221 size={0.8}
224 className={classes.icon} 222 className={classes.icon}
225 /> 223 />
226 )} 224 )}
diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx
index a2d7c62d5..b96dbc12d 100644
--- a/packages/forms/src/input/index.tsx
+++ b/packages/forms/src/input/index.tsx
@@ -83,7 +83,7 @@ class InputComponent extends Component<IProps, IState> {
83 } 83 }
84 84
85 onInputKeyPress(e: React.KeyboardEvent) { 85 onInputKeyPress(e: React.KeyboardEvent) {
86 if (e.key === "Enter") { 86 if (e.key === 'Enter') {
87 const { onEnterKey } = this.props; 87 const { onEnterKey } = this.props;
88 onEnterKey && onEnterKey(); 88 onEnterKey && onEnterKey();
89 } 89 }
@@ -114,6 +114,7 @@ class InputComponent extends Component<IProps, IState> {
114 max, 114 max,
115 step, 115 step,
116 required, 116 required,
117 noMargin,
117 } = this.props; 118 } = this.props;
118 119
119 const { 120 const {
@@ -127,6 +128,7 @@ class InputComponent extends Component<IProps, IState> {
127 <Wrapper 128 <Wrapper
128 className={className} 129 className={className}
129 identifier="franz-input" 130 identifier="franz-input"
131 noMargin={noMargin}
130 > 132 >
131 <Label 133 <Label
132 title={label} 134 title={label}
diff --git a/packages/forms/src/typings/generic.ts b/packages/forms/src/typings/generic.ts
index 9688ce2c7..29136dfed 100644
--- a/packages/forms/src/typings/generic.ts
+++ b/packages/forms/src/typings/generic.ts
@@ -6,6 +6,7 @@ export interface IFormField {
6 label?: string; 6 label?: string;
7 error?: string; 7 error?: string;
8 required?: boolean; 8 required?: boolean;
9 noMargin?: boolean;
9} 10}
10 11
11export interface IWithStyle { 12export interface IWithStyle {
diff --git a/packages/forms/src/wrapper/index.tsx b/packages/forms/src/wrapper/index.tsx
index d9c61381d..cf179bc5e 100644
--- a/packages/forms/src/wrapper/index.tsx
+++ b/packages/forms/src/wrapper/index.tsx
@@ -3,14 +3,19 @@ import React, { Component } from 'react';
3import injectStyle from 'react-jss'; 3import injectStyle from 'react-jss';
4import { IWithStyle } from '../typings/generic'; 4import { IWithStyle } from '../typings/generic';
5 5
6import styles from './styles';
7
8interface IProps extends IWithStyle { 6interface IProps extends IWithStyle {
9 children: React.ReactNode; 7 children: React.ReactNode;
10 className?: string; 8 className?: string;
11 identifier: string; 9 identifier: string;
10 noMargin?: boolean;
12} 11}
13 12
13const styles = {
14 container: {
15 marginBottom: (props: IProps) => props.noMargin ? 0 : 20,
16 },
17};
18
14class WrapperComponent extends Component<IProps> { 19class WrapperComponent extends Component<IProps> {
15 render() { 20 render() {
16 const { 21 const {
diff --git a/packages/forms/src/wrapper/styles.ts b/packages/forms/src/wrapper/styles.ts
deleted file mode 100644
index 72306b252..000000000
--- a/packages/forms/src/wrapper/styles.ts
+++ /dev/null
@@ -1,5 +0,0 @@
1export default {
2 container: {
3 marginBottom: 20,
4 },
5};
diff --git a/packages/theme/package.json b/packages/theme/package.json
index 642904089..fa12c8a30 100644
--- a/packages/theme/package.json
+++ b/packages/theme/package.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "@meetfranz/theme", 2 "name": "@meetfranz/theme",
3 "version": "1.0.13", 3 "version": "1.0.14",
4 "description": "Theme configuration for Franz", 4 "description": "Theme configuration for Franz",
5 "author": "Stefan Malzner <stefan@adlk.io>", 5 "author": "Stefan Malzner <stefan@adlk.io>",
6 "homepage": "https://github.com/meetfranz/franz", 6 "homepage": "https://github.com/meetfranz/franz",
@@ -25,5 +25,5 @@
25 "dependencies": { 25 "dependencies": {
26 "color": "^3.1.0" 26 "color": "^3.1.0"
27 }, 27 },
28 "gitHead": "e9b9079dc921e85961954727a7b2a8eabe5b9798" 28 "gitHead": "9f2ab40b7602bc3df26ebb093b484b9917768f69"
29} 29}
diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts
index d48dbf916..bd9f001e8 100644
--- a/packages/theme/src/themes/dark/index.ts
+++ b/packages/theme/src/themes/dark/index.ts
@@ -113,7 +113,7 @@ export const workspaces = merge({}, defaultStyles.workspaces, {
113}); 113});
114 114
115// Announcements 115// Announcements
116export const announcements = merge({}, defaultStyles.workspaces, { 116export const announcements = merge({}, defaultStyles.announcements, {
117 spotlight: { 117 spotlight: {
118 background: legacyStyles.darkThemeGrayDark, 118 background: legacyStyles.darkThemeGrayDark,
119 }, 119 },
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 514b2cc7c..a851ed9cf 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "@meetfranz/ui", 2 "name": "@meetfranz/ui",
3 "version": "0.0.8", 3 "version": "0.0.9",
4 "description": "React UI components for Franz", 4 "description": "React UI components for Franz",
5 "main": "lib/index.js", 5 "main": "lib/index.js",
6 "scripts": { 6 "scripts": {
@@ -25,7 +25,7 @@
25 "dependencies": { 25 "dependencies": {
26 "@mdi/js": "^3.3.92", 26 "@mdi/js": "^3.3.92",
27 "@mdi/react": "^1.1.0", 27 "@mdi/react": "^1.1.0",
28 "@meetfranz/theme": "^1.0.13", 28 "@meetfranz/theme": "^1.0.14",
29 "react-loader": "^2.4.5" 29 "react-loader": "^2.4.5"
30 }, 30 },
31 "peerDependencies": { 31 "peerDependencies": {
@@ -34,5 +34,5 @@
34 "react-dom": "16.7.0", 34 "react-dom": "16.7.0",
35 "react-jss": "^8.6.1" 35 "react-jss": "^8.6.1"
36 }, 36 },
37 "gitHead": "e9b9079dc921e85961954727a7b2a8eabe5b9798" 37 "gitHead": "9f2ab40b7602bc3df26ebb093b484b9917768f69"
38} 38}
diff --git a/src/actions/service.js b/src/actions/service.js
index ce62560a9..68c62d594 100644
--- a/src/actions/service.js
+++ b/src/actions/service.js
@@ -4,6 +4,7 @@ import ServiceModel from '../models/Service';
4export default { 4export default {
5 setActive: { 5 setActive: {
6 serviceId: PropTypes.string.isRequired, 6 serviceId: PropTypes.string.isRequired,
7 keepActiveRoute: PropTypes.bool,
7 }, 8 },
8 blurActive: {}, 9 blurActive: {},
9 setActiveNext: {}, 10 setActiveNext: {},
diff --git a/src/app.js b/src/app.js
index f6092bf60..cb3e37c64 100644
--- a/src/app.js
+++ b/src/app.js
@@ -43,6 +43,8 @@ import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopup
43import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; 43import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
44import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; 44import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
45import { WORKSPACES_ROUTES } from './features/workspaces'; 45import { WORKSPACES_ROUTES } from './features/workspaces';
46import AnnouncementScreen from './features/announcements/components/AnnouncementScreen';
47import { ANNOUNCEMENTS_ROUTES } from './features/announcements';
46 48
47// Add Polyfills 49// Add Polyfills
48smoothScroll.polyfill(); 50smoothScroll.polyfill();
@@ -73,6 +75,7 @@ window.addEventListener('load', () => {
73 <I18N> 75 <I18N>
74 <Router history={history}> 76 <Router history={history}>
75 <Route path="/" component={AppLayoutContainer}> 77 <Route path="/" component={AppLayoutContainer}>
78 <Route path={ANNOUNCEMENTS_ROUTES.TARGET} component={AnnouncementScreen} />
76 <Route path="/settings" component={SettingsWindow}> 79 <Route path="/settings" component={SettingsWindow}>
77 <IndexRedirect to="/settings/recipes" /> 80 <IndexRedirect to="/settings/recipes" />
78 <Route path="/settings/recipes" component={RecipesScreen} /> 81 <Route path="/settings/recipes" component={RecipesScreen} />
diff --git a/src/assets/images/tray/win32/tray-unread.ico b/src/assets/images/tray/win32/tray-unread.ico
index a59428cfb..507845120 100644
--- a/src/assets/images/tray/win32/tray-unread.ico
+++ b/src/assets/images/tray/win32/tray-unread.ico
Binary files differ
diff --git a/src/assets/images/tray/win32/tray-unread@2x.ico b/src/assets/images/tray/win32/tray-unread@2x.ico
deleted file mode 100644
index f6fe65093..000000000
--- a/src/assets/images/tray/win32/tray-unread@2x.ico
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/tray/win32/tray.ico b/src/assets/images/tray/win32/tray.ico
index d3aa25d68..1f0057a8c 100644
--- a/src/assets/images/tray/win32/tray.ico
+++ b/src/assets/images/tray/win32/tray.ico
Binary files differ
diff --git a/src/assets/images/tray/win32/tray@2x.ico b/src/assets/images/tray/win32/tray@2x.ico
deleted file mode 100644
index c1b7a73a5..000000000
--- a/src/assets/images/tray/win32/tray@2x.ico
+++ /dev/null
Binary files differ
diff --git a/src/components/AppUpdateInfoBar.js b/src/components/AppUpdateInfoBar.js
new file mode 100644
index 000000000..4fb3a8b71
--- /dev/null
+++ b/src/components/AppUpdateInfoBar.js
@@ -0,0 +1,66 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl';
4
5import { announcementActions } from '../features/announcements/actions';
6import InfoBar from './ui/InfoBar';
7
8const messages = defineMessages({
9 updateAvailable: {
10 id: 'infobar.updateAvailable',
11 defaultMessage: '!!!A new update for Franz is available.',
12 },
13 changelog: {
14 id: 'infobar.buttonChangelog',
15 defaultMessage: '!!!Changelog',
16 },
17 buttonInstallUpdate: {
18 id: 'infobar.buttonInstallUpdate',
19 defaultMessage: '!!!Restart & install update',
20 },
21});
22
23class AppUpdateInfoBar extends Component {
24 static propTypes = {
25 onInstallUpdate: PropTypes.func.isRequired,
26 nextAppReleaseVersion: PropTypes.string,
27 };
28
29 static defaultProps = {
30 nextAppReleaseVersion: null,
31 };
32
33 static contextTypes = {
34 intl: intlShape,
35 };
36
37 render() {
38 const { intl } = this.context;
39 const {
40 onInstallUpdate,
41 nextAppReleaseVersion,
42 } = this.props;
43
44 return (
45 <InfoBar
46 type="primary"
47 ctaLabel={intl.formatMessage(messages.buttonInstallUpdate)}
48 onClick={onInstallUpdate}
49 sticky
50 >
51 <span className="mdi mdi-information" />
52 {intl.formatMessage(messages.updateAvailable)}
53 {' '}
54 <button
55 className="info-bar__inline-button"
56 type="button"
57 onClick={() => announcementActions.show({ targetVersion: nextAppReleaseVersion })}
58 >
59 <u>{intl.formatMessage(messages.changelog)}</u>
60 </button>
61 </InfoBar>
62 );
63 }
64}
65
66export default AppUpdateInfoBar;
diff --git a/src/components/auth/AuthLayout.js b/src/components/auth/AuthLayout.js
index ac8fdbe5b..3d43d4e5c 100644
--- a/src/components/auth/AuthLayout.js
+++ b/src/components/auth/AuthLayout.js
@@ -11,6 +11,7 @@ import { oneOrManyChildElements, globalError as globalErrorPropType } from '../.
11import globalMessages from '../../i18n/globalMessages'; 11import globalMessages from '../../i18n/globalMessages';
12 12
13import { isWindows } from '../../environment'; 13import { isWindows } from '../../environment';
14import AppUpdateInfoBar from '../AppUpdateInfoBar';
14 15
15export default @observer class AuthLayout extends Component { 16export default @observer class AuthLayout extends Component {
16 static propTypes = { 17 static propTypes = {
@@ -22,6 +23,13 @@ export default @observer class AuthLayout extends Component {
22 isHealthCheckLoading: PropTypes.bool.isRequired, 23 isHealthCheckLoading: PropTypes.bool.isRequired,
23 isFullScreen: PropTypes.bool.isRequired, 24 isFullScreen: PropTypes.bool.isRequired,
24 darkMode: PropTypes.bool.isRequired, 25 darkMode: PropTypes.bool.isRequired,
26 nextAppReleaseVersion: PropTypes.string,
27 installAppUpdate: PropTypes.func.isRequired,
28 appUpdateIsDownloaded: PropTypes.bool.isRequired,
29 };
30
31 static defaultProps = {
32 nextAppReleaseVersion: null,
25 }; 33 };
26 34
27 static contextTypes = { 35 static contextTypes = {
@@ -38,6 +46,9 @@ export default @observer class AuthLayout extends Component {
38 isHealthCheckLoading, 46 isHealthCheckLoading,
39 isFullScreen, 47 isFullScreen,
40 darkMode, 48 darkMode,
49 nextAppReleaseVersion,
50 installAppUpdate,
51 appUpdateIsDownloaded,
41 } = this.props; 52 } = this.props;
42 const { intl } = this.context; 53 const { intl } = this.context;
43 54
@@ -53,6 +64,12 @@ export default @observer class AuthLayout extends Component {
53 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 64 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
54 </InfoBar> 65 </InfoBar>
55 )} 66 )}
67 {appUpdateIsDownloaded && (
68 <AppUpdateInfoBar
69 nextAppReleaseVersion={nextAppReleaseVersion}
70 onInstallUpdate={installAppUpdate}
71 />
72 )}
56 {isOnline && !isAPIHealthy && ( 73 {isOnline && !isAPIHealthy && (
57 <InfoBar 74 <InfoBar
58 type="danger" 75 type="danger"
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index d5febfaf4..499bc097a 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -14,10 +14,9 @@ import ErrorBoundary from '../util/ErrorBoundary';
14// import globalMessages from '../../i18n/globalMessages'; 14// import globalMessages from '../../i18n/globalMessages';
15 15
16import { isWindows } from '../../environment'; 16import { isWindows } from '../../environment';
17import AnnouncementScreen from '../../features/announcements/components/AnnouncementScreen';
18import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; 17import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator';
19import { workspaceStore } from '../../features/workspaces'; 18import { workspaceStore } from '../../features/workspaces';
20import { announcementActions } from '../../features/announcements/actions'; 19import AppUpdateInfoBar from '../AppUpdateInfoBar';
21 20
22function createMarkup(HTMLString) { 21function createMarkup(HTMLString) {
23 return { __html: HTMLString }; 22 return { __html: HTMLString };
@@ -28,22 +27,10 @@ const messages = defineMessages({
28 id: 'infobar.servicesUpdated', 27 id: 'infobar.servicesUpdated',
29 defaultMessage: '!!!Your services have been updated.', 28 defaultMessage: '!!!Your services have been updated.',
30 }, 29 },
31 updateAvailable: {
32 id: 'infobar.updateAvailable',
33 defaultMessage: '!!!A new update for Franz is available.',
34 },
35 buttonReloadServices: { 30 buttonReloadServices: {
36 id: 'infobar.buttonReloadServices', 31 id: 'infobar.buttonReloadServices',
37 defaultMessage: '!!!Reload services', 32 defaultMessage: '!!!Reload services',
38 }, 33 },
39 changelog: {
40 id: 'infobar.buttonChangelog',
41 defaultMessage: '!!!Changelog',
42 },
43 buttonInstallUpdate: {
44 id: 'infobar.buttonInstallUpdate',
45 defaultMessage: '!!!Restart & install update',
46 },
47 requiredRequestsFailed: { 34 requiredRequestsFailed: {
48 id: 'infobar.requiredRequestsFailed', 35 id: 'infobar.requiredRequestsFailed',
49 defaultMessage: '!!!Could not load services and user information', 36 defaultMessage: '!!!Could not load services and user information',
@@ -83,7 +70,6 @@ class AppLayout extends Component {
83 areRequiredRequestsLoading: PropTypes.bool.isRequired, 70 areRequiredRequestsLoading: PropTypes.bool.isRequired,
84 darkMode: PropTypes.bool.isRequired, 71 darkMode: PropTypes.bool.isRequired,
85 isDelayAppScreenVisible: PropTypes.bool.isRequired, 72 isDelayAppScreenVisible: PropTypes.bool.isRequired,
86 isAnnouncementVisible: PropTypes.bool.isRequired,
87 }; 73 };
88 74
89 static defaultProps = { 75 static defaultProps = {
@@ -117,7 +103,6 @@ class AppLayout extends Component {
117 areRequiredRequestsLoading, 103 areRequiredRequestsLoading,
118 darkMode, 104 darkMode,
119 isDelayAppScreenVisible, 105 isDelayAppScreenVisible,
120 isAnnouncementVisible,
121 } = this.props; 106 } = this.props;
122 107
123 const { intl } = this.context; 108 const { intl } = this.context;
@@ -176,33 +161,19 @@ class AppLayout extends Component {
176 </InfoBar> 161 </InfoBar>
177 )} 162 )}
178 {appUpdateIsDownloaded && ( 163 {appUpdateIsDownloaded && (
179 <InfoBar 164 <AppUpdateInfoBar
180 type="primary" 165 nextAppReleaseVersion={nextAppReleaseVersion}
181 ctaLabel={intl.formatMessage(messages.buttonInstallUpdate)} 166 onInstallUpdate={installAppUpdate}
182 onClick={installAppUpdate} 167 />
183 sticky
184 >
185 <span className="mdi mdi-information" />
186 {intl.formatMessage(messages.updateAvailable)}
187 {' '}
188 <button
189 className="info-bar__inline-button"
190 type="button"
191 onClick={() => announcementActions.show({ targetVersion: nextAppReleaseVersion })}
192 >
193 <u>{intl.formatMessage(messages.changelog)}</u>
194 </button>
195 </InfoBar>
196 )} 168 )}
197 {isDelayAppScreenVisible && (<DelayApp />)} 169 {isDelayAppScreenVisible && (<DelayApp />)}
198 <BasicAuth /> 170 <BasicAuth />
199 <ShareFranz /> 171 <ShareFranz />
200 {isAnnouncementVisible && (<AnnouncementScreen />)}
201 {services} 172 {services}
173 {children}
202 </div> 174 </div>
203 </div> 175 </div>
204 </div> 176 </div>
205 {children}
206 </div> 177 </div>
207 </ErrorBoundary> 178 </ErrorBoundary>
208 ); 179 );
diff --git a/src/containers/auth/AuthLayoutContainer.js b/src/containers/auth/AuthLayoutContainer.js
index e63f40c06..1f9c1ea61 100644
--- a/src/containers/auth/AuthLayoutContainer.js
+++ b/src/containers/auth/AuthLayoutContainer.js
@@ -51,6 +51,9 @@ export default @inject('stores', 'actions') @observer class AuthLayoutContainer
51 isHealthCheckLoading={app.healthCheckRequest.isExecuting} 51 isHealthCheckLoading={app.healthCheckRequest.isExecuting}
52 isFullScreen={app.isFullScreen} 52 isFullScreen={app.isFullScreen}
53 darkMode={app.isSystemDarkModeEnabled} 53 darkMode={app.isSystemDarkModeEnabled}
54 installAppUpdate={actions.app.installUpdate}
55 nextAppReleaseVersion={app.nextAppReleaseVersion}
56 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED}
54 > 57 >
55 {children} 58 {children}
56 </AuthLayout> 59 </AuthLayout>
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index d2891a6a4..d290a6094 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -23,7 +23,6 @@ import { state as delayAppState } from '../../features/delayApp';
23import { workspaceActions } from '../../features/workspaces/actions'; 23import { workspaceActions } from '../../features/workspaces/actions';
24import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; 24import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer';
25import { workspaceStore } from '../../features/workspaces'; 25import { workspaceStore } from '../../features/workspaces';
26import { announcementsStore } from '../../features/announcements';
27 26
28export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component { 27export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component {
29 static defaultProps = { 28 static defaultProps = {
@@ -151,7 +150,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
151 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 150 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
152 darkMode={settings.all.app.darkMode} 151 darkMode={settings.all.app.darkMode}
153 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} 152 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
154 isAnnouncementVisible={announcementsStore.isAnnouncementVisible}
155 > 153 >
156 {React.Children.count(children) > 0 ? children : null} 154 {React.Children.count(children) > 0 ? children : null}
157 </AppLayout> 155 </AppLayout>
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index b3f967353..66076504f 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -27,7 +27,6 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
27 const { actions, stores } = this.props; 27 const { actions, stores } = this.props;
28 28
29 const url = `${WEBSITE}${route}?authToken=${stores.user.authToken}&utm_source=app&utm_medium=account_dashboard`; 29 const url = `${WEBSITE}${route}?authToken=${stores.user.authToken}&utm_source=app&utm_medium=account_dashboard`;
30 console.log(url);
31 30
32 actions.app.openExternalUrl({ url }); 31 actions.app.openExternalUrl({ url });
33 } 32 }
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
index cb67ee7f2..aa1166f5e 100644
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ b/src/containers/subscription/SubscriptionFormScreen.js
@@ -56,6 +56,7 @@ export default @inject('stores', 'actions') @observer class SubscriptionFormScre
56 minWidth: 600, 56 minWidth: 600,
57 webPreferences: { 57 webPreferences: {
58 nodeIntegration: true, 58 nodeIntegration: true,
59 webviewTag: true,
59 }, 60 },
60 }); 61 });
61 paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPage.url)}`); 62 paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPage.url)}`);
diff --git a/src/containers/subscription/SubscriptionPopupScreen.js b/src/containers/subscription/SubscriptionPopupScreen.js
index 6641f236d..f76d6c5a6 100644
--- a/src/containers/subscription/SubscriptionPopupScreen.js
+++ b/src/containers/subscription/SubscriptionPopupScreen.js
@@ -13,7 +13,7 @@ export default @inject('stores', 'actions') @observer class SubscriptionPopupScr
13 completeCheck(event) { 13 completeCheck(event) {
14 const { url } = event; 14 const { url } = event;
15 15
16 if (url.includes('recurly') && url.includes('confirmation')) { 16 if ((url.includes('recurly') && url.includes('confirmation')) || (url.includes('meetfranz') && url.includes('success'))) {
17 this.setState({ 17 this.setState({
18 complete: true, 18 complete: true,
19 }); 19 });
diff --git a/src/dev-app-update.yml b/src/dev-app-update.yml
new file mode 100644
index 000000000..8ddca71e3
--- /dev/null
+++ b/src/dev-app-update.yml
@@ -0,0 +1,3 @@
1owner: meetfranz
2repo: franz
3provider: github
diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js
index dfce6cdd5..e7c5fe395 100644
--- a/src/features/announcements/components/AnnouncementScreen.js
+++ b/src/features/announcements/components/AnnouncementScreen.js
@@ -268,7 +268,7 @@ class AnnouncementScreen extends Component {
268 <div className={classes.changelog}> 268 <div className={classes.changelog}>
269 <h1 className={classes.headline}> 269 <h1 className={classes.headline}>
270 {intl.formatMessage(messages.headline, { 270 {intl.formatMessage(messages.headline, {
271 version: announcementsStore.currentVersion, 271 version: announcementsStore.targetVersion,
272 })} 272 })}
273 </h1> 273 </h1>
274 <div 274 <div
diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js
index 4658b976f..f14e7c9a5 100644
--- a/src/features/announcements/index.js
+++ b/src/features/announcements/index.js
@@ -7,6 +7,10 @@ export const GA_CATEGORY_ANNOUNCEMENTS = 'Announcements';
7 7
8export const announcementsStore = new AnnouncementsStore(); 8export const announcementsStore = new AnnouncementsStore();
9 9
10export const ANNOUNCEMENTS_ROUTES = {
11 TARGET: '/announcements/:id',
12};
13
10export default function initAnnouncements(stores, actions) { 14export default function initAnnouncements(stores, actions) {
11 // const { features } = stores; 15 // const { features } = stores;
12 16
diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js
index 7ecc0e346..de7ed2596 100644
--- a/src/features/announcements/store.js
+++ b/src/features/announcements/store.js
@@ -2,18 +2,19 @@ import {
2 action, 2 action,
3 computed, 3 computed,
4 observable, 4 observable,
5 reaction,
6} from 'mobx'; 5} from 'mobx';
7import semver from 'semver'; 6import semver from 'semver';
8import localStorage from 'mobx-localstorage'; 7import localStorage from 'mobx-localstorage';
9 8
10import { FeatureStore } from '../utils/FeatureStore'; 9import { FeatureStore } from '../utils/FeatureStore';
11import { GA_CATEGORY_ANNOUNCEMENTS } from '.'; 10import { ANNOUNCEMENTS_ROUTES, GA_CATEGORY_ANNOUNCEMENTS } from '.';
12import { getAnnouncementRequest, getChangelogRequest, getCurrentVersionRequest } from './api'; 11import { getAnnouncementRequest, getChangelogRequest, getCurrentVersionRequest } from './api';
13import { announcementActions } from './actions'; 12import { announcementActions } from './actions';
14import { createActionBindings } from '../utils/ActionBinding'; 13import { createActionBindings } from '../utils/ActionBinding';
15import { createReactions } from '../../stores/lib/Reaction'; 14import { createReactions } from '../../stores/lib/Reaction';
16import { gaEvent } from '../../lib/analytics'; 15import { gaEvent } from '../../lib/analytics';
16import { matchRoute } from '../../helpers/routing-helpers';
17import { DEFAULT_APP_SETTINGS } from '../../config';
17 18
18const LOCAL_STORAGE_KEY = 'announcements'; 19const LOCAL_STORAGE_KEY = 'announcements';
19 20
@@ -22,8 +23,6 @@ const debug = require('debug')('Franz:feature:announcements:store');
22export class AnnouncementsStore extends FeatureStore { 23export class AnnouncementsStore extends FeatureStore {
23 @observable targetVersion = null; 24 @observable targetVersion = null;
24 25
25 @observable isAnnouncementVisible = false;
26
27 @observable isFeatureActive = false; 26 @observable isFeatureActive = false;
28 27
29 @computed get changelog() { 28 @computed get changelog() {
@@ -31,7 +30,15 @@ export class AnnouncementsStore extends FeatureStore {
31 } 30 }
32 31
33 @computed get announcement() { 32 @computed get announcement() {
34 return getAnnouncementRequest.result; 33 if (!this.stores || !getAnnouncementRequest.result) return null;
34 const { locale } = this.stores.app;
35 const announcement = getAnnouncementRequest.result;
36 // User locale
37 if (announcement[locale]) return announcement[locale];
38 // Default locale
39 if (announcement[DEFAULT_APP_SETTINGS.fallbackLocale]) return announcement[DEFAULT_APP_SETTINGS.fallbackLocale];
40 // No locales specified
41 return announcement;
35 } 42 }
36 43
37 @computed get areNewsAvailable() { 44 @computed get areNewsAvailable() {
@@ -67,8 +74,9 @@ export class AnnouncementsStore extends FeatureStore {
67 ])); 74 ]));
68 75
69 this._reactions = createReactions([ 76 this._reactions = createReactions([
70 this._fetchAnnouncements, 77 this._showAnnouncementOnRouteMatch,
71 this._showAnnouncementToUsersWhoUpdatedApp, 78 this._showAnnouncementToUsersWhoUpdatedApp,
79 this._fetchAnnouncements,
72 ]); 80 ]);
73 this._registerReactions(this._reactions); 81 this._registerReactions(this._reactions);
74 this.isFeatureActive = true; 82 this.isFeatureActive = true;
@@ -78,7 +86,6 @@ export class AnnouncementsStore extends FeatureStore {
78 super.stop(); 86 super.stop();
79 debug('AnnouncementsStore::stop'); 87 debug('AnnouncementsStore::stop');
80 this.isFeatureActive = false; 88 this.isFeatureActive = false;
81 this.isAnnouncementVisible = false;
82 } 89 }
83 90
84 // ======= HELPERS ======= // 91 // ======= HELPERS ======= //
@@ -93,39 +100,29 @@ export class AnnouncementsStore extends FeatureStore {
93 // ======= ACTIONS ======= // 100 // ======= ACTIONS ======= //
94 101
95 @action _showAnnouncement = ({ targetVersion } = {}) => { 102 @action _showAnnouncement = ({ targetVersion } = {}) => {
96 if (!this.areNewsAvailable) return; 103 const { router } = this.stores;
97 this.targetVersion = targetVersion || this.currentVersion; 104 this.targetVersion = targetVersion || this.currentVersion;
98 this.isAnnouncementVisible = true;
99 this.actions.service.blurActive();
100 this._updateSettings({ 105 this._updateSettings({
101 lastSeenAnnouncementVersion: this.currentVersion, 106 lastSeenAnnouncementVersion: this.currentVersion,
102 }); 107 });
103 const dispose = reaction( 108 const targetRoute = `/announcements/${this.targetVersion}`;
104 () => this.stores.services.active, 109 if (router.location.pathname !== targetRoute) {
105 () => { 110 this.stores.router.push(targetRoute);
106 this._hideAnnouncement(); 111 }
107 dispose();
108 },
109 );
110
111 gaEvent(GA_CATEGORY_ANNOUNCEMENTS, 'show'); 112 gaEvent(GA_CATEGORY_ANNOUNCEMENTS, 'show');
112 }; 113 };
113 114
114 @action _hideAnnouncement() {
115 this.isAnnouncementVisible = false;
116 }
117
118 // ======= REACTIONS ======== 115 // ======= REACTIONS ========
119 116
120 _showAnnouncementToUsersWhoUpdatedApp = () => { 117 _showAnnouncementToUsersWhoUpdatedApp = () => {
121 const { announcement, isNewUser } = this; 118 const { announcement, isNewUser } = this;
122 // Check if there is an announcement and on't show announcements to new users 119 // Check if there is an announcement and don't show announcements to new users
123 if (!announcement || isNewUser) return; 120 if (!announcement || isNewUser) return;
124 121
125 // Check if the user has already used current version (= has seen the announcement) 122 // Check if the user has already used current version (= has seen the announcement)
126 const { currentVersion, lastSeenAnnouncementVersion } = this; 123 const { currentVersion, lastSeenAnnouncementVersion } = this;
127 if (semver.gt(currentVersion, lastSeenAnnouncementVersion || '0.0.0')) { 124 if (semver.gt(currentVersion, lastSeenAnnouncementVersion || '0.0.0')) {
128 debug(`${currentVersion} < ${lastSeenAnnouncementVersion}: announcement is shown`); 125 debug(`${currentVersion} > ${lastSeenAnnouncementVersion}: announcement is shown`);
129 this._showAnnouncement(); 126 this._showAnnouncement();
130 } 127 }
131 }; 128 };
@@ -133,12 +130,16 @@ export class AnnouncementsStore extends FeatureStore {
133 _fetchAnnouncements = () => { 130 _fetchAnnouncements = () => {
134 const targetVersion = this.targetVersion || this.currentVersion; 131 const targetVersion = this.targetVersion || this.currentVersion;
135 if (!targetVersion) return; 132 if (!targetVersion) return;
136 getChangelogRequest.execute(targetVersion); 133 getChangelogRequest.reset().execute(targetVersion);
137 // We only fetch announcements for current / older versions 134 getAnnouncementRequest.reset().execute(targetVersion);
138 if (targetVersion <= this.currentVersion) { 135 };
139 getAnnouncementRequest.execute(targetVersion); 136
140 } else { 137 _showAnnouncementOnRouteMatch = () => {
141 getAnnouncementRequest.reset(); 138 const { router } = this.stores;
139 const match = matchRoute(ANNOUNCEMENTS_ROUTES.TARGET, router.location.pathname);
140 if (match) {
141 const targetVersion = match.id;
142 this._showAnnouncement({ targetVersion });
142 } 143 }
143 } 144 }
144} 145}
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index e11513d1f..07b16ff23 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -57,6 +57,10 @@ export default class WorkspacesStore extends FeatureStore {
57 return !this.isPremiumUpgradeRequired; 57 return !this.isPremiumUpgradeRequired;
58 } 58 }
59 59
60 @computed get isAnyWorkspaceActive() {
61 return !!this.activeWorkspace;
62 }
63
60 // ========== PRIVATE PROPERTIES ========= // 64 // ========== PRIVATE PROPERTIES ========= //
61 65
62 _wasDrawerOpenBeforeSettingsRoute = null; 66 _wasDrawerOpenBeforeSettingsRoute = null;
@@ -229,6 +233,14 @@ export default class WorkspacesStore extends FeatureStore {
229 this.actions.ui.openSettings({ path: 'workspaces' }); 233 this.actions.ui.openSettings({ path: 'workspaces' });
230 }; 234 };
231 235
236 @action reorderServicesOfActiveWorkspace = async ({ oldIndex, newIndex }) => {
237 const { activeWorkspace } = this;
238 const { services } = activeWorkspace;
239 // Move services from the old to the new position
240 services.splice(newIndex, 0, services.splice(oldIndex, 1)[0]);
241 await updateWorkspaceRequest.execute(activeWorkspace);
242 };
243
232 // Reactions 244 // Reactions
233 245
234 _setFeatureEnabledReaction = () => { 246 _setFeatureEnabledReaction = () => {
@@ -255,13 +267,15 @@ export default class WorkspacesStore extends FeatureStore {
255 _setActiveServiceOnWorkspaceSwitchReaction = () => { 267 _setActiveServiceOnWorkspaceSwitchReaction = () => {
256 if (!this.isFeatureActive) return; 268 if (!this.isFeatureActive) return;
257 if (this.activeWorkspace) { 269 if (this.activeWorkspace) {
258 const services = this.stores.services.allDisplayed; 270 const activeService = this.stores.services.active;
259 const activeService = services.find(s => s.isActive);
260 const workspaceServices = this.getWorkspaceServices(this.activeWorkspace); 271 const workspaceServices = this.getWorkspaceServices(this.activeWorkspace);
261 if (workspaceServices.length <= 0) return; 272 if (workspaceServices.length <= 0) return;
262 const isActiveServiceInWorkspace = workspaceServices.includes(activeService); 273 const isActiveServiceInWorkspace = workspaceServices.includes(activeService);
263 if (!isActiveServiceInWorkspace) { 274 if (!isActiveServiceInWorkspace) {
264 this.actions.service.setActive({ serviceId: workspaceServices[0].id }); 275 this.actions.service.setActive({
276 serviceId: workspaceServices[0].id,
277 keepActiveRoute: true,
278 });
265 } 279 }
266 } 280 }
267 }; 281 };
@@ -298,17 +312,16 @@ export default class WorkspacesStore extends FeatureStore {
298 312
299 _cleanupInvalidServiceReferences = () => { 313 _cleanupInvalidServiceReferences = () => {
300 const { services } = this.stores; 314 const { services } = this.stores;
301 let invalidServiceReferencesExist = false; 315 const { allServicesRequest } = services;
316 const servicesHaveBeenLoaded = allServicesRequest.wasExecuted && !allServicesRequest.isError;
317 // Loop through all workspaces and remove invalid service ids (locally)
302 this.workspaces.forEach((workspace) => { 318 this.workspaces.forEach((workspace) => {
303 workspace.services.forEach((serviceId) => { 319 workspace.services.forEach((serviceId) => {
304 if (!services.one(serviceId)) { 320 if (servicesHaveBeenLoaded && !services.one(serviceId)) {
305 invalidServiceReferencesExist = true; 321 workspace.services.remove(serviceId);
306 } 322 }
307 }); 323 });
308 }); 324 });
309 if (invalidServiceReferencesExist) {
310 getUserWorkspacesRequest.execute();
311 }
312 }; 325 };
313 326
314 _stopPremiumActionsAndReactions = () => { 327 _stopPremiumActionsAndReactions = () => {
diff --git a/src/helpers/validation-helpers.js b/src/helpers/validation-helpers.js
index 2f762437d..ab2376b1b 100644
--- a/src/helpers/validation-helpers.js
+++ b/src/helpers/validation-helpers.js
@@ -1,4 +1,5 @@
1import { defineMessages } from 'react-intl'; 1import { defineMessages } from 'react-intl';
2import isEmail from 'validator/lib/isEmail';
2 3
3const messages = defineMessages({ 4const messages = defineMessages({
4 required: { 5 required: {
@@ -30,14 +31,7 @@ export function required({ field }) {
30 31
31export function email({ field }) { 32export function email({ field }) {
32 const value = field.value.trim(); 33 const value = field.value.trim();
33 let isValid = false; 34 const isValid = isEmail(value);
34
35 if (value !== '') {
36 isValid = Boolean(value.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}/i));
37 } else {
38 isValid = true;
39 }
40
41 return [isValid, window.franz.intl.formatMessage(messages.email, { field: field.label })]; 35 return [isValid, window.franz.intl.formatMessage(messages.email, { field: field.label })];
42} 36}
43 37
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index b2aaaa070..50d2223dd 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -7,16 +7,16 @@
7 "feature.delayApp.text" : "Franz continuarà en {seconds} segons", 7 "feature.delayApp.text" : "Franz continuarà en {seconds} segons",
8 "feature.shareFranz.action.email" : "Envia com a correu", 8 "feature.shareFranz.action.email" : "Envia com a correu",
9 "feature.shareFranz.action.facebook" : "Compartir en Facebook", 9 "feature.shareFranz.action.facebook" : "Compartir en Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 10 "feature.shareFranz.action.twitter" : "Compartir a Twitter",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "Junts millorem Franz!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "He afegit {count} serveis a Franz! Obtén l'aplicació gratuïta per a Whatsapp, Messenger, Slack, Skype a www,meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "He afegit {count} serveis a Franz! Obtén l'aplicació gratuïta de Whatsapp, Messenger, Slack, Skype i altres a www.meetfranz.com\/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Digues als teus amics i col·legues l'increïble que és Franz i ajuda'ns a rrer la veu ",
15 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz", 15 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz",
16 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.", 16 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.",
17 "global.spellchecker.useDefault" : "Utilitzar el predeterminat del sistema ({default})", 17 "global.spellchecker.useDefault" : "Utilitzar el predeterminat del sistema ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 18 "global.spellchecking.autodetect" : "Detectar l'idioma automàticament",
19 "global.spellchecking.autodetect.short" : "Automatic", 19 "global.spellchecking.autodetect.short" : "Automàtic",
20 "global.spellchecking.language" : "Corrector ortogràfic", 20 "global.spellchecking.language" : "Corrector ortogràfic",
21 "import.headline" : "Importa els teus serveis Franz 4", 21 "import.headline" : "Importa els teus serveis Franz 4",
22 "import.notSupportedHeadline" : "Serveis que encara no s'admeten a Franz 5", 22 "import.notSupportedHeadline" : "Serveis que encara no s'admeten a Franz 5",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Accedir", 44 "login.submit.label" : "Accedir",
45 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.", 45 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.",
46 "menu.app.about" : "Sobre Franz", 46 "menu.app.about" : "Sobre Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Què hi ha de nou?",
48 "menu.app.checkForUpdates" : "Comprova si hi ha actualitzacions",
48 "menu.app.hide" : "Amaga", 49 "menu.app.hide" : "Amaga",
49 "menu.app.hideOthers" : "Amaga altres", 50 "menu.app.hideOthers" : "Amaga altres",
50 "menu.app.quit" : "Surt", 51 "menu.app.quit" : "Surt",
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index aadfeffbc..809c5d5a8 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -1,7 +1,7 @@
1{ 1{
2 "app.errorHandler.action" : "Obnovit", 2 "app.errorHandler.action" : "Obnovit",
3 "app.errorHandler.headline" : "Něco se pokazilo", 3 "app.errorHandler.headline" : "Něco se pokazilo",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Změny ve Franz {version}",
5 "feature.delayApp.action" : "Podpoř Franz a získej Supporter licenci", 5 "feature.delayApp.action" : "Podpoř Franz a získej Supporter licenci",
6 "feature.delayApp.headline" : "Kup si Franz Supporter licenci a nebudeš už muset čekat", 6 "feature.delayApp.headline" : "Kup si Franz Supporter licenci a nebudeš už muset čekat",
7 "feature.delayApp.text" : "Franz bude pokračovat v {seconds} sekundách.", 7 "feature.delayApp.text" : "Franz bude pokračovat v {seconds} sekundách.",
@@ -9,7 +9,7 @@
9 "feature.shareFranz.action.facebook" : "Sdílet na Facebooku", 9 "feature.shareFranz.action.facebook" : "Sdílet na Facebooku",
10 "feature.shareFranz.action.twitter" : "Sdílet na Twitteru", 10 "feature.shareFranz.action.twitter" : "Sdílet na Twitteru",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "Franz is better together!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Přidali jsme {count} služeb do Franze. Získejte zdarma aplikace pro WhatsApp, Messenger, SLack, Skype a další na www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
15 "global.api.unhealthy" : "Nemůžeme připojit Franz k online službám", 15 "global.api.unhealthy" : "Nemůžeme připojit Franz k online službám",
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Sezení vypršelo, prosím přihlaste se znovu", 45 "login.tokenExpired" : "Sezení vypršelo, prosím přihlaste se znovu",
46 "menu.app.about" : "O aplikaci", 46 "menu.app.about" : "O aplikaci",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Zkontrolovat aktualizace",
48 "menu.app.hide" : "Skrýt", 49 "menu.app.hide" : "Skrýt",
49 "menu.app.hideOthers" : "Skryt ostatní", 50 "menu.app.hideOthers" : "Skryt ostatní",
50 "menu.app.quit" : "Ukončit", 51 "menu.app.quit" : "Ukončit",
@@ -139,7 +140,7 @@
139 "settings.account.manageSubscription.label" : "Spravovat vaše předplatné", 140 "settings.account.manageSubscription.label" : "Spravovat vaše předplatné",
140 "settings.account.successInfo" : "Vaše změny byly uloženy", 141 "settings.account.successInfo" : "Vaše změny byly uloženy",
141 "settings.account.tryReloadServices" : "Zkusit opět", 142 "settings.account.tryReloadServices" : "Zkusit opět",
142 "settings.account.tryReloadUserInfoRequest" : "Zkusit opět", 143 "settings.account.tryReloadUserInfoRequest" : "Zkusit znovu",
143 "settings.account.userInfoRequestFailed" : "Nelze načíst informace o uživateli.", 144 "settings.account.userInfoRequestFailed" : "Nelze načíst informace o uživateli.",
144 "settings.app.buttonClearAllCache" : "Vyprázdnit mezipaměti", 145 "settings.app.buttonClearAllCache" : "Vyprázdnit mezipaměti",
145 "settings.app.buttonInstallUpdate" : "Restartovat a nainstalovat aktualizace", 146 "settings.app.buttonInstallUpdate" : "Restartovat a nainstalovat aktualizace",
@@ -262,7 +263,7 @@
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Your workspaces",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
265 "settings.workspaces.tryReloadWorkspaces" : "Zkusit opět", 266 "settings.workspaces.tryReloadWorkspaces" : "Zkusit znovu",
266 "settings.workspaces.updatedInfo" : "Vaše změny byly uloženy", 267 "settings.workspaces.updatedInfo" : "Vaše změny byly uloženy",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index bd5193177..4d06e17e4 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -9,10 +9,10 @@
9 "feature.shareFranz.action.facebook" : "Auf Facebook teilen", 9 "feature.shareFranz.action.facebook" : "Auf Facebook teilen",
10 "feature.shareFranz.action.twitter" : "Auf Twitter teilen", 10 "feature.shareFranz.action.twitter" : "Auf Twitter teilen",
11 "feature.shareFranz.headline" : "Gemeinsam ist Franz noch besser!", 11 "feature.shareFranz.headline" : "Gemeinsam ist Franz noch besser!",
12 "feature.shareFranz.shareText.email" : "Ich verwende Franz! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Ich habe {count} Services zu Franz hinzugefügt! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Ich habe {count} Services zu Franz hinzugefügt! Hol dir die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Ich habe {count} Services zu Franz hinzugefügt! Hol dir die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Bitte erzähle deinen Freunden und Kolleginnen, warum du Franz toll findest.", 14 "feature.shareFranz.text" : "Bitte erzähle deinen Freunden und Kolleginnen, warum du Franz toll findest.",
15 "global.api.unhealthy" : "Verbindung zum Franz Online Service fehlgeschlagen", 15 "global.api.unhealthy" : "Verbindung zum Franz-Online-Service fehlgeschlagen",
16 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.", 16 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.",
17 "global.spellchecker.useDefault" : "Standard benutzen ({default})", 17 "global.spellchecker.useDefault" : "Standard benutzen ({default})",
18 "global.spellchecking.autodetect" : "Sprache automatisch erkennen", 18 "global.spellchecking.autodetect" : "Sprache automatisch erkennen",
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.", 45 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.",
46 "menu.app.about" : "Über Franz", 46 "menu.app.about" : "Über Franz",
47 "menu.app.announcement" : "Was ist neu?", 47 "menu.app.announcement" : "Was ist neu?",
48 "menu.app.checkForUpdates" : "Nach Updates suchen",
48 "menu.app.hide" : "Ausblenden", 49 "menu.app.hide" : "Ausblenden",
49 "menu.app.hideOthers" : "Andere ausblenden", 50 "menu.app.hideOthers" : "Andere ausblenden",
50 "menu.app.quit" : "Beenden", 51 "menu.app.quit" : "Beenden",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 9980274d3..a5572bd32 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -2,6 +2,50 @@
2 { 2 {
3 "descriptors": [ 3 "descriptors": [
4 { 4 {
5 "defaultMessage": "!!!A new update for Franz is available.",
6 "end": {
7 "column": 3,
8 "line": 12
9 },
10 "file": "src/components/AppUpdateInfoBar.js",
11 "id": "infobar.updateAvailable",
12 "start": {
13 "column": 19,
14 "line": 9
15 }
16 },
17 {
18 "defaultMessage": "!!!Changelog",
19 "end": {
20 "column": 3,
21 "line": 16
22 },
23 "file": "src/components/AppUpdateInfoBar.js",
24 "id": "infobar.buttonChangelog",
25 "start": {
26 "column": 13,
27 "line": 13
28 }
29 },
30 {
31 "defaultMessage": "!!!Restart & install update",
32 "end": {
33 "column": 3,
34 "line": 20
35 },
36 "file": "src/components/AppUpdateInfoBar.js",
37 "id": "infobar.buttonInstallUpdate",
38 "start": {
39 "column": 23,
40 "line": 17
41 }
42 }
43 ],
44 "path": "src/components/AppUpdateInfoBar.json"
45 },
46 {
47 "descriptors": [
48 {
5 "defaultMessage": "!!!Import your Franz 4 services", 49 "defaultMessage": "!!!Import your Franz 4 services",
6 "end": { 50 "end": {
7 "column": 3, 51 "column": 3,
@@ -625,78 +669,39 @@
625 "defaultMessage": "!!!Your services have been updated.", 669 "defaultMessage": "!!!Your services have been updated.",
626 "end": { 670 "end": {
627 "column": 3, 671 "column": 3,
628 "line": 30 672 "line": 29
629 }, 673 },
630 "file": "src/components/layout/AppLayout.js", 674 "file": "src/components/layout/AppLayout.js",
631 "id": "infobar.servicesUpdated", 675 "id": "infobar.servicesUpdated",
632 "start": { 676 "start": {
633 "column": 19, 677 "column": 19,
634 "line": 27 678 "line": 26
635 }
636 },
637 {
638 "defaultMessage": "!!!A new update for Franz is available.",
639 "end": {
640 "column": 3,
641 "line": 34
642 },
643 "file": "src/components/layout/AppLayout.js",
644 "id": "infobar.updateAvailable",
645 "start": {
646 "column": 19,
647 "line": 31
648 } 679 }
649 }, 680 },
650 { 681 {
651 "defaultMessage": "!!!Reload services", 682 "defaultMessage": "!!!Reload services",
652 "end": { 683 "end": {
653 "column": 3, 684 "column": 3,
654 "line": 38 685 "line": 33
655 }, 686 },
656 "file": "src/components/layout/AppLayout.js", 687 "file": "src/components/layout/AppLayout.js",
657 "id": "infobar.buttonReloadServices", 688 "id": "infobar.buttonReloadServices",
658 "start": { 689 "start": {
659 "column": 24, 690 "column": 24,
660 "line": 35 691 "line": 30
661 }
662 },
663 {
664 "defaultMessage": "!!!Changelog",
665 "end": {
666 "column": 3,
667 "line": 42
668 },
669 "file": "src/components/layout/AppLayout.js",
670 "id": "infobar.buttonChangelog",
671 "start": {
672 "column": 13,
673 "line": 39
674 }
675 },
676 {
677 "defaultMessage": "!!!Restart & install update",
678 "end": {
679 "column": 3,
680 "line": 46
681 },
682 "file": "src/components/layout/AppLayout.js",
683 "id": "infobar.buttonInstallUpdate",
684 "start": {
685 "column": 23,
686 "line": 43
687 } 692 }
688 }, 693 },
689 { 694 {
690 "defaultMessage": "!!!Could not load services and user information", 695 "defaultMessage": "!!!Could not load services and user information",
691 "end": { 696 "end": {
692 "column": 3, 697 "column": 3,
693 "line": 50 698 "line": 37
694 }, 699 },
695 "file": "src/components/layout/AppLayout.js", 700 "file": "src/components/layout/AppLayout.js",
696 "id": "infobar.requiredRequestsFailed", 701 "id": "infobar.requiredRequestsFailed",
697 "start": { 702 "start": {
698 "column": 26, 703 "column": 26,
699 "line": 47 704 "line": 34
700 } 705 }
701 } 706 }
702 ], 707 ],
@@ -3808,65 +3813,65 @@
3808 "defaultMessage": "!!!Field is required", 3813 "defaultMessage": "!!!Field is required",
3809 "end": { 3814 "end": {
3810 "column": 3, 3815 "column": 3,
3811 "line": 7 3816 "line": 8
3812 }, 3817 },
3813 "file": "src/helpers/validation-helpers.js", 3818 "file": "src/helpers/validation-helpers.js",
3814 "id": "validation.required", 3819 "id": "validation.required",
3815 "start": { 3820 "start": {
3816 "column": 12, 3821 "column": 12,
3817 "line": 4 3822 "line": 5
3818 } 3823 }
3819 }, 3824 },
3820 { 3825 {
3821 "defaultMessage": "!!!Email not valid", 3826 "defaultMessage": "!!!Email not valid",
3822 "end": { 3827 "end": {
3823 "column": 3, 3828 "column": 3,
3824 "line": 11 3829 "line": 12
3825 }, 3830 },
3826 "file": "src/helpers/validation-helpers.js", 3831 "file": "src/helpers/validation-helpers.js",
3827 "id": "validation.email", 3832 "id": "validation.email",
3828 "start": { 3833 "start": {
3829 "column": 9, 3834 "column": 9,
3830 "line": 8 3835 "line": 9
3831 } 3836 }
3832 }, 3837 },
3833 { 3838 {
3834 "defaultMessage": "!!!Not a valid URL", 3839 "defaultMessage": "!!!Not a valid URL",
3835 "end": { 3840 "end": {
3836 "column": 3, 3841 "column": 3,
3837 "line": 15 3842 "line": 16
3838 }, 3843 },
3839 "file": "src/helpers/validation-helpers.js", 3844 "file": "src/helpers/validation-helpers.js",
3840 "id": "validation.url", 3845 "id": "validation.url",
3841 "start": { 3846 "start": {
3842 "column": 7, 3847 "column": 7,
3843 "line": 12 3848 "line": 13
3844 } 3849 }
3845 }, 3850 },
3846 { 3851 {
3847 "defaultMessage": "!!!Too few characters", 3852 "defaultMessage": "!!!Too few characters",
3848 "end": { 3853 "end": {
3849 "column": 3, 3854 "column": 3,
3850 "line": 19 3855 "line": 20
3851 }, 3856 },
3852 "file": "src/helpers/validation-helpers.js", 3857 "file": "src/helpers/validation-helpers.js",
3853 "id": "validation.minLength", 3858 "id": "validation.minLength",
3854 "start": { 3859 "start": {
3855 "column": 13, 3860 "column": 13,
3856 "line": 16 3861 "line": 17
3857 } 3862 }
3858 }, 3863 },
3859 { 3864 {
3860 "defaultMessage": "!!!At least one is required", 3865 "defaultMessage": "!!!At least one is required",
3861 "end": { 3866 "end": {
3862 "column": 3, 3867 "column": 3,
3863 "line": 23 3868 "line": 24
3864 }, 3869 },
3865 "file": "src/helpers/validation-helpers.js", 3870 "file": "src/helpers/validation-helpers.js",
3866 "id": "validation.oneRequired", 3871 "id": "validation.oneRequired",
3867 "start": { 3872 "start": {
3868 "column": 15, 3873 "column": 15,
3869 "line": 20 3874 "line": 21
3870 } 3875 }
3871 } 3876 }
3872 ], 3877 ],
@@ -4465,185 +4470,198 @@
4465 } 4470 }
4466 }, 4471 },
4467 { 4472 {
4468 "defaultMessage": "!!!Hide", 4473 "defaultMessage": "!!!Check for updates",
4469 "end": { 4474 "end": {
4470 "column": 3, 4475 "column": 3,
4471 "line": 174 4476 "line": 174
4472 }, 4477 },
4473 "file": "src/lib/Menu.js", 4478 "file": "src/lib/Menu.js",
4479 "id": "menu.app.checkForUpdates",
4480 "start": {
4481 "column": 19,
4482 "line": 171
4483 }
4484 },
4485 {
4486 "defaultMessage": "!!!Hide",
4487 "end": {
4488 "column": 3,
4489 "line": 178
4490 },
4491 "file": "src/lib/Menu.js",
4474 "id": "menu.app.hide", 4492 "id": "menu.app.hide",
4475 "start": { 4493 "start": {
4476 "column": 8, 4494 "column": 8,
4477 "line": 171 4495 "line": 175
4478 } 4496 }
4479 }, 4497 },
4480 { 4498 {
4481 "defaultMessage": "!!!Hide Others", 4499 "defaultMessage": "!!!Hide Others",
4482 "end": { 4500 "end": {
4483 "column": 3, 4501 "column": 3,
4484 "line": 178 4502 "line": 182
4485 }, 4503 },
4486 "file": "src/lib/Menu.js", 4504 "file": "src/lib/Menu.js",
4487 "id": "menu.app.hideOthers", 4505 "id": "menu.app.hideOthers",
4488 "start": { 4506 "start": {
4489 "column": 14, 4507 "column": 14,
4490 "line": 175 4508 "line": 179
4491 } 4509 }
4492 }, 4510 },
4493 { 4511 {
4494 "defaultMessage": "!!!Unhide", 4512 "defaultMessage": "!!!Unhide",
4495 "end": { 4513 "end": {
4496 "column": 3, 4514 "column": 3,
4497 "line": 182 4515 "line": 186
4498 }, 4516 },
4499 "file": "src/lib/Menu.js", 4517 "file": "src/lib/Menu.js",
4500 "id": "menu.app.unhide", 4518 "id": "menu.app.unhide",
4501 "start": { 4519 "start": {
4502 "column": 10, 4520 "column": 10,
4503 "line": 179 4521 "line": 183
4504 } 4522 }
4505 }, 4523 },
4506 { 4524 {
4507 "defaultMessage": "!!!Quit", 4525 "defaultMessage": "!!!Quit",
4508 "end": { 4526 "end": {
4509 "column": 3, 4527 "column": 3,
4510 "line": 186 4528 "line": 190
4511 }, 4529 },
4512 "file": "src/lib/Menu.js", 4530 "file": "src/lib/Menu.js",
4513 "id": "menu.app.quit", 4531 "id": "menu.app.quit",
4514 "start": { 4532 "start": {
4515 "column": 8, 4533 "column": 8,
4516 "line": 183 4534 "line": 187
4517 } 4535 }
4518 }, 4536 },
4519 { 4537 {
4520 "defaultMessage": "!!!Add New Service...", 4538 "defaultMessage": "!!!Add New Service...",
4521 "end": { 4539 "end": {
4522 "column": 3, 4540 "column": 3,
4523 "line": 190 4541 "line": 194
4524 }, 4542 },
4525 "file": "src/lib/Menu.js", 4543 "file": "src/lib/Menu.js",
4526 "id": "menu.services.addNewService", 4544 "id": "menu.services.addNewService",
4527 "start": { 4545 "start": {
4528 "column": 17, 4546 "column": 17,
4529 "line": 187 4547 "line": 191
4530 } 4548 }
4531 }, 4549 },
4532 { 4550 {
4533 "defaultMessage": "!!!Add New Workspace...", 4551 "defaultMessage": "!!!Add New Workspace...",
4534 "end": { 4552 "end": {
4535 "column": 3, 4553 "column": 3,
4536 "line": 194 4554 "line": 198
4537 }, 4555 },
4538 "file": "src/lib/Menu.js", 4556 "file": "src/lib/Menu.js",
4539 "id": "menu.workspaces.addNewWorkspace", 4557 "id": "menu.workspaces.addNewWorkspace",
4540 "start": { 4558 "start": {
4541 "column": 19, 4559 "column": 19,
4542 "line": 191 4560 "line": 195
4543 } 4561 }
4544 }, 4562 },
4545 { 4563 {
4546 "defaultMessage": "!!!Open workspace drawer", 4564 "defaultMessage": "!!!Open workspace drawer",
4547 "end": { 4565 "end": {
4548 "column": 3, 4566 "column": 3,
4549 "line": 198 4567 "line": 202
4550 }, 4568 },
4551 "file": "src/lib/Menu.js", 4569 "file": "src/lib/Menu.js",
4552 "id": "menu.workspaces.openWorkspaceDrawer", 4570 "id": "menu.workspaces.openWorkspaceDrawer",
4553 "start": { 4571 "start": {
4554 "column": 23, 4572 "column": 23,
4555 "line": 195 4573 "line": 199
4556 } 4574 }
4557 }, 4575 },
4558 { 4576 {
4559 "defaultMessage": "!!!Close workspace drawer", 4577 "defaultMessage": "!!!Close workspace drawer",
4560 "end": { 4578 "end": {
4561 "column": 3, 4579 "column": 3,
4562 "line": 202 4580 "line": 206
4563 }, 4581 },
4564 "file": "src/lib/Menu.js", 4582 "file": "src/lib/Menu.js",
4565 "id": "menu.workspaces.closeWorkspaceDrawer", 4583 "id": "menu.workspaces.closeWorkspaceDrawer",
4566 "start": { 4584 "start": {
4567 "column": 24, 4585 "column": 24,
4568 "line": 199 4586 "line": 203
4569 } 4587 }
4570 }, 4588 },
4571 { 4589 {
4572 "defaultMessage": "!!!Activate next service...", 4590 "defaultMessage": "!!!Activate next service...",
4573 "end": { 4591 "end": {
4574 "column": 3, 4592 "column": 3,
4575 "line": 206 4593 "line": 210
4576 }, 4594 },
4577 "file": "src/lib/Menu.js", 4595 "file": "src/lib/Menu.js",
4578 "id": "menu.services.setNextServiceActive", 4596 "id": "menu.services.setNextServiceActive",
4579 "start": { 4597 "start": {
4580 "column": 23, 4598 "column": 23,
4581 "line": 203 4599 "line": 207
4582 } 4600 }
4583 }, 4601 },
4584 { 4602 {
4585 "defaultMessage": "!!!Activate previous service...", 4603 "defaultMessage": "!!!Activate previous service...",
4586 "end": { 4604 "end": {
4587 "column": 3, 4605 "column": 3,
4588 "line": 210 4606 "line": 214
4589 }, 4607 },
4590 "file": "src/lib/Menu.js", 4608 "file": "src/lib/Menu.js",
4591 "id": "menu.services.activatePreviousService", 4609 "id": "menu.services.activatePreviousService",
4592 "start": { 4610 "start": {
4593 "column": 27, 4611 "column": 27,
4594 "line": 207 4612 "line": 211
4595 } 4613 }
4596 }, 4614 },
4597 { 4615 {
4598 "defaultMessage": "!!!Disable notifications & audio", 4616 "defaultMessage": "!!!Disable notifications & audio",
4599 "end": { 4617 "end": {
4600 "column": 3, 4618 "column": 3,
4601 "line": 214 4619 "line": 218
4602 }, 4620 },
4603 "file": "src/lib/Menu.js", 4621 "file": "src/lib/Menu.js",
4604 "id": "sidebar.muteApp", 4622 "id": "sidebar.muteApp",
4605 "start": { 4623 "start": {
4606 "column": 11, 4624 "column": 11,
4607 "line": 211 4625 "line": 215
4608 } 4626 }
4609 }, 4627 },
4610 { 4628 {
4611 "defaultMessage": "!!!Enable notifications & audio", 4629 "defaultMessage": "!!!Enable notifications & audio",
4612 "end": { 4630 "end": {
4613 "column": 3, 4631 "column": 3,
4614 "line": 218 4632 "line": 222
4615 }, 4633 },
4616 "file": "src/lib/Menu.js", 4634 "file": "src/lib/Menu.js",
4617 "id": "sidebar.unmuteApp", 4635 "id": "sidebar.unmuteApp",
4618 "start": { 4636 "start": {
4619 "column": 13, 4637 "column": 13,
4620 "line": 215 4638 "line": 219
4621 } 4639 }
4622 }, 4640 },
4623 { 4641 {
4624 "defaultMessage": "!!!Workspaces", 4642 "defaultMessage": "!!!Workspaces",
4625 "end": { 4643 "end": {
4626 "column": 3, 4644 "column": 3,
4627 "line": 222 4645 "line": 226
4628 }, 4646 },
4629 "file": "src/lib/Menu.js", 4647 "file": "src/lib/Menu.js",
4630 "id": "menu.workspaces", 4648 "id": "menu.workspaces",
4631 "start": { 4649 "start": {
4632 "column": 14, 4650 "column": 14,
4633 "line": 219 4651 "line": 223
4634 } 4652 }
4635 }, 4653 },
4636 { 4654 {
4637 "defaultMessage": "!!!Default", 4655 "defaultMessage": "!!!Default",
4638 "end": { 4656 "end": {
4639 "column": 3, 4657 "column": 3,
4640 "line": 226 4658 "line": 230
4641 }, 4659 },
4642 "file": "src/lib/Menu.js", 4660 "file": "src/lib/Menu.js",
4643 "id": "menu.workspaces.defaultWorkspace", 4661 "id": "menu.workspaces.defaultWorkspace",
4644 "start": { 4662 "start": {
4645 "column": 20, 4663 "column": 20,
4646 "line": 223 4664 "line": 227
4647 } 4665 }
4648 } 4666 }
4649 ], 4667 ],
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index 0ff4b5abb..a083964d4 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Η συνεδρία σας έληξε, συνδεθείτε ξανά.", 45 "login.tokenExpired" : "Η συνεδρία σας έληξε, συνδεθείτε ξανά.",
46 "menu.app.about" : "Σχετικά με το Franz", 46 "menu.app.about" : "Σχετικά με το Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Έλεγχος για ενημερώσεις",
48 "menu.app.hide" : "Απόκρυψη", 49 "menu.app.hide" : "Απόκρυψη",
49 "menu.app.hideOthers" : "Απόκρυψη των άλλων", 50 "menu.app.hideOthers" : "Απόκρυψη των άλλων",
50 "menu.app.quit" : "Έξοδος", 51 "menu.app.quit" : "Έξοδος",
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 1bc8fd2bf..a821dbe39 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -46,6 +46,7 @@
46 "login.tokenExpired": "Your session expired, please login again.", 46 "login.tokenExpired": "Your session expired, please login again.",
47 "menu.app.about": "About Franz", 47 "menu.app.about": "About Franz",
48 "menu.app.announcement": "What's new?", 48 "menu.app.announcement": "What's new?",
49 "menu.app.checkForUpdates": "Check for updates",
49 "menu.app.hide": "Hide", 50 "menu.app.hide": "Hide",
50 "menu.app.hideOthers": "Hide Others", 51 "menu.app.hideOthers": "Hide Others",
51 "menu.app.quit": "Quit", 52 "menu.app.quit": "Quit",
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 4167a5c7d..27f4c7d88 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,7 +1,7 @@
1{ 1{
2 "app.errorHandler.action" : "Recargar", 2 "app.errorHandler.action" : "Recargar",
3 "app.errorHandler.headline" : "Ha surgido un error", 3 "app.errorHandler.headline" : "Ha surgido un error",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Cambios en Franz {version}",
5 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz", 5 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz",
6 "feature.delayApp.headline" : "Por favor, compra una Licencia de Soporte de Franz para saltar la espera", 6 "feature.delayApp.headline" : "Por favor, compra una Licencia de Soporte de Franz para saltar la espera",
7 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.", 7 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.",
@@ -10,7 +10,7 @@
10 "feature.shareFranz.action.twitter" : "Compartir en Twitter", 10 "feature.shareFranz.action.twitter" : "Compartir en Twitter",
11 "feature.shareFranz.headline" : "¡Juntos mejoramos Franz!", 11 "feature.shareFranz.headline" : "¡Juntos mejoramos Franz!",
12 "feature.shareFranz.shareText.email" : "¡He añadido {count} servicios a Franz! Obtén la aplicación gratuita para WhatsApp, Messenger, Slack, Skype en www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "¡He añadido {count} servicios a Franz! Obtén la aplicación gratuita para WhatsApp, Messenger, Slack, Skype en www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "He agregado {count} servicios a Franz! Obtené la aplicación gratuita de WhatsApp, Messenger, Slack, Skype y co en www.meetfranz.com\/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Dile a tus amigos y colegas lo asombroso que es Franz y ayúdanos a correr la voz.", 14 "feature.shareFranz.text" : "Dile a tus amigos y colegas lo asombroso que es Franz y ayúdanos a correr la voz.",
15 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.", 15 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.",
16 "global.notConnectedToTheInternet" : "No estás conectado a Internet", 16 "global.notConnectedToTheInternet" : "No estás conectado a Internet",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Iniciar sesión", 44 "login.submit.label" : "Iniciar sesión",
45 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.", 45 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.",
46 "menu.app.about" : "Sobre Franz", 46 "menu.app.about" : "Sobre Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "¿Qué hay de nuevo?",
48 "menu.app.checkForUpdates" : "Comprobar actualizaciones",
48 "menu.app.hide" : "Ocultar", 49 "menu.app.hide" : "Ocultar",
49 "menu.app.hideOthers" : "Ocultar otros", 50 "menu.app.hideOthers" : "Ocultar otros",
50 "menu.app.quit" : "Salir", 51 "menu.app.quit" : "Salir",
@@ -89,9 +90,9 @@
89 "menu.window" : "Ventana", 90 "menu.window" : "Ventana",
90 "menu.window.close" : "Cerrar", 91 "menu.window.close" : "Cerrar",
91 "menu.window.minimize" : "Minimizar", 92 "menu.window.minimize" : "Minimizar",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Espacios de trabajo",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Añadir nuevo espacio de trabajo...",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Cerrar cajón de espacio de trabajo",
95 "menu.workspaces.defaultWorkspace" : "Todos los servicios", 96 "menu.workspaces.defaultWorkspace" : "Todos los servicios",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
97 "password.email.label" : "Dirección de correo electrónico", 98 "password.email.label" : "Dirección de correo electrónico",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "¡Oh, no!", 118 "service.errorHandler.headline" : "¡Oh, no!",
118 "service.errorHandler.message" : "Error", 119 "service.errorHandler.message" : "Error",
119 "service.errorHandler.text" : "{name} ha fallado la carga", 120 "service.errorHandler.text" : "{name} ha fallado la carga",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Cargando",
121 "services.getStarted" : "Primeros pasos", 122 "services.getStarted" : "Primeros pasos",
122 "services.welcome" : "Bienvenido a Franz", 123 "services.welcome" : "Bienvenido a Franz",
123 "settings.account.account.editButton" : "Editar cuenta", 124 "settings.account.account.editButton" : "Editar cuenta",
@@ -177,9 +178,9 @@
177 "settings.navigation.inviteFriends" : "Invita a tus amigos", 178 "settings.navigation.inviteFriends" : "Invita a tus amigos",
178 "settings.navigation.logout" : "Cerrar sesión", 179 "settings.navigation.logout" : "Cerrar sesión",
179 "settings.navigation.settings" : "Configuración", 180 "settings.navigation.settings" : "Configuración",
180 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Gestionar equipo",
181 "settings.navigation.yourServices" : "Tus servicios", 182 "settings.navigation.yourServices" : "Tus servicios",
182 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Tus espacios de trabajo",
183 "settings.recipes.all" : "Todos los servicios", 184 "settings.recipes.all" : "Todos los servicios",
184 "settings.recipes.dev" : "Desarrollo", 185 "settings.recipes.dev" : "Desarrollo",
185 "settings.recipes.headline" : "Servicios disponibles", 186 "settings.recipes.headline" : "Servicios disponibles",
@@ -242,7 +243,7 @@
242 "settings.team.headline" : "Equipo", 243 "settings.team.headline" : "Equipo",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
244 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
245 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Actualiza tu cuenta",
246 "settings.user.form.accountType.company" : "Empresa", 247 "settings.user.form.accountType.company" : "Empresa",
247 "settings.user.form.accountType.individual" : "Individual", 248 "settings.user.form.accountType.individual" : "Individual",
248 "settings.user.form.accountType.label" : "Tipo de cuenta", 249 "settings.user.form.accountType.label" : "Tipo de cuenta",
@@ -254,21 +255,21 @@
254 "settings.user.form.newPassword" : "Nueva contraseña", 255 "settings.user.form.newPassword" : "Nueva contraseña",
255 "settings.workspace.add.form.name" : "Nombre", 256 "settings.workspace.add.form.name" : "Nombre",
256 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Create workspace",
257 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Eliminar espacio de trabajo",
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Guardar espacio de trabajo",
259 "settings.workspace.form.name" : "Nombre", 260 "settings.workspace.form.name" : "Nombre",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Servicios en este espacio de trabajo",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Tus espacios de trabajo",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Tus espacios de trabajo",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
265 "settings.workspaces.tryReloadWorkspaces" : "Try again", 266 "settings.workspaces.tryReloadWorkspaces" : "Inténtalo de nuevo",
266 "settings.workspaces.updatedInfo" : "Tus cambios han sido guardados", 267 "settings.workspaces.updatedInfo" : "Tus cambios han sido guardados",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
270 "sidebar.addNewService" : "Añadir nuevo servicio", 271 "sidebar.addNewService" : "Añadir nuevo servicio",
271 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Cerrar cajón de espacio de trabajo",
272 "sidebar.muteApp" : "Desactivar notificaciones y sonido", 273 "sidebar.muteApp" : "Desactivar notificaciones y sonido",
273 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
274 "sidebar.settings" : "Configuración", 275 "sidebar.settings" : "Configuración",
@@ -319,7 +320,7 @@
319 "welcome.signupButton" : "Crear una cuenta gratuita", 320 "welcome.signupButton" : "Crear una cuenta gratuita",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
321 "workspaceDrawer.allServices" : "Todos los servicios", 322 "workspaceDrawer.allServices" : "Todos los servicios",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Espacios de trabajo",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "edit",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 2bd5326c0..90072f2b7 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.", 45 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.",
46 "menu.app.about" : "À propos de Franz", 46 "menu.app.about" : "À propos de Franz",
47 "menu.app.announcement" : "Quoi de neuf? ", 47 "menu.app.announcement" : "Quoi de neuf? ",
48 "menu.app.checkForUpdates" : "Vérifier les mises à jour",
48 "menu.app.hide" : "Masquer", 49 "menu.app.hide" : "Masquer",
49 "menu.app.hideOthers" : "Masquer les autres", 50 "menu.app.hideOthers" : "Masquer les autres",
50 "menu.app.quit" : "Quitter", 51 "menu.app.quit" : "Quitter",
@@ -238,7 +239,7 @@
238 "settings.services.tooltip.notificationsDisabled" : "Notifications désactivées.", 239 "settings.services.tooltip.notificationsDisabled" : "Notifications désactivées.",
239 "settings.services.updatedInfo" : "Vos modifications ont été enregistrées", 240 "settings.services.updatedInfo" : "Vos modifications ont été enregistrées",
240 "settings.team.contentHeadline" : "Franz pour les équipes", 241 "settings.team.contentHeadline" : "Franz pour les équipes",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "Franz for Teams t'offre la possibilité d'inviter des collègues dans ton équipe de travail en leur envoyant des invitations par courrier électronique et en gérant leurs abonnements dans les préférences de ton compte. Ne perds pas de temps à les gérer individuellement les factures multiples et les différents cycles de facturation - il suffit d'une seule équipe de travail pour gérer tout ça!",
242 "settings.team.headline" : "Équipe de travail", 243 "settings.team.headline" : "Équipe de travail",
243 "settings.team.intro" : "Tu peux désormais gérer les abonnements Premium pour autant de collègues, amis ou membres de famille que tu souhaites, à partir d'un seul et même compte.", 244 "settings.team.intro" : "Tu peux désormais gérer les abonnements Premium pour autant de collègues, amis ou membres de famille que tu souhaites, à partir d'un seul et même compte.",
244 "settings.team.manageAction" : "Gère ton équipe sur meetfranz.com", 245 "settings.team.manageAction" : "Gère ton équipe sur meetfranz.com",
@@ -257,20 +258,20 @@
257 "settings.workspace.form.buttonDelete" : "Effacer l'espace de travail", 258 "settings.workspace.form.buttonDelete" : "Effacer l'espace de travail",
258 "settings.workspace.form.buttonSave" : "Sauvegarder l'espace de travail", 259 "settings.workspace.form.buttonSave" : "Sauvegarder l'espace de travail",
259 "settings.workspace.form.name" : "Nom", 260 "settings.workspace.form.name" : "Nom",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services dans cet Espace de travail",
261 "settings.workspace.form.yourWorkspaces" : "Tes espaces de travail", 262 "settings.workspace.form.yourWorkspaces" : "Vos espaces de travail",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "L'espace de travail a été supprimé",
263 "settings.workspaces.headline" : "Vos espaces de travails", 264 "settings.workspaces.headline" : "Vos espaces de travails",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Vous n'avez pas encore ajouté d'espace de travail.",
265 "settings.workspaces.tryReloadWorkspaces" : "Réessayer", 266 "settings.workspaces.tryReloadWorkspaces" : "Réessayer",
266 "settings.workspaces.updatedInfo" : "Vos modifications ont été enregistrées", 267 "settings.workspaces.updatedInfo" : "Vos modifications ont été enregistrées",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Présentation des Espaces de travail de Franz",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Les Espaces de travail de Franz vous permettant de rester concentré sur ce qui est important. Créez différents groupes de services et naviguez facilement entre eux à n'importe quel moment. Vous décidez de quels services vous avez besoin, où et quand, ainsi nous pouvons vous aider à rester concentré sur votre travail - ou à le quitter dès que vous le souhaitez.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Impossible de charger vos espaces de travail",
270 "sidebar.addNewService" : "Ajouter un nouveau service", 271 "sidebar.addNewService" : "Ajouter un nouveau service",
271 "sidebar.closeWorkspaceDrawer" : "Ouvrir l'espace de travail", 272 "sidebar.closeWorkspaceDrawer" : "Fermer l'espace de travail",
272 "sidebar.muteApp" : "Désactiver les notifications et les sons", 273 "sidebar.muteApp" : "Désactiver les notifications et les sons",
273 "sidebar.openWorkspaceDrawer" : "Fermer l'espace de travail", 274 "sidebar.openWorkspaceDrawer" : "Ouvrir l'espace de travail",
274 "sidebar.settings" : "Paramètres", 275 "sidebar.settings" : "Paramètres",
275 "sidebar.unmuteApp" : "Activer les notifications et les sons", 276 "sidebar.unmuteApp" : "Activer les notifications et les sons",
276 "signup.company.label" : "Entreprise", 277 "signup.company.label" : "Entreprise",
@@ -292,7 +293,7 @@
292 "subscription.features.onpremise.mattermost" : "Ajouter des services auto-hébergés comme Mattermost", 293 "subscription.features.onpremise.mattermost" : "Ajouter des services auto-hébergés comme Mattermost",
293 "subscription.features.proxy" : "Support proxy pour les services", 294 "subscription.features.proxy" : "Support proxy pour les services",
294 "subscription.features.spellchecker" : "Prise en charge du correcteur orthographique", 295 "subscription.features.spellchecker" : "Prise en charge du correcteur orthographique",
295 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Organisez vos services en espaces de travail",
296 "subscription.includedFeatures" : "Le compte payant Supporter Premium Franz inclut", 297 "subscription.includedFeatures" : "Le compte payant Supporter Premium Franz inclut",
297 "subscription.paymentSessionError" : "Initialisation du paiement impossible", 298 "subscription.paymentSessionError" : "Initialisation du paiement impossible",
298 "subscription.submit.label" : "Je souhaite aider au développement de Franz", 299 "subscription.submit.label" : "Je souhaite aider au développement de Franz",
@@ -317,15 +318,15 @@
317 "validation.url" : "{field} n'est pas une URL valide", 318 "validation.url" : "{field} n'est pas une URL valide",
318 "welcome.loginButton" : "Se connecter sur son compte", 319 "welcome.loginButton" : "Se connecter sur son compte",
319 "welcome.signupButton" : "Créer un compte gratuit", 320 "welcome.signupButton" : "Créer un compte gratuit",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Ajouté un nouvel espace de travail",
321 "workspaceDrawer.allServices" : "Tous les services", 322 "workspaceDrawer.allServices" : "Tous les services",
322 "workspaceDrawer.headline" : "Espace de travail", 323 "workspaceDrawer.headline" : "Espace de travail",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "Modifier",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Aucun services ajoutés pour l'instant",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Créez votre premier espace de travail",
326 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Fonctionnalité premium",
327 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Réactivez votre compte premium",
328 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Les Espaces de travail de Franz vous permettant de rester concentré sur ce qui est important. Créez différents groupes de services et naviguez facilement entre eux à n'importe quel moment.<\/p><p>Vous décidez de quels services vous avez besoin, où et quand, ainsi nous pouvons vous aider à rester concentré sur votre travail - ou à le quitter dès que vous le souhaitez.<\/p>",
329 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Editer les paramètres de l'espace de travail",
330 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Changement vers"
331} 332}
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 3f1e827fb..97a39d2e6 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "D'éag do sheisiún, logáil isteach arís le do thoil.", 45 "login.tokenExpired" : "D'éag do sheisiún, logáil isteach arís le do thoil.",
46 "menu.app.about" : "Faoi Franz", 46 "menu.app.about" : "Faoi Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Cuardaigh le nuashonruithe",
48 "menu.app.hide" : "Cuir Franz i bhfolach", 49 "menu.app.hide" : "Cuir Franz i bhfolach",
49 "menu.app.hideOthers" : "Folaigh feidhmchláir eile", 50 "menu.app.hideOthers" : "Folaigh feidhmchláir eile",
50 "menu.app.quit" : "Scoir", 51 "menu.app.quit" : "Scoir",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index 468238166..d48c8bdac 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 45 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
46 "menu.app.about" : "O aplikaciji", 46 "menu.app.about" : "O aplikaciji",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Potraži ažuriranja",
48 "menu.app.hide" : "Hide", 49 "menu.app.hide" : "Hide",
49 "menu.app.hideOthers" : "Hide Others", 50 "menu.app.hideOthers" : "Hide Others",
50 "menu.app.quit" : "Quit", 51 "menu.app.quit" : "Quit",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index b28dcb17a..701568b1c 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -1,13 +1,13 @@
1{ 1{
2 "app.errorHandler.action" : "Újratöltés", 2 "app.errorHandler.action" : "Újratöltés",
3 "app.errorHandler.headline" : "Valami nem jött össze", 3 "app.errorHandler.headline" : "Valami nem jött össze",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Franz {version} változásai",
5 "feature.delayApp.action" : "Szerezz egy Franz Támogatói Liszencet", 5 "feature.delayApp.action" : "Szerezz egy Franz Támogatói Liszencet",
6 "feature.delayApp.headline" : "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához", 6 "feature.delayApp.headline" : "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához",
7 "feature.delayApp.text" : "A Franz továbblép {seconds} másodperc múlva.", 7 "feature.delayApp.text" : "A Franz továbblép {seconds} másodperc múlva.",
8 "feature.shareFranz.action.email" : "Send as email", 8 "feature.shareFranz.action.email" : "Küldés email-ben",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 9 "feature.shareFranz.action.facebook" : "Megosztás Facebook-on",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 10 "feature.shareFranz.action.twitter" : "Megosztás Twitter-en",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "Franz is better together!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
@@ -15,8 +15,8 @@
15 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz", 15 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz",
16 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.", 16 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.",
17 "global.spellchecker.useDefault" : "Rendszer alapbeállítás használata ({default})", 17 "global.spellchecker.useDefault" : "Rendszer alapbeállítás használata ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 18 "global.spellchecking.autodetect" : "Automatikus nyelvdetektálás",
19 "global.spellchecking.autodetect.short" : "Automatic", 19 "global.spellchecking.autodetect.short" : "Automatikus",
20 "global.spellchecking.language" : "Helyesírás-ellenőrző nyelve", 20 "global.spellchecking.language" : "Helyesírás-ellenőrző nyelve",
21 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből", 21 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből",
22 "import.notSupportedHeadline" : "Még nem támogatott szolgáltatások a Franz 5-ben", 22 "import.notSupportedHeadline" : "Még nem támogatott szolgáltatások a Franz 5-ben",
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.", 45 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.",
46 "menu.app.about" : "Névjegy", 46 "menu.app.about" : "Névjegy",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Frissítések keresése",
48 "menu.app.hide" : "Elrejt", 49 "menu.app.hide" : "Elrejt",
49 "menu.app.hideOthers" : "Többi elrejtése", 50 "menu.app.hideOthers" : "Többi elrejtése",
50 "menu.app.quit" : "Kilépés", 51 "menu.app.quit" : "Kilépés",
@@ -72,9 +73,9 @@
72 "menu.help.support" : "Támogatás", 73 "menu.help.support" : "Támogatás",
73 "menu.help.tos" : "Felhasználói feltételek", 74 "menu.help.tos" : "Felhasználói feltételek",
74 "menu.services" : "Szolgáltatások", 75 "menu.services" : "Szolgáltatások",
75 "menu.services.activatePreviousService" : "Activate previous service", 76 "menu.services.activatePreviousService" : "Előző szolgáltatás",
76 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...", 77 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...",
77 "menu.services.setNextServiceActive" : "Activate next service", 78 "menu.services.setNextServiceActive" : "vetke szolgáltatás",
78 "menu.view" : "Nézet", 79 "menu.view" : "Nézet",
79 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból", 80 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból",
80 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból", 81 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból",
@@ -164,7 +165,7 @@
164 "settings.app.headlineGeneral" : "Általános", 165 "settings.app.headlineGeneral" : "Általános",
165 "settings.app.headlineLanguage" : "Nyelv", 166 "settings.app.headlineLanguage" : "Nyelv",
166 "settings.app.headlineUpdates" : "Frissítések", 167 "settings.app.headlineUpdates" : "Frissítések",
167 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "A hivatalos fordítások angol és német nyelven elérhetőek. Minden más nyelv közösségi fordításon alapul.",
168 "settings.app.restartRequired" : "Újraindítást igénylő módosítás", 169 "settings.app.restartRequired" : "Újraindítást igénylő módosítás",
169 "settings.app.subheadlineCache" : "Gyorsítótár", 170 "settings.app.subheadlineCache" : "Gyorsítótár",
170 "settings.app.translationHelp" : "Segíts nekünk a Franz-ot lefordítani a nyelvedre.", 171 "settings.app.translationHelp" : "Segíts nekünk a Franz-ot lefordítani a nyelvedre.",
@@ -321,7 +322,7 @@
321 "workspaceDrawer.allServices" : "Összes szolgáltatás", 322 "workspaceDrawer.allServices" : "Összes szolgáltatás",
322 "workspaceDrawer.headline" : "Munkaterületek", 323 "workspaceDrawer.headline" : "Munkaterületek",
323 "workspaceDrawer.item.contextMenuEdit" : "szerkeszt", 324 "workspaceDrawer.item.contextMenuEdit" : "szerkeszt",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Még nincsenek hozzáadott szolgáltatások",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Készítsd el az első munkaterületedet", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Készítsd el az első munkaterületedet",
326 "workspaceDrawer.proFeatureBadge" : "Prémium funkció", 327 "workspaceDrawer.proFeatureBadge" : "Prémium funkció",
327 "workspaceDrawer.reactivatePremiumAccountLabel" : "Prémium fiók reaktiválása", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Prémium fiók reaktiválása",
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index e7a46e5e9..819aca177 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Sesi Anda telah kedaluwarsa, silakan masuk kembali.", 45 "login.tokenExpired" : "Sesi Anda telah kedaluwarsa, silakan masuk kembali.",
46 "menu.app.about" : "Tentang Franz", 46 "menu.app.about" : "Tentang Franz",
47 "menu.app.announcement" : "Yang baru", 47 "menu.app.announcement" : "Yang baru",
48 "menu.app.checkForUpdates" : "Periksa versi baru",
48 "menu.app.hide" : "Sembunyikan", 49 "menu.app.hide" : "Sembunyikan",
49 "menu.app.hideOthers" : "Sembunyikan Lainnya", 50 "menu.app.hideOthers" : "Sembunyikan Lainnya",
50 "menu.app.quit" : "Keluar", 51 "menu.app.quit" : "Keluar",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index c12641e36..7bda822bb 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -1,17 +1,17 @@
1{ 1{
2 "app.errorHandler.action" : "Ricarica", 2 "app.errorHandler.action" : "Ricarica",
3 "app.errorHandler.headline" : "Qualcosa è andato storto", 3 "app.errorHandler.headline" : "Qualcosa è andato storto",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Modifiche in Franz {Version}",
5 "feature.delayApp.action" : "Ricevi una Licenza Supporter di Franz", 5 "feature.delayApp.action" : "Ricevi una Licenza Supporter di Franz",
6 "feature.delayApp.headline" : "Per favore, compra una Licenza Supporter di Franz per saltare l'attesa", 6 "feature.delayApp.headline" : "Per favore, compra una Licenza Supporter di Franz per saltare l'attesa",
7 "feature.delayApp.text" : "Franz continuerà a funzionare tra {seconds} secondi.", 7 "feature.delayApp.text" : "Franz continuerà tra {seconds} secondi.",
8 "feature.shareFranz.action.email" : "Manda come email", 8 "feature.shareFranz.action.email" : "Manda come email",
9 "feature.shareFranz.action.facebook" : "Condividi su Facebook", 9 "feature.shareFranz.action.facebook" : "Condividi su Facebook",
10 "feature.shareFranz.action.twitter" : "Condividi su Twitter", 10 "feature.shareFranz.action.twitter" : "Condividi su Twitter",
11 "feature.shareFranz.headline" : "Franze è migliore insieme!", 11 "feature.shareFranz.headline" : "Franze è migliore insieme!",
12 "feature.shareFranz.shareText.email" : "Ho aggiunto {count} nuovi servizi a Franz! Scarica ora l'app gratuita per WhatsApp, Messenger, Slack, Skype e altri all'indirizzo www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Ho aggiunto {count} nuovi servizi a Franz! Scarica ora l'app gratuita per WhatsApp, Messenger, Slack, Skype e altri all'indirizzo www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Ho aggiunto {count} nuovi servizi a Franz! Scarica ora l’app gratuita per WhatsApp, Messenger, Slack, Skype e altri all’indirizzo www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Condividi con i tuoi amici e colleghi quanto Franz è fantastico e aiutaci a diffondere la parola.", 14 "feature.shareFranz.text" : "Di’ ai tuoi amici e colleghi quanto Franz è fantastico e aiutaci a diffondere la parola.",
15 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz", 15 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz",
16 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.", 16 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.",
17 "global.spellchecker.useDefault" : "Usa le impostazioni predefinite di sistema ({default})", 17 "global.spellchecker.useDefault" : "Usa le impostazioni predefinite di sistema ({default})",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Accedi", 44 "login.submit.label" : "Accedi",
45 "login.tokenExpired" : "La tua sessione è scaduta, per favore accedi di nuovo.", 45 "login.tokenExpired" : "La tua sessione è scaduta, per favore accedi di nuovo.",
46 "menu.app.about" : "Info su Franz", 46 "menu.app.about" : "Info su Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Cosa c'è di nuovo?",
48 "menu.app.checkForUpdates" : "Controlla aggiornamenti",
48 "menu.app.hide" : "Nascondi", 49 "menu.app.hide" : "Nascondi",
49 "menu.app.hideOthers" : "Nascondi altri", 50 "menu.app.hideOthers" : "Nascondi altri",
50 "menu.app.quit" : "Esci", 51 "menu.app.quit" : "Esci",
@@ -90,10 +91,10 @@
90 "menu.window.close" : "Chiudi", 91 "menu.window.close" : "Chiudi",
91 "menu.window.minimize" : "Minimizza", 92 "menu.window.minimize" : "Minimizza",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Workspaces",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Aggiungi un Workspace...",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Chiudi il menu dei workspace",
95 "menu.workspaces.defaultWorkspace" : "Tutti i servizi", 96 "menu.workspaces.defaultWorkspace" : "Tutti i servizi",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Apri il menu dei workspace",
97 "password.email.label" : "Indirizzo email", 98 "password.email.label" : "Indirizzo email",
98 "password.headline" : "Reimposta password", 99 "password.headline" : "Reimposta password",
99 "password.link.login" : "Accedi al tuo account", 100 "password.link.login" : "Accedi al tuo account",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "Oh no!", 118 "service.errorHandler.headline" : "Oh no!",
118 "service.errorHandler.message" : "Errore", 119 "service.errorHandler.message" : "Errore",
119 "service.errorHandler.text" : "{name} non si è caricato correttamente.", 120 "service.errorHandler.text" : "{name} non si è caricato correttamente.",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Caricamento",
121 "services.getStarted" : "Iniziamo", 122 "services.getStarted" : "Iniziamo",
122 "services.welcome" : "Benvenuto su Franz", 123 "services.welcome" : "Benvenuto su Franz",
123 "settings.account.account.editButton" : "Modifica account", 124 "settings.account.account.editButton" : "Modifica account",
@@ -164,7 +165,7 @@
164 "settings.app.headlineGeneral" : "Generale", 165 "settings.app.headlineGeneral" : "Generale",
165 "settings.app.headlineLanguage" : "Lingua", 166 "settings.app.headlineLanguage" : "Lingua",
166 "settings.app.headlineUpdates" : "Aggiornamenti", 167 "settings.app.headlineUpdates" : "Aggiornamenti",
167 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "Le traduzioni ufficiali sono in Inglese e Tedesco. Tutte le altre lingue sono tradotte dalla community.",
168 "settings.app.restartRequired" : "Le modifiche richiedono un riavvio", 169 "settings.app.restartRequired" : "Le modifiche richiedono un riavvio",
169 "settings.app.subheadlineCache" : "Cache", 170 "settings.app.subheadlineCache" : "Cache",
170 "settings.app.translationHelp" : "Aiutaci a tradurre Franz nella tua lingua.", 171 "settings.app.translationHelp" : "Aiutaci a tradurre Franz nella tua lingua.",
@@ -177,9 +178,9 @@
177 "settings.navigation.inviteFriends" : "Invita Amici", 178 "settings.navigation.inviteFriends" : "Invita Amici",
178 "settings.navigation.logout" : "Esci", 179 "settings.navigation.logout" : "Esci",
179 "settings.navigation.settings" : "Impostazioni", 180 "settings.navigation.settings" : "Impostazioni",
180 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Gestisci il Team",
181 "settings.navigation.yourServices" : "I tuoi servizi", 182 "settings.navigation.yourServices" : "I tuoi servizi",
182 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "I tuoi workspaces",
183 "settings.recipes.all" : "Tutti i servizi", 184 "settings.recipes.all" : "Tutti i servizi",
184 "settings.recipes.dev" : "Sviluppo", 185 "settings.recipes.dev" : "Sviluppo",
185 "settings.recipes.headline" : "Servizi disponibili", 186 "settings.recipes.headline" : "Servizi disponibili",
@@ -237,12 +238,12 @@
237 "settings.services.tooltip.isMuted" : "Tutti i suoni sono disattivati", 238 "settings.services.tooltip.isMuted" : "Tutti i suoni sono disattivati",
238 "settings.services.tooltip.notificationsDisabled" : "Le notifiche sono disattivate", 239 "settings.services.tooltip.notificationsDisabled" : "Le notifiche sono disattivate",
239 "settings.services.updatedInfo" : "Le tue modifiche sono state salvate", 240 "settings.services.updatedInfo" : "Le tue modifiche sono state salvate",
240 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Franz per i Teams",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "Franz per i Teams ti da la possibilità di invitare collaboratori al tuo team, invitandoli per email e gestendo la loro iscrizione all'interno delle preferenze del tuo account. Non perdere tempo impostando le iscrizioni di un singolo collaboratore individualmente, dimenticati di fatture multiple e cicli differenti di fatturazione - un team per comandarli tutti!",
242 "settings.team.headline" : "Gruppo", 243 "settings.team.headline" : "Team",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "Tu e il tuo team usate Franz? Ora puoi gestire le sottoscrizioni Premium per tutti i colleghi, amici e famigliari che vuoi, tutto da un singolo account.",
244 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Gestisci il tuo Team su meetfranz.com",
245 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Aggiorna il tuo Account",
246 "settings.user.form.accountType.company" : "Società", 247 "settings.user.form.accountType.company" : "Società",
247 "settings.user.form.accountType.individual" : "Individuale", 248 "settings.user.form.accountType.individual" : "Individuale",
248 "settings.user.form.accountType.label" : "Tipo di account", 249 "settings.user.form.accountType.label" : "Tipo di account",
@@ -253,24 +254,24 @@
253 "settings.user.form.lastname" : "Cognome", 254 "settings.user.form.lastname" : "Cognome",
254 "settings.user.form.newPassword" : "Nuova password", 255 "settings.user.form.newPassword" : "Nuova password",
255 "settings.workspace.add.form.name" : "Nome", 256 "settings.workspace.add.form.name" : "Nome",
256 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Crea un workspace",
257 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Cancella un workspace",
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Salva il workspace",
259 "settings.workspace.form.name" : "Nome", 260 "settings.workspace.form.name" : "Nome",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Servizi in questo Workspace",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "I tuoi workspaces",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Il Workspace è stato cancellato",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "I tuoi workspaces",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Non hai ancora aggiunto alcun workspace",
265 "settings.workspaces.tryReloadWorkspaces" : "Try again", 266 "settings.workspaces.tryReloadWorkspaces" : "Riprova nuovamente",
266 "settings.workspaces.updatedInfo" : "Le tue modifiche sono state salvate", 267 "settings.workspaces.updatedInfo" : "Le tue modifiche sono state salvate",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Meno è Meglio: I Workspaces di Franz",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces ti permette di concentrarti su ciò che è importante. Configura diversi insiemi di servizi e passa facilmente da uno all’altro quando vuoi. Decidi di quali servizi hai bisogno quando e dove, così che ti possiamo aiutare a dare sempre il massimo - o semplicemente staccare dal lavoro quando ne hai bisogno.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Non è possibile caricare i tuoi workspaces",
270 "sidebar.addNewService" : "Aggiungi un nuovo servizio", 271 "sidebar.addNewService" : "Aggiungi un nuovo servizio",
271 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Chiudi il menu dei workspace",
272 "sidebar.muteApp" : "Disattiva notifiche e audio", 273 "sidebar.muteApp" : "Disattiva notifiche e audio",
273 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Apri il menu dei workspace",
274 "sidebar.settings" : "Impostazioni", 275 "sidebar.settings" : "Impostazioni",
275 "sidebar.unmuteApp" : "Attiva notifiche e audio", 276 "sidebar.unmuteApp" : "Attiva notifiche e audio",
276 "signup.company.label" : "Società", 277 "signup.company.label" : "Società",
@@ -279,7 +280,7 @@
279 "signup.firstname.label" : "Nome", 280 "signup.firstname.label" : "Nome",
280 "signup.headline" : "Iscriviti", 281 "signup.headline" : "Iscriviti",
281 "signup.lastname.label" : "Cognome", 282 "signup.lastname.label" : "Cognome",
282 "signup.legal.info" : "Creando un account di Franz stai accettando il ", 283 "signup.legal.info" : "Creando un account di Franz accetti i ",
283 "signup.legal.privacy" : "Informativa sulla Privacy", 284 "signup.legal.privacy" : "Informativa sulla Privacy",
284 "signup.legal.terms" : "Termini di Servizio", 285 "signup.legal.terms" : "Termini di Servizio",
285 "signup.link.login" : "Hai già un account, vuoi accedere?", 286 "signup.link.login" : "Hai già un account, vuoi accedere?",
@@ -292,7 +293,7 @@
292 "subscription.features.onpremise.mattermost" : "Aggiungi servizi on-premise\/hosted come \"Mattermost\"", 293 "subscription.features.onpremise.mattermost" : "Aggiungi servizi on-premise\/hosted come \"Mattermost\"",
293 "subscription.features.proxy" : "Supporto proxy per i servizi", 294 "subscription.features.proxy" : "Supporto proxy per i servizi",
294 "subscription.features.spellchecker" : "Supporto per il correttore ortografico", 295 "subscription.features.spellchecker" : "Supporto per il correttore ortografico",
295 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Organizza i tuoi servizi in workspace",
296 "subscription.includedFeatures" : "L'account a pagamento Franz Premium Supporter include", 297 "subscription.includedFeatures" : "L'account a pagamento Franz Premium Supporter include",
297 "subscription.paymentSessionError" : "Impossibile inizializzare il modulo per il pagamento", 298 "subscription.paymentSessionError" : "Impossibile inizializzare il modulo per il pagamento",
298 "subscription.submit.label" : "Voglio supportare lo sviluppo di Franz", 299 "subscription.submit.label" : "Voglio supportare lo sviluppo di Franz",
@@ -317,15 +318,15 @@
317 "validation.url" : "{field} non è un URL valido", 318 "validation.url" : "{field} non è un URL valido",
318 "welcome.loginButton" : "Accedi al tuo account", 319 "welcome.loginButton" : "Accedi al tuo account",
319 "welcome.signupButton" : "Crea un account gratuito", 320 "welcome.signupButton" : "Crea un account gratuito",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Aggiungi un nuovo workspace",
321 "workspaceDrawer.allServices" : "Tutti i servizi", 322 "workspaceDrawer.allServices" : "Tutti i servizi",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Workspace",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "Modifica",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Nessun servizio aggiunto",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Crea il tuo primo workspace",
326 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Funzionalità premium",
327 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Riattiva l’account premium",
328 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces ti permette di concentrarti su ciò che è importante. Configura diversi insiemi di servizi e passa facilmente da uno all’altro quando vuoi.<\/p><p>Decidi di quali servizi hai bisogno quando e dove, così che ti possiamo aiutare a dare sempre il massimo - o semplicemente staccare dal lavoro quando ne hai bisogno.<\/p>",
329 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Modifica le impostazioni dei workspace",
330 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Passa a "
331} 332}
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index cf7e9ab78..f9989ff7e 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "セッションの期限が切れました。ログインし直して下さい。", 45 "login.tokenExpired" : "セッションの期限が切れました。ログインし直して下さい。",
46 "menu.app.about" : "バージョン情報", 46 "menu.app.about" : "バージョン情報",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "更新の確認",
48 "menu.app.hide" : "隠す", 49 "menu.app.hide" : "隠す",
49 "menu.app.hideOthers" : "他を隠す", 50 "menu.app.hideOthers" : "他を隠す",
50 "menu.app.quit" : "終了", 51 "menu.app.quit" : "終了",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index af224c115..5193ac8cf 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "თქვენს სესიას ვადა გაუვიდა, შედით ანგარიშში ხელახლა.", 45 "login.tokenExpired" : "თქვენს სესიას ვადა გაუვიდა, შედით ანგარიშში ხელახლა.",
46 "menu.app.about" : "Franz-ის შესახებ", 46 "menu.app.about" : "Franz-ის შესახებ",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "განახლებების შემოწმება",
48 "menu.app.hide" : "Hide", 49 "menu.app.hide" : "Hide",
49 "menu.app.hideOthers" : "სხვების დამალვა", 50 "menu.app.hideOthers" : "სხვების დამალვა",
50 "menu.app.quit" : "გამოსვლა", 51 "menu.app.quit" : "გამოსვლა",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index 2854fcb09..1eda8856f 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
46 "menu.app.about" : "Over Franz", 46 "menu.app.about" : "Over Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Controleer op updates",
48 "menu.app.hide" : "Verbergen", 49 "menu.app.hide" : "Verbergen",
49 "menu.app.hideOthers" : "Andere Verbergen", 50 "menu.app.hideOthers" : "Andere Verbergen",
50 "menu.app.quit" : "Afsluiten", 51 "menu.app.quit" : "Afsluiten",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index 03d4474c1..fdb96a7db 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -1,22 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Herladen", 2 "app.errorHandler.action" : "Herladen",
3 "app.errorHandler.headline" : "Er ging iets mis", 3 "app.errorHandler.headline" : "Er ging iets mis",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Wijzigingen in Franz {version}",
5 "feature.delayApp.action" : "Sponsor Franz", 5 "feature.delayApp.action" : "Sponsor Franz",
6 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan", 6 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan",
7 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.", 7 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.",
8 "feature.shareFranz.action.email" : "Send as email", 8 "feature.shareFranz.action.email" : "Verstuur als e-mail",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 9 "feature.shareFranz.action.facebook" : "Deel op Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 10 "feature.shareFranz.action.twitter" : "Deel op Twitter",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "Franz is leuker samen!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Ik heb {count} diensten toegevoegd aan Franz! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Ik heb {count} diensten toegevoegd aan Franz! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Vertel je vrienden en collega's hoe geweldig Franz is en help ons om bekender te worden",
15 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services", 15 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services",
16 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.", 16 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.",
17 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})", 17 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 18 "global.spellchecking.autodetect" : "Taal automatisch herkennen",
19 "global.spellchecking.autodetect.short" : "Automatic", 19 "global.spellchecking.autodetect.short" : "Automatisch",
20 "global.spellchecking.language" : "Spelling checken", 20 "global.spellchecking.language" : "Spelling checken",
21 "import.headline" : "Importeer uw Franz 4-services", 21 "import.headline" : "Importeer uw Franz 4-services",
22 "import.notSupportedHeadline" : "Services die nog niet ondersteund worden in Franz 5", 22 "import.notSupportedHeadline" : "Services die nog niet ondersteund worden in Franz 5",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Inloggen", 44 "login.submit.label" : "Inloggen",
45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
46 "menu.app.about" : "Over Franz", 46 "menu.app.about" : "Over Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Wat is nieuw?",
48 "menu.app.checkForUpdates" : "Controleer op updates",
48 "menu.app.hide" : "Verbergen", 49 "menu.app.hide" : "Verbergen",
49 "menu.app.hideOthers" : "Andere verbergen", 50 "menu.app.hideOthers" : "Andere verbergen",
50 "menu.app.quit" : "Afsluiten", 51 "menu.app.quit" : "Afsluiten",
@@ -72,9 +73,9 @@
72 "menu.help.support" : "Ondersteuning", 73 "menu.help.support" : "Ondersteuning",
73 "menu.help.tos" : "Servicevoorwaarden", 74 "menu.help.tos" : "Servicevoorwaarden",
74 "menu.services" : "Diensten", 75 "menu.services" : "Diensten",
75 "menu.services.activatePreviousService" : "Activate previous service", 76 "menu.services.activatePreviousService" : "Activeer vorige dienst",
76 "menu.services.addNewService" : "Nieuwe dienst toevoegen", 77 "menu.services.addNewService" : "Nieuwe dienst toevoegen",
77 "menu.services.setNextServiceActive" : "Activate next service", 78 "menu.services.setNextServiceActive" : "Activeer volgende dienst",
78 "menu.view" : "Weergave", 79 "menu.view" : "Weergave",
79 "menu.view.enterFullScreen" : "Gebruik volledig scherm", 80 "menu.view.enterFullScreen" : "Gebruik volledig scherm",
80 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 81 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -89,11 +90,11 @@
89 "menu.window" : "Venster", 90 "menu.window" : "Venster",
90 "menu.window.close" : "Sluiten", 91 "menu.window.close" : "Sluiten",
91 "menu.window.minimize" : "Minimaliseren", 92 "menu.window.minimize" : "Minimaliseren",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Werkruimtes",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Voeg nieuwe werkruimte toe...",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Werkruimtepagina sluiten",
95 "menu.workspaces.defaultWorkspace" : "Alle services", 96 "menu.workspaces.defaultWorkspace" : "Alle services",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Werkruimtepagina openen",
97 "password.email.label" : "E-mailadres", 98 "password.email.label" : "E-mailadres",
98 "password.headline" : "Wachtwoord vergeten", 99 "password.headline" : "Wachtwoord vergeten",
99 "password.link.login" : "Log in op je account", 100 "password.link.login" : "Log in op je account",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "Oh nee!", 118 "service.errorHandler.headline" : "Oh nee!",
118 "service.errorHandler.message" : "Fout", 119 "service.errorHandler.message" : "Fout",
119 "service.errorHandler.text" : "{name} kon niet geladen worden.", 120 "service.errorHandler.text" : "{name} kon niet geladen worden.",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Aan het laden",
121 "services.getStarted" : "Begin", 122 "services.getStarted" : "Begin",
122 "services.welcome" : "Welkom bij Franz", 123 "services.welcome" : "Welkom bij Franz",
123 "settings.account.account.editButton" : "Bewerk account", 124 "settings.account.account.editButton" : "Bewerk account",
@@ -237,7 +238,7 @@
237 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld", 238 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld",
238 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld", 239 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld",
239 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen", 240 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen",
240 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Franz voor groepen",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
242 "settings.team.headline" : "Team", 243 "settings.team.headline" : "Team",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
@@ -258,9 +259,9 @@
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Save workspace",
259 "settings.workspace.form.name" : "Naam", 260 "settings.workspace.form.name" : "Naam",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Jouw werkruimtes",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Werkruimte is verwijderd",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Jouw werkplaatsen",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
265 "settings.workspaces.tryReloadWorkspaces" : "Probeer opnieuw", 266 "settings.workspaces.tryReloadWorkspaces" : "Probeer opnieuw",
266 "settings.workspaces.updatedInfo" : "Je wijzigingen zijn opgeslagen", 267 "settings.workspaces.updatedInfo" : "Je wijzigingen zijn opgeslagen",
@@ -268,9 +269,9 @@
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
270 "sidebar.addNewService" : "Voeg service toe", 271 "sidebar.addNewService" : "Voeg service toe",
271 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Werkruimtepagina sluiten",
272 "sidebar.muteApp" : "Schakel berichten & geluid uit", 273 "sidebar.muteApp" : "Schakel berichten & geluid uit",
273 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Werkruimtepagina openen",
274 "sidebar.settings" : "Instellingen", 275 "sidebar.settings" : "Instellingen",
275 "sidebar.unmuteApp" : "Berichten & geluid inschakelen", 276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen",
276 "signup.company.label" : "Bedrijf", 277 "signup.company.label" : "Bedrijf",
@@ -319,12 +320,12 @@
319 "welcome.signupButton" : "Maak een gratis account", 320 "welcome.signupButton" : "Maak een gratis account",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
321 "workspaceDrawer.allServices" : "Alle services", 322 "workspaceDrawer.allServices" : "Alle services",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Werkruimtes",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "edit",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Maak je eerste werkruimte",
326 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Premium feature",
327 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Heractiveer premium account",
328 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
329 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
330 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Switching to"
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index 591b13145..a5d1ea377 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -5,7 +5,7 @@
5 "feature.delayApp.action" : "Uzyskaj licencję Franz Supporter", 5 "feature.delayApp.action" : "Uzyskaj licencję Franz Supporter",
6 "feature.delayApp.headline" : "Aby nie czekać kup licencję Franz Supporter", 6 "feature.delayApp.headline" : "Aby nie czekać kup licencję Franz Supporter",
7 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.", 7 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.",
8 "feature.shareFranz.action.email" : "Wyślij nam maila", 8 "feature.shareFranz.action.email" : "Wyślij jako email",
9 "feature.shareFranz.action.facebook" : "Udostępnij na Facebooku", 9 "feature.shareFranz.action.facebook" : "Udostępnij na Facebooku",
10 "feature.shareFranz.action.twitter" : "Udostępnij na Twitterze", 10 "feature.shareFranz.action.twitter" : "Udostępnij na Twitterze",
11 "feature.shareFranz.headline" : "Franz jest lepszy, gdy tworzymy go razem!", 11 "feature.shareFranz.headline" : "Franz jest lepszy, gdy tworzymy go razem!",
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.", 45 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.",
46 "menu.app.about" : "O Franz", 46 "menu.app.about" : "O Franz",
47 "menu.app.announcement" : "Co słychać?", 47 "menu.app.announcement" : "Co słychać?",
48 "menu.app.checkForUpdates" : "Sprawdź aktualizacje",
48 "menu.app.hide" : "Ukryj", 49 "menu.app.hide" : "Ukryj",
49 "menu.app.hideOthers" : "Ukryj pozostałe", 50 "menu.app.hideOthers" : "Ukryj pozostałe",
50 "menu.app.quit" : "Zakończ", 51 "menu.app.quit" : "Zakończ",
@@ -89,11 +90,11 @@
89 "menu.window" : "Okno", 90 "menu.window" : "Okno",
90 "menu.window.close" : "Zamknij", 91 "menu.window.close" : "Zamknij",
91 "menu.window.minimize" : "Zminimalizuj", 92 "menu.window.minimize" : "Zminimalizuj",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Obszary robocze",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Dodaj nowy obszar roboczy...",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Zamknij edytor obszaru roboczego",
95 "menu.workspaces.defaultWorkspace" : "Wszystkie usługi", 96 "menu.workspaces.defaultWorkspace" : "Wszystkie usługi",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Otwórz edytor obszaru roboczego",
97 "password.email.label" : "Adres email", 98 "password.email.label" : "Adres email",
98 "password.headline" : "Przypomnij hasło", 99 "password.headline" : "Przypomnij hasło",
99 "password.link.login" : "Zaloguj się na swoje konto", 100 "password.link.login" : "Zaloguj się na swoje konto",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "O nie!", 118 "service.errorHandler.headline" : "O nie!",
118 "service.errorHandler.message" : "Błąd", 119 "service.errorHandler.message" : "Błąd",
119 "service.errorHandler.text" : "Nie udało się załadować {name}.", 120 "service.errorHandler.text" : "Nie udało się załadować {name}.",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Ładowanie",
121 "services.getStarted" : "Zacznij", 122 "services.getStarted" : "Zacznij",
122 "services.welcome" : "Witaj w programie Franz", 123 "services.welcome" : "Witaj w programie Franz",
123 "settings.account.account.editButton" : "Modyfikuj konta", 124 "settings.account.account.editButton" : "Modyfikuj konta",
@@ -164,7 +165,7 @@
164 "settings.app.headlineGeneral" : "Ogólne", 165 "settings.app.headlineGeneral" : "Ogólne",
165 "settings.app.headlineLanguage" : "Język", 166 "settings.app.headlineLanguage" : "Język",
166 "settings.app.headlineUpdates" : "Aktualizacje", 167 "settings.app.headlineUpdates" : "Aktualizacje",
167 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "Oficjalnymi językami są Angielski i Niemiecki. Inne języki są tłumaczone przez społeczność Franz.",
168 "settings.app.restartRequired" : "Zmiany. wymagają ponownego uruchomienia", 169 "settings.app.restartRequired" : "Zmiany. wymagają ponownego uruchomienia",
169 "settings.app.subheadlineCache" : "Pamięć podręczna", 170 "settings.app.subheadlineCache" : "Pamięć podręczna",
170 "settings.app.translationHelp" : "Pomóż nam tłumaczyć Franz na Twój język.", 171 "settings.app.translationHelp" : "Pomóż nam tłumaczyć Franz na Twój język.",
@@ -177,9 +178,9 @@
177 "settings.navigation.inviteFriends" : "Zaproś znajomych", 178 "settings.navigation.inviteFriends" : "Zaproś znajomych",
178 "settings.navigation.logout" : "Wyloguj", 179 "settings.navigation.logout" : "Wyloguj",
179 "settings.navigation.settings" : "Ustawienia", 180 "settings.navigation.settings" : "Ustawienia",
180 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Zarządzaj Zespołem",
181 "settings.navigation.yourServices" : "Twoje usługi", 182 "settings.navigation.yourServices" : "Twoje usługi",
182 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Twoje obszary robocze",
183 "settings.recipes.all" : "Wszystkie usługi", 184 "settings.recipes.all" : "Wszystkie usługi",
184 "settings.recipes.dev" : "Rozwojowe", 185 "settings.recipes.dev" : "Rozwojowe",
185 "settings.recipes.headline" : "Dostępne usługi", 186 "settings.recipes.headline" : "Dostępne usługi",
@@ -232,17 +233,17 @@
232 "settings.services.discoverServices" : "Przeglądaj usługi", 233 "settings.services.discoverServices" : "Przeglądaj usługi",
233 "settings.services.headline" : "Twoje usługi", 234 "settings.services.headline" : "Twoje usługi",
234 "settings.services.noServicesAdded" : "Nie dodałeś jeszcze żadnych usług.", 235 "settings.services.noServicesAdded" : "Nie dodałeś jeszcze żadnych usług.",
235 "settings.services.servicesRequestFailed" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "Nie udo się załadować twoich usług",
236 "settings.services.tooltip.isDisabled" : "Usługa jest nieaktywna", 237 "settings.services.tooltip.isDisabled" : "Usługa jest nieaktywna",
237 "settings.services.tooltip.isMuted" : "Wszystkie dźwięki są wyciszone", 238 "settings.services.tooltip.isMuted" : "Wszystkie dźwięki są wyciszone",
238 "settings.services.tooltip.notificationsDisabled" : "Powiadomienia są nieaktywne", 239 "settings.services.tooltip.notificationsDisabled" : "Powiadomienia są nieaktywne",
239 "settings.services.updatedInfo" : "Zmiany zostały zapisane", 240 "settings.services.updatedInfo" : "Zmiany zostały zapisane",
240 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Zespoły Franz",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "Franz umożliwia zespołom opcję zapraszania pracowników do zespołu wysyłając im maila z zaproszeniem i pozwala zarządzać ich subskrypcją w ustawieniach konta. Nie trać czasu na ustawianie subskrypcji dla każdego zespołu osobno, zapomnij o wielu fakturach i różnych cyklicznych opłatach - jeden zespół do zarządzania wszystkim!",
242 "settings.team.headline" : "Zespół", 243 "settings.team.headline" : "Zespół",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "Czy Ty i zesół używacie programu Franz? Możesz teraz zarządzać subskrypcją Premium dla tylu kolegów, przyjaciół lub rodziny ilu chcesz, wszystko w obrębie jednego konta.",
244 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Zarządzaj zespołem na meetfranz.com",
245 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Ulepsz swoje konto",
246 "settings.user.form.accountType.company" : "Firma", 247 "settings.user.form.accountType.company" : "Firma",
247 "settings.user.form.accountType.individual" : "Prywatne", 248 "settings.user.form.accountType.individual" : "Prywatne",
248 "settings.user.form.accountType.label" : "Typ konta", 249 "settings.user.form.accountType.label" : "Typ konta",
@@ -252,25 +253,25 @@
252 "settings.user.form.firstname" : "Imię", 253 "settings.user.form.firstname" : "Imię",
253 "settings.user.form.lastname" : "Nazwisko", 254 "settings.user.form.lastname" : "Nazwisko",
254 "settings.user.form.newPassword" : "Nowe hasło", 255 "settings.user.form.newPassword" : "Nowe hasło",
255 "settings.workspace.add.form.name" : "Name", 256 "settings.workspace.add.form.name" : "Im",
256 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Stwórz obszar roboczy",
257 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Usuń obszar roboczy",
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Zapisz obszar roboczy",
259 "settings.workspace.form.name" : "Name", 260 "settings.workspace.form.name" : "Im",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Usługi w obszarze roboczym",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Twoje obszary robocze",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Obszar roboczy został skasowany",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Twoje obszary robocze",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Nie dodeś jeszcze żadnego obszaru roboczego.",
265 "settings.workspaces.tryReloadWorkspaces" : "Spróbuj ponownie", 266 "settings.workspaces.tryReloadWorkspaces" : "Spróbuj ponownie",
266 "settings.workspaces.updatedInfo" : "Your changes have been saved", 267 "settings.workspaces.updatedInfo" : "Twoje zmiany zostały zapisane",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Mniej znaczy więcej: Wprowadzenie do obszarów roboczych Franz",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Obszary robocze programu Franz pozawala Ci na skupieniu się na tym co ważne w danym momencie. Ustaw różne zestawy usług i przełączaj się między nimi w łatwiejszy sposób w dowolnym momencie. Decyduj, które usługi potrzebujesz , więc pomagamy Ci pozostawać na szczycie gry - lub łatwiej wyłączyć się z pracy kiedy tego potrzebujesz.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Nie można załadowobszaru roboczego",
270 "sidebar.addNewService" : "Dodaj kolejną usługę", 271 "sidebar.addNewService" : "Dodaj kolejną usługę",
271 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Zamknij edycję obszaru roboczego",
272 "sidebar.muteApp" : "Wyłącz powiadomienia i dźwięki", 273 "sidebar.muteApp" : "Wyłącz powiadomienia i dźwięki",
273 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Otwórz edycję obszaru roboczego",
274 "sidebar.settings" : "Ustawienia", 275 "sidebar.settings" : "Ustawienia",
275 "sidebar.unmuteApp" : "Włącz powiadomienia i dźwięki", 276 "sidebar.unmuteApp" : "Włącz powiadomienia i dźwięki",
276 "signup.company.label" : "Firma", 277 "signup.company.label" : "Firma",
@@ -292,7 +293,7 @@
292 "subscription.features.onpremise.mattermost" : "Dodaj prywatnie hostowane usługi takie jak Mattermost", 293 "subscription.features.onpremise.mattermost" : "Dodaj prywatnie hostowane usługi takie jak Mattermost",
293 "subscription.features.proxy" : "Obsługa proxy dla usług", 294 "subscription.features.proxy" : "Obsługa proxy dla usług",
294 "subscription.features.spellchecker" : "Wsparcie dla sprawdzania pisowni", 295 "subscription.features.spellchecker" : "Wsparcie dla sprawdzania pisowni",
295 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Zarządzaj usługami w obszarach roboczych",
296 "subscription.includedFeatures" : "Płatne konto Franz Premium obejmuje", 297 "subscription.includedFeatures" : "Płatne konto Franz Premium obejmuje",
297 "subscription.paymentSessionError" : "Nie można wczytać formularza płatności\"", 298 "subscription.paymentSessionError" : "Nie można wczytać formularza płatności\"",
298 "subscription.submit.label" : "Chcę wspierać rozwój aplikacji Franz", 299 "subscription.submit.label" : "Chcę wspierać rozwój aplikacji Franz",
@@ -312,20 +313,20 @@
312 "tabs.item.reload" : "Przeładuj", 313 "tabs.item.reload" : "Przeładuj",
313 "validation.email" : "Pole {field} nie jest poprawne", 314 "validation.email" : "Pole {field} nie jest poprawne",
314 "validation.minLength" : "Pole {field} powinno składać się z co najmniej {length} znaków", 315 "validation.minLength" : "Pole {field} powinno składać się z co najmniej {length} znaków",
315 "validation.oneRequired" : "At least one is required", 316 "validation.oneRequired" : "Przynajmniej jeden jest wymagany",
316 "validation.required" : "Pole {field} jest wymagane", 317 "validation.required" : "Pole {field} jest wymagane",
317 "validation.url" : "Pole {field} nie jest poprawnym ciągiem URL.", 318 "validation.url" : "Pole {field} nie jest poprawnym ciągiem URL.",
318 "welcome.loginButton" : "Zaloguj się na swoje konto", 319 "welcome.loginButton" : "Zaloguj się na swoje konto",
319 "welcome.signupButton" : "Stwórz darmowe konto", 320 "welcome.signupButton" : "Stwórz darmowe konto",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Dodaj nowy obszar roboczy",
321 "workspaceDrawer.allServices" : "Wszystkie usługi", 322 "workspaceDrawer.allServices" : "Wszystkie usługi",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Obszary robocze",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "Edycja",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Żadne usługi nie zostały jeszcze dodane",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Strz pierwszy obszar roboczy",
326 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Funkcje Premium",
327 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Aktywuj ponownie konto premium",
328 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Obszary robocze programu Franz pozawala Ci na skupieniu się na tym co ważne w danym momencie. Ustaw różne zestawy usług i przełączaj się między nimi w łatwiejszy sposób w dowolnym momencie. <\/p><p>Decyduj, które usługi potrzebujesz , więc pomagamy Ci pozostawać na szczycie gry - lub łatwiej wyłączyć się z pracy kiedy tego potrzebujesz.<\/p>",
329 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Edytuj ustawienia obszaru roboczego",
330 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Przełącz do"
331} 332}
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 4ad2fac08..27fd796a4 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,7 +1,7 @@
1{ 1{
2 "app.errorHandler.action" : "Recarregar", 2 "app.errorHandler.action" : "Atualizar",
3 "app.errorHandler.headline" : "Alguma coisa deu errado", 3 "app.errorHandler.headline" : "Alguma coisa deu errado",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Mudanças no Franz {version}",
5 "feature.delayApp.action" : "Adquira uma licença Franz Supporter", 5 "feature.delayApp.action" : "Adquira uma licença Franz Supporter",
6 "feature.delayApp.headline" : "Por favor, adquira uma licença Franz Supporter para pular o tempo de espera", 6 "feature.delayApp.headline" : "Por favor, adquira uma licença Franz Supporter para pular o tempo de espera",
7 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.", 7 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.",
@@ -10,7 +10,7 @@
10 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter", 10 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter",
11 "feature.shareFranz.headline" : "Franz é melhor em grupo!", 11 "feature.shareFranz.headline" : "Franz é melhor em grupo!",
12 "feature.shareFranz.shareText.email" : "Eu adicionei {count} serviços ao Franz! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Eu adicionei {count} serviços ao Franz! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Eu adicionei uma contagem de serviços para o Franz! Baixe gratuitamente o aplicativo para WhatsApp, Messenger, Slack, Skype e outros em www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quão incrível Franz é e nos ajude a espalhar a mensagem. ", 14 "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quão incrível Franz é e nos ajude a espalhar a mensagem. ",
15 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.", 15 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.",
16 "global.notConnectedToTheInternet" : "Você não está conectado à internet", 16 "global.notConnectedToTheInternet" : "Você não está conectado à internet",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Entrar", 44 "login.submit.label" : "Entrar",
45 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.", 45 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.",
46 "menu.app.about" : "Sobre Franz", 46 "menu.app.about" : "Sobre Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Quais as novidades?",
48 "menu.app.checkForUpdates" : "Verificar se há atualizações",
48 "menu.app.hide" : "Ocultar", 49 "menu.app.hide" : "Ocultar",
49 "menu.app.hideOthers" : "Ocultar Outros", 50 "menu.app.hideOthers" : "Ocultar Outros",
50 "menu.app.quit" : "Sair", 51 "menu.app.quit" : "Sair",
@@ -89,11 +90,11 @@
89 "menu.window" : "Modo Janela", 90 "menu.window" : "Modo Janela",
90 "menu.window.close" : "Fechar", 91 "menu.window.close" : "Fechar",
91 "menu.window.minimize" : "Minimizar", 92 "menu.window.minimize" : "Minimizar",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Áreas de trabalho",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Adicionar nova área de trabalho...",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Fechar menu da área de trabalho",
95 "menu.workspaces.defaultWorkspace" : "Todos os serviços", 96 "menu.workspaces.defaultWorkspace" : "Todos os serviços",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Abrir o menu da área de trabalho",
97 "password.email.label" : "E-mail", 98 "password.email.label" : "E-mail",
98 "password.headline" : "Trocar senha", 99 "password.headline" : "Trocar senha",
99 "password.link.login" : "Fazer login na sua conta", 100 "password.link.login" : "Fazer login na sua conta",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "Ah, não!", 118 "service.errorHandler.headline" : "Ah, não!",
118 "service.errorHandler.message" : "Erro", 119 "service.errorHandler.message" : "Erro",
119 "service.errorHandler.text" : "{name} não pôde ser carregado.", 120 "service.errorHandler.text" : "{name} não pôde ser carregado.",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Carregando",
121 "services.getStarted" : "Iniciar", 122 "services.getStarted" : "Iniciar",
122 "services.welcome" : "Bem-vindo ao Franz!", 123 "services.welcome" : "Bem-vindo ao Franz!",
123 "settings.account.account.editButton" : "Editar conta", 124 "settings.account.account.editButton" : "Editar conta",
@@ -164,9 +165,9 @@
164 "settings.app.headlineGeneral" : "Geral", 165 "settings.app.headlineGeneral" : "Geral",
165 "settings.app.headlineLanguage" : "Idioma", 166 "settings.app.headlineLanguage" : "Idioma",
166 "settings.app.headlineUpdates" : "Atualizações", 167 "settings.app.headlineUpdates" : "Atualizações",
167 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "As traduções oficiais são em inglês e alemão. As demais traduções são baseadas na ajuda da comunidade.",
168 "settings.app.restartRequired" : "As atualizações exigem reiniciar o sistema", 169 "settings.app.restartRequired" : "As mudanças exigem reiniciar o sistema",
169 "settings.app.subheadlineCache" : "Cache", 170 "settings.app.subheadlineCache" : "memória cache",
170 "settings.app.translationHelp" : "Ajude-nos a traduzir o Franz para seu idioma.", 171 "settings.app.translationHelp" : "Ajude-nos a traduzir o Franz para seu idioma.",
171 "settings.app.updateStatusAvailable" : "Atualização disponível, baixando...", 172 "settings.app.updateStatusAvailable" : "Atualização disponível, baixando...",
172 "settings.app.updateStatusSearching" : "Buscando atualizações", 173 "settings.app.updateStatusSearching" : "Buscando atualizações",
@@ -177,9 +178,9 @@
177 "settings.navigation.inviteFriends" : "Convidar Amigos", 178 "settings.navigation.inviteFriends" : "Convidar Amigos",
178 "settings.navigation.logout" : "Sair", 179 "settings.navigation.logout" : "Sair",
179 "settings.navigation.settings" : "Ajustes", 180 "settings.navigation.settings" : "Ajustes",
180 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Administrar a equipe",
181 "settings.navigation.yourServices" : "Seus serviços", 182 "settings.navigation.yourServices" : "Seus serviços",
182 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Suas áreas de trabalho",
183 "settings.recipes.all" : "Todos os serviços", 184 "settings.recipes.all" : "Todos os serviços",
184 "settings.recipes.dev" : "Desenvolvimento", 185 "settings.recipes.dev" : "Desenvolvimento",
185 "settings.recipes.headline" : "Serviços disponíveis", 186 "settings.recipes.headline" : "Serviços disponíveis",
@@ -237,12 +238,12 @@
237 "settings.services.tooltip.isMuted" : "Sem som", 238 "settings.services.tooltip.isMuted" : "Sem som",
238 "settings.services.tooltip.notificationsDisabled" : "Notificações desativadas", 239 "settings.services.tooltip.notificationsDisabled" : "Notificações desativadas",
239 "settings.services.updatedInfo" : "Suas mudanças foram gravadas", 240 "settings.services.updatedInfo" : "Suas mudanças foram gravadas",
240 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Franz para Equipes",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "\"Franz para Equipes\" possui a opção de convidar ajudantes para a sua equipe através de mensagens por e-mail e gerenciar as inscrições deles em suas preferências de conta. Não perca tempo configurando as inscrições para membro da equipe individualmente, esqueça as múltiplas faturas e tempos de pagamento. Uma regra universal para todos os membros da equipe.",
242 "settings.team.headline" : "Equipe", 243 "settings.team.headline" : "Equipe",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "Você e sua equipe usam Franz? Você pode agora administrar as inscrições pagas de todos os seus colegas, amigos e membros da família que você quiser, tudo isso em uma única conta.",
244 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Gerencie sua Equipe no meetfranz.com",
245 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Atualize a sua conta para versão paga",
246 "settings.user.form.accountType.company" : "Empresa", 247 "settings.user.form.accountType.company" : "Empresa",
247 "settings.user.form.accountType.individual" : "Pessoal", 248 "settings.user.form.accountType.individual" : "Pessoal",
248 "settings.user.form.accountType.label" : "Tipo de conta", 249 "settings.user.form.accountType.label" : "Tipo de conta",
@@ -253,24 +254,24 @@
253 "settings.user.form.lastname" : "Sobrenome", 254 "settings.user.form.lastname" : "Sobrenome",
254 "settings.user.form.newPassword" : "Nova senha", 255 "settings.user.form.newPassword" : "Nova senha",
255 "settings.workspace.add.form.name" : "Nome", 256 "settings.workspace.add.form.name" : "Nome",
256 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Criar workspace",
257 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Apagar workspace",
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Salvar workspace",
259 "settings.workspace.form.name" : "Nome", 260 "settings.workspace.form.name" : "Nome",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Serviços neste Workspace",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Seus workspaces",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Área de trabalho deletada",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Suas Áreas de Trabalho",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Você não possui nenhuma área de trabalho adicionadas anteriormente.",
265 "settings.workspaces.tryReloadWorkspaces" : "Try again", 266 "settings.workspaces.tryReloadWorkspaces" : "Tente de novo",
266 "settings.workspaces.updatedInfo" : "Your changes have been saved", 267 "settings.workspaces.updatedInfo" : "Suas mudanças foram salvas",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Menos é Mais: Introduzindo Workspaces do Franz",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "As áreas de trabalho do Franz permite você focar no que realmente é importante agora. Configure diferentes conjuntos de serviços e alterne entre eles facilmente em qualquer momento. Você decide quais serviços você precisa e onde deseja colocá-los, então nós podemos te ajudar a aumentar a produtividade de suas tarefas. Ou facilmente deletar os aplicativos que você nunca irá precisar.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "o foi possível carregar suas áreas de trabalho",
270 "sidebar.addNewService" : "Adicionar novo serviço", 271 "sidebar.addNewService" : "Adicionar novo serviço",
271 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Fechar o menu da área de trabalho",
272 "sidebar.muteApp" : "Desativar notificações e áudio", 273 "sidebar.muteApp" : "Desativar notificações e áudio",
273 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Abrir menu da área de trabalho",
274 "sidebar.settings" : "Ajustes", 275 "sidebar.settings" : "Ajustes",
275 "sidebar.unmuteApp" : "Ativar notificações e áudio", 276 "sidebar.unmuteApp" : "Ativar notificações e áudio",
276 "signup.company.label" : "Empresa", 277 "signup.company.label" : "Empresa",
@@ -292,7 +293,7 @@
292 "subscription.features.onpremise.mattermost" : "Adicionar serviços locais\/hospedados como o Mattermost", 293 "subscription.features.onpremise.mattermost" : "Adicionar serviços locais\/hospedados como o Mattermost",
293 "subscription.features.proxy" : "Suporte de proxy para serviços", 294 "subscription.features.proxy" : "Suporte de proxy para serviços",
294 "subscription.features.spellchecker" : "Suporte para corretor ortográfico", 295 "subscription.features.spellchecker" : "Suporte para corretor ortográfico",
295 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Organize seus serviços em áreas de trabalho",
296 "subscription.includedFeatures" : "A conta Apoiador Franz Premium inclui", 297 "subscription.includedFeatures" : "A conta Apoiador Franz Premium inclui",
297 "subscription.paymentSessionError" : "Não foi possível abrir o formulário de pagamento", 298 "subscription.paymentSessionError" : "Não foi possível abrir o formulário de pagamento",
298 "subscription.submit.label" : "Eu quero apoiar o desenvolvimento do Franz", 299 "subscription.submit.label" : "Eu quero apoiar o desenvolvimento do Franz",
@@ -317,15 +318,15 @@
317 "validation.url" : "{campo} essa URL não é válida", 318 "validation.url" : "{campo} essa URL não é válida",
318 "welcome.loginButton" : "Entrar na sua conta", 319 "welcome.loginButton" : "Entrar na sua conta",
319 "welcome.signupButton" : "Criar uma conta grátis", 320 "welcome.signupButton" : "Criar uma conta grátis",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Adicionar uma nova área de trabalho",
321 "workspaceDrawer.allServices" : "Todos os serviços", 322 "workspaceDrawer.allServices" : "Todos os serviços",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Áreas de Trabalho",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "editar",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Nenhum serviço adicionado anteriormente",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Crie sua primeira área de trabalho",
326 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Vantagem paga oferecida aos assinantes",
327 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reative sua conta paga",
328 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 329 "workspaceDrawer.workspaceFeatureInfo" : "<p>As áreas de trabalho do Franz te ajuda a focar no que realmente é importante agora. Configure diferente cenários para serviços e mude entre eles facilmente em qualquer momento. <\/p><p>Você decide quais serviços precisa e onde deseja posicioná-los, e então nós iremos te ajudar em aumentar a sua produtividade. Você pode desligar os serviços que não são úteis para você.<\/p>",
329 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Editar configurações das áreas de trabalho",
330 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Mudando para"
331} 332}
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 302284ab8..668db12a2 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -15,7 +15,7 @@
15 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz", 15 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz",
16 "global.notConnectedToTheInternet" : "Não estás ligado à Internet", 16 "global.notConnectedToTheInternet" : "Não estás ligado à Internet",
17 "global.spellchecker.useDefault" : "Utilizar o Sistema por Omissão ({default})", 17 "global.spellchecker.useDefault" : "Utilizar o Sistema por Omissão ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 18 "global.spellchecking.autodetect" : "Detectar a lingua automaticamente",
19 "global.spellchecking.autodetect.short" : "Automatic", 19 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Linguagem para correção ortográfica", 20 "global.spellchecking.language" : "Linguagem para correção ortográfica",
21 "import.headline" : "Importa os teus serviços do Franz", 21 "import.headline" : "Importa os teus serviços do Franz",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Iniciar sessão", 44 "login.submit.label" : "Iniciar sessão",
45 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.", 45 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.",
46 "menu.app.about" : "Sobre o Franz", 46 "menu.app.about" : "Sobre o Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "O que há de novo?",
48 "menu.app.checkForUpdates" : "Procurar atualizações",
48 "menu.app.hide" : "Ocultar", 49 "menu.app.hide" : "Ocultar",
49 "menu.app.hideOthers" : "Ocultar Outros", 50 "menu.app.hideOthers" : "Ocultar Outros",
50 "menu.app.quit" : "Sair", 51 "menu.app.quit" : "Sair",
@@ -72,9 +73,9 @@
72 "menu.help.support" : "Suporte", 73 "menu.help.support" : "Suporte",
73 "menu.help.tos" : "Termos do Serviço", 74 "menu.help.tos" : "Termos do Serviço",
74 "menu.services" : "Serviços", 75 "menu.services" : "Serviços",
75 "menu.services.activatePreviousService" : "Activate previous service", 76 "menu.services.activatePreviousService" : "Activar o serviço anterior",
76 "menu.services.addNewService" : "Adicionar Novo Serviço...", 77 "menu.services.addNewService" : "Adicionar Novo Serviço...",
77 "menu.services.setNextServiceActive" : "Activate next service", 78 "menu.services.setNextServiceActive" : "Activar o próximo serviço",
78 "menu.view" : "Ver", 79 "menu.view" : "Ver",
79 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo", 80 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo",
80 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo", 81 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo",
@@ -89,11 +90,11 @@
89 "menu.window" : "Janela", 90 "menu.window" : "Janela",
90 "menu.window.close" : "Fechar", 91 "menu.window.close" : "Fechar",
91 "menu.window.minimize" : "Minimizar", 92 "menu.window.minimize" : "Minimizar",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Espaços de trabalho",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Adicionar novo Espaço de trabalho",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Fechar a janela do Espaço de trabalho",
95 "menu.workspaces.defaultWorkspace" : "Todos os serviços", 96 "menu.workspaces.defaultWorkspace" : "Todos os serviços",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Abrir a janela do Espaço de trabalho",
97 "password.email.label" : "Endereço de e-mail", 98 "password.email.label" : "Endereço de e-mail",
98 "password.headline" : "Repor a minha palavra-passe", 99 "password.headline" : "Repor a minha palavra-passe",
99 "password.link.login" : "Iniciar sessão", 100 "password.link.login" : "Iniciar sessão",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "Oh não!", 118 "service.errorHandler.headline" : "Oh não!",
118 "service.errorHandler.message" : "Erro", 119 "service.errorHandler.message" : "Erro",
119 "service.errorHandler.text" : "{name} falhou o carregamento", 120 "service.errorHandler.text" : "{name} falhou o carregamento",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "A ler",
121 "services.getStarted" : "Vamos começar", 122 "services.getStarted" : "Vamos começar",
122 "services.welcome" : "Bem-vindo ao Franz", 123 "services.welcome" : "Bem-vindo ao Franz",
123 "settings.account.account.editButton" : "Editar conta", 124 "settings.account.account.editButton" : "Editar conta",
@@ -177,9 +178,9 @@
177 "settings.navigation.inviteFriends" : "Convide Amigos", 178 "settings.navigation.inviteFriends" : "Convide Amigos",
178 "settings.navigation.logout" : "Terminar sessão", 179 "settings.navigation.logout" : "Terminar sessão",
179 "settings.navigation.settings" : "Definições", 180 "settings.navigation.settings" : "Definições",
180 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Gerir a equipa",
181 "settings.navigation.yourServices" : "Os seus serviços", 182 "settings.navigation.yourServices" : "Os seus serviços",
182 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Os teus Espaços de trabalho",
183 "settings.recipes.all" : "Todos os serviços", 184 "settings.recipes.all" : "Todos os serviços",
184 "settings.recipes.dev" : "Desenvolvimento", 185 "settings.recipes.dev" : "Desenvolvimento",
185 "settings.recipes.headline" : "Serviços disponíveis", 186 "settings.recipes.headline" : "Serviços disponíveis",
@@ -232,17 +233,17 @@
232 "settings.services.discoverServices" : "Descobrir serviços", 233 "settings.services.discoverServices" : "Descobrir serviços",
233 "settings.services.headline" : "Os seus serviços", 234 "settings.services.headline" : "Os seus serviços",
234 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.", 235 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.",
235 "settings.services.servicesRequestFailed" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "o foi possível ler os teus serviços",
236 "settings.services.tooltip.isDisabled" : "O serviço está desativado", 237 "settings.services.tooltip.isDisabled" : "O serviço está desativado",
237 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados", 238 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados",
238 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas", 239 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas",
239 "settings.services.updatedInfo" : "As alterações foram guardadas", 240 "settings.services.updatedInfo" : "As alterações foram guardadas",
240 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Franz para equipas",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
242 "settings.team.headline" : "Equipa", 243 "settings.team.headline" : "Equipa",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
244 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Gerir a tua Equipa em meetfranz.com",
245 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Actualiza a tua conta",
246 "settings.user.form.accountType.company" : "Empresa", 247 "settings.user.form.accountType.company" : "Empresa",
247 "settings.user.form.accountType.individual" : "Indivíduo", 248 "settings.user.form.accountType.individual" : "Indivíduo",
248 "settings.user.form.accountType.label" : "Tipo de conta", 249 "settings.user.form.accountType.label" : "Tipo de conta",
@@ -253,24 +254,24 @@
253 "settings.user.form.lastname" : "Último Nome", 254 "settings.user.form.lastname" : "Último Nome",
254 "settings.user.form.newPassword" : "Nova palavra-passe", 255 "settings.user.form.newPassword" : "Nova palavra-passe",
255 "settings.workspace.add.form.name" : "Nome", 256 "settings.workspace.add.form.name" : "Nome",
256 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Criar um Espaço de trabalho",
257 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Apagar um Espaço de trabalho",
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Gravar um Espaço de trabalho",
259 "settings.workspace.form.name" : "Nome", 260 "settings.workspace.form.name" : "Nome",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Os teus Espaços de trabalho",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "O Espaço de trabalho foi apagado",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Os teus Espaços de trabalho",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Ainda não adicionou nenhum Espaço de trabalho",
265 "settings.workspaces.tryReloadWorkspaces" : "Tentar novamente", 266 "settings.workspaces.tryReloadWorkspaces" : "Tentar novamente",
266 "settings.workspaces.updatedInfo" : "Your changes have been saved", 267 "settings.workspaces.updatedInfo" : "As suas alterações foram gravadas",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Menos é Mais: Introduzindo os Espaço de trabalho Franz",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
270 "sidebar.addNewService" : "Adicionar um novo serviço", 271 "sidebar.addNewService" : "Adicionar um novo serviço",
271 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Fechar a janela do Espaço de trabalho",
272 "sidebar.muteApp" : "Desativar notificações e áudio", 273 "sidebar.muteApp" : "Desativar notificações e áudio",
273 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Abrir a janela do Espaço de trabalho",
274 "sidebar.settings" : "Definições", 275 "sidebar.settings" : "Definições",
275 "sidebar.unmuteApp" : "Ativar notificações e áudio", 276 "sidebar.unmuteApp" : "Ativar notificações e áudio",
276 "signup.company.label" : "Empresa", 277 "signup.company.label" : "Empresa",
@@ -319,7 +320,7 @@
319 "welcome.signupButton" : "Criar uma conta gratuita", 320 "welcome.signupButton" : "Criar uma conta gratuita",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
321 "workspaceDrawer.allServices" : "Todos os serviços", 322 "workspaceDrawer.allServices" : "Todos os serviços",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Espaços de trabalho",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "edit",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 97ad98361..4d20d5745 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Сессия устарела, пожалуйста, войдите снова.", 45 "login.tokenExpired" : "Сессия устарела, пожалуйста, войдите снова.",
46 "menu.app.about" : "О Franz", 46 "menu.app.about" : "О Franz",
47 "menu.app.announcement" : "Что нового?", 47 "menu.app.announcement" : "Что нового?",
48 "menu.app.checkForUpdates" : "Проверить обновления",
48 "menu.app.hide" : "Скрыть", 49 "menu.app.hide" : "Скрыть",
49 "menu.app.hideOthers" : "Скрыть остальные", 50 "menu.app.hideOthers" : "Скрыть остальные",
50 "menu.app.quit" : "Выйти", 51 "menu.app.quit" : "Выйти",
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index 7af29ef1c..3b051e975 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -1,23 +1,23 @@
1{ 1{
2 "app.errorHandler.action" : "Obnoviť", 2 "app.errorHandler.action" : "Obnoviť",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Niečo sa pokazilo",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Zmeny vo Franz {version}",
5 "feature.delayApp.action" : "Get a Franz Supporter License", 5 "feature.delayApp.action" : "Získajte licenciu pre Franz podporu",
6 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 6 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
7 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 7 "feature.delayApp.text" : "Franz bude pokračovať v {seconds} seundách.",
8 "feature.shareFranz.action.email" : "Send as email", 8 "feature.shareFranz.action.email" : "Odoslať ako e-mail",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 9 "feature.shareFranz.action.facebook" : "Zdielať na Facebook-u",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 10 "feature.shareFranz.action.twitter" : "Zdieľať na Twitter-i",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "Franz is better together!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
15 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz", 15 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz",
16 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.", 16 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 17 "global.spellchecker.useDefault" : "Použiť predvolené nastavenie systému ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 18 "global.spellchecking.autodetect" : "Automaticky rozpoznať jazyk",
19 "global.spellchecking.autodetect.short" : "Automatic", 19 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Spell checking language", 20 "global.spellchecking.language" : "Jazyk kontroly pravopisu",
21 "import.headline" : "Importovať vaše služby z Franz 4", 21 "import.headline" : "Importovať vaše služby z Franz 4",
22 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5", 22 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5",
23 "import.skip.label" : "Chcem pridať služby ručne", 23 "import.skip.label" : "Chcem pridať služby ručne",
@@ -44,7 +44,8 @@
44 "login.submit.label" : "Prihlásiť sa", 44 "login.submit.label" : "Prihlásiť sa",
45 "login.tokenExpired" : "Vaša relácia vypršala, prihláste sa prosím znovu.", 45 "login.tokenExpired" : "Vaša relácia vypršala, prihláste sa prosím znovu.",
46 "menu.app.about" : "O aplikácii", 46 "menu.app.about" : "O aplikácii",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Čo je nové?",
48 "menu.app.checkForUpdates" : "Skontrolovať aktualizácie",
48 "menu.app.hide" : "Skryť", 49 "menu.app.hide" : "Skryť",
49 "menu.app.hideOthers" : "Skryť ostatné", 50 "menu.app.hideOthers" : "Skryť ostatné",
50 "menu.app.quit" : "Ukončiť", 51 "menu.app.quit" : "Ukončiť",
@@ -72,9 +73,9 @@
72 "menu.help.support" : "Podpora", 73 "menu.help.support" : "Podpora",
73 "menu.help.tos" : "Podmienky použitia", 74 "menu.help.tos" : "Podmienky použitia",
74 "menu.services" : "Služby", 75 "menu.services" : "Služby",
75 "menu.services.activatePreviousService" : "Activate previous service", 76 "menu.services.activatePreviousService" : "Aktivovať predchádzajúcu službu",
76 "menu.services.addNewService" : "Pridať novú službu...", 77 "menu.services.addNewService" : "Pridať novú službu...",
77 "menu.services.setNextServiceActive" : "Activate next service", 78 "menu.services.setNextServiceActive" : "Aktivujte ďalšiu službu",
78 "menu.view" : "Zobraziť", 79 "menu.view" : "Zobraziť",
79 "menu.view.enterFullScreen" : "Na celú obrazovku", 80 "menu.view.enterFullScreen" : "Na celú obrazovku",
80 "menu.view.exitFullScreen" : "Ukončiť režim na celú obrazovku", 81 "menu.view.exitFullScreen" : "Ukončiť režim na celú obrazovku",
@@ -89,8 +90,8 @@
89 "menu.window" : "Okno", 90 "menu.window" : "Okno",
90 "menu.window.close" : "Zatvoriť", 91 "menu.window.close" : "Zatvoriť",
91 "menu.window.minimize" : "Minimalizovať", 92 "menu.window.minimize" : "Minimalizovať",
92 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Pracovný priestor",
93 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Prid nopracovný priestor ...",
94 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
95 "menu.workspaces.defaultWorkspace" : "Všetky služby", 96 "menu.workspaces.defaultWorkspace" : "Všetky služby",
96 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
@@ -101,7 +102,7 @@
101 "password.noUser" : "Používateľ s touto e-mailovou adresou nebol nájdený", 102 "password.noUser" : "Používateľ s touto e-mailovou adresou nebol nájdený",
102 "password.submit.label" : "Odoslať", 103 "password.submit.label" : "Odoslať",
103 "password.successInfo" : "Skontrolujte prosím váš e-mail", 104 "password.successInfo" : "Skontrolujte prosím váš e-mail",
104 "premiumFeature.button.upgradeAccount" : "Upgrade account", 105 "premiumFeature.button.upgradeAccount" : "Upgradovať účet",
105 "pricing.headline" : "Podporiť Franz", 106 "pricing.headline" : "Podporiť Franz",
106 "pricing.link.skipPayment" : "Nechcem podporiť vývoj aplikácie Franz.", 107 "pricing.link.skipPayment" : "Nechcem podporiť vývoj aplikácie Franz.",
107 "pricing.submit.label" : "Chcem podporiť vývoj aplikácie Franz", 108 "pricing.submit.label" : "Chcem podporiť vývoj aplikácie Franz",
@@ -117,7 +118,7 @@
117 "service.errorHandler.headline" : "Ale nie!", 118 "service.errorHandler.headline" : "Ale nie!",
118 "service.errorHandler.message" : "Chyba", 119 "service.errorHandler.message" : "Chyba",
119 "service.errorHandler.text" : "{name} has failed to load.", 120 "service.errorHandler.text" : "{name} has failed to load.",
120 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Načítava",
121 "services.getStarted" : "Začíname", 122 "services.getStarted" : "Začíname",
122 "services.welcome" : "Vítajte v aplikácii Franz", 123 "services.welcome" : "Vítajte v aplikácii Franz",
123 "settings.account.account.editButton" : "Upraviť účet", 124 "settings.account.account.editButton" : "Upraviť účet",
@@ -149,7 +150,7 @@
149 "settings.app.form.autoLaunchInBackground" : "Otvoriť na pozadí", 150 "settings.app.form.autoLaunchInBackground" : "Otvoriť na pozadí",
150 "settings.app.form.autoLaunchOnStart" : "Spustiť Franz pri štarte", 151 "settings.app.form.autoLaunchOnStart" : "Spustiť Franz pri štarte",
151 "settings.app.form.beta" : "Vrátane beta verzií", 152 "settings.app.form.beta" : "Vrátane beta verzií",
152 "settings.app.form.darkMode" : "Join the Dark Side", 153 "settings.app.form.darkMode" : "Spust Dark Side",
153 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie", 154 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie",
154 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu", 155 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu",
155 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište", 156 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište",
@@ -164,7 +165,7 @@
164 "settings.app.headlineGeneral" : "Všeobecné", 165 "settings.app.headlineGeneral" : "Všeobecné",
165 "settings.app.headlineLanguage" : "Jazyk", 166 "settings.app.headlineLanguage" : "Jazyk",
166 "settings.app.headlineUpdates" : "Aktualizácie", 167 "settings.app.headlineUpdates" : "Aktualizácie",
167 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "Oficiálne preklady sú angličtina a nemčina. Všetky ostatné jazyky sú preklady založené na komunite.",
168 "settings.app.restartRequired" : "Zmeny vyžadujú reštart", 169 "settings.app.restartRequired" : "Zmeny vyžadujú reštart",
169 "settings.app.subheadlineCache" : "Vyrovnávacia pamäť", 170 "settings.app.subheadlineCache" : "Vyrovnávacia pamäť",
170 "settings.app.translationHelp" : "Pomôžte nám preložiť Franz do svojho jazyka.", 171 "settings.app.translationHelp" : "Pomôžte nám preložiť Franz do svojho jazyka.",
@@ -177,9 +178,9 @@
177 "settings.navigation.inviteFriends" : "Pozvať priateľov", 178 "settings.navigation.inviteFriends" : "Pozvať priateľov",
178 "settings.navigation.logout" : "Odhlásiť sa", 179 "settings.navigation.logout" : "Odhlásiť sa",
179 "settings.navigation.settings" : "Nastavenia", 180 "settings.navigation.settings" : "Nastavenia",
180 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Spravovať m",
181 "settings.navigation.yourServices" : "Vaše služby", 182 "settings.navigation.yourServices" : "Vaše služby",
182 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Tvoje pracovné priestory",
183 "settings.recipes.all" : "Všetky služby", 184 "settings.recipes.all" : "Všetky služby",
184 "settings.recipes.dev" : "Vývoj", 185 "settings.recipes.dev" : "Vývoj",
185 "settings.recipes.headline" : "Dostupné služby", 186 "settings.recipes.headline" : "Dostupné služby",
@@ -201,7 +202,7 @@
201 "settings.service.form.editServiceHeadline" : "Upraviť {name}", 202 "settings.service.form.editServiceHeadline" : "Upraviť {name}",
202 "settings.service.form.enableAudio" : "Zapnúť zvuk", 203 "settings.service.form.enableAudio" : "Zapnúť zvuk",
203 "settings.service.form.enableBadge" : "Zobraziť symboly neprečítaných správ", 204 "settings.service.form.enableBadge" : "Zobraziť symboly neprečítaných správ",
204 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 205 "settings.service.form.enableDarkMode" : "Zapnúť Dark Mode",
205 "settings.service.form.enableNotification" : "Povoliť oznámenia", 206 "settings.service.form.enableNotification" : "Povoliť oznámenia",
206 "settings.service.form.enableService" : "Povoliť službu", 207 "settings.service.form.enableService" : "Povoliť službu",
207 "settings.service.form.headlineBadges" : "Symboly neprečítaných správ", 208 "settings.service.form.headlineBadges" : "Symboly neprečítaných správ",
@@ -216,12 +217,12 @@
216 "settings.service.form.name" : "Meno", 217 "settings.service.form.name" : "Meno",
217 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 218 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
218 "settings.service.form.proxy.host" : "Proxy Host\/IP", 219 "settings.service.form.proxy.host" : "Proxy Host\/IP",
219 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 220 "settings.service.form.proxy.info" : "Nastavenia servera proxy sa nebudú synchronizovať so servermi Franz.",
220 "settings.service.form.proxy.isEnabled" : "Use Proxy", 221 "settings.service.form.proxy.isEnabled" : "Použiť Proxy",
221 "settings.service.form.proxy.password" : "Password (optional)", 222 "settings.service.form.proxy.password" : "Heslo (voliteľné)",
222 "settings.service.form.proxy.port" : "Port", 223 "settings.service.form.proxy.port" : "Port",
223 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 224 "settings.service.form.proxy.restartInfo" : "Po zmene nastavení servera proxy reštartujte Franz.",
224 "settings.service.form.proxy.user" : "User (optional)", 225 "settings.service.form.proxy.user" : "Používateľ (voliteľné)",
225 "settings.service.form.saveButton" : "Uložiť službu", 226 "settings.service.form.saveButton" : "Uložiť službu",
226 "settings.service.form.tabHosted" : "Hostované", 227 "settings.service.form.tabHosted" : "Hostované",
227 "settings.service.form.tabOnPremise" : "Vlastné hostovanie ⭐️", 228 "settings.service.form.tabOnPremise" : "Vlastné hostovanie ⭐️",
@@ -232,17 +233,17 @@
232 "settings.services.discoverServices" : "Preskúmať služby", 233 "settings.services.discoverServices" : "Preskúmať služby",
233 "settings.services.headline" : "Vaše služby", 234 "settings.services.headline" : "Vaše služby",
234 "settings.services.noServicesAdded" : "Doposiaľ ste nepridali žiadne služby.", 235 "settings.services.noServicesAdded" : "Doposiaľ ste nepridali žiadne služby.",
235 "settings.services.servicesRequestFailed" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "Nepodarilo sa načítať ve služby",
236 "settings.services.tooltip.isDisabled" : "Služba je vypnutá", 237 "settings.services.tooltip.isDisabled" : "Služba je vypnutá",
237 "settings.services.tooltip.isMuted" : "Všetky zvuky sú stíšené", 238 "settings.services.tooltip.isMuted" : "Všetky zvuky sú stíšené",
238 "settings.services.tooltip.notificationsDisabled" : "Oznámenia sú vypnuté", 239 "settings.services.tooltip.notificationsDisabled" : "Oznámenia sú vypnuté",
239 "settings.services.updatedInfo" : "Vaše zmeny boli uložené", 240 "settings.services.updatedInfo" : "Vaše zmeny boli uložené",
240 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Franz premy",
241 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "Franz for Teams vám dáva možnosť pozvať spolupracovníkov do vášho tímu odoslaním e-mailových pozvánok a spravovaním ich odberov v preferenciách vášho účtu. Nestrácajte čas vytváraním predplatného pre každého člena tímu jednotlivo, zabudnite na viac faktúr a rôzne fakturačné cykly - jeden tím bude pre všetkých!",
242 "settings.team.headline" : "Tím", 243 "settings.team.headline" : "Tím",
243 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "Vy a váš tím používate Franz? Teraz môžete spravovať prémiové predplatné pre toľko kolegov, priateľov alebo rodinných príslušníkov, koľko chcete, všetko z jedného účtu.",
244 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Spravujte svoj m na adrese meetfranz.com",
245 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Vylepšite svoj účet",
246 "settings.user.form.accountType.company" : "Spoločnosť", 247 "settings.user.form.accountType.company" : "Spoločnosť",
247 "settings.user.form.accountType.individual" : "Osoba", 248 "settings.user.form.accountType.individual" : "Osoba",
248 "settings.user.form.accountType.label" : "Typ účtu", 249 "settings.user.form.accountType.label" : "Typ účtu",
@@ -253,18 +254,18 @@
253 "settings.user.form.lastname" : "Priezvisko", 254 "settings.user.form.lastname" : "Priezvisko",
254 "settings.user.form.newPassword" : "Nové heslo", 255 "settings.user.form.newPassword" : "Nové heslo",
255 "settings.workspace.add.form.name" : "Meno", 256 "settings.workspace.add.form.name" : "Meno",
256 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Vytvorpracovný priestor",
257 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Vymazať pracovný priestor",
258 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Uložiť pracovný priestor",
259 "settings.workspace.form.name" : "Meno", 260 "settings.workspace.form.name" : "Meno",
260 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Služby v tomto pracovnom priestore",
261 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Tvoje pracovné priestory",
262 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Pracovný priestor bol odstráne",
263 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Tvoje pracovné priestory",
264 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Zatiaľ si nepridal žiadne pracovné priestory.",
265 "settings.workspaces.tryReloadWorkspaces" : "Skúsiť znova", 266 "settings.workspaces.tryReloadWorkspaces" : "Skúsiť znova",
266 "settings.workspaces.updatedInfo" : "Vaše zmeny boli uložené", 267 "settings.workspaces.updatedInfo" : "Vaše zmeny boli uložené",
267 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Menej je viac: Predstavenie Franz Pracovné priestory",
268 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
269 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
270 "sidebar.addNewService" : "Pridať novú službu", 271 "sidebar.addNewService" : "Pridať novú službu",
@@ -319,7 +320,7 @@
319 "welcome.signupButton" : "Vytvoriť účet zdarma", 320 "welcome.signupButton" : "Vytvoriť účet zdarma",
320 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
321 "workspaceDrawer.allServices" : "Všetky služby", 322 "workspaceDrawer.allServices" : "Všetky služby",
322 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Pracovný priestor",
323 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "edit",
324 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
325 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index e5962566b..6ba059af8 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 45 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
46 "menu.app.about" : "O Francu", 46 "menu.app.about" : "O Francu",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Potraži ažuriranja",
48 "menu.app.hide" : "Sakrij", 49 "menu.app.hide" : "Sakrij",
49 "menu.app.hideOthers" : "Sakrij ostale", 50 "menu.app.hideOthers" : "Sakrij ostale",
50 "menu.app.quit" : "Izađi", 51 "menu.app.quit" : "Izađi",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 69c5ede37..d8200b4f3 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Oturum zaman aşımına uğradı, lütfen tekrar giriş yapın.", 45 "login.tokenExpired" : "Oturum zaman aşımına uğradı, lütfen tekrar giriş yapın.",
46 "menu.app.about" : "Franz Hakkında", 46 "menu.app.about" : "Franz Hakkında",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Güncellemeleri kontrol et",
48 "menu.app.hide" : "Gizle", 49 "menu.app.hide" : "Gizle",
49 "menu.app.hideOthers" : "Diğerlerini Gizle", 50 "menu.app.hideOthers" : "Diğerlerini Gizle",
50 "menu.app.quit" : "Çıkış", 51 "menu.app.quit" : "Çıkış",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 113665f5f..8d68590fb 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "Ваша сесія закінчилась, будь ласка, увійдіть знову.", 45 "login.tokenExpired" : "Ваша сесія закінчилась, будь ласка, увійдіть знову.",
46 "menu.app.about" : "Про Franz", 46 "menu.app.about" : "Про Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Перевірити наявність оновлень",
48 "menu.app.hide" : "Приховати", 49 "menu.app.hide" : "Приховати",
49 "menu.app.hideOthers" : "Приховати інші", 50 "menu.app.hideOthers" : "Приховати інші",
50 "menu.app.quit" : "Вийти", 51 "menu.app.quit" : "Вийти",
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index 34bd2158c..aa6247063 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -45,6 +45,7 @@
45 "login.tokenExpired" : "您的登入已過期,請重新登入。", 45 "login.tokenExpired" : "您的登入已過期,請重新登入。",
46 "menu.app.about" : "關於 Franz", 46 "menu.app.about" : "關於 Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "檢查更新",
48 "menu.app.hide" : "隱藏", 49 "menu.app.hide" : "隱藏",
49 "menu.app.hideOthers" : "隱藏其他", 50 "menu.app.hideOthers" : "隱藏其他",
50 "menu.app.quit" : "結束", 51 "menu.app.quit" : "結束",
diff --git a/src/i18n/messages/src/components/AppUpdateInfoBar.json b/src/i18n/messages/src/components/AppUpdateInfoBar.json
new file mode 100644
index 000000000..c4c2d0cae
--- /dev/null
+++ b/src/i18n/messages/src/components/AppUpdateInfoBar.json
@@ -0,0 +1,41 @@
1[
2 {
3 "id": "infobar.updateAvailable",
4 "defaultMessage": "!!!A new update for Franz is available.",
5 "file": "src/components/AppUpdateInfoBar.js",
6 "start": {
7 "line": 9,
8 "column": 19
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "infobar.buttonChangelog",
17 "defaultMessage": "!!!Changelog",
18 "file": "src/components/AppUpdateInfoBar.js",
19 "start": {
20 "line": 13,
21 "column": 13
22 },
23 "end": {
24 "line": 16,
25 "column": 3
26 }
27 },
28 {
29 "id": "infobar.buttonInstallUpdate",
30 "defaultMessage": "!!!Restart & install update",
31 "file": "src/components/AppUpdateInfoBar.js",
32 "start": {
33 "line": 17,
34 "column": 23
35 },
36 "end": {
37 "line": 20,
38 "column": 3
39 }
40 }
41] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index 26b8ce040..190c5dff7 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,24 +4,11 @@
4 "defaultMessage": "!!!Your services have been updated.", 4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js", 5 "file": "src/components/layout/AppLayout.js",
6 "start": { 6 "start": {
7 "line": 27, 7 "line": 26,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 30, 11 "line": 29,
12 "column": 3
13 }
14 },
15 {
16 "id": "infobar.updateAvailable",
17 "defaultMessage": "!!!A new update for Franz is available.",
18 "file": "src/components/layout/AppLayout.js",
19 "start": {
20 "line": 31,
21 "column": 19
22 },
23 "end": {
24 "line": 34,
25 "column": 3 12 "column": 3
26 } 13 }
27 }, 14 },
@@ -30,37 +17,11 @@
30 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
31 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
32 "start": { 19 "start": {
33 "line": 35, 20 "line": 30,
34 "column": 24 21 "column": 24
35 }, 22 },
36 "end": { 23 "end": {
37 "line": 38, 24 "line": 33,
38 "column": 3
39 }
40 },
41 {
42 "id": "infobar.buttonChangelog",
43 "defaultMessage": "!!!Changelog",
44 "file": "src/components/layout/AppLayout.js",
45 "start": {
46 "line": 39,
47 "column": 13
48 },
49 "end": {
50 "line": 42,
51 "column": 3
52 }
53 },
54 {
55 "id": "infobar.buttonInstallUpdate",
56 "defaultMessage": "!!!Restart & install update",
57 "file": "src/components/layout/AppLayout.js",
58 "start": {
59 "line": 43,
60 "column": 23
61 },
62 "end": {
63 "line": 46,
64 "column": 3 25 "column": 3
65 } 26 }
66 }, 27 },
@@ -69,11 +30,11 @@
69 "defaultMessage": "!!!Could not load services and user information", 30 "defaultMessage": "!!!Could not load services and user information",
70 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
71 "start": { 32 "start": {
72 "line": 47, 33 "line": 34,
73 "column": 26 34 "column": 26
74 }, 35 },
75 "end": { 36 "end": {
76 "line": 50, 37 "line": 37,
77 "column": 3 38 "column": 3
78 } 39 }
79 } 40 }
diff --git a/src/i18n/messages/src/helpers/validation-helpers.json b/src/i18n/messages/src/helpers/validation-helpers.json
index 86bfe1500..6be1d33e9 100644
--- a/src/i18n/messages/src/helpers/validation-helpers.json
+++ b/src/i18n/messages/src/helpers/validation-helpers.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Field is required", 4 "defaultMessage": "!!!Field is required",
5 "file": "src/helpers/validation-helpers.js", 5 "file": "src/helpers/validation-helpers.js",
6 "start": { 6 "start": {
7 "line": 4, 7 "line": 5,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 7, 11 "line": 8,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Email not valid", 17 "defaultMessage": "!!!Email not valid",
18 "file": "src/helpers/validation-helpers.js", 18 "file": "src/helpers/validation-helpers.js",
19 "start": { 19 "start": {
20 "line": 8, 20 "line": 9,
21 "column": 9 21 "column": 9
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 11, 24 "line": 12,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Not a valid URL", 30 "defaultMessage": "!!!Not a valid URL",
31 "file": "src/helpers/validation-helpers.js", 31 "file": "src/helpers/validation-helpers.js",
32 "start": { 32 "start": {
33 "line": 12, 33 "line": 13,
34 "column": 7 34 "column": 7
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 15, 37 "line": 16,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Too few characters", 43 "defaultMessage": "!!!Too few characters",
44 "file": "src/helpers/validation-helpers.js", 44 "file": "src/helpers/validation-helpers.js",
45 "start": { 45 "start": {
46 "line": 16, 46 "line": 17,
47 "column": 13 47 "column": 13
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 19, 50 "line": 20,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!At least one is required", 56 "defaultMessage": "!!!At least one is required",
57 "file": "src/helpers/validation-helpers.js", 57 "file": "src/helpers/validation-helpers.js",
58 "start": { 58 "start": {
59 "line": 20, 59 "line": 21,
60 "column": 15 60 "column": 15
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 23, 63 "line": 24,
64 "column": 3 64 "column": 3
65 } 65 }
66 } 66 }
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index 2adf5b787..daafb0900 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -507,15 +507,28 @@
507 } 507 }
508 }, 508 },
509 { 509 {
510 "id": "menu.app.checkForUpdates",
511 "defaultMessage": "!!!Check for updates",
512 "file": "src/lib/Menu.js",
513 "start": {
514 "line": 171,
515 "column": 19
516 },
517 "end": {
518 "line": 174,
519 "column": 3
520 }
521 },
522 {
510 "id": "menu.app.hide", 523 "id": "menu.app.hide",
511 "defaultMessage": "!!!Hide", 524 "defaultMessage": "!!!Hide",
512 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
513 "start": { 526 "start": {
514 "line": 171, 527 "line": 175,
515 "column": 8 528 "column": 8
516 }, 529 },
517 "end": { 530 "end": {
518 "line": 174, 531 "line": 178,
519 "column": 3 532 "column": 3
520 } 533 }
521 }, 534 },
@@ -524,11 +537,11 @@
524 "defaultMessage": "!!!Hide Others", 537 "defaultMessage": "!!!Hide Others",
525 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
526 "start": { 539 "start": {
527 "line": 175, 540 "line": 179,
528 "column": 14 541 "column": 14
529 }, 542 },
530 "end": { 543 "end": {
531 "line": 178, 544 "line": 182,
532 "column": 3 545 "column": 3
533 } 546 }
534 }, 547 },
@@ -537,11 +550,11 @@
537 "defaultMessage": "!!!Unhide", 550 "defaultMessage": "!!!Unhide",
538 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
539 "start": { 552 "start": {
540 "line": 179, 553 "line": 183,
541 "column": 10 554 "column": 10
542 }, 555 },
543 "end": { 556 "end": {
544 "line": 182, 557 "line": 186,
545 "column": 3 558 "column": 3
546 } 559 }
547 }, 560 },
@@ -550,11 +563,11 @@
550 "defaultMessage": "!!!Quit", 563 "defaultMessage": "!!!Quit",
551 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
552 "start": { 565 "start": {
553 "line": 183, 566 "line": 187,
554 "column": 8 567 "column": 8
555 }, 568 },
556 "end": { 569 "end": {
557 "line": 186, 570 "line": 190,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!Add New Service...", 576 "defaultMessage": "!!!Add New Service...",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 187, 579 "line": 191,
567 "column": 17 580 "column": 17
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 190, 583 "line": 194,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!Add New Workspace...", 589 "defaultMessage": "!!!Add New Workspace...",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 191, 592 "line": 195,
580 "column": 19 593 "column": 19
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 194, 596 "line": 198,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!Open workspace drawer", 602 "defaultMessage": "!!!Open workspace drawer",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 195, 605 "line": 199,
593 "column": 23 606 "column": 23
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 198, 609 "line": 202,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,11 @@
602 "defaultMessage": "!!!Close workspace drawer", 615 "defaultMessage": "!!!Close workspace drawer",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 199, 618 "line": 203,
606 "column": 24 619 "column": 24
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 202, 622 "line": 206,
610 "column": 3 623 "column": 3
611 } 624 }
612 }, 625 },
@@ -615,11 +628,11 @@
615 "defaultMessage": "!!!Activate next service...", 628 "defaultMessage": "!!!Activate next service...",
616 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
617 "start": { 630 "start": {
618 "line": 203, 631 "line": 207,
619 "column": 23 632 "column": 23
620 }, 633 },
621 "end": { 634 "end": {
622 "line": 206, 635 "line": 210,
623 "column": 3 636 "column": 3
624 } 637 }
625 }, 638 },
@@ -628,11 +641,11 @@
628 "defaultMessage": "!!!Activate previous service...", 641 "defaultMessage": "!!!Activate previous service...",
629 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
630 "start": { 643 "start": {
631 "line": 207, 644 "line": 211,
632 "column": 27 645 "column": 27
633 }, 646 },
634 "end": { 647 "end": {
635 "line": 210, 648 "line": 214,
636 "column": 3 649 "column": 3
637 } 650 }
638 }, 651 },
@@ -641,11 +654,11 @@
641 "defaultMessage": "!!!Disable notifications & audio", 654 "defaultMessage": "!!!Disable notifications & audio",
642 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
643 "start": { 656 "start": {
644 "line": 211, 657 "line": 215,
645 "column": 11 658 "column": 11
646 }, 659 },
647 "end": { 660 "end": {
648 "line": 214, 661 "line": 218,
649 "column": 3 662 "column": 3
650 } 663 }
651 }, 664 },
@@ -654,11 +667,11 @@
654 "defaultMessage": "!!!Enable notifications & audio", 667 "defaultMessage": "!!!Enable notifications & audio",
655 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
656 "start": { 669 "start": {
657 "line": 215, 670 "line": 219,
658 "column": 13 671 "column": 13
659 }, 672 },
660 "end": { 673 "end": {
661 "line": 218, 674 "line": 222,
662 "column": 3 675 "column": 3
663 } 676 }
664 }, 677 },
@@ -667,11 +680,11 @@
667 "defaultMessage": "!!!Workspaces", 680 "defaultMessage": "!!!Workspaces",
668 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
669 "start": { 682 "start": {
670 "line": 219, 683 "line": 223,
671 "column": 14 684 "column": 14
672 }, 685 },
673 "end": { 686 "end": {
674 "line": 222, 687 "line": 226,
675 "column": 3 688 "column": 3
676 } 689 }
677 }, 690 },
@@ -680,11 +693,11 @@
680 "defaultMessage": "!!!Default", 693 "defaultMessage": "!!!Default",
681 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
682 "start": { 695 "start": {
683 "line": 223, 696 "line": 227,
684 "column": 20 697 "column": 20
685 }, 698 },
686 "end": { 699 "end": {
687 "line": 226, 700 "line": 230,
688 "column": 3 701 "column": 3
689 } 702 }
690 } 703 }
diff --git a/src/index.html b/src/index.html
index 5ce7f6a96..bf15e2d4e 100644
--- a/src/index.html
+++ b/src/index.html
@@ -17,7 +17,7 @@
17 if (isDevMode) { 17 if (isDevMode) {
18 const debugging = require('debug'); 18 const debugging = require('debug');
19 debugging.enable(process.env.DEBUG); 19 debugging.enable(process.env.DEBUG);
20 20
21 const debug = debugging('Index'); 21 const debug = debugging('Index');
22 22
23 document.querySelector('body').classList.add('isDevMode'); 23 document.querySelector('body').classList.add('isDevMode');
@@ -36,7 +36,7 @@
36 window._onLiveReloadFileChanged = (file) => { 36 window._onLiveReloadFileChanged = (file) => {
37 if (!file.path.includes('/build/webview/') && !file.path.includes('/build/index.js') && !file.path.includes('/build/electron/')) { 37 if (!file.path.includes('/build/webview/') && !file.path.includes('/build/index.js') && !file.path.includes('/build/electron/')) {
38 originalReloadBehaviour(file); 38 originalReloadBehaviour(file);
39 } else { 39 } else {
40 if (file.path.includes('/build/webview/')) { 40 if (file.path.includes('/build/webview/')) {
41 debug('Livereload: Reloading all webvies'); 41 debug('Livereload: Reloading all webvies');
42 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload()); 42 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload());
diff --git a/src/index.js b/src/index.js
index 3fe996aa7..55592c328 100644
--- a/src/index.js
+++ b/src/index.js
@@ -180,6 +180,7 @@ const createWindow = () => {
180 backgroundColor: !settings.get('darkMode') ? '#3498db' : '#1E1E1E', 180 backgroundColor: !settings.get('darkMode') ? '#3498db' : '#1E1E1E',
181 webPreferences: { 181 webPreferences: {
182 nodeIntegration: true, 182 nodeIntegration: true,
183 webviewTag: true,
183 }, 184 },
184 }); 185 });
185 186
@@ -353,18 +354,26 @@ app.on('ready', () => {
353// TODO: rewrite to handle multiple login calls 354// TODO: rewrite to handle multiple login calls
354const noop = () => null; 355const noop = () => null;
355let authCallback = noop; 356let authCallback = noop;
357
356app.on('login', (event, webContents, request, authInfo, callback) => { 358app.on('login', (event, webContents, request, authInfo, callback) => {
357 authCallback = callback; 359 authCallback = callback;
358 debug('browser login event', authInfo); 360 debug('browser login event', authInfo);
359 event.preventDefault(); 361 event.preventDefault();
362
360 if (authInfo.isProxy && authInfo.scheme === 'basic') { 363 if (authInfo.isProxy && authInfo.scheme === 'basic') {
364 debug('Sending service echo ping');
361 webContents.send('get-service-id'); 365 webContents.send('get-service-id');
362 366
363 ipcMain.once('service-id', (e, id) => { 367 ipcMain.once('service-id', (e, id) => {
364 debug('Received service id', id); 368 debug('Received service id', id);
365 369
366 const ps = proxySettings.get(id); 370 const ps = proxySettings.get(id);
367 callback(ps.user, ps.password); 371 if (ps) {
372 debug('Sending proxy auth callback for service', id);
373 callback(ps.user, ps.password);
374 } else {
375 debug('No proxy auth config found for', id);
376 }
368 }); 377 });
369 } else if (authInfo.scheme === 'basic') { 378 } else if (authInfo.scheme === 'basic') {
370 debug('basic auth handler', authInfo); 379 debug('basic auth handler', authInfo);
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index da2540274..e0dfd736e 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -168,6 +168,10 @@ const menuItems = defineMessages({
168 id: 'menu.app.settings', 168 id: 'menu.app.settings',
169 defaultMessage: '!!!Settings', 169 defaultMessage: '!!!Settings',
170 }, 170 },
171 checkForUpdates: {
172 id: 'menu.app.checkForUpdates',
173 defaultMessage: '!!!Check for updates',
174 },
171 hide: { 175 hide: {
172 id: 'menu.app.hide', 176 id: 'menu.app.hide',
173 defaultMessage: '!!!Hide', 177 defaultMessage: '!!!Hide',
@@ -500,6 +504,11 @@ const _titleBarTemplateFactory = intl => [
500 submenu: [], 504 submenu: [],
501 }, 505 },
502 { 506 {
507 label: intl.formatMessage(menuItems.workspaces),
508 submenu: [],
509 visible: workspaceStore.isFeatureEnabled,
510 },
511 {
503 label: intl.formatMessage(menuItems.window), 512 label: intl.formatMessage(menuItems.window),
504 submenu: [ 513 submenu: [
505 { 514 {
@@ -638,6 +647,12 @@ export default class FranzMenu {
638 enabled: this.stores.user.isLoggedIn, 647 enabled: this.stores.user.isLoggedIn,
639 }, 648 },
640 { 649 {
650 label: intl.formatMessage(menuItems.checkForUpdates),
651 click: () => {
652 this.actions.app.checkForUpdates();
653 },
654 },
655 {
641 type: 'separator', 656 type: 'separator',
642 }, 657 },
643 { 658 {
diff --git a/src/models/Service.js b/src/models/Service.js
index 8a2a8d3d8..88bce3360 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -116,6 +116,7 @@ export default class Service {
116 116
117 @computed get shareWithWebview() { 117 @computed get shareWithWebview() {
118 return { 118 return {
119 id: this.id,
119 spellcheckerLanguage: this.spellcheckerLanguage, 120 spellcheckerLanguage: this.spellcheckerLanguage,
120 isDarkModeEnabled: this.isDarkModeEnabled, 121 isDarkModeEnabled: this.isDarkModeEnabled,
121 }; 122 };
@@ -183,7 +184,9 @@ export default class Service {
183 options, 184 options,
184 })); 185 }));
185 186
186 this.webview.addEventListener('did-start-loading', () => { 187 this.webview.addEventListener('did-start-loading', (event) => {
188 debug('Did start load', this.name, event);
189
187 this.hasCrashed = false; 190 this.hasCrashed = false;
188 this.isLoading = true; 191 this.isLoading = true;
189 this.isError = false; 192 this.isError = false;
diff --git a/src/stores/GlobalErrorStore.js b/src/stores/GlobalErrorStore.js
index 90bf751c3..7a85c2daa 100644
--- a/src/stores/GlobalErrorStore.js
+++ b/src/stores/GlobalErrorStore.js
@@ -18,8 +18,11 @@ export default class GlobalErrorStore extends Store {
18 this.error = request.error; 18 this.error = request.error;
19 19
20 if (request.error.json) { 20 if (request.error.json) {
21 this.response = await request.error.json(); 21 try {
22 22 this.response = await request.error.json();
23 } catch (error) {
24 this.response = {};
25 }
23 if (this.error.status === 401) { 26 if (this.error.status === 401) {
24 this.actions.user.logout({ serverLogout: true }); 27 this.actions.user.logout({ serverLogout: true });
25 } 28 }
diff --git a/src/stores/NewsStore.js b/src/stores/NewsStore.js
index 6984425df..86e092592 100644
--- a/src/stores/NewsStore.js
+++ b/src/stores/NewsStore.js
@@ -16,6 +16,7 @@ export default class NewsStore extends Store {
16 16
17 // Register action handlers 17 // Register action handlers
18 this.actions.news.hide.listen(this._hide.bind(this)); 18 this.actions.news.hide.listen(this._hide.bind(this));
19 this.actions.user.logout.listen(this._resetNewsRequest.bind(this));
19 } 20 }
20 21
21 setup() { 22 setup() {
@@ -40,4 +41,15 @@ export default class NewsStore extends Store {
40 remove(result, n => n.id === newsId); 41 remove(result, n => n.id === newsId);
41 }); 42 });
42 } 43 }
44
45 /**
46 * Reset the news request when current user logs out so that when another user
47 * logs in again without an app restart, the request will be fetched again and
48 * the news will be shown to the user.
49 *
50 * @private
51 */
52 _resetNewsRequest() {
53 this.latestNewsRequest.reset();
54 }
43} 55}
diff --git a/src/stores/RecipesStore.js b/src/stores/RecipesStore.js
index ab64bf79c..d51192078 100644
--- a/src/stores/RecipesStore.js
+++ b/src/stores/RecipesStore.js
@@ -20,6 +20,11 @@ export default class RecipesStore extends Store {
20 // Register action handlers 20 // Register action handlers
21 this.actions.recipe.install.listen(this._install.bind(this)); 21 this.actions.recipe.install.listen(this._install.bind(this));
22 this.actions.recipe.update.listen(this._update.bind(this)); 22 this.actions.recipe.update.listen(this._update.bind(this));
23
24 // Reactions
25 this.registerReactions([
26 this._checkIfRecipeIsInstalled.bind(this),
27 ]);
23 } 28 }
24 29
25 setup() { 30 setup() {
@@ -99,4 +104,26 @@ export default class RecipesStore extends Store {
99 syncUpdate(0); 104 syncUpdate(0);
100 } 105 }
101 } 106 }
107
108 async _checkIfRecipeIsInstalled() {
109 const { router } = this.stores;
110
111 const match = matchRoute('/settings/services/add/:id', router.location.pathname);
112 if (match) {
113 const recipeId = match.id;
114
115 if (!this.stores.recipes.isInstalled(recipeId)) {
116 router.push('/settings/recipes');
117 debug(`Recipe ${recipeId} is not installed, trying to install it`);
118
119 const recipe = await this.installRecipeRequest.execute(recipeId)._promise;
120 if (recipe) {
121 await this.allRecipesRequest.invalidate({ immediately: true })._promise;
122 router.push(`/settings/services/add/${recipeId}`);
123 } else {
124 router.push('/settings/recipes');
125 }
126 }
127 }
128 }
102} 129}
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 349de2c9b..ee47bf6db 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -149,18 +149,7 @@ export default class ServicesStore extends Store {
149 } 149 }
150 150
151 async _showAddServiceInterface({ recipeId }) { 151 async _showAddServiceInterface({ recipeId }) {
152 const recipesStore = this.stores.recipes; 152 this.stores.router.push(`/settings/services/add/${recipeId}`);
153
154 if (recipesStore.isInstalled(recipeId)) {
155 debug(`Recipe ${recipeId} is installed`);
156 this._redirectToAddServiceRoute(recipeId);
157 } else {
158 debug(`Recipe ${recipeId} is not installed`);
159 // We access the RecipeStore action directly
160 // returns Promise instead of action
161 await this.stores.recipes._install({ recipeId });
162 this._redirectToAddServiceRoute(recipeId);
163 }
164 } 153 }
165 154
166 // Actions 155 // Actions
@@ -294,7 +283,8 @@ export default class ServicesStore extends Store {
294 gaEvent('Service', 'clear cache'); 283 gaEvent('Service', 'clear cache');
295 } 284 }
296 285
297 @action _setActive({ serviceId }) { 286 @action _setActive({ serviceId, keepActiveRoute }) {
287 if (!keepActiveRoute) this.stores.router.push('/');
298 const service = this.one(serviceId); 288 const service = this.one(serviceId);
299 289
300 this.all.forEach((s, index) => { 290 this.all.forEach((s, index) => {
@@ -520,7 +510,16 @@ export default class ServicesStore extends Store {
520 this.actions.ui.toggleServiceUpdatedInfoBar({ visible: false }); 510 this.actions.ui.toggleServiceUpdatedInfoBar({ visible: false });
521 } 511 }
522 512
523 @action _reorder({ oldIndex, newIndex }) { 513 @action _reorder(params) {
514 const { workspaces } = this.stores;
515 if (workspaces.isAnyWorkspaceActive) {
516 workspaces.reorderServicesOfActiveWorkspace(params);
517 } else {
518 this._reorderService(params);
519 }
520 }
521
522 @action _reorderService({ oldIndex, newIndex }) {
524 const showDisabledServices = this.stores.settings.all.app.showDisabledServices; 523 const showDisabledServices = this.stores.settings.all.app.showDisabledServices;
525 const oldEnabledSortIndex = showDisabledServices ? oldIndex : this.all.indexOf(this.enabled[oldIndex]); 524 const oldEnabledSortIndex = showDisabledServices ? oldIndex : this.all.indexOf(this.enabled[oldIndex]);
526 const newEnabledSortIndex = showDisabledServices ? newIndex : this.all.indexOf(this.enabled[newIndex]); 525 const newEnabledSortIndex = showDisabledServices ? newIndex : this.all.indexOf(this.enabled[newIndex]);
@@ -683,11 +682,6 @@ export default class ServicesStore extends Store {
683 } 682 }
684 683
685 // Helper 684 // Helper
686 _redirectToAddServiceRoute(recipeId) {
687 const route = `/settings/services/add/${recipeId}`;
688 this.stores.router.push(route);
689 }
690
691 _initializeServiceRecipeInWebview(serviceId) { 685 _initializeServiceRecipeInWebview(serviceId) {
692 const service = this.one(serviceId); 686 const service = this.one(serviceId);
693 687
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 31555dd5c..b5423af3b 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -329,8 +329,7 @@ export default class UserStore extends Store {
329 authToken, 329 authToken,
330 }); 330 });
331 } catch (err) { 331 } catch (err) {
332 console.error('AccessToken Invalid'); 332 this._logout();
333
334 return false; 333 return false;
335 } 334 }
336 } 335 }
diff --git a/src/webview/contextMenu.js b/src/webview/contextMenu.js
index a4a6ab899..967e8e667 100644
--- a/src/webview/contextMenu.js
+++ b/src/webview/contextMenu.js
@@ -280,12 +280,13 @@ const buildMenuTpl = (props, suggestions, isSpellcheckEnabled, defaultSpellcheck
280}; 280};
281 281
282export default function contextMenu(spellcheckProvider, isSpellcheckEnabled, getDefaultSpellcheckerLanguage, getSpellcheckerLanguage) { 282export default function contextMenu(spellcheckProvider, isSpellcheckEnabled, getDefaultSpellcheckerLanguage, getSpellcheckerLanguage) {
283 webContents.on('context-menu', (e, props) => { 283 webContents.on('context-menu', async (e, props) => {
284 e.preventDefault(); 284 e.preventDefault();
285 285
286 let suggestions = []; 286 let suggestions = [];
287 if (spellcheckProvider && props.misspelledWord) { 287 if (spellcheckProvider && props.misspelledWord) {
288 suggestions = spellcheckProvider.getSuggestion(props.misspelledWord); 288 debug('Mispelled word', props.misspelledWord);
289 suggestions = await spellcheckProvider.getSuggestion(props.misspelledWord);
289 290
290 debug('Suggestions', suggestions); 291 debug('Suggestions', suggestions);
291 } 292 }
diff --git a/src/webview/recipe.js b/src/webview/recipe.js
index 1e5d74b1f..c223b73de 100644
--- a/src/webview/recipe.js
+++ b/src/webview/recipe.js
@@ -127,6 +127,7 @@ class RecipeController {
127 } 127 }
128 128
129 serviceIdEcho(event) { 129 serviceIdEcho(event) {
130 debug('Received a service echo ping');
130 event.sender.send('service-id', this.settings.service.id); 131 event.sender.send('service-id', this.settings.service.id);
131 } 132 }
132 133
@@ -137,8 +138,6 @@ class RecipeController {
137 window.addEventListener('keyup', debounce((e) => { 138 window.addEventListener('keyup', debounce((e) => {
138 const element = e.target; 139 const element = e.target;
139 140
140 console.log(element);
141
142 if (!element) return; 141 if (!element) return;
143 142
144 let value = ''; 143 let value = '';
diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js
index 9158b3b94..417d1ea1a 100644
--- a/src/webview/spellchecker.js
+++ b/src/webview/spellchecker.js
@@ -1,6 +1,8 @@
1import { webFrame } from 'electron'; 1import { webFrame } from 'electron';
2import { SpellCheckerProvider } from 'electron-hunspell'; 2import { attachSpellCheckProvider, SpellCheckerProvider } from 'electron-hunspell';
3import { ENVIRONMENT } from 'hunspell-asm';
3import path from 'path'; 4import path from 'path';
5import { readFileSync } from 'fs';
4 6
5import { DICTIONARY_PATH } from '../config'; 7import { DICTIONARY_PATH } from '../config';
6import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 8import { SPELLCHECKER_LOCALES } from '../i18n/languages';
@@ -10,11 +12,12 @@ const debug = require('debug')('Franz:spellchecker');
10let provider; 12let provider;
11let currentDict; 13let currentDict;
12let _isEnabled = false; 14let _isEnabled = false;
15let attached;
13 16
14async function loadDictionary(locale) { 17async function loadDictionary(locale) {
15 try { 18 try {
16 const fileLocation = path.join(DICTIONARY_PATH, `hunspell-dict-${locale}/${locale}`); 19 const fileLocation = path.join(DICTIONARY_PATH, `hunspell-dict-${locale}/${locale}`);
17 await provider.loadDictionary(locale, `${fileLocation}.dic`, `${fileLocation}.aff`); 20 await provider.loadDictionary(locale, readFileSync(`${fileLocation}.dic`), readFileSync(`${fileLocation}.aff`));
18 debug('Loaded dictionary', locale, 'from', fileLocation); 21 debug('Loaded dictionary', locale, 'from', fileLocation);
19 } catch (err) { 22 } catch (err) {
20 console.error('Could not load dictionary', err); 23 console.error('Could not load dictionary', err);
@@ -41,7 +44,7 @@ export async function switchDict(locale) {
41 provider.unloadDictionary(locale); 44 provider.unloadDictionary(locale);
42 } 45 }
43 loadDictionary(locale); 46 loadDictionary(locale);
44 provider.switchDictionary(locale); 47 attached.switchLanguage(locale);
45 48
46 debug('Switched dictionary to', locale); 49 debug('Switched dictionary to', locale);
47 50
@@ -58,12 +61,14 @@ export default async function initialize(languageCode = 'en-us') {
58 const locale = languageCode.toLowerCase(); 61 const locale = languageCode.toLowerCase();
59 62
60 debug('Init spellchecker'); 63 debug('Init spellchecker');
61 await provider.initialize(); 64 await provider.initialize({ environment: ENVIRONMENT.NODE });
62 // await loadDictionaries(); 65
66 debug('Attaching spellcheck provider');
67 attached = await attachSpellCheckProvider(provider);
63 68
64 debug('Available spellchecker dictionaries', provider.availableDictionaries); 69 debug('Available spellchecker dictionaries', provider.availableDictionaries);
65 70
66 switchDict(locale); 71 attached.switchLanguage(locale);
67 72
68 return provider; 73 return provider;
69 } catch (err) { 74 } catch (err) {
diff --git a/uidev/src/app.tsx b/uidev/src/app.tsx
index 870911c2f..cef22e7a7 100644
--- a/uidev/src/app.tsx
+++ b/uidev/src/app.tsx
@@ -2,7 +2,7 @@ import CSS from 'csstype';
2import { Classes } from 'jss'; 2import { Classes } from 'jss';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import DevTools from 'mobx-react-devtools'; 4import DevTools from 'mobx-react-devtools';
5import React, { Component } from 'react'; 5import React from 'react';
6import injectSheet from 'react-jss'; 6import injectSheet from 'react-jss';
7 7
8import { WithTheme } from './withTheme'; 8import { WithTheme } from './withTheme';
diff --git a/uidev/src/stories/button.stories.tsx b/uidev/src/stories/button.stories.tsx
index c8e9bcbf3..f7537895c 100644
--- a/uidev/src/stories/button.stories.tsx
+++ b/uidev/src/stories/button.stories.tsx
@@ -1,8 +1,11 @@
1import { observable } from 'mobx'; 1import { observable } from 'mobx';
2import { observer } from 'mobx-react'; 2import { observer } from 'mobx-react';
3import React from 'react'; 3import React from 'react';
4import injectSheet from 'react-jss';
4 5
5import { Button } from '@meetfranz/forms'; 6import { Button, Input } from '@meetfranz/forms';
7import { classes } from 'istanbul-lib-coverage';
8import { Classes } from 'jss';
6import { storiesOf } from '../stores/stories'; 9import { storiesOf } from '../stores/stories';
7 10
8const defaultProps = { 11const defaultProps = {
@@ -13,6 +16,17 @@ const defaultProps = {
13 disabled: false, 16 disabled: false,
14}; 17};
15 18
19const styles = {
20 combinedElements: {
21 display: 'flex',
22 justifyContent: 'space-between',
23 },
24 input: {
25 flex: 1,
26 marginRight: 20,
27 },
28};
29
16const createStore = (args?: any) => { 30const createStore = (args?: any) => {
17 return observable(Object.assign({}, defaultProps, args)); 31 return observable(Object.assign({}, defaultProps, args));
18}; 32};
@@ -99,4 +113,26 @@ storiesOf('Button')
99 e.preventDefault(); 113 e.preventDefault();
100 alert('Click event'); 114 alert('Click event');
101 }, 115 },
102 })} />)); 116 })}/>
117 ))
118 .add('Long multi-line button', () => (
119 <WithStoreButton store={createStore({
120 label: 'But there is something that I must say to my people, who stand on the warm threshold which leads into the palace of justice: In the process of gaining our rightful place, we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred. We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again, we must rise to the majestic heights of meeting physical force with soul force.',
121 })} />
122 ))
123 .add('Button with Input', injectSheet(styles)(observer(({ classes }: { classes: Classes }) => (
124 <div className={classes.combinedElements}>
125 <Input showLabel={false} className={classes.input} noMargin />
126 <WithStoreButton store={createStore({})} />
127 </div>
128 )),
129 ))
130 .add('Icon Button with Input', injectSheet(styles)(observer(({ classes }: { classes: Classes }) => (
131 <div className={classes.combinedElements}>
132 <Input showLabel={false} className={classes.input} noMargin />
133 <WithStoreButton store={createStore({
134 icon: 'mdiInformation',
135 })} />
136 </div>
137 )),
138 ));