aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar vantezzen <properly@protonmail.com>2019-09-07 15:50:23 +0200
committerLibravatar vantezzen <properly@protonmail.com>2019-09-07 15:50:23 +0200
commite7a74514c1e7c3833dfdcf5900cb87f9e6e8354e (patch)
treeb8314e4155503b135dcb07e8b4a0e847e25c19cf
parentUpdate CHANGELOG.md (diff)
parentUpdate CHANGELOG.md (diff)
downloadferdium-app-e7a74514c1e7c3833dfdcf5900cb87f9e6e8354e.tar.gz
ferdium-app-e7a74514c1e7c3833dfdcf5900cb87f9e6e8354e.tar.zst
ferdium-app-e7a74514c1e7c3833dfdcf5900cb87f9e6e8354e.zip
Merge branch 'master' of https://github.com/meetfranz/franz into franz-5.3.0
-rw-r--r--.eslintrc5
-rw-r--r--CHANGELOG.md22
-rw-r--r--package-lock.json27
-rw-r--r--package.json2
-rw-r--r--packages/forms/package.json4
-rw-r--r--packages/forms/src/button/index.tsx12
-rw-r--r--packages/theme/src/themes/dark/index.ts27
-rw-r--r--packages/theme/src/themes/default/index.ts30
-rw-r--r--packages/ui/package.json4
-rw-r--r--packages/ui/src/badge/ProBadge.tsx8
-rw-r--r--packages/ui/src/icon/index.tsx12
-rw-r--r--packages/ui/src/infobox/index.tsx5
-rw-r--r--src/actions/index.js2
-rw-r--r--src/actions/user.js3
-rw-r--r--src/api/UserApi.js4
-rw-r--r--src/api/server/ServerApi.js16
-rw-r--r--src/components/TrialActivationInfoBar.js94
-rw-r--r--src/components/auth/Pricing.js248
-rw-r--r--src/components/auth/Signup.js31
-rw-r--r--src/components/layout/AppLayout.js54
-rw-r--r--src/components/services/content/ServiceRestricted.js78
-rw-r--r--src/components/services/content/ServiceView.js25
-rw-r--r--src/components/services/content/Services.js48
-rw-r--r--src/components/settings/account/AccountDashboard.js208
-rw-r--r--src/components/settings/navigation/SettingsNavigation.js8
-rw-r--r--src/components/settings/recipes/RecipeItem.js2
-rw-r--r--src/components/settings/recipes/RecipesDashboard.js194
-rw-r--r--src/components/settings/services/EditServiceForm.js17
-rw-r--r--src/components/settings/services/ServicesDashboard.js2
-rw-r--r--src/components/settings/settings/EditSettingsForm.js11
-rw-r--r--src/components/settings/team/TeamDashboard.js73
-rw-r--r--src/components/subscription/SubscriptionForm.js226
-rw-r--r--src/components/subscription/SubscriptionPopup.js4
-rw-r--r--src/components/subscription/TrialForm.js115
-rw-r--r--src/components/ui/ActivateTrialButton/index.js125
-rw-r--r--src/components/ui/FeatureItem.js37
-rw-r--r--src/components/ui/FeatureList.js89
-rw-r--r--src/components/ui/Modal/index.js3
-rw-r--r--src/components/ui/PremiumFeatureContainer/index.js22
-rw-r--r--src/components/ui/UpgradeButton/index.js89
-rw-r--r--src/config.js36
-rw-r--r--src/containers/auth/PricingScreen.js40
-rw-r--r--src/containers/layout/AppLayoutContainer.js6
-rw-r--r--src/containers/settings/AccountScreen.js5
-rw-r--r--src/containers/settings/EditServiceScreen.js4
-rw-r--r--src/containers/settings/EditSettingsScreen.js47
-rw-r--r--src/containers/settings/RecipesScreen.js40
-rw-r--r--src/containers/settings/TeamScreen.js2
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js99
-rw-r--r--src/containers/subscription/SubscriptionPopupScreen.js3
-rw-r--r--src/environment.js10
-rw-r--r--src/features/announcements/store.js5
-rw-r--r--src/features/basicAuth/Component.js1
-rw-r--r--src/features/communityRecipes/index.js28
-rw-r--r--src/features/communityRecipes/store.js31
-rw-r--r--src/features/delayApp/Component.js41
-rw-r--r--src/features/delayApp/index.js10
-rw-r--r--src/features/serviceLimit/components/LimitReachedInfobox.js79
-rw-r--r--src/features/serviceLimit/index.js33
-rw-r--r--src/features/serviceLimit/store.js41
-rw-r--r--src/features/serviceProxy/index.js8
-rw-r--r--src/features/shareFranz/Component.js13
-rw-r--r--src/features/spellchecker/index.js8
-rw-r--r--src/features/todos/actions.js23
-rw-r--r--src/features/todos/components/TodosWebview.js300
-rw-r--r--src/features/todos/constants.js4
-rw-r--r--src/features/todos/containers/TodosScreen.js41
-rw-r--r--src/features/todos/index.js39
-rw-r--r--src/features/todos/preload.js23
-rw-r--r--src/features/todos/store.js213
-rw-r--r--src/features/workspaces/components/WorkspaceDrawer.js7
-rw-r--r--src/features/workspaces/components/WorkspaceSwitchingIndicator.js8
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js173
-rw-r--r--src/features/workspaces/containers/WorkspacesScreen.js2
-rw-r--r--src/features/workspaces/store.js9
-rw-r--r--src/helpers/plan-helpers.js45
-rw-r--r--src/i18n/globalMessages.js4
-rw-r--r--src/i18n/locales/ca.json94
-rw-r--r--src/i18n/locales/cs.json100
-rw-r--r--src/i18n/locales/de.json96
-rw-r--r--src/i18n/locales/defaultMessages.json1766
-rw-r--r--src/i18n/locales/el.json94
-rw-r--r--src/i18n/locales/en-US.json95
-rw-r--r--src/i18n/locales/es.json96
-rw-r--r--src/i18n/locales/fr.json104
-rw-r--r--src/i18n/locales/ga.json98
-rw-r--r--src/i18n/locales/hr.json102
-rw-r--r--src/i18n/locales/hu.json94
-rw-r--r--src/i18n/locales/id.json110
-rw-r--r--src/i18n/locales/it.json94
-rw-r--r--src/i18n/locales/ja.json88
-rw-r--r--src/i18n/locales/ka.json108
-rw-r--r--src/i18n/locales/nl-BE.json98
-rw-r--r--src/i18n/locales/nl.json210
-rw-r--r--src/i18n/locales/pl.json92
-rw-r--r--src/i18n/locales/pt-BR.json94
-rw-r--r--src/i18n/locales/pt.json104
-rw-r--r--src/i18n/locales/ru.json94
-rw-r--r--src/i18n/locales/sk.json152
-rw-r--r--src/i18n/locales/sr.json106
-rw-r--r--src/i18n/locales/tr.json112
-rw-r--r--src/i18n/locales/uk.json110
-rw-r--r--src/i18n/locales/zh-TW.json184
-rw-r--r--src/i18n/messages/src/components/TrialActivationInfoBar.json15
-rw-r--r--src/i18n/messages/src/components/auth/Pricing.json101
-rw-r--r--src/i18n/messages/src/components/auth/Signup.json57
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json8
-rw-r--r--src/i18n/messages/src/components/services/content/ServiceRestricted.json67
-rw-r--r--src/i18n/messages/src/components/services/content/Services.json8
-rw-r--r--src/i18n/messages/src/components/settings/account/AccountDashboard.json124
-rw-r--r--src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json32
-rw-r--r--src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json116
-rw-r--r--src/i18n/messages/src/components/settings/services/EditServiceForm.json88
-rw-r--r--src/i18n/messages/src/components/settings/services/ServicesDashboard.json36
-rw-r--r--src/i18n/messages/src/components/settings/team/TeamDashboard.json24
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionForm.json164
-rw-r--r--src/i18n/messages/src/components/subscription/TrialForm.json93
-rw-r--r--src/i18n/messages/src/components/ui/ActivateTrialButton/index.json93
-rw-r--r--src/i18n/messages/src/components/ui/FeatureList.json132
-rw-r--r--src/i18n/messages/src/components/ui/UpgradeButton/index.json15
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json39
-rw-r--r--src/i18n/messages/src/features/delayApp/Component.json42
-rw-r--r--src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json15
-rw-r--r--src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json28
-rw-r--r--src/i18n/messages/src/features/shareFranz/Component.json28
-rw-r--r--src/i18n/messages/src/features/todos/components/TodosWebview.json41
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json32
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json32
-rw-r--r--src/i18n/messages/src/helpers/plan-helpers.json54
-rw-r--r--src/i18n/messages/src/helpers/pricing-helpers.json80
-rw-r--r--src/i18n/messages/src/i18n/globalMessages.json13
-rw-r--r--src/i18n/messages/src/lib/Menu.json280
-rw-r--r--src/index.html11
-rw-r--r--src/index.js29
-rw-r--r--src/lib/Menu.js64
-rw-r--r--src/models/Service.js15
-rw-r--r--src/models/User.js14
-rw-r--r--src/stores/AppStore.js13
-rw-r--r--src/stores/FeaturesStore.js6
-rw-r--r--src/stores/ServicesStore.js42
-rw-r--r--src/stores/UserStore.js68
-rw-r--r--src/stores/index.js6
-rw-r--r--src/styles/auth.scss2
-rw-r--r--src/styles/layout.scss16
-rw-r--r--src/styles/recipes.scss3
-rw-r--r--src/styles/reset.scss1
-rw-r--r--src/styles/settings.scss72
-rw-r--r--src/webview/contextMenu.js17
-rw-r--r--uidev/src/stories/button.stories.tsx6
-rw-r--r--uidev/src/stories/icon.stories.tsx47
-rw-r--r--uidev/src/stories/infobox.stories.tsx17
151 files changed, 7775 insertions, 2493 deletions
diff --git a/.eslintrc b/.eslintrc
index c85bee1fa..6253c0837 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -17,7 +17,7 @@
17 "extensions": [".js", ".jsx"] 17 "extensions": [".js", ".jsx"]
18 }], 18 }],
19 "react/forbid-prop-types": 0, 19 "react/forbid-prop-types": 0,
20 "react/destructuring-assignment": 1, 20 "react/destructuring-assignment": 0,
21 "prefer-destructuring": 1, 21 "prefer-destructuring": 1,
22 "no-underscore-dangle": 0, 22 "no-underscore-dangle": 0,
23 "max-len": 0, 23 "max-len": 0,
@@ -55,7 +55,8 @@
55 "atob": true, 55 "atob": true,
56 "btoa": true, 56 "btoa": true,
57 "ga": true, 57 "ga": true,
58 "mocha": true 58 "mocha": true,
59 "Element": true
59 }, 60 },
60 "env": { 61 "env": {
61 "jest/globals": true 62 "jest/globals": true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d96cb3d1..72794b646 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,16 +12,32 @@
12 12
13## [5.2.1-beta.1](https://github.com/meetfranz/franz/compare/v5.2.0...v5.2.1-beta.1) (2019-07-30) 13## [5.2.1-beta.1](https://github.com/meetfranz/franz/compare/v5.2.0...v5.2.1-beta.1) (2019-07-30)
14 14
15### Features
15 16
16### Bug Fixes 17* **App:** Add second confirmation step for the free 14 day trial.
17 18* **Todos:** Add option to disable todos ([5d03b91](https://github.com/meetfranz/franz/commit/5d03b91))
18* **Notifications:** Fix issue that blocked notifications from e.g. Slack ([44c413b](https://github.com/meetfranz/franz/commit/44c413b))
19 19
20# [5.3.0](https://github.com/meetfranz/franz/compare/v5.2.1-beta.1...v5.3.0) (2019-09-06)
20 21
21### Features 22### Features
22 23
24* **Todos:** 🥳🥳🥳 Manage your daily tasks with **Franz Todos** 🥳🥳🥳
23* **App:** Add option to copy debug information via the help menu ([4666e85](https://github.com/meetfranz/franz/commit/4666e85)) 25* **App:** Add option to copy debug information via the help menu ([4666e85](https://github.com/meetfranz/franz/commit/4666e85))
26* **App:** Updated Pricing, more infos can be found on ([meetfranz.com/pricing](https://meetfranz.com/pricing))
27* **App:** Improved Settings UX
28* **3rd Party Services:** Added option to open custom recipes folder
29
30
31### Bug Fixes
32
33* **Windows:** Fix app size in fullscreen ([e210701](https://github.com/meetfranz/franz/commit/e210701))
34* **Windows:** Fix app to be cropped at the bottom on Windows ([42f97b4](https://github.com/meetfranz/franz/commit/42f97b4))
35* **Notifications:** Fix issue that blocked notifications from e.g. Slack ([44c413b](https://github.com/meetfranz/franz/commit/44c413b))
36* **App:** A ton of various bugfixes and improvements
24 37
38### General
39
40* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
25 41
26 42
27# [5.2.0](https://github.com/meetfranz/franz/compare/v5.2.0-beta.4...v5.2.0) (2019-07-19) 43# [5.2.0](https://github.com/meetfranz/franz/compare/v5.2.0-beta.4...v5.2.0) (2019-07-19)
diff --git a/package-lock.json b/package-lock.json
index 169929d2f..4ce2893a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2149,9 +2149,9 @@
2149 } 2149 }
2150 }, 2150 },
2151 "@mdi/js": { 2151 "@mdi/js": {
2152 "version": "3.4.93", 2152 "version": "4.2.95",
2153 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.4.93.tgz", 2153 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-4.2.95.tgz",
2154 "integrity": "sha512-SEzolEqT8ErlWdHz4AAtQ1lTfAnM6j67Ppm6k5s/I1aIuuoFP/D8d/z838C28xHO1KOqrsS1fw2wlf6fRiEEJA==" 2154 "integrity": "sha512-3qqOZx2HkrQEUc9fr5MiQWlokwmO8TK5bQZ2EP1Rg0q2Q507jy+fUeL8lb9ko2ossYqoPnugIr7jI0/O7uhlrA=="
2155 }, 2155 },
2156 "@mdi/react": { 2156 "@mdi/react": {
2157 "version": "1.1.0", 2157 "version": "1.1.0",
@@ -2178,6 +2178,10 @@
2178 "react-loader": "^2.4.5" 2178 "react-loader": "^2.4.5"
2179 }, 2179 },
2180 "dependencies": { 2180 "dependencies": {
2181 "@mdi/js": {
2182 "version": "3.9.97",
2183 "bundled": true
2184 },
2181 "@meetfranz/theme": { 2185 "@meetfranz/theme": {
2182 "version": "1.0.14", 2186 "version": "1.0.14",
2183 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz", 2187 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
@@ -2203,6 +2207,10 @@
2203 "react-loader": "^2.4.5" 2207 "react-loader": "^2.4.5"
2204 }, 2208 },
2205 "dependencies": { 2209 "dependencies": {
2210 "@mdi/js": {
2211 "version": "3.9.97",
2212 "bundled": true
2213 },
2206 "@meetfranz/theme": { 2214 "@meetfranz/theme": {
2207 "version": "1.0.14", 2215 "version": "1.0.14",
2208 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz", 2216 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
@@ -16886,6 +16894,14 @@
16886 "react-transition-group": "^1.2.0" 16894 "react-transition-group": "^1.2.0"
16887 } 16895 }
16888 }, 16896 },
16897 "react-confetti": {
16898 "version": "3.1.0",
16899 "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-3.1.0.tgz",
16900 "integrity": "sha512-T1DKt09C9rrf2BJ0OxFu8saPohFalOJfOgci11/ePz6DxbY+0cd/3CMimxj/ZITl7jQWnmC/bNWBgGheke3WZQ==",
16901 "requires": {
16902 "tween-functions": "^1.2.0"
16903 }
16904 },
16889 "react-dom": { 16905 "react-dom": {
16890 "version": "16.6.3", 16906 "version": "16.6.3",
16891 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.3.tgz", 16907 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.3.tgz",
@@ -20037,6 +20053,11 @@
20037 "safe-buffer": "^5.0.1" 20053 "safe-buffer": "^5.0.1"
20038 } 20054 }
20039 }, 20055 },
20056 "tween-functions": {
20057 "version": "1.2.0",
20058 "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz",
20059 "integrity": "sha1-GuOlDnxguz3vd06scHrLynO7w/8="
20060 },
20040 "tweetnacl": { 20061 "tweetnacl": {
20041 "version": "0.14.5", 20062 "version": "0.14.5",
20042 "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 20063 "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
diff --git a/package.json b/package.json
index 80235e1db..36580a0f7 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
37 "dependencies": { 37 "dependencies": {
38 "@babel/polyfill": "7.4.4", 38 "@babel/polyfill": "7.4.4",
39 "@babel/runtime": "7.4.5", 39 "@babel/runtime": "7.4.5",
40 "@mdi/js": "4.2.95",
40 "@meetfranz/electron-notification-state": "1.0.0", 41 "@meetfranz/electron-notification-state": "1.0.0",
41 "@meetfranz/forms": "file:packages/forms", 42 "@meetfranz/forms": "file:packages/forms",
42 "@meetfranz/theme": "file:packages/theme", 43 "@meetfranz/theme": "file:packages/theme",
@@ -72,6 +73,7 @@
72 "prop-types": "^15.5.10", 73 "prop-types": "^15.5.10",
73 "react": "16.6.3", 74 "react": "16.6.3",
74 "react-addons-css-transition-group": "15.6.2", 75 "react-addons-css-transition-group": "15.6.2",
76 "react-confetti": "3.1.0",
75 "react-dom": "16.6.3", 77 "react-dom": "16.6.3",
76 "react-dropzone": "7.0.1", 78 "react-dropzone": "7.0.1",
77 "react-electron-web-view": "^2.0.1", 79 "react-electron-web-view": "^2.0.1",
diff --git a/packages/forms/package.json b/packages/forms/package.json
index d50f4c756..bb76462d8 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.16", 3 "version": "1.1.0",
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": {
@@ -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": "9f2ab40b7602bc3df26ebb093b484b9917768f69" 38 "gitHead": "e1e46986d902adc4c19ee009016290f9733a7d61"
39} 39}
diff --git a/packages/forms/src/button/index.tsx b/packages/forms/src/button/index.tsx
index 3f129d0ff..b81154a43 100644
--- a/packages/forms/src/button/index.tsx
+++ b/packages/forms/src/button/index.tsx
@@ -1,4 +1,3 @@
1import * as mdiIcons from '@mdi/js';
2import Icon from '@mdi/react'; 1import Icon from '@mdi/react';
3import { Theme } from '@meetfranz/theme'; 2import { Theme } from '@meetfranz/theme';
4import classnames from 'classnames'; 3import classnames from 'classnames';
@@ -21,7 +20,7 @@ interface IProps extends IFormField, IWithStyle {
21 stretch?: boolean; 20 stretch?: boolean;
22 loaded?: boolean; 21 loaded?: boolean;
23 busy?: boolean; 22 busy?: boolean;
24 icon?: keyof typeof mdiIcons; 23 icon?: string;
25 href?: string; 24 href?: string;
26 target?: string; 25 target?: string;
27} 26}
@@ -175,7 +174,7 @@ class ButtonComponent extends Component<IProps> {
175 onClick, 174 onClick,
176 buttonType, 175 buttonType,
177 loaded, 176 loaded,
178 icon: iconName, 177 icon,
179 busy: busyProp, 178 busy: busyProp,
180 href, 179 href,
181 target, 180 target,
@@ -185,13 +184,6 @@ class ButtonComponent extends Component<IProps> {
185 busy, 184 busy,
186 } = this.state; 185 } = this.state;
187 186
188 let icon = '';
189 if (iconName && mdiIcons[iconName]) {
190 icon = mdiIcons[iconName];
191 } else if (iconName && !mdiIcons[iconName]) {
192 console.warn(`Icon '${iconName}' was not found`);
193 }
194
195 let showLoader = false; 187 let showLoader = false;
196 if (loaded) { 188 if (loaded) {
197 showLoader = !loaded; 189 showLoader = !loaded;
diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts
index bd9f001e8..e94f54c55 100644
--- a/packages/theme/src/themes/dark/index.ts
+++ b/packages/theme/src/themes/dark/index.ts
@@ -11,6 +11,8 @@ export const colorBackgroundSubscriptionContainer = legacyStyles.themeBrandInfo;
11export const colorHeadline = legacyStyles.darkThemeTextColor; 11export const colorHeadline = legacyStyles.darkThemeTextColor;
12export const colorText = legacyStyles.darkThemeTextColor; 12export const colorText = legacyStyles.darkThemeTextColor;
13 13
14export const defaultContentBorder = legacyStyles.themeGrayDark;
15
14// Loader 16// Loader
15export const colorFullscreenLoaderSpinner = '#FFF'; 17export const colorFullscreenLoaderSpinner = '#FFF';
16export const colorWebviewLoaderBackground = color(legacyStyles.darkThemeGrayDarkest).alpha(0.5).rgb().string(); 18export const colorWebviewLoaderBackground = color(legacyStyles.darkThemeGrayDarkest).alpha(0.5).rgb().string();
@@ -118,3 +120,28 @@ export const announcements = merge({}, defaultStyles.announcements, {
118 background: legacyStyles.darkThemeGrayDark, 120 background: legacyStyles.darkThemeGrayDark,
119 }, 121 },
120}); 122});
123
124// Signup
125export const signup = merge({}, defaultStyles.signup, {
126 pricing: {
127 feature: {
128 background: legacyStyles.darkThemeGrayLight,
129 border: color(legacyStyles.darkThemeGrayLight).lighten(0.2).hex(),
130 },
131 },
132});
133
134// Todos
135export const todos = merge({}, defaultStyles.todos, {
136 todosLayer: {
137 borderLeftColor: legacyStyles.darkThemeGrayDarker,
138 },
139 toggleButton: {
140 background: defaultStyles.styleTypes.primary.accent,
141 textColor: defaultStyles.styleTypes.primary.contrast,
142 shadowColor: 'rgba(0, 0, 0, 0.2)',
143 },
144 dragIndicator: {
145 background: legacyStyles.themeGrayLight,
146 },
147});
diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts
index 53f810f00..79a6d676f 100644
--- a/packages/theme/src/themes/default/index.ts
+++ b/packages/theme/src/themes/default/index.ts
@@ -28,6 +28,8 @@ export const colorHeadline = legacyStyles.themeGrayDark;
28 28
29export const colorText = legacyStyles.themeTextColor; 29export const colorText = legacyStyles.themeTextColor;
30 30
31export const defaultContentBorder = color(legacyStyles.themeGrayLighter).darken(0.1).rgb().string();
32
31// Subscription Container Component 33// Subscription Container Component
32export const colorSubscriptionContainerBackground = 'none'; 34export const colorSubscriptionContainerBackground = 'none';
33export const colorSubscriptionContainerBorder = `1px solid ${brandPrimary}`; 35export const colorSubscriptionContainerBorder = `1px solid ${brandPrimary}`;
@@ -207,3 +209,31 @@ export const announcements = {
207 background: legacyStyles.themeGrayLightest, 209 background: legacyStyles.themeGrayLightest,
208 }, 210 },
209}; 211};
212
213// Signup
214export const signup = {
215 pricing: {
216 feature: {
217 background: legacyStyles.themeGrayLightest,
218 border: legacyStyles.themeGrayLighter,
219 },
220 },
221};
222
223// Todos
224export const todos = {
225 todosLayer: {
226 borderLeftColor: legacyStyles.themeGrayLighter,
227 },
228 toggleButton: {
229 background: styleTypes.primary.accent,
230 textColor: styleTypes.primary.contrast,
231 shadowColor: 'rgba(0, 0, 0, 0.2)',
232 },
233 dragIndicator: {
234 background: legacyStyles.themeGrayLight,
235 },
236 resizeHandler: {
237 backgroundHover: styleTypes.primary.accent,
238 },
239};
diff --git a/packages/ui/package.json b/packages/ui/package.json
index a851ed9cf..4f42b21b5 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.9", 3 "version": "1.0.0",
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": {
@@ -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": "9f2ab40b7602bc3df26ebb093b484b9917768f69" 37 "gitHead": "e1e46986d902adc4c19ee009016290f9733a7d61"
38} 38}
diff --git a/packages/ui/src/badge/ProBadge.tsx b/packages/ui/src/badge/ProBadge.tsx
index 612e23210..5cc41f5b2 100644
--- a/packages/ui/src/badge/ProBadge.tsx
+++ b/packages/ui/src/badge/ProBadge.tsx
@@ -1,15 +1,17 @@
1import { mdiStar } from '@mdi/js';
1import { Theme } from '@meetfranz/theme'; 2import { Theme } from '@meetfranz/theme';
2import classnames from 'classnames'; 3import classnames from 'classnames';
3import React, { Component } from 'react'; 4import React, { Component } from 'react';
4import injectStyle from 'react-jss'; 5import injectStyle from 'react-jss';
5 6
6import { Icon, Badge } from '../'; 7import { Badge, Icon } from '../';
7import { IWithStyle } from '../typings/generic'; 8import { IWithStyle } from '../typings/generic';
8 9
9interface IProps extends IWithStyle { 10interface IProps extends IWithStyle {
10 badgeClasses?: string; 11 badgeClasses?: string;
11 iconClasses?: string; 12 iconClasses?: string;
12 inverted?: boolean; 13 inverted?: boolean;
14 className?: string;
13} 15}
14 16
15const styles = (theme: Theme) => ({ 17const styles = (theme: Theme) => ({
@@ -37,6 +39,7 @@ class ProBadgeComponent extends Component<IProps> {
37 badgeClasses, 39 badgeClasses,
38 iconClasses, 40 iconClasses,
39 inverted, 41 inverted,
42 className,
40 } = this.props; 43 } = this.props;
41 44
42 return ( 45 return (
@@ -46,10 +49,11 @@ class ProBadgeComponent extends Component<IProps> {
46 classes.badge, 49 classes.badge,
47 inverted && classes.invertedBadge, 50 inverted && classes.invertedBadge,
48 badgeClasses, 51 badgeClasses,
52 className,
49 ])} 53 ])}
50 > 54 >
51 <Icon 55 <Icon
52 icon="mdiStar" 56 icon={mdiStar}
53 className={classnames([ 57 className={classnames([
54 classes.icon, 58 classes.icon,
55 inverted && classes.invertedIcon, 59 inverted && classes.invertedIcon,
diff --git a/packages/ui/src/icon/index.tsx b/packages/ui/src/icon/index.tsx
index e30d3396d..af467c085 100644
--- a/packages/ui/src/icon/index.tsx
+++ b/packages/ui/src/icon/index.tsx
@@ -1,4 +1,3 @@
1import * as mdiIcons from '@mdi/js';
2import MdiIcon from '@mdi/react'; 1import MdiIcon from '@mdi/react';
3import { Theme } from '@meetfranz/theme'; 2import { Theme } from '@meetfranz/theme';
4import classnames from 'classnames'; 3import classnames from 'classnames';
@@ -8,7 +7,7 @@ import injectStyle from 'react-jss';
8import { IWithStyle } from '../typings/generic'; 7import { IWithStyle } from '../typings/generic';
9 8
10interface IProps extends IWithStyle { 9interface IProps extends IWithStyle {
11 icon: keyof typeof mdiIcons; 10 icon: string;
12 size?: number; 11 size?: number;
13 className?: string; 12 className?: string;
14} 13}
@@ -27,16 +26,13 @@ class IconComponent extends Component<IProps> {
27 render() { 26 render() {
28 const { 27 const {
29 classes, 28 classes,
30 icon: iconName, 29 icon,
31 size, 30 size,
32 className, 31 className,
33 } = this.props; 32 } = this.props;
34 33
35 let icon = ''; 34 if (!icon) {
36 if (iconName && mdiIcons[iconName]) { 35 console.warn('No Icon specified');
37 icon = mdiIcons[iconName];
38 } else if (iconName && !mdiIcons[iconName]) {
39 console.warn(`Icon '${iconName}' was not found`);
40 } 36 }
41 37
42 return ( 38 return (
diff --git a/packages/ui/src/infobox/index.tsx b/packages/ui/src/infobox/index.tsx
index 9066a623e..e4c2c5a3e 100644
--- a/packages/ui/src/infobox/index.tsx
+++ b/packages/ui/src/infobox/index.tsx
@@ -1,3 +1,4 @@
1import { mdiClose } from '@mdi/js';
1import { Theme } from '@meetfranz/theme'; 2import { Theme } from '@meetfranz/theme';
2import classnames from 'classnames'; 3import classnames from 'classnames';
3import React, { Component } from 'react'; 4import React, { Component } from 'react';
@@ -48,13 +49,13 @@ const styles = (theme: Theme) => ({
48 position: 'relative', 49 position: 'relative',
49 overflow: 'hidden', 50 overflow: 'hidden',
50 height: 'auto', 51 height: 'auto',
52 marginBottom: 30,
51 }, 53 },
52 infobox: { 54 infobox: {
53 alignItems: 'center', 55 alignItems: 'center',
54 borderRadius: theme.borderRadiusSmall, 56 borderRadius: theme.borderRadiusSmall,
55 display: 'flex', 57 display: 'flex',
56 height: 'auto', 58 height: 'auto',
57 marginBottom: 30,
58 padding: '15px 20px', 59 padding: '15px 20px',
59 top: 0, 60 top: 0,
60 transition: 'all 0.5s', 61 transition: 'all 0.5s',
@@ -192,7 +193,7 @@ class InfoboxComponent extends Component<IProps, IState> {
192 onClick={this.dismiss.bind(this)} 193 onClick={this.dismiss.bind(this)}
193 className={classes.close} 194 className={classes.close}
194 > 195 >
195 <Icon icon="mdiClose" /> 196 <Icon icon={mdiClose} />
196 </button> 197 </button>
197 )} 198 )}
198 </div> 199 </div>
diff --git a/src/actions/index.js b/src/actions/index.js
index fc525afeb..336344d76 100644
--- a/src/actions/index.js
+++ b/src/actions/index.js
@@ -13,6 +13,7 @@ import settings from './settings';
13import requests from './requests'; 13import requests from './requests';
14import announcements from '../features/announcements/actions'; 14import announcements from '../features/announcements/actions';
15import workspaces from '../features/workspaces/actions'; 15import workspaces from '../features/workspaces/actions';
16import todos from '../features/todos/actions';
16 17
17const actions = Object.assign({}, { 18const actions = Object.assign({}, {
18 service, 19 service,
@@ -31,4 +32,5 @@ export default Object.assign(
31 defineActions(actions, PropTypes.checkPropTypes), 32 defineActions(actions, PropTypes.checkPropTypes),
32 { announcements }, 33 { announcements },
33 { workspaces }, 34 { workspaces },
35 { todos },
34); 36);
diff --git a/src/actions/user.js b/src/actions/user.js
index ccf1fa56a..5d7d9a899 100644
--- a/src/actions/user.js
+++ b/src/actions/user.js
@@ -17,6 +17,9 @@ export default {
17 retrievePassword: { 17 retrievePassword: {
18 email: PropTypes.string.isRequired, 18 email: PropTypes.string.isRequired,
19 }, 19 },
20 activateTrial: {
21 planId: PropTypes.string.isRequired,
22 },
20 invite: { 23 invite: {
21 invites: PropTypes.array.isRequired, 24 invites: PropTypes.array.isRequired,
22 }, 25 },
diff --git a/src/api/UserApi.js b/src/api/UserApi.js
index edfb88988..8ba8cd1e9 100644
--- a/src/api/UserApi.js
+++ b/src/api/UserApi.js
@@ -25,6 +25,10 @@ export default class UserApi {
25 return this.server.retrievePassword(email); 25 return this.server.retrievePassword(email);
26 } 26 }
27 27
28 activateTrial(data) {
29 return this.server.activateTrial(data);
30 }
31
28 invite(data) { 32 invite(data) {
29 return this.server.inviteUser(data); 33 return this.server.inviteUser(data);
30 } 34 }
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index efac5ca19..293fcda26 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -76,6 +76,20 @@ export default class ServerApi {
76 return u.token; 76 return u.token;
77 } 77 }
78 78
79 async activateTrial(data) {
80 const request = await sendAuthRequest(`${API_URL}/payment/trial`, {
81 method: 'POST',
82 body: JSON.stringify(data),
83 });
84 if (!request.ok) {
85 throw request;
86 }
87 const trial = await request.json();
88
89 debug('ServerApi::signup resolves', trial);
90 return true;
91 }
92
79 async inviteUser(data) { 93 async inviteUser(data) {
80 const request = await sendAuthRequest(`${apiBase()}/invite`, { 94 const request = await sendAuthRequest(`${apiBase()}/invite`, {
81 method: 'POST', 95 method: 'POST',
@@ -468,7 +482,7 @@ export default class ServerApi {
468 return services; 482 return services;
469 } 483 }
470 } catch (err) { 484 } catch (err) {
471 throw (new Error('ServerApi::getLegacyServices no config found')); 485 console.error('ServerApi::getLegacyServices no config found');
472 } 486 }
473 487
474 return []; 488 return [];
diff --git a/src/components/TrialActivationInfoBar.js b/src/components/TrialActivationInfoBar.js
new file mode 100644
index 000000000..77ab97565
--- /dev/null
+++ b/src/components/TrialActivationInfoBar.js
@@ -0,0 +1,94 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl';
4import ms from 'ms';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7
8import InfoBar from './ui/InfoBar';
9
10const messages = defineMessages({
11 message: {
12 id: 'infobar.trialActivated',
13 defaultMessage: '!!!Your trial was successfully activated. Happy messaging!',
14 },
15});
16
17const styles = {
18 notification: {
19 height: 'auto',
20 position: 'absolute',
21 top: -50,
22 transition: 'top 0.3s',
23 zIndex: 500,
24 width: 'calc(100% - 300px)',
25 },
26 show: {
27 top: 0,
28 },
29};
30
31@injectSheet(styles)
32class TrialActivationInfoBar extends Component {
33 static propTypes = {
34 // eslint-disable-next-line
35 classes: PropTypes.object.isRequired,
36 };
37
38 static contextTypes = {
39 intl: intlShape,
40 };
41
42 state = {
43 showing: false,
44 removed: false,
45 }
46
47 componentDidMount() {
48 setTimeout(() => {
49 this.setState({
50 showing: true,
51 });
52 }, 0);
53
54 setTimeout(() => {
55 this.setState({
56 showing: false,
57 });
58 }, ms('6s'));
59
60 setTimeout(() => {
61 this.setState({
62 removed: true,
63 });
64 }, ms('7s'));
65 }
66
67 render() {
68 const { classes } = this.props;
69 const { showing, removed } = this.state;
70 const { intl } = this.context;
71
72 if (removed) return null;
73
74 return (
75 <div
76 className={classnames({
77 [classes.notification]: true,
78 [classes.show]: showing,
79 })}
80 >
81 <InfoBar
82 type="primary"
83 position="top"
84 sticky
85 >
86 <span className="mdi mdi-information" />
87 {intl.formatMessage(messages.message)}
88 </InfoBar>
89 </div>
90 );
91 }
92}
93
94export default TrialActivationInfoBar;
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
index 13a1e2351..cbeaaa5d9 100644
--- a/src/components/auth/Pricing.js
+++ b/src/components/auth/Pricing.js
@@ -1,40 +1,107 @@
1import React, { Component } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5// import { Link } from 'react-router'; 5import injectSheet from 'react-jss';
6import { H2, Loader } from '@meetfranz/ui';
7import classnames from 'classnames';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureItem } from '../ui/FeatureItem';
11import { FeatureList } from '../ui/FeatureList';
6 12
7// import Button from '../ui/Button';
8import Loader from '../ui/Loader';
9import Appear from '../ui/effects/Appear';
10import SubscriptionForm from '../../containers/subscription/SubscriptionFormScreen';
11 13
12const messages = defineMessages({ 14const messages = defineMessages({
13 headline: { 15 headline: {
14 id: 'pricing.headline', 16 id: 'pricing.trial.headline',
15 defaultMessage: '!!!Support Ferdi', 17 defaultMessage: '!!!Franz Professional',
18 },
19 personalOffer: {
20 id: 'pricing.trial.subheadline',
21 defaultMessage: '!!!Your personal welcome offer:',
22 },
23 noStringsAttachedHeadline: {
24 id: 'pricing.trial.terms.headline',
25 defaultMessage: '!!!No strings attached',
26 },
27 noCreditCard: {
28 id: 'pricing.trial.terms.noCreditCard',
29 defaultMessage: '!!!No credit card required',
16 }, 30 },
17 monthlySupportLabel: { 31 automaticTrialEnd: {
18 id: 'pricing.support.label', 32 id: 'pricing.trial.terms.automaticTrialEnd',
19 defaultMessage: '!!!Select your support plan', 33 defaultMessage: '!!!Your free trial ends automatically after 14 days',
20 }, 34 },
21 submitButtonLabel: { 35 activationError: {
22 id: 'pricing.submit.label', 36 id: 'pricing.trial.error',
23 defaultMessage: '!!!Support the development of Ferdi', 37 defaultMessage: '!!!Sorry, we could not activate your trial!',
24 }, 38 },
25 skipPayment: { 39 ctaAccept: {
26 id: 'pricing.link.skipPayment', 40 id: 'pricing.trial.cta.accept',
27 defaultMessage: '!!!I don\'t want to support the development of Ferdi.', 41 defaultMessage: '!!!Yes, upgrade my account to Franz Professional',
42 },
43 ctaSkip: {
44 id: 'pricing.trial.cta.skip',
45 defaultMessage: '!!!Continue to Franz',
46 },
47 featuresHeadline: {
48 id: 'pricing.trial.features.headline',
49 defaultMessage: '!!!Franz Professional includes:',
28 }, 50 },
29}); 51});
30 52
31export default @observer class Signup extends Component { 53const styles = theme => ({
54 container: {
55 position: 'relative',
56 marginLeft: -150,
57 },
58 welcomeOffer: {
59 textAlign: 'center',
60 fontWeight: 'bold',
61 },
62 keyTerms: {
63 textAlign: 'center',
64 },
65 content: {
66 position: 'relative',
67 zIndex: 20,
68 },
69 featureContainer: {
70 width: 300,
71 position: 'absolute',
72 left: 'calc(100% / 2 + 225px)',
73 top: 155,
74 background: theme.signup.pricing.feature.background,
75 height: 'auto',
76 padding: 20,
77 borderTopRightRadius: theme.borderRadius,
78 borderBottomRightRadius: theme.borderRadius,
79 zIndex: 10,
80 },
81 featureItem: {
82 borderBottom: [1, 'solid', theme.signup.pricing.feature.border],
83 },
84 cta: {
85 marginTop: 40,
86 width: '100%',
87 },
88 skipLink: {
89 textAlign: 'center',
90 marginTop: 10,
91 },
92 error: {
93 margin: [20, 0, 0],
94 color: theme.styleTypes.danger.accent,
95 },
96});
97
98export default @observer @injectSheet(styles) class Signup extends Component {
32 static propTypes = { 99 static propTypes = {
33 donor: MobxPropTypes.objectOrObservableObject.isRequired, 100 onSubmit: PropTypes.func.isRequired,
34 isLoading: PropTypes.bool.isRequired, 101 isLoadingRequiredData: PropTypes.bool.isRequired,
35 isLoadingUser: PropTypes.bool.isRequired, 102 isActivatingTrial: PropTypes.bool.isRequired,
36 onCloseSubscriptionWindow: PropTypes.func.isRequired, 103 trialActivationError: PropTypes.bool.isRequired,
37 skipAction: PropTypes.func.isRequired, 104 classes: PropTypes.object.isRequired,
38 }; 105 };
39 106
40 static contextTypes = { 107 static contextTypes = {
@@ -43,70 +110,37 @@ export default @observer class Signup extends Component {
43 110
44 render() { 111 render() {
45 const { 112 const {
46 donor, 113 onSubmit,
47 isLoading, 114 isLoadingRequiredData,
48 isLoadingUser, 115 isActivatingTrial,
49 onCloseSubscriptionWindow, 116 trialActivationError,
50 skipAction, 117 classes,
51 } = this.props; 118 } = this.props;
52 const { intl } = this.context; 119 const { intl } = this.context;
53 120
54 return ( 121 return (
55 <div className="auth__scroll-container"> 122 <div className={classnames('auth__scroll-container', classes.container)}>
56 <div className="auth__container auth__container--signup"> 123 <div className={classnames('auth__container', 'auth__container--signup', classes.content)}>
57 <form className="Ferdi-form auth__form"> 124 <form className="franz-form auth__form">
58 <img 125 {isLoadingRequiredData ? <Loader /> : (
59 src="./assets/images/sm.png" 126 <img
60 className="auth__logo auth__logo--sm" 127 src="./assets/images/sm.png"
61 alt="" 128 className="auth__logo auth__logo--sm"
62 /> 129 alt=""
130 />
131 )}
132 <p className={classes.welcomeOffer}>{intl.formatMessage(messages.personalOffer)}</p>
63 <h1>{intl.formatMessage(messages.headline)}</h1> 133 <h1>{intl.formatMessage(messages.headline)}</h1>
64 <div className="auth__letter"> 134 <div className="auth__letter">
65 {isLoadingUser && ( 135 <p>
66 <p>Loading</p> 136 We built Franz with a lot of effort, manpower and love,
67 )} 137 to boost up your messaging experience.
68 {!isLoadingUser && ( 138 <br />
69 donor.amount ? ( 139 </p>
70 <span> 140 <p>
71 <p> 141 Get the free 14 day Franz Professional trial and see your communication evolving.
72 Thank you so much for your previous donation of 142 <br />
73 {' '} 143 </p>
74 <strong>
75 $
76 {donor.amount}
77 </strong>
78 .
79 <br />
80 Your support allowed us to get where we are today.
81 <br />
82 </p>
83 <p>
84 As an early supporter, you get
85 {' '}
86 <strong>a lifetime premium supporter license</strong>
87 {' '}
88 without any
89 additional charges.
90 </p>
91 <p>
92 However, If you want to keep supporting us, you are more than welcome to subscribe to a plan.
93 <br />
94 <br />
95 </p>
96 </span>
97 ) : (
98 <span>
99 <p>
100 We built Ferdi with a lot of effort, manpower and love,
101 to bring you the best messaging experience.
102 <br />
103 </p>
104 <p>
105 Getting a Ferdi Premium Supporter License will allow us to keep improving Ferdi for you.
106 </p>
107 </span>
108 )
109 )}
110 <p> 144 <p>
111 Thanks for being a hero. 145 Thanks for being a hero.
112 </p> 146 </p>
@@ -114,20 +148,48 @@ export default @observer class Signup extends Component {
114 <strong>Stefan Malzner</strong> 148 <strong>Stefan Malzner</strong>
115 </p> 149 </p>
116 </div> 150 </div>
117 <Loader loaded={!isLoading}> 151 <div className={classes.keyTerms}>
118 <Appear transitionName="slideDown"> 152 <H2>
119 <span className="label">{intl.formatMessage(messages.monthlySupportLabel)}</span> 153 {intl.formatMessage(messages.noStringsAttachedHeadline)}
120 <SubscriptionForm 154 </H2>
121 onCloseWindow={onCloseSubscriptionWindow} 155 <ul className={classes.keyTermsList}>
122 showSkipOption 156 <FeatureItem icon="👉" name={intl.formatMessage(messages.noCreditCard)} />
123 skipAction={skipAction} 157 <FeatureItem icon="👉" name={intl.formatMessage(messages.automaticTrialEnd)} />
124 hideInfo={Boolean(donor.amount)} 158 </ul>
125 skipButtonLabel={intl.formatMessage(messages.skipPayment)} 159 </div>
126 /> 160 {trialActivationError && (
127 </Appear> 161 <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p>
128 </Loader> 162 )}
163 <Button
164 label={intl.formatMessage(messages.ctaAccept)}
165 className={classes.cta}
166 onClick={onSubmit}
167 busy={isActivatingTrial}
168 disabled={isLoadingRequiredData || isActivatingTrial}
169 />
170 <p className={classes.skipLink}>
171 <a href="#/">{intl.formatMessage(messages.ctaSkip)}</a>
172 </p>
129 </form> 173 </form>
130 </div> 174 </div>
175 <div className={classes.featureContainer}>
176 <H2>
177 {intl.formatMessage(messages.featuresHeadline)}
178 </H2>
179 {/* <ul className={classes.features}>
180 <FeatureItem name="Add unlimited services" className={classes.featureItem} />
181 <FeatureItem name="Spellchecker support" className={classes.featureItem} />
182 <FeatureItem name="Workspaces" className={classes.featureItem} />
183 <FeatureItem name="Add Custom Websites" className={classes.featureItem} />
184 <FeatureItem name="On-premise & other Hosted Services" className={classes.featureItem} />
185 <FeatureItem name="Install 3rd party services" className={classes.featureItem} />
186 <FeatureItem name="Service Proxies" className={classes.featureItem} />
187 <FeatureItem name="Team Management" className={classes.featureItem} />
188 <FeatureItem name="No Waiting Screens" className={classes.featureItem} />
189 <FeatureItem name="Forever ad-free" className={classes.featureItem} />
190 </ul> */}
191 <FeatureList />
192 </div>
131 </div> 193 </div>
132 ); 194 );
133 } 195 }
diff --git a/src/components/auth/Signup.js b/src/components/auth/Signup.js
index 2aedbe6ea..b36e71ce1 100644
--- a/src/components/auth/Signup.js
+++ b/src/components/auth/Signup.js
@@ -7,7 +7,6 @@ import { isDevMode, useLiveAPI } from '../../environment';
7import Form from '../../lib/Form'; 7import Form from '../../lib/Form';
8import { required, email, minLength } from '../../helpers/validation-helpers'; 8import { required, email, minLength } from '../../helpers/validation-helpers';
9import Input from '../ui/Input'; 9import Input from '../ui/Input';
10import Radio from '../ui/Radio';
11import Button from '../ui/Button'; 10import Button from '../ui/Button';
12import Link from '../ui/Link'; 11import Link from '../ui/Link';
13import Infobox from '../ui/Infobox'; 12import Infobox from '../ui/Infobox';
@@ -31,10 +30,10 @@ const messages = defineMessages({
31 id: 'signup.email.label', 30 id: 'signup.email.label',
32 defaultMessage: '!!!Email address', 31 defaultMessage: '!!!Email address',
33 }, 32 },
34 companyLabel: { 33 // companyLabel: {
35 id: 'signup.company.label', 34 // id: 'signup.company.label',
36 defaultMessage: '!!!Company', 35 // defaultMessage: '!!!Company',
37 }, 36 // },
38 passwordLabel: { 37 passwordLabel: {
39 id: 'signup.password.label', 38 id: 'signup.password.label',
40 defaultMessage: '!!!Password', 39 defaultMessage: '!!!Password',
@@ -79,20 +78,6 @@ export default @observer class Signup extends Component {
79 78
80 form = new Form({ 79 form = new Form({
81 fields: { 80 fields: {
82 accountType: {
83 value: 'individual',
84 validators: [required],
85 options: [{
86 value: 'individual',
87 label: 'Individual',
88 }, {
89 value: 'non-profit',
90 label: 'Non-Profit',
91 }, {
92 value: 'company',
93 label: 'Company',
94 }],
95 },
96 firstname: { 81 firstname: {
97 label: this.context.intl.formatMessage(messages.firstnameLabel), 82 label: this.context.intl.formatMessage(messages.firstnameLabel),
98 value: '', 83 value: '',
@@ -108,10 +93,6 @@ export default @observer class Signup extends Component {
108 value: '', 93 value: '',
109 validators: [required, email], 94 validators: [required, email],
110 }, 95 },
111 organization: {
112 label: this.context.intl.formatMessage(messages.companyLabel),
113 value: '', // TODO: make required when accountType: company
114 },
115 password: { 96 password: {
116 label: this.context.intl.formatMessage(messages.passwordLabel), 97 label: this.context.intl.formatMessage(messages.passwordLabel),
117 value: '', 98 value: '',
@@ -153,7 +134,6 @@ export default @observer class Signup extends Component {
153 In Dev Mode your data is not persistent. Please use the live app for accesing the production API. 134 In Dev Mode your data is not persistent. Please use the live app for accesing the production API.
154 </Infobox> 135 </Infobox>
155 )} 136 )}
156 <Radio field={form.$('accountType')} showLabel={false} />
157 <div className="grid__row"> 137 <div className="grid__row">
158 <Input field={form.$('firstname')} focus /> 138 <Input field={form.$('firstname')} focus />
159 <Input field={form.$('lastname')} /> 139 <Input field={form.$('lastname')} />
@@ -164,9 +144,6 @@ export default @observer class Signup extends Component {
164 showPasswordToggle 144 showPasswordToggle
165 scorePassword 145 scorePassword
166 /> 146 />
167 {form.$('accountType').value === 'company' && (
168 <Input field={form.$('organization')} />
169 )}
170 {error.code === 'email-duplicate' && ( 147 {error.code === 'email-duplicate' && (
171 <p className="error-message center">{intl.formatMessage(messages.emailDuplicate)}</p> 148 <p className="error-message center">{intl.formatMessage(messages.emailDuplicate)}</p>
172 )} 149 )}
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 5c3d301e0..ed004d07e 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -16,6 +16,8 @@ import { isWindows } from '../../environment';
16import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; 16import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator';
17import { workspaceStore } from '../../features/workspaces'; 17import { workspaceStore } from '../../features/workspaces';
18import AppUpdateInfoBar from '../AppUpdateInfoBar'; 18import AppUpdateInfoBar from '../AppUpdateInfoBar';
19import TrialActivationInfoBar from '../TrialActivationInfoBar';
20import Todos from '../../features/todos/containers/TodosScreen';
19 21
20function createMarkup(HTMLString) { 22function createMarkup(HTMLString) {
21 return { __html: HTMLString }; 23 return { __html: HTMLString };
@@ -42,7 +44,8 @@ const messages = defineMessages({
42 44
43const styles = theme => ({ 45const styles = theme => ({
44 appContent: { 46 appContent: {
45 width: `calc(100% + ${theme.workspaces.drawer.width}px)`, 47 // width: `calc(100% + ${theme.workspaces.drawer.width}px)`,
48 width: '100%',
46 transition: 'transform 0.5s ease', 49 transition: 'transform 0.5s ease',
47 transform() { 50 transform() {
48 return workspaceStore.isWorkspaceDrawerOpen ? 'translateX(0)' : `translateX(-${theme.workspaces.drawer.width}px)`; 51 return workspaceStore.isWorkspaceDrawerOpen ? 'translateX(0)' : `translateX(-${theme.workspaces.drawer.width}px)`;
@@ -60,7 +63,6 @@ class AppLayout extends Component {
60 services: PropTypes.element.isRequired, 63 services: PropTypes.element.isRequired,
61 children: PropTypes.element, 64 children: PropTypes.element,
62 news: MobxPropTypes.arrayOrObservableArray.isRequired, 65 news: MobxPropTypes.arrayOrObservableArray.isRequired,
63 // isOnline: PropTypes.bool.isRequired,
64 showServicesUpdatedInfoBar: PropTypes.bool.isRequired, 66 showServicesUpdatedInfoBar: PropTypes.bool.isRequired,
65 appUpdateIsDownloaded: PropTypes.bool.isRequired, 67 appUpdateIsDownloaded: PropTypes.bool.isRequired,
66 nextAppReleaseVersion: PropTypes.string, 68 nextAppReleaseVersion: PropTypes.string,
@@ -72,6 +74,8 @@ class AppLayout extends Component {
72 areRequiredRequestsSuccessful: PropTypes.bool.isRequired, 74 areRequiredRequestsSuccessful: PropTypes.bool.isRequired,
73 retryRequiredRequests: PropTypes.func.isRequired, 75 retryRequiredRequests: PropTypes.func.isRequired,
74 areRequiredRequestsLoading: PropTypes.bool.isRequired, 76 areRequiredRequestsLoading: PropTypes.bool.isRequired,
77 isDelayAppScreenVisible: PropTypes.bool.isRequired,
78 hasActivatedTrial: PropTypes.bool.isRequired,
75 }; 79 };
76 80
77 static defaultProps = { 81 static defaultProps = {
@@ -91,7 +95,6 @@ class AppLayout extends Component {
91 sidebar, 95 sidebar,
92 services, 96 services,
93 children, 97 children,
94 // isOnline,
95 news, 98 news,
96 showServicesUpdatedInfoBar, 99 showServicesUpdatedInfoBar,
97 appUpdateIsDownloaded, 100 appUpdateIsDownloaded,
@@ -104,6 +107,8 @@ class AppLayout extends Component {
104 areRequiredRequestsSuccessful, 107 areRequiredRequestsSuccessful,
105 retryRequiredRequests, 108 retryRequiredRequests,
106 areRequiredRequestsLoading, 109 areRequiredRequestsLoading,
110 isDelayAppScreenVisible,
111 hasActivatedTrial,
107 } = this.props; 112 } = this.props;
108 113
109 const { intl } = this.context; 114 const { intl } = this.context;
@@ -125,29 +130,31 @@ class AppLayout extends Component {
125 sticky={item.sticky} 130 sticky={item.sticky}
126 onHide={() => removeNewsItem({ newsId: item.id })} 131 onHide={() => removeNewsItem({ newsId: item.id })}
127 > 132 >
128 <span dangerouslySetInnerHTML={createMarkup(item.message)} /> 133 <span
134 dangerouslySetInnerHTML={createMarkup(item.message)}
135 onClick={(event) => {
136 const { target } = event;
137 if (target && target.hasAttribute('data-is-news-cta')) {
138 removeNewsItem({ newsId: item.id });
139 }
140 }}
141 />
129 </InfoBar> 142 </InfoBar>
130 ))} 143 ))}
131 {/* {!isOnline && ( 144 {hasActivatedTrial && (
132 <InfoBar 145 <TrialActivationInfoBar />
133 type="danger" 146 )}
134 sticky
135 >
136 <span className="mdi mdi-flash" />
137 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
138 </InfoBar>
139 )} */}
140 {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( 147 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
141 <InfoBar 148 <InfoBar
142 type="danger" 149 type="danger"
143 ctaLabel="Try again" 150 ctaLabel="Try again"
144 ctaLoading={areRequiredRequestsLoading} 151 ctaLoading={areRequiredRequestsLoading}
145 sticky 152 sticky
146 onClick={retryRequiredRequests} 153 onClick={retryRequiredRequests}
147 > 154 >
148 <span className="mdi mdi-flash" /> 155 <span className="mdi mdi-flash" />
149 {intl.formatMessage(messages.requiredRequestsFailed)} 156 {intl.formatMessage(messages.requiredRequestsFailed)}
150 </InfoBar> 157 </InfoBar>
151 )} 158 )}
152 {authRequestFailed && ( 159 {authRequestFailed && (
153 <InfoBar 160 <InfoBar
@@ -183,6 +190,7 @@ class AppLayout extends Component {
183 {services} 190 {services}
184 {children} 191 {children}
185 </div> 192 </div>
193 <Todos />
186 </div> 194 </div>
187 </div> 195 </div>
188 </ErrorBoundary> 196 </ErrorBoundary>
diff --git a/src/components/services/content/ServiceRestricted.js b/src/components/services/content/ServiceRestricted.js
new file mode 100644
index 000000000..4b8d926aa
--- /dev/null
+++ b/src/components/services/content/ServiceRestricted.js
@@ -0,0 +1,78 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import { serviceLimitStore } from '../../../features/serviceLimit';
7import Button from '../../ui/Button';
8import { RESTRICTION_TYPES } from '../../../models/Service';
9
10const messages = defineMessages({
11 headlineServiceLimit: {
12 id: 'service.restrictedHandler.serviceLimit.headline',
13 defaultMessage: '!!!You have reached your service limit.',
14 },
15 textServiceLimit: {
16 id: 'service.restrictedHandler.serviceLimit.text',
17 defaultMessage: '!!!Please upgrade your account to use more than {count} services.',
18 },
19 headlineCustomUrl: {
20 id: 'service.restrictedHandler.customUrl.headline',
21 defaultMessage: '!!!Franz Professional Plan required',
22 },
23 textCustomUrl: {
24 id: 'service.restrictedHandler.customUrl.text',
25 defaultMessage: '!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.',
26 },
27 action: {
28 id: 'service.restrictedHandler.action',
29 defaultMessage: '!!!Upgrade Account',
30 },
31});
32
33export default @observer class ServiceRestricted extends Component {
34 static propTypes = {
35 name: PropTypes.string.isRequired,
36 upgrade: PropTypes.func.isRequired,
37 type: PropTypes.number.isRequired,
38 };
39
40 static contextTypes = {
41 intl: intlShape,
42 };
43
44 countdownInterval = null;
45
46 countdownIntervalTimeout = 1000;
47
48 render() {
49 const {
50 name,
51 upgrade,
52 type,
53 } = this.props;
54 const { intl } = this.context;
55
56 return (
57 <div className="services__info-layer">
58 {type === RESTRICTION_TYPES.SERVICE_LIMIT && (
59 <>
60 <h1>{intl.formatMessage(messages.headlineServiceLimit)}</h1>
61 <p>{intl.formatMessage(messages.textServiceLimit, { count: serviceLimitStore.serviceLimit })}</p>
62 </>
63 )}
64 {type === RESTRICTION_TYPES.CUSTOM_URL && (
65 <>
66 <h1>{intl.formatMessage(messages.headlineCustomUrl)}</h1>
67 <p>{intl.formatMessage(messages.textCustomUrl)}</p>
68 </>
69 )}
70 <Button
71 label={intl.formatMessage(messages.action, { name })}
72 buttonType="inverted"
73 onClick={() => upgrade()}
74 />
75 </div>
76 );
77 }
78}
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index 13148b9b3..f65f51346 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -10,6 +10,7 @@ import WebviewLoader from '../../ui/WebviewLoader';
10import WebviewCrashHandler from './WebviewCrashHandler'; 10import WebviewCrashHandler from './WebviewCrashHandler';
11import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler'; 11import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler';
12import ServiceDisabled from './ServiceDisabled'; 12import ServiceDisabled from './ServiceDisabled';
13import ServiceRestricted from './ServiceRestricted';
13import ServiceWebview from './ServiceWebview'; 14import ServiceWebview from './ServiceWebview';
14 15
15export default @observer class ServiceView extends Component { 16export default @observer class ServiceView extends Component {
@@ -21,6 +22,7 @@ export default @observer class ServiceView extends Component {
21 edit: PropTypes.func.isRequired, 22 edit: PropTypes.func.isRequired,
22 enable: PropTypes.func.isRequired, 23 enable: PropTypes.func.isRequired,
23 isActive: PropTypes.bool, 24 isActive: PropTypes.bool,
25 upgrade: PropTypes.func.isRequired,
24 }; 26 };
25 27
26 static defaultProps = { 28 static defaultProps = {
@@ -72,6 +74,7 @@ export default @observer class ServiceView extends Component {
72 reload, 74 reload,
73 edit, 75 edit,
74 enable, 76 enable,
77 upgrade,
75 } = this.props; 78 } = this.props;
76 79
77 const webviewClasses = classnames({ 80 const webviewClasses = classnames({
@@ -99,7 +102,7 @@ export default @observer class ServiceView extends Component {
99 reload={reload} 102 reload={reload}
100 /> 103 />
101 )} 104 )}
102 {service.isEnabled && service.isLoading && service.isFirstLoad && ( 105 {service.isEnabled && service.isLoading && service.isFirstLoad && !service.isServiceAccessRestricted && (
103 <WebviewLoader 106 <WebviewLoader
104 loaded={false} 107 loaded={false}
105 name={service.name} 108 name={service.name}
@@ -126,11 +129,21 @@ export default @observer class ServiceView extends Component {
126 )} 129 )}
127 </Fragment> 130 </Fragment>
128 ) : ( 131 ) : (
129 <ServiceWebview 132 <>
130 service={service} 133 {service.isServiceAccessRestricted ? (
131 setWebviewReference={setWebviewReference} 134 <ServiceRestricted
132 detachService={detachService} 135 name={service.recipe.name}
133 /> 136 upgrade={upgrade}
137 type={service.restrictionType}
138 />
139 ) : (
140 <ServiceWebview
141 service={service}
142 setWebviewReference={setWebviewReference}
143 detachService={detachService}
144 />
145 )}
146 </>
134 )} 147 )}
135 {statusBar} 148 {statusBar}
136 </div> 149 </div>
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index 5fad070f0..1afbaabc4 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -3,6 +3,9 @@ import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { Link } from 'react-router'; 4import { Link } from 'react-router';
5import { defineMessages, intlShape } from 'react-intl'; 5import { defineMessages, intlShape } from 'react-intl';
6import Confetti from 'react-confetti';
7import ms from 'ms';
8import injectSheet from 'react-jss';
6 9
7import ServiceView from './ServiceView'; 10import ServiceView from './ServiceView';
8import Appear from '../../ui/effects/Appear'; 11import Appear from '../../ui/effects/Appear';
@@ -26,7 +29,17 @@ const messages = defineMessages({
26 }, 29 },
27}); 30});
28 31
29export default @observer class Services extends Component { 32
33const styles = {
34 confettiContainer: {
35 position: 'absolute',
36 width: '100%',
37 zIndex: 9999,
38 pointerEvents: 'none',
39 },
40};
41
42export default @observer @injectSheet(styles) class Services extends Component {
30 static propTypes = { 43 static propTypes = {
31 services: MobxPropTypes.arrayOrObservableArray, 44 services: MobxPropTypes.arrayOrObservableArray,
32 setWebviewReference: PropTypes.func.isRequired, 45 setWebviewReference: PropTypes.func.isRequired,
@@ -36,6 +49,9 @@ export default @observer class Services extends Component {
36 reload: PropTypes.func.isRequired, 49 reload: PropTypes.func.isRequired,
37 openSettings: PropTypes.func.isRequired, 50 openSettings: PropTypes.func.isRequired,
38 update: PropTypes.func.isRequired, 51 update: PropTypes.func.isRequired,
52 userHasCompletedSignup: PropTypes.bool.isRequired,
53 hasActivatedTrial: PropTypes.bool.isRequired,
54 classes: PropTypes.object.isRequired,
39 }; 55 };
40 56
41 static defaultProps = { 57 static defaultProps = {
@@ -46,6 +62,18 @@ export default @observer class Services extends Component {
46 intl: intlShape, 62 intl: intlShape,
47 }; 63 };
48 64
65 state = {
66 showConfetti: true,
67 }
68
69 componentDidMount() {
70 window.setTimeout(() => {
71 this.setState({
72 showConfetti: false,
73 });
74 }, ms('8s'));
75 }
76
49 render() { 77 render() {
50 const { 78 const {
51 services, 79 services,
@@ -56,12 +84,29 @@ export default @observer class Services extends Component {
56 reload, 84 reload,
57 openSettings, 85 openSettings,
58 update, 86 update,
87 userHasCompletedSignup,
88 hasActivatedTrial,
89 classes,
59 } = this.props; 90 } = this.props;
91
92 const {
93 showConfetti,
94 } = this.state;
95
60 const { intl } = this.context; 96 const { intl } = this.context;
61 const isLoggedIn = Boolean(localStorage.getItem('authToken')); 97 const isLoggedIn = Boolean(localStorage.getItem('authToken'));
62 98
63 return ( 99 return (
64 <div className="services"> 100 <div className="services">
101 {(userHasCompletedSignup || hasActivatedTrial) && (
102 <div className={classes.confettiContainer}>
103 <Confetti
104 width={window.width}
105 height={window.height}
106 numberOfPieces={showConfetti ? 200 : 0}
107 />
108 </div>
109 )}
65 {services.length === 0 && ( 110 {services.length === 0 && (
66 <Appear 111 <Appear
67 timeout={1500} 112 timeout={1500}
@@ -104,6 +149,7 @@ export default @observer class Services extends Component {
104 }, 149 },
105 redirect: false, 150 redirect: false,
106 })} 151 })}
152 upgrade={() => openSettings({ path: 'user' })}
107 /> 153 />
108 ))} 154 ))}
109 </div> 155 </div>
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 4b7637637..f588449f4 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -1,14 +1,18 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import ReactTooltip from 'react-tooltip'; 5import ReactTooltip from 'react-tooltip';
6import { ProBadge } from '@meetfranz/ui'; 6import {
7 ProBadge, H1, H2,
8} from '@meetfranz/ui';
9import moment from 'moment';
7 10
8import Loader from '../../ui/Loader'; 11import Loader from '../../ui/Loader';
9import Button from '../../ui/Button'; 12import Button from '../../ui/Button';
10import Infobox from '../../ui/Infobox'; 13import Infobox from '../../ui/Infobox';
11import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen'; 14import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen';
15import { i18nPlanName } from '../../../helpers/plan-helpers';
12 16
13const messages = defineMessages({ 17const messages = defineMessages({
14 headline: { 18 headline: {
@@ -19,10 +23,6 @@ const messages = defineMessages({
19 id: 'settings.account.headlineSubscription', 23 id: 'settings.account.headlineSubscription',
20 defaultMessage: '!!!Your Subscription', 24 defaultMessage: '!!!Your Subscription',
21 }, 25 },
22 headlineUpgrade: {
23 id: 'settings.account.headlineUpgrade',
24 defaultMessage: '!!!Upgrade your Account',
25 },
26 headlineDangerZone: { 26 headlineDangerZone: {
27 id: 'settings.account.headlineDangerZone', 27 id: 'settings.account.headlineDangerZone',
28 defaultMessage: '!!Danger Zone', 28 defaultMessage: '!!Danger Zone',
@@ -31,6 +31,10 @@ const messages = defineMessages({
31 id: 'settings.account.manageSubscription.label', 31 id: 'settings.account.manageSubscription.label',
32 defaultMessage: '!!!Manage your subscription', 32 defaultMessage: '!!!Manage your subscription',
33 }, 33 },
34 upgradeAccountToPro: {
35 id: 'settings.account.upgradeToPro.label',
36 defaultMessage: '!!!Upgrade to Franz Professional',
37 },
34 accountTypeBasic: { 38 accountTypeBasic: {
35 id: 'settings.account.accountType.basic', 39 id: 'settings.account.accountType.basic',
36 defaultMessage: '!!!Basic Account', 40 defaultMessage: '!!!Basic Account',
@@ -71,21 +75,39 @@ const messages = defineMessages({
71 id: 'settings.account.deleteEmailSent', 75 id: 'settings.account.deleteEmailSent',
72 defaultMessage: '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!', 76 defaultMessage: '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!',
73 }, 77 },
78 trial: {
79 id: 'settings.account.trial',
80 defaultMessage: '!!!Free Trial',
81 },
82 yourLicense: {
83 id: 'settings.account.yourLicense',
84 defaultMessage: '!!!Your Franz License:',
85 },
86 trialEndsIn: {
87 id: 'settings.account.trialEndsIn',
88 defaultMessage: '!!!Your free trial ends in {duration}.',
89 },
90 trialUpdateBillingInformation: {
91 id: 'settings.account.trialUpdateBillingInfo',
92 defaultMessage: '!!!Please update your billing info to continue using {license} after your trial period.',
93 },
74}); 94});
75 95
76export default @observer class AccountDashboard extends Component { 96@observer
97class AccountDashboard extends Component {
77 static propTypes = { 98 static propTypes = {
78 user: MobxPropTypes.observableObject.isRequired, 99 user: MobxPropTypes.observableObject.isRequired,
100 isPremiumOverrideUser: PropTypes.bool.isRequired,
101 isProUser: PropTypes.bool.isRequired,
79 isLoading: PropTypes.bool.isRequired, 102 isLoading: PropTypes.bool.isRequired,
80 isLoadingPlans: PropTypes.bool.isRequired,
81 userInfoRequestFailed: PropTypes.bool.isRequired, 103 userInfoRequestFailed: PropTypes.bool.isRequired,
82 retryUserInfoRequest: PropTypes.func.isRequired, 104 retryUserInfoRequest: PropTypes.func.isRequired,
83 onCloseSubscriptionWindow: PropTypes.func.isRequired,
84 deleteAccount: PropTypes.func.isRequired, 105 deleteAccount: PropTypes.func.isRequired,
85 isLoadingDeleteAccount: PropTypes.bool.isRequired, 106 isLoadingDeleteAccount: PropTypes.bool.isRequired,
86 isDeleteAccountSuccessful: PropTypes.bool.isRequired, 107 isDeleteAccountSuccessful: PropTypes.bool.isRequired,
87 openEditAccount: PropTypes.func.isRequired, 108 openEditAccount: PropTypes.func.isRequired,
88 openBilling: PropTypes.func.isRequired, 109 openBilling: PropTypes.func.isRequired,
110 upgradeToPro: PropTypes.func.isRequired,
89 openInvoices: PropTypes.func.isRequired, 111 openInvoices: PropTypes.func.isRequired,
90 }; 112 };
91 113
@@ -96,20 +118,27 @@ export default @observer class AccountDashboard extends Component {
96 render() { 118 render() {
97 const { 119 const {
98 user, 120 user,
121 isPremiumOverrideUser,
122 isProUser,
99 isLoading, 123 isLoading,
100 isLoadingPlans,
101 userInfoRequestFailed, 124 userInfoRequestFailed,
102 retryUserInfoRequest, 125 retryUserInfoRequest,
103 onCloseSubscriptionWindow,
104 deleteAccount, 126 deleteAccount,
105 isLoadingDeleteAccount, 127 isLoadingDeleteAccount,
106 isDeleteAccountSuccessful, 128 isDeleteAccountSuccessful,
107 openEditAccount, 129 openEditAccount,
108 openBilling, 130 openBilling,
131 upgradeToPro,
109 openInvoices, 132 openInvoices,
110 } = this.props; 133 } = this.props;
111 const { intl } = this.context; 134 const { intl } = this.context;
112 135
136 let planName = '';
137
138 if (user.team && user.team.plan) {
139 planName = i18nPlanName(user.team.plan, intl);
140 }
141
113 return ( 142 return (
114 <div className="settings__main"> 143 <div className="settings__main">
115 <div className="settings__header"> 144 <div className="settings__header">
@@ -135,82 +164,115 @@ export default @observer class AccountDashboard extends Component {
135 )} 164 )}
136 165
137 {!userInfoRequestFailed && ( 166 {!userInfoRequestFailed && (
138 <Fragment> 167 <>
139 {!isLoading && ( 168 {!isLoading && (
140 <div className="account"> 169 <>
141 <div className="account__box account__box--flex"> 170 <div className="account">
142 <div className="account__avatar"> 171 <div className="account__box account__box--flex">
143 <img 172 <div className="account__avatar">
144 src="./assets/images/logo.svg" 173 <img
145 alt="" 174 src="./assets/images/logo.svg"
146 /> 175 alt=""
147 </div> 176 />
148 <div className="account__info"> 177 </div>
149 <h2> 178 <div className="account__info">
150 <span className="username">{`${user.firstname} ${user.lastname}`}</span> 179 <H1>
180 <span className="username">{`${user.firstname} ${user.lastname}`}</span>
181 {user.isPremium && (
182 <>
183 {' '}
184 <ProBadge />
185 </>
186 )}
187 </H1>
188 <p>
189 {user.organization && `${user.organization}, `}
190 {user.email}
191 </p>
151 {user.isPremium && ( 192 {user.isPremium && (
193 <div className="manage-user-links">
194 <Button
195 label={intl.formatMessage(messages.accountEditButton)}
196 className="franz-form__button--inverted"
197 onClick={openEditAccount}
198 />
199 </div>
200 )}
201 </div>
202 {!user.isPremium && (
203 <Button
204 label={intl.formatMessage(messages.accountEditButton)}
205 className="franz-form__button--inverted"
206 onClick={openEditAccount}
207 />
208 )}
209 </div>
210 </div>
211 {user.isPremium && user.isSubscriptionOwner && (
212 <div className="account">
213 <div className="account__box">
214 <H2>
215 {intl.formatMessage(messages.yourLicense)}
216 </H2>
217 <p>
218 {isPremiumOverrideUser ? 'Franz Premium' : planName}
219 {user.team.isTrial && (
220 <>
221 {' – '}
222 {intl.formatMessage(messages.trial)}
223 </>
224 )}
225 </p>
226 {user.team.isTrial && (
152 <> 227 <>
153 {' '} 228 <br />
154 <ProBadge /> 229 <p>
155 <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span> 230 {intl.formatMessage(messages.trialEndsIn, {
231 duration: moment.duration(moment().diff(user.team.trialEnd)).humanize(),
232 })}
233 </p>
234 <p>
235 {intl.formatMessage(messages.trialUpdateBillingInformation, {
236 license: planName,
237 })}
238 </p>
156 </> 239 </>
157 )} 240 )}
158 </h2>
159 {user.organization && `${user.organization}, `}
160 {user.email}
161 {user.isPremium && (
162 <div className="manage-user-links"> 241 <div className="manage-user-links">
242 {!isProUser && (
243 <Button
244 label={intl.formatMessage(messages.upgradeAccountToPro)}
245 className="franz-form__button--primary"
246 onClick={upgradeToPro}
247 />
248 )}
163 <Button 249 <Button
164 label={intl.formatMessage(messages.accountEditButton)} 250 label={intl.formatMessage(messages.manageSubscriptionButtonLabel)}
165 className="franz-form__button--inverted" 251 className="franz-form__button--inverted"
166 onClick={openEditAccount} 252 onClick={openBilling}
253 />
254 <Button
255 label={intl.formatMessage(messages.invoicesButton)}
256 className="franz-form__button--inverted"
257 onClick={openInvoices}
167 /> 258 />
168 {user.isSubscriptionOwner && (
169 <>
170 <Button
171 label={intl.formatMessage(messages.manageSubscriptionButtonLabel)}
172 className="franz-form__button--inverted"
173 onClick={openBilling}
174 />
175 <Button
176 label={intl.formatMessage(messages.invoicesButton)}
177 className="franz-form__button--inverted"
178 onClick={openInvoices}
179 />
180 </>
181 )}
182 </div> 259 </div>
183 )} 260 </div>
184 </div> 261 </div>
185 {!user.isPremium && ( 262 )}
186 <Button 263 {!user.isPremium && (
187 label={intl.formatMessage(messages.accountEditButton)} 264 <div className="account franz-form">
188 className="franz-form__button--inverted" 265 <div className="account__box">
189 onClick={openEditAccount} 266 <SubscriptionForm />
190 /> 267 </div>
191 )}
192 </div>
193 </div>
194 )}
195
196 {!user.isPremium && (
197 isLoadingPlans ? (
198 <Loader />
199 ) : (
200 <div className="account franz-form">
201 <div className="account__box">
202 <h2>{intl.formatMessage(messages.headlineUpgrade)}</h2>
203 <SubscriptionForm
204 onCloseWindow={onCloseSubscriptionWindow}
205 />
206 </div> 268 </div>
207 </div> 269 )}
208 ) 270 </>
209 )} 271 )}
210 272
211 <div className="account franz-form"> 273 <div className="account franz-form">
212 <div className="account__box"> 274 <div className="account__box">
213 <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2> 275 <H2>{intl.formatMessage(messages.headlineDangerZone)}</H2>
214 {!isDeleteAccountSuccessful && ( 276 {!isDeleteAccountSuccessful && (
215 <div className="account__subscription"> 277 <div className="account__subscription">
216 <p>{intl.formatMessage(messages.deleteInfo)}</p> 278 <p>{intl.formatMessage(messages.deleteInfo)}</p>
@@ -227,7 +289,7 @@ export default @observer class AccountDashboard extends Component {
227 )} 289 )}
228 </div> 290 </div>
229 </div> 291 </div>
230 </Fragment> 292 </>
231 )} 293 )}
232 </div> 294 </div>
233 <ReactTooltip place="right" type="dark" effect="solid" /> 295 <ReactTooltip place="right" type="dark" effect="solid" />
@@ -235,3 +297,5 @@ export default @observer class AccountDashboard extends Component {
235 ); 297 );
236 } 298 }
237} 299}
300
301export default AccountDashboard;
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js
index 6aa9bda03..201819526 100644
--- a/src/components/settings/navigation/SettingsNavigation.js
+++ b/src/components/settings/navigation/SettingsNavigation.js
@@ -8,6 +8,7 @@ import Link from '../../ui/Link';
8import { workspaceStore } from '../../../features/workspaces'; 8import { workspaceStore } from '../../../features/workspaces';
9import UIStore from '../../../stores/UIStore'; 9import UIStore from '../../../stores/UIStore';
10import UserStore from '../../../stores/UserStore'; 10import UserStore from '../../../stores/UserStore';
11import { serviceLimitStore } from '../../../features/serviceLimit';
11 12
12const messages = defineMessages({ 13const messages = defineMessages({
13 availableServices: { 14 availableServices: {
@@ -81,7 +82,12 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp
81 > 82 >
82 {intl.formatMessage(messages.yourServices)} 83 {intl.formatMessage(messages.yourServices)}
83 {' '} 84 {' '}
84 <span className="badge">{serviceCount}</span> 85 <span className="badge">
86 {serviceCount}
87 {serviceLimitStore.serviceLimit !== 0 && (
88 `/${serviceLimitStore.serviceLimit}`
89 )}
90 </span>
85 </Link> 91 </Link>
86 {workspaceStore.isFeatureEnabled ? ( 92 {workspaceStore.isFeatureEnabled ? (
87 <Link 93 <Link
diff --git a/src/components/settings/recipes/RecipeItem.js b/src/components/settings/recipes/RecipeItem.js
index 3bb0852b2..12e3775f6 100644
--- a/src/components/settings/recipes/RecipeItem.js
+++ b/src/components/settings/recipes/RecipeItem.js
@@ -19,7 +19,7 @@ export default @observer class RecipeItem extends Component {
19 className="recipe-teaser" 19 className="recipe-teaser"
20 onClick={onClick} 20 onClick={onClick}
21 > 21 >
22 {recipe.local && ( 22 {recipe.isDevRecipe && (
23 <span className="recipe-teaser__dev-badge">dev</span> 23 <span className="recipe-teaser__dev-badge">dev</span>
24 )} 24 )}
25 <img 25 <img
diff --git a/src/components/settings/recipes/RecipesDashboard.js b/src/components/settings/recipes/RecipesDashboard.js
index 00cd725cf..877cbc588 100644
--- a/src/components/settings/recipes/RecipesDashboard.js
+++ b/src/components/settings/recipes/RecipesDashboard.js
@@ -4,12 +4,17 @@ import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import { Link } from 'react-router'; 5import { Link } from 'react-router';
6 6
7import { Button, Input } from '@meetfranz/forms';
8import injectSheet from 'react-jss';
9import { H3, H2, ProBadge } from '@meetfranz/ui';
7import SearchInput from '../../ui/SearchInput'; 10import SearchInput from '../../ui/SearchInput';
8import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
9import RecipeItem from './RecipeItem'; 12import RecipeItem from './RecipeItem';
10import Loader from '../../ui/Loader'; 13import Loader from '../../ui/Loader';
11import Appear from '../../ui/effects/Appear'; 14import Appear from '../../ui/effects/Appear';
12import { FRANZ_SERVICE_REQUEST } from '../../../config'; 15import { FRANZ_SERVICE_REQUEST } from '../../../config';
16import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
17import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
13 18
14const messages = defineMessages({ 19const messages = defineMessages({
15 headline: { 20 headline: {
@@ -28,9 +33,9 @@ const messages = defineMessages({
28 id: 'settings.recipes.all', 33 id: 'settings.recipes.all',
29 defaultMessage: '!!!All services', 34 defaultMessage: '!!!All services',
30 }, 35 },
31 devRecipes: { 36 customRecipes: {
32 id: 'settings.recipes.dev', 37 id: 'settings.recipes.custom',
33 defaultMessage: '!!!Development', 38 defaultMessage: '!!!Custom Services',
34 }, 39 },
35 nothingFound: { 40 nothingFound: {
36 id: 'settings.recipes.nothingFound', 41 id: 'settings.recipes.nothingFound',
@@ -44,9 +49,61 @@ const messages = defineMessages({
44 id: 'settings.recipes.missingService', 49 id: 'settings.recipes.missingService',
45 defaultMessage: '!!!Missing a service?', 50 defaultMessage: '!!!Missing a service?',
46 }, 51 },
52 customRecipeIntro: {
53 id: 'settings.recipes.customService.intro',
54 defaultMessage: '!!!To add a custom service, copy the recipe folder into:',
55 },
56 openFolder: {
57 id: 'settings.recipes.customService.openFolder',
58 defaultMessage: '!!!Open directory',
59 },
60 openDevDocs: {
61 id: 'settings.recipes.customService.openDevDocs',
62 defaultMessage: '!!!Developer Documentation',
63 },
64 headlineCustomRecipes: {
65 id: 'settings.recipes.customService.headline.customRecipes',
66 defaultMessage: '!!!Custom 3rd Party Recipes',
67 },
68 headlineCommunityRecipes: {
69 id: 'settings.recipes.customService.headline.communityRecipes',
70 defaultMessage: '!!!Community 3rd Party Recipes',
71 },
72 headlineDevRecipes: {
73 id: 'settings.recipes.customService.headline.devRecipes',
74 defaultMessage: '!!!Your Development Service Recipes',
75 },
47}); 76});
48 77
49export default @observer class RecipesDashboard extends Component { 78const styles = {
79 devRecipeIntroContainer: {
80 textAlign: 'center',
81 width: '100%',
82 height: 'auto',
83 margin: [40, 0],
84 },
85 path: {
86 marginTop: 20,
87
88 '& > div': {
89 fontFamily: 'SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace',
90 },
91 },
92 actionContainer: {
93 '& button': {
94 margin: [0, 10],
95 },
96 },
97 devRecipeList: {
98 marginTop: 20,
99 height: 'auto',
100 },
101 proBadge: {
102 marginLeft: '10px !important',
103 },
104};
105
106export default @injectSheet(styles) @observer class RecipesDashboard extends Component {
50 static propTypes = { 107 static propTypes = {
51 recipes: MobxPropTypes.arrayOrObservableArray.isRequired, 108 recipes: MobxPropTypes.arrayOrObservableArray.isRequired,
52 isLoading: PropTypes.bool.isRequired, 109 isLoading: PropTypes.bool.isRequired,
@@ -55,12 +112,18 @@ export default @observer class RecipesDashboard extends Component {
55 searchRecipes: PropTypes.func.isRequired, 112 searchRecipes: PropTypes.func.isRequired,
56 resetSearch: PropTypes.func.isRequired, 113 resetSearch: PropTypes.func.isRequired,
57 serviceStatus: MobxPropTypes.arrayOrObservableArray.isRequired, 114 serviceStatus: MobxPropTypes.arrayOrObservableArray.isRequired,
58 devRecipesCount: PropTypes.number.isRequired,
59 searchNeedle: PropTypes.string, 115 searchNeedle: PropTypes.string,
116 recipeFilter: PropTypes.string,
117 recipeDirectory: PropTypes.string.isRequired,
118 openRecipeDirectory: PropTypes.func.isRequired,
119 openDevDocs: PropTypes.func.isRequired,
120 classes: PropTypes.object.isRequired,
121 isCommunityRecipesIncludedInCurrentPlan: PropTypes.bool.isRequired,
60 }; 122 };
61 123
62 static defaultProps = { 124 static defaultProps = {
63 searchNeedle: '', 125 searchNeedle: '',
126 recipeFilter: 'all',
64 } 127 }
65 128
66 static contextTypes = { 129 static contextTypes = {
@@ -76,16 +139,26 @@ export default @observer class RecipesDashboard extends Component {
76 searchRecipes, 139 searchRecipes,
77 resetSearch, 140 resetSearch,
78 serviceStatus, 141 serviceStatus,
79 devRecipesCount,
80 searchNeedle, 142 searchNeedle,
143 recipeFilter,
144 recipeDirectory,
145 openRecipeDirectory,
146 openDevDocs,
147 classes,
148 isCommunityRecipesIncludedInCurrentPlan,
81 } = this.props; 149 } = this.props;
82 const { intl } = this.context; 150 const { intl } = this.context;
83 151
152
153 const communityRecipes = recipes.filter(r => !r.isDevRecipe);
154 const devRecipes = recipes.filter(r => r.isDevRecipe);
155
84 return ( 156 return (
85 <div className="settings__main"> 157 <div className="settings__main">
86 <div className="settings__header"> 158 <div className="settings__header">
87 <h1>{intl.formatMessage(messages.headline)}</h1> 159 <h1>{intl.formatMessage(messages.headline)}</h1>
88 </div> 160 </div>
161 <LimitReachedInfobox />
89 <div className="settings__body recipes"> 162 <div className="settings__body recipes">
90 {serviceStatus.length > 0 && serviceStatus.includes('created') && ( 163 {serviceStatus.length > 0 && serviceStatus.includes('created') && (
91 <Appear> 164 <Appear>
@@ -122,20 +195,14 @@ export default @observer class RecipesDashboard extends Component {
122 > 195 >
123 {intl.formatMessage(messages.allRecipes)} 196 {intl.formatMessage(messages.allRecipes)}
124 </Link> 197 </Link>
125 {devRecipesCount > 0 && ( 198 <Link
126 <Link 199 to="/settings/recipes/dev"
127 to="/settings/recipes/dev" 200 className="badge"
128 className="badge" 201 activeClassName={`${!searchNeedle ? 'badge--primary' : ''}`}
129 activeClassName={`${!searchNeedle ? 'badge--primary' : ''}`} 202 onClick={() => resetSearch()}
130 onClick={() => resetSearch()} 203 >
131 > 204 {intl.formatMessage(messages.customRecipes)}
132 {intl.formatMessage(messages.devRecipes)} 205 </Link>
133 {' '}
134(
135 {devRecipesCount}
136)
137 </Link>
138 )}
139 <a href={FRANZ_SERVICE_REQUEST} target="_blank" className="link recipes__service-request"> 206 <a href={FRANZ_SERVICE_REQUEST} target="_blank" className="link recipes__service-request">
140 {intl.formatMessage(messages.missingService)} 207 {intl.formatMessage(messages.missingService)}
141 {' '} 208 {' '}
@@ -146,23 +213,78 @@ export default @observer class RecipesDashboard extends Component {
146 {isLoading ? ( 213 {isLoading ? (
147 <Loader /> 214 <Loader />
148 ) : ( 215 ) : (
149 <div className="recipes__list"> 216 <>
150 {hasLoadedRecipes && recipes.length === 0 && ( 217 {recipeFilter === 'dev' && (
151 <p className="align-middle settings__empty-state"> 218 <>
152 <span className="emoji"> 219 <H2>
153 <img src="./assets/images/emoji/dontknow.png" alt="" /> 220 {intl.formatMessage(messages.headlineCustomRecipes)}
154 </span> 221 {!isCommunityRecipesIncludedInCurrentPlan && (
155 {intl.formatMessage(messages.nothingFound)} 222 <ProBadge className={classes.proBadge} />
156 </p> 223 )}
224 </H2>
225 <div className={classes.devRecipeIntroContainer}>
226 <p>
227 {intl.formatMessage(messages.customRecipeIntro)}
228 </p>
229 <Input
230 value={recipeDirectory}
231 className={classes.path}
232 showLabel={false}
233 />
234 <div className={classes.actionContainer}>
235 <Button
236 onClick={openRecipeDirectory}
237 buttonType="secondary"
238 label={intl.formatMessage(messages.openFolder)}
239 />
240 <Button
241 onClick={openDevDocs}
242 buttonType="secondary"
243 label={intl.formatMessage(messages.openDevDocs)}
244 />
245 </div>
246 </div>
247 </>
248 )}
249 <PremiumFeatureContainer
250 condition={(recipeFilter === 'dev' && communityRecipes.length > 0) && !isCommunityRecipesIncludedInCurrentPlan}
251 >
252 {recipeFilter === 'dev' && communityRecipes.length > 0 && (
253 <H3>{intl.formatMessage(messages.headlineCommunityRecipes)}</H3>
254 )}
255 <div className="recipes__list">
256 {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && (
257 <p className="align-middle settings__empty-state">
258 <span className="emoji">
259 <img src="./assets/images/emoji/dontknow.png" alt="" />
260 </span>
261 {intl.formatMessage(messages.nothingFound)}
262 </p>
263 )}
264 {communityRecipes.map(recipe => (
265 <RecipeItem
266 key={recipe.id}
267 recipe={recipe}
268 onClick={() => showAddServiceInterface({ recipeId: recipe.id })}
269 />
270 ))}
271 </div>
272 </PremiumFeatureContainer>
273 {recipeFilter === 'dev' && devRecipes.length > 0 && (
274 <div className={classes.devRecipeList}>
275 <H3>{intl.formatMessage(messages.headlineDevRecipes)}</H3>
276 <div className="recipes__list">
277 {devRecipes.map(recipe => (
278 <RecipeItem
279 key={recipe.id}
280 recipe={recipe}
281 onClick={() => showAddServiceInterface({ recipeId: recipe.id })}
282 />
283 ))}
284 </div>
285 </div>
157 )} 286 )}
158 {recipes.map(recipe => ( 287 </>
159 <RecipeItem
160 key={recipe.id}
161 recipe={recipe}
162 onClick={() => showAddServiceInterface({ recipeId: recipe.id })}
163 />
164 ))}
165 </div>
166 )} 288 )}
167 </div> 289 </div>
168 </div> 290 </div>
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index 711b571e2..5fe00cb8b 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -17,6 +17,8 @@ import ImageUpload from '../../ui/ImageUpload';
17import Select from '../../ui/Select'; 17import Select from '../../ui/Select';
18 18
19import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; 19import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
20import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
21import { serviceLimitStore } from '../../../features/serviceLimit';
20 22
21const messages = defineMessages({ 23const messages = defineMessages({
22 saveService: { 24 saveService: {
@@ -128,8 +130,8 @@ export default @observer class EditServiceForm extends Component {
128 isSaving: PropTypes.bool.isRequired, 130 isSaving: PropTypes.bool.isRequired,
129 isDeleting: PropTypes.bool.isRequired, 131 isDeleting: PropTypes.bool.isRequired,
130 isProxyFeatureEnabled: PropTypes.bool.isRequired, 132 isProxyFeatureEnabled: PropTypes.bool.isRequired,
131 isProxyPremiumFeature: PropTypes.bool.isRequired, 133 isServiceProxyIncludedInCurrentPlan: PropTypes.bool.isRequired,
132 isSpellcheckerPremiumFeature: PropTypes.bool.isRequired, 134 isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired,
133 }; 135 };
134 136
135 static defaultProps = { 137 static defaultProps = {
@@ -192,8 +194,8 @@ export default @observer class EditServiceForm extends Component {
192 isDeleting, 194 isDeleting,
193 onDelete, 195 onDelete,
194 isProxyFeatureEnabled, 196 isProxyFeatureEnabled,
195 isProxyPremiumFeature, 197 isServiceProxyIncludedInCurrentPlan,
196 isSpellcheckerPremiumFeature, 198 isSpellcheckerIncludedInCurrentPlan,
197 } = this.props; 199 } = this.props;
198 const { intl } = this.context; 200 const { intl } = this.context;
199 201
@@ -252,6 +254,7 @@ export default @observer class EditServiceForm extends Component {
252 )} 254 )}
253 </span> 255 </span>
254 </div> 256 </div>
257 <LimitReachedInfobox />
255 <div className="settings__body"> 258 <div className="settings__body">
256 <form onSubmit={e => this.submit(e)} id="form"> 259 <form onSubmit={e => this.submit(e)} id="form">
257 <div className="service-name"> 260 <div className="service-name">
@@ -342,7 +345,7 @@ export default @observer class EditServiceForm extends Component {
342 </div> 345 </div>
343 346
344 <PremiumFeatureContainer 347 <PremiumFeatureContainer
345 condition={isSpellcheckerPremiumFeature} 348 condition={!isSpellcheckerIncludedInCurrentPlan}
346 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 349 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }}
347 > 350 >
348 <div className="settings__settings-group"> 351 <div className="settings__settings-group">
@@ -352,7 +355,7 @@ export default @observer class EditServiceForm extends Component {
352 355
353 {isProxyFeatureEnabled && ( 356 {isProxyFeatureEnabled && (
354 <PremiumFeatureContainer 357 <PremiumFeatureContainer
355 condition={isProxyPremiumFeature} 358 condition={!isServiceProxyIncludedInCurrentPlan}
356 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'proxy' }} 359 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'proxy' }}
357 > 360 >
358 <div className="settings__settings-group"> 361 <div className="settings__settings-group">
@@ -418,7 +421,7 @@ export default @observer class EditServiceForm extends Component {
418 type="submit" 421 type="submit"
419 label={intl.formatMessage(messages.saveService)} 422 label={intl.formatMessage(messages.saveService)}
420 htmlForm="form" 423 htmlForm="form"
421 disabled={action !== 'edit' && form.isPristine && requiresUserInput} 424 disabled={action !== 'edit' && ((form.isPristine && requiresUserInput) || serviceLimitStore.userHasReachedServiceLimit)}
422 /> 425 />
423 )} 426 )}
424 </div> 427 </div>
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js
index 53bae12df..78038e86a 100644
--- a/src/components/settings/services/ServicesDashboard.js
+++ b/src/components/settings/services/ServicesDashboard.js
@@ -9,6 +9,7 @@ import Infobox from '../../ui/Infobox';
9import Loader from '../../ui/Loader'; 9import Loader from '../../ui/Loader';
10import ServiceItem from './ServiceItem'; 10import ServiceItem from './ServiceItem';
11import Appear from '../../ui/effects/Appear'; 11import Appear from '../../ui/effects/Appear';
12import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
12 13
13const messages = defineMessages({ 14const messages = defineMessages({
14 headline: { 15 headline: {
@@ -91,6 +92,7 @@ export default @observer class ServicesDashboard extends Component {
91 <div className="settings__header"> 92 <div className="settings__header">
92 <h1>{intl.formatMessage(messages.headline)}</h1> 93 <h1>{intl.formatMessage(messages.headline)}</h1>
93 </div> 94 </div>
95 <LimitReachedInfobox />
94 <div className="settings__body"> 96 <div className="settings__body">
95 {!isLoading && ( 97 {!isLoading && (
96 <SearchInput 98 <SearchInput
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 660c3c109..19333fdff 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -105,7 +105,8 @@ export default @observer class EditSettingsForm extends Component {
105 isClearingAllCache: PropTypes.bool.isRequired, 105 isClearingAllCache: PropTypes.bool.isRequired,
106 onClearAllCache: PropTypes.func.isRequired, 106 onClearAllCache: PropTypes.func.isRequired,
107 cacheSize: PropTypes.string.isRequired, 107 cacheSize: PropTypes.string.isRequired,
108 isSpellcheckerPremiumFeature: PropTypes.bool.isRequired, 108 isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired,
109 isTodosEnabled: PropTypes.bool.isRequired,
109 }; 110 };
110 111
111 static contextTypes = { 112 static contextTypes = {
@@ -135,7 +136,8 @@ export default @observer class EditSettingsForm extends Component {
135 isClearingAllCache, 136 isClearingAllCache,
136 onClearAllCache, 137 onClearAllCache,
137 cacheSize, 138 cacheSize,
138 isSpellcheckerPremiumFeature, 139 isSpellcheckerIncludedInCurrentPlan,
140 isTodosEnabled,
139 } = this.props; 141 } = this.props;
140 const { intl } = this.context; 142 const { intl } = this.context;
141 143
@@ -178,6 +180,9 @@ export default @observer class EditSettingsForm extends Component {
178 { isLoggedIn && ( 180 { isLoggedIn && (
179 <p>{ intl.formatMessage(messages.serverInfo) }</p> 181 <p>{ intl.formatMessage(messages.serverInfo) }</p>
180 )} 182 )}
183 {isTodosEnabled && (
184 <Toggle field={form.$('enableTodos')} />
185 )}
181 186
182 {/* Appearance */} 187 {/* Appearance */}
183 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2> 188 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2>
@@ -189,7 +194,7 @@ export default @observer class EditSettingsForm extends Component {
189 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2> 194 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2>
190 <Select field={form.$('locale')} showLabel={false} /> 195 <Select field={form.$('locale')} showLabel={false} />
191 <PremiumFeatureContainer 196 <PremiumFeatureContainer
192 condition={isSpellcheckerPremiumFeature} 197 condition={!isSpellcheckerIncludedInCurrentPlan}
193 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 198 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }}
194 > 199 >
195 <Fragment> 200 <Fragment>
diff --git a/src/components/settings/team/TeamDashboard.js b/src/components/settings/team/TeamDashboard.js
index 05c942a11..2bf46b48d 100644
--- a/src/components/settings/team/TeamDashboard.js
+++ b/src/components/settings/team/TeamDashboard.js
@@ -4,11 +4,14 @@ import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import ReactTooltip from 'react-tooltip'; 5import ReactTooltip from 'react-tooltip';
6import injectSheet from 'react-jss'; 6import injectSheet from 'react-jss';
7import classnames from 'classnames';
7 8
9import { Badge } from '@meetfranz/ui';
8import Loader from '../../ui/Loader'; 10import Loader from '../../ui/Loader';
9import Button from '../../ui/Button'; 11import Button from '../../ui/Button';
10import Infobox from '../../ui/Infobox'; 12import Infobox from '../../ui/Infobox';
11import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; 13import globalMessages from '../../../i18n/globalMessages';
14import UpgradeButton from '../../ui/UpgradeButton';
12 15
13const messages = defineMessages({ 16const messages = defineMessages({
14 headline: { 17 headline: {
@@ -40,6 +43,7 @@ const messages = defineMessages({
40const styles = { 43const styles = {
41 cta: { 44 cta: {
42 margin: [40, 'auto'], 45 margin: [40, 'auto'],
46 height: 'auto',
43 }, 47 },
44 container: { 48 container: {
45 display: 'flex', 49 display: 'flex',
@@ -69,6 +73,20 @@ const styles = {
69 order: 1, 73 order: 1,
70 }, 74 },
71 }, 75 },
76 headline: {
77 marginBottom: 0,
78 },
79 headlineWithSpacing: {
80 marginBottom: 'inherit',
81 },
82 proRequired: {
83 margin: [10, 0, 40],
84 height: 'auto',
85 },
86 buttonContainer: {
87 display: 'flex',
88 height: 'auto',
89 },
72}; 90};
73 91
74 92
@@ -79,6 +97,7 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
79 retryUserInfoRequest: PropTypes.func.isRequired, 97 retryUserInfoRequest: PropTypes.func.isRequired,
80 openTeamManagement: PropTypes.func.isRequired, 98 openTeamManagement: PropTypes.func.isRequired,
81 classes: PropTypes.object.isRequired, 99 classes: PropTypes.object.isRequired,
100 isProUser: PropTypes.bool.isRequired,
82 }; 101 };
83 102
84 static contextTypes = { 103 static contextTypes = {
@@ -91,6 +110,7 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
91 userInfoRequestFailed, 110 userInfoRequestFailed,
92 retryUserInfoRequest, 111 retryUserInfoRequest,
93 openTeamManagement, 112 openTeamManagement,
113 isProUser,
94 classes, 114 classes,
95 } = this.props; 115 } = this.props;
96 const { intl } = this.context; 116 const { intl } = this.context;
@@ -123,23 +143,42 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
123 <> 143 <>
124 {!isLoading && ( 144 {!isLoading && (
125 <> 145 <>
126 <PremiumFeatureContainer> 146 <>
127 <> 147 <h1 className={classnames({
128 <h1>{intl.formatMessage(messages.contentHeadline)}</h1> 148 [classes.headline]: true,
129 <div className={classes.container}> 149 [classes.headlineWithSpacing]: isProUser,
130 <div className={classes.content}> 150 })}
131 <p>{intl.formatMessage(messages.intro)}</p> 151 >
132 <p>{intl.formatMessage(messages.copy)}</p> 152 {intl.formatMessage(messages.contentHeadline)}
133 </div> 153
134 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Ferdi for Teams" /> 154 </h1>
155 {!isProUser && (
156 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge>
157 )}
158 <div className={classes.container}>
159 <div className={classes.content}>
160 <p>{intl.formatMessage(messages.intro)}</p>
161 <p>{intl.formatMessage(messages.copy)}</p>
135 </div> 162 </div>
136 <Button 163 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Franz for Teams" />
137 label={intl.formatMessage(messages.manageButton)} 164 </div>
138 onClick={openTeamManagement} 165 <div className={classes.buttonContainer}>
139 className={classes.cta} 166 {!isProUser ? (
140 /> 167 <UpgradeButton
141 </> 168 className={classes.cta}
142 </PremiumFeatureContainer> 169 gaEventInfo={{ category: 'Todos', event: 'upgrade' }}
170 requiresPro
171 short
172 />
173 ) : (
174 <Button
175 label={intl.formatMessage(messages.manageButton)}
176 onClick={openTeamManagement}
177 className={classes.cta}
178 />
179 )}
180 </div>
181 </>
143 </> 182 </>
144 )} 183 )}
145 </> 184 </>
diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js
index 8c7dceece..cdfbbe60d 100644
--- a/src/components/subscription/SubscriptionForm.js
+++ b/src/components/subscription/SubscriptionForm.js
@@ -1,214 +1,78 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
5 6
6import Form from '../../lib/Form'; 7import { H3, H2 } from '@meetfranz/ui';
7import Radio from '../ui/Radio';
8import Button from '../ui/Button';
9import Loader from '../ui/Loader';
10 8
11import { required } from '../../helpers/validation-helpers'; 9import { Button } from '@meetfranz/forms';
10import { FeatureList } from '../ui/FeatureList';
12 11
13const messages = defineMessages({ 12const messages = defineMessages({
14 submitButtonLabel: { 13 submitButtonLabel: {
15 id: 'subscription.submit.label', 14 id: 'subscription.cta.choosePlan',
16 defaultMessage: '!!!Support the development of Franz', 15 defaultMessage: '!!!Choose your plan',
17 }, 16 },
18 paymentSessionError: { 17 teaserHeadline: {
19 id: 'subscription.paymentSessionError', 18 id: 'settings.account.headlineUpgradeAccount',
20 defaultMessage: '!!!Could not initialize payment form', 19 defaultMessage: '!!!Upgrade your account and get the full Franz experience',
21 }, 20 },
22 typeFree: { 21 teaserText: {
23 id: 'subscription.type.free', 22 id: 'subscription.teaser.intro',
24 defaultMessage: '!!!free', 23 defaultMessage: '!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!',
25 },
26 typeMonthly: {
27 id: 'subscription.type.month',
28 defaultMessage: '!!!month',
29 },
30 typeYearly: {
31 id: 'subscription.type.year',
32 defaultMessage: '!!!year',
33 }, 24 },
34 includedFeatures: { 25 includedFeatures: {
35 id: 'subscription.includedFeatures', 26 id: 'subscription.teaser.includedFeatures',
36 defaultMessage: '!!!The Ferdi Premium Supporter Account includes', 27 defaultMessage: '!!!Paid Franz Plans include:',
37 },
38 onpremise: {
39 id: 'subscription.features.onpremise.mattermost',
40 defaultMessage: '!!!Add on-premise/hosted services like Mattermost',
41 },
42 noInterruptions: {
43 id: 'subscription.features.noInterruptions',
44 defaultMessage: '!!!No app delays & nagging to upgrade license',
45 },
46 proxy: {
47 id: 'subscription.features.proxy',
48 defaultMessage: '!!!Proxy support for services',
49 },
50 spellchecker: {
51 id: 'subscription.features.spellchecker',
52 defaultMessage: '!!!Support for Spellchecker',
53 }, 28 },
54 workspaces: { 29});
55 id: 'subscription.features.workspaces', 30
56 defaultMessage: '!!!Organize your services in workspaces', 31const styles = () => ({
57 }, 32 activateTrialButton: {
58 ads: { 33 margin: [40, 0, 50],
59 id: 'subscription.features.ads',
60 defaultMessage: '!!!No ads, ever!',
61 },
62 comingSoon: {
63 id: 'subscription.features.comingSoon',
64 defaultMessage: '!!!coming soon',
65 },
66 euTaxInfo: {
67 id: 'subscription.euTaxInfo',
68 defaultMessage: '!!!EU residents: local sales tax may apply',
69 }, 34 },
70}); 35});
71 36
72export default @observer class SubscriptionForm extends Component { 37export default @observer @injectSheet(styles) class SubscriptionForm extends Component {
73 static propTypes = { 38 static propTypes = {
74 plan: MobxPropTypes.objectOrObservableObject.isRequired, 39 selectPlan: PropTypes.func.isRequired,
75 isLoading: PropTypes.bool.isRequired, 40 isActivatingTrial: PropTypes.bool.isRequired,
76 handlePayment: PropTypes.func.isRequired, 41 classes: PropTypes.object.isRequired,
77 retryPlanRequest: PropTypes.func.isRequired,
78 isCreatingHostedPage: PropTypes.bool.isRequired,
79 error: PropTypes.bool.isRequired,
80 showSkipOption: PropTypes.bool,
81 skipAction: PropTypes.func,
82 skipButtonLabel: PropTypes.string,
83 hideInfo: PropTypes.bool.isRequired,
84 };
85
86 static defaultProps = {
87 showSkipOption: false,
88 skipAction: () => null,
89 skipButtonLabel: '',
90 }; 42 };
91 43
92 static contextTypes = { 44 static contextTypes = {
93 intl: intlShape, 45 intl: intlShape,
94 }; 46 };
95 47
96 componentWillMount() {
97 this.form = this.prepareForm();
98 }
99
100 prepareForm() {
101 const { intl } = this.context;
102
103 const form = {
104 fields: {
105 paymentTier: {
106 value: 'year',
107 validators: [required],
108 options: [{
109 value: 'month',
110 label: `€ ${Object.hasOwnProperty.call(this.props.plan, 'month')
111 ? `${this.props.plan.month.price} / ${intl.formatMessage(messages.typeMonthly)}`
112 : 'monthly'}`,
113 }, {
114 value: 'year',
115 label: `€ ${Object.hasOwnProperty.call(this.props.plan, 'year')
116 ? `${this.props.plan.year.price} / ${intl.formatMessage(messages.typeYearly)}`
117 : 'yearly'}`,
118 }],
119 },
120 },
121 };
122
123 if (this.props.showSkipOption) {
124 form.fields.paymentTier.options.unshift({
125 value: 'skip',
126 label: `€ 0 / ${intl.formatMessage(messages.typeFree)}`,
127 });
128 }
129
130 return new Form(form, this.context.intl);
131 }
132
133 render() { 48 render() {
134 const { 49 const {
135 isLoading, 50 isActivatingTrial,
136 isCreatingHostedPage, 51 selectPlan,
137 handlePayment, 52 classes,
138 retryPlanRequest,
139 error,
140 showSkipOption,
141 skipAction,
142 skipButtonLabel,
143 hideInfo,
144 } = this.props; 53 } = this.props;
145 const { intl } = this.context; 54 const { intl } = this.context;
146 55
147 if (error) { 56 return (
148 return ( 57 <>
58 <H2>{intl.formatMessage(messages.teaserHeadline)}</H2>
59 <p>{intl.formatMessage(messages.teaserText)}</p>
149 <Button 60 <Button
150 label="Reload" 61 label={intl.formatMessage(messages.submitButtonLabel)}
151 onClick={retryPlanRequest} 62 className={classes.activateTrialButton}
152 isLoaded={!isLoading} 63 busy={isActivatingTrial}
64 onClick={selectPlan}
65 stretch
153 /> 66 />
154 ); 67 <div className="subscription__premium-info">
155 } 68 <H3>
156 69 {intl.formatMessage(messages.includedFeatures)}
157 return ( 70 </H3>
158 <Loader loaded={!isLoading}> 71 <div className="subscription">
159 <Radio field={this.form.$('paymentTier')} showLabel={false} className="paymentTiers" /> 72 <FeatureList />
160 {!hideInfo && (
161 <div className="subscription__premium-info">
162 <p>
163 <strong>{intl.formatMessage(messages.includedFeatures)}</strong>
164 </p>
165 <div className="subscription">
166 <ul className="subscription__premium-features">
167 <li>{intl.formatMessage(messages.onpremise)}</li>
168 <li>
169 {intl.formatMessage(messages.noInterruptions)}
170 </li>
171 <li>
172 {intl.formatMessage(messages.spellchecker)}
173 </li>
174 <li>
175 {intl.formatMessage(messages.proxy)}
176 </li>
177 <li>
178 {intl.formatMessage(messages.workspaces)}
179 </li>
180 <li>
181 {intl.formatMessage(messages.ads)}
182 </li>
183 </ul>
184 </div>
185 </div> 73 </div>
186 )} 74 </div>
187 <Fragment> 75 </>
188 {error.code === 'no-payment-session' && (
189 <p className="error-message center">{intl.formatMessage(messages.paymentSessionError)}</p>
190 )}
191 </Fragment>
192 {showSkipOption && this.form.$('paymentTier').value === 'skip' ? (
193 <Button
194 label={skipButtonLabel}
195 className="auth__button"
196 onClick={skipAction}
197 />
198 ) : (
199 <Button
200 label={intl.formatMessage(messages.submitButtonLabel)}
201 className="auth__button"
202 loaded={!isCreatingHostedPage}
203 onClick={() => handlePayment(this.form.$('paymentTier').value)}
204 />
205 )}
206 {this.form.$('paymentTier').value !== 'skip' && (
207 <p className="legal">
208 {intl.formatMessage(messages.euTaxInfo)}
209 </p>
210 )}
211 </Loader>
212 ); 76 );
213 } 77 }
214} 78}
diff --git a/src/components/subscription/SubscriptionPopup.js b/src/components/subscription/SubscriptionPopup.js
index 0f6f0260f..12ef8a6e9 100644
--- a/src/components/subscription/SubscriptionPopup.js
+++ b/src/components/subscription/SubscriptionPopup.js
@@ -43,7 +43,7 @@ export default @observer class SubscriptionPopup extends Component {
43 43
44 setTimeout(() => { 44 setTimeout(() => {
45 this.props.closeWindow(); 45 this.props.closeWindow();
46 }, ms('4s')); 46 }, ms('1s'));
47 } 47 }
48 48
49 render() { 49 render() {
@@ -61,8 +61,6 @@ export default @observer class SubscriptionPopup extends Component {
61 autosize 61 autosize
62 src={encodeURI(url)} 62 src={encodeURI(url)}
63 onDidNavigate={completeCheck} 63 onDidNavigate={completeCheck}
64 // onNewWindow={(event, url, frameName, options) =>
65 // openWindow({ event, url, frameName, options })}
66 /> 64 />
67 </div> 65 </div>
68 <div className="subscription-popup__toolbar franz-form"> 66 <div className="subscription-popup__toolbar franz-form">
diff --git a/src/components/subscription/TrialForm.js b/src/components/subscription/TrialForm.js
new file mode 100644
index 000000000..9ed548f16
--- /dev/null
+++ b/src/components/subscription/TrialForm.js
@@ -0,0 +1,115 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { H3, H2 } from '@meetfranz/ui';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureList } from '../ui/FeatureList';
11import { FeatureItem } from '../ui/FeatureItem';
12
13const messages = defineMessages({
14 submitButtonLabel: {
15 id: 'subscription.cta.activateTrial',
16 defaultMessage: '!!!Yes, start the free Franz Professional trial',
17 },
18 allOptionsButton: {
19 id: 'subscription.cta.allOptions',
20 defaultMessage: '!!!See all options',
21 },
22 teaserHeadline: {
23 id: 'settings.account.headlineTrialUpgrade',
24 defaultMessage: '!!!Get the free 14 day Franz Professional Trial',
25 },
26 includedFeatures: {
27 id: 'subscription.includedProFeatures',
28 defaultMessage: '!!!The Franz Professional Plan includes:',
29 },
30 noStringsAttachedHeadline: {
31 id: 'pricing.trial.terms.headline',
32 defaultMessage: '!!!No strings attached',
33 },
34 noCreditCard: {
35 id: 'pricing.trial.terms.noCreditCard',
36 defaultMessage: '!!!No credit card required',
37 },
38 automaticTrialEnd: {
39 id: 'pricing.trial.terms.automaticTrialEnd',
40 defaultMessage: '!!!Your free trial ends automatically after 14 days',
41 },
42});
43
44const styles = theme => ({
45 activateTrialButton: {
46 margin: [40, 0, 10],
47 },
48 allOptionsButton: {
49 margin: [0, 0, 40],
50 background: 'none',
51 border: 'none',
52 color: theme.colorText,
53 },
54 keyTerms: {
55 marginTop: 20,
56 },
57});
58
59export default @observer @injectSheet(styles) class TrialForm extends Component {
60 static propTypes = {
61 activateTrial: PropTypes.func.isRequired,
62 isActivatingTrial: PropTypes.bool.isRequired,
63 showAllOptions: PropTypes.func.isRequired,
64 classes: PropTypes.object.isRequired,
65 };
66
67 static contextTypes = {
68 intl: intlShape,
69 };
70
71 render() {
72 const {
73 isActivatingTrial,
74 activateTrial,
75 showAllOptions,
76 classes,
77 } = this.props;
78 const { intl } = this.context;
79
80 return (
81 <>
82 <H2>{intl.formatMessage(messages.teaserHeadline)}</H2>
83 <H3 className={classes.keyTerms}>
84 {intl.formatMessage(messages.noStringsAttachedHeadline)}
85 </H3>
86 <ul>
87 <FeatureItem icon="👉" name={intl.formatMessage(messages.noCreditCard)} />
88 <FeatureItem icon="👉" name={intl.formatMessage(messages.automaticTrialEnd)} />
89 </ul>
90
91 <Button
92 label={intl.formatMessage(messages.submitButtonLabel)}
93 className={classes.activateTrialButton}
94 busy={isActivatingTrial}
95 onClick={activateTrial}
96 stretch
97 />
98 <Button
99 label={intl.formatMessage(messages.allOptionsButton)}
100 className={classes.allOptionsButton}
101 onClick={showAllOptions}
102 stretch
103 />
104 <div className="subscription__premium-info">
105 <H3>
106 {intl.formatMessage(messages.includedFeatures)}
107 </H3>
108 <div className="subscription">
109 <FeatureList />
110 </div>
111 </div>
112 </>
113 );
114 }
115}
diff --git a/src/components/ui/ActivateTrialButton/index.js b/src/components/ui/ActivateTrialButton/index.js
new file mode 100644
index 000000000..e0637da90
--- /dev/null
+++ b/src/components/ui/ActivateTrialButton/index.js
@@ -0,0 +1,125 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import classnames from 'classnames';
6
7import { Button } from '@meetfranz/forms';
8import { gaEvent } from '../../../lib/analytics';
9
10import UserStore from '../../../stores/UserStore';
11
12const messages = defineMessages({
13 action: {
14 id: 'feature.delayApp.upgrade.action',
15 defaultMessage: '!!!Get a Franz Supporter License',
16 },
17 actionTrial: {
18 id: 'feature.delayApp.trial.action',
19 defaultMessage: '!!!Yes, I want the free 14 day trial of Franz Professional',
20 },
21 shortAction: {
22 id: 'feature.delayApp.upgrade.actionShort',
23 defaultMessage: '!!!Upgrade account',
24 },
25 shortActionTrial: {
26 id: 'feature.delayApp.trial.actionShort',
27 defaultMessage: '!!!Activate the free Franz Professional trial',
28 },
29 noStringsAttachedHeadline: {
30 id: 'pricing.trial.terms.headline',
31 defaultMessage: '!!!No strings attached',
32 },
33 noCreditCard: {
34 id: 'pricing.trial.terms.noCreditCard',
35 defaultMessage: '!!!No credit card required',
36 },
37 automaticTrialEnd: {
38 id: 'pricing.trial.terms.automaticTrialEnd',
39 defaultMessage: '!!!Your free trial ends automatically after 14 days',
40 },
41});
42
43@inject('stores', 'actions') @observer
44class ActivateTrialButton extends Component {
45 static propTypes = {
46 className: PropTypes.string,
47 short: PropTypes.bool,
48 gaEventInfo: PropTypes.shape({
49 category: PropTypes.string.isRequired,
50 event: PropTypes.string.isRequired,
51 label: PropTypes.string,
52 }),
53 };
54
55 static defaultProps = {
56 className: '',
57 short: false,
58 gaEventInfo: null,
59 }
60
61 static contextTypes = {
62 intl: intlShape,
63 };
64
65 handleCTAClick() {
66 const { actions, stores, gaEventInfo } = this.props;
67 const { hadSubscription } = stores.user.data;
68 // const { defaultTrialPlan } = stores.features.features;
69
70 let label = '';
71 if (!hadSubscription) {
72 // actions.user.activateTrial({ planId: defaultTrialPlan });
73
74 label = 'Start Trial';
75 } else {
76 label = 'Upgrade Account';
77 }
78
79 actions.ui.openSettings({ path: 'user' });
80
81 if (gaEventInfo) {
82 const { category, event } = gaEventInfo;
83 gaEvent(category, event, label);
84 }
85 }
86
87 render() {
88 const { stores, className, short } = this.props;
89 const { intl } = this.context;
90
91 const { hadSubscription } = stores.user.data;
92
93 let label;
94 if (hadSubscription) {
95 label = short ? messages.shortAction : messages.action;
96 } else {
97 label = short ? messages.shortActionTrial : messages.actionTrial;
98 }
99
100 return (
101 <Button
102 label={intl.formatMessage(label)}
103 className={classnames({
104 [className]: className,
105 })}
106 buttonType="inverted"
107 onClick={this.handleCTAClick.bind(this)}
108 busy={stores.user.activateTrialRequest.isExecuting}
109 />
110 );
111 }
112}
113
114export default ActivateTrialButton;
115
116ActivateTrialButton.wrappedComponent.propTypes = {
117 stores: PropTypes.shape({
118 user: PropTypes.instanceOf(UserStore).isRequired,
119 }).isRequired,
120 actions: PropTypes.shape({
121 ui: PropTypes.shape({
122 openSettings: PropTypes.func.isRequired,
123 }).isRequired,
124 }).isRequired,
125};
diff --git a/src/components/ui/FeatureItem.js b/src/components/ui/FeatureItem.js
new file mode 100644
index 000000000..7c482c4d4
--- /dev/null
+++ b/src/components/ui/FeatureItem.js
@@ -0,0 +1,37 @@
1import React from 'react';
2import injectSheet from 'react-jss';
3import { Icon } from '@meetfranz/ui';
4import classnames from 'classnames';
5import { mdiCheckCircle } from '@mdi/js';
6
7const styles = theme => ({
8 featureItem: {
9 borderBottom: [1, 'solid', theme.defaultContentBorder],
10 padding: [8, 0],
11 display: 'flex',
12 alignItems: 'center',
13 },
14 featureIcon: {
15 fill: theme.brandSuccess,
16 marginRight: 10,
17 },
18});
19
20export const FeatureItem = injectSheet(styles)(({
21 classes, className, name, icon,
22}) => (
23 <li className={classnames({
24 [classes.featureItem]: true,
25 [className]: className,
26 })}
27 >
28 {icon ? (
29 <span className={classes.featureIcon}>{icon}</span>
30 ) : (
31 <Icon icon={mdiCheckCircle} className={classes.featureIcon} size={1.5} />
32 )}
33 {name}
34 </li>
35));
36
37export default FeatureItem;
diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js
new file mode 100644
index 000000000..62944ad75
--- /dev/null
+++ b/src/components/ui/FeatureList.js
@@ -0,0 +1,89 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl';
4
5import { FeatureItem } from './FeatureItem';
6
7const messages = defineMessages({
8 unlimitedServices: {
9 id: 'pricing.features.unlimitedServices',
10 defaultMessage: '!!!Add unlimited services',
11 },
12 spellchecker: {
13 id: 'pricing.features.spellchecker',
14 defaultMessage: '!!!Spellchecker support',
15 },
16 workspaces: {
17 id: 'pricing.features.workspaces',
18 defaultMessage: '!!!Workspaces',
19 },
20 customWebsites: {
21 id: 'pricing.features.customWebsites',
22 defaultMessage: '!!!Add Custom Websites',
23 },
24 onPremise: {
25 id: 'pricing.features.onPremise',
26 defaultMessage: '!!!On-premise & other Hosted Services',
27 },
28 thirdPartyServices: {
29 id: 'pricing.features.thirdPartyServices',
30 defaultMessage: '!!!Install 3rd party services',
31 },
32 serviceProxies: {
33 id: 'pricing.features.serviceProxies',
34 defaultMessage: '!!!Service Proxies',
35 },
36 teamManagement: {
37 id: 'pricing.features.teamManagement',
38 defaultMessage: '!!!Team Management',
39 },
40 appDelays: {
41 id: 'pricing.features.appDelays',
42 defaultMessage: '!!!No Waiting Screens',
43 },
44 adFree: {
45 id: 'pricing.features.adFree',
46 defaultMessage: '!!!Forever ad-free',
47 },
48});
49
50export class FeatureList extends Component {
51 static propTypes = {
52 className: PropTypes.string,
53 featureClassName: PropTypes.string,
54 };
55
56 static defaultProps = {
57 className: '',
58 featureClassName: '',
59 }
60
61 static contextTypes = {
62 intl: intlShape,
63 };
64
65 render() {
66 const {
67 className,
68 featureClassName,
69 } = this.props;
70 const { intl } = this.context;
71
72 return (
73 <ul className={className}>
74 <FeatureItem name={intl.formatMessage(messages.unlimitedServices)} className={featureClassName} />
75 <FeatureItem name={intl.formatMessage(messages.spellchecker)} className={featureClassName} />
76 <FeatureItem name={intl.formatMessage(messages.workspaces)} className={featureClassName} />
77 <FeatureItem name={intl.formatMessage(messages.customWebsites)} className={featureClassName} />
78 <FeatureItem name={intl.formatMessage(messages.onPremise)} className={featureClassName} />
79 <FeatureItem name={intl.formatMessage(messages.thirdPartyServices)} className={featureClassName} />
80 <FeatureItem name={intl.formatMessage(messages.serviceProxies)} className={featureClassName} />
81 <FeatureItem name={intl.formatMessage(messages.teamManagement)} className={featureClassName} />
82 <FeatureItem name={intl.formatMessage(messages.appDelays)} className={featureClassName} />
83 <FeatureItem name={intl.formatMessage(messages.adFree)} className={featureClassName} />
84 </ul>
85 );
86 }
87}
88
89export default FeatureList;
diff --git a/src/components/ui/Modal/index.js b/src/components/ui/Modal/index.js
index 0b7154760..63d858c47 100644
--- a/src/components/ui/Modal/index.js
+++ b/src/components/ui/Modal/index.js
@@ -5,6 +5,7 @@ import classnames from 'classnames';
5import injectCSS from 'react-jss'; 5import injectCSS from 'react-jss';
6import { Icon } from '@meetfranz/ui'; 6import { Icon } from '@meetfranz/ui';
7 7
8import { mdiClose } from '@mdi/js';
8import styles from './styles'; 9import styles from './styles';
9 10
10// ReactModal.setAppElement('#root'); 11// ReactModal.setAppElement('#root');
@@ -59,7 +60,7 @@ export default @injectCSS(styles) class Modal extends Component {
59 className={classes.close} 60 className={classes.close}
60 onClick={close} 61 onClick={close}
61 > 62 >
62 <Icon icon="mdiClose" size={1.5} /> 63 <Icon icon={mdiClose} size={1.5} />
63 </button> 64 </button>
64 )} 65 )}
65 <div className={classes.content}> 66 <div className={classes.content}>
diff --git a/src/components/ui/PremiumFeatureContainer/index.js b/src/components/ui/PremiumFeatureContainer/index.js
index b890b09ab..c53d345a0 100644
--- a/src/components/ui/PremiumFeatureContainer/index.js
+++ b/src/components/ui/PremiumFeatureContainer/index.js
@@ -9,6 +9,7 @@ import { oneOrManyChildElements } from '../../../prop-types';
9import UserStore from '../../../stores/UserStore'; 9import UserStore from '../../../stores/UserStore';
10 10
11import styles from './styles'; 11import styles from './styles';
12import { FeatureStore } from '../../../features/utils/FeatureStore';
12 13
13const messages = defineMessages({ 14const messages = defineMessages({
14 action: { 15 action: {
@@ -21,7 +22,10 @@ const messages = defineMessages({
21class PremiumFeatureContainer extends Component { 22class PremiumFeatureContainer extends Component {
22 static propTypes = { 23 static propTypes = {
23 classes: PropTypes.object.isRequired, 24 classes: PropTypes.object.isRequired,
24 condition: PropTypes.bool, 25 condition: PropTypes.oneOfType([
26 PropTypes.bool,
27 PropTypes.func,
28 ]),
25 gaEventInfo: PropTypes.shape({ 29 gaEventInfo: PropTypes.shape({
26 category: PropTypes.string.isRequired, 30 category: PropTypes.string.isRequired,
27 event: PropTypes.string.isRequired, 31 event: PropTypes.string.isRequired,
@@ -30,7 +34,7 @@ class PremiumFeatureContainer extends Component {
30 }; 34 };
31 35
32 static defaultProps = { 36 static defaultProps = {
33 condition: true, 37 condition: null,
34 gaEventInfo: null, 38 gaEventInfo: null,
35 }; 39 };
36 40
@@ -49,7 +53,18 @@ class PremiumFeatureContainer extends Component {
49 53
50 const { intl } = this.context; 54 const { intl } = this.context;
51 55
52 return !stores.user.data.isPremium && !!condition ? ( 56 let showWrapper = !!condition;
57
58 if (condition === null) {
59 showWrapper = !stores.user.data.isPremium;
60 } else if (typeof condition === 'function') {
61 showWrapper = condition({
62 isPremium: stores.user.data.isPremium,
63 features: stores.features.features,
64 });
65 }
66
67 return showWrapper ? (
53 <div className={classes.container}> 68 <div className={classes.container}>
54 <div className={classes.titleContainer}> 69 <div className={classes.titleContainer}>
55 <p className={classes.title}>Premium Feature</p> 70 <p className={classes.title}>Premium Feature</p>
@@ -75,6 +90,7 @@ PremiumFeatureContainer.wrappedComponent.propTypes = {
75 children: oneOrManyChildElements.isRequired, 90 children: oneOrManyChildElements.isRequired,
76 stores: PropTypes.shape({ 91 stores: PropTypes.shape({
77 user: PropTypes.instanceOf(UserStore).isRequired, 92 user: PropTypes.instanceOf(UserStore).isRequired,
93 features: PropTypes.instanceOf(FeatureStore).isRequired,
78 }).isRequired, 94 }).isRequired,
79 actions: PropTypes.shape({ 95 actions: PropTypes.shape({
80 ui: PropTypes.shape({ 96 ui: PropTypes.shape({
diff --git a/src/components/ui/UpgradeButton/index.js b/src/components/ui/UpgradeButton/index.js
new file mode 100644
index 000000000..73762f0bf
--- /dev/null
+++ b/src/components/ui/UpgradeButton/index.js
@@ -0,0 +1,89 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import { Button } from '@meetfranz/forms';
7import { gaEvent } from '../../../lib/analytics';
8
9import UserStore from '../../../stores/UserStore';
10import ActivateTrialButton from '../ActivateTrialButton';
11
12const messages = defineMessages({
13 upgradeToPro: {
14 id: 'global.upgradeButton.upgradeToPro',
15 defaultMessage: '!!!Upgrade to Franz Professional',
16 },
17});
18
19@inject('stores', 'actions') @observer
20class UpgradeButton extends Component {
21 static propTypes = {
22 // eslint-disable-next-line
23 classes: PropTypes.object.isRequired,
24 className: PropTypes.string,
25 gaEventInfo: PropTypes.shape({
26 category: PropTypes.string.isRequired,
27 event: PropTypes.string.isRequired,
28 label: PropTypes.string,
29 }),
30 requiresPro: PropTypes.bool,
31 };
32
33 static defaultProps = {
34 className: '',
35 gaEventInfo: null,
36 requiresPro: false,
37 }
38
39 static contextTypes = {
40 intl: intlShape,
41 };
42
43 handleCTAClick() {
44 const { actions, gaEventInfo } = this.props;
45
46 actions.ui.openSettings({ path: 'user' });
47 if (gaEventInfo) {
48 const { category, event } = gaEventInfo;
49 gaEvent(category, event, 'Upgrade Account');
50 }
51 }
52
53 render() {
54 const { stores, requiresPro } = this.props;
55 const { intl } = this.context;
56
57 const { isPremium, isPersonal } = stores.user;
58
59 if (isPremium && isPersonal && requiresPro) {
60 return (
61 <Button
62 label={intl.formatMessage(messages.upgradeToPro)}
63 onClick={this.handleCTAClick.bind(this)}
64 className={this.props.className}
65 buttonType="inverted"
66 />
67 );
68 }
69
70 if (!isPremium) {
71 return <ActivateTrialButton {...this.props} />;
72 }
73
74 return null;
75 }
76}
77
78export default UpgradeButton;
79
80UpgradeButton.wrappedComponent.propTypes = {
81 stores: PropTypes.shape({
82 user: PropTypes.instanceOf(UserStore).isRequired,
83 }).isRequired,
84 actions: PropTypes.shape({
85 ui: PropTypes.shape({
86 openSettings: PropTypes.func.isRequired,
87 }).isRequired,
88 }).isRequired,
89};
diff --git a/src/config.js b/src/config.js
index 2d6e74411..d6a0317bf 100644
--- a/src/config.js
+++ b/src/config.js
@@ -19,11 +19,16 @@ export const DEV_WS_API = 'wss://dev.franzinfra.com';
19export const LIVE_WS_API = 'wss://api.franzinfra.com'; 19export const LIVE_WS_API = 'wss://api.franzinfra.com';
20 20
21export const LOCAL_API_WEBSITE = 'http://localhost:3333'; 21export const LOCAL_API_WEBSITE = 'http://localhost:3333';
22export const DEV_API_WEBSITE = 'https://meetfranz.com'; 22// export const DEV_API_WEBSITE = 'https://meetfranz.com';t
23export const DEV_API_WEBSITE = 'http://hash-58883791519ef6288c952316bdce7fb462283893.franzstaging.com/'; // TODO: revert me
23export const LIVE_API_WEBSITE = 'https://meetfranz.com'; 24export const LIVE_API_WEBSITE = 'https://meetfranz.com';
24 25
25export const STATS_API = 'https://stats.franzinfra.com'; 26export const STATS_API = 'https://stats.franzinfra.com';
26 27
28export const LOCAL_TODOS_FRONTEND_URL = 'http://localhost:4000';
29export const PRODUCTION_TODOS_FRONTEND_URL = 'https://app.franztodos.com';
30export const DEVELOPMENT_TODOS_FRONTEND_URL = 'https://development--franz-todos.netlify.com';
31
27export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12'; 32export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12';
28 33
29export const DEFAULT_APP_SETTINGS = { 34export const DEFAULT_APP_SETTINGS = {
@@ -46,16 +51,16 @@ export const DEFAULT_APP_SETTINGS = {
46}; 51};
47 52
48export const DEFAULT_FEATURES_CONFIG = { 53export const DEFAULT_FEATURES_CONFIG = {
49 isSpellcheckerPremiumFeature: false, 54 isSpellcheckerIncludedInCurrentPlan: true,
50 needToWaitToProceed: false, 55 needToWaitToProceed: false,
51 needToWaitToProceedConfig: { 56 needToWaitToProceedConfig: {
52 delayOffset: ms('1h'), 57 delayOffset: ms('1h'),
53 wait: ms('10s'), 58 wait: ms('10s'),
54 }, 59 },
55 isServiceProxyEnabled: false, 60 isServiceProxyEnabled: false,
56 isServiceProxyPremiumFeature: true, 61 isServiceProxyIncludedInCurrentPlan: false,
57 isAnnouncementsEnabled: true, 62 isAnnouncementsEnabled: true,
58 isWorkspacePremiumFeature: true, 63 isWorkspaceIncludedInCurrentPlan: true,
59 isWorkspaceEnabled: false, 64 isWorkspaceEnabled: false,
60}; 65};
61 66
@@ -68,6 +73,7 @@ export const DEFAULT_WINDOW_OPTIONS = {
68 73
69export const FRANZ_SERVICE_REQUEST = 'https://bit.ly/franz-plugin-docs'; 74export const FRANZ_SERVICE_REQUEST = 'https://bit.ly/franz-plugin-docs';
70export const FRANZ_TRANSLATION = 'https://bit.ly/franz-translate'; 75export const FRANZ_TRANSLATION = 'https://bit.ly/franz-translate';
76export const FRANZ_DEV_DOCS = 'http://bit.ly/franz-dev-hub';
71 77
72export const FILE_SYSTEM_SETTINGS_TYPES = [ 78export const FILE_SYSTEM_SETTINGS_TYPES = [
73 'app', 79 'app',
@@ -84,3 +90,25 @@ export const ALLOWED_PROTOCOLS = [
84 'http:', 90 'http:',
85 'ftp:', 91 'ftp:',
86]; 92];
93
94export const PLANS = {
95 PERSONAL: 'PERSONAL',
96 PRO: 'PRO',
97 LEGACY: 'LEGACY',
98 FREE: 'FREE',
99};
100
101export const PLANS_MAPPING = {
102 'franz-personal-monthly': PLANS.PERSONAL,
103 'franz-personal-yearly': PLANS.PERSONAL,
104 'franz-pro-monthly': PLANS.PRO,
105 'franz-pro-yearly': PLANS.PRO,
106 'franz-supporter-license': PLANS.LEGACY,
107 'franz-supporter-license-x1': PLANS.LEGACY,
108 'franz-supporter-license-x2': PLANS.LEGACY,
109 'franz-supporter-license-year': PLANS.LEGACY,
110 'franz-supporter-license-year-x1': PLANS.LEGACY,
111 'franz-supporter-license-year-x2': PLANS.LEGACY,
112 'franz-supporter-license-year-2019': PLANS.LEGACY,
113 free: PLANS.FREE,
114};
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js
index 8d179a170..af1651931 100644
--- a/src/containers/auth/PricingScreen.js
+++ b/src/containers/auth/PricingScreen.js
@@ -5,7 +5,6 @@ import { RouterStore } from 'mobx-react-router';
5 5
6import Pricing from '../../components/auth/Pricing'; 6import Pricing from '../../components/auth/Pricing';
7import UserStore from '../../stores/UserStore'; 7import UserStore from '../../stores/UserStore';
8import PaymentStore from '../../stores/PaymentStore';
9 8
10import { globalError as globalErrorPropType } from '../../prop-types'; 9import { globalError as globalErrorPropType } from '../../prop-types';
11 10
@@ -14,20 +13,40 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend
14 error: globalErrorPropType.isRequired, 13 error: globalErrorPropType.isRequired,
15 }; 14 };
16 15
16 async submit() {
17 const {
18 actions,
19 stores,
20 } = this.props;
21
22 const { activateTrialRequest } = stores.user;
23 const { defaultTrialPlan } = stores.features.features;
24
25 actions.user.activateTrial({ planId: defaultTrialPlan });
26 await activateTrialRequest._promise;
27
28 if (!activateTrialRequest.isError) {
29 stores.router.push('/');
30 stores.user.hasCompletedSignup = true;
31 }
32 }
33
17 render() { 34 render() {
18 const { actions, stores, error } = this.props; 35 const {
36 error,
37 stores,
38 } = this.props;
19 39
20 const nextStepRoute = stores.user.legacyServices.length ? stores.user.importRoute : stores.user.inviteRoute; 40 const { getUserInfoRequest, activateTrialRequest } = stores.user;
41 const { featuresRequest } = stores.features;
21 42
22 return ( 43 return (
23 <Pricing 44 <Pricing
24 donor={stores.user.data.donor || {}} 45 onSubmit={this.submit.bind(this)}
25 onSubmit={actions.user.signup} 46 isLoadingRequiredData={(getUserInfoRequest.isExecuting || !getUserInfoRequest.wasExecuted) || (featuresRequest.isExecuting || !featuresRequest.wasExecuted)}
26 onCloseSubscriptionWindow={() => this.props.stores.router.push(nextStepRoute)} 47 isActivatingTrial={activateTrialRequest.isExecuting}
27 isLoading={stores.payment.plansRequest.isExecuting} 48 trialActivationError={activateTrialRequest.isError}
28 isLoadingUser={stores.user.getUserInfoRequest.isExecuting}
29 error={error} 49 error={error}
30 skipAction={() => this.props.stores.router.push(nextStepRoute)}
31 /> 50 />
32 ); 51 );
33 } 52 }
@@ -36,12 +55,11 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend
36PricingScreen.wrappedComponent.propTypes = { 55PricingScreen.wrappedComponent.propTypes = {
37 actions: PropTypes.shape({ 56 actions: PropTypes.shape({
38 user: PropTypes.shape({ 57 user: PropTypes.shape({
39 signup: PropTypes.func.isRequired, 58 activateTrial: PropTypes.func.isRequired,
40 }).isRequired, 59 }).isRequired,
41 }).isRequired, 60 }).isRequired,
42 stores: PropTypes.shape({ 61 stores: PropTypes.shape({
43 user: PropTypes.instanceOf(UserStore).isRequired, 62 user: PropTypes.instanceOf(UserStore).isRequired,
44 payment: PropTypes.instanceOf(PaymentStore).isRequired,
45 router: PropTypes.instanceOf(RouterStore).isRequired, 63 router: PropTypes.instanceOf(RouterStore).isRequired,
46 }).isRequired, 64 }).isRequired,
47}; 65};
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index 38ed85986..95fbd109f 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -10,6 +10,7 @@ import FeaturesStore from '../../stores/FeaturesStore';
10import UIStore from '../../stores/UIStore'; 10import UIStore from '../../stores/UIStore';
11import NewsStore from '../../stores/NewsStore'; 11import NewsStore from '../../stores/NewsStore';
12import SettingsStore from '../../stores/SettingsStore'; 12import SettingsStore from '../../stores/SettingsStore';
13import UserStore from '../../stores/UserStore';
13import RequestStore from '../../stores/RequestStore'; 14import RequestStore from '../../stores/RequestStore';
14import GlobalErrorStore from '../../stores/GlobalErrorStore'; 15import GlobalErrorStore from '../../stores/GlobalErrorStore';
15 16
@@ -39,6 +40,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
39 settings, 40 settings,
40 globalError, 41 globalError,
41 requests, 42 requests,
43 user,
42 } = this.props.stores; 44 } = this.props.stores;
43 45
44 const { 46 const {
@@ -125,6 +127,8 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
125 reload={reload} 127 reload={reload}
126 openSettings={openSettings} 128 openSettings={openSettings}
127 update={updateService} 129 update={updateService}
130 userHasCompletedSignup={user.hasCompletedSignup}
131 hasActivatedTrial={user.hasActivatedTrial}
128 /> 132 />
129 ); 133 );
130 134
@@ -150,6 +154,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
150 retryRequiredRequests={retryRequiredRequests} 154 retryRequiredRequests={retryRequiredRequests}
151 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 155 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
152 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} 156 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
157 hasActivatedTrial={user.hasActivatedTrial}
153 > 158 >
154 {React.Children.count(children) > 0 ? children : null} 159 {React.Children.count(children) > 0 ? children : null}
155 </AppLayout> 160 </AppLayout>
@@ -167,6 +172,7 @@ AppLayoutContainer.wrappedComponent.propTypes = {
167 ui: PropTypes.instanceOf(UIStore).isRequired, 172 ui: PropTypes.instanceOf(UIStore).isRequired,
168 news: PropTypes.instanceOf(NewsStore).isRequired, 173 news: PropTypes.instanceOf(NewsStore).isRequired,
169 settings: PropTypes.instanceOf(SettingsStore).isRequired, 174 settings: PropTypes.instanceOf(SettingsStore).isRequired,
175 user: PropTypes.instanceOf(UserStore).isRequired,
170 requests: PropTypes.instanceOf(RequestStore).isRequired, 176 requests: PropTypes.instanceOf(RequestStore).isRequired,
171 globalError: PropTypes.instanceOf(GlobalErrorStore).isRequired, 177 globalError: PropTypes.instanceOf(GlobalErrorStore).isRequired,
172 }).isRequired, 178 }).isRequired,
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index fd3317301..41cdeb79a 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -30,7 +30,7 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
30 30
31 let url; 31 let url;
32 if (api === 'https://api.franzinfra.com') { 32 if (api === 'https://api.franzinfra.com') {
33 url = `${WEBSITE}${route}?authToken=${stores.user.authToken}&utm_source=app&utm_medium=account_dashboard`; 33 url = stores.user.getAuthURL(`${WEBSITE}${route}?utm_source=app&utm_medium=account_dashboard`);
34 } else { 34 } else {
35 url = `${api}${route}`; 35 url = `${api}${route}`;
36 } 36 }
@@ -49,6 +49,8 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
49 <ErrorBoundary> 49 <ErrorBoundary>
50 <AccountDashboard 50 <AccountDashboard
51 user={user.data} 51 user={user.data}
52 isPremiumOverrideUser={user.isPremiumOverride}
53 isProUser={user.isPro}
52 isLoading={isLoadingUserInfo} 54 isLoading={isLoadingUserInfo}
53 isLoadingPlans={isLoadingPlans} 55 isLoadingPlans={isLoadingPlans}
54 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 56 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError}
@@ -58,6 +60,7 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
58 isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting} 60 isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting}
59 isDeleteAccountSuccessful={user.deleteAccountRequest.wasExecuted && !user.deleteAccountRequest.isError} 61 isDeleteAccountSuccessful={user.deleteAccountRequest.wasExecuted && !user.deleteAccountRequest.isError}
60 openEditAccount={() => this.handleWebsiteLink('/user/profile')} 62 openEditAccount={() => this.handleWebsiteLink('/user/profile')}
63 upgradeToPro={() => this.handleWebsiteLink('/inapp/user/licenses')}
61 openBilling={() => this.handleWebsiteLink('/user/billing')} 64 openBilling={() => this.handleWebsiteLink('/user/billing')}
62 openInvoices={() => this.handleWebsiteLink('/user/invoices')} 65 openInvoices={() => this.handleWebsiteLink('/user/invoices')}
63 /> 66 />
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js
index 870ca4ecd..e4ff03bb3 100644
--- a/src/containers/settings/EditServiceScreen.js
+++ b/src/containers/settings/EditServiceScreen.js
@@ -330,8 +330,8 @@ export default @inject('stores', 'actions') @observer class EditServiceScreen ex
330 onSubmit={d => this.onSubmit(d)} 330 onSubmit={d => this.onSubmit(d)}
331 onDelete={() => this.deleteService()} 331 onDelete={() => this.deleteService()}
332 isProxyFeatureEnabled={proxyFeature.isEnabled} 332 isProxyFeatureEnabled={proxyFeature.isEnabled}
333 isProxyPremiumFeature={proxyFeature.isPremium} 333 isServiceProxyIncludedInCurrentPlan={proxyFeature.isIncludedInCurrentPlan}
334 isSpellcheckerPremiumFeature={spellcheckerFeature.isPremium} 334 isSpellcheckerIncludedInCurrentPlan={spellcheckerFeature.isIncludedInCurrentPlan}
335 /> 335 />
336 </ErrorBoundary> 336 </ErrorBoundary>
337 ); 337 );
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 38f73c20f..954f64dc6 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -6,6 +6,7 @@ import { defineMessages, intlShape } from 'react-intl';
6import AppStore from '../../stores/AppStore'; 6import AppStore from '../../stores/AppStore';
7import SettingsStore from '../../stores/SettingsStore'; 7import SettingsStore from '../../stores/SettingsStore';
8import UserStore from '../../stores/UserStore'; 8import UserStore from '../../stores/UserStore';
9import TodosStore from '../../features/todos/store';
9import Form from '../../lib/Form'; 10import Form from '../../lib/Form';
10import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages'; 11import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages';
11import { DEFAULT_APP_SETTINGS } from '../../config'; 12import { DEFAULT_APP_SETTINGS } from '../../config';
@@ -19,6 +20,7 @@ import ErrorBoundary from '../../components/util/ErrorBoundary';
19import { API } from '../../environment'; 20import { API } from '../../environment';
20 21
21import globalMessages from '../../i18n/globalMessages'; 22import globalMessages from '../../i18n/globalMessages';
23import { DEFAULT_IS_FEATURE_ENABLED_BY_USER } from '../../features/todos';
22 24
23const messages = defineMessages({ 25const messages = defineMessages({
24 autoLaunchOnStart: { 26 autoLaunchOnStart: {
@@ -73,6 +75,10 @@ const messages = defineMessages({
73 id: 'settings.app.form.beta', 75 id: 'settings.app.form.beta',
74 defaultMessage: '!!!Include beta versions', 76 defaultMessage: '!!!Include beta versions',
75 }, 77 },
78 enableTodos: {
79 id: 'settings.app.form.enableTodos',
80 defaultMessage: '!!!Enable Franz Todos',
81 },
76}); 82});
77 83
78export default @inject('stores', 'actions') @observer class EditSettingsScreen extends Component { 84export default @inject('stores', 'actions') @observer class EditSettingsScreen extends Component {
@@ -81,7 +87,13 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
81 }; 87 };
82 88
83 onSubmit(settingsData) { 89 onSubmit(settingsData) {
84 const { app, settings, user } = this.props.actions; 90 const { todos } = this.props.stores;
91 const {
92 app,
93 settings,
94 user,
95 todos: todosActions,
96 } = this.props.actions;
85 97
86 app.launchOnStartup({ 98 app.launchOnStartup({
87 enable: settingsData.autoLaunchOnStart, 99 enable: settingsData.autoLaunchOnStart,
@@ -112,10 +124,16 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
112 locale: settingsData.locale, 124 locale: settingsData.locale,
113 }, 125 },
114 }); 126 });
127
128 if (todos.isFeatureActive) {
129 todosActions.toggleTodosFeatureVisibility();
130 }
115 } 131 }
116 132
117 prepareForm() { 133 prepareForm() {
118 const { app, settings, user } = this.props.stores; 134 const {
135 app, settings, user, todos,
136 } = this.props.stores;
119 const { intl } = this.context; 137 const { intl } = this.context;
120 138
121 const locales = getSelectOptions({ 139 const locales = getSelectOptions({
@@ -171,8 +189,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
171 }, 189 },
172 enableSpellchecking: { 190 enableSpellchecking: {
173 label: intl.formatMessage(messages.enableSpellchecking), 191 label: intl.formatMessage(messages.enableSpellchecking),
174 value: !this.props.stores.user.data.isPremium && spellcheckerConfig.isPremium ? false : settings.all.app.enableSpellchecking, 192 value: !this.props.stores.user.data.isPremium && !spellcheckerConfig.isIncludedInCurrentPlan ? false : settings.all.app.enableSpellchecking,
175 default: !this.props.stores.user.data.isPremium && spellcheckerConfig.isPremium ? false : DEFAULT_APP_SETTINGS.enableSpellchecking, 193 default: !this.props.stores.user.data.isPremium && !spellcheckerConfig.isIncludedInCurrentPlan ? false : DEFAULT_APP_SETTINGS.enableSpellchecking,
176 }, 194 },
177 spellcheckerLanguage: { 195 spellcheckerLanguage: {
178 label: intl.formatMessage(globalMessages.spellcheckerLanguage), 196 label: intl.formatMessage(globalMessages.spellcheckerLanguage),
@@ -204,16 +222,28 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
204 }, 222 },
205 }; 223 };
206 224
225 if (todos.isFeatureActive) {
226 config.fields.enableTodos = {
227 label: intl.formatMessage(messages.enableTodos),
228 value: todos.settings.isFeatureEnabledByUser,
229 default: DEFAULT_IS_FEATURE_ENABLED_BY_USER,
230 };
231 }
232
207 return new Form(config); 233 return new Form(config);
208 } 234 }
209 235
210 render() { 236 render() {
211 const { 237 const {
238 app,
239 todos,
240 } = this.props.stores;
241 const {
212 updateStatus, 242 updateStatus,
213 cacheSize, 243 cacheSize,
214 updateStatusTypes, 244 updateStatusTypes,
215 isClearingAllCache, 245 isClearingAllCache,
216 } = this.props.stores.app; 246 } = app;
217 const { 247 const {
218 checkForUpdates, 248 checkForUpdates,
219 installUpdate, 249 installUpdate,
@@ -235,7 +265,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
235 cacheSize={cacheSize} 265 cacheSize={cacheSize}
236 isClearingAllCache={isClearingAllCache} 266 isClearingAllCache={isClearingAllCache}
237 onClearAllCache={clearAllCache} 267 onClearAllCache={clearAllCache}
238 isSpellcheckerPremiumFeature={spellcheckerConfig.isPremium} 268 isSpellcheckerIncludedInCurrentPlan={spellcheckerConfig.isIncludedInCurrentPlan}
269 isTodosEnabled={todos.isFeatureActive}
239 /> 270 />
240 </ErrorBoundary> 271 </ErrorBoundary>
241 ); 272 );
@@ -247,6 +278,7 @@ EditSettingsScreen.wrappedComponent.propTypes = {
247 app: PropTypes.instanceOf(AppStore).isRequired, 278 app: PropTypes.instanceOf(AppStore).isRequired,
248 user: PropTypes.instanceOf(UserStore).isRequired, 279 user: PropTypes.instanceOf(UserStore).isRequired,
249 settings: PropTypes.instanceOf(SettingsStore).isRequired, 280 settings: PropTypes.instanceOf(SettingsStore).isRequired,
281 todos: PropTypes.instanceOf(TodosStore).isRequired,
250 }).isRequired, 282 }).isRequired,
251 actions: PropTypes.shape({ 283 actions: PropTypes.shape({
252 app: PropTypes.shape({ 284 app: PropTypes.shape({
@@ -261,5 +293,8 @@ EditSettingsScreen.wrappedComponent.propTypes = {
261 user: PropTypes.shape({ 293 user: PropTypes.shape({
262 update: PropTypes.func.isRequired, 294 update: PropTypes.func.isRequired,
263 }).isRequired, 295 }).isRequired,
296 todos: PropTypes.shape({
297 toggleTodosFeatureVisibility: PropTypes.func.isRequired,
298 }).isRequired,
264 }).isRequired, 299 }).isRequired,
265}; 300};
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index eda5ae54c..132820b6f 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -1,7 +1,9 @@
1import { remote, shell } from 'electron';
1import React, { Component } from 'react'; 2import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 3import PropTypes from 'prop-types';
3import { autorun } from 'mobx'; 4import { autorun } from 'mobx';
4import { inject, observer } from 'mobx-react'; 5import { inject, observer } from 'mobx-react';
6import path from 'path';
5 7
6import RecipePreviewsStore from '../../stores/RecipePreviewsStore'; 8import RecipePreviewsStore from '../../stores/RecipePreviewsStore';
7import RecipeStore from '../../stores/RecipesStore'; 9import RecipeStore from '../../stores/RecipesStore';
@@ -10,6 +12,11 @@ import UserStore from '../../stores/UserStore';
10 12
11import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard'; 13import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard';
12import ErrorBoundary from '../../components/util/ErrorBoundary'; 14import ErrorBoundary from '../../components/util/ErrorBoundary';
15import { FRANZ_DEV_DOCS } from '../../config';
16import { gaEvent } from '../../lib/analytics';
17import { communityRecipesStore } from '../../features/communityRecipes';
18
19const { app } = remote;
13 20
14export default @inject('stores', 'actions') @observer class RecipesScreen extends Component { 21export default @inject('stores', 'actions') @observer class RecipesScreen extends Component {
15 static propTypes = { 22 static propTypes = {
@@ -67,9 +74,16 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
67 74
68 render() { 75 render() {
69 const { 76 const {
70 recipePreviews, recipes, services, user, 77 recipePreviews,
78 recipes,
79 services,
80 user,
71 } = this.props.stores; 81 } = this.props.stores;
72 const { showAddServiceInterface } = this.props.actions.service; 82
83 const {
84 app: appActions,
85 service: serviceActions,
86 } = this.props.actions;
73 87
74 const { filter } = this.props.params; 88 const { filter } = this.props.params;
75 let recipeFilter; 89 let recipeFilter;
@@ -77,7 +91,7 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
77 if (filter === 'all') { 91 if (filter === 'all') {
78 recipeFilter = recipePreviews.all; 92 recipeFilter = recipePreviews.all;
79 } else if (filter === 'dev') { 93 } else if (filter === 'dev') {
80 recipeFilter = recipePreviews.dev; 94 recipeFilter = communityRecipesStore.communityRecipes;
81 } else { 95 } else {
82 recipeFilter = recipePreviews.featured; 96 recipeFilter = recipePreviews.featured;
83 } 97 }
@@ -89,6 +103,8 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
89 || recipes.installRecipeRequest.isExecuting 103 || recipes.installRecipeRequest.isExecuting
90 || recipePreviews.searchRecipePreviewsRequest.isExecuting; 104 || recipePreviews.searchRecipePreviewsRequest.isExecuting;
91 105
106 const recipeDirectory = path.join(app.getPath('userData'), 'recipes', 'dev');
107
92 return ( 108 return (
93 <ErrorBoundary> 109 <ErrorBoundary>
94 <RecipesDashboard 110 <RecipesDashboard
@@ -97,12 +113,23 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
97 addedServiceCount={services.all.length} 113 addedServiceCount={services.all.length}
98 isPremium={user.data.isPremium} 114 isPremium={user.data.isPremium}
99 hasLoadedRecipes={recipePreviews.featuredRecipePreviewsRequest.wasExecuted} 115 hasLoadedRecipes={recipePreviews.featuredRecipePreviewsRequest.wasExecuted}
100 showAddServiceInterface={showAddServiceInterface} 116 showAddServiceInterface={serviceActions.showAddServiceInterface}
101 searchRecipes={e => this.searchRecipes(e)} 117 searchRecipes={e => this.searchRecipes(e)}
102 resetSearch={() => this.resetSearch()} 118 resetSearch={() => this.resetSearch()}
103 searchNeedle={this.state.needle} 119 searchNeedle={this.state.needle}
104 serviceStatus={services.actionStatus} 120 serviceStatus={services.actionStatus}
105 devRecipesCount={recipePreviews.dev.length} 121 recipeFilter={filter}
122 recipeDirectory={recipeDirectory}
123 openRecipeDirectory={() => {
124 shell.openItem(recipeDirectory);
125 gaEvent('Recipe', 'open-recipe-folder', 'Open Folder');
126 }}
127 openDevDocs={() => {
128 appActions.openExternalUrl({ url: FRANZ_DEV_DOCS });
129 gaEvent('Recipe', 'open-dev-docs', 'Developer Documentation');
130 }}
131 isCommunityRecipesIncludedInCurrentPlan={communityRecipesStore.isCommunityRecipesIncludedInCurrentPlan}
132 isUserPremiumUser={user.isPremium}
106 /> 133 />
107 </ErrorBoundary> 134 </ErrorBoundary>
108 ); 135 );
@@ -117,6 +144,9 @@ RecipesScreen.wrappedComponent.propTypes = {
117 user: PropTypes.instanceOf(UserStore).isRequired, 144 user: PropTypes.instanceOf(UserStore).isRequired,
118 }).isRequired, 145 }).isRequired,
119 actions: PropTypes.shape({ 146 actions: PropTypes.shape({
147 app: PropTypes.shape({
148 openExternalUrl: PropTypes.func.isRequired,
149 }).isRequired,
120 service: PropTypes.shape({ 150 service: PropTypes.shape({
121 showAddServiceInterface: PropTypes.func.isRequired, 151 showAddServiceInterface: PropTypes.func.isRequired,
122 }).isRequired, 152 }).isRequired,
diff --git a/src/containers/settings/TeamScreen.js b/src/containers/settings/TeamScreen.js
index c69d5ad08..f600c9947 100644
--- a/src/containers/settings/TeamScreen.js
+++ b/src/containers/settings/TeamScreen.js
@@ -14,7 +14,6 @@ export default @inject('stores', 'actions') @observer class TeamScreen extends C
14 const { actions, stores } = this.props; 14 const { actions, stores } = this.props;
15 15
16 const url = `${WEBSITE}${route}?authToken=${stores.user.authToken}&utm_source=app&utm_medium=account_dashboard`; 16 const url = `${WEBSITE}${route}?authToken=${stores.user.authToken}&utm_source=app&utm_medium=account_dashboard`;
17 console.log(url);
18 17
19 actions.app.openExternalUrl({ url }); 18 actions.app.openExternalUrl({ url });
20 } 19 }
@@ -31,6 +30,7 @@ export default @inject('stores', 'actions') @observer class TeamScreen extends C
31 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 30 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError}
32 retryUserInfoRequest={() => this.reloadData()} 31 retryUserInfoRequest={() => this.reloadData()}
33 openTeamManagement={() => this.handleWebsiteLink('/user/team')} 32 openTeamManagement={() => this.handleWebsiteLink('/user/team')}
33 isProUser={user.isPro}
34 /> 34 />
35 </ErrorBoundary> 35 </ErrorBoundary>
36 ); 36 );
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
index 3d153b8e8..726b10628 100644
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ b/src/containers/subscription/SubscriptionFormScreen.js
@@ -1,4 +1,3 @@
1import { remote } from 'electron';
2import React, { Component } from 'react'; 1import React, { Component } from 'react';
3import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
4import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
@@ -6,96 +5,50 @@ import { inject, observer } from 'mobx-react';
6import PaymentStore from '../../stores/PaymentStore'; 5import PaymentStore from '../../stores/PaymentStore';
7 6
8import SubscriptionForm from '../../components/subscription/SubscriptionForm'; 7import SubscriptionForm from '../../components/subscription/SubscriptionForm';
9 8import TrialForm from '../../components/subscription/TrialForm';
10const { BrowserWindow } = remote;
11 9
12export default @inject('stores', 'actions') @observer class SubscriptionFormScreen extends Component { 10export default @inject('stores', 'actions') @observer class SubscriptionFormScreen extends Component {
13 static propTypes = { 11 async openBrowser() {
14 onCloseWindow: PropTypes.func,
15 content: PropTypes.node,
16 showSkipOption: PropTypes.bool,
17 skipAction: PropTypes.func,
18 skipButtonLabel: PropTypes.string,
19 hideInfo: PropTypes.bool,
20 }
21
22 static defaultProps = {
23 onCloseWindow: () => null,
24 content: '',
25 showSkipOption: false,
26 skipAction: () => null,
27 skipButtonLabel: '',
28 hideInfo: false,
29 }
30
31 async handlePayment(plan) {
32 const { 12 const {
33 actions, 13 actions,
34 stores, 14 stores,
35 onCloseWindow,
36 } = this.props; 15 } = this.props;
37 16
38 const interval = plan; 17 const {
39 18 user,
40 const { id } = stores.payment.plan[interval]; 19 features,
41 actions.payment.createHostedPage({ 20 } = stores;
42 planId: id,
43 });
44
45 const hostedPage = await stores.payment.createHostedPageRequest;
46 21
47 if (hostedPage.url) { 22 let hostedPageURL = features.features.planSelectionURL;
48 if (hostedPage.legacyCheckoutFlow) { 23 hostedPageURL = user.getAuthURL(hostedPageURL);
49 const paymentWindow = new BrowserWindow({
50 parent: remote.getCurrentWindow(),
51 modal: true,
52 title: '🔒 Ferdi Supporter License',
53 width: 600,
54 height: window.innerHeight - 100,
55 maxWidth: 600,
56 minWidth: 600,
57 webPreferences: {
58 nodeIntegration: true,
59 webviewTag: true,
60 },
61 });
62 paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPage.url)}`);
63 24
64 paymentWindow.on('closed', () => { 25 actions.app.openExternalUrl({ url: hostedPageURL });
65 onCloseWindow();
66 });
67 } else {
68 actions.app.openExternalUrl({
69 url: hostedPage.url,
70 });
71 }
72 }
73 } 26 }
74 27
75 render() { 28 render() {
76 const { 29 const {
77 content,
78 actions, 30 actions,
79 stores, 31 stores,
80 showSkipOption,
81 skipAction,
82 skipButtonLabel,
83 hideInfo,
84 } = this.props; 32 } = this.props;
33
34 const { data: user } = stores.user;
35
36 if (user.hadSubscription) {
37 return (
38 <SubscriptionForm
39 plan={stores.payment.plan}
40 selectPlan={() => this.openBrowser()}
41 isActivatingTrial={stores.user.activateTrialRequest.isExecuting || stores.user.getUserInfoRequest.isExecuting}
42 />
43 );
44 }
45
85 return ( 46 return (
86 <SubscriptionForm 47 <TrialForm
87 plan={stores.payment.plan} 48 plan={stores.payment.plan}
88 isLoading={stores.payment.plansRequest.isExecuting} 49 activateTrial={() => actions.user.activateTrial({ planId: stores.features.features.defaultTrialPlan })}
89 retryPlanRequest={() => stores.payment.plansRequest.reload()} 50 showAllOptions={() => this.openBrowser()}
90 isCreatingHostedPage={stores.payment.createHostedPageRequest.isExecuting} 51 isActivatingTrial={stores.user.activateTrialRequest.isExecuting || stores.user.getUserInfoRequest.isExecuting}
91 handlePayment={price => this.handlePayment(price)}
92 content={content}
93 error={stores.payment.plansRequest.isError}
94 showSkipOption={showSkipOption}
95 skipAction={skipAction}
96 skipButtonLabel={skipButtonLabel}
97 hideInfo={hideInfo}
98 openExternalUrl={actions.app.openExternalUrl}
99 /> 52 />
100 ); 53 );
101 } 54 }
diff --git a/src/containers/subscription/SubscriptionPopupScreen.js b/src/containers/subscription/SubscriptionPopupScreen.js
index f76d6c5a6..0de5a87c4 100644
--- a/src/containers/subscription/SubscriptionPopupScreen.js
+++ b/src/containers/subscription/SubscriptionPopupScreen.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4 4
5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup'; 5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup';
6import { isDevMode } from '../../environment';
6 7
7 8
8export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component { 9export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component {
@@ -13,7 +14,7 @@ export default @inject('stores', 'actions') @observer class SubscriptionPopupScr
13 completeCheck(event) { 14 completeCheck(event) {
14 const { url } = event; 15 const { url } = event;
15 16
16 if ((url.includes('recurly') && url.includes('confirmation')) || (url.includes('meetfranz') && url.includes('success'))) { 17 if ((url.includes('recurly') && url.includes('confirmation')) || ((url.includes('meetfranz') || isDevMode) && url.includes('success'))) {
17 this.setState({ 18 this.setState({
18 complete: true, 19 complete: true,
19 }); 20 });
diff --git a/src/environment.js b/src/environment.js
index ae7a67e4d..4be2c7d70 100644
--- a/src/environment.js
+++ b/src/environment.js
@@ -10,6 +10,9 @@ import {
10 LIVE_WS_API, 10 LIVE_WS_API,
11 LOCAL_WS_API, 11 LOCAL_WS_API,
12 DEV_WS_API, 12 DEV_WS_API,
13 LOCAL_TODOS_FRONTEND_URL,
14 PRODUCTION_TODOS_FRONTEND_URL,
15 DEVELOPMENT_TODOS_FRONTEND_URL,
13} from './config'; 16} from './config';
14 17
15export const isDevMode = isDev; 18export const isDevMode = isDev;
@@ -31,21 +34,28 @@ export const cmdKey = isMac ? 'Cmd' : 'Ctrl';
31let api; 34let api;
32let wsApi; 35let wsApi;
33let web; 36let web;
37let todos;
34if (!isDevMode || (isDevMode && useLiveAPI)) { 38if (!isDevMode || (isDevMode && useLiveAPI)) {
35 api = LIVE_API; 39 api = LIVE_API;
40 // api = DEV_API;
36 wsApi = LIVE_WS_API; 41 wsApi = LIVE_WS_API;
37 web = LIVE_API_WEBSITE; 42 web = LIVE_API_WEBSITE;
43 // web = DEV_API_WEBSITE;
44 todos = PRODUCTION_TODOS_FRONTEND_URL;
38} else if (isDevMode && useLocalAPI) { 45} else if (isDevMode && useLocalAPI) {
39 api = LOCAL_API; 46 api = LOCAL_API;
40 wsApi = LOCAL_WS_API; 47 wsApi = LOCAL_WS_API;
41 web = LOCAL_API_WEBSITE; 48 web = LOCAL_API_WEBSITE;
49 todos = LOCAL_TODOS_FRONTEND_URL;
42} else { 50} else {
43 api = DEV_API; 51 api = DEV_API;
44 wsApi = DEV_WS_API; 52 wsApi = DEV_WS_API;
45 web = DEV_API_WEBSITE; 53 web = DEV_API_WEBSITE;
54 todos = DEVELOPMENT_TODOS_FRONTEND_URL;
46} 55}
47 56
48export const API = api; 57export const API = api;
49export const API_VERSION = 'v1'; 58export const API_VERSION = 'v1';
50export const WS_API = wsApi; 59export const WS_API = wsApi;
51export const WEBSITE = web; 60export const WEBSITE = web;
61export const TODOS_FRONTEND = todos;
diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js
index 2884fb06f..91348029f 100644
--- a/src/features/announcements/store.js
+++ b/src/features/announcements/store.js
@@ -62,6 +62,11 @@ export class AnnouncementsStore extends FeatureStore {
62 return this.stores.settings.stats.appStarts <= 1; 62 return this.stores.settings.stats.appStarts <= 1;
63 } 63 }
64 64
65 @computed get isAnnouncementShown() {
66 const { router } = this.stores;
67 return router.location.pathname.includes('/announcements');
68 }
69
65 async start(stores, actions) { 70 async start(stores, actions) {
66 debug('AnnouncementsStore::start'); 71 debug('AnnouncementsStore::start');
67 this.stores = stores; 72 this.stores = stores;
diff --git a/src/features/basicAuth/Component.js b/src/features/basicAuth/Component.js
index a8252acb7..ba9ae2273 100644
--- a/src/features/basicAuth/Component.js
+++ b/src/features/basicAuth/Component.js
@@ -27,7 +27,6 @@ export default @injectSheet(styles) @observer class BasicAuthModal extends Compo
27 e.preventDefault(); 27 e.preventDefault();
28 28
29 const values = Form.values(); 29 const values = Form.values();
30 console.log('form submit', values);
31 30
32 sendCredentials(values.user, values.password); 31 sendCredentials(values.user, values.password);
33 resetState(); 32 resetState();
diff --git a/src/features/communityRecipes/index.js b/src/features/communityRecipes/index.js
new file mode 100644
index 000000000..4d050f90e
--- /dev/null
+++ b/src/features/communityRecipes/index.js
@@ -0,0 +1,28 @@
1import { reaction } from 'mobx';
2import { CommunityRecipesStore } from './store';
3
4const debug = require('debug')('Franz:feature:communityRecipes');
5
6export const DEFAULT_SERVICE_LIMIT = 3;
7
8export const communityRecipesStore = new CommunityRecipesStore();
9
10export default function initCommunityRecipes(stores, actions) {
11 const { features } = stores;
12
13 communityRecipesStore.start(stores, actions);
14
15 // Toggle communityRecipe premium status
16 reaction(
17 () => (
18 features.features.isCommunityRecipesIncludedInCurrentPlan
19 ),
20 (isPremiumFeature) => {
21 debug('Community recipes is premium feature: ', isPremiumFeature);
22 communityRecipesStore.isCommunityRecipesIncludedInCurrentPlan = isPremiumFeature;
23 },
24 {
25 fireImmediately: true,
26 },
27 );
28}
diff --git a/src/features/communityRecipes/store.js b/src/features/communityRecipes/store.js
new file mode 100644
index 000000000..4d45c3b33
--- /dev/null
+++ b/src/features/communityRecipes/store.js
@@ -0,0 +1,31 @@
1import { computed, observable } from 'mobx';
2import { FeatureStore } from '../utils/FeatureStore';
3
4const debug = require('debug')('Franz:feature:communityRecipes:store');
5
6export class CommunityRecipesStore extends FeatureStore {
7 @observable isCommunityRecipesIncludedInCurrentPlan = false;
8
9 start(stores, actions) {
10 debug('start');
11 this.stores = stores;
12 this.actions = actions;
13 }
14
15 stop() {
16 debug('stop');
17 super.stop();
18 }
19
20 @computed get communityRecipes() {
21 if (!this.stores) return [];
22
23 return this.stores.recipePreviews.dev.map((r) => {
24 r.isDevRecipe = !!r.author.find(a => a.email === this.stores.user.data.email);
25
26 return r;
27 });
28 }
29}
30
31export default CommunityRecipesStore;
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js
index ba50652e8..c61cb06c9 100644
--- a/src/features/delayApp/Component.js
+++ b/src/features/delayApp/Component.js
@@ -4,19 +4,28 @@ import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
6 6
7import Button from '../../components/ui/Button'; 7import { Button } from '@meetfranz/forms';
8 8
9import { config } from '.'; 9import { config } from '.';
10import styles from './styles'; 10import styles from './styles';
11import UserStore from '../../stores/UserStore';
11 12
12const messages = defineMessages({ 13const messages = defineMessages({
13 headline: { 14 headline: {
14 id: 'feature.delayApp.headline', 15 id: 'feature.delayApp.headline',
15 defaultMessage: '!!!Please purchase license to skip waiting', 16 defaultMessage: '!!!Please purchase license to skip waiting',
16 }, 17 },
18 headlineTrial: {
19 id: 'feature.delayApp.trial.headline',
20 defaultMessage: '!!!Get the free Franz Professional 14 day trial and skip the line',
21 },
17 action: { 22 action: {
18 id: 'feature.delayApp.action', 23 id: 'feature.delayApp.upgrade.action',
19 defaultMessage: '!!!Get a Ferdi Supporter License', 24 defaultMessage: '!!!Get a Franz Supporter License',
25 },
26 actionTrial: {
27 id: 'feature.delayApp.trial.action',
28 defaultMessage: '!!!Yes, I want the free 14 day trial of Franz Professional',
20 }, 29 },
21 text: { 30 text: {
22 id: 'feature.delayApp.text', 31 id: 'feature.delayApp.text',
@@ -24,7 +33,7 @@ const messages = defineMessages({
24 }, 33 },
25}); 34});
26 35
27export default @inject('actions') @injectSheet(styles) @observer class DelayApp extends Component { 36export default @inject('stores', 'actions') @injectSheet(styles) @observer class DelayApp extends Component {
28 static propTypes = { 37 static propTypes = {
29 // eslint-disable-next-line 38 // eslint-disable-next-line
30 classes: PropTypes.object.isRequired, 39 classes: PropTypes.object.isRequired,
@@ -60,23 +69,32 @@ export default @inject('actions') @injectSheet(styles) @observer class DelayApp
60 } 69 }
61 70
62 handleCTAClick() { 71 handleCTAClick() {
63 const { actions } = this.props; 72 const { actions, stores } = this.props;
64 73 const { hadSubscription } = stores.user.data;
65 actions.ui.openSettings({ path: 'user' }); 74 const { defaultTrialPlan } = stores.features.features;
75
76 if (!hadSubscription) {
77 actions.user.activateTrial({ planId: defaultTrialPlan });
78 } else {
79 actions.ui.openSettings({ path: 'user' });
80 }
66 } 81 }
67 82
68 render() { 83 render() {
69 const { classes } = this.props; 84 const { classes, stores } = this.props;
70 const { intl } = this.context; 85 const { intl } = this.context;
71 86
87 const { hadSubscription } = stores.user.data;
88
72 return ( 89 return (
73 <div className={`${classes.container}`}> 90 <div className={`${classes.container}`}>
74 <h1 className={classes.headline}>{intl.formatMessage(messages.headline)}</h1> 91 <h1 className={classes.headline}>{intl.formatMessage(hadSubscription ? messages.headline : messages.headlineTrial)}</h1>
75 <Button 92 <Button
76 label={intl.formatMessage(messages.action)} 93 label={intl.formatMessage(hadSubscription ? messages.action : messages.actionTrial)}
77 className={classes.button} 94 className={classes.button}
78 buttonType="inverted" 95 buttonType="inverted"
79 onClick={this.handleCTAClick.bind(this)} 96 onClick={this.handleCTAClick.bind(this)}
97 busy={stores.user.activateTrialRequest.isExecuting}
80 /> 98 />
81 <p className="footnote"> 99 <p className="footnote">
82 {intl.formatMessage(messages.text, { 100 {intl.formatMessage(messages.text, {
@@ -89,6 +107,9 @@ export default @inject('actions') @injectSheet(styles) @observer class DelayApp
89} 107}
90 108
91DelayApp.wrappedComponent.propTypes = { 109DelayApp.wrappedComponent.propTypes = {
110 stores: PropTypes.shape({
111 user: PropTypes.instanceOf(UserStore).isRequired,
112 }).isRequired,
92 actions: PropTypes.shape({ 113 actions: PropTypes.shape({
93 ui: PropTypes.shape({ 114 ui: PropTypes.shape({
94 openSettings: PropTypes.func.isRequired, 115 openSettings: PropTypes.func.isRequired,
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index c753eeffe..4f793f16c 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -43,14 +43,16 @@ export default function init(stores) {
43 config.delayDuration = globalConfig.wait !== undefined ? globalConfig.wait : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait; 43 config.delayDuration = globalConfig.wait !== undefined ? globalConfig.wait : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait;
44 44
45 autorun(() => { 45 autorun(() => {
46 if (stores.services.all.length === 0) { 46 const { isAnnouncementShown } = stores.announcements;
47 debug('seas', stores.services.all.length); 47 if (stores.services.allDisplayed.length === 0 || isAnnouncementShown) {
48 shownAfterLaunch = true; 48 shownAfterLaunch = true;
49 setVisibility(false);
49 return; 50 return;
50 } 51 }
51 52
52 const diff = moment().diff(timeLastDelay); 53 const diff = moment().diff(timeLastDelay);
53 if ((stores.app.isFocused && diff >= config.delayOffset) || !shownAfterLaunch) { 54 const itsTimeToWait = diff >= config.delayOffset;
55 if (!isAnnouncementShown && ((stores.app.isFocused && itsTimeToWait) || !shownAfterLaunch)) {
54 debug(`App will be delayed for ${config.delayDuration / 1000}s`); 56 debug(`App will be delayed for ${config.delayDuration / 1000}s`);
55 57
56 setVisibility(true); 58 setVisibility(true);
@@ -63,6 +65,8 @@ export default function init(stores) {
63 65
64 setVisibility(false); 66 setVisibility(false);
65 }, config.delayDuration + 1000); // timer needs to be able to hit 0 67 }, config.delayDuration + 1000); // timer needs to be able to hit 0
68 } else {
69 setVisibility(false);
66 } 70 }
67 }); 71 });
68 } else { 72 } else {
diff --git a/src/features/serviceLimit/components/LimitReachedInfobox.js b/src/features/serviceLimit/components/LimitReachedInfobox.js
new file mode 100644
index 000000000..19285a4eb
--- /dev/null
+++ b/src/features/serviceLimit/components/LimitReachedInfobox.js
@@ -0,0 +1,79 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import { Infobox } from '@meetfranz/ui';
7
8import { gaEvent } from '../../../lib/analytics';
9
10const messages = defineMessages({
11 limitReached: {
12 id: 'feature.serviceLimit.limitReached',
13 defaultMessage: '!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.',
14 },
15 action: {
16 id: 'premiumFeature.button.upgradeAccount',
17 defaultMessage: '!!!Upgrade account',
18 },
19});
20
21const styles = theme => ({
22 container: {
23 height: 'auto',
24 background: theme.styleTypes.warning.accent,
25 color: theme.styleTypes.warning.contrast,
26 borderRadius: 0,
27 marginBottom: 0,
28
29 '& > div': {
30 marginBottom: 0,
31 },
32
33 '& button': {
34 color: theme.styleTypes.primary.contrast,
35 },
36 },
37});
38
39
40@inject('stores', 'actions') @injectSheet(styles) @observer
41class LimitReachedInfobox extends Component {
42 static propTypes = {
43 classes: PropTypes.object.isRequired,
44 stores: PropTypes.object.isRequired,
45 actions: PropTypes.object.isRequired,
46 };
47
48 static contextTypes = {
49 intl: intlShape,
50 };
51
52 render() {
53 const { classes, stores, actions } = this.props;
54 const { intl } = this.context;
55
56 const {
57 serviceLimit,
58 } = stores;
59
60 if (!serviceLimit.userHasReachedServiceLimit) return null;
61
62 return (
63 <Infobox
64 icon="mdiInformation"
65 type="warning"
66 className={classes.container}
67 ctaLabel={intl.formatMessage(messages.action)}
68 ctaOnClick={() => {
69 actions.ui.openSettings({ path: 'user' });
70 gaEvent('Service Limit', 'upgrade', 'Upgrade account');
71 }}
72 >
73 {intl.formatMessage(messages.limitReached, { amount: serviceLimit.serviceCount, limit: serviceLimit.serviceLimit })}
74 </Infobox>
75 );
76 }
77}
78
79export default LimitReachedInfobox;
diff --git a/src/features/serviceLimit/index.js b/src/features/serviceLimit/index.js
new file mode 100644
index 000000000..92ad8bb98
--- /dev/null
+++ b/src/features/serviceLimit/index.js
@@ -0,0 +1,33 @@
1import { reaction } from 'mobx';
2import { ServiceLimitStore } from './store';
3
4const debug = require('debug')('Franz:feature:serviceLimit');
5
6export const DEFAULT_SERVICE_LIMIT = 3;
7
8let store = null;
9
10export const serviceLimitStore = new ServiceLimitStore();
11
12export default function initServiceLimit(stores, actions) {
13 const { features } = stores;
14
15 // Toggle serviceLimit feature
16 reaction(
17 () => (
18 features.features.isServiceLimitEnabled
19 ),
20 (isEnabled) => {
21 if (isEnabled) {
22 debug('Initializing `serviceLimit` feature');
23 store = serviceLimitStore.start(stores, actions);
24 } else if (store) {
25 debug('Disabling `serviceLimit` feature');
26 serviceLimitStore.stop();
27 }
28 },
29 {
30 fireImmediately: true,
31 },
32 );
33}
diff --git a/src/features/serviceLimit/store.js b/src/features/serviceLimit/store.js
new file mode 100644
index 000000000..9836c5f51
--- /dev/null
+++ b/src/features/serviceLimit/store.js
@@ -0,0 +1,41 @@
1import { computed, observable } from 'mobx';
2import { FeatureStore } from '../utils/FeatureStore';
3import { DEFAULT_SERVICE_LIMIT } from '.';
4
5const debug = require('debug')('Franz:feature:serviceLimit:store');
6
7export class ServiceLimitStore extends FeatureStore {
8 @observable isServiceLimitEnabled = false;
9
10 start(stores, actions) {
11 debug('start');
12 this.stores = stores;
13 this.actions = actions;
14
15 this.isServiceLimitEnabled = true;
16 }
17
18 stop() {
19 super.stop();
20
21 this.isServiceLimitEnabled = false;
22 }
23
24 @computed get userHasReachedServiceLimit() {
25 if (!this.isServiceLimitEnabled) return false;
26
27 return this.serviceLimit !== 0 && this.serviceCount >= this.serviceLimit;
28 }
29
30 @computed get serviceLimit() {
31 if (!this.isServiceLimitEnabled || this.stores.features.features.serviceLimitCount === 0) return 0;
32
33 return this.stores.features.features.serviceLimitCount || DEFAULT_SERVICE_LIMIT;
34 }
35
36 @computed get serviceCount() {
37 return this.stores.services.all.length;
38 }
39}
40
41export default ServiceLimitStore;
diff --git a/src/features/serviceProxy/index.js b/src/features/serviceProxy/index.js
index 4bea327ad..55c600de4 100644
--- a/src/features/serviceProxy/index.js
+++ b/src/features/serviceProxy/index.js
@@ -9,17 +9,17 @@ const debug = require('debug')('Franz:feature:serviceProxy');
9 9
10export const config = observable({ 10export const config = observable({
11 isEnabled: DEFAULT_FEATURES_CONFIG.isServiceProxyEnabled, 11 isEnabled: DEFAULT_FEATURES_CONFIG.isServiceProxyEnabled,
12 isPremium: DEFAULT_FEATURES_CONFIG.isServiceProxyPremiumFeature, 12 isPremium: DEFAULT_FEATURES_CONFIG.isServiceProxyIncludedInCurrentPlan,
13}); 13});
14 14
15export default function init(stores) { 15export default function init(stores) {
16 debug('Initializing `serviceProxy` feature'); 16 debug('Initializing `serviceProxy` feature');
17 17
18 autorun(() => { 18 autorun(() => {
19 const { isServiceProxyEnabled, isServiceProxyPremiumFeature } = stores.features.features; 19 const { isServiceProxyEnabled, isServiceProxyIncludedInCurrentPlan } = stores.features.features;
20 20
21 config.isEnabled = isServiceProxyEnabled !== undefined ? isServiceProxyEnabled : DEFAULT_FEATURES_CONFIG.isServiceProxyEnabled; 21 config.isEnabled = isServiceProxyEnabled !== undefined ? isServiceProxyEnabled : DEFAULT_FEATURES_CONFIG.isServiceProxyEnabled;
22 config.isPremium = isServiceProxyPremiumFeature !== undefined ? isServiceProxyPremiumFeature : DEFAULT_FEATURES_CONFIG.isServiceProxyPremiumFeature; 22 config.isIncludedInCurrentPlan = isServiceProxyIncludedInCurrentPlan !== undefined ? isServiceProxyIncludedInCurrentPlan : DEFAULT_FEATURES_CONFIG.isServiceProxyIncludedInCurrentPlan;
23 23
24 const services = stores.services.enabled; 24 const services = stores.services.enabled;
25 const isPremiumUser = stores.user.data.isPremium; 25 const isPremiumUser = stores.user.data.isPremium;
@@ -30,7 +30,7 @@ export default function init(stores) {
30 services.forEach((service) => { 30 services.forEach((service) => {
31 const s = session.fromPartition(`persist:service-${service.id}`); 31 const s = session.fromPartition(`persist:service-${service.id}`);
32 32
33 if (config.isEnabled && (isPremiumUser || !config.isPremium)) { 33 if (config.isEnabled && (isPremiumUser || !config.isIncludedInCurrentPlan)) {
34 const serviceProxyConfig = proxySettings[service.id]; 34 const serviceProxyConfig = proxySettings[service.id];
35 35
36 if (serviceProxyConfig && serviceProxyConfig.isEnabled && serviceProxyConfig.host) { 36 if (serviceProxyConfig && serviceProxyConfig.isEnabled && serviceProxyConfig.host) {
diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js
index 2e66acaf3..405fb0ab5 100644
--- a/src/features/shareFranz/Component.js
+++ b/src/features/shareFranz/Component.js
@@ -6,6 +6,9 @@ import { defineMessages, intlShape } from 'react-intl';
6import { Button } from '@meetfranz/forms'; 6import { Button } from '@meetfranz/forms';
7import { H1, Icon } from '@meetfranz/ui'; 7import { H1, Icon } from '@meetfranz/ui';
8 8
9import {
10 mdiHeart, mdiEmail, mdiFacebookBox, mdiTwitter,
11} from '@mdi/js';
9import Modal from '../../components/ui/Modal'; 12import Modal from '../../components/ui/Modal';
10import { state } from '.'; 13import { state } from '.';
11import ServicesStore from '../../stores/ServicesStore'; 14import ServicesStore from '../../stores/ServicesStore';
@@ -74,7 +77,7 @@ const styles = theme => ({
74 }, 77 },
75 cta: { 78 cta: {
76 background: theme.styleTypes.primary.contrast, 79 background: theme.styleTypes.primary.contrast,
77 color: theme.styleTypes.primary.accent, 80 color: `${theme.styleTypes.primary.accent} !important`,
78 81
79 '& svg': { 82 '& svg': {
80 fill: theme.styleTypes.primary.accent, 83 fill: theme.styleTypes.primary.accent,
@@ -115,7 +118,7 @@ export default @injectSheet(styles) @inject('stores') @observer class ShareFranz
115 close={this.close.bind(this)} 118 close={this.close.bind(this)}
116 > 119 >
117 <div className={classes.heartContainer}> 120 <div className={classes.heartContainer}>
118 <Icon icon="mdiHeart" className={classes.heart} size={4} /> 121 <Icon icon={mdiHeart} className={classes.heart} size={4} />
119 </div> 122 </div>
120 <H1 className={classes.headline}> 123 <H1 className={classes.headline}>
121 {intl.formatMessage(messages.headline)} 124 {intl.formatMessage(messages.headline)}
@@ -125,21 +128,21 @@ export default @injectSheet(styles) @inject('stores') @observer class ShareFranz
125 <Button 128 <Button
126 label={intl.formatMessage(messages.actionsEmail)} 129 label={intl.formatMessage(messages.actionsEmail)}
127 className={classes.cta} 130 className={classes.cta}
128 icon="mdiEmail" 131 icon={mdiEmail}
129 href={`mailto:?subject=Meet the cool app Franz&body=${intl.formatMessage(messages.shareTextEmail, { count: serviceCount })}}`} 132 href={`mailto:?subject=Meet the cool app Franz&body=${intl.formatMessage(messages.shareTextEmail, { count: serviceCount })}}`}
130 target="_blank" 133 target="_blank"
131 /> 134 />
132 <Button 135 <Button
133 label={intl.formatMessage(messages.actionsFacebook)} 136 label={intl.formatMessage(messages.actionsFacebook)}
134 className={classes.cta} 137 className={classes.cta}
135 icon="mdiFacebookBox" 138 icon={mdiFacebookBox}
136 href="https://www.facebook.com/sharer/sharer.php?u=https://www.meetfranz.com?utm_source=facebook&utm_medium=referral&utm_campaign=share-button" 139 href="https://www.facebook.com/sharer/sharer.php?u=https://www.meetfranz.com?utm_source=facebook&utm_medium=referral&utm_campaign=share-button"
137 target="_blank" 140 target="_blank"
138 /> 141 />
139 <Button 142 <Button
140 label={intl.formatMessage(messages.actionsTwitter)} 143 label={intl.formatMessage(messages.actionsTwitter)}
141 className={classes.cta} 144 className={classes.cta}
142 icon="mdiTwitter" 145 icon={mdiTwitter}
143 href={`http://twitter.com/intent/tweet?status=${intl.formatMessage(messages.shareTextTwitter, { count: serviceCount })}`} 146 href={`http://twitter.com/intent/tweet?status=${intl.formatMessage(messages.shareTextTwitter, { count: serviceCount })}`}
144 target="_blank" 147 target="_blank"
145 /> 148 />
diff --git a/src/features/spellchecker/index.js b/src/features/spellchecker/index.js
index 79a2172b4..a07f9f63a 100644
--- a/src/features/spellchecker/index.js
+++ b/src/features/spellchecker/index.js
@@ -5,18 +5,18 @@ import { DEFAULT_FEATURES_CONFIG } from '../../config';
5const debug = require('debug')('Franz:feature:spellchecker'); 5const debug = require('debug')('Franz:feature:spellchecker');
6 6
7export const config = observable({ 7export const config = observable({
8 isPremium: DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature, 8 isIncludedInCurrentPlan: DEFAULT_FEATURES_CONFIG.isSpellcheckerIncludedInCurrentPlan,
9}); 9});
10 10
11export default function init(stores) { 11export default function init(stores) {
12 debug('Initializing `spellchecker` feature'); 12 debug('Initializing `spellchecker` feature');
13 13
14 autorun(() => { 14 autorun(() => {
15 const { isSpellcheckerPremiumFeature } = stores.features.features; 15 const { isSpellcheckerIncludedInCurrentPlan } = stores.features.features;
16 16
17 config.isPremium = isSpellcheckerPremiumFeature !== undefined ? isSpellcheckerPremiumFeature : DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature; 17 config.isIncludedInCurrentPlan = isSpellcheckerIncludedInCurrentPlan !== undefined ? isSpellcheckerIncludedInCurrentPlan : DEFAULT_FEATURES_CONFIG.isSpellcheckerIncludedInCurrentPlan;
18 18
19 if (!stores.user.data.isPremium && config.isPremium && stores.settings.app.enableSpellchecking) { 19 if (!stores.user.data.isPremium && config.isIncludedInCurrentPlan && stores.settings.app.enableSpellchecking) {
20 debug('Override settings.spellcheckerEnabled flag to false'); 20 debug('Override settings.spellcheckerEnabled flag to false');
21 21
22 Object.assign(stores.settings.app, { 22 Object.assign(stores.settings.app, {
diff --git a/src/features/todos/actions.js b/src/features/todos/actions.js
new file mode 100644
index 000000000..1ccc9a592
--- /dev/null
+++ b/src/features/todos/actions.js
@@ -0,0 +1,23 @@
1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3
4export const todoActions = createActionsFromDefinitions({
5 resize: {
6 width: PropTypes.number.isRequired,
7 },
8 toggleTodosPanel: {},
9 toggleTodosFeatureVisibility: {},
10 setTodosWebview: {
11 webview: PropTypes.instanceOf(Element).isRequired,
12 },
13 handleHostMessage: {
14 action: PropTypes.string.isRequired,
15 data: PropTypes.object,
16 },
17 handleClientMessage: {
18 action: PropTypes.string.isRequired,
19 data: PropTypes.object,
20 },
21}, PropTypes.checkPropTypes);
22
23export default todoActions;
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
new file mode 100644
index 000000000..c06183e37
--- /dev/null
+++ b/src/features/todos/components/TodosWebview.js
@@ -0,0 +1,300 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import Webview from 'react-electron-web-view';
6import { Icon } from '@meetfranz/ui';
7import { defineMessages, intlShape } from 'react-intl';
8
9import { mdiChevronRight, mdiCheckAll } from '@mdi/js';
10import * as environment from '../../../environment';
11import Appear from '../../../components/ui/effects/Appear';
12import UpgradeButton from '../../../components/ui/UpgradeButton';
13
14const OPEN_TODOS_BUTTON_SIZE = 45;
15const CLOSE_TODOS_BUTTON_SIZE = 35;
16
17const messages = defineMessages({
18 premiumInfo: {
19 id: 'feature.todos.premium.info',
20 defaultMessage: '!!!Franz Todos are available to premium users now!',
21 },
22 upgradeCTA: {
23 id: 'feature.todos.premium.upgrade',
24 defaultMessage: '!!!Upgrade Account',
25 },
26 rolloutInfo: {
27 id: 'feature.todos.premium.rollout',
28 defaultMessage: '!!!Everyone else will have to wait a little longer.',
29 },
30});
31
32const styles = theme => ({
33 root: {
34 background: theme.colorBackground,
35 position: 'relative',
36 borderLeft: [1, 'solid', theme.todos.todosLayer.borderLeftColor],
37 zIndex: 300,
38
39 transform: ({ isVisible, width }) => `translateX(${isVisible ? 0 : width}px)`,
40
41 '&:hover $closeTodosButton': {
42 opacity: 1,
43 },
44 '& webview': {
45 height: '100%',
46 },
47 },
48 resizeHandler: {
49 position: 'absolute',
50 left: 0,
51 marginLeft: -5,
52 width: 10,
53 zIndex: 400,
54 cursor: 'col-resize',
55 },
56 dragIndicator: {
57 position: 'absolute',
58 left: 0,
59 width: 5,
60 zIndex: 400,
61 background: theme.todos.dragIndicator.background,
62
63 },
64 openTodosButton: {
65 width: OPEN_TODOS_BUTTON_SIZE,
66 height: OPEN_TODOS_BUTTON_SIZE,
67 background: theme.todos.toggleButton.background,
68 position: 'absolute',
69 bottom: 120,
70 right: props => (props.width + (props.isVisible ? -OPEN_TODOS_BUTTON_SIZE / 2 : 0)),
71 borderRadius: OPEN_TODOS_BUTTON_SIZE / 2,
72 opacity: props => (props.isVisible ? 0 : 1),
73 transition: 'right 0.5s',
74 zIndex: 600,
75 display: 'flex',
76 alignItems: 'center',
77 justifyContent: 'center',
78 boxShadow: [0, 0, 10, theme.todos.toggleButton.shadowColor],
79
80 borderTopRightRadius: props => (props.isVisible ? null : 0),
81 borderBottomRightRadius: props => (props.isVisible ? null : 0),
82
83 '& svg': {
84 fill: theme.todos.toggleButton.textColor,
85 transition: 'all 0.5s',
86 },
87 },
88 closeTodosButton: {
89 width: CLOSE_TODOS_BUTTON_SIZE,
90 height: CLOSE_TODOS_BUTTON_SIZE,
91 background: theme.todos.toggleButton.background,
92 position: 'absolute',
93 bottom: 120,
94 right: ({ width }) => (width + -CLOSE_TODOS_BUTTON_SIZE / 2),
95 borderRadius: CLOSE_TODOS_BUTTON_SIZE / 2,
96 opacity: ({ isTodosIncludedInCurrentPlan }) => (!isTodosIncludedInCurrentPlan ? 1 : 0),
97 transition: 'opacity 0.5s',
98 zIndex: 600,
99 display: 'flex',
100 alignItems: 'center',
101 justifyContent: 'center',
102 boxShadow: [0, 0, 10, theme.todos.toggleButton.shadowColor],
103
104 '& svg': {
105 fill: theme.todos.toggleButton.textColor,
106 },
107 },
108 premiumContainer: {
109 display: 'flex',
110 flexDirection: 'column',
111 justifyContent: 'center',
112 alignItems: 'center',
113 width: '80%',
114 maxWidth: 300,
115 margin: [0, 'auto'],
116 textAlign: 'center',
117 },
118 premiumIcon: {
119 marginBottom: 40,
120 background: theme.styleTypes.primary.accent,
121 fill: theme.styleTypes.primary.contrast,
122 padding: 10,
123 borderRadius: 10,
124 },
125 premiumCTA: {
126 marginTop: 40,
127 },
128});
129
130@injectSheet(styles) @observer
131class TodosWebview extends Component {
132 static propTypes = {
133 classes: PropTypes.object.isRequired,
134 isVisible: PropTypes.bool.isRequired,
135 togglePanel: PropTypes.func.isRequired,
136 handleClientMessage: PropTypes.func.isRequired,
137 setTodosWebview: PropTypes.func.isRequired,
138 resize: PropTypes.func.isRequired,
139 width: PropTypes.number.isRequired,
140 minWidth: PropTypes.number.isRequired,
141 isTodosIncludedInCurrentPlan: PropTypes.bool.isRequired,
142 };
143
144 state = {
145 isDragging: false,
146 width: 300,
147 };
148
149 static contextTypes = {
150 intl: intlShape,
151 };
152
153 componentWillMount() {
154 const { width } = this.props;
155
156 this.setState({
157 width,
158 });
159 }
160
161 componentDidMount() {
162 this.node.addEventListener('mousemove', this.resizePanel.bind(this));
163 this.node.addEventListener('mouseup', this.stopResize.bind(this));
164 this.node.addEventListener('mouseleave', this.stopResize.bind(this));
165 }
166
167 startResize = (event) => {
168 this.setState({
169 isDragging: true,
170 initialPos: event.clientX,
171 delta: 0,
172 });
173 };
174
175 resizePanel(e) {
176 const { minWidth } = this.props;
177
178 const {
179 isDragging,
180 initialPos,
181 } = this.state;
182
183 if (isDragging && Math.abs(e.clientX - window.innerWidth) > minWidth) {
184 const delta = e.clientX - initialPos;
185
186 this.setState({
187 delta,
188 });
189 }
190 }
191
192 stopResize() {
193 const {
194 resize,
195 minWidth,
196 } = this.props;
197
198 const {
199 isDragging,
200 delta,
201 width,
202 } = this.state;
203
204 if (isDragging) {
205 let newWidth = width + (delta < 0 ? Math.abs(delta) : -Math.abs(delta));
206
207 if (newWidth < minWidth) {
208 newWidth = minWidth;
209 }
210
211 this.setState({
212 isDragging: false,
213 delta: 0,
214 width: newWidth,
215 });
216
217 resize(newWidth);
218 }
219 }
220
221 startListeningToIpcMessages() {
222 const { handleClientMessage } = this.props;
223 if (!this.webview) return;
224 this.webview.addEventListener('ipc-message', e => handleClientMessage(e.args[0]));
225 }
226
227 render() {
228 const {
229 classes,
230 isVisible,
231 togglePanel,
232 isTodosIncludedInCurrentPlan,
233 } = this.props;
234
235 const {
236 width,
237 delta,
238 isDragging,
239 } = this.state;
240
241 const { intl } = this.context;
242
243 return (
244 <div
245 className={classes.root}
246 style={{ width: isVisible ? width : 0 }}
247 onMouseUp={() => this.stopResize()}
248 ref={(node) => { this.node = node; }}
249 >
250 <button
251 onClick={() => togglePanel()}
252 className={isVisible ? classes.closeTodosButton : classes.openTodosButton}
253 type="button"
254 >
255 <Icon icon={isVisible ? mdiChevronRight : mdiCheckAll} size={2} />
256 </button>
257 <div
258 className={classes.resizeHandler}
259 style={Object.assign({ left: delta }, isDragging ? { width: 600, marginLeft: -200 } : {})} // This hack is required as resizing with webviews beneath behaves quite bad
260 onMouseDown={e => this.startResize(e)}
261 />
262 {isDragging && (
263 <div
264 className={classes.dragIndicator}
265 style={{ left: delta }} // This hack is required as resizing with webviews beneath behaves quite bad
266 />
267 )}
268 {isTodosIncludedInCurrentPlan ? (
269 <Webview
270 className={classes.webview}
271 onDidAttach={() => {
272 const { setTodosWebview } = this.props;
273 setTodosWebview(this.webview);
274 this.startListeningToIpcMessages();
275 }}
276 partition="persist:todos"
277 preload="./features/todos/preload.js"
278 ref={(webview) => { this.webview = webview ? webview.view : null; }}
279 src={environment.TODOS_FRONTEND}
280 />
281 ) : (
282 <Appear>
283 <div className={classes.premiumContainer}>
284 <Icon icon={mdiCheckAll} className={classes.premiumIcon} size={4} />
285 <p>{intl.formatMessage(messages.premiumInfo)}</p>
286 <p>{intl.formatMessage(messages.rolloutInfo)}</p>
287 <UpgradeButton
288 className={classes.premiumCTA}
289 gaEventInfo={{ category: 'Todos', event: 'upgrade' }}
290 short
291 />
292 </div>
293 </Appear>
294 )}
295 </div>
296 );
297 }
298}
299
300export default TodosWebview;
diff --git a/src/features/todos/constants.js b/src/features/todos/constants.js
new file mode 100644
index 000000000..2e8a431cc
--- /dev/null
+++ b/src/features/todos/constants.js
@@ -0,0 +1,4 @@
1export const IPC = {
2 TODOS_HOST_CHANNEL: 'TODOS_HOST_CHANNEL',
3 TODOS_CLIENT_CHANNEL: 'TODOS_CLIENT_CHANNEL',
4};
diff --git a/src/features/todos/containers/TodosScreen.js b/src/features/todos/containers/TodosScreen.js
new file mode 100644
index 000000000..a5da0b014
--- /dev/null
+++ b/src/features/todos/containers/TodosScreen.js
@@ -0,0 +1,41 @@
1import React, { Component } from 'react';
2import { observer, inject } from 'mobx-react';
3import PropTypes from 'prop-types';
4
5import FeaturesStore from '../../../stores/FeaturesStore';
6import TodosWebview from '../components/TodosWebview';
7import ErrorBoundary from '../../../components/util/ErrorBoundary';
8import { TODOS_MIN_WIDTH, todosStore } from '..';
9import { todoActions } from '../actions';
10
11@inject('stores', 'actions') @observer
12class TodosScreen extends Component {
13 render() {
14 if (!todosStore || !todosStore.isFeatureActive || todosStore.isTodosPanelForceHidden) {
15 return null;
16 }
17
18 return (
19 <ErrorBoundary>
20 <TodosWebview
21 isVisible={todosStore.isTodosPanelVisible}
22 togglePanel={todoActions.toggleTodosPanel}
23 handleClientMessage={todoActions.handleClientMessage}
24 setTodosWebview={webview => todoActions.setTodosWebview({ webview })}
25 width={todosStore.width}
26 minWidth={TODOS_MIN_WIDTH}
27 resize={width => todoActions.resize({ width })}
28 isTodosIncludedInCurrentPlan={this.props.stores.features.features.isTodosIncludedInCurrentPlan || false}
29 />
30 </ErrorBoundary>
31 );
32 }
33}
34
35export default TodosScreen;
36
37TodosScreen.wrappedComponent.propTypes = {
38 stores: PropTypes.shape({
39 features: PropTypes.instanceOf(FeaturesStore).isRequired,
40 }).isRequired,
41};
diff --git a/src/features/todos/index.js b/src/features/todos/index.js
new file mode 100644
index 000000000..7388aebaf
--- /dev/null
+++ b/src/features/todos/index.js
@@ -0,0 +1,39 @@
1import { reaction } from 'mobx';
2import TodoStore from './store';
3
4const debug = require('debug')('Franz:feature:todos');
5
6export const GA_CATEGORY_TODOS = 'Todos';
7
8export const DEFAULT_TODOS_WIDTH = 300;
9export const TODOS_MIN_WIDTH = 200;
10export const DEFAULT_TODOS_VISIBLE = true;
11export const DEFAULT_IS_FEATURE_ENABLED_BY_USER = true;
12
13export const TODOS_ROUTES = {
14 TARGET: '/todos',
15};
16
17export const todosStore = new TodoStore();
18
19export default function initTodos(stores, actions) {
20 stores.todos = todosStore;
21 const { features } = stores;
22
23 // Toggle todos feature
24 reaction(
25 () => features.features.isTodosEnabled,
26 (isEnabled) => {
27 if (isEnabled) {
28 debug('Initializing `todos` feature');
29 todosStore.start(stores, actions);
30 } else if (todosStore.isFeatureActive) {
31 debug('Disabling `todos` feature');
32 todosStore.stop();
33 }
34 },
35 {
36 fireImmediately: true,
37 },
38 );
39}
diff --git a/src/features/todos/preload.js b/src/features/todos/preload.js
new file mode 100644
index 000000000..6e38a2ef3
--- /dev/null
+++ b/src/features/todos/preload.js
@@ -0,0 +1,23 @@
1import { ipcRenderer } from 'electron';
2import { IPC } from './constants';
3
4const debug = require('debug')('Franz:feature:todos:preload');
5
6debug('Preloading Todos Webview');
7
8let hostMessageListener = () => {};
9
10window.franz = {
11 onInitialize(ipcHostMessageListener) {
12 hostMessageListener = ipcHostMessageListener;
13 ipcRenderer.sendToHost(IPC.TODOS_CLIENT_CHANNEL, { action: 'todos:initialized' });
14 },
15 sendToHost(message) {
16 ipcRenderer.sendToHost(IPC.TODOS_CLIENT_CHANNEL, message);
17 },
18};
19
20ipcRenderer.on(IPC.TODOS_HOST_CHANNEL, (event, message) => {
21 debug('Received host message', event, message);
22 hostMessageListener(message);
23});
diff --git a/src/features/todos/store.js b/src/features/todos/store.js
new file mode 100644
index 000000000..05eef4ec1
--- /dev/null
+++ b/src/features/todos/store.js
@@ -0,0 +1,213 @@
1import { ThemeType } from '@meetfranz/theme';
2import {
3 computed,
4 action,
5 observable,
6} from 'mobx';
7import localStorage from 'mobx-localstorage';
8
9import { todoActions } from './actions';
10import { FeatureStore } from '../utils/FeatureStore';
11import { createReactions } from '../../stores/lib/Reaction';
12import { createActionBindings } from '../utils/ActionBinding';
13import {
14 DEFAULT_TODOS_WIDTH, TODOS_MIN_WIDTH, DEFAULT_TODOS_VISIBLE, TODOS_ROUTES, DEFAULT_IS_FEATURE_ENABLED_BY_USER,
15} from '.';
16import { IPC } from './constants';
17import { state as delayAppState } from '../delayApp';
18
19const debug = require('debug')('Franz:feature:todos:store');
20
21export default class TodoStore extends FeatureStore {
22 @observable isFeatureEnabled = false;
23
24 @observable isFeatureActive = false;
25
26 webview = null;
27
28 @computed get width() {
29 const width = this.settings.width || DEFAULT_TODOS_WIDTH;
30
31 return width < TODOS_MIN_WIDTH ? TODOS_MIN_WIDTH : width;
32 }
33
34 @computed get isTodosPanelForceHidden() {
35 const { isAnnouncementShown } = this.stores.announcements;
36 return delayAppState.isDelayAppScreenVisible || !this.settings.isFeatureEnabledByUser || isAnnouncementShown;
37 }
38
39 @computed get isTodosPanelVisible() {
40 if (this.settings.isTodosPanelVisible === undefined) return DEFAULT_TODOS_VISIBLE;
41 return this.settings.isTodosPanelVisible;
42 }
43
44 @computed get settings() {
45 return localStorage.getItem('todos') || {};
46 }
47
48 // ========== PUBLIC API ========= //
49
50 @action start(stores, actions) {
51 debug('TodoStore::start');
52 this.stores = stores;
53 this.actions = actions;
54
55 // ACTIONS
56
57 this._registerActions(createActionBindings([
58 [todoActions.resize, this._resize],
59 [todoActions.toggleTodosPanel, this._toggleTodosPanel],
60 [todoActions.setTodosWebview, this._setTodosWebview],
61 [todoActions.handleHostMessage, this._handleHostMessage],
62 [todoActions.handleClientMessage, this._handleClientMessage],
63 [todoActions.toggleTodosFeatureVisibility, this._toggleTodosFeatureVisibility],
64 ]));
65
66 // REACTIONS
67
68 this._allReactions = createReactions([
69 this._setFeatureEnabledReaction,
70 this._updateTodosConfig,
71 this._firstLaunchReaction,
72 this._routeCheckReaction,
73 ]);
74
75 this._registerReactions(this._allReactions);
76
77 this.isFeatureActive = true;
78
79 if (this.settings.isFeatureEnabledByUser === undefined) {
80 this._updateSettings({
81 isFeatureEnabledByUser: DEFAULT_IS_FEATURE_ENABLED_BY_USER,
82 });
83 }
84 }
85
86 @action stop() {
87 super.stop();
88 debug('TodoStore::stop');
89 this.reset();
90 this.isFeatureActive = false;
91 }
92
93 // ========== PRIVATE METHODS ========= //
94
95 _updateSettings = (changes) => {
96 localStorage.setItem('todos', {
97 ...this.settings,
98 ...changes,
99 });
100 };
101
102 // Actions
103
104 @action _resize = ({ width }) => {
105 this._updateSettings({
106 width,
107 });
108 };
109
110 @action _toggleTodosPanel = () => {
111 this._updateSettings({
112 isTodosPanelVisible: !this.isTodosPanelVisible,
113 });
114 };
115
116 @action _setTodosWebview = ({ webview }) => {
117 debug('_setTodosWebview', webview);
118 this.webview = webview;
119 };
120
121 @action _handleHostMessage = (message) => {
122 debug('_handleHostMessage', message);
123 if (message.action === 'todos:create') {
124 this.webview.send(IPC.TODOS_HOST_CHANNEL, message);
125 }
126 };
127
128 @action _handleClientMessage = (message) => {
129 debug('_handleClientMessage', message);
130 switch (message.action) {
131 case 'todos:initialized': this._onTodosClientInitialized(); break;
132 case 'todos:goToService': this._goToService(message.data); break;
133 default:
134 debug('Unknown client message reiceived', message);
135 }
136 };
137
138 @action _toggleTodosFeatureVisibility = () => {
139 debug('_toggleTodosFeatureVisibility');
140
141 this._updateSettings({
142 isFeatureEnabledByUser: !this.settings.isFeatureEnabledByUser,
143 });
144 };
145
146 // Todos client message handlers
147
148 _onTodosClientInitialized = () => {
149 const { authToken } = this.stores.user;
150 const { isDarkThemeActive } = this.stores.ui;
151 const { locale } = this.stores.app;
152 if (!this.webview) return;
153 this.webview.send(IPC.TODOS_HOST_CHANNEL, {
154 action: 'todos:configure',
155 data: {
156 authToken,
157 locale,
158 theme: isDarkThemeActive ? ThemeType.dark : ThemeType.default,
159 },
160 });
161 };
162
163 _goToService = ({ url, serviceId }) => {
164 if (url) {
165 this.stores.services.one(serviceId).webview.loadURL(url);
166 }
167 this.actions.service.setActive({ serviceId });
168 };
169
170 // Reactions
171
172 _setFeatureEnabledReaction = () => {
173 const { isTodosEnabled } = this.stores.features.features;
174
175 this.isFeatureEnabled = isTodosEnabled;
176 };
177
178 _updateTodosConfig = () => {
179 // Resend the config if any part changes in Franz:
180 this._onTodosClientInitialized();
181 };
182
183 _firstLaunchReaction = () => {
184 const { stats } = this.stores.settings.all;
185
186 // Hide todos layer on first app start but show on second
187 if (stats.appStarts <= 1) {
188 this._updateSettings({
189 isTodosPanelVisible: false,
190 });
191 } else if (stats.appStarts <= 2) {
192 this._updateSettings({
193 isTodosPanelVisible: true,
194 });
195 }
196 };
197
198 _routeCheckReaction = () => {
199 const { pathname } = this.stores.router.location;
200
201 if (pathname === TODOS_ROUTES.TARGET) {
202 debug('Router is on todos route, show todos panel');
203 // todosStore.start(stores, actions);
204 this.stores.router.push('/');
205
206 if (!this.isTodosPanelVisible) {
207 this._updateSettings({
208 isTodosPanelVisible: true,
209 });
210 }
211 }
212 }
213}
diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js
index cbc7372ca..f4ee89a14 100644
--- a/src/features/workspaces/components/WorkspaceDrawer.js
+++ b/src/features/workspaces/components/WorkspaceDrawer.js
@@ -7,6 +7,7 @@ import { H1, Icon, ProBadge } from '@meetfranz/ui';
7import { Button } from '@meetfranz/forms/lib'; 7import { Button } from '@meetfranz/forms/lib';
8import ReactTooltip from 'react-tooltip'; 8import ReactTooltip from 'react-tooltip';
9 9
10import { mdiPlusBox, mdiSettings } from '@mdi/js';
10import WorkspaceDrawerItem from './WorkspaceDrawerItem'; 11import WorkspaceDrawerItem from './WorkspaceDrawerItem';
11import { workspaceActions } from '../actions'; 12import { workspaceActions } from '../actions';
12import { workspaceStore } from '../index'; 13import { workspaceStore } from '../index';
@@ -157,7 +158,7 @@ class WorkspaceDrawer extends Component {
157 data-tip={`${intl.formatMessage(messages.workspacesSettingsTooltip)}`} 158 data-tip={`${intl.formatMessage(messages.workspacesSettingsTooltip)}`}
158 > 159 >
159 <Icon 160 <Icon
160 icon="mdiSettings" 161 icon={mdiSettings}
161 size={1.5} 162 size={1.5}
162 className={classes.workspacesSettingsButtonIcon} 163 className={classes.workspacesSettingsButtonIcon}
163 /> 164 />
@@ -181,7 +182,7 @@ class WorkspaceDrawer extends Component {
181 className={classes.premiumCtaButton} 182 className={classes.premiumCtaButton}
182 buttonType="primary" 183 buttonType="primary"
183 label={intl.formatMessage(messages.premiumCtaButtonLabel)} 184 label={intl.formatMessage(messages.premiumCtaButtonLabel)}
184 icon="mdiPlusBox" 185 icon={mdiPlusBox}
185 onClick={() => { 186 onClick={() => {
186 workspaceActions.openWorkspaceSettings(); 187 workspaceActions.openWorkspaceSettings();
187 }} 188 }}
@@ -220,7 +221,7 @@ class WorkspaceDrawer extends Component {
220 }} 221 }}
221 > 222 >
222 <Icon 223 <Icon
223 icon="mdiPlusBox" 224 icon={mdiPlusBox}
224 size={1} 225 size={1}
225 className={classes.workspacesSettingsButtonIcon} 226 className={classes.workspacesSettingsButtonIcon}
226 /> 227 />
diff --git a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
index c4a800a7b..a70d1d66f 100644
--- a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
+++ b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
@@ -21,11 +21,8 @@ const styles = theme => ({
21 alignItems: 'flex-start', 21 alignItems: 'flex-start',
22 position: 'absolute', 22 position: 'absolute',
23 transition: 'width 0.5s ease', 23 transition: 'width 0.5s ease',
24 width: '100%',
25 marginTop: '20px',
26 },
27 wrapperWhenDrawerIsOpen: {
28 width: `calc(100% - ${theme.workspaces.drawer.width}px)`, 24 width: `calc(100% - ${theme.workspaces.drawer.width}px)`,
25 marginTop: '20px',
29 }, 26 },
30 component: { 27 component: {
31 background: 'rgba(20, 20, 20, 0.4)', 28 background: 'rgba(20, 20, 20, 0.4)',
@@ -64,14 +61,13 @@ class WorkspaceSwitchingIndicator extends Component {
64 render() { 61 render() {
65 const { classes, theme } = this.props; 62 const { classes, theme } = this.props;
66 const { intl } = this.context; 63 const { intl } = this.context;
67 const { isSwitchingWorkspace, isWorkspaceDrawerOpen, nextWorkspace } = workspaceStore; 64 const { isSwitchingWorkspace, nextWorkspace } = workspaceStore;
68 if (!isSwitchingWorkspace) return null; 65 if (!isSwitchingWorkspace) return null;
69 const nextWorkspaceName = nextWorkspace ? nextWorkspace.name : 'All services'; 66 const nextWorkspaceName = nextWorkspace ? nextWorkspace.name : 'All services';
70 return ( 67 return (
71 <div 68 <div
72 className={classnames([ 69 className={classnames([
73 classes.wrapper, 70 classes.wrapper,
74 isWorkspaceDrawerOpen ? classes.wrapperWhenDrawerIsOpen : null,
75 ])} 71 ])}
76 > 72 >
77 <div className={classes.component}> 73 <div className={classes.component}>
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index 9b51f2602..977b23999 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -1,9 +1,9 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component, Fragment } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes, inject } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
6import { Infobox } from '@meetfranz/ui'; 6import { Infobox, Badge } from '@meetfranz/ui';
7 7
8import Loader from '../../../components/ui/Loader'; 8import Loader from '../../../components/ui/Loader';
9import WorkspaceItem from './WorkspaceItem'; 9import WorkspaceItem from './WorkspaceItem';
@@ -11,7 +11,9 @@ import CreateWorkspaceForm from './CreateWorkspaceForm';
11import Request from '../../../stores/lib/Request'; 11import Request from '../../../stores/lib/Request';
12import Appear from '../../../components/ui/effects/Appear'; 12import Appear from '../../../components/ui/effects/Appear';
13import { workspaceStore } from '../index'; 13import { workspaceStore } from '../index';
14import PremiumFeatureContainer from '../../../components/ui/PremiumFeatureContainer'; 14import UIStore from '../../../stores/UIStore';
15import globalMessages from '../../../i18n/globalMessages';
16import UpgradeButton from '../../../components/ui/UpgradeButton';
15 17
16const messages = defineMessages({ 18const messages = defineMessages({
17 headline: { 19 headline: {
@@ -48,7 +50,7 @@ const messages = defineMessages({
48 }, 50 },
49}); 51});
50 52
51const styles = theme => ({ 53const styles = () => ({
52 table: { 54 table: {
53 width: '100%', 55 width: '100%',
54 '& td': { 56 '& td': {
@@ -62,17 +64,28 @@ const styles = theme => ({
62 height: 'auto', 64 height: 'auto',
63 }, 65 },
64 premiumAnnouncement: { 66 premiumAnnouncement: {
65 padding: '20px',
66 backgroundColor: '#3498db',
67 marginLeft: '-20px',
68 marginBottom: '20px',
69 height: 'auto', 67 height: 'auto',
70 color: 'white', 68 },
71 borderRadius: theme.borderRadius, 69 premiumAnnouncementContainer: {
70 display: 'flex',
71 },
72 announcementHeadline: {
73 marginBottom: 0,
74 },
75 teaserImage: {
76 width: 250,
77 margin: [-8, 0, 0, 20],
78 alignSelf: 'center',
79 },
80 upgradeCTA: {
81 margin: [40, 'auto'],
82 },
83 proRequired: {
84 margin: [10, 0, 40],
72 }, 85 },
73}); 86});
74 87
75@injectSheet(styles) @observer 88@inject('stores') @injectSheet(styles) @observer
76class WorkspacesDashboard extends Component { 89class WorkspacesDashboard extends Component {
77 static propTypes = { 90 static propTypes = {
78 classes: PropTypes.object.isRequired, 91 classes: PropTypes.object.isRequired,
@@ -100,7 +113,9 @@ class WorkspacesDashboard extends Component {
100 onWorkspaceClick, 113 onWorkspaceClick,
101 workspaces, 114 workspaces,
102 } = this.props; 115 } = this.props;
116
103 const { intl } = this.context; 117 const { intl } = this.context;
118
104 return ( 119 return (
105 <div className="settings__main"> 120 <div className="settings__main">
106 <div className="settings__header"> 121 <div className="settings__header">
@@ -138,68 +153,80 @@ class WorkspacesDashboard extends Component {
138 153
139 {workspaceStore.isPremiumUpgradeRequired && ( 154 {workspaceStore.isPremiumUpgradeRequired && (
140 <div className={classes.premiumAnnouncement}> 155 <div className={classes.premiumAnnouncement}>
141 <h2>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h2> 156
142 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p> 157 <h1 className={classes.announcementHeadline}>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h1>
158 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge>
159 <div className={classes.premiumAnnouncementContainer}>
160 <div className={classes.premiumAnnouncementContent}>
161 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p>
162 <UpgradeButton
163 className={classes.upgradeCTA}
164 gaEventInfo={{ category: 'Workspaces', event: 'upgrade' }}
165 short
166 requiresPro
167 />
168 </div>
169 <img src={`https://cdn.franzinfra.com/announcements/assets/workspaces_${this.props.stores.ui.isDarkThemeActive ? 'dark' : 'light'}.png`} className={classes.teaserImage} alt="" />
170 </div>
143 </div> 171 </div>
144 )} 172 )}
145 173
146 <PremiumFeatureContainer 174 {!workspaceStore.isPremiumUpgradeRequired && (
147 condition={workspaceStore.isPremiumFeature} 175 <>
148 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'workspaces' }} 176 {/* ===== Create workspace form ===== */}
149 > 177 <div className={classes.createForm}>
150 {/* ===== Create workspace form ===== */} 178 <CreateWorkspaceForm
151 <div className={classes.createForm}> 179 isSubmitting={createWorkspaceRequest.isExecuting}
152 <CreateWorkspaceForm 180 onSubmit={onCreateWorkspaceSubmit}
153 isSubmitting={createWorkspaceRequest.isExecuting} 181 />
154 onSubmit={onCreateWorkspaceSubmit} 182 </div>
155 /> 183 {getUserWorkspacesRequest.isExecuting ? (
156 </div> 184 <Loader />
157 {getUserWorkspacesRequest.isExecuting ? ( 185 ) : (
158 <Loader /> 186 <Fragment>
159 ) : ( 187 {/* ===== Workspace could not be loaded error ===== */}
160 <Fragment> 188 {getUserWorkspacesRequest.error ? (
161 {/* ===== Workspace could not be loaded error ===== */} 189 <Infobox
162 {getUserWorkspacesRequest.error ? ( 190 icon="alert"
163 <Infobox 191 type="danger"
164 icon="alert" 192 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)}
165 type="danger" 193 ctaLoading={getUserWorkspacesRequest.isExecuting}
166 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)} 194 ctaOnClick={getUserWorkspacesRequest.retry}
167 ctaLoading={getUserWorkspacesRequest.isExecuting} 195 >
168 ctaOnClick={getUserWorkspacesRequest.retry} 196 {intl.formatMessage(messages.workspacesRequestFailed)}
169 > 197 </Infobox>
170 {intl.formatMessage(messages.workspacesRequestFailed)} 198 ) : (
171 </Infobox> 199 <Fragment>
172 ) : ( 200 {workspaces.length === 0 ? (
173 <Fragment> 201 <div className="align-middle settings__empty-state">
174 {workspaces.length === 0 ? ( 202 {/* ===== Workspaces empty state ===== */}
175 <div className="align-middle settings__empty-state"> 203 <p className="settings__empty-text">
176 {/* ===== Workspaces empty state ===== */} 204 <span className="emoji">
177 <p className="settings__empty-text"> 205 <img src="./assets/images/emoji/sad.png" alt="" />
178 <span className="emoji"> 206 </span>
179 <img src="./assets/images/emoji/sad.png" alt="" /> 207 {intl.formatMessage(messages.noServicesAdded)}
180 </span> 208 </p>
181 {intl.formatMessage(messages.noServicesAdded)} 209 </div>
182 </p> 210 ) : (
183 </div> 211 <table className={classes.table}>
184 ) : ( 212 {/* ===== Workspaces list ===== */}
185 <table className={classes.table}> 213 <tbody>
186 {/* ===== Workspaces list ===== */} 214 {workspaces.map(workspace => (
187 <tbody> 215 <WorkspaceItem
188 {workspaces.map(workspace => ( 216 key={workspace.id}
189 <WorkspaceItem 217 workspace={workspace}
190 key={workspace.id} 218 onItemClick={w => onWorkspaceClick(w)}
191 workspace={workspace} 219 />
192 onItemClick={w => onWorkspaceClick(w)} 220 ))}
193 /> 221 </tbody>
194 ))} 222 </table>
195 </tbody> 223 )}
196 </table> 224 </Fragment>
197 )} 225 )}
198 </Fragment> 226 </Fragment>
199 )} 227 )}
200 </Fragment> 228 </>
201 )} 229 )}
202 </PremiumFeatureContainer>
203 </div> 230 </div>
204 </div> 231 </div>
205 ); 232 );
@@ -207,3 +234,9 @@ class WorkspacesDashboard extends Component {
207} 234}
208 235
209export default WorkspacesDashboard; 236export default WorkspacesDashboard;
237
238WorkspacesDashboard.wrappedComponent.propTypes = {
239 stores: PropTypes.shape({
240 ui: PropTypes.instanceOf(UIStore).isRequired,
241 }).isRequired,
242};
diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js
index 2ab565fa1..affbd230d 100644
--- a/src/features/workspaces/containers/WorkspacesScreen.js
+++ b/src/features/workspaces/containers/WorkspacesScreen.js
@@ -11,7 +11,7 @@ import {
11 updateWorkspaceRequest, 11 updateWorkspaceRequest,
12} from '../api'; 12} from '../api';
13 13
14@inject('actions') @observer 14@inject('stores', 'actions') @observer
15class WorkspacesScreen extends Component { 15class WorkspacesScreen extends Component {
16 static propTypes = { 16 static propTypes = {
17 actions: PropTypes.shape({ 17 actions: PropTypes.shape({
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index a82f6895c..4a1f80b4e 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -253,11 +253,10 @@ export default class WorkspacesStore extends FeatureStore {
253 }; 253 };
254 254
255 _setIsPremiumFeatureReaction = () => { 255 _setIsPremiumFeatureReaction = () => {
256 const { features, user } = this.stores; 256 const { features } = this.stores;
257 const { isPremium } = user.data; 257 const { isWorkspaceIncludedInCurrentPlan } = features.features;
258 const { isWorkspacePremiumFeature } = features.features; 258 this.isPremiumFeature = !isWorkspaceIncludedInCurrentPlan;
259 this.isPremiumFeature = isWorkspacePremiumFeature; 259 this.isPremiumUpgradeRequired = !isWorkspaceIncludedInCurrentPlan;
260 this.isPremiumUpgradeRequired = isWorkspacePremiumFeature && !isPremium;
261 }; 260 };
262 261
263 _setWorkspaceBeingEditedReaction = () => { 262 _setWorkspaceBeingEditedReaction = () => {
diff --git a/src/helpers/plan-helpers.js b/src/helpers/plan-helpers.js
new file mode 100644
index 000000000..e0f1fd89a
--- /dev/null
+++ b/src/helpers/plan-helpers.js
@@ -0,0 +1,45 @@
1import { defineMessages } from 'react-intl';
2import { PLANS_MAPPING, PLANS } from '../config';
3
4const messages = defineMessages({
5 [PLANS.PRO]: {
6 id: 'pricing.plan.pro',
7 defaultMessage: '!!!Franz Professional',
8 },
9 [PLANS.PERSONAL]: {
10 id: 'pricing.plan.personal',
11 defaultMessage: '!!!Franz Personal',
12 },
13 [PLANS.FREE]: {
14 id: 'pricing.plan.free',
15 defaultMessage: '!!!Franz Free',
16 },
17 [PLANS.LEGACY]: {
18 id: 'pricing.plan.legacy',
19 defaultMessage: '!!!Franz Premium',
20 },
21});
22
23export function i18nPlanName(planId, intl) {
24 if (!planId) {
25 throw new Error('planId is required');
26 }
27
28 if (!intl) {
29 throw new Error('intl context is required');
30 }
31
32 const plan = PLANS_MAPPING[planId];
33
34 return intl.formatMessage(messages[plan]);
35}
36
37export function getPlan(planId) {
38 if (!planId) {
39 throw new Error('planId is required');
40 }
41
42 const plan = PLANS_MAPPING[planId];
43
44 return plan;
45}
diff --git a/src/i18n/globalMessages.js b/src/i18n/globalMessages.js
index adf2cc306..86fb9e18d 100644
--- a/src/i18n/globalMessages.js
+++ b/src/i18n/globalMessages.js
@@ -25,4 +25,8 @@ export default defineMessages({
25 id: 'global.spellchecking.autodetect.short', 25 id: 'global.spellchecking.autodetect.short',
26 defaultMessage: '!!!Automatic', 26 defaultMessage: '!!!Automatic',
27 }, 27 },
28 proRequired: {
29 id: 'global.franzProRequired',
30 defaultMessage: '!!!Franz Professional Required',
31 },
28}); 32});
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index 5b63b97fb..3da31b68e 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Recarrega", 2 "app.errorHandler.action" : "Recarrega",
3 "app.errorHandler.headline" : "Quelcom ha anat malament", 3 "app.errorHandler.headline" : "Quelcom ha anat malament",
4 "feature.announcements.changelog.headline" : "Canvis en Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Canvis en Franz {version}",
5 "feature.delayApp.action" : "Aconsegueix una llicència de suport per a Franz", 5 "feature.delayApp.headline" : "Si us plau, compra una llicència de suport per a Franz per saltar l'espera",
6 "feature.delayApp.headline" : "Si us plau, compra una llicència de suport per a Ferdi per saltar l'espera", 6 "feature.delayApp.text" : "Franz continuarà en {seconds} segons",
7 "feature.delayApp.text" : "Ferdi continuarà en {seconds} segons", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Aconsegueix una llicència de suport per a Franz",
11 "feature.delayApp.upgrade.actionShort" : "Millorar el teu compte",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Envia com a correu", 13 "feature.shareFranz.action.email" : "Envia com a correu",
9 "feature.shareFranz.action.facebook" : "Compartir en Facebook", 14 "feature.shareFranz.action.facebook" : "Compartir en Facebook",
10 "feature.shareFranz.action.twitter" : "Compartir a Twitter", 15 "feature.shareFranz.action.twitter" : "Compartir a Twitter",
11 "feature.shareFranz.headline" : "Junts millorem Franz!", 16 "feature.shareFranz.headline" : "Junts millorem Franz!",
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", 17 "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" : "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", 18 "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" : "Digues als teus amics i col·legues l'increïble que és Ferdi i ajuda'ns a còrrer la veu ", 19 "feature.shareFranz.text" : "Digues als teus amics i col·legues l'increïble que és Franz i ajuda'ns a còrrer la veu ",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz", 23 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.", 25 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.",
17 "global.spellchecker.useDefault" : "Utilitzar el predeterminat del sistema ({default})", 26 "global.spellchecker.useDefault" : "Utilitzar el predeterminat del sistema ({default})",
18 "global.spellchecking.autodetect" : "Detectar l'idioma automàticament", 27 "global.spellchecking.autodetect" : "Detectar l'idioma automàticament",
19 "global.spellchecking.autodetect.short" : "Automàtic", 28 "global.spellchecking.autodetect.short" : "Automàtic",
20 "global.spellchecking.language" : "Corrector ortogràfic", 29 "global.spellchecking.language" : "Corrector ortogràfic",
21 "import.headline" : "Importa els teus serveis Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Serveis que encara no s'admeten a Ferdi 5", 31 "import.headline" : "Importa els teus serveis Franz 4",
32 "import.notSupportedHeadline" : "Serveis que encara no s'admeten a Franz 5",
23 "import.skip.label" : "Vull afegir serveis manualment", 33 "import.skip.label" : "Vull afegir serveis manualment",
24 "import.submit.label" : "Importa serveis", 34 "import.submit.label" : "Importa serveis",
25 "infobar.buttonChangelog" : "Que hi ha de nou?", 35 "infobar.buttonChangelog" : "Que hi ha de nou?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Recarrega els serveis", 37 "infobar.buttonReloadServices" : "Recarrega els serveis",
28 "infobar.requiredRequestsFailed" : "No s'han pogut carregar els serveis i la informació de l'usuari", 38 "infobar.requiredRequestsFailed" : "No s'han pogut carregar els serveis i la informació de l'usuari",
29 "infobar.servicesUpdated" : "Els teus serveis s'han actualitzat.", 39 "infobar.servicesUpdated" : "Els teus serveis s'han actualitzat.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Hi ha disponible una nova actualització per a Franz.", 41 "infobar.updateAvailable" : "Hi ha disponible una nova actualització per a Franz.",
31 "invite.email.label" : "Correu electrònic", 42 "invite.email.label" : "Correu electrònic",
32 "invite.headline.friends" : "Convida a tres dels teus amics o companys", 43 "invite.headline.friends" : "Convida a tres dels teus amics o companys",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "La teva sessió ha caducat, torna-la a iniciar.", 54 "login.serverLogout" : "La teva sessió ha caducat, torna-la a iniciar.",
44 "login.submit.label" : "Accedir", 55 "login.submit.label" : "Accedir",
45 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.", 56 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Sobre Franz", 59 "menu.app.about" : "Sobre Franz",
47 "menu.app.announcement" : "Què hi ha de nou?", 60 "menu.app.announcement" : "Què hi ha de nou?",
48 "menu.app.checkForUpdates" : "Comprova si hi ha actualitzacions", 61 "menu.app.checkForUpdates" : "Comprova si hi ha actualitzacions",
@@ -68,6 +81,9 @@
68 "menu.file" : "Fitxer", 81 "menu.file" : "Fitxer",
69 "menu.help" : "Ajuda", 82 "menu.help" : "Ajuda",
70 "menu.help.changelog" : "Registre de canvis", 83 "menu.help.changelog" : "Registre de canvis",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Conegueu-ne més detalls", 87 "menu.help.learnMore" : "Conegueu-ne més detalls",
72 "menu.help.privacy" : "Declaració de privacitat", 88 "menu.help.privacy" : "Declaració de privacitat",
73 "menu.help.support" : "Suport", 89 "menu.help.support" : "Suport",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Afegeix un servei...", 93 "menu.services.addNewService" : "Afegeix un servei...",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "Visualitza", 96 "menu.view" : "Visualitza",
80 "menu.view.enterFullScreen" : "Inicia la pantalla completa", 97 "menu.view.enterFullScreen" : "Inicia la pantalla completa",
81 "menu.view.exitFullScreen" : "Surt de pantalla completa", 98 "menu.view.exitFullScreen" : "Surt de pantalla completa",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Activa serveis per a desenvolupadors", 102 "menu.view.toggleDevTools" : "Activa serveis per a desenvolupadors",
86 "menu.view.toggleFullScreen" : "Activa la pantalla completa", 103 "menu.view.toggleFullScreen" : "Activa la pantalla completa",
87 "menu.view.toggleServiceDevTools" : "Habilita les eines de desenvolupador de serveis", 104 "menu.view.toggleServiceDevTools" : "Habilita les eines de desenvolupador de serveis",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Amplia", 106 "menu.view.zoomIn" : "Amplia",
89 "menu.view.zoomOut" : "Redueix", 107 "menu.view.zoomOut" : "Redueix",
90 "menu.window" : "Finestra", 108 "menu.window" : "Finestra",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Enviar", 121 "password.submit.label" : "Enviar",
104 "password.successInfo" : "Comproveu el vostre correu electrònic", 122 "password.successInfo" : "Comproveu el vostre correu electrònic",
105 "premiumFeature.button.upgradeAccount" : "Millorar el teu compte", 123 "premiumFeature.button.upgradeAccount" : "Millorar el teu compte",
106 "pricing.headline" : "Donar suport a Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "No vull donar suport al desenvolupament de Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Vull donar suport al desenvolupament de Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Seleccioneu el vostre pla de suport", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Recarrega {name}", 151 "service.crashHandler.action" : "Recarrega {name}",
111 "service.crashHandler.autoReload" : "Intentant restablir automàticament {name} en {seconds} segons", 152 "service.crashHandler.autoReload" : "Intentant restablir automàticament {name} en {seconds} segons",
112 "service.crashHandler.headline" : "Oh no!", 153 "service.crashHandler.headline" : "Oh no!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh no!", 159 "service.errorHandler.headline" : "Oh no!",
119 "service.errorHandler.message" : "Error", 160 "service.errorHandler.message" : "Error",
120 "service.errorHandler.text" : "{name} ha fallat al carregar", 161 "service.errorHandler.text" : "{name} ha fallat al carregar",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "Introducció", 168 "services.getStarted" : "Introducció",
123 "services.welcome" : "Benvingut a Franz", 169 "services.welcome" : "Benvingut a Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Canvia la contrasenya", 181 "settings.account.headlinePassword" : "Canvia la contrasenya",
136 "settings.account.headlineProfile" : "Actualitza el perfil", 182 "settings.account.headlineProfile" : "Actualitza el perfil",
137 "settings.account.headlineSubscription" : "La vostra subscripció", 183 "settings.account.headlineSubscription" : "La vostra subscripció",
138 "settings.account.headlineUpgrade" : "Actualitzeu el vostre compte i doneu suport a Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Descarregar", 186 "settings.account.invoiceDownload" : "Descarregar",
140 "settings.account.manageSubscription.label" : "Gestioneu la vostra subscripció", 187 "settings.account.manageSubscription.label" : "Gestioneu la vostra subscripció",
141 "settings.account.successInfo" : "S'han desat els canvis", 188 "settings.account.successInfo" : "S'han desat els canvis",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Torna a provar-ho", 192 "settings.account.tryReloadServices" : "Torna a provar-ho",
143 "settings.account.tryReloadUserInfoRequest" : "Torna a provar-ho", 193 "settings.account.tryReloadUserInfoRequest" : "Torna a provar-ho",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "No s'ha pogut carregar la informació de l'usuari", 195 "settings.account.userInfoRequestFailed" : "No s'ha pogut carregar la informació de l'usuari",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Buida la memòria cau", 197 "settings.app.buttonClearAllCache" : "Buida la memòria cau",
146 "settings.app.buttonInstallUpdate" : "Reinicia i instal·la l'actualització", 198 "settings.app.buttonInstallUpdate" : "Reinicia i instal·la l'actualització",
147 "settings.app.buttonSearchForUpdate" : "Comprova si hi ha actualitzacions", 199 "settings.app.buttonSearchForUpdate" : "Comprova si hi ha actualitzacions",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Uneix-te al Cantó Fosc", 205 "settings.app.form.darkMode" : "Uneix-te al Cantó Fosc",
154 "settings.app.form.enableGPUAcceleration" : "Activar acceleració GPU", 206 "settings.app.form.enableGPUAcceleration" : "Activar acceleració GPU",
155 "settings.app.form.enableSpellchecking" : "Habilita la comprobació ortogràfica", 207 "settings.app.form.enableSpellchecking" : "Habilita la comprobació ortogràfica",
156 "settings.app.form.enableSystemTray" : "Mostra Ferdi a la safata del sistema", 208 "settings.app.form.enableSystemTray" : "Mostra Franz a la safata del sistema",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Idioma", 210 "settings.app.form.language" : "Idioma",
158 "settings.app.form.minimizeToSystemTray" : "Minimitza Ferdi a la safata del sistema", 211 "settings.app.form.minimizeToSystemTray" : "Minimitza Ferdi a la safata del sistema",
159 "settings.app.form.runInBackground" : "Mantén a Ferdi en segon pla en tancar la finestra", 212 "settings.app.form.runInBackground" : "Mantén a Ferdi en segon pla en tancar la finestra",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Els vostres serveis", 235 "settings.navigation.yourServices" : "Els vostres serveis",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Tots els serveis", 237 "settings.recipes.all" : "Tots els serveis",
185 "settings.recipes.dev" : "Desenvolupament", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Serveis disponibles", 245 "settings.recipes.headline" : "Serveis disponibles",
187 "settings.recipes.missingService" : "Trobes a faltar algun servei?", 246 "settings.recipes.missingService" : "Trobes a faltar algun servei?",
188 "settings.recipes.mostPopular" : "Els més populars", 247 "settings.recipes.mostPopular" : "Els més populars",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Configuració", 334 "sidebar.settings" : "Configuració",
276 "sidebar.unmuteApp" : "Activar notificacions i àudio", 335 "sidebar.unmuteApp" : "Activar notificacions i àudio",
277 "signup.company.label" : "Empresa",
278 "signup.email.label" : "Correu electrònic", 336 "signup.email.label" : "Correu electrònic",
279 "signup.emailDuplicate" : "Ja existeix un usuari amb aquesta adreça de correu electrònic", 337 "signup.emailDuplicate" : "Ja existeix un usuari amb aquesta adreça de correu electrònic",
280 "signup.firstname.label" : "Nom", 338 "signup.firstname.label" : "Nom",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "gratuït", 358 "subscription.type.free" : "gratuït",
301 "subscription.type.month" : "mes", 359 "subscription.type.month" : "mes",
302 "subscription.type.year" : "any", 360 "subscription.type.year" : "any",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Cancel·la", 367 "subscriptionPopup.buttonCancel" : "Cancel·la",
304 "subscriptionPopup.buttonDone" : "Fet", 368 "subscriptionPopup.buttonDone" : "Fet",
305 "tabs.item.deleteService" : "Suprimeix el servei", 369 "tabs.item.deleteService" : "Suprimeix el servei",
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index e36f10d5e..5a4c4c428 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -1,25 +1,35 @@
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" : "Změny ve Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Změny ve Franz {version}",
5 "feature.delayApp.action" : "PodpoÅ™ Ferdi a získej Supporter licenci", 5 "feature.delayApp.headline" : "Kup si Franz Supporter licenci a nebudeÅ¡ už muset Äekat",
6 "feature.delayApp.headline" : "Kup si Ferdi Supporter licenci a nebudeÅ¡ už muset Äekat", 6 "feature.delayApp.text" : "Franz bude pokraÄovat v {seconds} sekundách.",
7 "feature.delayApp.text" : "Ferdi bude pokraÄovat v {seconds} sekundách.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Podpoř Franz a získej Supporter licenci",
11 "feature.delayApp.upgrade.actionShort" : "VylepÅ¡i si svůj úÄet",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Poslat jako e-mail", 13 "feature.shareFranz.action.email" : "Poslat jako e-mail",
9 "feature.shareFranz.action.facebook" : "Sdílet na Facebooku", 14 "feature.shareFranz.action.facebook" : "Sdílet na Facebooku",
10 "feature.shareFranz.action.twitter" : "Sdílet na Twitteru", 15 "feature.shareFranz.action.twitter" : "Sdílet na Twitteru",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "SpoleÄnÄ› je Franz jeÅ¡tÄ› lepší!",
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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "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 Ferdi k online službám", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Nemůžeme připojit Franz k online službám",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Připojení k internetu není k dispozici.", 25 "global.notConnectedToTheInternet" : "Připojení k internetu není k dispozici.",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 26 "global.spellchecker.useDefault" : "Use System Default ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Oprava překlepů jazyka", 29 "global.spellchecking.language" : "Oprava překlepů jazyka",
21 "import.headline" : "Importovat služby z Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Služby nejsou podporovány ve verzi Ferdi 5", 31 "import.headline" : "Importovat služby z Franz 4",
32 "import.notSupportedHeadline" : "Služby nejsou podporovány ve verzi Franz 5",
23 "import.skip.label" : "Chci pÅ™idat službu ruÄnÄ›", 33 "import.skip.label" : "Chci pÅ™idat službu ruÄnÄ›",
24 "import.submit.label" : "Importovat služby", 34 "import.submit.label" : "Importovat služby",
25 "infobar.buttonChangelog" : "Co je nového?", 35 "infobar.buttonChangelog" : "Co je nového?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Obnovit služby", 37 "infobar.buttonReloadServices" : "Obnovit služby",
28 "infobar.requiredRequestsFailed" : "Není možné nahrát služby a informace o uživateli", 38 "infobar.requiredRequestsFailed" : "Není možné nahrát služby a informace o uživateli",
29 "infobar.servicesUpdated" : "Vaše služby byly aktualizovány", 39 "infobar.servicesUpdated" : "Vaše služby byly aktualizovány",
30 "infobar.updateAvailable" : "Nová aktualizace Ferdi je k dispozici", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Nová aktualizace Franz je k dispozici",
31 "invite.email.label" : "E-mailová adresa", 42 "invite.email.label" : "E-mailová adresa",
32 "invite.headline.friends" : "Pozvěte 3 přátele nebo kolegy", 43 "invite.headline.friends" : "Pozvěte 3 přátele nebo kolegy",
33 "invite.name.label" : "Jméno", 44 "invite.name.label" : "Jméno",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Sezení vypršelo, je třeba se znovu přihlásit.", 54 "login.serverLogout" : "Sezení vypršelo, je třeba se znovu přihlásit.",
44 "login.submit.label" : "Přihlásit se", 55 "login.submit.label" : "Přihlásit se",
45 "login.tokenExpired" : "Sezení vypršelo, prosím přihlaste se znovu", 56 "login.tokenExpired" : "Sezení vypršelo, prosím přihlaste se znovu",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "O aplikaci", 59 "menu.app.about" : "O aplikaci",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Zkontrolovat aktualizace", 61 "menu.app.checkForUpdates" : "Zkontrolovat aktualizace",
@@ -68,6 +81,9 @@
68 "menu.file" : "Soubor", 81 "menu.file" : "Soubor",
69 "menu.help" : "Nápověda", 82 "menu.help" : "Nápověda",
70 "menu.help.changelog" : "Seznam změn", 83 "menu.help.changelog" : "Seznam změn",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Dozvědět se více", 87 "menu.help.learnMore" : "Dozvědět se více",
72 "menu.help.privacy" : "Prohlášení o ochraně soukromí", 88 "menu.help.privacy" : "Prohlášení o ochraně soukromí",
73 "menu.help.support" : "Podpora", 89 "menu.help.support" : "Podpora",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Přidat novou službu...", 93 "menu.services.addNewService" : "Přidat novou službu...",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "Zobrazení", 96 "menu.view" : "Zobrazení",
80 "menu.view.enterFullScreen" : "Spustit režim celé obrazovky", 97 "menu.view.enterFullScreen" : "Spustit režim celé obrazovky",
81 "menu.view.exitFullScreen" : "UkonÄit celoobrazovkový režim", 98 "menu.view.exitFullScreen" : "UkonÄit celoobrazovkový režim",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Zobrazit Vývojářské nástroje", 102 "menu.view.toggleDevTools" : "Zobrazit Vývojářské nástroje",
86 "menu.view.toggleFullScreen" : "Přepnout na celou obrazovku", 103 "menu.view.toggleFullScreen" : "Přepnout na celou obrazovku",
87 "menu.view.toggleServiceDevTools" : "Zobrazit Vývojářské nástroje pro službu", 104 "menu.view.toggleServiceDevTools" : "Zobrazit Vývojářské nástroje pro službu",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Přiblížit", 106 "menu.view.zoomIn" : "Přiblížit",
89 "menu.view.zoomOut" : "Oddálit", 107 "menu.view.zoomOut" : "Oddálit",
90 "menu.window" : "Okno", 108 "menu.window" : "Okno",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Odeslat", 121 "password.submit.label" : "Odeslat",
104 "password.successInfo" : "Prosím, zkontrolujte svůj e-mail", 122 "password.successInfo" : "Prosím, zkontrolujte svůj e-mail",
105 "premiumFeature.button.upgradeAccount" : "VylepÅ¡i si svůj úÄet", 123 "premiumFeature.button.upgradeAccount" : "VylepÅ¡i si svůj úÄet",
106 "pricing.headline" : "Podpořit Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Nechci podporovat vývoj aplikace Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Chci podpořit vývoj aplikace Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Vyberte váš plán podpory", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "NaÄíst znovu {name}", 151 "service.crashHandler.action" : "NaÄíst znovu {name}",
111 "service.crashHandler.autoReload" : "Pokus o automatické obnovení {name} za {seconds} sekund", 152 "service.crashHandler.autoReload" : "Pokus o automatické obnovení {name} za {seconds} sekund",
112 "service.crashHandler.headline" : "Ale ne!", 153 "service.crashHandler.headline" : "Ale ne!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Ale ne!", 159 "service.errorHandler.headline" : "Ale ne!",
119 "service.errorHandler.message" : "Chyba", 160 "service.errorHandler.message" : "Chyba",
120 "service.errorHandler.text" : "{name} se nepodaÅ™ilo naÄíst.", 161 "service.errorHandler.text" : "{name} se nepodaÅ™ilo naÄíst.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "ZaÄnÄ›me", 168 "services.getStarted" : "ZaÄnÄ›me",
123 "services.welcome" : "Vítejte v programu Franz", 169 "services.welcome" : "Vítejte v programu Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Změnit heslo", 181 "settings.account.headlinePassword" : "Změnit heslo",
136 "settings.account.headlineProfile" : "Aktualizovat profil", 182 "settings.account.headlineProfile" : "Aktualizovat profil",
137 "settings.account.headlineSubscription" : "Vaše předplatné", 183 "settings.account.headlineSubscription" : "Vaše předplatné",
138 "settings.account.headlineUpgrade" : "Aktualizujte svůj úÄet a podpoÅ™te Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Stáhnout", 186 "settings.account.invoiceDownload" : "Stáhnout",
140 "settings.account.manageSubscription.label" : "Spravovat vaše předplatné", 187 "settings.account.manageSubscription.label" : "Spravovat vaše předplatné",
141 "settings.account.successInfo" : "Vaše změny byly uloženy", 188 "settings.account.successInfo" : "Vaše změny byly uloženy",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Zkusit opět", 192 "settings.account.tryReloadServices" : "Zkusit opět",
143 "settings.account.tryReloadUserInfoRequest" : "Zkusit znovu", 193 "settings.account.tryReloadUserInfoRequest" : "Zkusit znovu",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Nelze naÄíst informace o uživateli.", 195 "settings.account.userInfoRequestFailed" : "Nelze naÄíst informace o uživateli.",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Vyprázdnit mezipaměti", 197 "settings.app.buttonClearAllCache" : "Vyprázdnit mezipaměti",
146 "settings.app.buttonInstallUpdate" : "Restartovat a nainstalovat aktualizace", 198 "settings.app.buttonInstallUpdate" : "Restartovat a nainstalovat aktualizace",
147 "settings.app.buttonSearchForUpdate" : "Zkontrolovat aktualizace", 199 "settings.app.buttonSearchForUpdate" : "Zkontrolovat aktualizace",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Připoj se k Temné straně", 205 "settings.app.form.darkMode" : "Připoj se k Temné straně",
154 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení", 206 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení",
155 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu", 207 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu",
156 "settings.app.form.enableSystemTray" : "Zobrazit Ferdi v systémové liště", 208 "settings.app.form.enableSystemTray" : "Zobrazit Franz v systémové liště",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Jazyk", 210 "settings.app.form.language" : "Jazyk",
158 "settings.app.form.minimizeToSystemTray" : "Minimalizovat Ferdi do systémové lišty", 211 "settings.app.form.minimizeToSystemTray" : "Minimalizovat Ferdi do systémové lišty",
159 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna", 212 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Vaše služby", 235 "settings.navigation.yourServices" : "Vaše služby",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Všechny služby", 237 "settings.recipes.all" : "Všechny služby",
185 "settings.recipes.dev" : "Vývoj", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Dostupné služby", 245 "settings.recipes.headline" : "Dostupné služby",
187 "settings.recipes.missingService" : "Chybějící služba?", 246 "settings.recipes.missingService" : "Chybějící služba?",
188 "settings.recipes.mostPopular" : "Nejpopulárnější", 247 "settings.recipes.mostPopular" : "Nejpopulárnější",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Nastavení", 334 "sidebar.settings" : "Nastavení",
276 "sidebar.unmuteApp" : "Zapnout upozornění a zvuky", 335 "sidebar.unmuteApp" : "Zapnout upozornění a zvuky",
277 "signup.company.label" : "SpoleÄnost",
278 "signup.email.label" : "Emailová adresa", 336 "signup.email.label" : "Emailová adresa",
279 "signup.emailDuplicate" : "Uživatel s touto emailovou adresou již existuje", 337 "signup.emailDuplicate" : "Uživatel s touto emailovou adresou již existuje",
280 "signup.firstname.label" : "Jméno", 338 "signup.firstname.label" : "Jméno",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "zdarma", 358 "subscription.type.free" : "zdarma",
301 "subscription.type.month" : "měsíc", 359 "subscription.type.month" : "měsíc",
302 "subscription.type.year" : "rok", 360 "subscription.type.year" : "rok",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Zrušit", 367 "subscriptionPopup.buttonCancel" : "Zrušit",
304 "subscriptionPopup.buttonDone" : "DokonÄit", 368 "subscriptionPopup.buttonDone" : "DokonÄit",
305 "tabs.item.deleteService" : "Odstranit službu", 369 "tabs.item.deleteService" : "Odstranit službu",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 42cfb9ad1..06bdaabfe 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -1,23 +1,33 @@
1{ 1{
2 "app.errorHandler.action" : "Neu laden", 2 "app.errorHandler.action" : "Neu laden",
3 "app.errorHandler.headline" : "Es ist ein Fehler aufgetreten", 3 "app.errorHandler.headline" : "Es ist ein Fehler aufgetreten",
4 "feature.announcements.changelog.headline" : "Was ist neu in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Was ist neu in Franz {version}",
5 "feature.delayApp.action" : "Hol dir Ferdi Premium!", 5 "feature.delayApp.headline" : "Erspare dir das Warten mit Franz Premium!",
6 "feature.delayApp.headline" : "Erspare dir das Warten mit Ferdi Premium!",
7 "feature.delayApp.text" : "In {seconds} Sekunden geht's weiter!", 6 "feature.delayApp.text" : "In {seconds} Sekunden geht's weiter!",
7 "feature.delayApp.trial.action" : "Ja, ich möchte Franz Professional 14 Tage gratis testen",
8 "feature.delayApp.trial.actionShort" : "Aktiviere die kostenlose Franz Professional Testlizenz",
9 "feature.delayApp.trial.headline" : "Hol dir die kostenlose Franz Professional Testlizenz und es geht ohne Warten weiter!",
10 "feature.delayApp.upgrade.action" : "Hol dir Franz Premium!",
11 "feature.delayApp.upgrade.actionShort" : "Account upgraden",
12 "feature.serviceLimit.limitReached" : "Du hast {amount} von {limit} in deiner Lizenz inkludierten Services hinzugefügt. Bitte führe ein Upgrade deines Accounts durch, um mehr Services hinzuzufügen.",
8 "feature.shareFranz.action.email" : "Als E-Mail senden", 13 "feature.shareFranz.action.email" : "Als E-Mail senden",
9 "feature.shareFranz.action.facebook" : "Auf Facebook teilen", 14 "feature.shareFranz.action.facebook" : "Auf Facebook teilen",
10 "feature.shareFranz.action.twitter" : "Auf Twitter teilen", 15 "feature.shareFranz.action.twitter" : "Auf Twitter teilen",
11 "feature.shareFranz.headline" : "Gemeinsam ist Ferdi noch besser!", 16 "feature.shareFranz.headline" : "Gemeinsam ist Franz noch besser!",
12 "feature.shareFranz.shareText.email" : "Ich habe {count} Services zu Ferdi hinzugefügt! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.meetfranz.com", 17 "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 Ferdi hinzugefügt! Hol dir die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.meetfranz.com \/cc @FranzMessenger", 18 "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 Ferdi toll findest.", 19 "feature.shareFranz.text" : "Bitte erzähle deinen Freunden und Kolleginnen, warum du Franz toll findest.",
20 "feature.todos.premium.info" : "Franz ToDos sind jetzt für Premium User verfügbar!",
21 "feature.todos.premium.rollout" : "Alle anderen müssen sich noch ein wenig gedulden.",
22 "feature.todos.premium.upgrade" : "Account Upgrade",
15 "global.api.unhealthy" : "Verbindung zum Franz-Online-Service fehlgeschlagen", 23 "global.api.unhealthy" : "Verbindung zum Franz-Online-Service fehlgeschlagen",
24 "global.franzProRequired" : "Franz Professional benötigt",
16 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.", 25 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.",
17 "global.spellchecker.useDefault" : "Standard benutzen ({default})", 26 "global.spellchecker.useDefault" : "Standard benutzen ({default})",
18 "global.spellchecking.autodetect" : "Sprache automatisch erkennen", 27 "global.spellchecking.autodetect" : "Sprache automatisch erkennen",
19 "global.spellchecking.autodetect.short" : "Automatisch", 28 "global.spellchecking.autodetect.short" : "Automatisch",
20 "global.spellchecking.language" : "Sprache für Rechtschreibprüfung", 29 "global.spellchecking.language" : "Sprache für Rechtschreibprüfung",
30 "global.upgradeButton.upgradeToPro" : "Upgrade zu Franz Professional",
21 "import.headline" : "Deine Franz-4-Dienste importieren", 31 "import.headline" : "Deine Franz-4-Dienste importieren",
22 "import.notSupportedHeadline" : "Dienste, die noch nicht von Ferdi 5 unterstützt werden", 32 "import.notSupportedHeadline" : "Dienste, die noch nicht von Ferdi 5 unterstützt werden",
23 "import.skip.label" : "Ich möchte Dienste selbst hinzufügen", 33 "import.skip.label" : "Ich möchte Dienste selbst hinzufügen",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Dienste neu laden", 37 "infobar.buttonReloadServices" : "Dienste neu laden",
28 "infobar.requiredRequestsFailed" : "Dienste und Benutzerinformationen konnten nicht geladen werden", 38 "infobar.requiredRequestsFailed" : "Dienste und Benutzerinformationen konnten nicht geladen werden",
29 "infobar.servicesUpdated" : "Deine Dienste wurden aktualisiert.", 39 "infobar.servicesUpdated" : "Deine Dienste wurden aktualisiert.",
30 "infobar.updateAvailable" : "Eine neue Version von Ferdi ist verfügbar!", 40 "infobar.trialActivated" : "Deine kostenlose Testlizenz wurde erfolgreich aktiviert. Viel Spaß!",
41 "infobar.updateAvailable" : "Eine neue Version von Franz ist verfügbar!",
31 "invite.email.label" : "E-Mail-Adresse", 42 "invite.email.label" : "E-Mail-Adresse",
32 "invite.headline.friends" : "Lade drei Freunde oder Kolleginnen ein!", 43 "invite.headline.friends" : "Lade drei Freunde oder Kolleginnen ein!",
33 "invite.name.label" : "Name", 44 "invite.name.label" : "Name",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.", 54 "login.serverLogout" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.",
44 "login.submit.label" : "Anmelden", 55 "login.submit.label" : "Anmelden",
45 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.", 56 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.",
57 "menu.Todoss.closeTodosDrawer" : "ToDos schließen",
58 "menu.Todoss.openTodosDrawer" : "ToDos öffnen",
46 "menu.app.about" : "Ãœber Franz", 59 "menu.app.about" : "Ãœber Franz",
47 "menu.app.announcement" : "Was ist neu?", 60 "menu.app.announcement" : "Was ist neu?",
48 "menu.app.checkForUpdates" : "Nach Updates suchen", 61 "menu.app.checkForUpdates" : "Nach Updates suchen",
@@ -68,6 +81,9 @@
68 "menu.file" : "Datei", 81 "menu.file" : "Datei",
69 "menu.help" : "Hilfe", 82 "menu.help" : "Hilfe",
70 "menu.help.changelog" : "Changelog", 83 "menu.help.changelog" : "Changelog",
84 "menu.help.debugInfo" : "Debugging-Information anzeigen",
85 "menu.help.debugInfoCopiedBody" : "Deine Debugging-Information wurde in die Zwischenablage kopiert.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debugging-Information",
71 "menu.help.learnMore" : "Mehr erfahren", 87 "menu.help.learnMore" : "Mehr erfahren",
72 "menu.help.privacy" : "Datenschutzerklärung", 88 "menu.help.privacy" : "Datenschutzerklärung",
73 "menu.help.support" : "Hilfe", 89 "menu.help.support" : "Hilfe",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Vorheriger Dienst", 92 "menu.services.activatePreviousService" : "Vorheriger Dienst",
77 "menu.services.addNewService" : "Dienst hinzufügen", 93 "menu.services.addNewService" : "Dienst hinzufügen",
78 "menu.services.setNextServiceActive" : "Nächster Dienst", 94 "menu.services.setNextServiceActive" : "Nächster Dienst",
95 "menu.todos" : "ToDos",
79 "menu.view" : "Darstellung", 96 "menu.view" : "Darstellung",
80 "menu.view.enterFullScreen" : "Vollbildmodus", 97 "menu.view.enterFullScreen" : "Vollbildmodus",
81 "menu.view.exitFullScreen" : "Vollbildmodus aus", 98 "menu.view.exitFullScreen" : "Vollbildmodus aus",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Entwicklertools anzeigen", 102 "menu.view.toggleDevTools" : "Entwicklertools anzeigen",
86 "menu.view.toggleFullScreen" : "Vollbildmodus umschalten", 103 "menu.view.toggleFullScreen" : "Vollbildmodus umschalten",
87 "menu.view.toggleServiceDevTools" : "Entwicklertools für Dienst anzeigen", 104 "menu.view.toggleServiceDevTools" : "Entwicklertools für Dienst anzeigen",
105 "menu.view.toggleTodosDevTools" : "ToDos Developer Tools umschalten",
88 "menu.view.zoomIn" : "Vergrößern", 106 "menu.view.zoomIn" : "Vergrößern",
89 "menu.view.zoomOut" : "Verkleinern", 107 "menu.view.zoomOut" : "Verkleinern",
90 "menu.window" : "Fenster", 108 "menu.window" : "Fenster",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Absenden", 121 "password.submit.label" : "Absenden",
104 "password.successInfo" : "Wir haben Dir eine E-Mail mit weiteren Anweisungen geschickt.", 122 "password.successInfo" : "Wir haben Dir eine E-Mail mit weiteren Anweisungen geschickt.",
105 "premiumFeature.button.upgradeAccount" : "Account upgraden", 123 "premiumFeature.button.upgradeAccount" : "Account upgraden",
106 "pricing.headline" : "Ferdi unterstützen", 124 "pricing.features.adFree" : "Keine Werbung",
107 "pricing.link.skipPayment" : "Ich möchte die Entwicklung von Ferdi nicht unterstützen.", 125 "pricing.features.appDelays" : "Keine unnötigen Unterbrechungen",
108 "pricing.submit.label" : "Ich möchte die Entwicklung von Ferdi unterstützen.", 126 "pricing.features.customWebsites" : "Hinzufügen von eigenen Websites",
109 "pricing.support.label" : "Wie möchtest Du Ferdi unterstützen?", 127 "pricing.features.onPremise" : "On-premise & andere Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Rechtschreibprüfung",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Integration von Services über Drittanbieter",
132 "pricing.features.unlimitedServices" : "Unbegrenztes hinzufügen von Services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal monatlich",
138 "pricing.plan.personal-yearly" : "Franz Personal jährlich",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional monatlich",
141 "pricing.plan.pro-yearly" : "Franz Professional jährlich",
142 "pricing.trial.cta.accept" : "Ja, Upgrade zu Franz Professional durchführen",
143 "pricing.trial.cta.skip" : "Weiter zu Franz!",
144 "pricing.trial.error" : "Tut uns leid, wir konnten deine kostenlose Testlizenz nicht aktivieren.",
145 "pricing.trial.features.headline" : "Franz Professional beinhaltet:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Dein persönliches Willkommensangebot:",
148 "pricing.trial.terms.automaticTrialEnd" : "Deine kostenlose Testlizenz endet automatisch nach 14 Tagen",
149 "pricing.trial.terms.headline" : "Ohne Bindung, ohne Haken",
150 "pricing.trial.terms.noCreditCard" : "Keine Kreditkarte notwendig",
110 "service.crashHandler.action" : "{name} neu laden", 151 "service.crashHandler.action" : "{name} neu laden",
111 "service.crashHandler.autoReload" : "{name} wird in {seconds} Sekunden automatisch wiederhergestellt", 152 "service.crashHandler.autoReload" : "{name} wird in {seconds} Sekunden automatisch wiederhergestellt",
112 "service.crashHandler.headline" : "Oh nein!", 153 "service.crashHandler.headline" : "Oh nein!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh nein!", 159 "service.errorHandler.headline" : "Oh nein!",
119 "service.errorHandler.message" : "Fehler", 160 "service.errorHandler.message" : "Fehler",
120 "service.errorHandler.text" : "{name} konnte nicht geladen werden.", 161 "service.errorHandler.text" : "{name} konnte nicht geladen werden.",
162 "service.restrictedHandler.action" : "Account Upgrade",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional benötigt",
164 "service.restrictedHandler.customUrl.text" : "Bitte ein Upgrade zu Franz Professional durchführen um benutzerdefinierte URLs und Self Hosted Services verwenden zu können.",
165 "service.restrictedHandler.serviceLimit.headline" : "Du hast deine maximale Anzahl an Services erreicht.",
166 "service.restrictedHandler.serviceLimit.text" : "Bitte führe eine Upgrade deines Accounts durch um mehr als {count} Services verwenden zu können.",
121 "service.webviewLoader.loading" : "Lade", 167 "service.webviewLoader.loading" : "Lade",
122 "services.getStarted" : "Los geht's!", 168 "services.getStarted" : "Los geht's!",
123 "services.welcome" : "Willkommen bei Franz!", 169 "services.welcome" : "Willkommen bei Franz!",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Passwort ändern", 181 "settings.account.headlinePassword" : "Passwort ändern",
136 "settings.account.headlineProfile" : "Profil aktualisieren", 182 "settings.account.headlineProfile" : "Profil aktualisieren",
137 "settings.account.headlineSubscription" : "Dein Abonnement", 183 "settings.account.headlineSubscription" : "Dein Abonnement",
138 "settings.account.headlineUpgrade" : "Dein Konto upgraden & Ferdi unterstützen", 184 "settings.account.headlineTrialUpgrade" : "Hol dir die kostenlose 14-tägige Franz Professional Testlizenz!",
185 "settings.account.headlineUpgradeAccount" : "Hol dir ein Upgrade deines Accounts und bekomme alle Features von Franz!",
139 "settings.account.invoiceDownload" : "Herunterladen", 186 "settings.account.invoiceDownload" : "Herunterladen",
140 "settings.account.manageSubscription.label" : "Dein Abonnement verwalten", 187 "settings.account.manageSubscription.label" : "Dein Abonnement verwalten",
141 "settings.account.successInfo" : "Deine Änderungen wurden gespeichert", 188 "settings.account.successInfo" : "Deine Änderungen wurden gespeichert",
189 "settings.account.trial" : "Kostenlose Testlizenz",
190 "settings.account.trialEndsIn" : "Deine kostenlose Testlizenz endet in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Bitte aktualisiere deine Zahlungsinformation damit du {license} nach der kostenlosen Testphase weiter nutzen kannst.",
142 "settings.account.tryReloadServices" : "Erneut versuchen", 192 "settings.account.tryReloadServices" : "Erneut versuchen",
143 "settings.account.tryReloadUserInfoRequest" : "Erneut versuchen", 193 "settings.account.tryReloadUserInfoRequest" : "Erneut versuchen",
194 "settings.account.upgradeToPro.label" : "Upgrade zu Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Benutzerinformationen konnten nicht geladen werden", 195 "settings.account.userInfoRequestFailed" : "Benutzerinformationen konnten nicht geladen werden",
196 "settings.account.yourLicense" : "Deine Franz Lizenz",
145 "settings.app.buttonClearAllCache" : "Cache leeren", 197 "settings.app.buttonClearAllCache" : "Cache leeren",
146 "settings.app.buttonInstallUpdate" : "Neu starten & Update installieren", 198 "settings.app.buttonInstallUpdate" : "Neu starten & Update installieren",
147 "settings.app.buttonSearchForUpdate" : "Nach Updates suchen", 199 "settings.app.buttonSearchForUpdate" : "Nach Updates suchen",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Die dunkle Seite erwartet dich! (Dark Mode)", 205 "settings.app.form.darkMode" : "Die dunkle Seite erwartet dich! (Dark Mode)",
154 "settings.app.form.enableGPUAcceleration" : "Hardwarebeschleunigung aktivieren", 206 "settings.app.form.enableGPUAcceleration" : "Hardwarebeschleunigung aktivieren",
155 "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren", 207 "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren",
156 "settings.app.form.enableSystemTray" : "Ferdi im Infobereich anzeigen", 208 "settings.app.form.enableSystemTray" : "Franz im Infobereich anzeigen",
209 "settings.app.form.enableTodos" : "Franz Todos aktivieren",
157 "settings.app.form.language" : "Sprache", 210 "settings.app.form.language" : "Sprache",
158 "settings.app.form.minimizeToSystemTray" : "Ferdi in den Infobereich minimieren", 211 "settings.app.form.minimizeToSystemTray" : "Ferdi in den Infobereich minimieren",
159 "settings.app.form.runInBackground" : "Ferdi im Hintergrund behalten, wenn das Fenster geschlossen wird", 212 "settings.app.form.runInBackground" : "Ferdi im Hintergrund behalten, wenn das Fenster geschlossen wird",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Deine Dienste", 235 "settings.navigation.yourServices" : "Deine Dienste",
183 "settings.navigation.yourWorkspaces" : "Deine Workspaces", 236 "settings.navigation.yourWorkspaces" : "Deine Workspaces",
184 "settings.recipes.all" : "Alle Dienste", 237 "settings.recipes.all" : "Alle Dienste",
185 "settings.recipes.dev" : "Entwicklung", 238 "settings.recipes.custom" : "Eigene Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Benutzerdefinierte Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Eigene Recipes",
242 "settings.recipes.customService.intro" : "Um ein benutzerdefiniertes Service hinzuzufügen, kopiere das Service Recipe nach:",
243 "settings.recipes.customService.openDevDocs" : "Entwicklerdokumentation",
244 "settings.recipes.customService.openFolder" : "Ordner öffnen",
186 "settings.recipes.headline" : "Verfügbare Dienste", 245 "settings.recipes.headline" : "Verfügbare Dienste",
187 "settings.recipes.missingService" : "Fehlt ein Dienst?", 246 "settings.recipes.missingService" : "Fehlt ein Dienst?",
188 "settings.recipes.mostPopular" : "Am beliebtesten", 247 "settings.recipes.mostPopular" : "Am beliebtesten",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Workspaces öffnen", 333 "sidebar.openWorkspaceDrawer" : "Workspaces öffnen",
275 "sidebar.settings" : "Einstellungen", 334 "sidebar.settings" : "Einstellungen",
276 "sidebar.unmuteApp" : "Benachrichtigungen & Audio aktivieren", 335 "sidebar.unmuteApp" : "Benachrichtigungen & Audio aktivieren",
277 "signup.company.label" : "Firma",
278 "signup.email.label" : "E-Mail-Adresse", 336 "signup.email.label" : "E-Mail-Adresse",
279 "signup.emailDuplicate" : "Es existiert bereits ein Benutzer mit dieser E-Mail Adresse.", 337 "signup.emailDuplicate" : "Es existiert bereits ein Benutzer mit dieser E-Mail Adresse.",
280 "signup.firstname.label" : "Vorname", 338 "signup.firstname.label" : "Vorname",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "kostenlos", 358 "subscription.type.free" : "kostenlos",
301 "subscription.type.month" : "Monat", 359 "subscription.type.month" : "Monat",
302 "subscription.type.year" : "Jahr", 360 "subscription.type.year" : "Jahr",
361 "subscription.cta.activateTrial" : "Ja, kostenlose Franz Professional Testlizenz starten",
362 "subscription.cta.allOptions" : "Alle Optionen anzeigen",
363 "subscription.cta.choosePlan" : "Wähle deine Lizenz",
364 "subscription.includedProFeatures" : "Die Franz Professional Lizenz beinhaltet:",
365 "subscription.teaser.includedFeatures" : "Bezahlte Franz Lizenzen beinhalten:",
366 "subscription.teaser.intro" : "Franz 5 ist voll gepackt mit vielen neuen Features, damit du für jegliche kommunikative Eventualität gerüstet bist. Nimm dir was du brauchst und leg los!",
303 "subscriptionPopup.buttonCancel" : "Abbrechen", 367 "subscriptionPopup.buttonCancel" : "Abbrechen",
304 "subscriptionPopup.buttonDone" : "Fertig", 368 "subscriptionPopup.buttonDone" : "Fertig",
305 "tabs.item.deleteService" : "Dienst löschen", 369 "tabs.item.deleteService" : "Dienst löschen",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 7d0e075cc..2dd778434 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -443,55 +443,120 @@
443 { 443 {
444 "descriptors": [ 444 "descriptors": [
445 { 445 {
446 "defaultMessage": "!!!Support Ferdi", 446 "defaultMessage": "!!!Franz Professional",
447 "end": { 447 "end": {
448 "column": 3, 448 "column": 3,
449 "line": 16 449 "line": 18
450 }, 450 },
451 "file": "src/components/auth/Pricing.js", 451 "file": "src/components/auth/Pricing.js",
452 "id": "pricing.headline", 452 "id": "pricing.trial.headline",
453 "start": { 453 "start": {
454 "column": 12, 454 "column": 12,
455 "line": 13 455 "line": 15
456 } 456 }
457 }, 457 },
458 { 458 {
459 "defaultMessage": "!!!Select your support plan", 459 "defaultMessage": "!!!Your personal welcome offer:",
460 "end": { 460 "end": {
461 "column": 3, 461 "column": 3,
462 "line": 20 462 "line": 22
463 }, 463 },
464 "file": "src/components/auth/Pricing.js", 464 "file": "src/components/auth/Pricing.js",
465 "id": "pricing.support.label", 465 "id": "pricing.trial.subheadline",
466 "start": { 466 "start": {
467 "column": 23, 467 "column": 17,
468 "line": 17 468 "line": 19
469 } 469 }
470 }, 470 },
471 { 471 {
472 "defaultMessage": "!!!Support the development of Ferdi", 472 "defaultMessage": "!!!No strings attached",
473 "end": { 473 "end": {
474 "column": 3, 474 "column": 3,
475 "line": 24 475 "line": 26
476 }, 476 },
477 "file": "src/components/auth/Pricing.js", 477 "file": "src/components/auth/Pricing.js",
478 "id": "pricing.submit.label", 478 "id": "pricing.trial.terms.headline",
479 "start": {
480 "column": 29,
481 "line": 23
482 }
483 },
484 {
485 "defaultMessage": "!!!No credit card required",
486 "end": {
487 "column": 3,
488 "line": 30
489 },
490 "file": "src/components/auth/Pricing.js",
491 "id": "pricing.trial.terms.noCreditCard",
492 "start": {
493 "column": 16,
494 "line": 27
495 }
496 },
497 {
498 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
499 "end": {
500 "column": 3,
501 "line": 34
502 },
503 "file": "src/components/auth/Pricing.js",
504 "id": "pricing.trial.terms.automaticTrialEnd",
479 "start": { 505 "start": {
480 "column": 21, 506 "column": 21,
481 "line": 21 507 "line": 31
482 } 508 }
483 }, 509 },
484 { 510 {
485 "defaultMessage": "!!!I don't want to support the development of Ferdi.", 511 "defaultMessage": "!!!Sorry, we could not activate your trial!",
486 "end": { 512 "end": {
487 "column": 3, 513 "column": 3,
488 "line": 28 514 "line": 38
489 }, 515 },
490 "file": "src/components/auth/Pricing.js", 516 "file": "src/components/auth/Pricing.js",
491 "id": "pricing.link.skipPayment", 517 "id": "pricing.trial.error",
492 "start": { 518 "start": {
493 "column": 15, 519 "column": 19,
494 "line": 25 520 "line": 35
521 }
522 },
523 {
524 "defaultMessage": "!!!Yes, upgrade my account to Franz Professional",
525 "end": {
526 "column": 3,
527 "line": 42
528 },
529 "file": "src/components/auth/Pricing.js",
530 "id": "pricing.trial.cta.accept",
531 "start": {
532 "column": 13,
533 "line": 39
534 }
535 },
536 {
537 "defaultMessage": "!!!Continue to Franz",
538 "end": {
539 "column": 3,
540 "line": 46
541 },
542 "file": "src/components/auth/Pricing.js",
543 "id": "pricing.trial.cta.skip",
544 "start": {
545 "column": 11,
546 "line": 43
547 }
548 },
549 {
550 "defaultMessage": "!!!Franz Professional includes:",
551 "end": {
552 "column": 3,
553 "line": 50
554 },
555 "file": "src/components/auth/Pricing.js",
556 "id": "pricing.trial.features.headline",
557 "start": {
558 "column": 20,
559 "line": 47
495 } 560 }
496 } 561 }
497 ], 562 ],
@@ -503,156 +568,143 @@
503 "defaultMessage": "!!!Sign up", 568 "defaultMessage": "!!!Sign up",
504 "end": { 569 "end": {
505 "column": 3, 570 "column": 3,
506 "line": 21 571 "line": 20
507 }, 572 },
508 "file": "src/components/auth/Signup.js", 573 "file": "src/components/auth/Signup.js",
509 "id": "signup.headline", 574 "id": "signup.headline",
510 "start": { 575 "start": {
511 "column": 12, 576 "column": 12,
512 "line": 18 577 "line": 17
513 } 578 }
514 }, 579 },
515 { 580 {
516 "defaultMessage": "!!!Firstname", 581 "defaultMessage": "!!!Firstname",
517 "end": { 582 "end": {
518 "column": 3, 583 "column": 3,
519 "line": 25 584 "line": 24
520 }, 585 },
521 "file": "src/components/auth/Signup.js", 586 "file": "src/components/auth/Signup.js",
522 "id": "signup.firstname.label", 587 "id": "signup.firstname.label",
523 "start": { 588 "start": {
524 "column": 18, 589 "column": 18,
525 "line": 22 590 "line": 21
526 } 591 }
527 }, 592 },
528 { 593 {
529 "defaultMessage": "!!!Lastname", 594 "defaultMessage": "!!!Lastname",
530 "end": { 595 "end": {
531 "column": 3, 596 "column": 3,
532 "line": 29 597 "line": 28
533 }, 598 },
534 "file": "src/components/auth/Signup.js", 599 "file": "src/components/auth/Signup.js",
535 "id": "signup.lastname.label", 600 "id": "signup.lastname.label",
536 "start": { 601 "start": {
537 "column": 17, 602 "column": 17,
538 "line": 26 603 "line": 25
539 } 604 }
540 }, 605 },
541 { 606 {
542 "defaultMessage": "!!!Email address", 607 "defaultMessage": "!!!Email address",
543 "end": { 608 "end": {
544 "column": 3, 609 "column": 3,
545 "line": 33 610 "line": 32
546 }, 611 },
547 "file": "src/components/auth/Signup.js", 612 "file": "src/components/auth/Signup.js",
548 "id": "signup.email.label", 613 "id": "signup.email.label",
549 "start": { 614 "start": {
550 "column": 14, 615 "column": 14,
551 "line": 30 616 "line": 29
552 }
553 },
554 {
555 "defaultMessage": "!!!Company",
556 "end": {
557 "column": 3,
558 "line": 37
559 },
560 "file": "src/components/auth/Signup.js",
561 "id": "signup.company.label",
562 "start": {
563 "column": 16,
564 "line": 34
565 } 617 }
566 }, 618 },
567 { 619 {
568 "defaultMessage": "!!!Password", 620 "defaultMessage": "!!!Password",
569 "end": { 621 "end": {
570 "column": 3, 622 "column": 3,
571 "line": 41 623 "line": 40
572 }, 624 },
573 "file": "src/components/auth/Signup.js", 625 "file": "src/components/auth/Signup.js",
574 "id": "signup.password.label", 626 "id": "signup.password.label",
575 "start": { 627 "start": {
576 "column": 17, 628 "column": 17,
577 "line": 38 629 "line": 37
578 } 630 }
579 }, 631 },
580 { 632 {
581 "defaultMessage": "!!!By creating a Ferdi account you accept the", 633 "defaultMessage": "!!!By creating a Ferdi account you accept the",
582 "end": { 634 "end": {
583 "column": 3, 635 "column": 3,
584 "line": 45 636 "line": 44
585 }, 637 },
586 "file": "src/components/auth/Signup.js", 638 "file": "src/components/auth/Signup.js",
587 "id": "signup.legal.info", 639 "id": "signup.legal.info",
588 "start": { 640 "start": {
589 "column": 13, 641 "column": 13,
590 "line": 42 642 "line": 41
591 } 643 }
592 }, 644 },
593 { 645 {
594 "defaultMessage": "!!!Terms of service", 646 "defaultMessage": "!!!Terms of service",
595 "end": { 647 "end": {
596 "column": 3, 648 "column": 3,
597 "line": 49 649 "line": 48
598 }, 650 },
599 "file": "src/components/auth/Signup.js", 651 "file": "src/components/auth/Signup.js",
600 "id": "signup.legal.terms", 652 "id": "signup.legal.terms",
601 "start": { 653 "start": {
602 "column": 9, 654 "column": 9,
603 "line": 46 655 "line": 45
604 } 656 }
605 }, 657 },
606 { 658 {
607 "defaultMessage": "!!!Privacy Statement", 659 "defaultMessage": "!!!Privacy Statement",
608 "end": { 660 "end": {
609 "column": 3, 661 "column": 3,
610 "line": 53 662 "line": 52
611 }, 663 },
612 "file": "src/components/auth/Signup.js", 664 "file": "src/components/auth/Signup.js",
613 "id": "signup.legal.privacy", 665 "id": "signup.legal.privacy",
614 "start": { 666 "start": {
615 "column": 11, 667 "column": 11,
616 "line": 50 668 "line": 49
617 } 669 }
618 }, 670 },
619 { 671 {
620 "defaultMessage": "!!!Create account", 672 "defaultMessage": "!!!Create account",
621 "end": { 673 "end": {
622 "column": 3, 674 "column": 3,
623 "line": 57 675 "line": 56
624 }, 676 },
625 "file": "src/components/auth/Signup.js", 677 "file": "src/components/auth/Signup.js",
626 "id": "signup.submit.label", 678 "id": "signup.submit.label",
627 "start": { 679 "start": {
628 "column": 21, 680 "column": 21,
629 "line": 54 681 "line": 53
630 } 682 }
631 }, 683 },
632 { 684 {
633 "defaultMessage": "!!!Already have an account, sign in?", 685 "defaultMessage": "!!!Already have an account, sign in?",
634 "end": { 686 "end": {
635 "column": 3, 687 "column": 3,
636 "line": 61 688 "line": 60
637 }, 689 },
638 "file": "src/components/auth/Signup.js", 690 "file": "src/components/auth/Signup.js",
639 "id": "signup.link.login", 691 "id": "signup.link.login",
640 "start": { 692 "start": {
641 "column": 13, 693 "column": 13,
642 "line": 58 694 "line": 57
643 } 695 }
644 }, 696 },
645 { 697 {
646 "defaultMessage": "!!!A user with that email address already exists", 698 "defaultMessage": "!!!A user with that email address already exists",
647 "end": { 699 "end": {
648 "column": 3, 700 "column": 3,
649 "line": 65 701 "line": 64
650 }, 702 },
651 "file": "src/components/auth/Signup.js", 703 "file": "src/components/auth/Signup.js",
652 "id": "signup.emailDuplicate", 704 "id": "signup.emailDuplicate",
653 "start": { 705 "start": {
654 "column": 18, 706 "column": 18,
655 "line": 62 707 "line": 61
656 } 708 }
657 } 709 }
658 ], 710 ],
@@ -695,33 +747,33 @@
695 "defaultMessage": "!!!Your services have been updated.", 747 "defaultMessage": "!!!Your services have been updated.",
696 "end": { 748 "end": {
697 "column": 3, 749 "column": 3,
698 "line": 28 750 "line": 31
699 }, 751 },
700 "file": "src/components/layout/AppLayout.js", 752 "file": "src/components/layout/AppLayout.js",
701 "id": "infobar.servicesUpdated", 753 "id": "infobar.servicesUpdated",
702 "start": { 754 "start": {
703 "column": 19, 755 "column": 19,
704 "line": 25 756 "line": 28
705 } 757 }
706 }, 758 },
707 { 759 {
708 "defaultMessage": "!!!Reload services", 760 "defaultMessage": "!!!Reload services",
709 "end": { 761 "end": {
710 "column": 3, 762 "column": 3,
711 "line": 32 763 "line": 35
712 }, 764 },
713 "file": "src/components/layout/AppLayout.js", 765 "file": "src/components/layout/AppLayout.js",
714 "id": "infobar.buttonReloadServices", 766 "id": "infobar.buttonReloadServices",
715 "start": { 767 "start": {
716 "column": 24, 768 "column": 24,
717 "line": 29 769 "line": 32
718 } 770 }
719 }, 771 },
720 { 772 {
721 "defaultMessage": "!!!Could not load services and user information", 773 "defaultMessage": "!!!Could not load services and user information",
722 "end": { 774 "end": {
723 "column": 3, 775 "column": 3,
724 "line": 36 776 "line": 39
725 }, 777 },
726 "file": "src/components/layout/AppLayout.js", 778 "file": "src/components/layout/AppLayout.js",
727 "id": "infobar.requiredRequestsFailed", 779 "id": "infobar.requiredRequestsFailed",
@@ -933,29 +985,99 @@
933 { 985 {
934 "descriptors": [ 986 "descriptors": [
935 { 987 {
936 "defaultMessage": "!!!Welcome to Ferdi", 988 "defaultMessage": "!!!You have reached your service limit.",
937 "end": { 989 "end": {
938 "column": 3, 990 "column": 3,
939 "line": 14 991 "line": 14
940 }, 992 },
993 "file": "src/components/services/content/ServiceRestricted.js",
994 "id": "service.restrictedHandler.serviceLimit.headline",
995 "start": {
996 "column": 24,
997 "line": 11
998 }
999 },
1000 {
1001 "defaultMessage": "!!!Please upgrade your account to use more than {count} services.",
1002 "end": {
1003 "column": 3,
1004 "line": 18
1005 },
1006 "file": "src/components/services/content/ServiceRestricted.js",
1007 "id": "service.restrictedHandler.serviceLimit.text",
1008 "start": {
1009 "column": 20,
1010 "line": 15
1011 }
1012 },
1013 {
1014 "defaultMessage": "!!!Franz Professional Plan required",
1015 "end": {
1016 "column": 3,
1017 "line": 22
1018 },
1019 "file": "src/components/services/content/ServiceRestricted.js",
1020 "id": "service.restrictedHandler.customUrl.headline",
1021 "start": {
1022 "column": 21,
1023 "line": 19
1024 }
1025 },
1026 {
1027 "defaultMessage": "!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
1028 "end": {
1029 "column": 3,
1030 "line": 26
1031 },
1032 "file": "src/components/services/content/ServiceRestricted.js",
1033 "id": "service.restrictedHandler.customUrl.text",
1034 "start": {
1035 "column": 17,
1036 "line": 23
1037 }
1038 },
1039 {
1040 "defaultMessage": "!!!Upgrade Account",
1041 "end": {
1042 "column": 3,
1043 "line": 30
1044 },
1045 "file": "src/components/services/content/ServiceRestricted.js",
1046 "id": "service.restrictedHandler.action",
1047 "start": {
1048 "column": 10,
1049 "line": 27
1050 }
1051 }
1052 ],
1053 "path": "src/components/services/content/ServiceRestricted.json"
1054 },
1055 {
1056 "descriptors": [
1057 {
1058 "defaultMessage": "!!!Welcome to Ferdi",
1059 "end": {
1060 "column": 3,
1061 "line": 17
1062 },
941 "file": "src/components/services/content/Services.js", 1063 "file": "src/components/services/content/Services.js",
942 "id": "services.welcome", 1064 "id": "services.welcome",
943 "start": { 1065 "start": {
944 "column": 11, 1066 "column": 11,
945 "line": 11 1067 "line": 14
946 } 1068 }
947 }, 1069 },
948 { 1070 {
949 "defaultMessage": "!!!Get started", 1071 "defaultMessage": "!!!Get started",
950 "end": { 1072 "end": {
951 "column": 3, 1073 "column": 3,
952 "line": 18 1074 "line": 21
953 }, 1075 },
954 "file": "src/components/services/content/Services.js", 1076 "file": "src/components/services/content/Services.js",
955 "id": "services.getStarted", 1077 "id": "services.getStarted",
956 "start": { 1078 "start": {
957 "column": 14, 1079 "column": 14,
958 "line": 15 1080 "line": 18
959 } 1081 }
960 }, 1082 },
961 { 1083 {
@@ -1172,38 +1294,25 @@
1172 "defaultMessage": "!!!Account", 1294 "defaultMessage": "!!!Account",
1173 "end": { 1295 "end": {
1174 "column": 3, 1296 "column": 3,
1175 "line": 17 1297 "line": 21
1176 }, 1298 },
1177 "file": "src/components/settings/account/AccountDashboard.js", 1299 "file": "src/components/settings/account/AccountDashboard.js",
1178 "id": "settings.account.headline", 1300 "id": "settings.account.headline",
1179 "start": { 1301 "start": {
1180 "column": 12, 1302 "column": 12,
1181 "line": 14 1303 "line": 18
1182 } 1304 }
1183 }, 1305 },
1184 { 1306 {
1185 "defaultMessage": "!!!Your Subscription", 1307 "defaultMessage": "!!!Your Subscription",
1186 "end": { 1308 "end": {
1187 "column": 3, 1309 "column": 3,
1188 "line": 21 1310 "line": 25
1189 }, 1311 },
1190 "file": "src/components/settings/account/AccountDashboard.js", 1312 "file": "src/components/settings/account/AccountDashboard.js",
1191 "id": "settings.account.headlineSubscription", 1313 "id": "settings.account.headlineSubscription",
1192 "start": { 1314 "start": {
1193 "column": 24, 1315 "column": 24,
1194 "line": 18
1195 }
1196 },
1197 {
1198 "defaultMessage": "!!!Upgrade your Account",
1199 "end": {
1200 "column": 3,
1201 "line": 25
1202 },
1203 "file": "src/components/settings/account/AccountDashboard.js",
1204 "id": "settings.account.headlineUpgrade",
1205 "start": {
1206 "column": 19,
1207 "line": 22 1316 "line": 22
1208 } 1317 }
1209 }, 1318 },
@@ -1234,133 +1343,198 @@
1234 } 1343 }
1235 }, 1344 },
1236 { 1345 {
1237 "defaultMessage": "!!!Basic Account", 1346 "defaultMessage": "!!!Upgrade to Franz Professional",
1238 "end": { 1347 "end": {
1239 "column": 3, 1348 "column": 3,
1240 "line": 37 1349 "line": 37
1241 }, 1350 },
1242 "file": "src/components/settings/account/AccountDashboard.js", 1351 "file": "src/components/settings/account/AccountDashboard.js",
1352 "id": "settings.account.upgradeToPro.label",
1353 "start": {
1354 "column": 23,
1355 "line": 34
1356 }
1357 },
1358 {
1359 "defaultMessage": "!!!Basic Account",
1360 "end": {
1361 "column": 3,
1362 "line": 41
1363 },
1364 "file": "src/components/settings/account/AccountDashboard.js",
1243 "id": "settings.account.accountType.basic", 1365 "id": "settings.account.accountType.basic",
1244 "start": { 1366 "start": {
1245 "column": 20, 1367 "column": 20,
1246 "line": 34 1368 "line": 38
1247 } 1369 }
1248 }, 1370 },
1249 { 1371 {
1250 "defaultMessage": "!!!Premium Supporter Account", 1372 "defaultMessage": "!!!Premium Supporter Account",
1251 "end": { 1373 "end": {
1252 "column": 3, 1374 "column": 3,
1253 "line": 41 1375 "line": 45
1254 }, 1376 },
1255 "file": "src/components/settings/account/AccountDashboard.js", 1377 "file": "src/components/settings/account/AccountDashboard.js",
1256 "id": "settings.account.accountType.premium", 1378 "id": "settings.account.accountType.premium",
1257 "start": { 1379 "start": {
1258 "column": 22, 1380 "column": 22,
1259 "line": 38 1381 "line": 42
1260 } 1382 }
1261 }, 1383 },
1262 { 1384 {
1263 "defaultMessage": "!!!Edit Account", 1385 "defaultMessage": "!!!Edit Account",
1264 "end": { 1386 "end": {
1265 "column": 3, 1387 "column": 3,
1266 "line": 45 1388 "line": 49
1267 }, 1389 },
1268 "file": "src/components/settings/account/AccountDashboard.js", 1390 "file": "src/components/settings/account/AccountDashboard.js",
1269 "id": "settings.account.account.editButton", 1391 "id": "settings.account.account.editButton",
1270 "start": { 1392 "start": {
1271 "column": 21, 1393 "column": 21,
1272 "line": 42 1394 "line": 46
1273 } 1395 }
1274 }, 1396 },
1275 { 1397 {
1276 "defaultMessage": "!!Invoices", 1398 "defaultMessage": "!!Invoices",
1277 "end": { 1399 "end": {
1278 "column": 3, 1400 "column": 3,
1279 "line": 49 1401 "line": 53
1280 }, 1402 },
1281 "file": "src/components/settings/account/AccountDashboard.js", 1403 "file": "src/components/settings/account/AccountDashboard.js",
1282 "id": "settings.account.headlineInvoices", 1404 "id": "settings.account.headlineInvoices",
1283 "start": { 1405 "start": {
1284 "column": 18, 1406 "column": 18,
1285 "line": 46 1407 "line": 50
1286 } 1408 }
1287 }, 1409 },
1288 { 1410 {
1289 "defaultMessage": "!!!Download", 1411 "defaultMessage": "!!!Download",
1290 "end": { 1412 "end": {
1291 "column": 3, 1413 "column": 3,
1292 "line": 53 1414 "line": 57
1293 }, 1415 },
1294 "file": "src/components/settings/account/AccountDashboard.js", 1416 "file": "src/components/settings/account/AccountDashboard.js",
1295 "id": "settings.account.invoiceDownload", 1417 "id": "settings.account.invoiceDownload",
1296 "start": { 1418 "start": {
1297 "column": 19, 1419 "column": 19,
1298 "line": 50 1420 "line": 54
1299 } 1421 }
1300 }, 1422 },
1301 { 1423 {
1302 "defaultMessage": "!!!Could not load user information", 1424 "defaultMessage": "!!!Could not load user information",
1303 "end": { 1425 "end": {
1304 "column": 3, 1426 "column": 3,
1305 "line": 57 1427 "line": 61
1306 }, 1428 },
1307 "file": "src/components/settings/account/AccountDashboard.js", 1429 "file": "src/components/settings/account/AccountDashboard.js",
1308 "id": "settings.account.userInfoRequestFailed", 1430 "id": "settings.account.userInfoRequestFailed",
1309 "start": { 1431 "start": {
1310 "column": 25, 1432 "column": 25,
1311 "line": 54 1433 "line": 58
1312 } 1434 }
1313 }, 1435 },
1314 { 1436 {
1315 "defaultMessage": "!!!Try again", 1437 "defaultMessage": "!!!Try again",
1316 "end": { 1438 "end": {
1317 "column": 3, 1439 "column": 3,
1318 "line": 61 1440 "line": 65
1319 }, 1441 },
1320 "file": "src/components/settings/account/AccountDashboard.js", 1442 "file": "src/components/settings/account/AccountDashboard.js",
1321 "id": "settings.account.tryReloadUserInfoRequest", 1443 "id": "settings.account.tryReloadUserInfoRequest",
1322 "start": { 1444 "start": {
1323 "column": 28, 1445 "column": 28,
1324 "line": 58 1446 "line": 62
1325 } 1447 }
1326 }, 1448 },
1327 { 1449 {
1328 "defaultMessage": "!!!Delete account", 1450 "defaultMessage": "!!!Delete account",
1329 "end": { 1451 "end": {
1330 "column": 3, 1452 "column": 3,
1331 "line": 65 1453 "line": 69
1332 }, 1454 },
1333 "file": "src/components/settings/account/AccountDashboard.js", 1455 "file": "src/components/settings/account/AccountDashboard.js",
1334 "id": "settings.account.deleteAccount", 1456 "id": "settings.account.deleteAccount",
1335 "start": { 1457 "start": {
1336 "column": 17, 1458 "column": 17,
1337 "line": 62 1459 "line": 66
1338 } 1460 }
1339 }, 1461 },
1340 { 1462 {
1341 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 1463 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
1342 "end": { 1464 "end": {
1343 "column": 3, 1465 "column": 3,
1344 "line": 69 1466 "line": 73
1345 }, 1467 },
1346 "file": "src/components/settings/account/AccountDashboard.js", 1468 "file": "src/components/settings/account/AccountDashboard.js",
1347 "id": "settings.account.deleteInfo", 1469 "id": "settings.account.deleteInfo",
1348 "start": { 1470 "start": {
1349 "column": 14, 1471 "column": 14,
1350 "line": 66 1472 "line": 70
1351 } 1473 }
1352 }, 1474 },
1353 { 1475 {
1354 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 1476 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
1355 "end": { 1477 "end": {
1356 "column": 3, 1478 "column": 3,
1357 "line": 73 1479 "line": 77
1358 }, 1480 },
1359 "file": "src/components/settings/account/AccountDashboard.js", 1481 "file": "src/components/settings/account/AccountDashboard.js",
1360 "id": "settings.account.deleteEmailSent", 1482 "id": "settings.account.deleteEmailSent",
1361 "start": { 1483 "start": {
1362 "column": 19, 1484 "column": 19,
1363 "line": 70 1485 "line": 74
1486 }
1487 },
1488 {
1489 "defaultMessage": "!!!Free Trial",
1490 "end": {
1491 "column": 3,
1492 "line": 81
1493 },
1494 "file": "src/components/settings/account/AccountDashboard.js",
1495 "id": "settings.account.trial",
1496 "start": {
1497 "column": 9,
1498 "line": 78
1499 }
1500 },
1501 {
1502 "defaultMessage": "!!!Your Franz License:",
1503 "end": {
1504 "column": 3,
1505 "line": 85
1506 },
1507 "file": "src/components/settings/account/AccountDashboard.js",
1508 "id": "settings.account.yourLicense",
1509 "start": {
1510 "column": 15,
1511 "line": 82
1512 }
1513 },
1514 {
1515 "defaultMessage": "!!!Your free trial ends in {duration}.",
1516 "end": {
1517 "column": 3,
1518 "line": 89
1519 },
1520 "file": "src/components/settings/account/AccountDashboard.js",
1521 "id": "settings.account.trialEndsIn",
1522 "start": {
1523 "column": 15,
1524 "line": 86
1525 }
1526 },
1527 {
1528 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
1529 "end": {
1530 "column": 3,
1531 "line": 93
1532 },
1533 "file": "src/components/settings/account/AccountDashboard.js",
1534 "id": "settings.account.trialUpdateBillingInfo",
1535 "start": {
1536 "column": 33,
1537 "line": 90
1364 } 1538 }
1365 } 1539 }
1366 ], 1540 ],
@@ -1372,104 +1546,104 @@
1372 "defaultMessage": "!!!Available services", 1546 "defaultMessage": "!!!Available services",
1373 "end": { 1547 "end": {
1374 "column": 3, 1548 "column": 3,
1375 "line": 16 1549 "line": 17
1376 }, 1550 },
1377 "file": "src/components/settings/navigation/SettingsNavigation.js", 1551 "file": "src/components/settings/navigation/SettingsNavigation.js",
1378 "id": "settings.navigation.availableServices", 1552 "id": "settings.navigation.availableServices",
1379 "start": { 1553 "start": {
1380 "column": 21, 1554 "column": 21,
1381 "line": 13 1555 "line": 14
1382 } 1556 }
1383 }, 1557 },
1384 { 1558 {
1385 "defaultMessage": "!!!Your services", 1559 "defaultMessage": "!!!Your services",
1386 "end": { 1560 "end": {
1387 "column": 3, 1561 "column": 3,
1388 "line": 20 1562 "line": 21
1389 }, 1563 },
1390 "file": "src/components/settings/navigation/SettingsNavigation.js", 1564 "file": "src/components/settings/navigation/SettingsNavigation.js",
1391 "id": "settings.navigation.yourServices", 1565 "id": "settings.navigation.yourServices",
1392 "start": { 1566 "start": {
1393 "column": 16, 1567 "column": 16,
1394 "line": 17 1568 "line": 18
1395 } 1569 }
1396 }, 1570 },
1397 { 1571 {
1398 "defaultMessage": "!!!Your workspaces", 1572 "defaultMessage": "!!!Your workspaces",
1399 "end": { 1573 "end": {
1400 "column": 3, 1574 "column": 3,
1401 "line": 24 1575 "line": 25
1402 }, 1576 },
1403 "file": "src/components/settings/navigation/SettingsNavigation.js", 1577 "file": "src/components/settings/navigation/SettingsNavigation.js",
1404 "id": "settings.navigation.yourWorkspaces", 1578 "id": "settings.navigation.yourWorkspaces",
1405 "start": { 1579 "start": {
1406 "column": 18, 1580 "column": 18,
1407 "line": 21 1581 "line": 22
1408 } 1582 }
1409 }, 1583 },
1410 { 1584 {
1411 "defaultMessage": "!!!Account", 1585 "defaultMessage": "!!!Account",
1412 "end": { 1586 "end": {
1413 "column": 3, 1587 "column": 3,
1414 "line": 28 1588 "line": 29
1415 }, 1589 },
1416 "file": "src/components/settings/navigation/SettingsNavigation.js", 1590 "file": "src/components/settings/navigation/SettingsNavigation.js",
1417 "id": "settings.navigation.account", 1591 "id": "settings.navigation.account",
1418 "start": { 1592 "start": {
1419 "column": 11, 1593 "column": 11,
1420 "line": 25 1594 "line": 26
1421 } 1595 }
1422 }, 1596 },
1423 { 1597 {
1424 "defaultMessage": "!!!Manage Team", 1598 "defaultMessage": "!!!Manage Team",
1425 "end": { 1599 "end": {
1426 "column": 3, 1600 "column": 3,
1427 "line": 32 1601 "line": 33
1428 }, 1602 },
1429 "file": "src/components/settings/navigation/SettingsNavigation.js", 1603 "file": "src/components/settings/navigation/SettingsNavigation.js",
1430 "id": "settings.navigation.team", 1604 "id": "settings.navigation.team",
1431 "start": { 1605 "start": {
1432 "column": 8, 1606 "column": 8,
1433 "line": 29 1607 "line": 30
1434 } 1608 }
1435 }, 1609 },
1436 { 1610 {
1437 "defaultMessage": "!!!Settings", 1611 "defaultMessage": "!!!Settings",
1438 "end": { 1612 "end": {
1439 "column": 3, 1613 "column": 3,
1440 "line": 36 1614 "line": 37
1441 }, 1615 },
1442 "file": "src/components/settings/navigation/SettingsNavigation.js", 1616 "file": "src/components/settings/navigation/SettingsNavigation.js",
1443 "id": "settings.navigation.settings", 1617 "id": "settings.navigation.settings",
1444 "start": { 1618 "start": {
1445 "column": 12, 1619 "column": 12,
1446 "line": 33 1620 "line": 34
1447 } 1621 }
1448 }, 1622 },
1449 { 1623 {
1450 "defaultMessage": "!!!Invite Friends", 1624 "defaultMessage": "!!!Invite Friends",
1451 "end": { 1625 "end": {
1452 "column": 3, 1626 "column": 3,
1453 "line": 40 1627 "line": 41
1454 }, 1628 },
1455 "file": "src/components/settings/navigation/SettingsNavigation.js", 1629 "file": "src/components/settings/navigation/SettingsNavigation.js",
1456 "id": "settings.navigation.inviteFriends", 1630 "id": "settings.navigation.inviteFriends",
1457 "start": { 1631 "start": {
1458 "column": 17, 1632 "column": 17,
1459 "line": 37 1633 "line": 38
1460 } 1634 }
1461 }, 1635 },
1462 { 1636 {
1463 "defaultMessage": "!!!Logout", 1637 "defaultMessage": "!!!Logout",
1464 "end": { 1638 "end": {
1465 "column": 3, 1639 "column": 3,
1466 "line": 44 1640 "line": 45
1467 }, 1641 },
1468 "file": "src/components/settings/navigation/SettingsNavigation.js", 1642 "file": "src/components/settings/navigation/SettingsNavigation.js",
1469 "id": "settings.navigation.logout", 1643 "id": "settings.navigation.logout",
1470 "start": { 1644 "start": {
1471 "column": 10, 1645 "column": 10,
1472 "line": 41 1646 "line": 42
1473 } 1647 }
1474 } 1648 }
1475 ], 1649 ],
@@ -1481,104 +1655,182 @@
1481 "defaultMessage": "!!!Available Services", 1655 "defaultMessage": "!!!Available Services",
1482 "end": { 1656 "end": {
1483 "column": 3, 1657 "column": 3,
1484 "line": 18 1658 "line": 23
1485 }, 1659 },
1486 "file": "src/components/settings/recipes/RecipesDashboard.js", 1660 "file": "src/components/settings/recipes/RecipesDashboard.js",
1487 "id": "settings.recipes.headline", 1661 "id": "settings.recipes.headline",
1488 "start": { 1662 "start": {
1489 "column": 12, 1663 "column": 12,
1490 "line": 15 1664 "line": 20
1491 } 1665 }
1492 }, 1666 },
1493 { 1667 {
1494 "defaultMessage": "!!!Search service", 1668 "defaultMessage": "!!!Search service",
1495 "end": { 1669 "end": {
1496 "column": 3, 1670 "column": 3,
1497 "line": 22 1671 "line": 27
1498 }, 1672 },
1499 "file": "src/components/settings/recipes/RecipesDashboard.js", 1673 "file": "src/components/settings/recipes/RecipesDashboard.js",
1500 "id": "settings.searchService", 1674 "id": "settings.searchService",
1501 "start": { 1675 "start": {
1502 "column": 17, 1676 "column": 17,
1503 "line": 19 1677 "line": 24
1504 } 1678 }
1505 }, 1679 },
1506 { 1680 {
1507 "defaultMessage": "!!!Most popular", 1681 "defaultMessage": "!!!Most popular",
1508 "end": { 1682 "end": {
1509 "column": 3, 1683 "column": 3,
1510 "line": 26 1684 "line": 31
1511 }, 1685 },
1512 "file": "src/components/settings/recipes/RecipesDashboard.js", 1686 "file": "src/components/settings/recipes/RecipesDashboard.js",
1513 "id": "settings.recipes.mostPopular", 1687 "id": "settings.recipes.mostPopular",
1514 "start": { 1688 "start": {
1515 "column": 22, 1689 "column": 22,
1516 "line": 23 1690 "line": 28
1517 } 1691 }
1518 }, 1692 },
1519 { 1693 {
1520 "defaultMessage": "!!!All services", 1694 "defaultMessage": "!!!All services",
1521 "end": { 1695 "end": {
1522 "column": 3, 1696 "column": 3,
1523 "line": 30 1697 "line": 35
1524 }, 1698 },
1525 "file": "src/components/settings/recipes/RecipesDashboard.js", 1699 "file": "src/components/settings/recipes/RecipesDashboard.js",
1526 "id": "settings.recipes.all", 1700 "id": "settings.recipes.all",
1527 "start": { 1701 "start": {
1528 "column": 14, 1702 "column": 14,
1529 "line": 27 1703 "line": 32
1530 } 1704 }
1531 }, 1705 },
1532 { 1706 {
1533 "defaultMessage": "!!!Development", 1707 "defaultMessage": "!!!Custom Services",
1534 "end": { 1708 "end": {
1535 "column": 3, 1709 "column": 3,
1536 "line": 34 1710 "line": 39
1537 }, 1711 },
1538 "file": "src/components/settings/recipes/RecipesDashboard.js", 1712 "file": "src/components/settings/recipes/RecipesDashboard.js",
1539 "id": "settings.recipes.dev", 1713 "id": "settings.recipes.custom",
1540 "start": { 1714 "start": {
1541 "column": 14, 1715 "column": 17,
1542 "line": 31 1716 "line": 36
1543 } 1717 }
1544 }, 1718 },
1545 { 1719 {
1546 "defaultMessage": "!!!Sorry, but no service matched your search term.", 1720 "defaultMessage": "!!!Sorry, but no service matched your search term.",
1547 "end": { 1721 "end": {
1548 "column": 3, 1722 "column": 3,
1549 "line": 38 1723 "line": 43
1550 }, 1724 },
1551 "file": "src/components/settings/recipes/RecipesDashboard.js", 1725 "file": "src/components/settings/recipes/RecipesDashboard.js",
1552 "id": "settings.recipes.nothingFound", 1726 "id": "settings.recipes.nothingFound",
1553 "start": { 1727 "start": {
1554 "column": 16, 1728 "column": 16,
1555 "line": 35 1729 "line": 40
1556 } 1730 }
1557 }, 1731 },
1558 { 1732 {
1559 "defaultMessage": "!!!Service successfully added", 1733 "defaultMessage": "!!!Service successfully added",
1560 "end": { 1734 "end": {
1561 "column": 3, 1735 "column": 3,
1562 "line": 42 1736 "line": 47
1563 }, 1737 },
1564 "file": "src/components/settings/recipes/RecipesDashboard.js", 1738 "file": "src/components/settings/recipes/RecipesDashboard.js",
1565 "id": "settings.recipes.servicesSuccessfulAddedInfo", 1739 "id": "settings.recipes.servicesSuccessfulAddedInfo",
1566 "start": { 1740 "start": {
1567 "column": 31, 1741 "column": 31,
1568 "line": 39 1742 "line": 44
1569 } 1743 }
1570 }, 1744 },
1571 { 1745 {
1572 "defaultMessage": "!!!Missing a service?", 1746 "defaultMessage": "!!!Missing a service?",
1573 "end": { 1747 "end": {
1574 "column": 3, 1748 "column": 3,
1575 "line": 46 1749 "line": 51
1576 }, 1750 },
1577 "file": "src/components/settings/recipes/RecipesDashboard.js", 1751 "file": "src/components/settings/recipes/RecipesDashboard.js",
1578 "id": "settings.recipes.missingService", 1752 "id": "settings.recipes.missingService",
1579 "start": { 1753 "start": {
1580 "column": 18, 1754 "column": 18,
1581 "line": 43 1755 "line": 48
1756 }
1757 },
1758 {
1759 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
1760 "end": {
1761 "column": 3,
1762 "line": 55
1763 },
1764 "file": "src/components/settings/recipes/RecipesDashboard.js",
1765 "id": "settings.recipes.customService.intro",
1766 "start": {
1767 "column": 21,
1768 "line": 52
1769 }
1770 },
1771 {
1772 "defaultMessage": "!!!Open directory",
1773 "end": {
1774 "column": 3,
1775 "line": 59
1776 },
1777 "file": "src/components/settings/recipes/RecipesDashboard.js",
1778 "id": "settings.recipes.customService.openFolder",
1779 "start": {
1780 "column": 14,
1781 "line": 56
1782 }
1783 },
1784 {
1785 "defaultMessage": "!!!Developer Documentation",
1786 "end": {
1787 "column": 3,
1788 "line": 63
1789 },
1790 "file": "src/components/settings/recipes/RecipesDashboard.js",
1791 "id": "settings.recipes.customService.openDevDocs",
1792 "start": {
1793 "column": 15,
1794 "line": 60
1795 }
1796 },
1797 {
1798 "defaultMessage": "!!!Custom 3rd Party Recipes",
1799 "end": {
1800 "column": 3,
1801 "line": 67
1802 },
1803 "file": "src/components/settings/recipes/RecipesDashboard.js",
1804 "id": "settings.recipes.customService.headline.customRecipes",
1805 "start": {
1806 "column": 25,
1807 "line": 64
1808 }
1809 },
1810 {
1811 "defaultMessage": "!!!Community 3rd Party Recipes",
1812 "end": {
1813 "column": 3,
1814 "line": 71
1815 },
1816 "file": "src/components/settings/recipes/RecipesDashboard.js",
1817 "id": "settings.recipes.customService.headline.communityRecipes",
1818 "start": {
1819 "column": 28,
1820 "line": 68
1821 }
1822 },
1823 {
1824 "defaultMessage": "!!!Your Development Service Recipes",
1825 "end": {
1826 "column": 3,
1827 "line": 75
1828 },
1829 "file": "src/components/settings/recipes/RecipesDashboard.js",
1830 "id": "settings.recipes.customService.headline.devRecipes",
1831 "start": {
1832 "column": 22,
1833 "line": 72
1582 } 1834 }
1583 } 1835 }
1584 ], 1836 ],
@@ -1590,286 +1842,286 @@
1590 "defaultMessage": "!!!Save service", 1842 "defaultMessage": "!!!Save service",
1591 "end": { 1843 "end": {
1592 "column": 3, 1844 "column": 3,
1593 "line": 25 1845 "line": 27
1594 }, 1846 },
1595 "file": "src/components/settings/services/EditServiceForm.js", 1847 "file": "src/components/settings/services/EditServiceForm.js",
1596 "id": "settings.service.form.saveButton", 1848 "id": "settings.service.form.saveButton",
1597 "start": { 1849 "start": {
1598 "column": 15, 1850 "column": 15,
1599 "line": 22 1851 "line": 24
1600 } 1852 }
1601 }, 1853 },
1602 { 1854 {
1603 "defaultMessage": "!!!Delete Service", 1855 "defaultMessage": "!!!Delete Service",
1604 "end": { 1856 "end": {
1605 "column": 3, 1857 "column": 3,
1606 "line": 29 1858 "line": 31
1607 }, 1859 },
1608 "file": "src/components/settings/services/EditServiceForm.js", 1860 "file": "src/components/settings/services/EditServiceForm.js",
1609 "id": "settings.service.form.deleteButton", 1861 "id": "settings.service.form.deleteButton",
1610 "start": { 1862 "start": {
1611 "column": 17, 1863 "column": 17,
1612 "line": 26 1864 "line": 28
1613 } 1865 }
1614 }, 1866 },
1615 { 1867 {
1616 "defaultMessage": "!!!Available services", 1868 "defaultMessage": "!!!Available services",
1617 "end": { 1869 "end": {
1618 "column": 3, 1870 "column": 3,
1619 "line": 33 1871 "line": 35
1620 }, 1872 },
1621 "file": "src/components/settings/services/EditServiceForm.js", 1873 "file": "src/components/settings/services/EditServiceForm.js",
1622 "id": "settings.service.form.availableServices", 1874 "id": "settings.service.form.availableServices",
1623 "start": { 1875 "start": {
1624 "column": 21, 1876 "column": 21,
1625 "line": 30 1877 "line": 32
1626 } 1878 }
1627 }, 1879 },
1628 { 1880 {
1629 "defaultMessage": "!!!Your services", 1881 "defaultMessage": "!!!Your services",
1630 "end": { 1882 "end": {
1631 "column": 3, 1883 "column": 3,
1632 "line": 37 1884 "line": 39
1633 }, 1885 },
1634 "file": "src/components/settings/services/EditServiceForm.js", 1886 "file": "src/components/settings/services/EditServiceForm.js",
1635 "id": "settings.service.form.yourServices", 1887 "id": "settings.service.form.yourServices",
1636 "start": { 1888 "start": {
1637 "column": 16, 1889 "column": 16,
1638 "line": 34 1890 "line": 36
1639 } 1891 }
1640 }, 1892 },
1641 { 1893 {
1642 "defaultMessage": "!!!Add {name}", 1894 "defaultMessage": "!!!Add {name}",
1643 "end": { 1895 "end": {
1644 "column": 3, 1896 "column": 3,
1645 "line": 41 1897 "line": 43
1646 }, 1898 },
1647 "file": "src/components/settings/services/EditServiceForm.js", 1899 "file": "src/components/settings/services/EditServiceForm.js",
1648 "id": "settings.service.form.addServiceHeadline", 1900 "id": "settings.service.form.addServiceHeadline",
1649 "start": { 1901 "start": {
1650 "column": 22, 1902 "column": 22,
1651 "line": 38 1903 "line": 40
1652 } 1904 }
1653 }, 1905 },
1654 { 1906 {
1655 "defaultMessage": "!!!Edit {name}", 1907 "defaultMessage": "!!!Edit {name}",
1656 "end": { 1908 "end": {
1657 "column": 3, 1909 "column": 3,
1658 "line": 45 1910 "line": 47
1659 }, 1911 },
1660 "file": "src/components/settings/services/EditServiceForm.js", 1912 "file": "src/components/settings/services/EditServiceForm.js",
1661 "id": "settings.service.form.editServiceHeadline", 1913 "id": "settings.service.form.editServiceHeadline",
1662 "start": { 1914 "start": {
1663 "column": 23, 1915 "column": 23,
1664 "line": 42 1916 "line": 44
1665 } 1917 }
1666 }, 1918 },
1667 { 1919 {
1668 "defaultMessage": "!!!Hosted", 1920 "defaultMessage": "!!!Hosted",
1669 "end": { 1921 "end": {
1670 "column": 3, 1922 "column": 3,
1671 "line": 49 1923 "line": 51
1672 }, 1924 },
1673 "file": "src/components/settings/services/EditServiceForm.js", 1925 "file": "src/components/settings/services/EditServiceForm.js",
1674 "id": "settings.service.form.tabHosted", 1926 "id": "settings.service.form.tabHosted",
1675 "start": { 1927 "start": {
1676 "column": 13, 1928 "column": 13,
1677 "line": 46 1929 "line": 48
1678 } 1930 }
1679 }, 1931 },
1680 { 1932 {
1681 "defaultMessage": "!!!Self hosted â­ï¸", 1933 "defaultMessage": "!!!Self hosted â­ï¸",
1682 "end": { 1934 "end": {
1683 "column": 3, 1935 "column": 3,
1684 "line": 53 1936 "line": 55
1685 }, 1937 },
1686 "file": "src/components/settings/services/EditServiceForm.js", 1938 "file": "src/components/settings/services/EditServiceForm.js",
1687 "id": "settings.service.form.tabOnPremise", 1939 "id": "settings.service.form.tabOnPremise",
1688 "start": { 1940 "start": {
1689 "column": 16, 1941 "column": 16,
1690 "line": 50 1942 "line": 52
1691 } 1943 }
1692 }, 1944 },
1693 { 1945 {
1694 "defaultMessage": "!!!Use the hosted {name} service.", 1946 "defaultMessage": "!!!Use the hosted {name} service.",
1695 "end": { 1947 "end": {
1696 "column": 3, 1948 "column": 3,
1697 "line": 57 1949 "line": 59
1698 }, 1950 },
1699 "file": "src/components/settings/services/EditServiceForm.js", 1951 "file": "src/components/settings/services/EditServiceForm.js",
1700 "id": "settings.service.form.useHostedService", 1952 "id": "settings.service.form.useHostedService",
1701 "start": { 1953 "start": {
1702 "column": 20, 1954 "column": 20,
1703 "line": 54 1955 "line": 56
1704 } 1956 }
1705 }, 1957 },
1706 { 1958 {
1707 "defaultMessage": "!!!Could not validate custom {name} server.", 1959 "defaultMessage": "!!!Could not validate custom {name} server.",
1708 "end": { 1960 "end": {
1709 "column": 3, 1961 "column": 3,
1710 "line": 61 1962 "line": 63
1711 }, 1963 },
1712 "file": "src/components/settings/services/EditServiceForm.js", 1964 "file": "src/components/settings/services/EditServiceForm.js",
1713 "id": "settings.service.form.customUrlValidationError", 1965 "id": "settings.service.form.customUrlValidationError",
1714 "start": { 1966 "start": {
1715 "column": 28, 1967 "column": 28,
1716 "line": 58 1968 "line": 60
1717 } 1969 }
1718 }, 1970 },
1719 { 1971 {
1720 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.", 1972 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
1721 "end": { 1973 "end": {
1722 "column": 3, 1974 "column": 3,
1723 "line": 65 1975 "line": 67
1724 }, 1976 },
1725 "file": "src/components/settings/services/EditServiceForm.js", 1977 "file": "src/components/settings/services/EditServiceForm.js",
1726 "id": "settings.service.form.customUrlPremiumInfo", 1978 "id": "settings.service.form.customUrlPremiumInfo",
1727 "start": { 1979 "start": {
1728 "column": 24, 1980 "column": 24,
1729 "line": 62 1981 "line": 64
1730 } 1982 }
1731 }, 1983 },
1732 { 1984 {
1733 "defaultMessage": "!!!Upgrade your account", 1985 "defaultMessage": "!!!Upgrade your account",
1734 "end": { 1986 "end": {
1735 "column": 3, 1987 "column": 3,
1736 "line": 69 1988 "line": 71
1737 }, 1989 },
1738 "file": "src/components/settings/services/EditServiceForm.js", 1990 "file": "src/components/settings/services/EditServiceForm.js",
1739 "id": "settings.service.form.customUrlUpgradeAccount", 1991 "id": "settings.service.form.customUrlUpgradeAccount",
1740 "start": { 1992 "start": {
1741 "column": 27, 1993 "column": 27,
1742 "line": 66 1994 "line": 68
1743 } 1995 }
1744 }, 1996 },
1745 { 1997 {
1746 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 1998 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
1747 "end": { 1999 "end": {
1748 "column": 3, 2000 "column": 3,
1749 "line": 73 2001 "line": 75
1750 }, 2002 },
1751 "file": "src/components/settings/services/EditServiceForm.js", 2003 "file": "src/components/settings/services/EditServiceForm.js",
1752 "id": "settings.service.form.indirectMessageInfo", 2004 "id": "settings.service.form.indirectMessageInfo",
1753 "start": { 2005 "start": {
1754 "column": 23, 2006 "column": 23,
1755 "line": 70 2007 "line": 72
1756 } 2008 }
1757 }, 2009 },
1758 { 2010 {
1759 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 2011 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
1760 "end": { 2012 "end": {
1761 "column": 3, 2013 "column": 3,
1762 "line": 77 2014 "line": 79
1763 }, 2015 },
1764 "file": "src/components/settings/services/EditServiceForm.js", 2016 "file": "src/components/settings/services/EditServiceForm.js",
1765 "id": "settings.service.form.isMutedInfo", 2017 "id": "settings.service.form.isMutedInfo",
1766 "start": { 2018 "start": {
1767 "column": 15, 2019 "column": 15,
1768 "line": 74 2020 "line": 76
1769 } 2021 }
1770 }, 2022 },
1771 { 2023 {
1772 "defaultMessage": "!!!Notifications", 2024 "defaultMessage": "!!!Notifications",
1773 "end": { 2025 "end": {
1774 "column": 3, 2026 "column": 3,
1775 "line": 81 2027 "line": 83
1776 }, 2028 },
1777 "file": "src/components/settings/services/EditServiceForm.js", 2029 "file": "src/components/settings/services/EditServiceForm.js",
1778 "id": "settings.service.form.headlineNotifications", 2030 "id": "settings.service.form.headlineNotifications",
1779 "start": { 2031 "start": {
1780 "column": 25, 2032 "column": 25,
1781 "line": 78 2033 "line": 80
1782 } 2034 }
1783 }, 2035 },
1784 { 2036 {
1785 "defaultMessage": "!!!Unread message badges", 2037 "defaultMessage": "!!!Unread message badges",
1786 "end": { 2038 "end": {
1787 "column": 3, 2039 "column": 3,
1788 "line": 85 2040 "line": 87
1789 }, 2041 },
1790 "file": "src/components/settings/services/EditServiceForm.js", 2042 "file": "src/components/settings/services/EditServiceForm.js",
1791 "id": "settings.service.form.headlineBadges", 2043 "id": "settings.service.form.headlineBadges",
1792 "start": { 2044 "start": {
1793 "column": 18, 2045 "column": 18,
1794 "line": 82 2046 "line": 84
1795 } 2047 }
1796 }, 2048 },
1797 { 2049 {
1798 "defaultMessage": "!!!General", 2050 "defaultMessage": "!!!General",
1799 "end": { 2051 "end": {
1800 "column": 3, 2052 "column": 3,
1801 "line": 89 2053 "line": 91
1802 }, 2054 },
1803 "file": "src/components/settings/services/EditServiceForm.js", 2055 "file": "src/components/settings/services/EditServiceForm.js",
1804 "id": "settings.service.form.headlineGeneral", 2056 "id": "settings.service.form.headlineGeneral",
1805 "start": { 2057 "start": {
1806 "column": 19, 2058 "column": 19,
1807 "line": 86 2059 "line": 88
1808 } 2060 }
1809 }, 2061 },
1810 { 2062 {
1811 "defaultMessage": "!!!Delete", 2063 "defaultMessage": "!!!Delete",
1812 "end": { 2064 "end": {
1813 "column": 3, 2065 "column": 3,
1814 "line": 93 2066 "line": 95
1815 }, 2067 },
1816 "file": "src/components/settings/services/EditServiceForm.js", 2068 "file": "src/components/settings/services/EditServiceForm.js",
1817 "id": "settings.service.form.iconDelete", 2069 "id": "settings.service.form.iconDelete",
1818 "start": { 2070 "start": {
1819 "column": 14, 2071 "column": 14,
1820 "line": 90 2072 "line": 92
1821 } 2073 }
1822 }, 2074 },
1823 { 2075 {
1824 "defaultMessage": "!!!Drop your image, or click here", 2076 "defaultMessage": "!!!Drop your image, or click here",
1825 "end": { 2077 "end": {
1826 "column": 3, 2078 "column": 3,
1827 "line": 97 2079 "line": 99
1828 }, 2080 },
1829 "file": "src/components/settings/services/EditServiceForm.js", 2081 "file": "src/components/settings/services/EditServiceForm.js",
1830 "id": "settings.service.form.iconUpload", 2082 "id": "settings.service.form.iconUpload",
1831 "start": { 2083 "start": {
1832 "column": 14, 2084 "column": 14,
1833 "line": 94 2085 "line": 96
1834 } 2086 }
1835 }, 2087 },
1836 { 2088 {
1837 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 2089 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
1838 "end": { 2090 "end": {
1839 "column": 3, 2091 "column": 3,
1840 "line": 101 2092 "line": 103
1841 }, 2093 },
1842 "file": "src/components/settings/services/EditServiceForm.js", 2094 "file": "src/components/settings/services/EditServiceForm.js",
1843 "id": "settings.service.form.proxy.headline", 2095 "id": "settings.service.form.proxy.headline",
1844 "start": { 2096 "start": {
1845 "column": 17, 2097 "column": 17,
1846 "line": 98 2098 "line": 100
1847 } 2099 }
1848 }, 2100 },
1849 { 2101 {
1850 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 2102 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
1851 "end": { 2103 "end": {
1852 "column": 3, 2104 "column": 3,
1853 "line": 105 2105 "line": 107
1854 }, 2106 },
1855 "file": "src/components/settings/services/EditServiceForm.js", 2107 "file": "src/components/settings/services/EditServiceForm.js",
1856 "id": "settings.service.form.proxy.restartInfo", 2108 "id": "settings.service.form.proxy.restartInfo",
1857 "start": { 2109 "start": {
1858 "column": 20, 2110 "column": 20,
1859 "line": 102 2111 "line": 104
1860 } 2112 }
1861 }, 2113 },
1862 { 2114 {
1863 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 2115 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
1864 "end": { 2116 "end": {
1865 "column": 3, 2117 "column": 3,
1866 "line": 109 2118 "line": 111
1867 }, 2119 },
1868 "file": "src/components/settings/services/EditServiceForm.js", 2120 "file": "src/components/settings/services/EditServiceForm.js",
1869 "id": "settings.service.form.proxy.info", 2121 "id": "settings.service.form.proxy.info",
1870 "start": { 2122 "start": {
1871 "column": 13, 2123 "column": 13,
1872 "line": 106 2124 "line": 108
1873 } 2125 }
1874 } 2126 }
1875 ], 2127 ],
@@ -1982,117 +2234,117 @@
1982 "defaultMessage": "!!!Your services", 2234 "defaultMessage": "!!!Your services",
1983 "end": { 2235 "end": {
1984 "column": 3, 2236 "column": 3,
1985 "line": 17 2237 "line": 18
1986 }, 2238 },
1987 "file": "src/components/settings/services/ServicesDashboard.js", 2239 "file": "src/components/settings/services/ServicesDashboard.js",
1988 "id": "settings.services.headline", 2240 "id": "settings.services.headline",
1989 "start": { 2241 "start": {
1990 "column": 12, 2242 "column": 12,
1991 "line": 14 2243 "line": 15
1992 } 2244 }
1993 }, 2245 },
1994 { 2246 {
1995 "defaultMessage": "!!!Search service", 2247 "defaultMessage": "!!!Search service",
1996 "end": { 2248 "end": {
1997 "column": 3, 2249 "column": 3,
1998 "line": 21 2250 "line": 22
1999 }, 2251 },
2000 "file": "src/components/settings/services/ServicesDashboard.js", 2252 "file": "src/components/settings/services/ServicesDashboard.js",
2001 "id": "settings.searchService", 2253 "id": "settings.searchService",
2002 "start": { 2254 "start": {
2003 "column": 17, 2255 "column": 17,
2004 "line": 18 2256 "line": 19
2005 } 2257 }
2006 }, 2258 },
2007 { 2259 {
2008 "defaultMessage": "!!!You haven't added any services yet.", 2260 "defaultMessage": "!!!You haven't added any services yet.",
2009 "end": { 2261 "end": {
2010 "column": 3, 2262 "column": 3,
2011 "line": 25 2263 "line": 26
2012 }, 2264 },
2013 "file": "src/components/settings/services/ServicesDashboard.js", 2265 "file": "src/components/settings/services/ServicesDashboard.js",
2014 "id": "settings.services.noServicesAdded", 2266 "id": "settings.services.noServicesAdded",
2015 "start": { 2267 "start": {
2016 "column": 19, 2268 "column": 19,
2017 "line": 22 2269 "line": 23
2018 } 2270 }
2019 }, 2271 },
2020 { 2272 {
2021 "defaultMessage": "!!!Sorry, but no service matched your search term.", 2273 "defaultMessage": "!!!Sorry, but no service matched your search term.",
2022 "end": { 2274 "end": {
2023 "column": 3, 2275 "column": 3,
2024 "line": 29 2276 "line": 30
2025 }, 2277 },
2026 "file": "src/components/settings/services/ServicesDashboard.js", 2278 "file": "src/components/settings/services/ServicesDashboard.js",
2027 "id": "settings.recipes.nothingFound", 2279 "id": "settings.recipes.nothingFound",
2028 "start": { 2280 "start": {
2029 "column": 18, 2281 "column": 18,
2030 "line": 26 2282 "line": 27
2031 } 2283 }
2032 }, 2284 },
2033 { 2285 {
2034 "defaultMessage": "!!!Discover services", 2286 "defaultMessage": "!!!Discover services",
2035 "end": { 2287 "end": {
2036 "column": 3, 2288 "column": 3,
2037 "line": 33 2289 "line": 34
2038 }, 2290 },
2039 "file": "src/components/settings/services/ServicesDashboard.js", 2291 "file": "src/components/settings/services/ServicesDashboard.js",
2040 "id": "settings.services.discoverServices", 2292 "id": "settings.services.discoverServices",
2041 "start": { 2293 "start": {
2042 "column": 20, 2294 "column": 20,
2043 "line": 30 2295 "line": 31
2044 } 2296 }
2045 }, 2297 },
2046 { 2298 {
2047 "defaultMessage": "!!!Could not load your services", 2299 "defaultMessage": "!!!Could not load your services",
2048 "end": { 2300 "end": {
2049 "column": 3, 2301 "column": 3,
2050 "line": 37 2302 "line": 38
2051 }, 2303 },
2052 "file": "src/components/settings/services/ServicesDashboard.js", 2304 "file": "src/components/settings/services/ServicesDashboard.js",
2053 "id": "settings.services.servicesRequestFailed", 2305 "id": "settings.services.servicesRequestFailed",
2054 "start": { 2306 "start": {
2055 "column": 25, 2307 "column": 25,
2056 "line": 34 2308 "line": 35
2057 } 2309 }
2058 }, 2310 },
2059 { 2311 {
2060 "defaultMessage": "!!!Try again", 2312 "defaultMessage": "!!!Try again",
2061 "end": { 2313 "end": {
2062 "column": 3, 2314 "column": 3,
2063 "line": 41 2315 "line": 42
2064 }, 2316 },
2065 "file": "src/components/settings/services/ServicesDashboard.js", 2317 "file": "src/components/settings/services/ServicesDashboard.js",
2066 "id": "settings.account.tryReloadServices", 2318 "id": "settings.account.tryReloadServices",
2067 "start": { 2319 "start": {
2068 "column": 21, 2320 "column": 21,
2069 "line": 38 2321 "line": 39
2070 } 2322 }
2071 }, 2323 },
2072 { 2324 {
2073 "defaultMessage": "!!!Your changes have been saved", 2325 "defaultMessage": "!!!Your changes have been saved",
2074 "end": { 2326 "end": {
2075 "column": 3, 2327 "column": 3,
2076 "line": 45 2328 "line": 46
2077 }, 2329 },
2078 "file": "src/components/settings/services/ServicesDashboard.js", 2330 "file": "src/components/settings/services/ServicesDashboard.js",
2079 "id": "settings.services.updatedInfo", 2331 "id": "settings.services.updatedInfo",
2080 "start": { 2332 "start": {
2081 "column": 15, 2333 "column": 15,
2082 "line": 42 2334 "line": 43
2083 } 2335 }
2084 }, 2336 },
2085 { 2337 {
2086 "defaultMessage": "!!!Service has been deleted", 2338 "defaultMessage": "!!!Service has been deleted",
2087 "end": { 2339 "end": {
2088 "column": 3, 2340 "column": 3,
2089 "line": 49 2341 "line": 50
2090 }, 2342 },
2091 "file": "src/components/settings/services/ServicesDashboard.js", 2343 "file": "src/components/settings/services/ServicesDashboard.js",
2092 "id": "settings.services.deletedInfo", 2344 "id": "settings.services.deletedInfo",
2093 "start": { 2345 "start": {
2094 "column": 15, 2346 "column": 15,
2095 "line": 46 2347 "line": 47
2096 } 2348 }
2097 } 2349 }
2098 ], 2350 ],
@@ -2356,78 +2608,78 @@
2356 "defaultMessage": "!!!Team", 2608 "defaultMessage": "!!!Team",
2357 "end": { 2609 "end": {
2358 "column": 3, 2610 "column": 3,
2359 "line": 17 2611 "line": 20
2360 }, 2612 },
2361 "file": "src/components/settings/team/TeamDashboard.js", 2613 "file": "src/components/settings/team/TeamDashboard.js",
2362 "id": "settings.team.headline", 2614 "id": "settings.team.headline",
2363 "start": { 2615 "start": {
2364 "column": 12, 2616 "column": 12,
2365 "line": 14 2617 "line": 17
2366 } 2618 }
2367 }, 2619 },
2368 { 2620 {
2369 "defaultMessage": "!!!Ferdi for Teams", 2621 "defaultMessage": "!!!Ferdi for Teams",
2370 "end": { 2622 "end": {
2371 "column": 3, 2623 "column": 3,
2372 "line": 21 2624 "line": 24
2373 }, 2625 },
2374 "file": "src/components/settings/team/TeamDashboard.js", 2626 "file": "src/components/settings/team/TeamDashboard.js",
2375 "id": "settings.team.contentHeadline", 2627 "id": "settings.team.contentHeadline",
2376 "start": { 2628 "start": {
2377 "column": 19, 2629 "column": 19,
2378 "line": 18 2630 "line": 21
2379 } 2631 }
2380 }, 2632 },
2381 { 2633 {
2382 "defaultMessage": "!!!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.", 2634 "defaultMessage": "!!!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.",
2383 "end": { 2635 "end": {
2384 "column": 3, 2636 "column": 3,
2385 "line": 25 2637 "line": 28
2386 }, 2638 },
2387 "file": "src/components/settings/team/TeamDashboard.js", 2639 "file": "src/components/settings/team/TeamDashboard.js",
2388 "id": "settings.team.intro", 2640 "id": "settings.team.intro",
2389 "start": { 2641 "start": {
2390 "column": 9, 2642 "column": 9,
2391 "line": 22 2643 "line": 25
2392 } 2644 }
2393 }, 2645 },
2394 { 2646 {
2395 "defaultMessage": "!!!Ferdi 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!", 2647 "defaultMessage": "!!!Ferdi 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!",
2396 "end": { 2648 "end": {
2397 "column": 3, 2649 "column": 3,
2398 "line": 29 2650 "line": 32
2399 }, 2651 },
2400 "file": "src/components/settings/team/TeamDashboard.js", 2652 "file": "src/components/settings/team/TeamDashboard.js",
2401 "id": "settings.team.copy", 2653 "id": "settings.team.copy",
2402 "start": { 2654 "start": {
2403 "column": 8, 2655 "column": 8,
2404 "line": 26 2656 "line": 29
2405 } 2657 }
2406 }, 2658 },
2407 { 2659 {
2408 "defaultMessage": "!!!Manage your Team on meetfranz.com", 2660 "defaultMessage": "!!!Manage your Team on meetfranz.com",
2409 "end": { 2661 "end": {
2410 "column": 3, 2662 "column": 3,
2411 "line": 33 2663 "line": 36
2412 }, 2664 },
2413 "file": "src/components/settings/team/TeamDashboard.js", 2665 "file": "src/components/settings/team/TeamDashboard.js",
2414 "id": "settings.team.manageAction", 2666 "id": "settings.team.manageAction",
2415 "start": { 2667 "start": {
2416 "column": 16, 2668 "column": 16,
2417 "line": 30 2669 "line": 33
2418 } 2670 }
2419 }, 2671 },
2420 { 2672 {
2421 "defaultMessage": "!!!Upgrade your Account", 2673 "defaultMessage": "!!!Upgrade your Account",
2422 "end": { 2674 "end": {
2423 "column": 3, 2675 "column": 3,
2424 "line": 37 2676 "line": 40
2425 }, 2677 },
2426 "file": "src/components/settings/team/TeamDashboard.js", 2678 "file": "src/components/settings/team/TeamDashboard.js",
2427 "id": "settings.team.upgradeAction", 2679 "id": "settings.team.upgradeAction",
2428 "start": { 2680 "start": {
2429 "column": 17, 2681 "column": 17,
2430 "line": 34 2682 "line": 37
2431 } 2683 }
2432 } 2684 }
2433 ], 2685 ],
@@ -2519,220 +2771,435 @@
2519 { 2771 {
2520 "descriptors": [ 2772 "descriptors": [
2521 { 2773 {
2522 "defaultMessage": "!!!Support the development of Franz", 2774 "defaultMessage": "!!!Choose your plan",
2523 "end": { 2775 "end": {
2524 "column": 3, 2776 "column": 3,
2777 "line": 16
2778 },
2779 "file": "src/components/subscription/SubscriptionForm.js",
2780 "id": "subscription.cta.choosePlan",
2781 "start": {
2782 "column": 21,
2783 "line": 13
2784 }
2785 },
2786 {
2787 "defaultMessage": "!!!Upgrade your account and get the full Franz experience",
2788 "end": {
2789 "column": 3,
2790 "line": 20
2791 },
2792 "file": "src/components/subscription/SubscriptionForm.js",
2793 "id": "settings.account.headlineUpgradeAccount",
2794 "start": {
2795 "column": 18,
2525 "line": 17 2796 "line": 17
2797 }
2798 },
2799 {
2800 "defaultMessage": "!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
2801 "end": {
2802 "column": 3,
2803 "line": 24
2526 }, 2804 },
2527 "file": "src/components/subscription/SubscriptionForm.js", 2805 "file": "src/components/subscription/SubscriptionForm.js",
2528 "id": "subscription.submit.label", 2806 "id": "subscription.teaser.intro",
2807 "start": {
2808 "column": 14,
2809 "line": 21
2810 }
2811 },
2812 {
2813 "defaultMessage": "!!!Paid Franz Plans include:",
2814 "end": {
2815 "column": 3,
2816 "line": 28
2817 },
2818 "file": "src/components/subscription/SubscriptionForm.js",
2819 "id": "subscription.teaser.includedFeatures",
2820 "start": {
2821 "column": 20,
2822 "line": 25
2823 }
2824 }
2825 ],
2826 "path": "src/components/subscription/SubscriptionForm.json"
2827 },
2828 {
2829 "descriptors": [
2830 {
2831 "defaultMessage": "!!!Cancel",
2832 "end": {
2833 "column": 3,
2834 "line": 14
2835 },
2836 "file": "src/components/subscription/SubscriptionPopup.js",
2837 "id": "subscriptionPopup.buttonCancel",
2838 "start": {
2839 "column": 16,
2840 "line": 11
2841 }
2842 },
2843 {
2844 "defaultMessage": "!!!Done",
2845 "end": {
2846 "column": 3,
2847 "line": 18
2848 },
2849 "file": "src/components/subscription/SubscriptionPopup.js",
2850 "id": "subscriptionPopup.buttonDone",
2851 "start": {
2852 "column": 14,
2853 "line": 15
2854 }
2855 }
2856 ],
2857 "path": "src/components/subscription/SubscriptionPopup.json"
2858 },
2859 {
2860 "descriptors": [
2861 {
2862 "defaultMessage": "!!!Yes, start the free Franz Professional trial",
2863 "end": {
2864 "column": 3,
2865 "line": 17
2866 },
2867 "file": "src/components/subscription/TrialForm.js",
2868 "id": "subscription.cta.activateTrial",
2529 "start": { 2869 "start": {
2530 "column": 21, 2870 "column": 21,
2531 "line": 14 2871 "line": 14
2532 } 2872 }
2533 }, 2873 },
2534 { 2874 {
2535 "defaultMessage": "!!!Could not initialize payment form", 2875 "defaultMessage": "!!!See all options",
2536 "end": { 2876 "end": {
2537 "column": 3, 2877 "column": 3,
2538 "line": 21 2878 "line": 21
2539 }, 2879 },
2540 "file": "src/components/subscription/SubscriptionForm.js", 2880 "file": "src/components/subscription/TrialForm.js",
2541 "id": "subscription.paymentSessionError", 2881 "id": "subscription.cta.allOptions",
2542 "start": { 2882 "start": {
2543 "column": 23, 2883 "column": 20,
2544 "line": 18 2884 "line": 18
2545 } 2885 }
2546 }, 2886 },
2547 { 2887 {
2548 "defaultMessage": "!!!free", 2888 "defaultMessage": "!!!Get the free 14 day Franz Professional Trial",
2549 "end": { 2889 "end": {
2550 "column": 3, 2890 "column": 3,
2551 "line": 25 2891 "line": 25
2552 }, 2892 },
2553 "file": "src/components/subscription/SubscriptionForm.js", 2893 "file": "src/components/subscription/TrialForm.js",
2554 "id": "subscription.type.free", 2894 "id": "settings.account.headlineTrialUpgrade",
2555 "start": { 2895 "start": {
2556 "column": 12, 2896 "column": 18,
2557 "line": 22 2897 "line": 22
2558 } 2898 }
2559 }, 2899 },
2560 { 2900 {
2561 "defaultMessage": "!!!month", 2901 "defaultMessage": "!!!The Franz Professional Plan includes:",
2562 "end": { 2902 "end": {
2563 "column": 3, 2903 "column": 3,
2564 "line": 29 2904 "line": 29
2565 }, 2905 },
2566 "file": "src/components/subscription/SubscriptionForm.js", 2906 "file": "src/components/subscription/TrialForm.js",
2567 "id": "subscription.type.month", 2907 "id": "subscription.includedProFeatures",
2568 "start": { 2908 "start": {
2569 "column": 15, 2909 "column": 20,
2570 "line": 26 2910 "line": 26
2571 } 2911 }
2572 }, 2912 },
2573 { 2913 {
2574 "defaultMessage": "!!!year", 2914 "defaultMessage": "!!!No strings attached",
2575 "end": { 2915 "end": {
2576 "column": 3, 2916 "column": 3,
2577 "line": 33 2917 "line": 33
2578 }, 2918 },
2579 "file": "src/components/subscription/SubscriptionForm.js", 2919 "file": "src/components/subscription/TrialForm.js",
2580 "id": "subscription.type.year", 2920 "id": "pricing.trial.terms.headline",
2581 "start": { 2921 "start": {
2582 "column": 14, 2922 "column": 29,
2583 "line": 30 2923 "line": 30
2584 } 2924 }
2585 }, 2925 },
2586 { 2926 {
2587 "defaultMessage": "!!!The Ferdi Premium Supporter Account includes", 2927 "defaultMessage": "!!!No credit card required",
2588 "end": { 2928 "end": {
2589 "column": 3, 2929 "column": 3,
2590 "line": 37 2930 "line": 37
2591 }, 2931 },
2592 "file": "src/components/subscription/SubscriptionForm.js", 2932 "file": "src/components/subscription/TrialForm.js",
2593 "id": "subscription.includedFeatures", 2933 "id": "pricing.trial.terms.noCreditCard",
2594 "start": { 2934 "start": {
2595 "column": 20, 2935 "column": 16,
2596 "line": 34 2936 "line": 34
2597 } 2937 }
2598 }, 2938 },
2599 { 2939 {
2600 "defaultMessage": "!!!Add on-premise/hosted services like Mattermost", 2940 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
2601 "end": { 2941 "end": {
2602 "column": 3, 2942 "column": 3,
2603 "line": 41 2943 "line": 41
2604 }, 2944 },
2605 "file": "src/components/subscription/SubscriptionForm.js", 2945 "file": "src/components/subscription/TrialForm.js",
2606 "id": "subscription.features.onpremise.mattermost", 2946 "id": "pricing.trial.terms.automaticTrialEnd",
2607 "start": { 2947 "start": {
2608 "column": 13, 2948 "column": 21,
2609 "line": 38 2949 "line": 38
2610 } 2950 }
2611 }, 2951 }
2952 ],
2953 "path": "src/components/subscription/TrialForm.json"
2954 },
2955 {
2956 "descriptors": [
2612 { 2957 {
2613 "defaultMessage": "!!!No app delays & nagging to upgrade license", 2958 "defaultMessage": "!!!Your trial was successfully activated. Happy messaging!",
2614 "end": { 2959 "end": {
2615 "column": 3, 2960 "column": 3,
2616 "line": 45 2961 "line": 14
2617 }, 2962 },
2618 "file": "src/components/subscription/SubscriptionForm.js", 2963 "file": "src/components/TrialActivationInfoBar.js",
2619 "id": "subscription.features.noInterruptions", 2964 "id": "infobar.trialActivated",
2620 "start": { 2965 "start": {
2621 "column": 19, 2966 "column": 11,
2622 "line": 42 2967 "line": 11
2968 }
2969 }
2970 ],
2971 "path": "src/components/TrialActivationInfoBar.json"
2972 },
2973 {
2974 "descriptors": [
2975 {
2976 "defaultMessage": "!!!Get a Franz Supporter License",
2977 "end": {
2978 "column": 3,
2979 "line": 16
2980 },
2981 "file": "src/components/ui/ActivateTrialButton/index.js",
2982 "id": "feature.delayApp.upgrade.action",
2983 "start": {
2984 "column": 10,
2985 "line": 13
2623 } 2986 }
2624 }, 2987 },
2625 { 2988 {
2626 "defaultMessage": "!!!Proxy support for services", 2989 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
2627 "end": { 2990 "end": {
2628 "column": 3, 2991 "column": 3,
2629 "line": 49 2992 "line": 20
2630 }, 2993 },
2631 "file": "src/components/subscription/SubscriptionForm.js", 2994 "file": "src/components/ui/ActivateTrialButton/index.js",
2632 "id": "subscription.features.proxy", 2995 "id": "feature.delayApp.trial.action",
2633 "start": { 2996 "start": {
2634 "column": 9, 2997 "column": 15,
2635 "line": 46 2998 "line": 17
2636 } 2999 }
2637 }, 3000 },
2638 { 3001 {
2639 "defaultMessage": "!!!Support for Spellchecker", 3002 "defaultMessage": "!!!Upgrade account",
2640 "end": { 3003 "end": {
2641 "column": 3, 3004 "column": 3,
2642 "line": 53 3005 "line": 24
2643 }, 3006 },
2644 "file": "src/components/subscription/SubscriptionForm.js", 3007 "file": "src/components/ui/ActivateTrialButton/index.js",
2645 "id": "subscription.features.spellchecker", 3008 "id": "feature.delayApp.upgrade.actionShort",
2646 "start": { 3009 "start": {
2647 "column": 16, 3010 "column": 15,
2648 "line": 50 3011 "line": 21
2649 } 3012 }
2650 }, 3013 },
2651 { 3014 {
2652 "defaultMessage": "!!!Organize your services in workspaces", 3015 "defaultMessage": "!!!Activate the free Franz Professional trial",
2653 "end": { 3016 "end": {
2654 "column": 3, 3017 "column": 3,
2655 "line": 57 3018 "line": 28
2656 }, 3019 },
2657 "file": "src/components/subscription/SubscriptionForm.js", 3020 "file": "src/components/ui/ActivateTrialButton/index.js",
2658 "id": "subscription.features.workspaces", 3021 "id": "feature.delayApp.trial.actionShort",
2659 "start": { 3022 "start": {
2660 "column": 14, 3023 "column": 20,
2661 "line": 54 3024 "line": 25
2662 } 3025 }
2663 }, 3026 },
2664 { 3027 {
2665 "defaultMessage": "!!!No ads, ever!", 3028 "defaultMessage": "!!!No strings attached",
2666 "end": { 3029 "end": {
2667 "column": 3, 3030 "column": 3,
2668 "line": 61 3031 "line": 32
2669 }, 3032 },
2670 "file": "src/components/subscription/SubscriptionForm.js", 3033 "file": "src/components/ui/ActivateTrialButton/index.js",
2671 "id": "subscription.features.ads", 3034 "id": "pricing.trial.terms.headline",
2672 "start": { 3035 "start": {
2673 "column": 7, 3036 "column": 29,
2674 "line": 58 3037 "line": 29
2675 } 3038 }
2676 }, 3039 },
2677 { 3040 {
2678 "defaultMessage": "!!!coming soon", 3041 "defaultMessage": "!!!No credit card required",
2679 "end": { 3042 "end": {
2680 "column": 3, 3043 "column": 3,
2681 "line": 65 3044 "line": 36
2682 }, 3045 },
2683 "file": "src/components/subscription/SubscriptionForm.js", 3046 "file": "src/components/ui/ActivateTrialButton/index.js",
2684 "id": "subscription.features.comingSoon", 3047 "id": "pricing.trial.terms.noCreditCard",
2685 "start": { 3048 "start": {
2686 "column": 14, 3049 "column": 16,
2687 "line": 62 3050 "line": 33
2688 } 3051 }
2689 }, 3052 },
2690 { 3053 {
2691 "defaultMessage": "!!!EU residents: local sales tax may apply", 3054 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
2692 "end": { 3055 "end": {
2693 "column": 3, 3056 "column": 3,
2694 "line": 69 3057 "line": 40
2695 }, 3058 },
2696 "file": "src/components/subscription/SubscriptionForm.js", 3059 "file": "src/components/ui/ActivateTrialButton/index.js",
2697 "id": "subscription.euTaxInfo", 3060 "id": "pricing.trial.terms.automaticTrialEnd",
2698 "start": { 3061 "start": {
2699 "column": 13, 3062 "column": 21,
2700 "line": 66 3063 "line": 37
2701 } 3064 }
2702 } 3065 }
2703 ], 3066 ],
2704 "path": "src/components/subscription/SubscriptionForm.json" 3067 "path": "src/components/ui/ActivateTrialButton/index.json"
2705 }, 3068 },
2706 { 3069 {
2707 "descriptors": [ 3070 "descriptors": [
2708 { 3071 {
2709 "defaultMessage": "!!!Cancel", 3072 "defaultMessage": "!!!Add unlimited services",
2710 "end": { 3073 "end": {
2711 "column": 3, 3074 "column": 3,
2712 "line": 14 3075 "line": 11
2713 }, 3076 },
2714 "file": "src/components/subscription/SubscriptionPopup.js", 3077 "file": "src/components/ui/FeatureList.js",
2715 "id": "subscriptionPopup.buttonCancel", 3078 "id": "pricing.features.unlimitedServices",
3079 "start": {
3080 "column": 21,
3081 "line": 8
3082 }
3083 },
3084 {
3085 "defaultMessage": "!!!Spellchecker support",
3086 "end": {
3087 "column": 3,
3088 "line": 15
3089 },
3090 "file": "src/components/ui/FeatureList.js",
3091 "id": "pricing.features.spellchecker",
2716 "start": { 3092 "start": {
2717 "column": 16, 3093 "column": 16,
2718 "line": 11 3094 "line": 12
2719 } 3095 }
2720 }, 3096 },
2721 { 3097 {
2722 "defaultMessage": "!!!Done", 3098 "defaultMessage": "!!!Workspaces",
2723 "end": { 3099 "end": {
2724 "column": 3, 3100 "column": 3,
2725 "line": 18 3101 "line": 19
2726 }, 3102 },
2727 "file": "src/components/subscription/SubscriptionPopup.js", 3103 "file": "src/components/ui/FeatureList.js",
2728 "id": "subscriptionPopup.buttonDone", 3104 "id": "pricing.features.workspaces",
2729 "start": { 3105 "start": {
2730 "column": 14, 3106 "column": 14,
2731 "line": 15 3107 "line": 16
3108 }
3109 },
3110 {
3111 "defaultMessage": "!!!Add Custom Websites",
3112 "end": {
3113 "column": 3,
3114 "line": 23
3115 },
3116 "file": "src/components/ui/FeatureList.js",
3117 "id": "pricing.features.customWebsites",
3118 "start": {
3119 "column": 18,
3120 "line": 20
3121 }
3122 },
3123 {
3124 "defaultMessage": "!!!On-premise & other Hosted Services",
3125 "end": {
3126 "column": 3,
3127 "line": 27
3128 },
3129 "file": "src/components/ui/FeatureList.js",
3130 "id": "pricing.features.onPremise",
3131 "start": {
3132 "column": 13,
3133 "line": 24
3134 }
3135 },
3136 {
3137 "defaultMessage": "!!!Install 3rd party services",
3138 "end": {
3139 "column": 3,
3140 "line": 31
3141 },
3142 "file": "src/components/ui/FeatureList.js",
3143 "id": "pricing.features.thirdPartyServices",
3144 "start": {
3145 "column": 22,
3146 "line": 28
3147 }
3148 },
3149 {
3150 "defaultMessage": "!!!Service Proxies",
3151 "end": {
3152 "column": 3,
3153 "line": 35
3154 },
3155 "file": "src/components/ui/FeatureList.js",
3156 "id": "pricing.features.serviceProxies",
3157 "start": {
3158 "column": 18,
3159 "line": 32
3160 }
3161 },
3162 {
3163 "defaultMessage": "!!!Team Management",
3164 "end": {
3165 "column": 3,
3166 "line": 39
3167 },
3168 "file": "src/components/ui/FeatureList.js",
3169 "id": "pricing.features.teamManagement",
3170 "start": {
3171 "column": 18,
3172 "line": 36
3173 }
3174 },
3175 {
3176 "defaultMessage": "!!!No Waiting Screens",
3177 "end": {
3178 "column": 3,
3179 "line": 43
3180 },
3181 "file": "src/components/ui/FeatureList.js",
3182 "id": "pricing.features.appDelays",
3183 "start": {
3184 "column": 13,
3185 "line": 40
3186 }
3187 },
3188 {
3189 "defaultMessage": "!!!Forever ad-free",
3190 "end": {
3191 "column": 3,
3192 "line": 47
3193 },
3194 "file": "src/components/ui/FeatureList.js",
3195 "id": "pricing.features.adFree",
3196 "start": {
3197 "column": 10,
3198 "line": 44
2732 } 3199 }
2733 } 3200 }
2734 ], 3201 ],
2735 "path": "src/components/subscription/SubscriptionPopup.json" 3202 "path": "src/components/ui/FeatureList.json"
2736 }, 3203 },
2737 { 3204 {
2738 "descriptors": [ 3205 "descriptors": [
@@ -2740,13 +3207,13 @@
2740 "defaultMessage": "!!!Upgrade account", 3207 "defaultMessage": "!!!Upgrade account",
2741 "end": { 3208 "end": {
2742 "column": 3, 3209 "column": 3,
2743 "line": 17 3210 "line": 19
2744 }, 3211 },
2745 "file": "src/components/ui/PremiumFeatureContainer/index.js", 3212 "file": "src/components/ui/PremiumFeatureContainer/index.js",
2746 "id": "premiumFeature.button.upgradeAccount", 3213 "id": "premiumFeature.button.upgradeAccount",
2747 "start": { 3214 "start": {
2748 "column": 10, 3215 "column": 10,
2749 "line": 14 3216 "line": 16
2750 } 3217 }
2751 } 3218 }
2752 ], 3219 ],
@@ -2755,6 +3222,24 @@
2755 { 3222 {
2756 "descriptors": [ 3223 "descriptors": [
2757 { 3224 {
3225 "defaultMessage": "!!!Upgrade to Franz Professional",
3226 "end": {
3227 "column": 3,
3228 "line": 16
3229 },
3230 "file": "src/components/ui/UpgradeButton/index.js",
3231 "id": "global.upgradeButton.upgradeToPro",
3232 "start": {
3233 "column": 16,
3234 "line": 13
3235 }
3236 }
3237 ],
3238 "path": "src/components/ui/UpgradeButton/index.json"
3239 },
3240 {
3241 "descriptors": [
3242 {
2758 "defaultMessage": "!!!Loading", 3243 "defaultMessage": "!!!Loading",
2759 "end": { 3244 "end": {
2760 "column": 3, 3245 "column": 3,
@@ -3085,90 +3570,103 @@
3085 "defaultMessage": "!!!Language", 3570 "defaultMessage": "!!!Language",
3086 "end": { 3571 "end": {
3087 "column": 3, 3572 "column": 3,
3088 "line": 51 3573 "line": 47
3089 }, 3574 },
3090 "file": "src/containers/settings/EditSettingsScreen.js", 3575 "file": "src/containers/settings/EditSettingsScreen.js",
3091 "id": "settings.app.form.language", 3576 "id": "settings.app.form.language",
3092 "start": { 3577 "start": {
3093 "column": 12, 3578 "column": 12,
3094 "line": 48 3579 "line": 44
3095 } 3580 }
3096 }, 3581 },
3097 { 3582 {
3098 "defaultMessage": "!!!Dark Mode", 3583 "defaultMessage": "!!!Dark Mode",
3099 "end": { 3584 "end": {
3100 "column": 3, 3585 "column": 3,
3101 "line": 55 3586 "line": 51
3102 }, 3587 },
3103 "file": "src/containers/settings/EditSettingsScreen.js", 3588 "file": "src/containers/settings/EditSettingsScreen.js",
3104 "id": "settings.app.form.darkMode", 3589 "id": "settings.app.form.darkMode",
3105 "start": { 3590 "start": {
3106 "column": 12, 3591 "column": 12,
3107 "line": 52 3592 "line": 48
3108 } 3593 }
3109 }, 3594 },
3110 { 3595 {
3111 "defaultMessage": "!!!Display disabled services tabs", 3596 "defaultMessage": "!!!Display disabled services tabs",
3112 "end": { 3597 "end": {
3113 "column": 3, 3598 "column": 3,
3114 "line": 59 3599 "line": 55
3115 }, 3600 },
3116 "file": "src/containers/settings/EditSettingsScreen.js", 3601 "file": "src/containers/settings/EditSettingsScreen.js",
3117 "id": "settings.app.form.showDisabledServices", 3602 "id": "settings.app.form.showDisabledServices",
3118 "start": { 3603 "start": {
3119 "column": 24, 3604 "column": 24,
3120 "line": 56 3605 "line": 52
3121 } 3606 }
3122 }, 3607 },
3123 { 3608 {
3124 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 3609 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
3125 "end": { 3610 "end": {
3126 "column": 3, 3611 "column": 3,
3127 "line": 63 3612 "line": 59
3128 }, 3613 },
3129 "file": "src/containers/settings/EditSettingsScreen.js", 3614 "file": "src/containers/settings/EditSettingsScreen.js",
3130 "id": "settings.app.form.showMessagesBadgesWhenMuted", 3615 "id": "settings.app.form.showMessagesBadgesWhenMuted",
3131 "start": { 3616 "start": {
3132 "column": 29, 3617 "column": 29,
3133 "line": 60 3618 "line": 56
3134 } 3619 }
3135 }, 3620 },
3136 { 3621 {
3137 "defaultMessage": "!!!Enable spell checking", 3622 "defaultMessage": "!!!Enable spell checking",
3138 "end": { 3623 "end": {
3139 "column": 3, 3624 "column": 3,
3140 "line": 67 3625 "line": 63
3141 }, 3626 },
3142 "file": "src/containers/settings/EditSettingsScreen.js", 3627 "file": "src/containers/settings/EditSettingsScreen.js",
3143 "id": "settings.app.form.enableSpellchecking", 3628 "id": "settings.app.form.enableSpellchecking",
3144 "start": { 3629 "start": {
3145 "column": 23, 3630 "column": 23,
3146 "line": 64 3631 "line": 60
3147 } 3632 }
3148 }, 3633 },
3149 { 3634 {
3150 "defaultMessage": "!!!Enable GPU Acceleration", 3635 "defaultMessage": "!!!Enable GPU Acceleration",
3151 "end": { 3636 "end": {
3152 "column": 3, 3637 "column": 3,
3153 "line": 71 3638 "line": 67
3154 }, 3639 },
3155 "file": "src/containers/settings/EditSettingsScreen.js", 3640 "file": "src/containers/settings/EditSettingsScreen.js",
3156 "id": "settings.app.form.enableGPUAcceleration", 3641 "id": "settings.app.form.enableGPUAcceleration",
3157 "start": { 3642 "start": {
3158 "column": 25, 3643 "column": 25,
3159 "line": 68 3644 "line": 64
3160 } 3645 }
3161 }, 3646 },
3162 { 3647 {
3163 "defaultMessage": "!!!Include beta versions", 3648 "defaultMessage": "!!!Include beta versions",
3164 "end": { 3649 "end": {
3165 "column": 3, 3650 "column": 3,
3166 "line": 75 3651 "line": 71
3167 }, 3652 },
3168 "file": "src/containers/settings/EditSettingsScreen.js", 3653 "file": "src/containers/settings/EditSettingsScreen.js",
3169 "id": "settings.app.form.beta", 3654 "id": "settings.app.form.beta",
3170 "start": { 3655 "start": {
3171 "column": 8, 3656 "column": 8,
3657 "line": 68
3658 }
3659 },
3660 {
3661 "defaultMessage": "!!!Enable Franz Todos",
3662 "end": {
3663 "column": 3,
3664 "line": 75
3665 },
3666 "file": "src/containers/settings/EditSettingsScreen.js",
3667 "id": "settings.app.form.enableTodos",
3668 "start": {
3669 "column": 15,
3172 "line": 72 3670 "line": 72
3173 } 3671 }
3174 } 3672 }
@@ -3321,39 +3819,65 @@
3321 "defaultMessage": "!!!Please purchase license to skip waiting", 3819 "defaultMessage": "!!!Please purchase license to skip waiting",
3322 "end": { 3820 "end": {
3323 "column": 3, 3821 "column": 3,
3324 "line": 16 3822 "line": 20
3325 }, 3823 },
3326 "file": "src/features/delayApp/Component.js", 3824 "file": "src/features/delayApp/Component.js",
3327 "id": "feature.delayApp.headline", 3825 "id": "feature.delayApp.headline",
3328 "start": { 3826 "start": {
3329 "column": 12, 3827 "column": 12,
3330 "line": 13 3828 "line": 17
3331 } 3829 }
3332 }, 3830 },
3333 { 3831 {
3334 "defaultMessage": "!!!Get a Ferdi Supporter License", 3832 "defaultMessage": "!!!Get the free Franz Professional 14 day trial and skip the line",
3335 "end": { 3833 "end": {
3336 "column": 3, 3834 "column": 3,
3337 "line": 20 3835 "line": 24
3338 }, 3836 },
3339 "file": "src/features/delayApp/Component.js", 3837 "file": "src/features/delayApp/Component.js",
3340 "id": "feature.delayApp.action", 3838 "id": "feature.delayApp.trial.headline",
3839 "start": {
3840 "column": 17,
3841 "line": 21
3842 }
3843 },
3844 {
3845 "defaultMessage": "!!!Get a Franz Supporter License",
3846 "end": {
3847 "column": 3,
3848 "line": 28
3849 },
3850 "file": "src/features/delayApp/Component.js",
3851 "id": "feature.delayApp.upgrade.action",
3341 "start": { 3852 "start": {
3342 "column": 10, 3853 "column": 10,
3343 "line": 17 3854 "line": 25
3855 }
3856 },
3857 {
3858 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
3859 "end": {
3860 "column": 3,
3861 "line": 32
3862 },
3863 "file": "src/features/delayApp/Component.js",
3864 "id": "feature.delayApp.trial.action",
3865 "start": {
3866 "column": 15,
3867 "line": 29
3344 } 3868 }
3345 }, 3869 },
3346 { 3870 {
3347 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.", 3871 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.",
3348 "end": { 3872 "end": {
3349 "column": 3, 3873 "column": 3,
3350 "line": 24 3874 "line": 36
3351 }, 3875 },
3352 "file": "src/features/delayApp/Component.js", 3876 "file": "src/features/delayApp/Component.js",
3353 "id": "feature.delayApp.text", 3877 "id": "feature.delayApp.text",
3354 "start": { 3878 "start": {
3355 "column": 8, 3879 "column": 8,
3356 "line": 21 3880 "line": 33
3357 } 3881 }
3358 } 3882 }
3359 ], 3883 ],
@@ -3362,94 +3886,143 @@
3362 { 3886 {
3363 "descriptors": [ 3887 "descriptors": [
3364 { 3888 {
3365 "defaultMessage": "!!!Ferdi is better together!", 3889 "defaultMessage": "!!!Changes in Franz {version}",
3890 "end": {
3891 "column": 3,
3892 "line": 23
3893 },
3894 "file": "src/features/serviceLimit/components/AnnouncementScreen.js",
3895 "id": "feature.announcements.changelog.headline",
3896 "start": {
3897 "column": 12,
3898 "line": 20
3899 }
3900 }
3901 ],
3902 "path": "src/features/serviceLimit/components/AnnouncementScreen.json"
3903 },
3904 {
3905 "descriptors": [
3906 {
3907 "defaultMessage": "!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.",
3908 "end": {
3909 "column": 3,
3910 "line": 14
3911 },
3912 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
3913 "id": "feature.serviceLimit.limitReached",
3914 "start": {
3915 "column": 16,
3916 "line": 11
3917 }
3918 },
3919 {
3920 "defaultMessage": "!!!Upgrade account",
3366 "end": { 3921 "end": {
3367 "column": 3, 3922 "column": 3,
3368 "line": 17 3923 "line": 17
3369 }, 3924 },
3925 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
3926 "id": "premiumFeature.button.upgradeAccount",
3927 "start": {
3928 "column": 10,
3929 "line": 15
3930 }
3931 }
3932 ],
3933 "path": "src/features/serviceLimit/components/LimitReachedInfobox.json"
3934 },
3935 {
3936 "descriptors": [
3937 {
3938 "defaultMessage": "!!!Franz is better together!",
3939 "end": {
3940 "column": 3,
3941 "line": 21
3942 },
3370 "file": "src/features/shareFranz/Component.js", 3943 "file": "src/features/shareFranz/Component.js",
3371 "id": "feature.shareFranz.headline", 3944 "id": "feature.shareFranz.headline",
3372 "start": { 3945 "start": {
3373 "column": 12, 3946 "column": 12,
3374 "line": 14 3947 "line": 18
3375 } 3948 }
3376 }, 3949 },
3377 { 3950 {
3378 "defaultMessage": "!!!Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 3951 "defaultMessage": "!!!Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
3379 "end": { 3952 "end": {
3380 "column": 3, 3953 "column": 3,
3381 "line": 21 3954 "line": 25
3382 }, 3955 },
3383 "file": "src/features/shareFranz/Component.js", 3956 "file": "src/features/shareFranz/Component.js",
3384 "id": "feature.shareFranz.text", 3957 "id": "feature.shareFranz.text",
3385 "start": { 3958 "start": {
3386 "column": 8, 3959 "column": 8,
3387 "line": 18 3960 "line": 22
3388 } 3961 }
3389 }, 3962 },
3390 { 3963 {
3391 "defaultMessage": "!!!Share as email", 3964 "defaultMessage": "!!!Share as email",
3392 "end": { 3965 "end": {
3393 "column": 3, 3966 "column": 3,
3394 "line": 25 3967 "line": 29
3395 }, 3968 },
3396 "file": "src/features/shareFranz/Component.js", 3969 "file": "src/features/shareFranz/Component.js",
3397 "id": "feature.shareFranz.action.email", 3970 "id": "feature.shareFranz.action.email",
3398 "start": { 3971 "start": {
3399 "column": 16, 3972 "column": 16,
3400 "line": 22 3973 "line": 26
3401 } 3974 }
3402 }, 3975 },
3403 { 3976 {
3404 "defaultMessage": "!!!Share on Facebook", 3977 "defaultMessage": "!!!Share on Facebook",
3405 "end": { 3978 "end": {
3406 "column": 3, 3979 "column": 3,
3407 "line": 29 3980 "line": 33
3408 }, 3981 },
3409 "file": "src/features/shareFranz/Component.js", 3982 "file": "src/features/shareFranz/Component.js",
3410 "id": "feature.shareFranz.action.facebook", 3983 "id": "feature.shareFranz.action.facebook",
3411 "start": { 3984 "start": {
3412 "column": 19, 3985 "column": 19,
3413 "line": 26 3986 "line": 30
3414 } 3987 }
3415 }, 3988 },
3416 { 3989 {
3417 "defaultMessage": "!!!Share on Twitter", 3990 "defaultMessage": "!!!Share on Twitter",
3418 "end": { 3991 "end": {
3419 "column": 3, 3992 "column": 3,
3420 "line": 33 3993 "line": 37
3421 }, 3994 },
3422 "file": "src/features/shareFranz/Component.js", 3995 "file": "src/features/shareFranz/Component.js",
3423 "id": "feature.shareFranz.action.twitter", 3996 "id": "feature.shareFranz.action.twitter",
3424 "start": { 3997 "start": {
3425 "column": 18, 3998 "column": 18,
3426 "line": 30 3999 "line": 34
3427 } 4000 }
3428 }, 4001 },
3429 { 4002 {
3430 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 4003 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
3431 "end": { 4004 "end": {
3432 "column": 3, 4005 "column": 3,
3433 "line": 37 4006 "line": 41
3434 }, 4007 },
3435 "file": "src/features/shareFranz/Component.js", 4008 "file": "src/features/shareFranz/Component.js",
3436 "id": "feature.shareFranz.shareText.email", 4009 "id": "feature.shareFranz.shareText.email",
3437 "start": { 4010 "start": {
3438 "column": 18, 4011 "column": 18,
3439 "line": 34 4012 "line": 38
3440 } 4013 }
3441 }, 4014 },
3442 { 4015 {
3443 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", 4016 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
3444 "end": { 4017 "end": {
3445 "column": 3, 4018 "column": 3,
3446 "line": 41 4019 "line": 45
3447 }, 4020 },
3448 "file": "src/features/shareFranz/Component.js", 4021 "file": "src/features/shareFranz/Component.js",
3449 "id": "feature.shareFranz.shareText.twitter", 4022 "id": "feature.shareFranz.shareText.twitter",
3450 "start": { 4023 "start": {
3451 "column": 20, 4024 "column": 20,
3452 "line": 38 4025 "line": 42
3453 } 4026 }
3454 } 4027 }
3455 ], 4028 ],
@@ -3458,6 +4031,50 @@
3458 { 4031 {
3459 "descriptors": [ 4032 "descriptors": [
3460 { 4033 {
4034 "defaultMessage": "!!!Franz Todos are available to premium users now!",
4035 "end": {
4036 "column": 3,
4037 "line": 21
4038 },
4039 "file": "src/features/todos/components/TodosWebview.js",
4040 "id": "feature.todos.premium.info",
4041 "start": {
4042 "column": 15,
4043 "line": 18
4044 }
4045 },
4046 {
4047 "defaultMessage": "!!!Upgrade Account",
4048 "end": {
4049 "column": 3,
4050 "line": 25
4051 },
4052 "file": "src/features/todos/components/TodosWebview.js",
4053 "id": "feature.todos.premium.upgrade",
4054 "start": {
4055 "column": 14,
4056 "line": 22
4057 }
4058 },
4059 {
4060 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
4061 "end": {
4062 "column": 3,
4063 "line": 29
4064 },
4065 "file": "src/features/todos/components/TodosWebview.js",
4066 "id": "feature.todos.premium.rollout",
4067 "start": {
4068 "column": 15,
4069 "line": 26
4070 }
4071 }
4072 ],
4073 "path": "src/features/todos/components/TodosWebview.json"
4074 },
4075 {
4076 "descriptors": [
4077 {
3461 "defaultMessage": "!!!Create workspace", 4078 "defaultMessage": "!!!Create workspace",
3462 "end": { 4079 "end": {
3463 "column": 3, 4080 "column": 3,
@@ -3588,104 +4205,104 @@
3588 "defaultMessage": "!!!Workspaces", 4205 "defaultMessage": "!!!Workspaces",
3589 "end": { 4206 "end": {
3590 "column": 3, 4207 "column": 3,
3591 "line": 18 4208 "line": 20
3592 }, 4209 },
3593 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4210 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3594 "id": "workspaceDrawer.headline", 4211 "id": "workspaceDrawer.headline",
3595 "start": { 4212 "start": {
3596 "column": 12, 4213 "column": 12,
3597 "line": 15 4214 "line": 17
3598 } 4215 }
3599 }, 4216 },
3600 { 4217 {
3601 "defaultMessage": "!!!All services", 4218 "defaultMessage": "!!!All services",
3602 "end": { 4219 "end": {
3603 "column": 3, 4220 "column": 3,
3604 "line": 22 4221 "line": 24
3605 }, 4222 },
3606 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4223 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3607 "id": "workspaceDrawer.allServices", 4224 "id": "workspaceDrawer.allServices",
3608 "start": { 4225 "start": {
3609 "column": 15, 4226 "column": 15,
3610 "line": 19 4227 "line": 21
3611 } 4228 }
3612 }, 4229 },
3613 { 4230 {
3614 "defaultMessage": "!!!Workspaces settings", 4231 "defaultMessage": "!!!Workspaces settings",
3615 "end": { 4232 "end": {
3616 "column": 3, 4233 "column": 3,
3617 "line": 26 4234 "line": 28
3618 }, 4235 },
3619 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4236 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3620 "id": "workspaceDrawer.workspacesSettingsTooltip", 4237 "id": "workspaceDrawer.workspacesSettingsTooltip",
3621 "start": { 4238 "start": {
3622 "column": 29, 4239 "column": 29,
3623 "line": 23 4240 "line": 25
3624 } 4241 }
3625 }, 4242 },
3626 { 4243 {
3627 "defaultMessage": "!!!Info about workspace feature", 4244 "defaultMessage": "!!!Info about workspace feature",
3628 "end": { 4245 "end": {
3629 "column": 3, 4246 "column": 3,
3630 "line": 30 4247 "line": 32
3631 }, 4248 },
3632 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4249 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3633 "id": "workspaceDrawer.workspaceFeatureInfo", 4250 "id": "workspaceDrawer.workspaceFeatureInfo",
3634 "start": { 4251 "start": {
3635 "column": 24, 4252 "column": 24,
3636 "line": 27 4253 "line": 29
3637 } 4254 }
3638 }, 4255 },
3639 { 4256 {
3640 "defaultMessage": "!!!Create your first workspace", 4257 "defaultMessage": "!!!Create your first workspace",
3641 "end": { 4258 "end": {
3642 "column": 3, 4259 "column": 3,
3643 "line": 34 4260 "line": 36
3644 }, 4261 },
3645 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4262 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3646 "id": "workspaceDrawer.premiumCtaButtonLabel", 4263 "id": "workspaceDrawer.premiumCtaButtonLabel",
3647 "start": { 4264 "start": {
3648 "column": 25, 4265 "column": 25,
3649 "line": 31 4266 "line": 33
3650 } 4267 }
3651 }, 4268 },
3652 { 4269 {
3653 "defaultMessage": "!!!Reactivate premium account", 4270 "defaultMessage": "!!!Reactivate premium account",
3654 "end": { 4271 "end": {
3655 "column": 3, 4272 "column": 3,
3656 "line": 38 4273 "line": 40
3657 }, 4274 },
3658 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4275 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3659 "id": "workspaceDrawer.reactivatePremiumAccountLabel", 4276 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
3660 "start": { 4277 "start": {
3661 "column": 28, 4278 "column": 28,
3662 "line": 35 4279 "line": 37
3663 } 4280 }
3664 }, 4281 },
3665 { 4282 {
3666 "defaultMessage": "!!!add new workspace", 4283 "defaultMessage": "!!!add new workspace",
3667 "end": { 4284 "end": {
3668 "column": 3, 4285 "column": 3,
3669 "line": 42 4286 "line": 44
3670 }, 4287 },
3671 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4288 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3672 "id": "workspaceDrawer.addNewWorkspaceLabel", 4289 "id": "workspaceDrawer.addNewWorkspaceLabel",
3673 "start": { 4290 "start": {
3674 "column": 24, 4291 "column": 24,
3675 "line": 39 4292 "line": 41
3676 } 4293 }
3677 }, 4294 },
3678 { 4295 {
3679 "defaultMessage": "!!!Premium feature", 4296 "defaultMessage": "!!!Premium feature",
3680 "end": { 4297 "end": {
3681 "column": 3, 4298 "column": 3,
3682 "line": 46 4299 "line": 48
3683 }, 4300 },
3684 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 4301 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3685 "id": "workspaceDrawer.proFeatureBadge", 4302 "id": "workspaceDrawer.proFeatureBadge",
3686 "start": { 4303 "start": {
3687 "column": 23, 4304 "column": 23,
3688 "line": 43 4305 "line": 45
3689 } 4306 }
3690 } 4307 }
3691 ], 4308 ],
@@ -3728,104 +4345,104 @@
3728 "defaultMessage": "!!!Your workspaces", 4345 "defaultMessage": "!!!Your workspaces",
3729 "end": { 4346 "end": {
3730 "column": 3, 4347 "column": 3,
3731 "line": 20 4348 "line": 22
3732 }, 4349 },
3733 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4350 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3734 "id": "settings.workspaces.headline", 4351 "id": "settings.workspaces.headline",
3735 "start": { 4352 "start": {
3736 "column": 12, 4353 "column": 12,
3737 "line": 17 4354 "line": 19
3738 } 4355 }
3739 }, 4356 },
3740 { 4357 {
3741 "defaultMessage": "!!!You haven't added any workspaces yet.", 4358 "defaultMessage": "!!!You haven't added any workspaces yet.",
3742 "end": { 4359 "end": {
3743 "column": 3, 4360 "column": 3,
3744 "line": 24 4361 "line": 26
3745 }, 4362 },
3746 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4363 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3747 "id": "settings.workspaces.noWorkspacesAdded", 4364 "id": "settings.workspaces.noWorkspacesAdded",
3748 "start": { 4365 "start": {
3749 "column": 19, 4366 "column": 19,
3750 "line": 21 4367 "line": 23
3751 } 4368 }
3752 }, 4369 },
3753 { 4370 {
3754 "defaultMessage": "!!!Could not load your workspaces", 4371 "defaultMessage": "!!!Could not load your workspaces",
3755 "end": { 4372 "end": {
3756 "column": 3, 4373 "column": 3,
3757 "line": 28 4374 "line": 30
3758 }, 4375 },
3759 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4376 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3760 "id": "settings.workspaces.workspacesRequestFailed", 4377 "id": "settings.workspaces.workspacesRequestFailed",
3761 "start": { 4378 "start": {
3762 "column": 27, 4379 "column": 27,
3763 "line": 25 4380 "line": 27
3764 } 4381 }
3765 }, 4382 },
3766 { 4383 {
3767 "defaultMessage": "!!!Try again", 4384 "defaultMessage": "!!!Try again",
3768 "end": { 4385 "end": {
3769 "column": 3, 4386 "column": 3,
3770 "line": 32 4387 "line": 34
3771 }, 4388 },
3772 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4389 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3773 "id": "settings.workspaces.tryReloadWorkspaces", 4390 "id": "settings.workspaces.tryReloadWorkspaces",
3774 "start": { 4391 "start": {
3775 "column": 23, 4392 "column": 23,
3776 "line": 29 4393 "line": 31
3777 } 4394 }
3778 }, 4395 },
3779 { 4396 {
3780 "defaultMessage": "!!!Your changes have been saved", 4397 "defaultMessage": "!!!Your changes have been saved",
3781 "end": { 4398 "end": {
3782 "column": 3, 4399 "column": 3,
3783 "line": 36 4400 "line": 38
3784 }, 4401 },
3785 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4402 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3786 "id": "settings.workspaces.updatedInfo", 4403 "id": "settings.workspaces.updatedInfo",
3787 "start": { 4404 "start": {
3788 "column": 15, 4405 "column": 15,
3789 "line": 33 4406 "line": 35
3790 } 4407 }
3791 }, 4408 },
3792 { 4409 {
3793 "defaultMessage": "!!!Workspace has been deleted", 4410 "defaultMessage": "!!!Workspace has been deleted",
3794 "end": { 4411 "end": {
3795 "column": 3, 4412 "column": 3,
3796 "line": 40 4413 "line": 42
3797 }, 4414 },
3798 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4415 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3799 "id": "settings.workspaces.deletedInfo", 4416 "id": "settings.workspaces.deletedInfo",
3800 "start": { 4417 "start": {
3801 "column": 15, 4418 "column": 15,
3802 "line": 37 4419 "line": 39
3803 } 4420 }
3804 }, 4421 },
3805 { 4422 {
3806 "defaultMessage": "!!!Info about workspace feature", 4423 "defaultMessage": "!!!Info about workspace feature",
3807 "end": { 4424 "end": {
3808 "column": 3, 4425 "column": 3,
3809 "line": 44 4426 "line": 46
3810 }, 4427 },
3811 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4428 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3812 "id": "settings.workspaces.workspaceFeatureInfo", 4429 "id": "settings.workspaces.workspaceFeatureInfo",
3813 "start": { 4430 "start": {
3814 "column": 24, 4431 "column": 24,
3815 "line": 41 4432 "line": 43
3816 } 4433 }
3817 }, 4434 },
3818 { 4435 {
3819 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces", 4436 "defaultMessage": "!!!Less is More: Introducing Franz Workspaces",
3820 "end": { 4437 "end": {
3821 "column": 3, 4438 "column": 3,
3822 "line": 48 4439 "line": 50
3823 }, 4440 },
3824 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 4441 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3825 "id": "settings.workspaces.workspaceFeatureHeadline", 4442 "id": "settings.workspaces.workspaceFeatureHeadline",
3826 "start": { 4443 "start": {
3827 "column": 28, 4444 "column": 28,
3828 "line": 45 4445 "line": 47
3829 } 4446 }
3830 } 4447 }
3831 ], 4448 ],
@@ -3852,6 +4469,146 @@
3852 { 4469 {
3853 "descriptors": [ 4470 "descriptors": [
3854 { 4471 {
4472 "defaultMessage": "!!!Franz Professional",
4473 "end": {
4474 "column": 3,
4475 "line": 8
4476 },
4477 "file": "src/helpers/plan-helpers.js",
4478 "id": "pricing.plan.pro",
4479 "start": {
4480 "column": 15,
4481 "line": 5
4482 }
4483 },
4484 {
4485 "defaultMessage": "!!!Franz Personal",
4486 "end": {
4487 "column": 3,
4488 "line": 12
4489 },
4490 "file": "src/helpers/plan-helpers.js",
4491 "id": "pricing.plan.personal",
4492 "start": {
4493 "column": 20,
4494 "line": 9
4495 }
4496 },
4497 {
4498 "defaultMessage": "!!!Franz Free",
4499 "end": {
4500 "column": 3,
4501 "line": 16
4502 },
4503 "file": "src/helpers/plan-helpers.js",
4504 "id": "pricing.plan.free",
4505 "start": {
4506 "column": 16,
4507 "line": 13
4508 }
4509 },
4510 {
4511 "defaultMessage": "!!!Franz Premium",
4512 "end": {
4513 "column": 3,
4514 "line": 20
4515 },
4516 "file": "src/helpers/plan-helpers.js",
4517 "id": "pricing.plan.legacy",
4518 "start": {
4519 "column": 18,
4520 "line": 17
4521 }
4522 }
4523 ],
4524 "path": "src/helpers/plan-helpers.json"
4525 },
4526 {
4527 "descriptors": [
4528 {
4529 "defaultMessage": "!!!Franz Professional Yearly",
4530 "end": {
4531 "column": 3,
4532 "line": 8
4533 },
4534 "file": "src/helpers/pricing-helpers.js",
4535 "id": "pricing.plan.pro-yearly",
4536 "start": {
4537 "column": 22,
4538 "line": 5
4539 }
4540 },
4541 {
4542 "defaultMessage": "!!!Franz Professional Monthly",
4543 "end": {
4544 "column": 3,
4545 "line": 12
4546 },
4547 "file": "src/helpers/pricing-helpers.js",
4548 "id": "pricing.plan.pro-monthly",
4549 "start": {
4550 "column": 23,
4551 "line": 9
4552 }
4553 },
4554 {
4555 "defaultMessage": "!!!Franz Personal Yearly",
4556 "end": {
4557 "column": 3,
4558 "line": 16
4559 },
4560 "file": "src/helpers/pricing-helpers.js",
4561 "id": "pricing.plan.personal-yearly",
4562 "start": {
4563 "column": 27,
4564 "line": 13
4565 }
4566 },
4567 {
4568 "defaultMessage": "!!!Franz Personal Monthly",
4569 "end": {
4570 "column": 3,
4571 "line": 20
4572 },
4573 "file": "src/helpers/pricing-helpers.js",
4574 "id": "pricing.plan.personal-monthly",
4575 "start": {
4576 "column": 28,
4577 "line": 17
4578 }
4579 },
4580 {
4581 "defaultMessage": "!!!Franz Free",
4582 "end": {
4583 "column": 3,
4584 "line": 24
4585 },
4586 "file": "src/helpers/pricing-helpers.js",
4587 "id": "pricing.plan.free",
4588 "start": {
4589 "column": 16,
4590 "line": 21
4591 }
4592 },
4593 {
4594 "defaultMessage": "!!!Franz Premium",
4595 "end": {
4596 "column": 3,
4597 "line": 28
4598 },
4599 "file": "src/helpers/pricing-helpers.js",
4600 "id": "pricing.plan.legacy",
4601 "start": {
4602 "column": 18,
4603 "line": 25
4604 }
4605 }
4606 ],
4607 "path": "src/helpers/pricing-helpers.json"
4608 },
4609 {
4610 "descriptors": [
4611 {
3855 "defaultMessage": "!!!Field is required", 4612 "defaultMessage": "!!!Field is required",
3856 "end": { 4613 "end": {
3857 "column": 3, 4614 "column": 3,
@@ -3998,6 +4755,19 @@
3998 "column": 39, 4755 "column": 39,
3999 "line": 24 4756 "line": 24
4000 } 4757 }
4758 },
4759 {
4760 "defaultMessage": "!!!Franz Professional Required",
4761 "end": {
4762 "column": 3,
4763 "line": 31
4764 },
4765 "file": "src/i18n/globalMessages.js",
4766 "id": "global.franzProRequired",
4767 "start": {
4768 "column": 15,
4769 "line": 28
4770 }
4001 } 4771 }
4002 ], 4772 ],
4003 "path": "src/i18n/globalMessages.json" 4773 "path": "src/i18n/globalMessages.json"
@@ -4008,741 +4778,793 @@
4008 "defaultMessage": "!!!Edit", 4778 "defaultMessage": "!!!Edit",
4009 "end": { 4779 "end": {
4010 "column": 3, 4780 "column": 3,
4011 "line": 17 4781 "line": 21
4012 }, 4782 },
4013 "file": "src/lib/Menu.js", 4783 "file": "src/lib/Menu.js",
4014 "id": "menu.edit", 4784 "id": "menu.edit",
4015 "start": { 4785 "start": {
4016 "column": 8, 4786 "column": 8,
4017 "line": 14 4787 "line": 18
4018 } 4788 }
4019 }, 4789 },
4020 { 4790 {
4021 "defaultMessage": "!!!Undo", 4791 "defaultMessage": "!!!Undo",
4022 "end": { 4792 "end": {
4023 "column": 3, 4793 "column": 3,
4024 "line": 21 4794 "line": 25
4025 }, 4795 },
4026 "file": "src/lib/Menu.js", 4796 "file": "src/lib/Menu.js",
4027 "id": "menu.edit.undo", 4797 "id": "menu.edit.undo",
4028 "start": { 4798 "start": {
4029 "column": 8, 4799 "column": 8,
4030 "line": 18 4800 "line": 22
4031 } 4801 }
4032 }, 4802 },
4033 { 4803 {
4034 "defaultMessage": "!!!Redo", 4804 "defaultMessage": "!!!Redo",
4035 "end": { 4805 "end": {
4036 "column": 3, 4806 "column": 3,
4037 "line": 25 4807 "line": 29
4038 }, 4808 },
4039 "file": "src/lib/Menu.js", 4809 "file": "src/lib/Menu.js",
4040 "id": "menu.edit.redo", 4810 "id": "menu.edit.redo",
4041 "start": { 4811 "start": {
4042 "column": 8, 4812 "column": 8,
4043 "line": 22 4813 "line": 26
4044 } 4814 }
4045 }, 4815 },
4046 { 4816 {
4047 "defaultMessage": "!!!Cut", 4817 "defaultMessage": "!!!Cut",
4048 "end": { 4818 "end": {
4049 "column": 3, 4819 "column": 3,
4050 "line": 29 4820 "line": 33
4051 }, 4821 },
4052 "file": "src/lib/Menu.js", 4822 "file": "src/lib/Menu.js",
4053 "id": "menu.edit.cut", 4823 "id": "menu.edit.cut",
4054 "start": { 4824 "start": {
4055 "column": 7, 4825 "column": 7,
4056 "line": 26 4826 "line": 30
4057 } 4827 }
4058 }, 4828 },
4059 { 4829 {
4060 "defaultMessage": "!!!Copy", 4830 "defaultMessage": "!!!Copy",
4061 "end": { 4831 "end": {
4062 "column": 3, 4832 "column": 3,
4063 "line": 33 4833 "line": 37
4064 }, 4834 },
4065 "file": "src/lib/Menu.js", 4835 "file": "src/lib/Menu.js",
4066 "id": "menu.edit.copy", 4836 "id": "menu.edit.copy",
4067 "start": { 4837 "start": {
4068 "column": 8, 4838 "column": 8,
4069 "line": 30 4839 "line": 34
4070 } 4840 }
4071 }, 4841 },
4072 { 4842 {
4073 "defaultMessage": "!!!Paste", 4843 "defaultMessage": "!!!Paste",
4074 "end": { 4844 "end": {
4075 "column": 3, 4845 "column": 3,
4076 "line": 37 4846 "line": 41
4077 }, 4847 },
4078 "file": "src/lib/Menu.js", 4848 "file": "src/lib/Menu.js",
4079 "id": "menu.edit.paste", 4849 "id": "menu.edit.paste",
4080 "start": { 4850 "start": {
4081 "column": 9, 4851 "column": 9,
4082 "line": 34 4852 "line": 38
4083 } 4853 }
4084 }, 4854 },
4085 { 4855 {
4086 "defaultMessage": "!!!Paste And Match Style", 4856 "defaultMessage": "!!!Paste And Match Style",
4087 "end": { 4857 "end": {
4088 "column": 3, 4858 "column": 3,
4089 "line": 41 4859 "line": 45
4090 }, 4860 },
4091 "file": "src/lib/Menu.js", 4861 "file": "src/lib/Menu.js",
4092 "id": "menu.edit.pasteAndMatchStyle", 4862 "id": "menu.edit.pasteAndMatchStyle",
4093 "start": { 4863 "start": {
4094 "column": 22, 4864 "column": 22,
4095 "line": 38 4865 "line": 42
4096 } 4866 }
4097 }, 4867 },
4098 { 4868 {
4099 "defaultMessage": "!!!Delete", 4869 "defaultMessage": "!!!Delete",
4100 "end": { 4870 "end": {
4101 "column": 3, 4871 "column": 3,
4102 "line": 45 4872 "line": 49
4103 }, 4873 },
4104 "file": "src/lib/Menu.js", 4874 "file": "src/lib/Menu.js",
4105 "id": "menu.edit.delete", 4875 "id": "menu.edit.delete",
4106 "start": { 4876 "start": {
4107 "column": 10, 4877 "column": 10,
4108 "line": 42 4878 "line": 46
4109 } 4879 }
4110 }, 4880 },
4111 { 4881 {
4112 "defaultMessage": "!!!Select All", 4882 "defaultMessage": "!!!Select All",
4113 "end": { 4883 "end": {
4114 "column": 3, 4884 "column": 3,
4115 "line": 49 4885 "line": 53
4116 }, 4886 },
4117 "file": "src/lib/Menu.js", 4887 "file": "src/lib/Menu.js",
4118 "id": "menu.edit.selectAll", 4888 "id": "menu.edit.selectAll",
4119 "start": { 4889 "start": {
4120 "column": 13, 4890 "column": 13,
4121 "line": 46 4891 "line": 50
4122 } 4892 }
4123 }, 4893 },
4124 { 4894 {
4125 "defaultMessage": "!!!Speech", 4895 "defaultMessage": "!!!Speech",
4126 "end": { 4896 "end": {
4127 "column": 3, 4897 "column": 3,
4128 "line": 53 4898 "line": 57
4129 }, 4899 },
4130 "file": "src/lib/Menu.js", 4900 "file": "src/lib/Menu.js",
4131 "id": "menu.edit.speech", 4901 "id": "menu.edit.speech",
4132 "start": { 4902 "start": {
4133 "column": 10, 4903 "column": 10,
4134 "line": 50 4904 "line": 54
4135 } 4905 }
4136 }, 4906 },
4137 { 4907 {
4138 "defaultMessage": "!!!Start Speaking", 4908 "defaultMessage": "!!!Start Speaking",
4139 "end": { 4909 "end": {
4140 "column": 3, 4910 "column": 3,
4141 "line": 57 4911 "line": 61
4142 }, 4912 },
4143 "file": "src/lib/Menu.js", 4913 "file": "src/lib/Menu.js",
4144 "id": "menu.edit.startSpeaking", 4914 "id": "menu.edit.startSpeaking",
4145 "start": { 4915 "start": {
4146 "column": 17, 4916 "column": 17,
4147 "line": 54 4917 "line": 58
4148 } 4918 }
4149 }, 4919 },
4150 { 4920 {
4151 "defaultMessage": "!!!Stop Speaking", 4921 "defaultMessage": "!!!Stop Speaking",
4152 "end": { 4922 "end": {
4153 "column": 3, 4923 "column": 3,
4154 "line": 61 4924 "line": 65
4155 }, 4925 },
4156 "file": "src/lib/Menu.js", 4926 "file": "src/lib/Menu.js",
4157 "id": "menu.edit.stopSpeaking", 4927 "id": "menu.edit.stopSpeaking",
4158 "start": { 4928 "start": {
4159 "column": 16, 4929 "column": 16,
4160 "line": 58 4930 "line": 62
4161 } 4931 }
4162 }, 4932 },
4163 { 4933 {
4164 "defaultMessage": "!!!Start Dictation", 4934 "defaultMessage": "!!!Start Dictation",
4165 "end": { 4935 "end": {
4166 "column": 3, 4936 "column": 3,
4167 "line": 65 4937 "line": 69
4168 }, 4938 },
4169 "file": "src/lib/Menu.js", 4939 "file": "src/lib/Menu.js",
4170 "id": "menu.edit.startDictation", 4940 "id": "menu.edit.startDictation",
4171 "start": { 4941 "start": {
4172 "column": 18, 4942 "column": 18,
4173 "line": 62 4943 "line": 66
4174 } 4944 }
4175 }, 4945 },
4176 { 4946 {
4177 "defaultMessage": "!!!Emoji & Symbols", 4947 "defaultMessage": "!!!Emoji & Symbols",
4178 "end": { 4948 "end": {
4179 "column": 3, 4949 "column": 3,
4180 "line": 69 4950 "line": 73
4181 }, 4951 },
4182 "file": "src/lib/Menu.js", 4952 "file": "src/lib/Menu.js",
4183 "id": "menu.edit.emojiSymbols", 4953 "id": "menu.edit.emojiSymbols",
4184 "start": { 4954 "start": {
4185 "column": 16, 4955 "column": 16,
4186 "line": 66 4956 "line": 70
4187 } 4957 }
4188 }, 4958 },
4189 { 4959 {
4190 "defaultMessage": "!!!Actual Size", 4960 "defaultMessage": "!!!Actual Size",
4191 "end": { 4961 "end": {
4192 "column": 3, 4962 "column": 3,
4193 "line": 73 4963 "line": 77
4194 }, 4964 },
4195 "file": "src/lib/Menu.js", 4965 "file": "src/lib/Menu.js",
4196 "id": "menu.view.resetZoom", 4966 "id": "menu.view.resetZoom",
4197 "start": { 4967 "start": {
4198 "column": 13, 4968 "column": 13,
4199 "line": 70 4969 "line": 74
4200 } 4970 }
4201 }, 4971 },
4202 { 4972 {
4203 "defaultMessage": "!!!Zoom In", 4973 "defaultMessage": "!!!Zoom In",
4204 "end": { 4974 "end": {
4205 "column": 3, 4975 "column": 3,
4206 "line": 77 4976 "line": 81
4207 }, 4977 },
4208 "file": "src/lib/Menu.js", 4978 "file": "src/lib/Menu.js",
4209 "id": "menu.view.zoomIn", 4979 "id": "menu.view.zoomIn",
4210 "start": { 4980 "start": {
4211 "column": 10, 4981 "column": 10,
4212 "line": 74 4982 "line": 78
4213 } 4983 }
4214 }, 4984 },
4215 { 4985 {
4216 "defaultMessage": "!!!Zoom Out", 4986 "defaultMessage": "!!!Zoom Out",
4217 "end": { 4987 "end": {
4218 "column": 3, 4988 "column": 3,
4219 "line": 81 4989 "line": 85
4220 }, 4990 },
4221 "file": "src/lib/Menu.js", 4991 "file": "src/lib/Menu.js",
4222 "id": "menu.view.zoomOut", 4992 "id": "menu.view.zoomOut",
4223 "start": { 4993 "start": {
4224 "column": 11, 4994 "column": 11,
4225 "line": 78 4995 "line": 82
4226 } 4996 }
4227 }, 4997 },
4228 { 4998 {
4229 "defaultMessage": "!!!Enter Full Screen", 4999 "defaultMessage": "!!!Enter Full Screen",
4230 "end": { 5000 "end": {
4231 "column": 3, 5001 "column": 3,
4232 "line": 85 5002 "line": 89
4233 }, 5003 },
4234 "file": "src/lib/Menu.js", 5004 "file": "src/lib/Menu.js",
4235 "id": "menu.view.enterFullScreen", 5005 "id": "menu.view.enterFullScreen",
4236 "start": { 5006 "start": {
4237 "column": 19, 5007 "column": 19,
4238 "line": 82 5008 "line": 86
4239 } 5009 }
4240 }, 5010 },
4241 { 5011 {
4242 "defaultMessage": "!!!Exit Full Screen", 5012 "defaultMessage": "!!!Exit Full Screen",
4243 "end": { 5013 "end": {
4244 "column": 3, 5014 "column": 3,
4245 "line": 89 5015 "line": 93
4246 }, 5016 },
4247 "file": "src/lib/Menu.js", 5017 "file": "src/lib/Menu.js",
4248 "id": "menu.view.exitFullScreen", 5018 "id": "menu.view.exitFullScreen",
4249 "start": { 5019 "start": {
4250 "column": 18, 5020 "column": 18,
4251 "line": 86 5021 "line": 90
4252 } 5022 }
4253 }, 5023 },
4254 { 5024 {
4255 "defaultMessage": "!!!Toggle Full Screen", 5025 "defaultMessage": "!!!Toggle Full Screen",
4256 "end": { 5026 "end": {
4257 "column": 3, 5027 "column": 3,
4258 "line": 93 5028 "line": 97
4259 }, 5029 },
4260 "file": "src/lib/Menu.js", 5030 "file": "src/lib/Menu.js",
4261 "id": "menu.view.toggleFullScreen", 5031 "id": "menu.view.toggleFullScreen",
4262 "start": { 5032 "start": {
4263 "column": 20, 5033 "column": 20,
4264 "line": 90 5034 "line": 94
4265 } 5035 }
4266 }, 5036 },
4267 { 5037 {
4268 "defaultMessage": "!!!Toggle Developer Tools", 5038 "defaultMessage": "!!!Toggle Developer Tools",
4269 "end": { 5039 "end": {
4270 "column": 3, 5040 "column": 3,
4271 "line": 97 5041 "line": 101
4272 }, 5042 },
4273 "file": "src/lib/Menu.js", 5043 "file": "src/lib/Menu.js",
4274 "id": "menu.view.toggleDevTools", 5044 "id": "menu.view.toggleDevTools",
4275 "start": { 5045 "start": {
4276 "column": 18, 5046 "column": 18,
4277 "line": 94 5047 "line": 98
5048 }
5049 },
5050 {
5051 "defaultMessage": "!!!Toggle Todos Developer Tools",
5052 "end": {
5053 "column": 3,
5054 "line": 105
5055 },
5056 "file": "src/lib/Menu.js",
5057 "id": "menu.view.toggleTodosDevTools",
5058 "start": {
5059 "column": 23,
5060 "line": 102
4278 } 5061 }
4279 }, 5062 },
4280 { 5063 {
4281 "defaultMessage": "!!!Toggle Service Developer Tools", 5064 "defaultMessage": "!!!Toggle Service Developer Tools",
4282 "end": { 5065 "end": {
4283 "column": 3, 5066 "column": 3,
4284 "line": 101 5067 "line": 109
4285 }, 5068 },
4286 "file": "src/lib/Menu.js", 5069 "file": "src/lib/Menu.js",
4287 "id": "menu.view.toggleServiceDevTools", 5070 "id": "menu.view.toggleServiceDevTools",
4288 "start": { 5071 "start": {
4289 "column": 25, 5072 "column": 25,
4290 "line": 98 5073 "line": 106
4291 } 5074 }
4292 }, 5075 },
4293 { 5076 {
4294 "defaultMessage": "!!!Reload Service", 5077 "defaultMessage": "!!!Reload Service",
4295 "end": { 5078 "end": {
4296 "column": 3, 5079 "column": 3,
4297 "line": 105 5080 "line": 113
4298 }, 5081 },
4299 "file": "src/lib/Menu.js", 5082 "file": "src/lib/Menu.js",
4300 "id": "menu.view.reloadService", 5083 "id": "menu.view.reloadService",
4301 "start": { 5084 "start": {
4302 "column": 17, 5085 "column": 17,
4303 "line": 102 5086 "line": 110
4304 } 5087 }
4305 }, 5088 },
4306 { 5089 {
4307 "defaultMessage": "!!!Reload Franz", 5090 "defaultMessage": "!!!Reload Franz",
4308 "end": { 5091 "end": {
4309 "column": 3, 5092 "column": 3,
4310 "line": 109 5093 "line": 117
4311 }, 5094 },
4312 "file": "src/lib/Menu.js", 5095 "file": "src/lib/Menu.js",
4313 "id": "menu.view.reloadFranz", 5096 "id": "menu.view.reloadFranz",
4314 "start": { 5097 "start": {
4315 "column": 15, 5098 "column": 15,
4316 "line": 106 5099 "line": 114
4317 } 5100 }
4318 }, 5101 },
4319 { 5102 {
4320 "defaultMessage": "!!!Minimize", 5103 "defaultMessage": "!!!Minimize",
4321 "end": { 5104 "end": {
4322 "column": 3, 5105 "column": 3,
4323 "line": 113 5106 "line": 121
4324 }, 5107 },
4325 "file": "src/lib/Menu.js", 5108 "file": "src/lib/Menu.js",
4326 "id": "menu.window.minimize", 5109 "id": "menu.window.minimize",
4327 "start": { 5110 "start": {
4328 "column": 12, 5111 "column": 12,
4329 "line": 110 5112 "line": 118
4330 } 5113 }
4331 }, 5114 },
4332 { 5115 {
4333 "defaultMessage": "!!!Close", 5116 "defaultMessage": "!!!Close",
4334 "end": { 5117 "end": {
4335 "column": 3, 5118 "column": 3,
4336 "line": 117 5119 "line": 125
4337 }, 5120 },
4338 "file": "src/lib/Menu.js", 5121 "file": "src/lib/Menu.js",
4339 "id": "menu.window.close", 5122 "id": "menu.window.close",
4340 "start": { 5123 "start": {
4341 "column": 9, 5124 "column": 9,
4342 "line": 114 5125 "line": 122
4343 } 5126 }
4344 }, 5127 },
4345 { 5128 {
4346 "defaultMessage": "!!!Learn More", 5129 "defaultMessage": "!!!Learn More",
4347 "end": { 5130 "end": {
4348 "column": 3, 5131 "column": 3,
4349 "line": 121 5132 "line": 129
4350 }, 5133 },
4351 "file": "src/lib/Menu.js", 5134 "file": "src/lib/Menu.js",
4352 "id": "menu.help.learnMore", 5135 "id": "menu.help.learnMore",
4353 "start": { 5136 "start": {
4354 "column": 13, 5137 "column": 13,
4355 "line": 118 5138 "line": 126
4356 } 5139 }
4357 }, 5140 },
4358 { 5141 {
4359 "defaultMessage": "!!!Changelog", 5142 "defaultMessage": "!!!Changelog",
4360 "end": { 5143 "end": {
4361 "column": 3, 5144 "column": 3,
4362 "line": 125 5145 "line": 133
4363 }, 5146 },
4364 "file": "src/lib/Menu.js", 5147 "file": "src/lib/Menu.js",
4365 "id": "menu.help.changelog", 5148 "id": "menu.help.changelog",
4366 "start": { 5149 "start": {
4367 "column": 13, 5150 "column": 13,
4368 "line": 122 5151 "line": 130
4369 } 5152 }
4370 }, 5153 },
4371 { 5154 {
4372 "defaultMessage": "!!!Support", 5155 "defaultMessage": "!!!Support",
4373 "end": { 5156 "end": {
4374 "column": 3, 5157 "column": 3,
4375 "line": 129 5158 "line": 137
4376 }, 5159 },
4377 "file": "src/lib/Menu.js", 5160 "file": "src/lib/Menu.js",
4378 "id": "menu.help.support", 5161 "id": "menu.help.support",
4379 "start": { 5162 "start": {
4380 "column": 11, 5163 "column": 11,
4381 "line": 126 5164 "line": 134
4382 } 5165 }
4383 }, 5166 },
4384 { 5167 {
4385 "defaultMessage": "!!!Copy Debug Information", 5168 "defaultMessage": "!!!Copy Debug Information",
4386 "end": { 5169 "end": {
4387 "column": 3, 5170 "column": 3,
4388 "line": 133 5171 "line": 141
4389 }, 5172 },
4390 "file": "src/lib/Menu.js", 5173 "file": "src/lib/Menu.js",
4391 "id": "menu.help.debugInfo", 5174 "id": "menu.help.debugInfo",
4392 "start": { 5175 "start": {
4393 "column": 13, 5176 "column": 13,
4394 "line": 130 5177 "line": 138
4395 } 5178 }
4396 }, 5179 },
4397 { 5180 {
4398 "defaultMessage": "!!!Ferdi Debug Information", 5181 "defaultMessage": "!!!Ferdi Debug Information",
4399 "end": { 5182 "end": {
4400 "column": 3, 5183 "column": 3,
4401 "line": 137 5184 "line": 145
4402 }, 5185 },
4403 "file": "src/lib/Menu.js", 5186 "file": "src/lib/Menu.js",
4404 "id": "menu.help.debugInfoCopiedHeadline", 5187 "id": "menu.help.debugInfoCopiedHeadline",
4405 "start": { 5188 "start": {
4406 "column": 27, 5189 "column": 27,
4407 "line": 134 5190 "line": 142
4408 } 5191 }
4409 }, 5192 },
4410 { 5193 {
4411 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 5194 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
4412 "end": { 5195 "end": {
4413 "column": 3, 5196 "column": 3,
4414 "line": 141 5197 "line": 149
4415 }, 5198 },
4416 "file": "src/lib/Menu.js", 5199 "file": "src/lib/Menu.js",
4417 "id": "menu.help.debugInfoCopiedBody", 5200 "id": "menu.help.debugInfoCopiedBody",
4418 "start": { 5201 "start": {
4419 "column": 23, 5202 "column": 23,
4420 "line": 138 5203 "line": 146
4421 } 5204 }
4422 }, 5205 },
4423 { 5206 {
4424 "defaultMessage": "!!!Terms of Service", 5207 "defaultMessage": "!!!Terms of Service",
4425 "end": { 5208 "end": {
4426 "column": 3, 5209 "column": 3,
4427 "line": 145 5210 "line": 153
4428 }, 5211 },
4429 "file": "src/lib/Menu.js", 5212 "file": "src/lib/Menu.js",
4430 "id": "menu.help.tos", 5213 "id": "menu.help.tos",
4431 "start": { 5214 "start": {
4432 "column": 7, 5215 "column": 7,
4433 "line": 142 5216 "line": 150
4434 } 5217 }
4435 }, 5218 },
4436 { 5219 {
4437 "defaultMessage": "!!!Privacy Statement", 5220 "defaultMessage": "!!!Privacy Statement",
4438 "end": { 5221 "end": {
4439 "column": 3, 5222 "column": 3,
4440 "line": 149 5223 "line": 157
4441 }, 5224 },
4442 "file": "src/lib/Menu.js", 5225 "file": "src/lib/Menu.js",
4443 "id": "menu.help.privacy", 5226 "id": "menu.help.privacy",
4444 "start": { 5227 "start": {
4445 "column": 11, 5228 "column": 11,
4446 "line": 146 5229 "line": 154
4447 } 5230 }
4448 }, 5231 },
4449 { 5232 {
4450 "defaultMessage": "!!!File", 5233 "defaultMessage": "!!!File",
4451 "end": { 5234 "end": {
4452 "column": 3, 5235 "column": 3,
4453 "line": 153 5236 "line": 161
4454 }, 5237 },
4455 "file": "src/lib/Menu.js", 5238 "file": "src/lib/Menu.js",
4456 "id": "menu.file", 5239 "id": "menu.file",
4457 "start": { 5240 "start": {
4458 "column": 8, 5241 "column": 8,
4459 "line": 150 5242 "line": 158
4460 } 5243 }
4461 }, 5244 },
4462 { 5245 {
4463 "defaultMessage": "!!!View", 5246 "defaultMessage": "!!!View",
4464 "end": { 5247 "end": {
4465 "column": 3, 5248 "column": 3,
4466 "line": 157 5249 "line": 165
4467 }, 5250 },
4468 "file": "src/lib/Menu.js", 5251 "file": "src/lib/Menu.js",
4469 "id": "menu.view", 5252 "id": "menu.view",
4470 "start": { 5253 "start": {
4471 "column": 8, 5254 "column": 8,
4472 "line": 154 5255 "line": 162
4473 } 5256 }
4474 }, 5257 },
4475 { 5258 {
4476 "defaultMessage": "!!!Services", 5259 "defaultMessage": "!!!Services",
4477 "end": { 5260 "end": {
4478 "column": 3, 5261 "column": 3,
4479 "line": 161 5262 "line": 169
4480 }, 5263 },
4481 "file": "src/lib/Menu.js", 5264 "file": "src/lib/Menu.js",
4482 "id": "menu.services", 5265 "id": "menu.services",
4483 "start": { 5266 "start": {
4484 "column": 12, 5267 "column": 12,
4485 "line": 158 5268 "line": 166
4486 } 5269 }
4487 }, 5270 },
4488 { 5271 {
4489 "defaultMessage": "!!!Window", 5272 "defaultMessage": "!!!Window",
4490 "end": { 5273 "end": {
4491 "column": 3, 5274 "column": 3,
4492 "line": 165 5275 "line": 173
4493 }, 5276 },
4494 "file": "src/lib/Menu.js", 5277 "file": "src/lib/Menu.js",
4495 "id": "menu.window", 5278 "id": "menu.window",
4496 "start": { 5279 "start": {
4497 "column": 10, 5280 "column": 10,
4498 "line": 162 5281 "line": 170
4499 } 5282 }
4500 }, 5283 },
4501 { 5284 {
4502 "defaultMessage": "!!!Help", 5285 "defaultMessage": "!!!Help",
4503 "end": { 5286 "end": {
4504 "column": 3, 5287 "column": 3,
4505 "line": 169 5288 "line": 177
4506 }, 5289 },
4507 "file": "src/lib/Menu.js", 5290 "file": "src/lib/Menu.js",
4508 "id": "menu.help", 5291 "id": "menu.help",
4509 "start": { 5292 "start": {
4510 "column": 8, 5293 "column": 8,
4511 "line": 166 5294 "line": 174
4512 } 5295 }
4513 }, 5296 },
4514 { 5297 {
4515 "defaultMessage": "!!!About Franz", 5298 "defaultMessage": "!!!About Franz",
4516 "end": { 5299 "end": {
4517 "column": 3, 5300 "column": 3,
4518 "line": 173 5301 "line": 181
4519 }, 5302 },
4520 "file": "src/lib/Menu.js", 5303 "file": "src/lib/Menu.js",
4521 "id": "menu.app.about", 5304 "id": "menu.app.about",
4522 "start": { 5305 "start": {
4523 "column": 9, 5306 "column": 9,
4524 "line": 170 5307 "line": 178
4525 } 5308 }
4526 }, 5309 },
4527 { 5310 {
4528 "defaultMessage": "!!!What's new?", 5311 "defaultMessage": "!!!What's new?",
4529 "end": { 5312 "end": {
4530 "column": 3, 5313 "column": 3,
4531 "line": 177 5314 "line": 185
4532 }, 5315 },
4533 "file": "src/lib/Menu.js", 5316 "file": "src/lib/Menu.js",
4534 "id": "menu.app.announcement", 5317 "id": "menu.app.announcement",
4535 "start": { 5318 "start": {
4536 "column": 16, 5319 "column": 16,
4537 "line": 174 5320 "line": 182
4538 } 5321 }
4539 }, 5322 },
4540 { 5323 {
4541 "defaultMessage": "!!!Settings", 5324 "defaultMessage": "!!!Settings",
4542 "end": { 5325 "end": {
4543 "column": 3, 5326 "column": 3,
4544 "line": 181 5327 "line": 189
4545 }, 5328 },
4546 "file": "src/lib/Menu.js", 5329 "file": "src/lib/Menu.js",
4547 "id": "menu.app.settings", 5330 "id": "menu.app.settings",
4548 "start": { 5331 "start": {
4549 "column": 12, 5332 "column": 12,
4550 "line": 178 5333 "line": 186
4551 } 5334 }
4552 }, 5335 },
4553 { 5336 {
4554 "defaultMessage": "!!!Check for updates", 5337 "defaultMessage": "!!!Check for updates",
4555 "end": { 5338 "end": {
4556 "column": 3, 5339 "column": 3,
4557 "line": 185 5340 "line": 193
4558 }, 5341 },
4559 "file": "src/lib/Menu.js", 5342 "file": "src/lib/Menu.js",
4560 "id": "menu.app.checkForUpdates", 5343 "id": "menu.app.checkForUpdates",
4561 "start": { 5344 "start": {
4562 "column": 19, 5345 "column": 19,
4563 "line": 182 5346 "line": 190
4564 } 5347 }
4565 }, 5348 },
4566 { 5349 {
4567 "defaultMessage": "!!!Hide", 5350 "defaultMessage": "!!!Hide",
4568 "end": { 5351 "end": {
4569 "column": 3, 5352 "column": 3,
4570 "line": 189 5353 "line": 197
4571 }, 5354 },
4572 "file": "src/lib/Menu.js", 5355 "file": "src/lib/Menu.js",
4573 "id": "menu.app.hide", 5356 "id": "menu.app.hide",
4574 "start": { 5357 "start": {
4575 "column": 8, 5358 "column": 8,
4576 "line": 186 5359 "line": 194
4577 } 5360 }
4578 }, 5361 },
4579 { 5362 {
4580 "defaultMessage": "!!!Hide Others", 5363 "defaultMessage": "!!!Hide Others",
4581 "end": { 5364 "end": {
4582 "column": 3, 5365 "column": 3,
4583 "line": 193 5366 "line": 201
4584 }, 5367 },
4585 "file": "src/lib/Menu.js", 5368 "file": "src/lib/Menu.js",
4586 "id": "menu.app.hideOthers", 5369 "id": "menu.app.hideOthers",
4587 "start": { 5370 "start": {
4588 "column": 14, 5371 "column": 14,
4589 "line": 190 5372 "line": 198
4590 } 5373 }
4591 }, 5374 },
4592 { 5375 {
4593 "defaultMessage": "!!!Unhide", 5376 "defaultMessage": "!!!Unhide",
4594 "end": { 5377 "end": {
4595 "column": 3, 5378 "column": 3,
4596 "line": 197 5379 "line": 205
4597 }, 5380 },
4598 "file": "src/lib/Menu.js", 5381 "file": "src/lib/Menu.js",
4599 "id": "menu.app.unhide", 5382 "id": "menu.app.unhide",
4600 "start": { 5383 "start": {
4601 "column": 10, 5384 "column": 10,
4602 "line": 194 5385 "line": 202
4603 } 5386 }
4604 }, 5387 },
4605 { 5388 {
4606 "defaultMessage": "!!!Quit", 5389 "defaultMessage": "!!!Quit",
4607 "end": { 5390 "end": {
4608 "column": 3, 5391 "column": 3,
4609 "line": 201 5392 "line": 209
4610 }, 5393 },
4611 "file": "src/lib/Menu.js", 5394 "file": "src/lib/Menu.js",
4612 "id": "menu.app.quit", 5395 "id": "menu.app.quit",
4613 "start": { 5396 "start": {
4614 "column": 8, 5397 "column": 8,
4615 "line": 198 5398 "line": 206
4616 } 5399 }
4617 }, 5400 },
4618 { 5401 {
4619 "defaultMessage": "!!!Add New Service...", 5402 "defaultMessage": "!!!Add New Service...",
4620 "end": { 5403 "end": {
4621 "column": 3, 5404 "column": 3,
4622 "line": 205 5405 "line": 213
4623 }, 5406 },
4624 "file": "src/lib/Menu.js", 5407 "file": "src/lib/Menu.js",
4625 "id": "menu.services.addNewService", 5408 "id": "menu.services.addNewService",
4626 "start": { 5409 "start": {
4627 "column": 17, 5410 "column": 17,
4628 "line": 202 5411 "line": 210
4629 } 5412 }
4630 }, 5413 },
4631 { 5414 {
4632 "defaultMessage": "!!!Add New Workspace...", 5415 "defaultMessage": "!!!Add New Workspace...",
4633 "end": { 5416 "end": {
4634 "column": 3, 5417 "column": 3,
4635 "line": 209 5418 "line": 217
4636 }, 5419 },
4637 "file": "src/lib/Menu.js", 5420 "file": "src/lib/Menu.js",
4638 "id": "menu.workspaces.addNewWorkspace", 5421 "id": "menu.workspaces.addNewWorkspace",
4639 "start": { 5422 "start": {
4640 "column": 19, 5423 "column": 19,
4641 "line": 206 5424 "line": 214
4642 } 5425 }
4643 }, 5426 },
4644 { 5427 {
4645 "defaultMessage": "!!!Open workspace drawer", 5428 "defaultMessage": "!!!Open workspace drawer",
4646 "end": { 5429 "end": {
4647 "column": 3, 5430 "column": 3,
4648 "line": 213 5431 "line": 221
4649 }, 5432 },
4650 "file": "src/lib/Menu.js", 5433 "file": "src/lib/Menu.js",
4651 "id": "menu.workspaces.openWorkspaceDrawer", 5434 "id": "menu.workspaces.openWorkspaceDrawer",
4652 "start": { 5435 "start": {
4653 "column": 23, 5436 "column": 23,
4654 "line": 210 5437 "line": 218
4655 } 5438 }
4656 }, 5439 },
4657 { 5440 {
4658 "defaultMessage": "!!!Close workspace drawer", 5441 "defaultMessage": "!!!Close workspace drawer",
4659 "end": { 5442 "end": {
4660 "column": 3, 5443 "column": 3,
4661 "line": 217 5444 "line": 225
4662 }, 5445 },
4663 "file": "src/lib/Menu.js", 5446 "file": "src/lib/Menu.js",
4664 "id": "menu.workspaces.closeWorkspaceDrawer", 5447 "id": "menu.workspaces.closeWorkspaceDrawer",
4665 "start": { 5448 "start": {
4666 "column": 24, 5449 "column": 24,
4667 "line": 214 5450 "line": 222
4668 } 5451 }
4669 }, 5452 },
4670 { 5453 {
4671 "defaultMessage": "!!!Activate next service...", 5454 "defaultMessage": "!!!Activate next service...",
4672 "end": { 5455 "end": {
4673 "column": 3, 5456 "column": 3,
4674 "line": 221 5457 "line": 229
4675 }, 5458 },
4676 "file": "src/lib/Menu.js", 5459 "file": "src/lib/Menu.js",
4677 "id": "menu.services.setNextServiceActive", 5460 "id": "menu.services.setNextServiceActive",
4678 "start": { 5461 "start": {
4679 "column": 23, 5462 "column": 23,
4680 "line": 218 5463 "line": 226
4681 } 5464 }
4682 }, 5465 },
4683 { 5466 {
4684 "defaultMessage": "!!!Activate previous service...", 5467 "defaultMessage": "!!!Activate previous service...",
4685 "end": { 5468 "end": {
4686 "column": 3, 5469 "column": 3,
4687 "line": 225 5470 "line": 233
4688 }, 5471 },
4689 "file": "src/lib/Menu.js", 5472 "file": "src/lib/Menu.js",
4690 "id": "menu.services.activatePreviousService", 5473 "id": "menu.services.activatePreviousService",
4691 "start": { 5474 "start": {
4692 "column": 27, 5475 "column": 27,
4693 "line": 222 5476 "line": 230
4694 } 5477 }
4695 }, 5478 },
4696 { 5479 {
4697 "defaultMessage": "!!!Disable notifications & audio", 5480 "defaultMessage": "!!!Disable notifications & audio",
4698 "end": { 5481 "end": {
4699 "column": 3, 5482 "column": 3,
4700 "line": 229 5483 "line": 237
4701 }, 5484 },
4702 "file": "src/lib/Menu.js", 5485 "file": "src/lib/Menu.js",
4703 "id": "sidebar.muteApp", 5486 "id": "sidebar.muteApp",
4704 "start": { 5487 "start": {
4705 "column": 11, 5488 "column": 11,
4706 "line": 226 5489 "line": 234
4707 } 5490 }
4708 }, 5491 },
4709 { 5492 {
4710 "defaultMessage": "!!!Enable notifications & audio", 5493 "defaultMessage": "!!!Enable notifications & audio",
4711 "end": { 5494 "end": {
4712 "column": 3, 5495 "column": 3,
4713 "line": 233 5496 "line": 241
4714 }, 5497 },
4715 "file": "src/lib/Menu.js", 5498 "file": "src/lib/Menu.js",
4716 "id": "sidebar.unmuteApp", 5499 "id": "sidebar.unmuteApp",
4717 "start": { 5500 "start": {
4718 "column": 13, 5501 "column": 13,
4719 "line": 230 5502 "line": 238
4720 } 5503 }
4721 }, 5504 },
4722 { 5505 {
4723 "defaultMessage": "!!!Workspaces", 5506 "defaultMessage": "!!!Workspaces",
4724 "end": { 5507 "end": {
4725 "column": 3, 5508 "column": 3,
4726 "line": 237 5509 "line": 245
4727 }, 5510 },
4728 "file": "src/lib/Menu.js", 5511 "file": "src/lib/Menu.js",
4729 "id": "menu.workspaces", 5512 "id": "menu.workspaces",
4730 "start": { 5513 "start": {
4731 "column": 14, 5514 "column": 14,
4732 "line": 234 5515 "line": 242
4733 } 5516 }
4734 }, 5517 },
4735 { 5518 {
4736 "defaultMessage": "!!!Default", 5519 "defaultMessage": "!!!Default",
4737 "end": { 5520 "end": {
4738 "column": 3, 5521 "column": 3,
4739 "line": 241 5522 "line": 249
4740 }, 5523 },
4741 "file": "src/lib/Menu.js", 5524 "file": "src/lib/Menu.js",
4742 "id": "menu.workspaces.defaultWorkspace", 5525 "id": "menu.workspaces.defaultWorkspace",
4743 "start": { 5526 "start": {
4744 "column": 20, 5527 "column": 20,
4745 "line": 238 5528 "line": 246
5529 }
5530 },
5531 {
5532 "defaultMessage": "!!!Todos",
5533 "end": {
5534 "column": 3,
5535 "line": 253
5536 },
5537 "file": "src/lib/Menu.js",
5538 "id": "menu.todos",
5539 "start": {
5540 "column": 9,
5541 "line": 250
5542 }
5543 },
5544 {
5545 "defaultMessage": "!!!Open Todos drawer",
5546 "end": {
5547 "column": 3,
5548 "line": 257
5549 },
5550 "file": "src/lib/Menu.js",
5551 "id": "menu.Todoss.openTodosDrawer",
5552 "start": {
5553 "column": 19,
5554 "line": 254
5555 }
5556 },
5557 {
5558 "defaultMessage": "!!!Close Todos drawer",
5559 "end": {
5560 "column": 3,
5561 "line": 261
5562 },
5563 "file": "src/lib/Menu.js",
5564 "id": "menu.Todoss.closeTodosDrawer",
5565 "start": {
5566 "column": 20,
5567 "line": 258
4746 } 5568 }
4747 } 5569 }
4748 ], 5570 ],
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index d02f78dbd..40f8eac2f 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "ΕπαναφόÏτωση", 2 "app.errorHandler.action" : "ΕπαναφόÏτωση",
3 "app.errorHandler.headline" : "Κάτι δεν λειτουÏγεί", 3 "app.errorHandler.headline" : "Κάτι δεν λειτουÏγεί",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Get a Ferdi Supporter License", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.headline" : "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text" : "Franz θα συνεχίσει σε {seconds} δευτεÏόλεπτα.",
7 "feature.delayApp.text" : "Ferdi θα συνεχίσει σε {seconds} δευτεÏόλεπτα.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Get a Franz Supporter License",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Send as email", 13 "feature.shareFranz.action.email" : "Send as email",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 14 "feature.shareFranz.action.facebook" : "Share on Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 15 "feature.shareFranz.action.twitter" : "Share on Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Δεν είναι δυνατή η σÏνδεση με τις ζωντανές υπηÏεσίες του Franz", 23 "global.api.unhealthy" : "Δεν είναι δυνατή η σÏνδεση με τις ζωντανές υπηÏεσίες του Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Έχετε αποσυνδεθεί από το Διαδίκτυο", 25 "global.notConnectedToTheInternet" : "Έχετε αποσυνδεθεί από το Διαδίκτυο",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 26 "global.spellchecker.useDefault" : "Use System Default ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Spell checking language", 29 "global.spellchecking.language" : "Spell checking language",
21 "import.headline" : "Εισαγάγετε τις υπηÏεσίες σας Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "ΥπηÏεσίες που δεν υποστηÏίζονται ακόμα στο Ferdi 5", 31 "import.headline" : "Εισαγάγετε τις υπηÏεσίες σας Franz 4",
32 "import.notSupportedHeadline" : "ΥπηÏεσίες που δεν υποστηÏίζονται ακόμα στο Franz 5",
23 "import.skip.label" : "Θέλω να Ï€Ïοσθέσω υπηÏεσίες χειÏοκίνητα", 33 "import.skip.label" : "Θέλω να Ï€Ïοσθέσω υπηÏεσίες χειÏοκίνητα",
24 "import.submit.label" : "Εισαγωγή υπηÏεσιών", 34 "import.submit.label" : "Εισαγωγή υπηÏεσιών",
25 "infobar.buttonChangelog" : "Τι νέο υπάÏχει;", 35 "infobar.buttonChangelog" : "Τι νέο υπάÏχει;",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Ανανέωση υπηÏεσιών", 37 "infobar.buttonReloadServices" : "Ανανέωση υπηÏεσιών",
28 "infobar.requiredRequestsFailed" : "Δεν ήταν δυνατή η φόÏτωση υπηÏεσιών και πληÏοφοÏιών χÏηστών", 38 "infobar.requiredRequestsFailed" : "Δεν ήταν δυνατή η φόÏτωση υπηÏεσιών και πληÏοφοÏιών χÏηστών",
29 "infobar.servicesUpdated" : "Οι υπηÏεσίες σας έχουν ενημεÏωθεί.", 39 "infobar.servicesUpdated" : "Οι υπηÏεσίες σας έχουν ενημεÏωθεί.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "ΥπάÏχει διαθέσιμη μια νέα ενημέÏωση για τον Franz.", 41 "infobar.updateAvailable" : "ΥπάÏχει διαθέσιμη μια νέα ενημέÏωση για τον Franz.",
31 "invite.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", 42 "invite.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου",
32 "invite.headline.friends" : "ΠÏοσκαλέστε 3 από τους φίλους ή τους συναδέλφους σας", 43 "invite.headline.friends" : "ΠÏοσκαλέστε 3 από τους φίλους ή τους συναδέλφους σας",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.", 54 "login.serverLogout" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.",
44 "login.submit.label" : "ΣÏνδεση", 55 "login.submit.label" : "ΣÏνδεση",
45 "login.tokenExpired" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.", 56 "login.tokenExpired" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Σχετικά με το Franz", 59 "menu.app.about" : "Σχετικά με το Franz",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Έλεγχος για ενημεÏώσεις", 61 "menu.app.checkForUpdates" : "Έλεγχος για ενημεÏώσεις",
@@ -68,6 +81,9 @@
68 "menu.file" : "ΑÏχείο", 81 "menu.file" : "ΑÏχείο",
69 "menu.help" : "Βοήθεια", 82 "menu.help" : "Βοήθεια",
70 "menu.help.changelog" : "ΠÏόσφατες αλλαγές", 83 "menu.help.changelog" : "ΠÏόσφατες αλλαγές",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Μάθετε πεÏισσότεÏα", 87 "menu.help.learnMore" : "Μάθετε πεÏισσότεÏα",
72 "menu.help.privacy" : "Δήλωση αποÏÏήτου", 88 "menu.help.privacy" : "Δήλωση αποÏÏήτου",
73 "menu.help.support" : "ΥποστήÏιξη", 89 "menu.help.support" : "ΥποστήÏιξη",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Îέα ΥπηÏεσία", 93 "menu.services.addNewService" : "Îέα ΥπηÏεσία",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "ΠÏοβολή", 96 "menu.view" : "ΠÏοβολή",
80 "menu.view.enterFullScreen" : "ΠλήÏης Οθόνη", 97 "menu.view.enterFullScreen" : "ΠλήÏης Οθόνη",
81 "menu.view.exitFullScreen" : "Έξοδος από πλήÏη οθόνη", 98 "menu.view.exitFullScreen" : "Έξοδος από πλήÏη οθόνη",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Άνοιγμα ΕÏγαλειοθήκη ΠÏογÏαμματιστών", 102 "menu.view.toggleDevTools" : "Άνοιγμα ΕÏγαλειοθήκη ΠÏογÏαμματιστών",
86 "menu.view.toggleFullScreen" : "ΛειτουÏγία πλήÏους οθόνης", 103 "menu.view.toggleFullScreen" : "ΛειτουÏγία πλήÏους οθόνης",
87 "menu.view.toggleServiceDevTools" : "ΛειτουÏγεία ΥπηÏεσίασ ΕÏγαλειοθήκης ΠÏογÏαμματιστών", 104 "menu.view.toggleServiceDevTools" : "ΛειτουÏγεία ΥπηÏεσίασ ΕÏγαλειοθήκης ΠÏογÏαμματιστών",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Μεγέθυνση", 106 "menu.view.zoomIn" : "Μεγέθυνση",
89 "menu.view.zoomOut" : "ΣμίκÏυνση", 107 "menu.view.zoomOut" : "ΣμίκÏυνση",
90 "menu.window" : "ΠαÏάθυÏο", 108 "menu.window" : "ΠαÏάθυÏο",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Υποβολή", 121 "password.submit.label" : "Υποβολή",
104 "password.successInfo" : "Ελέγξτε το email σας", 122 "password.successInfo" : "Ελέγξτε το email σας",
105 "premiumFeature.button.upgradeAccount" : "Upgrade account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade account",
106 "pricing.headline" : "ΥποστηÏίξτε το Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Δεν θέλω να βοηθήσω στην ανάπτυξη του Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Θέλω να βοηθήσω στην ανάπτυξη του Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Επιλέξτε το πακέτο υποστήÏιξης", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "ΕπαναφόÏτωση {name}", 151 "service.crashHandler.action" : "ΕπαναφόÏτωση {name}",
111 "service.crashHandler.autoReload" : "Γίνεται Ï€Ïοσπάθεια αυτόματης ανάκτησης του {name} σε {seconds} δευτεÏόλεπτα", 152 "service.crashHandler.autoReload" : "Γίνεται Ï€Ïοσπάθεια αυτόματης ανάκτησης του {name} σε {seconds} δευτεÏόλεπτα",
112 "service.crashHandler.headline" : "Ω, όχι!", 153 "service.crashHandler.headline" : "Ω, όχι!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Ω, όχι!", 159 "service.errorHandler.headline" : "Ω, όχι!",
119 "service.errorHandler.message" : "Σφάλμα", 160 "service.errorHandler.message" : "Σφάλμα",
120 "service.errorHandler.text" : "{name} has failed to load.", 161 "service.errorHandler.text" : "{name} has failed to load.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "Ξεκινήστε", 168 "services.getStarted" : "Ξεκινήστε",
123 "services.welcome" : "Καλώς οÏίσατε στον Franz", 169 "services.welcome" : "Καλώς οÏίσατε στον Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης", 181 "settings.account.headlinePassword" : "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης",
136 "settings.account.headlineProfile" : "ΕνημέÏωση Ï€Ïοφίλ", 182 "settings.account.headlineProfile" : "ΕνημέÏωση Ï€Ïοφίλ",
137 "settings.account.headlineSubscription" : "Η συνδÏομή σας", 183 "settings.account.headlineSubscription" : "Η συνδÏομή σας",
138 "settings.account.headlineUpgrade" : "Αναβάθμιση του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ και υποστήÏιξη Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Λήψη", 186 "settings.account.invoiceDownload" : "Λήψη",
140 "settings.account.manageSubscription.label" : "ΔιαχείÏιση της συνδÏομής σας", 187 "settings.account.manageSubscription.label" : "ΔιαχείÏιση της συνδÏομής σας",
141 "settings.account.successInfo" : "Οι αλλαγές σας έχουν αποθηκευτεί", 188 "settings.account.successInfo" : "Οι αλλαγές σας έχουν αποθηκευτεί",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Δοκιμάστε ξανά", 192 "settings.account.tryReloadServices" : "Δοκιμάστε ξανά",
143 "settings.account.tryReloadUserInfoRequest" : "Δοκιμάστε ξανά", 193 "settings.account.tryReloadUserInfoRequest" : "Δοκιμάστε ξανά",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Δεν ήταν δυνατή η φόÏτωση πληÏοφοÏιών χÏήστη", 195 "settings.account.userInfoRequestFailed" : "Δεν ήταν δυνατή η φόÏτωση πληÏοφοÏιών χÏήστη",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "ΚαθαÏισμός λανθάνουσας μνήμης", 197 "settings.app.buttonClearAllCache" : "ΚαθαÏισμός λανθάνουσας μνήμης",
146 "settings.app.buttonInstallUpdate" : "Επανεκκίνηση & εγκατάσταση ενημεÏώσεων", 198 "settings.app.buttonInstallUpdate" : "Επανεκκίνηση & εγκατάσταση ενημεÏώσεων",
147 "settings.app.buttonSearchForUpdate" : "Έλεγχος για ενημεÏώσεις", 199 "settings.app.buttonSearchForUpdate" : "Έλεγχος για ενημεÏώσεις",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Join the Dark Side", 205 "settings.app.form.darkMode" : "Join the Dark Side",
154 "settings.app.form.enableGPUAcceleration" : "ΕνεÏγοποιήση Ενίσχυσης GPU ", 206 "settings.app.form.enableGPUAcceleration" : "ΕνεÏγοποιήση Ενίσχυσης GPU ",
155 "settings.app.form.enableSpellchecking" : "ΕνεÏγοποίηση οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï…", 207 "settings.app.form.enableSpellchecking" : "ΕνεÏγοποίηση οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï…",
156 "settings.app.form.enableSystemTray" : "Εμφάνιση του Ferdi στη γÏαμμή ειδοποιήσεων", 208 "settings.app.form.enableSystemTray" : "Εμφάνιση του Franz στη γÏαμμή ειδοποιήσεων",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Γλώσσα", 210 "settings.app.form.language" : "Γλώσσα",
158 "settings.app.form.minimizeToSystemTray" : "Ελαχιστοποίηση του Ferdi στη γÏαμμή ειδοποιήσεων", 211 "settings.app.form.minimizeToSystemTray" : "Ελαχιστοποίηση του Ferdi στη γÏαμμή ειδοποιήσεων",
159 "settings.app.form.runInBackground" : "ΚÏατήστε το Ferdi στο παÏασκήνιο κατά το κλείσιμο του παÏαθÏÏου", 212 "settings.app.form.runInBackground" : "ΚÏατήστε το Ferdi στο παÏασκήνιο κατά το κλείσιμο του παÏαθÏÏου",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Οι υπηÏεσίες σας", 235 "settings.navigation.yourServices" : "Οι υπηÏεσίες σας",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Όλες οι υπηÏεσίες", 237 "settings.recipes.all" : "Όλες οι υπηÏεσίες",
185 "settings.recipes.dev" : "Ανάπτυξη", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Διαθέσιμες υπηÏεσίες", 245 "settings.recipes.headline" : "Διαθέσιμες υπηÏεσίες",
187 "settings.recipes.missingService" : "Λείπει κάποια υπηÏεσία;", 246 "settings.recipes.missingService" : "Λείπει κάποια υπηÏεσία;",
188 "settings.recipes.mostPopular" : "Τα πιο δημοφιλή", 247 "settings.recipes.mostPopular" : "Τα πιο δημοφιλή",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Ρυθμίσεις", 334 "sidebar.settings" : "Ρυθμίσεις",
276 "sidebar.unmuteApp" : "ΕνεÏγοποίηση ειδοποιήσεων & ήχου", 335 "sidebar.unmuteApp" : "ΕνεÏγοποίηση ειδοποιήσεων & ήχου",
277 "signup.company.label" : "ΕταιÏεία",
278 "signup.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", 336 "signup.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου",
279 "signup.emailDuplicate" : "Ένας χÏήστης με τη συγκεκÏιμένη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου υπάÏχει ήδη", 337 "signup.emailDuplicate" : "Ένας χÏήστης με τη συγκεκÏιμένη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου υπάÏχει ήδη",
280 "signup.firstname.label" : "Όνομα", 338 "signup.firstname.label" : "Όνομα",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "δωÏεάν", 358 "subscription.type.free" : "δωÏεάν",
301 "subscription.type.month" : "μήνας", 359 "subscription.type.month" : "μήνας",
302 "subscription.type.year" : "έτος", 360 "subscription.type.year" : "έτος",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "ΑκÏÏωση", 367 "subscriptionPopup.buttonCancel" : "ΑκÏÏωση",
304 "subscriptionPopup.buttonDone" : "Έγινε", 368 "subscriptionPopup.buttonDone" : "Έγινε",
305 "tabs.item.deleteService" : "ΔιαγÏαφή υπηÏεσίας", 369 "tabs.item.deleteService" : "ΔιαγÏαφή υπηÏεσίας",
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 74fc7427a..55de9bdeb 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action": "Reload", 2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline": "Changes in Franz {version}",
5 "feature.delayApp.action": "Get a Ferdi Supporter License", 5 "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text": "Franz will continue in {seconds} seconds.",
7 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.", 7 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort": "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline": "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action": "Get a Franz Supporter License",
11 "feature.delayApp.upgrade.actionShort": "Upgrade account",
12 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email": "Send as email", 13 "feature.shareFranz.action.email": "Send as email",
9 "feature.shareFranz.action.facebook": "Share on Facebook", 14 "feature.shareFranz.action.facebook": "Share on Facebook",
10 "feature.shareFranz.action.twitter": "Share on Twitter", 15 "feature.shareFranz.action.twitter": "Share on Twitter",
11 "feature.shareFranz.headline": "Ferdi is better together!", 16 "feature.shareFranz.headline": "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
15 "global.api.unhealthy": "Can't connect to Ferdi online services", 20 "feature.todos.premium.info": "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade": "Upgrade Account",
23 "global.api.unhealthy": "Can't connect to Franz online services",
24 "global.franzProRequired": "Franz Professional Required",
16 "global.notConnectedToTheInternet": "You are not connected to the internet.", 25 "global.notConnectedToTheInternet": "You are not connected to the internet.",
17 "global.spellchecker.useDefault": "Use System Default ({default})", 26 "global.spellchecker.useDefault": "Use System Default ({default})",
18 "global.spellchecking.autodetect": "Detect language automatically", 27 "global.spellchecking.autodetect": "Detect language automatically",
19 "global.spellchecking.autodetect.short": "Automatic", 28 "global.spellchecking.autodetect.short": "Automatic",
20 "global.spellchecking.language": "Spell checking language", 29 "global.spellchecking.language": "Spell checking language",
21 "import.headline": "Import your Ferdi 4 services", 30 "global.upgradeButton.upgradeToPro": "Upgrade to Franz Professional",
22 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5", 31 "import.headline": "Import your Franz 4 services",
32 "import.notSupportedHeadline": "Services not yet supported in Franz 5",
23 "import.skip.label": "I want to add services manually", 33 "import.skip.label": "I want to add services manually",
24 "import.submit.label": "Import services", 34 "import.submit.label": "Import services",
25 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 35 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
@@ -28,7 +38,8 @@
28 "infobar.buttonReloadServices": "Reload services", 38 "infobar.buttonReloadServices": "Reload services",
29 "infobar.requiredRequestsFailed": "Could not load services and user information", 39 "infobar.requiredRequestsFailed": "Could not load services and user information",
30 "infobar.servicesUpdated": "Your services have been updated.", 40 "infobar.servicesUpdated": "Your services have been updated.",
31 "infobar.updateAvailable": "A new update for Ferdi is available.", 41 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
42 "infobar.updateAvailable": "A new update for Franz is available.",
32 "invite.email.label": "Email address", 43 "invite.email.label": "Email address",
33 "invite.headline.friends": "Invite 3 of your friends or colleagues", 44 "invite.headline.friends": "Invite 3 of your friends or colleagues",
34 "invite.name.label": "Name", 45 "invite.name.label": "Name",
@@ -46,6 +57,8 @@
46 "login.serverLogout": "Your session expired, please login again.", 57 "login.serverLogout": "Your session expired, please login again.",
47 "login.submit.label": "Sign in", 58 "login.submit.label": "Sign in",
48 "login.tokenExpired": "Your session expired, please login again.", 59 "login.tokenExpired": "Your session expired, please login again.",
60 "menu.Todoss.closeTodosDrawer": "Close Todos drawer",
61 "menu.Todoss.openTodosDrawer": "Open Todos drawer",
49 "menu.app.about": "About Franz", 62 "menu.app.about": "About Franz",
50 "menu.app.announcement": "What's new?", 63 "menu.app.announcement": "What's new?",
51 "menu.app.checkForUpdates": "Check for updates", 64 "menu.app.checkForUpdates": "Check for updates",
@@ -82,6 +95,7 @@
82 "menu.services.activatePreviousService": "Activate previous service", 95 "menu.services.activatePreviousService": "Activate previous service",
83 "menu.services.addNewService": "Add New Service...", 96 "menu.services.addNewService": "Add New Service...",
84 "menu.services.setNextServiceActive": "Activate next service", 97 "menu.services.setNextServiceActive": "Activate next service",
98 "menu.todos": "Todos",
85 "menu.view": "View", 99 "menu.view": "View",
86 "menu.view.enterFullScreen": "Enter Full Screen", 100 "menu.view.enterFullScreen": "Enter Full Screen",
87 "menu.view.exitFullScreen": "Exit Full Screen", 101 "menu.view.exitFullScreen": "Exit Full Screen",
@@ -91,6 +105,7 @@
91 "menu.view.toggleDevTools": "Toggle Developer Tools", 105 "menu.view.toggleDevTools": "Toggle Developer Tools",
92 "menu.view.toggleFullScreen": "Toggle Full Screen", 106 "menu.view.toggleFullScreen": "Toggle Full Screen",
93 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools", 107 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
108 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
94 "menu.view.zoomIn": "Zoom In", 109 "menu.view.zoomIn": "Zoom In",
95 "menu.view.zoomOut": "Zoom Out", 110 "menu.view.zoomOut": "Zoom Out",
96 "menu.window": "Window", 111 "menu.window": "Window",
@@ -109,10 +124,33 @@
109 "password.submit.label": "Submit", 124 "password.submit.label": "Submit",
110 "password.successInfo": "Please check your email", 125 "password.successInfo": "Please check your email",
111 "premiumFeature.button.upgradeAccount": "Upgrade account", 126 "premiumFeature.button.upgradeAccount": "Upgrade account",
112 "pricing.headline": "Support Ferdi", 127 "pricing.features.adFree": "Forever ad-free",
113 "pricing.link.skipPayment": "I don't want to support the development of Ferdi.", 128 "pricing.features.appDelays": "No Waiting Screens",
114 "pricing.submit.label": "I want to support the development of Ferdi", 129 "pricing.features.customWebsites": "Add Custom Websites",
115 "pricing.support.label": "Select your support plan", 130 "pricing.features.onPremise": "On-premise & other Hosted Services",
131 "pricing.features.serviceProxies": "Service Proxies",
132 "pricing.features.spellchecker": "Spellchecker support",
133 "pricing.features.teamManagement": "Team Management",
134 "pricing.features.thirdPartyServices": "Install 3rd party services",
135 "pricing.features.unlimitedServices": "Add unlimited services",
136 "pricing.features.workspaces": "Workspaces",
137 "pricing.plan.free": "Franz Free",
138 "pricing.plan.legacy": "Franz Premium",
139 "pricing.plan.personal": "Franz Personal",
140 "pricing.plan.personal-monthly": "Franz Personal Monthly",
141 "pricing.plan.personal-yearly": "Franz Personal Yearly",
142 "pricing.plan.pro": "Franz Professional",
143 "pricing.plan.pro-monthly": "Franz Professional Monthly",
144 "pricing.plan.pro-yearly": "Franz Professional Yearly",
145 "pricing.trial.cta.accept": "Yes, upgrade my account to Franz Professional",
146 "pricing.trial.cta.skip": "Continue to Franz",
147 "pricing.trial.error": "Sorry, we could not activate your trial!",
148 "pricing.trial.features.headline": "Franz Professional includes:",
149 "pricing.trial.headline": "Franz Professional",
150 "pricing.trial.subheadline": "Your personal welcome offer:",
151 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
152 "pricing.trial.terms.headline": "No strings attached",
153 "pricing.trial.terms.noCreditCard": "No credit card required",
116 "service.crashHandler.action": "Reload {name}", 154 "service.crashHandler.action": "Reload {name}",
117 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 155 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
118 "service.crashHandler.headline": "Oh no!", 156 "service.crashHandler.headline": "Oh no!",
@@ -124,6 +162,11 @@
124 "service.errorHandler.headline": "Oh no!", 162 "service.errorHandler.headline": "Oh no!",
125 "service.errorHandler.message": "Error", 163 "service.errorHandler.message": "Error",
126 "service.errorHandler.text": "{name} has failed to load.", 164 "service.errorHandler.text": "{name} has failed to load.",
165 "service.restrictedHandler.action": "Upgrade Account",
166 "service.restrictedHandler.customUrl.headline": "Franz Professional Plan required",
167 "service.restrictedHandler.customUrl.text": "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
168 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
169 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
127 "service.webviewLoader.loading": "Loading", 170 "service.webviewLoader.loading": "Loading",
128 "services.getStarted": "Get started", 171 "services.getStarted": "Get started",
129 "services.login": "Please login to use Ferdi.", 172 "services.login": "Please login to use Ferdi.",
@@ -143,13 +186,19 @@
143 "settings.account.headlinePassword": "Change password", 186 "settings.account.headlinePassword": "Change password",
144 "settings.account.headlineProfile": "Update profile", 187 "settings.account.headlineProfile": "Update profile",
145 "settings.account.headlineSubscription": "Your subscription", 188 "settings.account.headlineSubscription": "Your subscription",
146 "settings.account.headlineUpgrade": "Upgrade your account & support Ferdi", 189 "settings.account.headlineTrialUpgrade": "Get the free 14 day Franz Professional Trial",
190 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Franz experience",
147 "settings.account.invoiceDownload": "Download", 191 "settings.account.invoiceDownload": "Download",
148 "settings.account.manageSubscription.label": "Manage your subscription", 192 "settings.account.manageSubscription.label": "Manage your subscription",
149 "settings.account.successInfo": "Your changes have been saved", 193 "settings.account.successInfo": "Your changes have been saved",
194 "settings.account.trial": "Free Trial",
195 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
196 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
150 "settings.account.tryReloadServices": "Try again", 197 "settings.account.tryReloadServices": "Try again",
151 "settings.account.tryReloadUserInfoRequest": "Try again", 198 "settings.account.tryReloadUserInfoRequest": "Try again",
199 "settings.account.upgradeToPro.label": "Upgrade to Franz Professional",
152 "settings.account.userInfoRequestFailed": "Could not load user information", 200 "settings.account.userInfoRequestFailed": "Could not load user information",
201 "settings.account.yourLicense": "Your Franz License",
153 "settings.app.buttonClearAllCache": "Clear cache", 202 "settings.app.buttonClearAllCache": "Clear cache",
154 "settings.app.buttonInstallUpdate": "Restart & install update", 203 "settings.app.buttonInstallUpdate": "Restart & install update",
155 "settings.app.buttonSearchForUpdate": "Check for updates", 204 "settings.app.buttonSearchForUpdate": "Check for updates",
@@ -161,7 +210,8 @@
161 "settings.app.form.darkMode": "Join the Dark Side", 210 "settings.app.form.darkMode": "Join the Dark Side",
162 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration", 211 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration",
163 "settings.app.form.enableSpellchecking": "Enable spell checking", 212 "settings.app.form.enableSpellchecking": "Enable spell checking",
164 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 213 "settings.app.form.enableSystemTray": "Show Franz in system tray",
214 "settings.app.form.enableTodos": "Enable Franz Todos",
165 "settings.app.form.language": "Language", 215 "settings.app.form.language": "Language",
166 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray", 216 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray",
167 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window", 217 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window",
@@ -192,7 +242,13 @@
192 "settings.navigation.yourServices": "Your services", 242 "settings.navigation.yourServices": "Your services",
193 "settings.navigation.yourWorkspaces": "Your workspaces", 243 "settings.navigation.yourWorkspaces": "Your workspaces",
194 "settings.recipes.all": "All services", 244 "settings.recipes.all": "All services",
195 "settings.recipes.dev": "Development", 245 "settings.recipes.custom": "Custom Services",
246 "settings.recipes.customService.headline.communityRecipes": "Community 3rd Party Recipes",
247 "settings.recipes.customService.headline.customRecipes": "Custom 3rd Party Recipes",
248 "settings.recipes.customService.headline.devRecipes": "Your Development Service Recipes",
249 "settings.recipes.customService.intro": "To add a custom service, copy the service recipe to:",
250 "settings.recipes.customService.openDevDocs": "Developer Documentation",
251 "settings.recipes.customService.openFolder": "Open folder",
196 "settings.recipes.headline": "Available services", 252 "settings.recipes.headline": "Available services",
197 "settings.recipes.missingService": "Missing a service?", 253 "settings.recipes.missingService": "Missing a service?",
198 "settings.recipes.mostPopular": "Most popular", 254 "settings.recipes.mostPopular": "Most popular",
@@ -284,7 +340,6 @@
284 "sidebar.openWorkspaceDrawer": "Open workspace drawer", 340 "sidebar.openWorkspaceDrawer": "Open workspace drawer",
285 "sidebar.settings": "Settings", 341 "sidebar.settings": "Settings",
286 "sidebar.unmuteApp": "Enable notifications & audio", 342 "sidebar.unmuteApp": "Enable notifications & audio",
287 "signup.company.label": "Company",
288 "signup.email.label": "Email address", 343 "signup.email.label": "Email address",
289 "signup.emailDuplicate": "A user with that email address already exists", 344 "signup.emailDuplicate": "A user with that email address already exists",
290 "signup.firstname.label": "First Name", 345 "signup.firstname.label": "First Name",
@@ -310,6 +365,12 @@
310 "subscription.type.free": "free", 365 "subscription.type.free": "free",
311 "subscription.type.month": "month", 366 "subscription.type.month": "month",
312 "subscription.type.year": "year", 367 "subscription.type.year": "year",
368 "subscription.cta.activateTrial": "Yes, start the free Franz Professional trial",
369 "subscription.cta.allOptions": "See all options",
370 "subscription.cta.choosePlan": "Choose your plan",
371 "subscription.includedProFeatures": "The Franz Professional Plan includes:",
372 "subscription.teaser.includedFeatures": "Paid Franz Plans include:",
373 "subscription.teaser.intro": "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
313 "subscriptionPopup.buttonCancel": "Cancel", 374 "subscriptionPopup.buttonCancel": "Cancel",
314 "subscriptionPopup.buttonDone": "Done", 375 "subscriptionPopup.buttonDone": "Done",
315 "tabs.item.deleteService": "Delete service", 376 "tabs.item.deleteService": "Delete service",
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index ebee8bcc5..48b68a893 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Actualizar", 2 "app.errorHandler.action" : "Actualizar",
3 "app.errorHandler.headline" : "Algo salió mal", 3 "app.errorHandler.headline" : "Algo salió mal",
4 "feature.announcements.changelog.headline" : "Cambios en Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Cambios en Franz {version}",
5 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz", 5 "feature.delayApp.headline" : "Por favor compra una Licencia de Soporte de Franz para omitir la espera",
6 "feature.delayApp.headline" : "Por favor compra una Licencia de Soporte de Ferdi para omitir la espera", 6 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.",
7 "feature.delayApp.text" : "Ferdi continuará en {seconds} segundos.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Consigue una Licencia de Soporte de Franz",
11 "feature.delayApp.upgrade.actionShort" : "Mejora tu cuenta",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Enviar como correo", 13 "feature.shareFranz.action.email" : "Enviar como correo",
9 "feature.shareFranz.action.facebook" : "Compartir en Facebook", 14 "feature.shareFranz.action.facebook" : "Compartir en Facebook",
10 "feature.shareFranz.action.twitter" : "Compartir en Twitter", 15 "feature.shareFranz.action.twitter" : "Compartir en Twitter",
11 "feature.shareFranz.headline" : "¡Juntos mejoramos Franz!", 16 "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", 17 "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" : "He agregado {count} servicios a Franz! Obtené la aplicación gratuita de WhatsApp, Messenger, Slack, Skype y co en www.meetfranz.com\/cc @FranzMessenger", 18 "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 Ferdi y ayúdanos a correr la voz.", 19 "feature.shareFranz.text" : "Dile a tus amigos y colegas lo asombroso que es Franz y ayúdanos a correr la voz.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.", 23 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "No estás conectado a Internet", 25 "global.notConnectedToTheInternet" : "No estás conectado a Internet",
17 "global.spellchecker.useDefault" : "Utilizar estándar del sistema ({default})", 26 "global.spellchecker.useDefault" : "Utilizar estándar del sistema ({default})",
18 "global.spellchecking.autodetect" : "Detectar el idioma automáticamente", 27 "global.spellchecking.autodetect" : "Detectar el idioma automáticamente",
19 "global.spellchecking.autodetect.short" : "Automático", 28 "global.spellchecking.autodetect.short" : "Automático",
20 "global.spellchecking.language" : "Corrector de ortografía", 29 "global.spellchecking.language" : "Corrector de ortografía",
21 "import.headline" : "Importa tus servicios de Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Servicios aún no admitidos en Ferdi 5", 31 "import.headline" : "Importa tus servicios de Franz 4",
32 "import.notSupportedHeadline" : "Servicios aún no admitidos en Franz 5",
23 "import.skip.label" : "Quiero agregar servicios manualmente", 33 "import.skip.label" : "Quiero agregar servicios manualmente",
24 "import.submit.label" : "Importar servicios", 34 "import.submit.label" : "Importar servicios",
25 "infobar.buttonChangelog" : "¿Qué hay de nuevo?", 35 "infobar.buttonChangelog" : "¿Qué hay de nuevo?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Recargar servicios", 37 "infobar.buttonReloadServices" : "Recargar servicios",
28 "infobar.requiredRequestsFailed" : "No se han podido cargar los servicios ni la información de usuario", 38 "infobar.requiredRequestsFailed" : "No se han podido cargar los servicios ni la información de usuario",
29 "infobar.servicesUpdated" : "Tus servicios han sido actualizados.", 39 "infobar.servicesUpdated" : "Tus servicios han sido actualizados.",
30 "infobar.updateAvailable" : "Una nueva actualización de Ferdi está disponible", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Una nueva actualización de Franz está disponible",
31 "invite.email.label" : "Dirección de correo electrónico", 42 "invite.email.label" : "Dirección de correo electrónico",
32 "invite.headline.friends" : "Invita a 3 de tus amigos o compañeros", 43 "invite.headline.friends" : "Invita a 3 de tus amigos o compañeros",
33 "invite.name.label" : "Nombre", 44 "invite.name.label" : "Nombre",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.", 54 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.",
44 "login.submit.label" : "Iniciar sesión", 55 "login.submit.label" : "Iniciar sesión",
45 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.", 56 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Acerca de Franz", 59 "menu.app.about" : "Acerca de Franz",
47 "menu.app.announcement" : "¿Qué hay de nuevo?", 60 "menu.app.announcement" : "¿Qué hay de nuevo?",
48 "menu.app.checkForUpdates" : "Comprobar actualizaciones", 61 "menu.app.checkForUpdates" : "Comprobar actualizaciones",
@@ -68,6 +81,9 @@
68 "menu.file" : "Archivo", 81 "menu.file" : "Archivo",
69 "menu.help" : "Ayuda", 82 "menu.help" : "Ayuda",
70 "menu.help.changelog" : "Registro de cambios", 83 "menu.help.changelog" : "Registro de cambios",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Conocer más", 87 "menu.help.learnMore" : "Conocer más",
72 "menu.help.privacy" : "Declaración de privacidad", 88 "menu.help.privacy" : "Declaración de privacidad",
73 "menu.help.support" : "Soporte", 89 "menu.help.support" : "Soporte",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activa el servicio previo", 92 "menu.services.activatePreviousService" : "Activa el servicio previo",
77 "menu.services.addNewService" : "Añadir Nuevo Servicio...", 93 "menu.services.addNewService" : "Añadir Nuevo Servicio...",
78 "menu.services.setNextServiceActive" : "Activa el siguiente servicio", 94 "menu.services.setNextServiceActive" : "Activa el siguiente servicio",
95 "menu.todos" : "Todos",
79 "menu.view" : "Mostrar", 96 "menu.view" : "Mostrar",
80 "menu.view.enterFullScreen" : "Pasar a pantalla completa", 97 "menu.view.enterFullScreen" : "Pasar a pantalla completa",
81 "menu.view.exitFullScreen" : "Salir de Pantalla Completa", 98 "menu.view.exitFullScreen" : "Salir de Pantalla Completa",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Activar las Herramientas para Desarrolladores", 102 "menu.view.toggleDevTools" : "Activar las Herramientas para Desarrolladores",
86 "menu.view.toggleFullScreen" : "Cambiar a Pantalla Completa", 103 "menu.view.toggleFullScreen" : "Cambiar a Pantalla Completa",
87 "menu.view.toggleServiceDevTools" : "Mostrar Herramientas de Servicios para Desarrolladores", 104 "menu.view.toggleServiceDevTools" : "Mostrar Herramientas de Servicios para Desarrolladores",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Ampliar", 106 "menu.view.zoomIn" : "Ampliar",
89 "menu.view.zoomOut" : "Reducir", 107 "menu.view.zoomOut" : "Reducir",
90 "menu.window" : "Ventana", 108 "menu.window" : "Ventana",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Enviar", 121 "password.submit.label" : "Enviar",
104 "password.successInfo" : "Por favor revisa tu correo electrónico", 122 "password.successInfo" : "Por favor revisa tu correo electrónico",
105 "premiumFeature.button.upgradeAccount" : "Mejora tu cuenta", 123 "premiumFeature.button.upgradeAccount" : "Mejora tu cuenta",
106 "pricing.headline" : "Apoya a Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "No quiero apoyar el desarrollo de Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Quiero apoyar el desarrollo de Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Selecciona tu plan de soporte", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Espacios de trabajo",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Recargar {name}", 151 "service.crashHandler.action" : "Recargar {name}",
111 "service.crashHandler.autoReload" : "Intentando recuperar automáticamente {name} en {seconds} segundos", 152 "service.crashHandler.autoReload" : "Intentando recuperar automáticamente {name} en {seconds} segundos",
112 "service.crashHandler.headline" : "¡Oh, no!", 153 "service.crashHandler.headline" : "¡Oh, no!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "¡Oh, no!", 159 "service.errorHandler.headline" : "¡Oh, no!",
119 "service.errorHandler.message" : "Error", 160 "service.errorHandler.message" : "Error",
120 "service.errorHandler.text" : "{name} ha fallado la carga", 161 "service.errorHandler.text" : "{name} ha fallado la carga",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Cargando", 167 "service.webviewLoader.loading" : "Cargando",
122 "services.getStarted" : "Primeros pasos", 168 "services.getStarted" : "Primeros pasos",
123 "services.welcome" : "Bienvenido a Franz", 169 "services.welcome" : "Bienvenido a Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Cambiar contraseña", 181 "settings.account.headlinePassword" : "Cambiar contraseña",
136 "settings.account.headlineProfile" : "Actualizar perfil", 182 "settings.account.headlineProfile" : "Actualizar perfil",
137 "settings.account.headlineSubscription" : "Tu suscripción", 183 "settings.account.headlineSubscription" : "Tu suscripción",
138 "settings.account.headlineUpgrade" : "Actualiza tu cuenta y apoya a Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Descargar", 186 "settings.account.invoiceDownload" : "Descargar",
140 "settings.account.manageSubscription.label" : "Administra tu suscripción", 187 "settings.account.manageSubscription.label" : "Administra tu suscripción",
141 "settings.account.successInfo" : "Tus cambios han sido guardados", 188 "settings.account.successInfo" : "Tus cambios han sido guardados",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Intentar de nuevo", 192 "settings.account.tryReloadServices" : "Intentar de nuevo",
143 "settings.account.tryReloadUserInfoRequest" : "Intenta de nuevo", 193 "settings.account.tryReloadUserInfoRequest" : "Intenta de nuevo",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "No se pudo cargar la información de usuario", 195 "settings.account.userInfoRequestFailed" : "No se pudo cargar la información de usuario",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Limpiar caché", 197 "settings.app.buttonClearAllCache" : "Limpiar caché",
146 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar actualizaciones", 198 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar actualizaciones",
147 "settings.app.buttonSearchForUpdate" : "Buscar actualizaciones", 199 "settings.app.buttonSearchForUpdate" : "Buscar actualizaciones",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Únete al Lado Oscuro", 205 "settings.app.form.darkMode" : "Únete al Lado Oscuro",
154 "settings.app.form.enableGPUAcceleration" : "Habilitar aceleración de GPU", 206 "settings.app.form.enableGPUAcceleration" : "Habilitar aceleración de GPU",
155 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica", 207 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica",
156 "settings.app.form.enableSystemTray" : "Mostrar Ferdi en la bandeja del sistema", 208 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Idioma", 210 "settings.app.form.language" : "Idioma",
158 "settings.app.form.minimizeToSystemTray" : "Minimizar Ferdi a la bandeja del sistema", 211 "settings.app.form.minimizeToSystemTray" : "Minimizar Ferdi a la bandeja del sistema",
159 "settings.app.form.runInBackground" : "Mantener Ferdi en segundo plano al cerrar la ventana", 212 "settings.app.form.runInBackground" : "Mantener Ferdi en segundo plano al cerrar la ventana",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Tus servicios", 235 "settings.navigation.yourServices" : "Tus servicios",
183 "settings.navigation.yourWorkspaces" : "Tus espacios de trabajo", 236 "settings.navigation.yourWorkspaces" : "Tus espacios de trabajo",
184 "settings.recipes.all" : "Todos los servicios", 237 "settings.recipes.all" : "Todos los servicios",
185 "settings.recipes.dev" : "Desarrollo", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Servicios disponibles", 245 "settings.recipes.headline" : "Servicios disponibles",
187 "settings.recipes.missingService" : "¿Echas de menos algún servicio?", 246 "settings.recipes.missingService" : "¿Echas de menos algún servicio?",
188 "settings.recipes.mostPopular" : "Más populares", 247 "settings.recipes.mostPopular" : "Más populares",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Configuración", 334 "sidebar.settings" : "Configuración",
276 "sidebar.unmuteApp" : "Activar notificaciones y sonido", 335 "sidebar.unmuteApp" : "Activar notificaciones y sonido",
277 "signup.company.label" : "Compañía",
278 "signup.email.label" : "Dirección de correo electrónico", 336 "signup.email.label" : "Dirección de correo electrónico",
279 "signup.emailDuplicate" : "Ya existe un usuario con esa dirección de correo electrónico", 337 "signup.emailDuplicate" : "Ya existe un usuario con esa dirección de correo electrónico",
280 "signup.firstname.label" : "Nombre", 338 "signup.firstname.label" : "Nombre",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "gratis", 358 "subscription.type.free" : "gratis",
301 "subscription.type.month" : "mes", 359 "subscription.type.month" : "mes",
302 "subscription.type.year" : "año", 360 "subscription.type.year" : "año",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Cancelar", 367 "subscriptionPopup.buttonCancel" : "Cancelar",
304 "subscriptionPopup.buttonDone" : "Listo", 368 "subscriptionPopup.buttonDone" : "Listo",
305 "tabs.item.deleteService" : "Borrar servicio", 369 "tabs.item.deleteService" : "Borrar servicio",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 608eee52a..f98a060cd 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -1,23 +1,33 @@
1{ 1{
2 "app.errorHandler.action" : "Recharger", 2 "app.errorHandler.action" : "Actualiser",
3 "app.errorHandler.headline" : "Une erreur s'est produite", 3 "app.errorHandler.headline" : "On dirait que quelque chose ne va pas",
4 "feature.announcements.changelog.headline" : "Changements dans Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Les nouveaux changements dans Franz {version}",
5 "feature.delayApp.action" : "Obtenez une licence de Supporter Franz", 5 "feature.delayApp.headline" : "Achetez la licence Franz pour ne plus avoir de temps d'attente",
6 "feature.delayApp.headline" : "Achetez une licence de Supporter Ferdi pour ne plus avoir de temps d'attente", 6 "feature.delayApp.text" : "Franz s'ouvrira dans {seconds} secondes.",
7 "feature.delayApp.text" : "Ferdi reprendra dans {seconds} secondes.", 7 "feature.delayApp.trial.action" : "Oui, je veux les 14 jours d'essai gratuits de Franz Professionnel",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Acheter une license Franz",
11 "feature.delayApp.upgrade.actionShort" : "Augmenter le niveau de mon compte",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Envoyer par mail", 13 "feature.shareFranz.action.email" : "Envoyer par mail",
9 "feature.shareFranz.action.facebook" : "Partager sur Facebook", 14 "feature.shareFranz.action.facebook" : "Partager sur Facebook",
10 "feature.shareFranz.action.twitter" : "Partager sur Twitter", 15 "feature.shareFranz.action.twitter" : "Partager sur Twitter",
11 "feature.shareFranz.headline" : "Ferdi est meilleur quand on est tous ensemble !", 16 "feature.shareFranz.headline" : "Franz est meilleur quand on est ensemble !",
12 "feature.shareFranz.shareText.email" : "J'ai ajouté {count} services à Ferdi ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et cie sur www.meetfranz.com", 17 "feature.shareFranz.shareText.email" : "J'ai ajouté {count} services sur Franz ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et autres sur www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "J'ai ajouté {count} services à Franz! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et compagnie sur www.meetfranz.com \/cc @FranzMessenger", 18 "feature.shareFranz.shareText.twitter" : "J'ai ajouté {count} services à Franz! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et autres sur www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Dites à vos amis et collègues a quel point Ferdi est super et aidez nous à faire passer le mot.", 19 "feature.shareFranz.text" : "Dites à vos amis et collègues a quel point Franz est super et aidez nous à faire passer le mot.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz", 23 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.", 25 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.",
17 "global.spellchecker.useDefault" : "Par défaut ({default})", 26 "global.spellchecker.useDefault" : "Par défaut ({default})",
18 "global.spellchecking.autodetect" : "Detecter automatiquement la langue", 27 "global.spellchecking.autodetect" : "Detecter automatiquement la langue",
19 "global.spellchecking.autodetect.short" : "Automatiquement", 28 "global.spellchecking.autodetect.short" : "Automatiquement",
20 "global.spellchecking.language" : "Langue de la vérification orthographique", 29 "global.spellchecking.language" : "Langue de la vérification orthographique",
30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
21 "import.headline" : "Importez vos services depuis la version 4 de Franz.", 31 "import.headline" : "Importez vos services depuis la version 4 de Franz.",
22 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par la version 5 de Franz", 32 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par la version 5 de Franz",
23 "import.skip.label" : "Je veux ajouter des services manuellement", 33 "import.skip.label" : "Je veux ajouter des services manuellement",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Recharger les services", 37 "infobar.buttonReloadServices" : "Recharger les services",
28 "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur", 38 "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur",
29 "infobar.servicesUpdated" : "Vos services ont été mis à jour.", 39 "infobar.servicesUpdated" : "Vos services ont été mis à jour.",
30 "infobar.updateAvailable" : "Une nouvelle mise à jour de Ferdi est disponible.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Une nouvelle mise à jour de Franz est disponible.",
31 "invite.email.label" : "Adresse Email", 42 "invite.email.label" : "Adresse Email",
32 "invite.headline.friends" : "Invitez 3 amis ou collègues", 43 "invite.headline.friends" : "Invitez 3 amis ou collègues",
33 "invite.name.label" : "Nom", 44 "invite.name.label" : "Nom",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.", 54 "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.",
44 "login.submit.label" : "Se connecter", 55 "login.submit.label" : "Se connecter",
45 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.", 56 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "À propos de Franz", 59 "menu.app.about" : "À propos de Franz",
47 "menu.app.announcement" : "Quoi de neuf ? ", 60 "menu.app.announcement" : "Quoi de neuf ? ",
48 "menu.app.checkForUpdates" : "Vérifier les mises à jour", 61 "menu.app.checkForUpdates" : "Vérifier les mises à jour",
@@ -68,6 +81,9 @@
68 "menu.file" : "Fichier", 81 "menu.file" : "Fichier",
69 "menu.help" : "Aide", 82 "menu.help" : "Aide",
70 "menu.help.changelog" : "Liste des modifications", 83 "menu.help.changelog" : "Liste des modifications",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "En savoir plus", 87 "menu.help.learnMore" : "En savoir plus",
72 "menu.help.privacy" : "Déclaration de confidentialité", 88 "menu.help.privacy" : "Déclaration de confidentialité",
73 "menu.help.support" : "Assistance", 89 "menu.help.support" : "Assistance",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activer le service précédent", 92 "menu.services.activatePreviousService" : "Activer le service précédent",
77 "menu.services.addNewService" : "Ajouter un nouveau service...", 93 "menu.services.addNewService" : "Ajouter un nouveau service...",
78 "menu.services.setNextServiceActive" : "Activer le service suivant", 94 "menu.services.setNextServiceActive" : "Activer le service suivant",
95 "menu.todos" : "Todos",
79 "menu.view" : "Aperçu", 96 "menu.view" : "Aperçu",
80 "menu.view.enterFullScreen" : "Entrer en mode plein écran", 97 "menu.view.enterFullScreen" : "Entrer en mode plein écran",
81 "menu.view.exitFullScreen" : "Sortir du mode plein écran", 98 "menu.view.exitFullScreen" : "Sortir du mode plein écran",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Activer les outils développeur", 102 "menu.view.toggleDevTools" : "Activer les outils développeur",
86 "menu.view.toggleFullScreen" : "Activer \/ désactiver le mode plein écran", 103 "menu.view.toggleFullScreen" : "Activer \/ désactiver le mode plein écran",
87 "menu.view.toggleServiceDevTools" : "Activer les outils de développement WebKit", 104 "menu.view.toggleServiceDevTools" : "Activer les outils de développement WebKit",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Zoom Avant", 106 "menu.view.zoomIn" : "Zoom Avant",
89 "menu.view.zoomOut" : "Zoom Arrière", 107 "menu.view.zoomOut" : "Zoom Arrière",
90 "menu.window" : "Fenêtre", 108 "menu.window" : "Fenêtre",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Soumettre", 121 "password.submit.label" : "Soumettre",
104 "password.successInfo" : "Merci de consulter vos emails", 122 "password.successInfo" : "Merci de consulter vos emails",
105 "premiumFeature.button.upgradeAccount" : "Augmenter le niveau de mon compte", 123 "premiumFeature.button.upgradeAccount" : "Augmenter le niveau de mon compte",
106 "pricing.headline" : "Soutenez Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Je ne veux pas soutenir le développement de Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Je veux soutenir le développement de Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Sélectionnez votre plan de soutien", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Espace de travail",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Recharger {name}", 151 "service.crashHandler.action" : "Recharger {name}",
111 "service.crashHandler.autoReload" : "Tentative de restauration automatique de {name} dans {seconds} secondes", 152 "service.crashHandler.autoReload" : "Tentative de restauration automatique de {name} dans {seconds} secondes",
112 "service.crashHandler.headline" : "Oh non !", 153 "service.crashHandler.headline" : "Oh non !",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh non !", 159 "service.errorHandler.headline" : "Oh non !",
119 "service.errorHandler.message" : "Erreur", 160 "service.errorHandler.message" : "Erreur",
120 "service.errorHandler.text" : "Le chargement de {name} a échoué.", 161 "service.errorHandler.text" : "Le chargement de {name} a échoué.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Chargement (c'est l'heure du café...)", 167 "service.webviewLoader.loading" : "Chargement (c'est l'heure du café...)",
122 "services.getStarted" : "Commencer", 168 "services.getStarted" : "Commencer",
123 "services.welcome" : "Bienvenue dans Franz", 169 "services.welcome" : "Bienvenue dans Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Changer le mot de passe", 181 "settings.account.headlinePassword" : "Changer le mot de passe",
136 "settings.account.headlineProfile" : "Mettre à jour le profil", 182 "settings.account.headlineProfile" : "Mettre à jour le profil",
137 "settings.account.headlineSubscription" : "Votre abonnement", 183 "settings.account.headlineSubscription" : "Votre abonnement",
138 "settings.account.headlineUpgrade" : "Améliorez votre compte et soutenez Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Télécharger", 186 "settings.account.invoiceDownload" : "Télécharger",
140 "settings.account.manageSubscription.label" : "Gérer votre abonnement", 187 "settings.account.manageSubscription.label" : "Gérer votre abonnement",
141 "settings.account.successInfo" : "Vos modifications ont été enregistrées", 188 "settings.account.successInfo" : "Vos modifications ont été enregistrées",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Réessayer", 192 "settings.account.tryReloadServices" : "Réessayer",
143 "settings.account.tryReloadUserInfoRequest" : "Réessayer", 193 "settings.account.tryReloadUserInfoRequest" : "Réessayer",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Impossible de charger les informations de l'utilisateur", 195 "settings.account.userInfoRequestFailed" : "Impossible de charger les informations de l'utilisateur",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Vider le cache", 197 "settings.app.buttonClearAllCache" : "Vider le cache",
146 "settings.app.buttonInstallUpdate" : "Redémarrer et installer la mise à jour", 198 "settings.app.buttonInstallUpdate" : "Redémarrer et installer la mise à jour",
147 "settings.app.buttonSearchForUpdate" : "Vérifier les mises à jour", 199 "settings.app.buttonSearchForUpdate" : "Vérifier les mises à jour",
@@ -150,10 +202,11 @@
150 "settings.app.form.autoLaunchInBackground" : "Ouvrir en arrière-plan", 202 "settings.app.form.autoLaunchInBackground" : "Ouvrir en arrière-plan",
151 "settings.app.form.autoLaunchOnStart" : "Lancer Ferdi au démarrage", 203 "settings.app.form.autoLaunchOnStart" : "Lancer Ferdi au démarrage",
152 "settings.app.form.beta" : "Accepter les versions bêta", 204 "settings.app.form.beta" : "Accepter les versions bêta",
153 "settings.app.form.darkMode" : "Rejoins le cô© obscur", 205 "settings.app.form.darkMode" : "Activer le thème sombre",
154 "settings.app.form.enableGPUAcceleration" : "Activer l'accélération GPU", 206 "settings.app.form.enableGPUAcceleration" : "Activer l'accélération GPU",
155 "settings.app.form.enableSpellchecking" : "Activer la vérification orthographique", 207 "settings.app.form.enableSpellchecking" : "Activer la vérification orthographique",
156 "settings.app.form.enableSystemTray" : "Afficher Ferdi dans la barre d'état système", 208 "settings.app.form.enableSystemTray" : "Afficher Franz dans la barre d'état système",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Langue", 210 "settings.app.form.language" : "Langue",
158 "settings.app.form.minimizeToSystemTray" : "Minimiser Ferdi dans la zone de notification", 211 "settings.app.form.minimizeToSystemTray" : "Minimiser Ferdi dans la zone de notification",
159 "settings.app.form.runInBackground" : "Garder Ferdi ouvert en arrière-plan à la fermeture de la fenêtre", 212 "settings.app.form.runInBackground" : "Garder Ferdi ouvert en arrière-plan à la fermeture de la fenêtre",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Vos services", 235 "settings.navigation.yourServices" : "Vos services",
183 "settings.navigation.yourWorkspaces" : "Tes espaces de travail", 236 "settings.navigation.yourWorkspaces" : "Tes espaces de travail",
184 "settings.recipes.all" : "Tous les services", 237 "settings.recipes.all" : "Tous les services",
185 "settings.recipes.dev" : "Développement", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Services disponibles", 245 "settings.recipes.headline" : "Services disponibles",
187 "settings.recipes.missingService" : "Un service est manquant ?", 246 "settings.recipes.missingService" : "Un service est manquant ?",
188 "settings.recipes.mostPopular" : "Les plus populaires", 247 "settings.recipes.mostPopular" : "Les plus populaires",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Ouvrir l'espace de travail", 333 "sidebar.openWorkspaceDrawer" : "Ouvrir l'espace de travail",
275 "sidebar.settings" : "Paramètres", 334 "sidebar.settings" : "Paramètres",
276 "sidebar.unmuteApp" : "Activer les notifications et les sons", 335 "sidebar.unmuteApp" : "Activer les notifications et les sons",
277 "signup.company.label" : "Entreprise",
278 "signup.email.label" : "Adresse email", 336 "signup.email.label" : "Adresse email",
279 "signup.emailDuplicate" : "Cette adresse email est déjà utilisée", 337 "signup.emailDuplicate" : "Cette adresse email est déjà utilisée",
280 "signup.firstname.label" : "Prénom", 338 "signup.firstname.label" : "Prénom",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "gratuit", 358 "subscription.type.free" : "gratuit",
301 "subscription.type.month" : "mois", 359 "subscription.type.month" : "mois",
302 "subscription.type.year" : "année", 360 "subscription.type.year" : "année",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Annuler", 367 "subscriptionPopup.buttonCancel" : "Annuler",
304 "subscriptionPopup.buttonDone" : "Terminé", 368 "subscriptionPopup.buttonDone" : "Terminé",
305 "tabs.item.deleteService" : "Supprimer le service", 369 "tabs.item.deleteService" : "Supprimer le service",
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 75c4c268a..f274c6eff 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Athlódáil", 2 "app.errorHandler.action" : "Athlódáil",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Something went wrong",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Get a Ferdi Supporter License", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.headline" : "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.delayApp.text" : "Ferdi will continue in {seconds} seconds.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Get a Franz Supporter License",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Send as email", 13 "feature.shareFranz.action.email" : "Send as email",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 14 "feature.shareFranz.action.facebook" : "Share on Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 15 "feature.shareFranz.action.twitter" : "Share on Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
15 "global.api.unhealthy" : "Ní féidir nascadh le seirbhísí Ferdi ar líne", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Ní féidir nascadh le seirbhísí Franz ar líne",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Níl tú nasctha leis an Idirlíon.", 25 "global.notConnectedToTheInternet" : "Níl tú nasctha leis an Idirlíon.",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 26 "global.spellchecker.useDefault" : "Use System Default ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Spell checking language", 29 "global.spellchecking.language" : "Spell checking language",
21 "import.headline" : "Iompórtáil do sheirbhísí Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Níl na seirbhísí seo taca ag Ferdi 5 go fóill", 31 "import.headline" : "Iompórtáil do sheirbhísí Franz 4",
32 "import.notSupportedHeadline" : "Níl na seirbhísí seo taca ag Franz 5 go fóill",
23 "import.skip.label" : "Ba mhaith liom seirbhísí a chur de láimh", 33 "import.skip.label" : "Ba mhaith liom seirbhísí a chur de láimh",
24 "import.submit.label" : "Iompórtáil seirbhísí", 34 "import.submit.label" : "Iompórtáil seirbhísí",
25 "infobar.buttonChangelog" : "Cad atá nua?", 35 "infobar.buttonChangelog" : "Cad atá nua?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Athlódáil seirbhísí", 37 "infobar.buttonReloadServices" : "Athlódáil seirbhísí",
28 "infobar.requiredRequestsFailed" : "Ní féidir seirbhísí agus eolas úsáideora a lódáil", 38 "infobar.requiredRequestsFailed" : "Ní féidir seirbhísí agus eolas úsáideora a lódáil",
29 "infobar.servicesUpdated" : "Nuashonraíodh do sheirbhísí.", 39 "infobar.servicesUpdated" : "Nuashonraíodh do sheirbhísí.",
30 "infobar.updateAvailable" : "Tá nuashonrú nua do Ferdi ar fáil.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Tá nuashonrú nua do Franz ar fáil.",
31 "invite.email.label" : "Seoladh ríomhphoist", 42 "invite.email.label" : "Seoladh ríomhphoist",
32 "invite.headline.friends" : "Tabhair cuireadh do thriúr chara nó chomhghleacaí", 43 "invite.headline.friends" : "Tabhair cuireadh do thriúr chara nó chomhghleacaí",
33 "invite.name.label" : "Ainm", 44 "invite.name.label" : "Ainm",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "D'éag do sheisiún, logáil isteach arís le do thoil.", 54 "login.serverLogout" : "D'éag do sheisiún, logáil isteach arís le do thoil.",
44 "login.submit.label" : "Logáil isteach", 55 "login.submit.label" : "Logáil isteach",
45 "login.tokenExpired" : "D'éag do sheisiún, logáil isteach arís le do thoil.", 56 "login.tokenExpired" : "D'éag do sheisiún, logáil isteach arís le do thoil.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Faoi Franz", 59 "menu.app.about" : "Faoi Franz",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Cuardaigh le nuashonruithe", 61 "menu.app.checkForUpdates" : "Cuardaigh le nuashonruithe",
@@ -68,6 +81,9 @@
68 "menu.file" : "Comhad", 81 "menu.file" : "Comhad",
69 "menu.help" : "Cabhair", 82 "menu.help" : "Cabhair",
70 "menu.help.changelog" : "Athruithe", 83 "menu.help.changelog" : "Athruithe",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Tuilleadh eolais", 87 "menu.help.learnMore" : "Tuilleadh eolais",
72 "menu.help.privacy" : "Ráiteas phríobháideachais", 88 "menu.help.privacy" : "Ráiteas phríobháideachais",
73 "menu.help.support" : "Tacaíocht", 89 "menu.help.support" : "Tacaíocht",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Cuir seirbhís nua leis", 93 "menu.services.addNewService" : "Cuir seirbhís nua leis",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "Amharc", 96 "menu.view" : "Amharc",
80 "menu.view.enterFullScreen" : "Cuir isteach mód lánscáileáin", 97 "menu.view.enterFullScreen" : "Cuir isteach mód lánscáileáin",
81 "menu.view.exitFullScreen" : "Scoir mód lánscáileáin", 98 "menu.view.exitFullScreen" : "Scoir mód lánscáileáin",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Scoránaigh uirlis forbróra", 102 "menu.view.toggleDevTools" : "Scoránaigh uirlis forbróra",
86 "menu.view.toggleFullScreen" : "Scoránaigh mód lánscáileáin", 103 "menu.view.toggleFullScreen" : "Scoránaigh mód lánscáileáin",
87 "menu.view.toggleServiceDevTools" : "Scoránaigh uirlis forbróra seirbhíse", 104 "menu.view.toggleServiceDevTools" : "Scoránaigh uirlis forbróra seirbhíse",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Zúmáil isteach", 106 "menu.view.zoomIn" : "Zúmáil isteach",
89 "menu.view.zoomOut" : "Zúmáil amach", 107 "menu.view.zoomOut" : "Zúmáil amach",
90 "menu.window" : "Fuinneog", 108 "menu.window" : "Fuinneog",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Cuir isteach", 121 "password.submit.label" : "Cuir isteach",
104 "password.successInfo" : "Seiceáil do chuid ríomhphoist le do thoil", 122 "password.successInfo" : "Seiceáil do chuid ríomhphoist le do thoil",
105 "premiumFeature.button.upgradeAccount" : "Upgrade account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade account",
106 "pricing.headline" : "Tabhair tacaíocht do Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Níor mhaith liom tacaíocht a thabhairt d'fhorbairt Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Ba mhaith liom tacaíocht a thabhairt d'fhorbairt Franz.", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Conas ar mhaith leat tacú le Franz?", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Athlódáil {name}", 151 "service.crashHandler.action" : "Athlódáil {name}",
111 "service.crashHandler.autoReload" : "Ag iarraidh {name} a thabhairt ar ais go huathoibríoch i gceann {seconds} shoicind", 152 "service.crashHandler.autoReload" : "Ag iarraidh {name} a thabhairt ar ais go huathoibríoch i gceann {seconds} shoicind",
112 "service.crashHandler.headline" : "Oró, ní hea!", 153 "service.crashHandler.headline" : "Oró, ní hea!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oró, ní hea!", 159 "service.errorHandler.headline" : "Oró, ní hea!",
119 "service.errorHandler.message" : "Earráid", 160 "service.errorHandler.message" : "Earráid",
120 "service.errorHandler.text" : "{name} has failed to load.", 161 "service.errorHandler.text" : "{name} has failed to load.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "Cuir tús", 168 "services.getStarted" : "Cuir tús",
123 "services.welcome" : "Fáilte go Franz", 169 "services.welcome" : "Fáilte go Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Athraigh pasfhocal", 181 "settings.account.headlinePassword" : "Athraigh pasfhocal",
136 "settings.account.headlineProfile" : "Nuashonraigh próifíl", 182 "settings.account.headlineProfile" : "Nuashonraigh próifíl",
137 "settings.account.headlineSubscription" : "Do shíntiús", 183 "settings.account.headlineSubscription" : "Do shíntiús",
138 "settings.account.headlineUpgrade" : "Uasghrádaigh do chuntas chun tacaíocht a thabhairt do Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Ãoslódáil", 186 "settings.account.invoiceDownload" : "Ãoslódáil",
140 "settings.account.manageSubscription.label" : "Bainistigh do shíntiús", 187 "settings.account.manageSubscription.label" : "Bainistigh do shíntiús",
141 "settings.account.successInfo" : "Sábháladh do chuid athruithe", 188 "settings.account.successInfo" : "Sábháladh do chuid athruithe",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Atriail", 192 "settings.account.tryReloadServices" : "Atriail",
143 "settings.account.tryReloadUserInfoRequest" : "Atriail", 193 "settings.account.tryReloadUserInfoRequest" : "Atriail",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Ní féidir eolas úsáideora a lódáil", 195 "settings.account.userInfoRequestFailed" : "Ní féidir eolas úsáideora a lódáil",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Glan taisce", 197 "settings.app.buttonClearAllCache" : "Glan taisce",
146 "settings.app.buttonInstallUpdate" : "Atosaigh ⊠suiteáil nuashonrú", 198 "settings.app.buttonInstallUpdate" : "Atosaigh ⊠suiteáil nuashonrú",
147 "settings.app.buttonSearchForUpdate" : "Cuardaigh le nuashonruithe", 199 "settings.app.buttonSearchForUpdate" : "Cuardaigh le nuashonruithe",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Join the Dark Side", 205 "settings.app.form.darkMode" : "Join the Dark Side",
154 "settings.app.form.enableGPUAcceleration" : "Cumasaigh luasghéarú APG", 206 "settings.app.form.enableGPUAcceleration" : "Cumasaigh luasghéarú APG",
155 "settings.app.form.enableSpellchecking" : "Cumasaigh seiceáil litrithe", 207 "settings.app.form.enableSpellchecking" : "Cumasaigh seiceáil litrithe",
156 "settings.app.form.enableSystemTray" : "Taispeáin Ferdi i dtráidire an chórais", 208 "settings.app.form.enableSystemTray" : "Taispeáin Franz i dtráidire an chórais",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Teanga", 210 "settings.app.form.language" : "Teanga",
158 "settings.app.form.minimizeToSystemTray" : "Ãoslaghdaigh Ferdi chuig tráidire an chórais", 211 "settings.app.form.minimizeToSystemTray" : "Ãoslaghdaigh Ferdi chuig tráidire an chórais",
159 "settings.app.form.runInBackground" : "Coimeád Ferdi sa chúlra nuair a dhúntar an fhuinneog", 212 "settings.app.form.runInBackground" : "Coimeád Ferdi sa chúlra nuair a dhúntar an fhuinneog",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Do sheirbhísí", 235 "settings.navigation.yourServices" : "Do sheirbhísí",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Gach seirbhís", 237 "settings.recipes.all" : "Gach seirbhís",
185 "settings.recipes.dev" : "Forbairt", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Seirbhísí le fáil", 245 "settings.recipes.headline" : "Seirbhísí le fáil",
187 "settings.recipes.missingService" : "Seirbhís ar iarraidh?", 246 "settings.recipes.missingService" : "Seirbhís ar iarraidh?",
188 "settings.recipes.mostPopular" : "Is coitianta", 247 "settings.recipes.mostPopular" : "Is coitianta",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Socruithe", 334 "sidebar.settings" : "Socruithe",
276 "sidebar.unmuteApp" : "Cumasaigh fógraí ⊠fuaim", 335 "sidebar.unmuteApp" : "Cumasaigh fógraí ⊠fuaim",
277 "signup.company.label" : "Comhlacht",
278 "signup.email.label" : "Seoladh ríomhphoist", 336 "signup.email.label" : "Seoladh ríomhphoist",
279 "signup.emailDuplicate" : "Tá úsáideoir leis an seoladh ríomhphoist sin cheana féin", 337 "signup.emailDuplicate" : "Tá úsáideoir leis an seoladh ríomhphoist sin cheana féin",
280 "signup.firstname.label" : "Céadainm", 338 "signup.firstname.label" : "Céadainm",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "saor in aisce", 358 "subscription.type.free" : "saor in aisce",
301 "subscription.type.month" : "mí", 359 "subscription.type.month" : "mí",
302 "subscription.type.year" : "bliain", 360 "subscription.type.year" : "bliain",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Cealaigh", 367 "subscriptionPopup.buttonCancel" : "Cealaigh",
304 "subscriptionPopup.buttonDone" : "Déanta", 368 "subscriptionPopup.buttonDone" : "Déanta",
305 "tabs.item.deleteService" : "Scrios seirbhís", 369 "tabs.item.deleteService" : "Scrios seirbhís",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index f77c4a185..cb2e3e88c 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -1,23 +1,33 @@
1{ 1{
2 "app.errorHandler.action" : "Ponovno uÄitavanje", 2 "app.errorHandler.action" : "Ponovno uÄitavanje",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Something went wrong",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Get a Ferdi Supporter License", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.headline" : "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.delayApp.text" : "Ferdi will continue in {seconds} seconds.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Get a Franz Supporter License",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Send as email", 13 "feature.shareFranz.action.email" : "Send as email",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 14 "feature.shareFranz.action.facebook" : "Share on Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 15 "feature.shareFranz.action.twitter" : "Share on Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Nije se moguće povezati na Francove on-line servise. ", 23 "global.api.unhealthy" : "Nije se moguće povezati na Francove on-line servise. ",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Sada ste povezani s internetom. ", 25 "global.notConnectedToTheInternet" : "Sada ste povezani s internetom. ",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 26 "global.spellchecker.useDefault" : "Use System Default ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Spell checking language", 29 "global.spellchecking.language" : "Spell checking language",
30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
21 "import.headline" : "Uvezite svoje Franc 4 servise. ", 31 "import.headline" : "Uvezite svoje Franc 4 servise. ",
22 "import.notSupportedHeadline" : "Franc 5 trenutno ne podržava taj servis", 32 "import.notSupportedHeadline" : "Franc 5 trenutno ne podržava taj servis",
23 "import.skip.label" : "Želim ruÄno dodati ove usluge", 33 "import.skip.label" : "Želim ruÄno dodati ove usluge",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Ponovo uÄitaj servise", 37 "infobar.buttonReloadServices" : "Ponovo uÄitaj servise",
28 "infobar.requiredRequestsFailed" : "Nemoguće uÄitati servise i korisniÄke informacije", 38 "infobar.requiredRequestsFailed" : "Nemoguće uÄitati servise i korisniÄke informacije",
29 "infobar.servicesUpdated" : "Vaši servisi su ažurirani. ", 39 "infobar.servicesUpdated" : "Vaši servisi su ažurirani. ",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Novo ažuriranje Franz-a je dostupno. ", 41 "infobar.updateAvailable" : "Novo ažuriranje Franz-a je dostupno. ",
31 "invite.email.label" : "Vaša e-adresa:", 42 "invite.email.label" : "Vaša e-adresa:",
32 "invite.headline.friends" : "Pozovite 3 vaša prijatelja ili kolege", 43 "invite.headline.friends" : "Pozovite 3 vaša prijatelja ili kolege",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.", 54 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.",
44 "login.submit.label" : "Prijavite se", 55 "login.submit.label" : "Prijavite se",
45 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 56 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "O aplikaciji", 59 "menu.app.about" : "O aplikaciji",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Potraži ažuriranja", 61 "menu.app.checkForUpdates" : "Potraži ažuriranja",
@@ -68,6 +81,9 @@
68 "menu.file" : "File", 81 "menu.file" : "File",
69 "menu.help" : "Help", 82 "menu.help" : "Help",
70 "menu.help.changelog" : "Changelog", 83 "menu.help.changelog" : "Changelog",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Learn More", 87 "menu.help.learnMore" : "Learn More",
72 "menu.help.privacy" : "Izjava o privatnosti ", 88 "menu.help.privacy" : "Izjava o privatnosti ",
73 "menu.help.support" : "Support", 89 "menu.help.support" : "Support",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Add New Service...", 93 "menu.services.addNewService" : "Add New Service...",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "View", 96 "menu.view" : "View",
80 "menu.view.enterFullScreen" : "Enter Full Screen", 97 "menu.view.enterFullScreen" : "Enter Full Screen",
81 "menu.view.exitFullScreen" : "Exit Full Screen", 98 "menu.view.exitFullScreen" : "Exit Full Screen",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Toggle Developer Tools", 102 "menu.view.toggleDevTools" : "Toggle Developer Tools",
86 "menu.view.toggleFullScreen" : "Toggle Full Screen", 103 "menu.view.toggleFullScreen" : "Toggle Full Screen",
87 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 104 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Zoom In", 106 "menu.view.zoomIn" : "Zoom In",
89 "menu.view.zoomOut" : "Zoom Out", 107 "menu.view.zoomOut" : "Zoom Out",
90 "menu.window" : "Window", 108 "menu.window" : "Window",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Pošalji", 121 "password.submit.label" : "Pošalji",
104 "password.successInfo" : "Molimo Vas da provjerite svoju e-mail adresu", 122 "password.successInfo" : "Molimo Vas da provjerite svoju e-mail adresu",
105 "premiumFeature.button.upgradeAccount" : "Upgrade account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade account",
106 "pricing.headline" : "Podržite Ferdi aplikaciju", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Ne želim da podržim razvoj Franz-a.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Želim da podržim razvoj Franz-a.", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Izaberite vaš plan za podržavanje", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Osvježi okvir", 151 "service.crashHandler.action" : "Osvježi okvir",
111 "service.crashHandler.autoReload" : "Pokušati ću automatski povratiti {ime} u {sekundi} sekundi", 152 "service.crashHandler.autoReload" : "Pokušati ću automatski povratiti {ime} u {sekundi} sekundi",
112 "service.crashHandler.headline" : "O, ne! ", 153 "service.crashHandler.headline" : "O, ne! ",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "O, ne! ", 159 "service.errorHandler.headline" : "O, ne! ",
119 "service.errorHandler.message" : "Greška", 160 "service.errorHandler.message" : "Greška",
120 "service.errorHandler.text" : "{name} has failed to load.", 161 "service.errorHandler.text" : "{name} has failed to load.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "ZapoÄnimo!", 168 "services.getStarted" : "ZapoÄnimo!",
123 "services.welcome" : "Dobrodošli u Franz", 169 "services.welcome" : "Dobrodošli u Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Promijenite lozinku", 181 "settings.account.headlinePassword" : "Promijenite lozinku",
136 "settings.account.headlineProfile" : "Ažurirajte profil", 182 "settings.account.headlineProfile" : "Ažurirajte profil",
137 "settings.account.headlineSubscription" : "Vaša pretplata", 183 "settings.account.headlineSubscription" : "Vaša pretplata",
138 "settings.account.headlineUpgrade" : "Nadogradite raÄun i podržite Franc", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Preuzmite", 186 "settings.account.invoiceDownload" : "Preuzmite",
140 "settings.account.manageSubscription.label" : "Upravljajte pretplatama", 187 "settings.account.manageSubscription.label" : "Upravljajte pretplatama",
141 "settings.account.successInfo" : "Vaše promjene su spremljene", 188 "settings.account.successInfo" : "Vaše promjene su spremljene",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Pokušajte ponovno", 192 "settings.account.tryReloadServices" : "Pokušajte ponovno",
143 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno", 193 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Nije moguće uÄitati informacije o korisniku", 195 "settings.account.userInfoRequestFailed" : "Nije moguće uÄitati informacije o korisniku",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "OÄisti memoriju", 197 "settings.app.buttonClearAllCache" : "OÄisti memoriju",
146 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje", 198 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje",
147 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja", 199 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja",
@@ -154,6 +206,7 @@
154 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 206 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
155 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 207 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
156 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 208 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Jezik", 210 "settings.app.form.language" : "Jezik",
158 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku", 211 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku",
159 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren", 212 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Vaše usluge", 235 "settings.navigation.yourServices" : "Vaše usluge",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Sve usluge", 237 "settings.recipes.all" : "Sve usluge",
185 "settings.recipes.dev" : "Razvoj", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Dostupne usluge", 245 "settings.recipes.headline" : "Dostupne usluge",
187 "settings.recipes.missingService" : "Da li neki servis nedostaje?", 246 "settings.recipes.missingService" : "Da li neki servis nedostaje?",
188 "settings.recipes.mostPopular" : "Najpopularniji", 247 "settings.recipes.mostPopular" : "Najpopularniji",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Postavke", 334 "sidebar.settings" : "Postavke",
276 "sidebar.unmuteApp" : "Omogući obavijesti i zvuk", 335 "sidebar.unmuteApp" : "Omogući obavijesti i zvuk",
277 "signup.company.label" : "Tvrtka",
278 "signup.email.label" : "Vaša e-adresa", 336 "signup.email.label" : "Vaša e-adresa",
279 "signup.emailDuplicate" : "Već postoji korisnik s tom e-mail adresom", 337 "signup.emailDuplicate" : "Već postoji korisnik s tom e-mail adresom",
280 "signup.firstname.label" : "Ime", 338 "signup.firstname.label" : "Ime",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "Imate raÄun? Prijavite se.", 344 "signup.link.login" : "Imate raÄun? Prijavite se.",
287 "signup.password.label" : "Lozinka", 345 "signup.password.label" : "Lozinka",
288 "signup.submit.label" : "Napravite novi raÄun", 346 "signup.submit.label" : "Napravite novi raÄun",
289 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje ", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Bez reklama, doživotno!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "Dolazi uskoro", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Proxy support for services", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Support for spellchecker",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Plaćeni\/Premium raÄun ukljuÄuje sljedeće: ",
298 "subscription.paymentSessionError" : "Nemoguće inicijalizirati obrazac za uplatu",
299 "subscription.submit.label" : "Želim da podržim razvoj Franca. ",
300 "subscription.type.free" : "Slobodno",
301 "subscription.type.month" : "mjesec",
302 "subscription.type.year" : "godina",
303 "subscriptionPopup.buttonCancel" : "Odustani", 353 "subscriptionPopup.buttonCancel" : "Odustani",
304 "subscriptionPopup.buttonDone" : "Završeno", 354 "subscriptionPopup.buttonDone" : "Završeno",
305 "tabs.item.deleteService" : "Izbriši servis", 355 "tabs.item.deleteService" : "Izbriši servis",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 50f5e72d3..d90a7245a 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -1,25 +1,35 @@
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" : "Ferdi {version} változásai", 4 "feature.announcements.changelog.headline" : "Franz {version} változásai",
5 "feature.delayApp.action" : "Szerezz egy Ferdi 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", 5 "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 Ferdi továbblép {seconds} másodperc múlva.", 6 "feature.delayApp.text" : "A Franz továbblép {seconds} másodperc múlva.",
7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Szerezz egy Franz Támogatói Liszencet",
11 "feature.delayApp.upgrade.actionShort" : "Fiók frissítése",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Küldés email-ben", 13 "feature.shareFranz.action.email" : "Küldés email-ben",
9 "feature.shareFranz.action.facebook" : "Megosztás Facebook-on", 14 "feature.shareFranz.action.facebook" : "Megosztás Facebook-on",
10 "feature.shareFranz.action.twitter" : "Megosztás Twitter-en", 15 "feature.shareFranz.action.twitter" : "Megosztás Twitter-en",
11 "feature.shareFranz.headline" : "A Ferdi barátokkal együtt mégjobb!", 16 "feature.shareFranz.headline" : "A Ferdi barátokkal együtt mégjobb!",
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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
15 "global.api.unhealthy" : "Nem lehet csatlakozni a Ferdi online szolgáltatáshoz", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.", 25 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.",
17 "global.spellchecker.useDefault" : "Rendszer alapbeállítás használata ({default})", 26 "global.spellchecker.useDefault" : "Rendszer alapbeállítás használata ({default})",
18 "global.spellchecking.autodetect" : "Automatikus nyelvdetektálás", 27 "global.spellchecking.autodetect" : "Automatikus nyelvdetektálás",
19 "global.spellchecking.autodetect.short" : "Automatikus", 28 "global.spellchecking.autodetect.short" : "Automatikus",
20 "global.spellchecking.language" : "Helyesírás-ellenőrző nyelve", 29 "global.spellchecking.language" : "Helyesírás-ellenőrző nyelve",
21 "import.headline" : "Importáld szolgáltatásaidat a Ferdi 4-ből", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Még nem támogatott szolgáltatások a Ferdi 5-ben", 31 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből",
32 "import.notSupportedHeadline" : "Még nem támogatott szolgáltatások a Franz 5-ben",
23 "import.skip.label" : "Manuálisan szeretném hozzáadni a szolgáltatásokat", 33 "import.skip.label" : "Manuálisan szeretném hozzáadni a szolgáltatásokat",
24 "import.submit.label" : "Szolgáltatások importálása", 34 "import.submit.label" : "Szolgáltatások importálása",
25 "infobar.buttonChangelog" : "Mi változott?", 35 "infobar.buttonChangelog" : "Mi változott?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Szolgáltatások újratöltése", 37 "infobar.buttonReloadServices" : "Szolgáltatások újratöltése",
28 "infobar.requiredRequestsFailed" : "Szolgáltatások és felhasználói információk nem tölthetők be", 38 "infobar.requiredRequestsFailed" : "Szolgáltatások és felhasználói információk nem tölthetők be",
29 "infobar.servicesUpdated" : "A szolgáltatások frissítésre kerültek.", 39 "infobar.servicesUpdated" : "A szolgáltatások frissítésre kerültek.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Új frissítés érhető el a Franz-hoz.", 41 "infobar.updateAvailable" : "Új frissítés érhető el a Franz-hoz.",
31 "invite.email.label" : "Email cím", 42 "invite.email.label" : "Email cím",
32 "invite.headline.friends" : "Hívd meg 3 barátodat vagy kollégádat", 43 "invite.headline.friends" : "Hívd meg 3 barátodat vagy kollégádat",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "A munkamenet lejárt, kérlek lépj be újra.", 54 "login.serverLogout" : "A munkamenet lejárt, kérlek lépj be újra.",
44 "login.submit.label" : "Bejelentkezés", 55 "login.submit.label" : "Bejelentkezés",
45 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.", 56 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Névjegy", 59 "menu.app.about" : "Névjegy",
47 "menu.app.announcement" : "Mi újság?", 60 "menu.app.announcement" : "Mi újság?",
48 "menu.app.checkForUpdates" : "Frissítések keresése", 61 "menu.app.checkForUpdates" : "Frissítések keresése",
@@ -68,6 +81,9 @@
68 "menu.file" : "Fájl", 81 "menu.file" : "Fájl",
69 "menu.help" : "Súgó", 82 "menu.help" : "Súgó",
70 "menu.help.changelog" : "Változások listája", 83 "menu.help.changelog" : "Változások listája",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Tudjon meg többet", 87 "menu.help.learnMore" : "Tudjon meg többet",
72 "menu.help.privacy" : "Adatvédelmi Nyilatkozatot", 88 "menu.help.privacy" : "Adatvédelmi Nyilatkozatot",
73 "menu.help.support" : "Támogatás", 89 "menu.help.support" : "Támogatás",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Előző szolgáltatás", 92 "menu.services.activatePreviousService" : "Előző szolgáltatás",
77 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...", 93 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...",
78 "menu.services.setNextServiceActive" : "Következő szolgáltatás", 94 "menu.services.setNextServiceActive" : "Következő szolgáltatás",
95 "menu.todos" : "Todos",
79 "menu.view" : "Nézet", 96 "menu.view" : "Nézet",
80 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból", 97 "menu.view.enterFullScreen" : "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", 98 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Fejlesztői eszközök ki\/bekapcsolása", 102 "menu.view.toggleDevTools" : "Fejlesztői eszközök ki\/bekapcsolása",
86 "menu.view.toggleFullScreen" : "Teljes képernyős mód ki\/bekapcsolása", 103 "menu.view.toggleFullScreen" : "Teljes képernyős mód ki\/bekapcsolása",
87 "menu.view.toggleServiceDevTools" : "Szolgáltatás Fejlesztői Eszközök ki\/bekapcsolása", 104 "menu.view.toggleServiceDevTools" : "Szolgáltatás Fejlesztői Eszközök ki\/bekapcsolása",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Nagyítás", 106 "menu.view.zoomIn" : "Nagyítás",
89 "menu.view.zoomOut" : "Kicsinyítés", 107 "menu.view.zoomOut" : "Kicsinyítés",
90 "menu.window" : "Ablak", 108 "menu.window" : "Ablak",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Küldés", 121 "password.submit.label" : "Küldés",
104 "password.successInfo" : "Ellenőrizd az email fiókodat", 122 "password.successInfo" : "Ellenőrizd az email fiókodat",
105 "premiumFeature.button.upgradeAccount" : "Fiók frissítése", 123 "premiumFeature.button.upgradeAccount" : "Fiók frissítése",
106 "pricing.headline" : "Támogasd a Franz-ot", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Nem szeretném támogatni a Ferdi fejlesztését.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Támogatni szeretném a Ferdi fejlesztését", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Válaszd ki a támogatás módját", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Munkaterületek",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "{name} újratöltése", 151 "service.crashHandler.action" : "{name} újratöltése",
111 "service.crashHandler.autoReload" : "{name} automatikusan helyreállítása {seconds} másodpercen belül", 152 "service.crashHandler.autoReload" : "{name} automatikusan helyreállítása {seconds} másodpercen belül",
112 "service.crashHandler.headline" : "Jajj ne!", 153 "service.crashHandler.headline" : "Jajj ne!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Jajj ne!", 159 "service.errorHandler.headline" : "Jajj ne!",
119 "service.errorHandler.message" : "Hiba", 160 "service.errorHandler.message" : "Hiba",
120 "service.errorHandler.text" : "{name} nem tudott betöltődni.", 161 "service.errorHandler.text" : "{name} nem tudott betöltődni.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Betöltés", 167 "service.webviewLoader.loading" : "Betöltés",
122 "services.getStarted" : "Kezdj hozzá", 168 "services.getStarted" : "Kezdj hozzá",
123 "services.welcome" : "Üdvözöl a Franz", 169 "services.welcome" : "Üdvözöl a Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Jelszócsere", 181 "settings.account.headlinePassword" : "Jelszócsere",
136 "settings.account.headlineProfile" : "Profil frissítése", 182 "settings.account.headlineProfile" : "Profil frissítése",
137 "settings.account.headlineSubscription" : "Előfizetésed", 183 "settings.account.headlineSubscription" : "Előfizetésed",
138 "settings.account.headlineUpgrade" : "Frissítsd fiókod és támogasd a Franz-ot", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Letöltés", 186 "settings.account.invoiceDownload" : "Letöltés",
140 "settings.account.manageSubscription.label" : "Előfizetés kezelése", 187 "settings.account.manageSubscription.label" : "Előfizetés kezelése",
141 "settings.account.successInfo" : "A módosításokat elmentettük", 188 "settings.account.successInfo" : "A módosításokat elmentettük",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Próbáld újra", 192 "settings.account.tryReloadServices" : "Próbáld újra",
143 "settings.account.tryReloadUserInfoRequest" : "Próbáld újra", 193 "settings.account.tryReloadUserInfoRequest" : "Próbáld újra",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "A felhasználói adatok betöltése sikertelen", 195 "settings.account.userInfoRequestFailed" : "A felhasználói adatok betöltése sikertelen",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Gyorsítótár törlése", 197 "settings.app.buttonClearAllCache" : "Gyorsítótár törlése",
146 "settings.app.buttonInstallUpdate" : "Újraindítás és frissítések telepítése", 198 "settings.app.buttonInstallUpdate" : "Újraindítás és frissítések telepítése",
147 "settings.app.buttonSearchForUpdate" : "Frissítések keresése", 199 "settings.app.buttonSearchForUpdate" : "Frissítések keresése",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Csatlakozz a Sötét Oldalhoz", 205 "settings.app.form.darkMode" : "Csatlakozz a Sötét Oldalhoz",
154 "settings.app.form.enableGPUAcceleration" : "Hardveres gyorsítás engedélyezése", 206 "settings.app.form.enableGPUAcceleration" : "Hardveres gyorsítás engedélyezése",
155 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése", 207 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése",
156 "settings.app.form.enableSystemTray" : "Ferdi mutatása a tálcán", 208 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Nyelv", 210 "settings.app.form.language" : "Nyelv",
158 "settings.app.form.minimizeToSystemTray" : "Ferdi kicsinyítése a tálcára", 211 "settings.app.form.minimizeToSystemTray" : "Ferdi kicsinyítése a tálcára",
159 "settings.app.form.runInBackground" : "Ferdi fusson a háttérben az ablak bezárásakor", 212 "settings.app.form.runInBackground" : "Ferdi fusson a háttérben az ablak bezárásakor",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Szolgáltatásaid", 235 "settings.navigation.yourServices" : "Szolgáltatásaid",
183 "settings.navigation.yourWorkspaces" : "Munkaterületeid", 236 "settings.navigation.yourWorkspaces" : "Munkaterületeid",
184 "settings.recipes.all" : "Összes szolgáltatás", 237 "settings.recipes.all" : "Összes szolgáltatás",
185 "settings.recipes.dev" : "Fejlesztés", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Elérhető szolgáltatások", 245 "settings.recipes.headline" : "Elérhető szolgáltatások",
187 "settings.recipes.missingService" : "Hiányzik egy szolgáltatás?", 246 "settings.recipes.missingService" : "Hiányzik egy szolgáltatás?",
188 "settings.recipes.mostPopular" : "Legnépszerűbb", 247 "settings.recipes.mostPopular" : "Legnépszerűbb",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Munkaterület panel megnyitása", 333 "sidebar.openWorkspaceDrawer" : "Munkaterület panel megnyitása",
275 "sidebar.settings" : "Beállítások", 334 "sidebar.settings" : "Beállítások",
276 "sidebar.unmuteApp" : "Értesítések és hangok engedélyezése", 335 "sidebar.unmuteApp" : "Értesítések és hangok engedélyezése",
277 "signup.company.label" : "Cég",
278 "signup.email.label" : "Email cím", 336 "signup.email.label" : "Email cím",
279 "signup.emailDuplicate" : "Ezzel az e-mail címmel már létezik felhasználó", 337 "signup.emailDuplicate" : "Ezzel az e-mail címmel már létezik felhasználó",
280 "signup.firstname.label" : "Keresztnév", 338 "signup.firstname.label" : "Keresztnév",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "ingyenes", 358 "subscription.type.free" : "ingyenes",
301 "subscription.type.month" : "hónap", 359 "subscription.type.month" : "hónap",
302 "subscription.type.year" : "év", 360 "subscription.type.year" : "év",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Mégsem", 367 "subscriptionPopup.buttonCancel" : "Mégsem",
304 "subscriptionPopup.buttonDone" : "Kész", 368 "subscriptionPopup.buttonDone" : "Kész",
305 "tabs.item.deleteService" : "Szolgáltatás törlése", 369 "tabs.item.deleteService" : "Szolgáltatás törlése",
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 437be8e5c..c27e96acb 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Muat Ulang", 2 "app.errorHandler.action" : "Muat Ulang",
3 "app.errorHandler.headline" : "Terjadi kesalahan", 3 "app.errorHandler.headline" : "Terjadi kesalahan",
4 "feature.announcements.changelog.headline" : "Perubahan dalam Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Perubahan dalam Franz {version}",
5 "feature.delayApp.action" : "Dapatkan Lisensi Pendukung Franz", 5 "feature.delayApp.headline" : "Beli Lisensi Pendukung Franz agar tidak perlu menunggu",
6 "feature.delayApp.headline" : "Beli Lisensi Pendukung Ferdi agar tidak perlu menunggu", 6 "feature.delayApp.text" : "Franz akan melanjutkan dalam {seconds} detik.",
7 "feature.delayApp.text" : "Ferdi akan melanjutkan dalam {seconds} detik.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Dapatkan Lisensi Pendukung Franz",
11 "feature.delayApp.upgrade.actionShort" : "Tingkatkan akun",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Kirim sebagai email", 13 "feature.shareFranz.action.email" : "Kirim sebagai email",
9 "feature.shareFranz.action.facebook" : "Bagikan di Facebook", 14 "feature.shareFranz.action.facebook" : "Bagikan di Facebook",
10 "feature.shareFranz.action.twitter" : "Bagikan di Twitter", 15 "feature.shareFranz.action.twitter" : "Bagikan di Twitter",
11 "feature.shareFranz.headline" : "Ferdi lebih baik bersama!", 16 "feature.shareFranz.headline" : "Ferdi lebih baik bersama!",
12 "feature.shareFranz.shareText.email" : "Saya telah menambahkan layanan {count} ke Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.meetfranz.com", 17 "feature.shareFranz.shareText.email" : "Saya telah menambahkan layanan {count} ke Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Saya telah menambahkan {count} layanan di Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan lainnya di www.meetfranz.com \/cc @FranzMessenger", 18 "feature.shareFranz.shareText.twitter" : "Saya telah menambahkan {count} layanan di Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan lainnya di www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Beri tahu teman dan kolega Anda betapa hebatnya Ferdi dan bantu kami menyebarkan berita.", 19 "feature.shareFranz.text" : "Beri tahu teman dan kolega Anda betapa hebatnya Franz dan bantu kami menyebarkan berita.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz", 23 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.", 25 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.",
17 "global.spellchecker.useDefault" : "Gunakan Bawaan Sistem ({default})", 26 "global.spellchecker.useDefault" : "Gunakan Bawaan Sistem ({default})",
18 "global.spellchecking.autodetect" : "Deteksi bahasa secara otomatis", 27 "global.spellchecking.autodetect" : "Deteksi bahasa secara otomatis",
19 "global.spellchecking.autodetect.short" : "Otomatis", 28 "global.spellchecking.autodetect.short" : "Otomatis",
20 "global.spellchecking.language" : "Periksa ejaan", 29 "global.spellchecking.language" : "Periksa ejaan",
21 "import.headline" : "Impor layanan Ferdi 4 Anda", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Layanan belum didukung di Ferdi 5", 31 "import.headline" : "Impor layanan Franz 4 Anda",
32 "import.notSupportedHeadline" : "Layanan belum didukung di Franz 5",
23 "import.skip.label" : "Saya ingin menambahkan layanan secara manual", 33 "import.skip.label" : "Saya ingin menambahkan layanan secara manual",
24 "import.submit.label" : "Impor layanan", 34 "import.submit.label" : "Impor layanan",
25 "infobar.buttonChangelog" : "Yang baru", 35 "infobar.buttonChangelog" : "Yang baru",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Muat ulang layanan", 37 "infobar.buttonReloadServices" : "Muat ulang layanan",
28 "infobar.requiredRequestsFailed" : "Gagal memuat layanan dan informasi pengguna", 38 "infobar.requiredRequestsFailed" : "Gagal memuat layanan dan informasi pengguna",
29 "infobar.servicesUpdated" : "Layanan Anda telah diperbarui", 39 "infobar.servicesUpdated" : "Layanan Anda telah diperbarui",
30 "infobar.updateAvailable" : "Versi baru Ferdi tersedia.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Versi baru Franz tersedia.",
31 "invite.email.label" : "Alamat email", 42 "invite.email.label" : "Alamat email",
32 "invite.headline.friends" : "Undang 3 teman atau kolega Anda", 43 "invite.headline.friends" : "Undang 3 teman atau kolega Anda",
33 "invite.name.label" : "Nama", 44 "invite.name.label" : "Nama",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.", 54 "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.",
44 "login.submit.label" : "Masuk", 55 "login.submit.label" : "Masuk",
45 "login.tokenExpired" : "Sesi Anda telah kedaluwarsa, silakan masuk kembali.", 56 "login.tokenExpired" : "Sesi Anda telah kedaluwarsa, silakan masuk kembali.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Tentang Franz", 59 "menu.app.about" : "Tentang Franz",
47 "menu.app.announcement" : "Yang baru", 60 "menu.app.announcement" : "Yang baru",
48 "menu.app.checkForUpdates" : "Periksa versi baru", 61 "menu.app.checkForUpdates" : "Periksa versi baru",
@@ -68,6 +81,9 @@
68 "menu.file" : "Berkas", 81 "menu.file" : "Berkas",
69 "menu.help" : "Bantuan", 82 "menu.help" : "Bantuan",
70 "menu.help.changelog" : "Log Perubahan", 83 "menu.help.changelog" : "Log Perubahan",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Pelajari Lebih Lanjut", 87 "menu.help.learnMore" : "Pelajari Lebih Lanjut",
72 "menu.help.privacy" : "Pernyataan Privasi", 88 "menu.help.privacy" : "Pernyataan Privasi",
73 "menu.help.support" : "Dukungan", 89 "menu.help.support" : "Dukungan",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Aktifkan layanan sebelumnya", 92 "menu.services.activatePreviousService" : "Aktifkan layanan sebelumnya",
77 "menu.services.addNewService" : "Tambahkan Layanan Baru...", 93 "menu.services.addNewService" : "Tambahkan Layanan Baru...",
78 "menu.services.setNextServiceActive" : "Aktifkan layanan berikutnya", 94 "menu.services.setNextServiceActive" : "Aktifkan layanan berikutnya",
95 "menu.todos" : "Todos",
79 "menu.view" : "Tampilan", 96 "menu.view" : "Tampilan",
80 "menu.view.enterFullScreen" : "Masuk ke Mode Layar Penuh", 97 "menu.view.enterFullScreen" : "Masuk ke Mode Layar Penuh",
81 "menu.view.exitFullScreen" : "Keluar dari Layar Penuh", 98 "menu.view.exitFullScreen" : "Keluar dari Layar Penuh",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Aktif\/Nonaktifkan alat pengembang", 102 "menu.view.toggleDevTools" : "Aktif\/Nonaktifkan alat pengembang",
86 "menu.view.toggleFullScreen" : "Aktif\/Nonaktifkan Layar Penuh", 103 "menu.view.toggleFullScreen" : "Aktif\/Nonaktifkan Layar Penuh",
87 "menu.view.toggleServiceDevTools" : "Aktif\/Nonaktifkan layanan alat pengembang", 104 "menu.view.toggleServiceDevTools" : "Aktif\/Nonaktifkan layanan alat pengembang",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Perbesar", 106 "menu.view.zoomIn" : "Perbesar",
89 "menu.view.zoomOut" : "Perkecil", 107 "menu.view.zoomOut" : "Perkecil",
90 "menu.window" : "Jendela", 108 "menu.window" : "Jendela",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Kirim", 121 "password.submit.label" : "Kirim",
104 "password.successInfo" : "Periksa email Anda", 122 "password.successInfo" : "Periksa email Anda",
105 "premiumFeature.button.upgradeAccount" : "Tingkatkan akun", 123 "premiumFeature.button.upgradeAccount" : "Tingkatkan akun",
106 "pricing.headline" : "Dukung Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Saya tidak ingin mendukung pengembangan Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Saya ingin mendukung pengembangan Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Pilih paket dukungan Anda", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Ruang kerja",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Muat Ulang {name}", 151 "service.crashHandler.action" : "Muat Ulang {name}",
111 "service.crashHandler.autoReload" : "Mencoba memulihkan {name} secara otomatis dalam {seconds} detik", 152 "service.crashHandler.autoReload" : "Mencoba memulihkan {name} secara otomatis dalam {seconds} detik",
112 "service.crashHandler.headline" : "Ya Ampun!", 153 "service.crashHandler.headline" : "Ya Ampun!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh tidak!", 159 "service.errorHandler.headline" : "Oh tidak!",
119 "service.errorHandler.message" : "Kesalahan", 160 "service.errorHandler.message" : "Kesalahan",
120 "service.errorHandler.text" : "{name} gagal dimuat", 161 "service.errorHandler.text" : "{name} gagal dimuat",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Memuat", 167 "service.webviewLoader.loading" : "Memuat",
122 "services.getStarted" : "Memulai", 168 "services.getStarted" : "Memulai",
123 "services.welcome" : "Selamat datang di Franz", 169 "services.welcome" : "Selamat datang di Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Ubah sandi", 181 "settings.account.headlinePassword" : "Ubah sandi",
136 "settings.account.headlineProfile" : "Perbarui profil", 182 "settings.account.headlineProfile" : "Perbarui profil",
137 "settings.account.headlineSubscription" : "Langganan Anda", 183 "settings.account.headlineSubscription" : "Langganan Anda",
138 "settings.account.headlineUpgrade" : "Tingkatkan akun Anda & dukung Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Unduh", 186 "settings.account.invoiceDownload" : "Unduh",
140 "settings.account.manageSubscription.label" : "Kelola langganan Anda", 187 "settings.account.manageSubscription.label" : "Kelola langganan Anda",
141 "settings.account.successInfo" : "Perubahan Anda telah disimpan", 188 "settings.account.successInfo" : "Perubahan Anda telah disimpan",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Coba lagi", 192 "settings.account.tryReloadServices" : "Coba lagi",
143 "settings.account.tryReloadUserInfoRequest" : "Coba lagi", 193 "settings.account.tryReloadUserInfoRequest" : "Coba lagi",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna", 195 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Bersihkan singgahan", 197 "settings.app.buttonClearAllCache" : "Bersihkan singgahan",
146 "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru", 198 "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru",
147 "settings.app.buttonSearchForUpdate" : "Periksa pembaruan", 199 "settings.app.buttonSearchForUpdate" : "Periksa pembaruan",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Sisi Kelam menunggu Anda (Mode Gelap)", 205 "settings.app.form.darkMode" : "Sisi Kelam menunggu Anda (Mode Gelap)",
154 "settings.app.form.enableGPUAcceleration" : "Aktifkan Akselerasi GPU", 206 "settings.app.form.enableGPUAcceleration" : "Aktifkan Akselerasi GPU",
155 "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan", 207 "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan",
156 "settings.app.form.enableSystemTray" : "Tampilkan Ferdi di baki sistem", 208 "settings.app.form.enableSystemTray" : "Tampilkan Franz di baki sistem",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Bahasa", 210 "settings.app.form.language" : "Bahasa",
158 "settings.app.form.minimizeToSystemTray" : "Perkecil Ferdi ke baki sistem", 211 "settings.app.form.minimizeToSystemTray" : "Perkecil Ferdi ke baki sistem",
159 "settings.app.form.runInBackground" : "Tetap jalankan Ferdi di latar belakang saat menutup jendela", 212 "settings.app.form.runInBackground" : "Tetap jalankan Ferdi di latar belakang saat menutup jendela",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Layanan Anda", 235 "settings.navigation.yourServices" : "Layanan Anda",
183 "settings.navigation.yourWorkspaces" : "Ruang kerja Anda", 236 "settings.navigation.yourWorkspaces" : "Ruang kerja Anda",
184 "settings.recipes.all" : "Semua layanan", 237 "settings.recipes.all" : "Semua layanan",
185 "settings.recipes.dev" : "Pengembangan", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Layanan tersedia", 245 "settings.recipes.headline" : "Layanan tersedia",
187 "settings.recipes.missingService" : "Layanan tidak tersedia?", 246 "settings.recipes.missingService" : "Layanan tidak tersedia?",
188 "settings.recipes.mostPopular" : "Terpopuler", 247 "settings.recipes.mostPopular" : "Terpopuler",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Buka laci ruang kerja", 333 "sidebar.openWorkspaceDrawer" : "Buka laci ruang kerja",
275 "sidebar.settings" : "Pengaturan", 334 "sidebar.settings" : "Pengaturan",
276 "sidebar.unmuteApp" : "Aktifkan pemberitahuan", 335 "sidebar.unmuteApp" : "Aktifkan pemberitahuan",
277 "signup.company.label" : "Perusahaan",
278 "signup.email.label" : "Alamat email", 336 "signup.email.label" : "Alamat email",
279 "signup.emailDuplicate" : "Pengguna dengan alamat email ini sudah ada", 337 "signup.emailDuplicate" : "Pengguna dengan alamat email ini sudah ada",
280 "signup.firstname.label" : "Nama Depan", 338 "signup.firstname.label" : "Nama Depan",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "Sudah punya akun, masuk?", 344 "signup.link.login" : "Sudah punya akun, masuk?",
287 "signup.password.label" : "Sandi", 345 "signup.password.label" : "Sandi",
288 "signup.submit.label" : "Buat akun", 346 "signup.submit.label" : "Buat akun",
289 "subscription.euTaxInfo" : "Warga UE: pajak penjualan lokal mungkin berlaku", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Tanpa iklan, selamanya!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "segera hadir", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "Tanpa menunggu dan ditanya untuk meningkatkan lisensi", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Integrasi layanan hosted, misalnya Mattermost", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Dukungan proksi untuk layanan", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Dukungan pengecek ejaan",
296 "subscription.features.workspaces" : "Kelola layanan Anda dalam ruang kerja",
297 "subscription.includedFeatures" : "Ferdi Premium Supporter Account berbayar menyertakan",
298 "subscription.paymentSessionError" : "Tidak bisa menginisialisasi formulir pembayaran",
299 "subscription.submit.label" : "Saya ingin mendukung pengembangan Franz",
300 "subscription.type.free" : "gratis",
301 "subscription.type.month" : "bulan",
302 "subscription.type.year" : "tahun",
303 "subscriptionPopup.buttonCancel" : "Batalkan", 353 "subscriptionPopup.buttonCancel" : "Batalkan",
304 "subscriptionPopup.buttonDone" : "Selesai", 354 "subscriptionPopup.buttonDone" : "Selesai",
305 "tabs.item.deleteService" : "Hapus layanan", 355 "tabs.item.deleteService" : "Hapus layanan",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 8492193fd..4f5cd39ad 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -1,25 +1,35 @@
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" : "Modifiche in Ferdi {Version}", 4 "feature.announcements.changelog.headline" : "Modifiche in Franz {Version}",
5 "feature.delayApp.action" : "Ricevi una Licenza Supporter di Franz", 5 "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 Ferdi per saltare l'attesa", 6 "feature.delayApp.text" : "Franz continuerà tra {seconds} secondi.",
7 "feature.delayApp.text" : "Ferdi continuerà tra {seconds} secondi.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Ricevi una Licenza Supporter di Franz",
11 "feature.delayApp.upgrade.actionShort" : "Effettua l'upgrade del tuo account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Manda come email", 13 "feature.shareFranz.action.email" : "Manda come email",
9 "feature.shareFranz.action.facebook" : "Condividi su Facebook", 14 "feature.shareFranz.action.facebook" : "Condividi su Facebook",
10 "feature.shareFranz.action.twitter" : "Condividi su Twitter", 15 "feature.shareFranz.action.twitter" : "Condividi su Twitter",
11 "feature.shareFranz.headline" : "Franze è migliore insieme!", 16 "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", 17 "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" : "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", 18 "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" : "Di’ ai tuoi amici e colleghi quanto Ferdi è fantastico e aiutaci a diffondere la parola.", 19 "feature.shareFranz.text" : "Di’ ai tuoi amici e colleghi quanto Franz è fantastico e aiutaci a diffondere la parola.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz", 23 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.", 25 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.",
17 "global.spellchecker.useDefault" : "Usa le impostazioni predefinite di sistema ({default})", 26 "global.spellchecker.useDefault" : "Usa le impostazioni predefinite di sistema ({default})",
18 "global.spellchecking.autodetect" : "Rileva automaticamente la lingua", 27 "global.spellchecking.autodetect" : "Rileva automaticamente la lingua",
19 "global.spellchecking.autodetect.short" : "Automatico", 28 "global.spellchecking.autodetect.short" : "Automatico",
20 "global.spellchecking.language" : "Lingua per controllo ortografico", 29 "global.spellchecking.language" : "Lingua per controllo ortografico",
21 "import.headline" : "Importa i servizi di Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Servizi non ancora supportati in Ferdi 5", 31 "import.headline" : "Importa i servizi di Franz 4",
32 "import.notSupportedHeadline" : "Servizi non ancora supportati in Franz 5",
23 "import.skip.label" : "Voglio aggiungere i servizi manualmente", 33 "import.skip.label" : "Voglio aggiungere i servizi manualmente",
24 "import.submit.label" : "Importa servizi", 34 "import.submit.label" : "Importa servizi",
25 "infobar.buttonChangelog" : "Cosa c'è di nuovo?", 35 "infobar.buttonChangelog" : "Cosa c'è di nuovo?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Ricarica servizi", 37 "infobar.buttonReloadServices" : "Ricarica servizi",
28 "infobar.requiredRequestsFailed" : "Impossibile caricare i servizi e le informazioni dell'utente", 38 "infobar.requiredRequestsFailed" : "Impossibile caricare i servizi e le informazioni dell'utente",
29 "infobar.servicesUpdated" : "I tuoi servizi sono stati aggiornati.", 39 "infobar.servicesUpdated" : "I tuoi servizi sono stati aggiornati.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "È disponibile un nuovo aggiornamento di Franz.", 41 "infobar.updateAvailable" : "È disponibile un nuovo aggiornamento di Franz.",
31 "invite.email.label" : "Indirizzo email", 42 "invite.email.label" : "Indirizzo email",
32 "invite.headline.friends" : "Invita 3 dei tuoi amici o colleghi", 43 "invite.headline.friends" : "Invita 3 dei tuoi amici o colleghi",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "La tua sessione è scaduta, per favore accedi di nuovo.", 54 "login.serverLogout" : "La tua sessione è scaduta, per favore accedi di nuovo.",
44 "login.submit.label" : "Accedi", 55 "login.submit.label" : "Accedi",
45 "login.tokenExpired" : "La tua sessione è scaduta, per favore accedi di nuovo.", 56 "login.tokenExpired" : "La tua sessione è scaduta, per favore accedi di nuovo.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Info su Franz", 59 "menu.app.about" : "Info su Franz",
47 "menu.app.announcement" : "Cosa c'è di nuovo?", 60 "menu.app.announcement" : "Cosa c'è di nuovo?",
48 "menu.app.checkForUpdates" : "Controlla aggiornamenti", 61 "menu.app.checkForUpdates" : "Controlla aggiornamenti",
@@ -68,6 +81,9 @@
68 "menu.file" : "File", 81 "menu.file" : "File",
69 "menu.help" : "Aiuto", 82 "menu.help" : "Aiuto",
70 "menu.help.changelog" : "Changelog", 83 "menu.help.changelog" : "Changelog",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Maggiori Informazioni", 87 "menu.help.learnMore" : "Maggiori Informazioni",
72 "menu.help.privacy" : "Dichiarazione della Privacy", 88 "menu.help.privacy" : "Dichiarazione della Privacy",
73 "menu.help.support" : "Supporto", 89 "menu.help.support" : "Supporto",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Attiva servizio precedente", 92 "menu.services.activatePreviousService" : "Attiva servizio precedente",
77 "menu.services.addNewService" : "Aggiungi Nuovo Servizio...", 93 "menu.services.addNewService" : "Aggiungi Nuovo Servizio...",
78 "menu.services.setNextServiceActive" : "Attiva servizio seguente", 94 "menu.services.setNextServiceActive" : "Attiva servizio seguente",
95 "menu.todos" : "Todos",
79 "menu.view" : "Visualizza", 96 "menu.view" : "Visualizza",
80 "menu.view.enterFullScreen" : "Visualizza a Schermo Intero", 97 "menu.view.enterFullScreen" : "Visualizza a Schermo Intero",
81 "menu.view.exitFullScreen" : "Esci da Schermo Intero", 98 "menu.view.exitFullScreen" : "Esci da Schermo Intero",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Attiva\/Disattiva Strumenti Sviluppo", 102 "menu.view.toggleDevTools" : "Attiva\/Disattiva Strumenti Sviluppo",
86 "menu.view.toggleFullScreen" : "Attiva\/Disattiva Schermo Intero", 103 "menu.view.toggleFullScreen" : "Attiva\/Disattiva Schermo Intero",
87 "menu.view.toggleServiceDevTools" : "Attiva\/Disattiva Strumenti per Sviluppatori di Servizi", 104 "menu.view.toggleServiceDevTools" : "Attiva\/Disattiva Strumenti per Sviluppatori di Servizi",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Aumenta Zoom", 106 "menu.view.zoomIn" : "Aumenta Zoom",
89 "menu.view.zoomOut" : "Diminuisci Zoom", 107 "menu.view.zoomOut" : "Diminuisci Zoom",
90 "menu.window" : "Finestra", 108 "menu.window" : "Finestra",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Invia", 121 "password.submit.label" : "Invia",
104 "password.successInfo" : "Per favore controlla la tua email", 122 "password.successInfo" : "Per favore controlla la tua email",
105 "premiumFeature.button.upgradeAccount" : "Effettua l'upgrade del tuo account", 123 "premiumFeature.button.upgradeAccount" : "Effettua l'upgrade del tuo account",
106 "pricing.headline" : "Supporta Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Seleziona la modalità di supporto", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Ricarica {name}", 151 "service.crashHandler.action" : "Ricarica {name}",
111 "service.crashHandler.autoReload" : "Tentativo di ripristino automatico di {name} in {seconds} secondi", 152 "service.crashHandler.autoReload" : "Tentativo di ripristino automatico di {name} in {seconds} secondi",
112 "service.crashHandler.headline" : "Oh no!", 153 "service.crashHandler.headline" : "Oh no!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh no!", 159 "service.errorHandler.headline" : "Oh no!",
119 "service.errorHandler.message" : "Errore", 160 "service.errorHandler.message" : "Errore",
120 "service.errorHandler.text" : "{name} non si è caricato correttamente.", 161 "service.errorHandler.text" : "{name} non si è caricato correttamente.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Caricamento", 167 "service.webviewLoader.loading" : "Caricamento",
122 "services.getStarted" : "Iniziamo", 168 "services.getStarted" : "Iniziamo",
123 "services.welcome" : "Benvenuto su Franz", 169 "services.welcome" : "Benvenuto su Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Cambia password", 181 "settings.account.headlinePassword" : "Cambia password",
136 "settings.account.headlineProfile" : "Aggiorna profilo", 182 "settings.account.headlineProfile" : "Aggiorna profilo",
137 "settings.account.headlineSubscription" : "Il tuo abbonamento", 183 "settings.account.headlineSubscription" : "Il tuo abbonamento",
138 "settings.account.headlineUpgrade" : "Aggiorna il tuo account e supporta Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Scarica", 186 "settings.account.invoiceDownload" : "Scarica",
140 "settings.account.manageSubscription.label" : "Gestisci il tuo abbonamento", 187 "settings.account.manageSubscription.label" : "Gestisci il tuo abbonamento",
141 "settings.account.successInfo" : "Le tue modifiche sono state salvate", 188 "settings.account.successInfo" : "Le tue modifiche sono state salvate",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Prova di nuovo", 192 "settings.account.tryReloadServices" : "Prova di nuovo",
143 "settings.account.tryReloadUserInfoRequest" : "Riprova", 193 "settings.account.tryReloadUserInfoRequest" : "Riprova",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Impossibile caricare le informazioni dell'utente.", 195 "settings.account.userInfoRequestFailed" : "Impossibile caricare le informazioni dell'utente.",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Svuota la cache", 197 "settings.app.buttonClearAllCache" : "Svuota la cache",
146 "settings.app.buttonInstallUpdate" : "Riavvia e installa l'aggiornamento", 198 "settings.app.buttonInstallUpdate" : "Riavvia e installa l'aggiornamento",
147 "settings.app.buttonSearchForUpdate" : "Controlla aggiornamenti", 199 "settings.app.buttonSearchForUpdate" : "Controlla aggiornamenti",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Unisciti al Lato Oscuro.", 205 "settings.app.form.darkMode" : "Unisciti al Lato Oscuro.",
154 "settings.app.form.enableGPUAcceleration" : "Attiva Accelerazione GPU", 206 "settings.app.form.enableGPUAcceleration" : "Attiva Accelerazione GPU",
155 "settings.app.form.enableSpellchecking" : "Attiva controllo ortografico", 207 "settings.app.form.enableSpellchecking" : "Attiva controllo ortografico",
156 "settings.app.form.enableSystemTray" : "Mostra Ferdi nell'area di notifica", 208 "settings.app.form.enableSystemTray" : "Mostra Franz nell'area di notifica",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Lingua", 210 "settings.app.form.language" : "Lingua",
158 "settings.app.form.minimizeToSystemTray" : "Minimizza Ferdi nell'area di notifica", 211 "settings.app.form.minimizeToSystemTray" : "Minimizza Ferdi nell'area di notifica",
159 "settings.app.form.runInBackground" : "Mantieni Ferdi in esecuzione quando chiudi la finestra", 212 "settings.app.form.runInBackground" : "Mantieni Ferdi in esecuzione quando chiudi la finestra",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "I tuoi servizi", 235 "settings.navigation.yourServices" : "I tuoi servizi",
183 "settings.navigation.yourWorkspaces" : "I tuoi workspaces", 236 "settings.navigation.yourWorkspaces" : "I tuoi workspaces",
184 "settings.recipes.all" : "Tutti i servizi", 237 "settings.recipes.all" : "Tutti i servizi",
185 "settings.recipes.dev" : "Sviluppo", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Servizi disponibili", 245 "settings.recipes.headline" : "Servizi disponibili",
187 "settings.recipes.missingService" : "Manca un servizio?", 246 "settings.recipes.missingService" : "Manca un servizio?",
188 "settings.recipes.mostPopular" : "Più popolari", 247 "settings.recipes.mostPopular" : "Più popolari",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Apri il menu dei workspace", 333 "sidebar.openWorkspaceDrawer" : "Apri il menu dei workspace",
275 "sidebar.settings" : "Impostazioni", 334 "sidebar.settings" : "Impostazioni",
276 "sidebar.unmuteApp" : "Attiva notifiche e audio", 335 "sidebar.unmuteApp" : "Attiva notifiche e audio",
277 "signup.company.label" : "Società",
278 "signup.email.label" : "Indirizzo email", 336 "signup.email.label" : "Indirizzo email",
279 "signup.emailDuplicate" : "Esiste già un utente con lo stesso indirizzo email", 337 "signup.emailDuplicate" : "Esiste già un utente con lo stesso indirizzo email",
280 "signup.firstname.label" : "Nome", 338 "signup.firstname.label" : "Nome",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "gratis", 358 "subscription.type.free" : "gratis",
301 "subscription.type.month" : "mese", 359 "subscription.type.month" : "mese",
302 "subscription.type.year" : "anno", 360 "subscription.type.year" : "anno",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Annulla", 367 "subscriptionPopup.buttonCancel" : "Annulla",
304 "subscriptionPopup.buttonDone" : "Fatto", 368 "subscriptionPopup.buttonDone" : "Fatto",
305 "tabs.item.deleteService" : "Elimina servizio", 369 "tabs.item.deleteService" : "Elimina servizio",
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 611c1ec80..490b938d0 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -1,10 +1,15 @@
1{ 1{
2 "app.errorHandler.action" : "å†èª­ã¿è¾¼ã¿", 2 "app.errorHandler.action" : "å†èª­ã¿è¾¼ã¿",
3 "app.errorHandler.headline" : "é–“é•ãˆã¦ã„る部分ãŒã‚ã‚Šã¾ã™", 3 "app.errorHandler.headline" : "é–“é•ãˆã¦ã„る部分ãŒã‚ã‚Šã¾ã™",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Franzサãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã™ã‚‹", 5 "feature.delayApp.headline" : "Franzã‚’ã™ãã«èµ·å‹•ã™ã‚‹ã«ã¯ã€Franz サãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã—ã¦ãã ã•ã„。",
6 "feature.delayApp.headline" : "Franzã‚’ã™ãã«èµ·å‹•ã™ã‚‹ã«ã¯ã€Ferdi サãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã—ã¦ãã ã•ã„。",
7 "feature.delayApp.text" : "Franzã¯ã‚ã¨{seconds}秒後ã«èµ·å‹•ã—ã¾ã™ã€‚", 6 "feature.delayApp.text" : "Franzã¯ã‚ã¨{seconds}秒後ã«èµ·å‹•ã—ã¾ã™ã€‚",
7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Franzサãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã™ã‚‹",
11 "feature.delayApp.upgrade.actionShort" : "アカウントをアップグレード",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "メールã§é€ä¿¡", 13 "feature.shareFranz.action.email" : "メールã§é€ä¿¡",
9 "feature.shareFranz.action.facebook" : "Facebookã§ã‚·ã‚§ã‚¢", 14 "feature.shareFranz.action.facebook" : "Facebookã§ã‚·ã‚§ã‚¢",
10 "feature.shareFranz.action.twitter" : "Twitterã§ã‚·ã‚§ã‚¢", 15 "feature.shareFranz.action.twitter" : "Twitterã§ã‚·ã‚§ã‚¢",
@@ -12,14 +17,19 @@
12 "feature.shareFranz.shareText.email" : "Franzã§{count}個ã®ã‚µãƒ¼ãƒ“スを使ã£ã¦ã„ã¾ã™ï¼ã‚ãªãŸã‚‚Gmail, Messenger, Slack, Skypeãªã©ã®ã‚µãƒ¼ãƒ“スをFranzã§ä¸€å…ƒç®¡ç†ã—ã¾ã—ょã†ï¼ www.meetfranz.com", 17 "feature.shareFranz.shareText.email" : "Franzã§{count}個ã®ã‚µãƒ¼ãƒ“スを使ã£ã¦ã„ã¾ã™ï¼ã‚ãªãŸã‚‚Gmail, Messenger, Slack, Skypeãªã©ã®ã‚µãƒ¼ãƒ“スをFranzã§ä¸€å…ƒç®¡ç†ã—ã¾ã—ょã†ï¼ 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", 18 "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" : "ã‚ãªãŸã®ãŠå‹é”ã«Franzã‚’æ•™ãˆã¦ã‚ã’ã¾ã—ょã†ã€‚", 19 "feature.shareFranz.text" : "ã‚ãªãŸã®ãŠå‹é”ã«Franzã‚’æ•™ãˆã¦ã‚ã’ã¾ã—ょã†ã€‚",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Franzã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚µãƒ¼ãƒ“スã«æŽ¥ç¶šã§ãã¾ã›ã‚“。", 23 "global.api.unhealthy" : "Franzã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚µãƒ¼ãƒ“スã«æŽ¥ç¶šã§ãã¾ã›ã‚“。",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。", 25 "global.notConnectedToTheInternet" : "インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。",
17 "global.spellchecker.useDefault" : " {default}ã‚’åˆæœŸè¨­å®šã§ä½¿ç”¨ã—ã¦ãã ã•ã„", 26 "global.spellchecker.useDefault" : " {default}ã‚’åˆæœŸè¨­å®šã§ä½¿ç”¨ã—ã¦ãã ã•ã„",
18 "global.spellchecking.autodetect" : "言語を自動的ã«æ¤œå‡ºã™ã‚‹", 27 "global.spellchecking.autodetect" : "言語を自動的ã«æ¤œå‡ºã™ã‚‹",
19 "global.spellchecking.autodetect.short" : "自動", 28 "global.spellchecking.autodetect.short" : "自動",
20 "global.spellchecking.language" : "スペルãƒã‚§ãƒƒã‚¯ã™ã‚‹è¨€èªž", 29 "global.spellchecking.language" : "スペルãƒã‚§ãƒƒã‚¯ã™ã‚‹è¨€èªž",
21 "import.headline" : "Ferdi 4ã®ã‚µãƒ¼ãƒ“スをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Ferdi 5ã§ã¯ã“ã®ã‚µãƒ¼ãƒ“スã«ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“", 31 "import.headline" : "Franz 4ã®ã‚µãƒ¼ãƒ“スをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„",
32 "import.notSupportedHeadline" : "Franz 5ã§ã¯ã“ã®ã‚µãƒ¼ãƒ“スã«ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“",
23 "import.skip.label" : "手動ã§ã‚µãƒ¼ãƒ“スを追加ã™ã‚‹", 33 "import.skip.label" : "手動ã§ã‚µãƒ¼ãƒ“スを追加ã™ã‚‹",
24 "import.submit.label" : "サービスをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„", 34 "import.submit.label" : "サービスをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„",
25 "infobar.buttonChangelog" : "更新履歴を見る", 35 "infobar.buttonChangelog" : "更新履歴を見る",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "サービスã®å†èª­ã¿è¾¼ã¿", 37 "infobar.buttonReloadServices" : "サービスã®å†èª­ã¿è¾¼ã¿",
28 "infobar.requiredRequestsFailed" : "サービスã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ", 38 "infobar.requiredRequestsFailed" : "サービスã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ",
29 "infobar.servicesUpdated" : "サービスãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚", 39 "infobar.servicesUpdated" : "サービスãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Franzã®æ›´æ–°ãŒã‚ã‚Šã¾ã™ã€‚", 41 "infobar.updateAvailable" : "Franzã®æ›´æ–°ãŒã‚ã‚Šã¾ã™ã€‚",
31 "invite.email.label" : "メールアドレス", 42 "invite.email.label" : "メールアドレス",
32 "invite.headline.friends" : "ã‚ãªãŸã®å‹äººã‚„åŒåƒšã®æ–¹ã‚’3åã¾ã§Franzã«æ‹›å¾…ã§ãã¾ã™", 43 "invite.headline.friends" : "ã‚ãªãŸã®å‹äººã‚„åŒåƒšã®æ–¹ã‚’3åã¾ã§Franzã«æ‹›å¾…ã§ãã¾ã™",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。", 54 "login.serverLogout" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。",
44 "login.submit.label" : "サインイン", 55 "login.submit.label" : "サインイン",
45 "login.tokenExpired" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。", 56 "login.tokenExpired" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±", 59 "menu.app.about" : "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "æ›´æ–°ã®ç¢ºèª", 61 "menu.app.checkForUpdates" : "æ›´æ–°ã®ç¢ºèª",
@@ -68,6 +81,9 @@
68 "menu.file" : "ファイル", 81 "menu.file" : "ファイル",
69 "menu.help" : "ヘルプ", 82 "menu.help" : "ヘルプ",
70 "menu.help.changelog" : "更新履歴", 83 "menu.help.changelog" : "更新履歴",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Franzã«ã¤ã„ã¦", 87 "menu.help.learnMore" : "Franzã«ã¤ã„ã¦",
72 "menu.help.privacy" : "プライãƒã‚·ãƒ¼ã«ã¤ã„ã¦", 88 "menu.help.privacy" : "プライãƒã‚·ãƒ¼ã«ã¤ã„ã¦",
73 "menu.help.support" : "サãƒãƒ¼ãƒˆ", 89 "menu.help.support" : "サãƒãƒ¼ãƒˆ",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "å‰ã®ã‚µãƒ¼ãƒ“スを有効ã«ã™ã‚‹", 92 "menu.services.activatePreviousService" : "å‰ã®ã‚µãƒ¼ãƒ“スを有効ã«ã™ã‚‹",
77 "menu.services.addNewService" : "サービスを追加", 93 "menu.services.addNewService" : "サービスを追加",
78 "menu.services.setNextServiceActive" : "次ã®ã‚µãƒ¼ãƒ“スを有効ã«ã™ã‚‹", 94 "menu.services.setNextServiceActive" : "次ã®ã‚µãƒ¼ãƒ“スを有効ã«ã™ã‚‹",
95 "menu.todos" : "Todos",
79 "menu.view" : "表示", 96 "menu.view" : "表示",
80 "menu.view.enterFullScreen" : "全画é¢è¡¨ç¤º", 97 "menu.view.enterFullScreen" : "全画é¢è¡¨ç¤º",
81 "menu.view.exitFullScreen" : "全画é¢è¡¨ç¤ºã‚’終了ã™ã‚‹", 98 "menu.view.exitFullScreen" : "全画é¢è¡¨ç¤ºã‚’終了ã™ã‚‹",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "開発者ツールを切り替ãˆ", 102 "menu.view.toggleDevTools" : "開発者ツールを切り替ãˆ",
86 "menu.view.toggleFullScreen" : "全画é¢è¡¨ç¤ºã®åˆ‡ã‚Šæ›¿ãˆ", 103 "menu.view.toggleFullScreen" : "全画é¢è¡¨ç¤ºã®åˆ‡ã‚Šæ›¿ãˆ",
87 "menu.view.toggleServiceDevTools" : "サービス開発者ツールを切り替ãˆ", 104 "menu.view.toggleServiceDevTools" : "サービス開発者ツールを切り替ãˆ",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "表示を拡大ã™ã‚‹", 106 "menu.view.zoomIn" : "表示を拡大ã™ã‚‹",
89 "menu.view.zoomOut" : "表示を縮å°ã™ã‚‹", 107 "menu.view.zoomOut" : "表示を縮å°ã™ã‚‹",
90 "menu.window" : "ウィンドウ", 108 "menu.window" : "ウィンドウ",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "é€ä¿¡", 121 "password.submit.label" : "é€ä¿¡",
104 "password.successInfo" : "メールを確èªã—ã¦ä¸‹ã•ã„", 122 "password.successInfo" : "メールを確èªã—ã¦ä¸‹ã•ã„",
105 "premiumFeature.button.upgradeAccount" : "アカウントをアップグレード", 123 "premiumFeature.button.upgradeAccount" : "アカウントをアップグレード",
106 "pricing.headline" : "Franzを支æ´ã™ã‚‹", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸããªã„。", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸã„。", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "プランをé¸æŠžã—ã¦ãã ã•ã„", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "{name}ã‚’å†èª­ã¿è¾¼ã¿", 151 "service.crashHandler.action" : "{name}ã‚’å†èª­ã¿è¾¼ã¿",
111 "service.crashHandler.autoReload" : "{seconds}秒後ã€è‡ªå‹•çš„ã«{name}ã®å¾©æ—§ã‚’試ã¿ã¾ã™", 152 "service.crashHandler.autoReload" : "{seconds}秒後ã€è‡ªå‹•çš„ã«{name}ã®å¾©æ—§ã‚’試ã¿ã¾ã™",
112 "service.crashHandler.headline" : "ã—ã¾ã£ãŸï¼", 153 "service.crashHandler.headline" : "ã—ã¾ã£ãŸï¼",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "ã—ã¾ã£ãŸï¼", 159 "service.errorHandler.headline" : "ã—ã¾ã£ãŸï¼",
119 "service.errorHandler.message" : "エラー", 160 "service.errorHandler.message" : "エラー",
120 "service.errorHandler.text" : "{name} ã¯ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ", 161 "service.errorHandler.text" : "{name} ã¯ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "ã¯ã˜ã‚ã‚‹", 168 "services.getStarted" : "ã¯ã˜ã‚ã‚‹",
123 "services.welcome" : "Franzã«ã‚ˆã†ã“ã", 169 "services.welcome" : "Franzã«ã‚ˆã†ã“ã",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "パスワードã®å¤‰æ›´", 181 "settings.account.headlinePassword" : "パスワードã®å¤‰æ›´",
136 "settings.account.headlineProfile" : "プロフィールã®æ›´æ–°", 182 "settings.account.headlineProfile" : "プロフィールã®æ›´æ–°",
137 "settings.account.headlineSubscription" : "ã‚ãªãŸã®ç™»éŒ²å†…容", 183 "settings.account.headlineSubscription" : "ã‚ãªãŸã®ç™»éŒ²å†…容",
138 "settings.account.headlineUpgrade" : "アカウントをアップグレードã—ã€Franzを支æ´ã™ã‚‹", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "ダウンロード", 186 "settings.account.invoiceDownload" : "ダウンロード",
140 "settings.account.manageSubscription.label" : "サブスクリプションã®ç®¡ç†", 187 "settings.account.manageSubscription.label" : "サブスクリプションã®ç®¡ç†",
141 "settings.account.successInfo" : "変更内容ãŒä¿å­˜ã•ã‚Œã¾ã—ãŸ", 188 "settings.account.successInfo" : "変更内容ãŒä¿å­˜ã•ã‚Œã¾ã—ãŸ",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "ã‚‚ã†ä¸€åº¦è©¦ã™", 192 "settings.account.tryReloadServices" : "ã‚‚ã†ä¸€åº¦è©¦ã™",
143 "settings.account.tryReloadUserInfoRequest" : "ã‚‚ã†ä¸€åº¦è©¦ã™", 193 "settings.account.tryReloadUserInfoRequest" : "ã‚‚ã†ä¸€åº¦è©¦ã™",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "ユーザ情報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ", 195 "settings.account.userInfoRequestFailed" : "ユーザ情報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "キャッシュを消去ã™ã‚‹", 197 "settings.app.buttonClearAllCache" : "キャッシュを消去ã™ã‚‹",
146 "settings.app.buttonInstallUpdate" : "å†èµ·å‹•ã—ã¦æ›´æ–°ã‚’インストールã™ã‚‹", 198 "settings.app.buttonInstallUpdate" : "å†èµ·å‹•ã—ã¦æ›´æ–°ã‚’インストールã™ã‚‹",
147 "settings.app.buttonSearchForUpdate" : "æ›´æ–°ã®ç¢ºèª", 199 "settings.app.buttonSearchForUpdate" : "æ›´æ–°ã®ç¢ºèª",
@@ -154,6 +206,7 @@
154 "settings.app.form.enableGPUAcceleration" : "GPUアクセラレーションを有効ã«ã™ã‚‹", 206 "settings.app.form.enableGPUAcceleration" : "GPUアクセラレーションを有効ã«ã™ã‚‹",
155 "settings.app.form.enableSpellchecking" : "スペルãƒã‚§ãƒƒã‚¯ã‚’有効ã«ã™ã‚‹", 207 "settings.app.form.enableSpellchecking" : "スペルãƒã‚§ãƒƒã‚¯ã‚’有効ã«ã™ã‚‹",
156 "settings.app.form.enableSystemTray" : "Franzをシステムトレイã«è¡¨ç¤ºã™ã‚‹", 208 "settings.app.form.enableSystemTray" : "Franzをシステムトレイã«è¡¨ç¤ºã™ã‚‹",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "言語", 210 "settings.app.form.language" : "言語",
158 "settings.app.form.minimizeToSystemTray" : "Franzをシステムトレイã«æœ€å°åŒ–ã™ã‚‹", 211 "settings.app.form.minimizeToSystemTray" : "Franzをシステムトレイã«æœ€å°åŒ–ã™ã‚‹",
159 "settings.app.form.runInBackground" : "ウインドウを閉ã˜ãŸéš›ã«Franzã‚’ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã•ã›ã¦ãŠã", 212 "settings.app.form.runInBackground" : "ウインドウを閉ã˜ãŸéš›ã«Franzã‚’ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã•ã›ã¦ãŠã",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "利用中ã®ã‚µãƒ¼ãƒ“ス", 235 "settings.navigation.yourServices" : "利用中ã®ã‚µãƒ¼ãƒ“ス",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "ã™ã¹ã¦ã®ã‚µãƒ¼ãƒ“ス", 237 "settings.recipes.all" : "ã™ã¹ã¦ã®ã‚µãƒ¼ãƒ“ス",
185 "settings.recipes.dev" : "開発版", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "利用å¯èƒ½ãªã‚µãƒ¼ãƒ“ス", 245 "settings.recipes.headline" : "利用å¯èƒ½ãªã‚µãƒ¼ãƒ“ス",
187 "settings.recipes.missingService" : "使ã„ãŸã„サービスãŒä¸€è¦§ã«ã‚ã‚Šã¾ã›ã‚“ã‹?", 246 "settings.recipes.missingService" : "使ã„ãŸã„サービスãŒä¸€è¦§ã«ã‚ã‚Šã¾ã›ã‚“ã‹?",
188 "settings.recipes.mostPopular" : "最も人気", 247 "settings.recipes.mostPopular" : "最も人気",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "設定", 334 "sidebar.settings" : "設定",
276 "sidebar.unmuteApp" : "通知ã¨ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’有効化", 335 "sidebar.unmuteApp" : "通知ã¨ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’有効化",
277 "signup.company.label" : "法人",
278 "signup.email.label" : "メールアドレス", 336 "signup.email.label" : "メールアドレス",
279 "signup.emailDuplicate" : "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™", 337 "signup.emailDuplicate" : "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™",
280 "signup.firstname.label" : "å", 338 "signup.firstname.label" : "å",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "ç„¡æ–™", 358 "subscription.type.free" : "ç„¡æ–™",
301 "subscription.type.month" : "月間", 359 "subscription.type.month" : "月間",
302 "subscription.type.year" : "å¹´é–“", 360 "subscription.type.year" : "å¹´é–“",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "キャンセル", 367 "subscriptionPopup.buttonCancel" : "キャンセル",
304 "subscriptionPopup.buttonDone" : "完了", 368 "subscriptionPopup.buttonDone" : "完了",
305 "tabs.item.deleteService" : "サービスを削除ã™ã‚‹", 369 "tabs.item.deleteService" : "サービスを削除ã™ã‚‹",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index b35e273b6..4e2f2ae85 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ", 2 "app.errorHandler.action" : "ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Something went wrong",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Get a Ferdi Supporter License", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.headline" : "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.delayApp.text" : "Ferdi will continue in {seconds} seconds.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Get a Franz Supporter License",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Send as email", 13 "feature.shareFranz.action.email" : "Send as email",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 14 "feature.shareFranz.action.facebook" : "Share on Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 15 "feature.shareFranz.action.twitter" : "Share on Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Franz-ის áƒáƒœáƒšáƒáƒ˜áƒœ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ", 23 "global.api.unhealthy" : "Franz-ის áƒáƒœáƒšáƒáƒ˜áƒœ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "თქვენ áƒáƒ  ხáƒáƒ áƒ— ინტერნეტთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული.", 25 "global.notConnectedToTheInternet" : "თქვენ áƒáƒ  ხáƒáƒ áƒ— ინტერნეტთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული.",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 26 "global.spellchecker.useDefault" : "Use System Default ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Spell checking language", 29 "global.spellchecking.language" : "Spell checking language",
21 "import.headline" : "შემáƒáƒ˜áƒ¢áƒáƒœáƒ” Ferdi 4-ის სერვისები", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "სერვისები ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი Ferdi 5-ში", 31 "import.headline" : "შემáƒáƒ˜áƒ¢áƒáƒœáƒ” Franz 4-ის სერვისები",
32 "import.notSupportedHeadline" : "სერვისები ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი Franz 5-ში",
23 "import.skip.label" : "I want to add services manually", 33 "import.skip.label" : "I want to add services manually",
24 "import.submit.label" : "მáƒáƒ¬áƒ•áƒ”ვის გáƒáƒ’ზáƒáƒ•áƒœáƒ", 34 "import.submit.label" : "მáƒáƒ¬áƒ•áƒ”ვის გáƒáƒ’ზáƒáƒ•áƒœáƒ",
25 "infobar.buttonChangelog" : "What is new?", 35 "infobar.buttonChangelog" : "What is new?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "სერვისების გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ", 37 "infobar.buttonReloadServices" : "სერვისების გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ",
28 "infobar.requiredRequestsFailed" : "სერვისებისრდრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრვერ მáƒáƒ®áƒ”რხდáƒ", 38 "infobar.requiredRequestsFailed" : "სერვისებისრდრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრვერ მáƒáƒ®áƒ”რხდáƒ",
29 "infobar.servicesUpdated" : "თქვენი სერვისები გáƒáƒœáƒáƒ®áƒšáƒ”ბულიáƒ.", 39 "infobar.servicesUpdated" : "თქვენი სერვისები გáƒáƒœáƒáƒ®áƒšáƒ”ბულიáƒ.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "გáƒáƒœáƒáƒ®áƒšáƒ”ბრFranz-ისთვის ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ.", 41 "infobar.updateAvailable" : "გáƒáƒœáƒáƒ®áƒšáƒ”ბრFranz-ისთვის ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ.",
31 "invite.email.label" : "მეილი", 42 "invite.email.label" : "მეილი",
32 "invite.headline.friends" : "მáƒáƒ˜áƒ¬áƒ•áƒ˜áƒ”თ 3 თქვენი მეგáƒáƒ‘áƒáƒ áƒ˜ áƒáƒœ კáƒáƒšáƒ”გáƒ", 43 "invite.headline.friends" : "მáƒáƒ˜áƒ¬áƒ•áƒ˜áƒ”თ 3 თქვენი მეგáƒáƒ‘áƒáƒ áƒ˜ áƒáƒœ კáƒáƒšáƒ”გáƒ",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.", 54 "login.serverLogout" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.",
44 "login.submit.label" : "შესვლáƒ", 55 "login.submit.label" : "შესვლáƒ",
45 "login.tokenExpired" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.", 56 "login.tokenExpired" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Franz-ის შესáƒáƒ®áƒ”ბ", 59 "menu.app.about" : "Franz-ის შესáƒáƒ®áƒ”ბ",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "გáƒáƒœáƒáƒ®áƒšáƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბáƒ", 61 "menu.app.checkForUpdates" : "გáƒáƒœáƒáƒ®áƒšáƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბáƒ",
@@ -68,6 +81,9 @@
68 "menu.file" : "File", 81 "menu.file" : "File",
69 "menu.help" : "Help", 82 "menu.help" : "Help",
70 "menu.help.changelog" : "Changelog", 83 "menu.help.changelog" : "Changelog",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Learn More", 87 "menu.help.learnMore" : "Learn More",
72 "menu.help.privacy" : "კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ის შესáƒáƒ®áƒ”ბ", 88 "menu.help.privacy" : "კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ის შესáƒáƒ®áƒ”ბ",
73 "menu.help.support" : "Support", 89 "menu.help.support" : "Support",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Add New Service...", 93 "menu.services.addNewService" : "Add New Service...",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "View", 96 "menu.view" : "View",
80 "menu.view.enterFullScreen" : "Enter Full Screen", 97 "menu.view.enterFullScreen" : "Enter Full Screen",
81 "menu.view.exitFullScreen" : "Exit Full Screen", 98 "menu.view.exitFullScreen" : "Exit Full Screen",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Toggle Developer Tools", 102 "menu.view.toggleDevTools" : "Toggle Developer Tools",
86 "menu.view.toggleFullScreen" : "Toggle Full Screen", 103 "menu.view.toggleFullScreen" : "Toggle Full Screen",
87 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 104 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Zoom In", 106 "menu.view.zoomIn" : "Zoom In",
89 "menu.view.zoomOut" : "Zoom Out", 107 "menu.view.zoomOut" : "Zoom Out",
90 "menu.window" : "Window", 108 "menu.window" : "Window",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ", 121 "password.submit.label" : "დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ",
104 "password.successInfo" : "გთხáƒáƒ•áƒ— შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ მეილი", 122 "password.successInfo" : "გთხáƒáƒ•áƒ— შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ მეილი",
105 "premiumFeature.button.upgradeAccount" : "Upgrade account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade account",
106 "pricing.headline" : "Franz-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "áƒáƒ  მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ თქვენი მხáƒáƒ áƒ“áƒáƒ­áƒ”რის გეგმáƒ", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Reload {name}", 151 "service.crashHandler.action" : "Reload {name}",
111 "service.crashHandler.autoReload" : "Trying to automatically restore {name} in {seconds} seconds", 152 "service.crashHandler.autoReload" : "Trying to automatically restore {name} in {seconds} seconds",
112 "service.crashHandler.headline" : "Oh no!", 153 "service.crashHandler.headline" : "Oh no!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh no!", 159 "service.errorHandler.headline" : "Oh no!",
119 "service.errorHandler.message" : "შეცდáƒáƒ›áƒ", 160 "service.errorHandler.message" : "შეცდáƒáƒ›áƒ",
120 "service.errorHandler.text" : "{name} has failed to load.", 161 "service.errorHandler.text" : "{name} has failed to load.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "დáƒáƒ¬áƒ§áƒ”ბáƒ", 168 "services.getStarted" : "დáƒáƒ¬áƒ§áƒ”ბáƒ",
123 "services.welcome" : "მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბით Franz-ზე", 169 "services.welcome" : "მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბით Franz-ზე",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ", 181 "settings.account.headlinePassword" : "პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ",
136 "settings.account.headlineProfile" : "პრáƒáƒ¤áƒ˜áƒšáƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ", 182 "settings.account.headlineProfile" : "პრáƒáƒ¤áƒ˜áƒšáƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ",
137 "settings.account.headlineSubscription" : "თქვენი გáƒáƒ›áƒáƒ¬áƒ”რáƒ", 183 "settings.account.headlineSubscription" : "თქვენი გáƒáƒ›áƒáƒ¬áƒ”რáƒ",
138 "settings.account.headlineUpgrade" : "გáƒáƒœáƒáƒáƒ®áƒšáƒ”თ თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ დრმხáƒáƒ áƒ˜ დáƒáƒ£áƒ­áƒ˜áƒ áƒ”თ Franz-ს", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "გáƒáƒ“მáƒáƒ¬áƒ”რáƒ", 186 "settings.account.invoiceDownload" : "გáƒáƒ“მáƒáƒ¬áƒ”რáƒ",
140 "settings.account.manageSubscription.label" : "თქვენი გáƒáƒ›áƒáƒ¬áƒ”რის მáƒáƒ áƒ—ვáƒ", 187 "settings.account.manageSubscription.label" : "თქვენი გáƒáƒ›áƒáƒ¬áƒ”რის მáƒáƒ áƒ—ვáƒ",
141 "settings.account.successInfo" : "თქვენი ცვლილებები შენáƒáƒ®áƒ£áƒšáƒ˜áƒ", 188 "settings.account.successInfo" : "თქვენი ცვლილებები შენáƒáƒ®áƒ£áƒšáƒ˜áƒ",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ", 192 "settings.account.tryReloadServices" : "სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ",
143 "settings.account.tryReloadUserInfoRequest" : "სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ", 193 "settings.account.tryReloadUserInfoRequest" : "სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრვერ მáƒáƒ®áƒ”რხდáƒ", 195 "settings.account.userInfoRequestFailed" : "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრვერ მáƒáƒ®áƒ”რხდáƒ",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Clear cache", 197 "settings.app.buttonClearAllCache" : "Clear cache",
146 "settings.app.buttonInstallUpdate" : "გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ დრდáƒáƒáƒ§áƒ”ნეთ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ", 198 "settings.app.buttonInstallUpdate" : "გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ დრდáƒáƒáƒ§áƒ”ნეთ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ",
147 "settings.app.buttonSearchForUpdate" : "გáƒáƒœáƒáƒ®áƒšáƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბáƒ", 199 "settings.app.buttonSearchForUpdate" : "გáƒáƒœáƒáƒ®áƒšáƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბáƒ",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Join the Dark Side", 205 "settings.app.form.darkMode" : "Join the Dark Side",
154 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 206 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
155 "settings.app.form.enableSpellchecking" : "Enable spell checking", 207 "settings.app.form.enableSpellchecking" : "Enable spell checking",
156 "settings.app.form.enableSystemTray" : "áƒáƒ©áƒ•áƒ”ნეთ Ferdi სისტემის უჯრáƒáƒ¨áƒ˜", 208 "settings.app.form.enableSystemTray" : "áƒáƒ©áƒ•áƒ”ნეთ Franz სისტემის უჯრáƒáƒ¨áƒ˜",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "ენáƒ", 210 "settings.app.form.language" : "ენáƒ",
158 "settings.app.form.minimizeToSystemTray" : "ჩáƒáƒ™áƒ”ცეთ Ferdi სისტემის უჯრáƒáƒ¨áƒ˜", 211 "settings.app.form.minimizeToSystemTray" : "ჩáƒáƒ™áƒ”ცეთ Ferdi სისტემის უჯრáƒáƒ¨áƒ˜",
159 "settings.app.form.runInBackground" : "დáƒáƒ¢áƒáƒ•áƒ”თ Ferdi გáƒáƒ¨áƒ•áƒ”ბული რáƒáƒ“ესáƒáƒª ფáƒáƒœáƒ¯áƒáƒ áƒ დáƒáƒ˜áƒ®áƒ£áƒ áƒ”ბáƒ", 212 "settings.app.form.runInBackground" : "დáƒáƒ¢áƒáƒ•áƒ”თ Ferdi გáƒáƒ¨áƒ•áƒ”ბული რáƒáƒ“ესáƒáƒª ფáƒáƒœáƒ¯áƒáƒ áƒ დáƒáƒ˜áƒ®áƒ£áƒ áƒ”ბáƒ",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "თქვენი სერვისები", 235 "settings.navigation.yourServices" : "თქვენი სერვისები",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "ყველრსერვისი", 237 "settings.recipes.all" : "ყველრსერვისი",
185 "settings.recipes.dev" : "გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒ", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ სერვისები", 245 "settings.recipes.headline" : "ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ სერვისები",
187 "settings.recipes.missingService" : "Missing a service?", 246 "settings.recipes.missingService" : "Missing a service?",
188 "settings.recipes.mostPopular" : "ყველáƒáƒ–ე პáƒáƒžáƒ£áƒšáƒáƒ áƒ£áƒšáƒ˜", 247 "settings.recipes.mostPopular" : "ყველáƒáƒ–ე პáƒáƒžáƒ£áƒšáƒáƒ áƒ£áƒšáƒ˜",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "პáƒáƒ áƒáƒ›áƒ”ტრები", 334 "sidebar.settings" : "პáƒáƒ áƒáƒ›áƒ”ტრები",
276 "sidebar.unmuteApp" : "Enable notifications & audio", 335 "sidebar.unmuteApp" : "Enable notifications & audio",
277 "signup.company.label" : "კáƒáƒ›áƒžáƒáƒœáƒ˜áƒ",
278 "signup.email.label" : "მეილი", 336 "signup.email.label" : "მეილი",
279 "signup.emailDuplicate" : "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ› მეილით უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს", 337 "signup.emailDuplicate" : "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ› მეილით უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს",
280 "signup.firstname.label" : "First Name", 338 "signup.firstname.label" : "First Name",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "უკვე გáƒáƒ¥áƒ•áƒ— áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜?", 344 "signup.link.login" : "უკვე გáƒáƒ¥áƒ•áƒ— áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜?",
287 "signup.password.label" : "პáƒáƒ áƒáƒšáƒ˜", 345 "signup.password.label" : "პáƒáƒ áƒáƒšáƒ˜",
288 "signup.submit.label" : "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნáƒ", 346 "signup.submit.label" : "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნáƒ",
289 "subscription.euTaxInfo" : "EU residents: local sales tax may apply", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "áƒáƒ áƒáƒœáƒáƒ˜áƒ áƒ˜ რეკლáƒáƒ›áƒ”ბი, áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "მáƒáƒšáƒ”", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Proxy support for services", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Support for spellchecker",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "ფáƒáƒ¡áƒ˜áƒáƒœáƒ˜ Franz-ის პრემიუმ მხáƒáƒ áƒ›áƒ“áƒáƒ›áƒ­áƒ”რი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜",
298 "subscription.paymentSessionError" : "გáƒáƒ“áƒáƒ®áƒ“ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ვერ მáƒáƒ®áƒ”რხდáƒ",
299 "subscription.submit.label" : "მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡",
300 "subscription.type.free" : "უფáƒáƒ¡áƒ",
301 "subscription.type.month" : "თვე",
302 "subscription.type.year" : "წელი",
303 "subscriptionPopup.buttonCancel" : "გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ", 353 "subscriptionPopup.buttonCancel" : "გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ",
304 "subscriptionPopup.buttonDone" : "შესრულებულიáƒ", 354 "subscriptionPopup.buttonDone" : "შესრულებულიáƒ",
305 "tabs.item.deleteService" : "სერვისის წáƒáƒ¨áƒšáƒ", 355 "tabs.item.deleteService" : "სერვისის წáƒáƒ¨áƒšáƒ",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index 90d566585..1f3681e5d 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -1,25 +1,35 @@
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" : "Wijzigingen in Ferdi {versie}", 4 "feature.announcements.changelog.headline" : "Wijzigingen in Franz {versie}",
5 "feature.delayApp.action" : "Neem een Ferdi Supporter Licentie ", 5 "feature.delayApp.headline" : "Neem een Franz Supporter Licentie om niet meer te hoeven wachten",
6 "feature.delayApp.headline" : "Neem een Ferdi Supporter Licentie om niet meer te hoeven wachten", 6 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.",
7 "feature.delayApp.text" : "Ferdi gaat over {seconds} seconden verder.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Neem een Franz Supporter Licentie ",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Verstuur als e-mail", 13 "feature.shareFranz.action.email" : "Verstuur als e-mail",
9 "feature.shareFranz.action.facebook" : "Deel op Facebook", 14 "feature.shareFranz.action.facebook" : "Deel op Facebook",
10 "feature.shareFranz.action.twitter" : "Deel op Twitter", 15 "feature.shareFranz.action.twitter" : "Deel op Twitter",
11 "feature.shareFranz.headline" : "Ferdi is beter samen!", 16 "feature.shareFranz.headline" : "Ferdi is beter samen!",
12 "feature.shareFranz.shareText.email" : "Ik heb {telling} diensten toegevoegd aan Franz! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.meetfranz.com", 17 "feature.shareFranz.shareText.email" : "Ik heb {telling} diensten toegevoegd aan Franz! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Ik heb {tel} diensten toegevoegd aan Franz! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.meetfranz.com \/cc @FranzMessenger", 18 "feature.shareFranz.shareText.twitter" : "Ik heb {tel} diensten toegevoegd aan Franz! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Vertel je vrienden en collega's hoe geweldig Ferdi is en help ons het woord te verspreiden.", 19 "feature.shareFranz.text" : "Vertel je vrienden en collega's hoe geweldig Franz is en help ons het woord te verspreiden.",
15 "global.api.unhealthy" : "Kan geen verbinding maken met de Ferdi services", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz services",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.", 25 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.",
17 "global.spellchecker.useDefault" : "Gebruik Systeemstandaard ({default})", 26 "global.spellchecker.useDefault" : "Gebruik Systeemstandaard ({default})",
18 "global.spellchecking.autodetect" : "Taal automatisch herkennen", 27 "global.spellchecking.autodetect" : "Taal automatisch herkennen",
19 "global.spellchecking.autodetect.short" : "Automatisch", 28 "global.spellchecking.autodetect.short" : "Automatisch",
20 "global.spellchecking.language" : "Taal spellingscontrole", 29 "global.spellchecking.language" : "Taal spellingscontrole",
21 "import.headline" : "Importeer je Ferdi 4 services", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Ferdi 5", 31 "import.headline" : "Importeer je Franz 4 services",
32 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5",
23 "import.skip.label" : "Ik wil services handmatig toevoegen", 33 "import.skip.label" : "Ik wil services handmatig toevoegen",
24 "import.submit.label" : "Importeer services", 34 "import.submit.label" : "Importeer services",
25 "infobar.buttonChangelog" : "Wat is er nieuw?", 35 "infobar.buttonChangelog" : "Wat is er nieuw?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Services opnieuw laden", 37 "infobar.buttonReloadServices" : "Services opnieuw laden",
28 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden", 38 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden",
29 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.", 39 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.",
30 "infobar.updateAvailable" : "Er is een nieuwe update voor Ferdi beschikbaar.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Er is een nieuwe update voor Franz beschikbaar.",
31 "invite.email.label" : "E-mailadres", 42 "invite.email.label" : "E-mailadres",
32 "invite.headline.friends" : "Nodig 3 van je vrienden of collega's uit", 43 "invite.headline.friends" : "Nodig 3 van je vrienden of collega's uit",
33 "invite.name.label" : "Naam", 44 "invite.name.label" : "Naam",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 54 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
44 "login.submit.label" : "Inloggen", 55 "login.submit.label" : "Inloggen",
45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 56 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Over Franz", 59 "menu.app.about" : "Over Franz",
47 "menu.app.announcement" : "Wat is er nieuw?", 60 "menu.app.announcement" : "Wat is er nieuw?",
48 "menu.app.checkForUpdates" : "Controleer op updates", 61 "menu.app.checkForUpdates" : "Controleer op updates",
@@ -68,6 +81,9 @@
68 "menu.file" : "Bestand", 81 "menu.file" : "Bestand",
69 "menu.help" : "Help", 82 "menu.help" : "Help",
70 "menu.help.changelog" : "Logboek", 83 "menu.help.changelog" : "Logboek",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Meer Weten", 87 "menu.help.learnMore" : "Meer Weten",
72 "menu.help.privacy" : "Privacyverklaring", 88 "menu.help.privacy" : "Privacyverklaring",
73 "menu.help.support" : "Ondersteuning", 89 "menu.help.support" : "Ondersteuning",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Vorige dienst activeren", 92 "menu.services.activatePreviousService" : "Vorige dienst activeren",
77 "menu.services.addNewService" : "Nieuwe service toevoegen...", 93 "menu.services.addNewService" : "Nieuwe service toevoegen...",
78 "menu.services.setNextServiceActive" : "Volgende dienst activeren", 94 "menu.services.setNextServiceActive" : "Volgende dienst activeren",
95 "menu.todos" : "Todos",
79 "menu.view" : "Weergave", 96 "menu.view" : "Weergave",
80 "menu.view.enterFullScreen" : "Volledig scherm openen", 97 "menu.view.enterFullScreen" : "Volledig scherm openen",
81 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 98 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Ontwikkelaarstools Aan\/Uit", 102 "menu.view.toggleDevTools" : "Ontwikkelaarstools Aan\/Uit",
86 "menu.view.toggleFullScreen" : "Volledig Scherm Aan\/Uit", 103 "menu.view.toggleFullScreen" : "Volledig Scherm Aan\/Uit",
87 "menu.view.toggleServiceDevTools" : "Service Ontwikkelaarstools Aan\/Uit", 104 "menu.view.toggleServiceDevTools" : "Service Ontwikkelaarstools Aan\/Uit",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Inzoomen", 106 "menu.view.zoomIn" : "Inzoomen",
89 "menu.view.zoomOut" : "Uitzoomen", 107 "menu.view.zoomOut" : "Uitzoomen",
90 "menu.window" : "Venster", 108 "menu.window" : "Venster",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Verzenden", 121 "password.submit.label" : "Verzenden",
104 "password.successInfo" : "Controleer alsjeblieft je e-mail", 122 "password.successInfo" : "Controleer alsjeblieft je e-mail",
105 "premiumFeature.button.upgradeAccount" : "Upgrade account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade account",
106 "pricing.headline" : "Steun Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Ferdi niet ondersteunen.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Ik wil de ontwikkeling van Ferdi ondersteunen", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Selecteer je ondersteuningsplan", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "{naam} herladen", 151 "service.crashHandler.action" : "{naam} herladen",
111 "service.crashHandler.autoReload" : "Ga proberen om {name} te herstellen over {seconds} seconden", 152 "service.crashHandler.autoReload" : "Ga proberen om {name} te herstellen over {seconds} seconden",
112 "service.crashHandler.headline" : "Oh nee!", 153 "service.crashHandler.headline" : "Oh nee!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh nee!", 159 "service.errorHandler.headline" : "Oh nee!",
119 "service.errorHandler.message" : "Fout", 160 "service.errorHandler.message" : "Fout",
120 "service.errorHandler.text" : "{name} kon niet geladen worden.", 161 "service.errorHandler.text" : "{name} kon niet geladen worden.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Aan het laden", 167 "service.webviewLoader.loading" : "Aan het laden",
122 "services.getStarted" : "Beginnen", 168 "services.getStarted" : "Beginnen",
123 "services.welcome" : "Welkom bij Franz", 169 "services.welcome" : "Welkom bij Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Wijzig wachtwoord", 181 "settings.account.headlinePassword" : "Wijzig wachtwoord",
136 "settings.account.headlineProfile" : "Profiel bijwerken", 182 "settings.account.headlineProfile" : "Profiel bijwerken",
137 "settings.account.headlineSubscription" : "Je abonnement", 183 "settings.account.headlineSubscription" : "Je abonnement",
138 "settings.account.headlineUpgrade" : "Upgrade je account & ondersteun Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Download", 186 "settings.account.invoiceDownload" : "Download",
140 "settings.account.manageSubscription.label" : "Beheer je abonnement", 187 "settings.account.manageSubscription.label" : "Beheer je abonnement",
141 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen", 188 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Probeer opnieuw", 192 "settings.account.tryReloadServices" : "Probeer opnieuw",
143 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 193 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden", 195 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Cache wissen", 197 "settings.app.buttonClearAllCache" : "Cache wissen",
146 "settings.app.buttonInstallUpdate" : "Herstart & installeer update", 198 "settings.app.buttonInstallUpdate" : "Herstart & installeer update",
147 "settings.app.buttonSearchForUpdate" : "Controleer op updates", 199 "settings.app.buttonSearchForUpdate" : "Controleer op updates",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Word lid van de Dark Side", 205 "settings.app.form.darkMode" : "Word lid van de Dark Side",
154 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren", 206 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren",
155 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen", 207 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen",
156 "settings.app.form.enableSystemTray" : "Toon Ferdi in de systeembalk", 208 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Taal", 210 "settings.app.form.language" : "Taal",
158 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Ferdi naar de systeembalk", 211 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Ferdi naar de systeembalk",
159 "settings.app.form.runInBackground" : "Houd Ferdi op de achtergrond wanneer het venster gesloten wordt", 212 "settings.app.form.runInBackground" : "Houd Ferdi op de achtergrond wanneer het venster gesloten wordt",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Jouw services", 235 "settings.navigation.yourServices" : "Jouw services",
183 "settings.navigation.yourWorkspaces" : "Jouw werkruimtes", 236 "settings.navigation.yourWorkspaces" : "Jouw werkruimtes",
184 "settings.recipes.all" : "Alle diensten", 237 "settings.recipes.all" : "Alle diensten",
185 "settings.recipes.dev" : "Ontwikkeling", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Beschikbare services", 245 "settings.recipes.headline" : "Beschikbare services",
187 "settings.recipes.missingService" : "Mist er een service?", 246 "settings.recipes.missingService" : "Mist er een service?",
188 "settings.recipes.mostPopular" : "Meest populair", 247 "settings.recipes.mostPopular" : "Meest populair",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Werkruimtelade openen", 333 "sidebar.openWorkspaceDrawer" : "Werkruimtelade openen",
275 "sidebar.settings" : "Instellingen", 334 "sidebar.settings" : "Instellingen",
276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen", 335 "sidebar.unmuteApp" : "Berichten & geluid inschakelen",
277 "signup.company.label" : "Bedrijf",
278 "signup.email.label" : "E-mailadres", 336 "signup.email.label" : "E-mailadres",
279 "signup.emailDuplicate" : "Er bestaat al een gebruiker met dat e-mailadres", 337 "signup.emailDuplicate" : "Er bestaat al een gebruiker met dat e-mailadres",
280 "signup.firstname.label" : "Voornaam", 338 "signup.firstname.label" : "Voornaam",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "gratis", 358 "subscription.type.free" : "gratis",
301 "subscription.type.month" : "maand", 359 "subscription.type.month" : "maand",
302 "subscription.type.year" : "jaar", 360 "subscription.type.year" : "jaar",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Annuleren", 367 "subscriptionPopup.buttonCancel" : "Annuleren",
304 "subscriptionPopup.buttonDone" : "Klaar", 368 "subscriptionPopup.buttonDone" : "Klaar",
305 "tabs.item.deleteService" : "Service verwijderen", 369 "tabs.item.deleteService" : "Service verwijderen",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index f42524280..457210523 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -1,35 +1,46 @@
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 is iets mis gegaan",
4 "feature.announcements.changelog.headline" : "Wijzigingen in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Wijzigingen in Franz {version}",
5 "feature.delayApp.action" : "Sponsor Franz", 5 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan",
6 "feature.delayApp.headline" : "Sponsor Ferdi om wachten over te slaan", 6 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.",
7 "feature.delayApp.text" : "Ferdi gaat over {seconds} seconden verder.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Sponsor Franz",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade Account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Verstuur als e-mail", 13 "feature.shareFranz.action.email" : "Verstuur als e-mail",
9 "feature.shareFranz.action.facebook" : "Deel op Facebook", 14 "feature.shareFranz.action.facebook" : "Deel op Facebook",
10 "feature.shareFranz.action.twitter" : "Deel op Twitter", 15 "feature.shareFranz.action.twitter" : "Deel op Twitter",
11 "feature.shareFranz.headline" : "Ferdi is leuker samen!", 16 "feature.shareFranz.headline" : "Franz is leuker samen!",
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", 17 "feature.shareFranz.shareText.email" : "Ik heb {count} services toegevoegd aan Franz! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.meetfranz.com",
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", 18 "feature.shareFranz.shareText.twitter" : "Ik heb {count} services toegevoegd aan Franz! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Vertel je vrienden en collega's hoe geweldig Ferdi is en help ons om bekender te worden", 19 "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", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services.",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.", 25 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.",
17 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})", 26 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})",
18 "global.spellchecking.autodetect" : "Taal automatisch herkennen", 27 "global.spellchecking.autodetect" : "Taal automatisch herkennen",
19 "global.spellchecking.autodetect.short" : "Automatisch", 28 "global.spellchecking.autodetect.short" : "Automatisch",
20 "global.spellchecking.language" : "Spelling checken", 29 "global.spellchecking.language" : "Taal voor spellingcontrole",
21 "import.headline" : "Importeer uw Ferdi 4-services", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Services die nog niet ondersteund worden in Ferdi 5", 31 "import.headline" : "Importeer uw Franz 4-services",
23 "import.skip.label" : "Ik wil services handmatig toevoegen", 32 "import.notSupportedHeadline" : "Services die (nog) niet ondersteund worden in Franz 5",
33 "import.skip.label" : "Ik wil diensten handmatig toevoegen",
24 "import.submit.label" : "Importeer services", 34 "import.submit.label" : "Importeer services",
25 "infobar.buttonChangelog" : "Wat is er nieuw?", 35 "infobar.buttonChangelog" : "Wat is er nieuw?",
26 "infobar.buttonInstallUpdate" : "Opnieuw opstarten & update installeren", 36 "infobar.buttonInstallUpdate" : "Opnieuw opstarten & update installeren",
27 "infobar.buttonReloadServices" : "Services opnieuw laden", 37 "infobar.buttonReloadServices" : "Services opnieuw laden",
28 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden", 38 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden",
29 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.", 39 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.",
30 "infobar.updateAvailable" : "Er is een nieuwe update voor Ferdi beschikbaar.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Een nieuwe update voor Franz is beschikbaar.",
31 "invite.email.label" : "E-mailadres", 42 "invite.email.label" : "E-mailadres",
32 "invite.headline.friends" : "Nodig 3 van je vrienden of collega's uit", 43 "invite.headline.friends" : "Nodig 3 vrienden of collega's uit",
33 "invite.name.label" : "Naam", 44 "invite.name.label" : "Naam",
34 "invite.skip.label" : "Ik wil dit later doen", 45 "invite.skip.label" : "Ik wil dit later doen",
35 "invite.submit.label" : "Uitnodigingen verzenden", 46 "invite.submit.label" : "Uitnodigingen verzenden",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "De sessie is verlopen, log alsjeblieft opnieuw in.", 54 "login.serverLogout" : "De sessie is verlopen, log alsjeblieft opnieuw in.",
44 "login.submit.label" : "Inloggen", 55 "login.submit.label" : "Inloggen",
45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 56 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Over Franz", 59 "menu.app.about" : "Over Franz",
47 "menu.app.announcement" : "Wat is nieuw?", 60 "menu.app.announcement" : "Wat is nieuw?",
48 "menu.app.checkForUpdates" : "Controleer op updates", 61 "menu.app.checkForUpdates" : "Controleer op updates",
@@ -62,20 +75,24 @@
62 "menu.edit.selectAll" : "Selecteer alles", 75 "menu.edit.selectAll" : "Selecteer alles",
63 "menu.edit.speech" : "Spraak", 76 "menu.edit.speech" : "Spraak",
64 "menu.edit.startDictation" : "Beginnen met dicteren", 77 "menu.edit.startDictation" : "Beginnen met dicteren",
65 "menu.edit.startSpeaking" : "Beginnen met praten", 78 "menu.edit.startSpeaking" : "Begin met spreken",
66 "menu.edit.stopSpeaking" : "Stoppen met spreken", 79 "menu.edit.stopSpeaking" : "Stop met spreken",
67 "menu.edit.undo" : "Ongedaan maken", 80 "menu.edit.undo" : "Ongedaan maken",
68 "menu.file" : "Bestand", 81 "menu.file" : "Bestand",
69 "menu.help" : "Hulp", 82 "menu.help" : "Hulp",
70 "menu.help.changelog" : "Wijzigingenlogboek", 83 "menu.help.changelog" : "Wijzigingenlogboek",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Meer informatie", 87 "menu.help.learnMore" : "Meer informatie",
72 "menu.help.privacy" : "Privacy Voorwaarden", 88 "menu.help.privacy" : "Privacyvoorwaarden",
73 "menu.help.support" : "Ondersteuning", 89 "menu.help.support" : "Ondersteuning",
74 "menu.help.tos" : "Servicevoorwaarden", 90 "menu.help.tos" : "Servicevoorwaarden",
75 "menu.services" : "Diensten", 91 "menu.services" : "Services",
76 "menu.services.activatePreviousService" : "Activeer vorige dienst", 92 "menu.services.activatePreviousService" : "Activeer vorige service",
77 "menu.services.addNewService" : "Nieuwe dienst toevoegen", 93 "menu.services.addNewService" : "Nieuwe service toevoegen...",
78 "menu.services.setNextServiceActive" : "Activeer volgende dienst", 94 "menu.services.setNextServiceActive" : "Activeer volgende service",
95 "menu.todos" : "Todos",
79 "menu.view" : "Weergave", 96 "menu.view" : "Weergave",
80 "menu.view.enterFullScreen" : "Gebruik volledig scherm", 97 "menu.view.enterFullScreen" : "Gebruik volledig scherm",
81 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 98 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Ontwikkelaarstools aan\/uit", 102 "menu.view.toggleDevTools" : "Ontwikkelaarstools aan\/uit",
86 "menu.view.toggleFullScreen" : "Volledig scherm aan\/uit", 103 "menu.view.toggleFullScreen" : "Volledig scherm aan\/uit",
87 "menu.view.toggleServiceDevTools" : "Service ontwikkelaarstools aan\/uit", 104 "menu.view.toggleServiceDevTools" : "Service ontwikkelaarstools aan\/uit",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Inzoomen", 106 "menu.view.zoomIn" : "Inzoomen",
89 "menu.view.zoomOut" : "Uitzoomen", 107 "menu.view.zoomOut" : "Uitzoomen",
90 "menu.window" : "Venster", 108 "menu.window" : "Venster",
@@ -101,14 +119,37 @@
101 "password.link.signup" : "Maak een gratis account", 119 "password.link.signup" : "Maak een gratis account",
102 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres", 120 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres",
103 "password.submit.label" : "Verzenden", 121 "password.submit.label" : "Verzenden",
104 "password.successInfo" : "Controleer alsjeblieft je e-mail", 122 "password.successInfo" : "Controleer je e-mail",
105 "premiumFeature.button.upgradeAccount" : "Upgrade Account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade Account",
106 "pricing.headline" : "Steun Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Ferdi niet ondersteunen.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Ik wil de ontwikkeling van Ferdi steunen", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Selecteer je ondersteuningsplan", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Werkruimtes",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Laad {name} opnieuw", 151 "service.crashHandler.action" : "Laad {name} opnieuw",
111 "service.crashHandler.autoReload" : "Ga proberen om {name} te herstellen over {seconds} seconden", 152 "service.crashHandler.autoReload" : "Bezig om {name} te herstellen over {seconds} seconden",
112 "service.crashHandler.headline" : "Oh nee!", 153 "service.crashHandler.headline" : "Oh nee!",
113 "service.crashHandler.text" : "{name} heeft een fout veroorzaakt.", 154 "service.crashHandler.text" : "{name} heeft een fout veroorzaakt.",
114 "service.disabledHandler.action" : "Activeer {name}", 155 "service.disabledHandler.action" : "Activeer {name}",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh nee!", 159 "service.errorHandler.headline" : "Oh nee!",
119 "service.errorHandler.message" : "Fout", 160 "service.errorHandler.message" : "Fout",
120 "service.errorHandler.text" : "{name} kon niet geladen worden.", 161 "service.errorHandler.text" : "{name} kon niet geladen worden.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Aan het laden", 167 "service.webviewLoader.loading" : "Aan het laden",
122 "services.getStarted" : "Begin", 168 "services.getStarted" : "Begin",
123 "services.welcome" : "Welkom bij Franz", 169 "services.welcome" : "Welkom bij Franz",
@@ -126,8 +172,8 @@
126 "settings.account.accountType.premium" : "Premium Supporter Account", 172 "settings.account.accountType.premium" : "Premium Supporter Account",
127 "settings.account.buttonSave" : "Update profiel", 173 "settings.account.buttonSave" : "Update profiel",
128 "settings.account.deleteAccount" : "Verwijder account", 174 "settings.account.deleteAccount" : "Verwijder account",
129 "settings.account.deleteEmailSent" : "Je hebt een e-mail ontvangen met een link om de aanvraag tot verwijderen van het account te bevestigen. Je accountgegevens en -data kunnen niet worden teruggehaald!", 175 "settings.account.deleteEmailSent" : "Je hebt een e-mail ontvangen met een link om het verwijderen van je account te bevestigen. Je accountgegevens en -data kunnen na verwijderen niet meer worden teruggehaald!",
130 "settings.account.deleteInfo" : "Wanneer je je Franz-account niet langer wilt gebruiken, kan je je account en alle gerelateerde data hier verwijderen.", 176 "settings.account.deleteInfo" : "Wanneer je je Franz-account niet langer wilt gebruiken, kun je je account en alle gerelateerde data verwijderen.",
131 "settings.account.headline" : "Account", 177 "settings.account.headline" : "Account",
132 "settings.account.headlineAccount" : "Accountinformatie", 178 "settings.account.headlineAccount" : "Accountinformatie",
133 "settings.account.headlineDangerZone" : "Gevarenzone", 179 "settings.account.headlineDangerZone" : "Gevarenzone",
@@ -135,28 +181,35 @@
135 "settings.account.headlinePassword" : "Wijzig wachtwoord", 181 "settings.account.headlinePassword" : "Wijzig wachtwoord",
136 "settings.account.headlineProfile" : "Profiel bijwerken", 182 "settings.account.headlineProfile" : "Profiel bijwerken",
137 "settings.account.headlineSubscription" : "Je abonnement", 183 "settings.account.headlineSubscription" : "Je abonnement",
138 "settings.account.headlineUpgrade" : "Upgrade je account & steun Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Download", 186 "settings.account.invoiceDownload" : "Download",
140 "settings.account.manageSubscription.label" : "Beheer je abonnement", 187 "settings.account.manageSubscription.label" : "Beheer je abonnement",
141 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen", 188 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Probeer opnieuw", 192 "settings.account.tryReloadServices" : "Probeer opnieuw",
143 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 193 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden", 195 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Cache legen", 197 "settings.app.buttonClearAllCache" : "Cache legen",
146 "settings.app.buttonInstallUpdate" : "Herstart & installeer update", 198 "settings.app.buttonInstallUpdate" : "Opnieuw opstarten en updates installeren",
147 "settings.app.buttonSearchForUpdate" : "Controleer op updates", 199 "settings.app.buttonSearchForUpdate" : "Controleer op updates",
148 "settings.app.cacheInfo" : "De Franz-cache gebruikt op dit moment {size} schijfruimte.", 200 "settings.app.cacheInfo" : "Franz gebruikt op dit moment {size} schijfruimte aan tijdelijke bestanden.",
149 "settings.app.currentVersion" : "Huidige versie:", 201 "settings.app.currentVersion" : "Huidige versie:",
150 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond", 202 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond",
151 "settings.app.form.autoLaunchOnStart" : "Open Ferdi bij opstarten", 203 "settings.app.form.autoLaunchOnStart" : "Open Ferdi bij opstarten",
152 "settings.app.form.beta" : "Inclusief bètaversies", 204 "settings.app.form.beta" : "Inclusief bètaversies",
153 "settings.app.form.darkMode" : "Stap over naar de donkere kant", 205 "settings.app.form.darkMode" : "Stap over naar de donkere kant",
154 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart acceleratie in ", 206 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart-acceleratie in ",
155 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan", 207 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan",
156 "settings.app.form.enableSystemTray" : "Toon Ferdi in de systeembalk", 208 "settings.app.form.enableSystemTray" : "Pictogram voor Franz in systeemvak tonen",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Taal", 210 "settings.app.form.language" : "Taal",
158 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Ferdi naar de systeembalk", 211 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar systeemvak",
159 "settings.app.form.runInBackground" : "Houd Ferdi op de achtergrond wanneer het venster gesloten wordt", 212 "settings.app.form.runInBackground" : "Houd Franz open op de achtergrond wanneer het venster gesloten wordt",
160 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services", 213 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services",
161 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld", 214 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld",
162 "settings.app.headline" : "Instellingen", 215 "settings.app.headline" : "Instellingen",
@@ -165,10 +218,10 @@
165 "settings.app.headlineGeneral" : "Algemeen", 218 "settings.app.headlineGeneral" : "Algemeen",
166 "settings.app.headlineLanguage" : "Taal", 219 "settings.app.headlineLanguage" : "Taal",
167 "settings.app.headlineUpdates" : "Updates", 220 "settings.app.headlineUpdates" : "Updates",
168 "settings.app.languageDisclaimer" : "Officiële vertalingen zijn in het Engels en Duits. Alle andere talen zijn beheerd door de community.", 221 "settings.app.languageDisclaimer" : "Franz spreekt officieel Engels en Duits. Alle andere talen worden beheerd door de community.",
169 "settings.app.restartRequired" : "Deze wijziging heeft een herstart nodig", 222 "settings.app.restartRequired" : "Deze wijziging heeft een herstart nodig",
170 "settings.app.subheadlineCache" : "Cache", 223 "settings.app.subheadlineCache" : "Cache",
171 "settings.app.translationHelp" : "Help ons om Ferdi te vertalen naar uw taal.", 224 "settings.app.translationHelp" : "Help ons om Franz uw taal te laten spreken.",
172 "settings.app.updateStatusAvailable" : "Update beschikbaar, downloaden...", 225 "settings.app.updateStatusAvailable" : "Update beschikbaar, downloaden...",
173 "settings.app.updateStatusSearching" : "Zoekt naar updates", 226 "settings.app.updateStatusSearching" : "Zoekt naar updates",
174 "settings.app.updateStatusUpToDate" : "Je gebruikt de laatste versie van Franz", 227 "settings.app.updateStatusUpToDate" : "Je gebruikt de laatste versie van Franz",
@@ -182,9 +235,15 @@
182 "settings.navigation.yourServices" : "Jouw services", 235 "settings.navigation.yourServices" : "Jouw services",
183 "settings.navigation.yourWorkspaces" : "Jouw werkruimtes", 236 "settings.navigation.yourWorkspaces" : "Jouw werkruimtes",
184 "settings.recipes.all" : "Alle services", 237 "settings.recipes.all" : "Alle services",
185 "settings.recipes.dev" : "Ontwikkeling", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Beschikbare services", 245 "settings.recipes.headline" : "Beschikbare services",
187 "settings.recipes.missingService" : "Mist er een dienst?", 246 "settings.recipes.missingService" : "Mis je een service?",
188 "settings.recipes.mostPopular" : "Meest populair", 247 "settings.recipes.mostPopular" : "Meest populair",
189 "settings.recipes.nothingFound" : "Sorry, geen service gevonden met deze zoekterm.", 248 "settings.recipes.nothingFound" : "Sorry, geen service gevonden met deze zoekterm.",
190 "settings.recipes.servicesSuccessfulAddedInfo" : "Service succesvol toegevoegd", 249 "settings.recipes.servicesSuccessfulAddedInfo" : "Service succesvol toegevoegd",
@@ -213,7 +272,7 @@
213 "settings.service.form.iconUpload" : "Sleep en drop je afbeelding, of klik hier", 272 "settings.service.form.iconUpload" : "Sleep en drop je afbeelding, of klik hier",
214 "settings.service.form.indirectMessageInfo" : "Je ontvangt meldingen van alle nieuwe berichten in een kanaal, niet alleen @username, @channel, @here, ...", 273 "settings.service.form.indirectMessageInfo" : "Je ontvangt meldingen van alle nieuwe berichten in een kanaal, niet alleen @username, @channel, @here, ...",
215 "settings.service.form.indirectMessages" : "Toon berichtenbadge voor alle nieuwe berichten", 274 "settings.service.form.indirectMessages" : "Toon berichtenbadge voor alle nieuwe berichten",
216 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld zullen alle meldinggeluiden en afgespeelde audio uitgeschakeld zijn", 275 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld, worden meldingen en audio niet afgespeeld",
217 "settings.service.form.name" : "Naam", 276 "settings.service.form.name" : "Naam",
218 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy instellingen", 277 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy instellingen",
219 "settings.service.form.proxy.host" : "Proxy Host\/IP", 278 "settings.service.form.proxy.host" : "Proxy Host\/IP",
@@ -233,15 +292,15 @@
233 "settings.services.discoverServices" : "Ontdek services", 292 "settings.services.discoverServices" : "Ontdek services",
234 "settings.services.headline" : "Jouw services", 293 "settings.services.headline" : "Jouw services",
235 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.", 294 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.",
236 "settings.services.servicesRequestFailed" : "Kan jouw diensten niet laden", 295 "settings.services.servicesRequestFailed" : "Kan jouw services niet laden",
237 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld", 296 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld",
238 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld", 297 "settings.services.tooltip.isMuted" : "Geluid is uitgeschakeld",
239 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld", 298 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld",
240 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen", 299 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen",
241 "settings.team.contentHeadline" : "Ferdi voor groepen", 300 "settings.team.contentHeadline" : "Franz voor Teams",
242 "settings.team.copy" : "Ferdi voor Teams geeft je de mogelijkheid om collega's uit te nodigen voor je team door hen een e-mail te sturen en hun inschrijvingen te beheren in je accountvoorkeuren. Verspil geen tijd met het instellen van inschrijvingen voor elk teamlid apart, vergeet meerdere facturen en verschillende afrekeningsperiodes - één team regeert alles!", 301 "settings.team.copy" : "Franz voor Teams geeft je de mogelijkheid om collega's uit te nodigen voor je team door hen een e-mail te sturen en hun inschrijvingen te beheren in je accountvoorkeuren. Verspil geen tijd met het instellen van inschrijvingen voor elk individueel teamlid, vergeet meerdere facturen en verschillende afrekeningsperiodes - één team om alles te regelen!",
243 "settings.team.headline" : "Team", 302 "settings.team.headline" : "Team",
244 "settings.team.intro" : "Gebruiken jij en je team Franz? Je kunt nu Premium inschrijvingen beheren voor zoveel collega's, vrienden, of familieleden als je wilt, allemaal vanaf één account.", 303 "settings.team.intro" : "Gebruiken jij en je team Franz? Je kunt nu Premium inschrijvingen beheren voor zoveel collega's, vrienden, of familieleden als je wilt. En dat alles vanuit één account.",
245 "settings.team.manageAction" : "Beheer je Team op meetfranz.com", 304 "settings.team.manageAction" : "Beheer je Team op meetfranz.com",
246 "settings.team.upgradeAction" : "Jouw Account opwaarderen", 305 "settings.team.upgradeAction" : "Jouw Account opwaarderen",
247 "settings.user.form.accountType.company" : "Bedrijf", 306 "settings.user.form.accountType.company" : "Bedrijf",
@@ -258,75 +317,66 @@
258 "settings.workspace.form.buttonDelete" : "Verwijder werkruimte", 317 "settings.workspace.form.buttonDelete" : "Verwijder werkruimte",
259 "settings.workspace.form.buttonSave" : "Sla werkruimte op", 318 "settings.workspace.form.buttonSave" : "Sla werkruimte op",
260 "settings.workspace.form.name" : "Naam", 319 "settings.workspace.form.name" : "Naam",
261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Diensten in deze werkruimte", 320 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in deze werkruimte",
262 "settings.workspace.form.yourWorkspaces" : "Jouw werkruimtes", 321 "settings.workspace.form.yourWorkspaces" : "Jouw werkruimtes",
263 "settings.workspaces.deletedInfo" : "Werkruimte is verwijderd", 322 "settings.workspaces.deletedInfo" : "Werkruimte is verwijderd",
264 "settings.workspaces.headline" : "Jouw werkplaatsen", 323 "settings.workspaces.headline" : "Jouw werkplaatsen",
265 "settings.workspaces.noWorkspacesAdded" : "Je hebt nog geen werkruimtes toegevoegd.", 324 "settings.workspaces.noWorkspacesAdded" : "Je hebt nog geen werkruimtes toegevoegd.",
266 "settings.workspaces.tryReloadWorkspaces" : "Probeer opnieuw", 325 "settings.workspaces.tryReloadWorkspaces" : "Probeer opnieuw",
267 "settings.workspaces.updatedInfo" : "Je wijzigingen zijn opgeslagen", 326 "settings.workspaces.updatedInfo" : "Je wijzigingen zijn opgeslagen",
268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Zie hier Ferdi Werkruimtes", 327 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Zie hier Franz Werkruimtes",
269 "settings.workspaces.workspaceFeatureInfo" : "Ferdi werkruimtes laat je aandacht geven aan wat nu belangrijk is. Maak verschillende sets van diensten aan en schakel gelijk wanneer tussen de verschillende sets.Jij beslist welke diensten je wanneer en waar nodig hebt, enkel zo kunnen wij jou helpen je focus te behouden. Of net makkelijk de switch te maken van werk naar ontspanning.", 328 "settings.workspaces.workspaceFeatureInfo" : "Franz werkruimtes laat je aandacht geven aan wat nu belangrijk is. Maak verschillende sets van services aan en schakel wanneer je wilt tussen de verschillende sets. Jij beslist welke services je wanneer en waar nodig hebt. Zo helpen wij jou je focus te behouden - of net zo gemakkelijk te switchen van werk naar ontspanning.",
270 "settings.workspaces.workspacesRequestFailed" : "Kan jouw werkruimtes niet laden", 329 "settings.workspaces.workspacesRequestFailed" : "Kan jouw werkruimtes niet laden",
271 "sidebar.addNewService" : "Voeg service toe", 330 "sidebar.addNewService" : "Voeg service toe",
272 "sidebar.closeWorkspaceDrawer" : "Werkruimte pagina sluiten", 331 "sidebar.closeWorkspaceDrawer" : "Werkruimte pagina sluiten",
273 "sidebar.muteApp" : "Schakel berichten & geluid uit", 332 "sidebar.muteApp" : "Berichten & geluid uitschakelen",
274 "sidebar.openWorkspaceDrawer" : "Werkruimte pagina openen", 333 "sidebar.openWorkspaceDrawer" : "Werkruimte pagina openen",
275 "sidebar.settings" : "Instellingen", 334 "sidebar.settings" : "Instellingen",
276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen", 335 "sidebar.unmuteApp" : "Berichten & geluid inschakelen",
277 "signup.company.label" : "Bedrijf",
278 "signup.email.label" : "E-mailadres", 336 "signup.email.label" : "E-mailadres",
279 "signup.emailDuplicate" : "Er bestaat al een gebruiker met dat e-mailadres", 337 "signup.emailDuplicate" : "Er bestaat al een gebruiker met dat e-mailadres",
280 "signup.firstname.label" : "Voornaam", 338 "signup.firstname.label" : "Voornaam",
281 "signup.headline" : "Aanmelden", 339 "signup.headline" : "Aanmelden",
282 "signup.lastname.label" : "Achternaam", 340 "signup.lastname.label" : "Achternaam",
283 "signup.legal.info" : "Door een Franz-account aan te maken ga je akkoord met de", 341 "signup.legal.info" : "Door een Franz-account aan te maken ga je akkoord met de",
284 "signup.legal.privacy" : "Privacy Voorwaarden", 342 "signup.legal.privacy" : "Privacyvoorwaarden",
285 "signup.legal.terms" : "Gebruiksvoorwaarden", 343 "signup.legal.terms" : "Gebruiksvoorwaarden",
286 "signup.link.login" : "Al een account? Log in!", 344 "signup.link.login" : "Heb je al een account? Log in!",
287 "signup.password.label" : "Wachtwoord", 345 "signup.password.label" : "Wachtwoord",
288 "signup.submit.label" : "Account aanmaken", 346 "signup.submit.label" : "Account aanmaken",
289 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Geen advertenties, nooit!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "komt binnenkort", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Proxy understeuning voor diensten", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
296 "subscription.features.workspaces" : "Beheer je diensten in de werkruimtes",
297 "subscription.includedFeatures" : "Betaald Ferdi Premium Supporter Account bevat",
298 "subscription.paymentSessionError" : "Kan betaalformulier niet initialiseren",
299 "subscription.submit.label" : "Ik wil de ontwikkeling van Ferdi ondersteunen",
300 "subscription.type.free" : "gratis",
301 "subscription.type.month" : "maand",
302 "subscription.type.year" : "jaar",
303 "subscriptionPopup.buttonCancel" : "Annuleer", 353 "subscriptionPopup.buttonCancel" : "Annuleer",
304 "subscriptionPopup.buttonDone" : "Klaar", 354 "subscriptionPopup.buttonDone" : "Klaar",
305 "tabs.item.deleteService" : "Verwijder service", 355 "tabs.item.deleteService" : "Verwijder service",
306 "tabs.item.disableAudio" : "Schakel audio uit", 356 "tabs.item.disableAudio" : "Audio uitschakelen",
307 "tabs.item.disableNotifications" : "Schakel meldingen uit", 357 "tabs.item.disableNotifications" : "Meldingen uitschakelen",
308 "tabs.item.disableService" : "Schakel service uit", 358 "tabs.item.disableService" : "Service uitschakelen",
309 "tabs.item.edit" : "Bewerken", 359 "tabs.item.edit" : "Bewerken",
310 "tabs.item.enableAudio" : "Audio inschakelen", 360 "tabs.item.enableAudio" : "Audio inschakelen",
311 "tabs.item.enableNotification" : "Meldingen inschakelen", 361 "tabs.item.enableNotification" : "Meldingen inschakelen",
312 "tabs.item.enableService" : "Service inschakelen", 362 "tabs.item.enableService" : "Service inschakelen",
313 "tabs.item.reload" : "Herladen", 363 "tabs.item.reload" : "Herladen",
314 "validation.email" : "{field} is niet geldig", 364 "validation.email" : "{field} is niet geldig",
315 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn", 365 "validation.minLength" : "{field} dient minimaal {length} karakters lang te zijn",
316 "validation.oneRequired" : "Er is op zijn minst één vereist", 366 "validation.oneRequired" : "Minstens één vereist",
317 "validation.required" : "{field} is vereist", 367 "validation.required" : "{field} is vereist",
318 "validation.url" : "{field} is niet een geldige URL", 368 "validation.url" : "{field} is geen geldige URL",
319 "welcome.loginButton" : "Log in op je account", 369 "welcome.loginButton" : "Log in op je account",
320 "welcome.signupButton" : "Maak een gratis account", 370 "welcome.signupButton" : "Maak een gratis account",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Voeg een nieuwe werkruimte toe", 371 "workspaceDrawer.addNewWorkspaceLabel" : "Voeg een nieuwe werkruimte toe",
322 "workspaceDrawer.allServices" : "Alle diensten", 372 "workspaceDrawer.allServices" : "Alle services",
323 "workspaceDrawer.headline" : "Werkruimtes", 373 "workspaceDrawer.headline" : "Werkruimtes",
324 "workspaceDrawer.item.contextMenuEdit" : "bewerken", 374 "workspaceDrawer.item.contextMenuEdit" : "bewerken",
325 "workspaceDrawer.item.noServicesAddedYet" : "Nog geen diensten toegevoegd", 375 "workspaceDrawer.item.noServicesAddedYet" : "Nog geen services toegevoegd",
326 "workspaceDrawer.premiumCtaButtonLabel" : "Maak je eerste werkruimte", 376 "workspaceDrawer.premiumCtaButtonLabel" : "Maak je eerste werkruimte",
327 "workspaceDrawer.proFeatureBadge" : "Premium feature", 377 "workspaceDrawer.proFeatureBadge" : "Premium feature",
328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Heractiveer premium account", 378 "workspaceDrawer.reactivatePremiumAccountLabel" : "Premium account heractiveren",
329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Ferdi werkruimtes laat je aandacht geven aan wat nu belangrijk is. Maak verschillende sets van diensten aan en schakel gelijk wanneer tussen de verschillende sets.<\/p><p>Jij beslist welke diensten je wanneer en waar nodig hebt, enkel zo kunnen wij jou helpen je focus te behouden. Of net makkelijk de switch te maken van werk naar ontspanning.<\/p>", 379 "workspaceDrawer.workspaceFeatureInfo" : "Franz werkruimtes laat je aandacht geven aan wat nu belangrijk is. Maak verschillende sets van services aan en schakel wanneer je wilt tussen de verschillende sets. Jij beslist welke services je wanneer en waar nodig hebt. Zo helpen wij jou je focus te behouden - of net zo gemakkelijk te switchen van werk naar ontspanning.",
330 "workspaceDrawer.workspacesSettingsTooltip" : "Pas werkruimte instellingen aan", 380 "workspaceDrawer.workspacesSettingsTooltip" : "Werkruimte instellingen aanpassen",
331 "workspaces.switchingIndicator.switchingTo" : "Overschakelen naar" 381 "workspaces.switchingIndicator.switchingTo" : "Overschakelen naar"
332} 382}
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index f94c6e10c..57d25c1f5 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -2,24 +2,34 @@
2 "app.errorHandler.action" : "Odśwież", 2 "app.errorHandler.action" : "Odśwież",
3 "app.errorHandler.headline" : "Coś poszło nie tak.", 3 "app.errorHandler.headline" : "Coś poszło nie tak.",
4 "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}", 4 "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}",
5 "feature.delayApp.action" : "Uzyskaj licencję Ferdi Supporter", 5 "feature.delayApp.headline" : "Aby nie czekać, kup licencję Franz Supporter",
6 "feature.delayApp.headline" : "Aby nie czekać, kup licencję Ferdi Supporter", 6 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.",
7 "feature.delayApp.text" : "Ferdi będzie kontynuował za {seconds} sekund.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Uzyskaj licencjÄ™ Franz Supporter",
11 "feature.delayApp.upgrade.actionShort" : "Ulepsz swoje konto",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Wyślij jako email", 13 "feature.shareFranz.action.email" : "Wyślij jako email",
9 "feature.shareFranz.action.facebook" : "Udostępnij na Facebooku", 14 "feature.shareFranz.action.facebook" : "Udostępnij na Facebooku",
10 "feature.shareFranz.action.twitter" : "Udostępnij na Twitterze", 15 "feature.shareFranz.action.twitter" : "Udostępnij na Twitterze",
11 "feature.shareFranz.headline" : "Ferdi jest lepszy, gdy tworzymy go razem!", 16 "feature.shareFranz.headline" : "Ferdi jest lepszy, gdy tworzymy go razem!",
12 "feature.shareFranz.shareText.email" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikację z WhatsApp, Messenger, Slack, Skype i innymi na www.meetfranz.com", 17 "feature.shareFranz.shareText.email" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikację z WhatsApp, Messenger, Slack, Skype i innymi na www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikację z WhatsApp, Messenger, Slack, Skype i innymi na www.meetfranz.com \/cc @FranzMessenger", 18 "feature.shareFranz.shareText.twitter" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikację z WhatsApp, Messenger, Slack, Skype i innymi na www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Powiedz znajomym i kolegom o tym, jak odlotowy jest Ferdi i pomóż nam go spopularyzować.", 19 "feature.shareFranz.text" : "Powiedz znajomym i kolegom o tym, jak odlotowy jest Franz i pomóż nam go spopularyzować.",
15 "global.api.unhealthy" : "Nie można połączyć się z usługami Ferdi online", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.", 25 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.",
17 "global.spellchecker.useDefault" : "Użyj domyślnego dla systemu ({default})", 26 "global.spellchecker.useDefault" : "Użyj domyślnego dla systemu ({default})",
18 "global.spellchecking.autodetect" : "Automatycznie wykryj język", 27 "global.spellchecking.autodetect" : "Automatycznie wykryj język",
19 "global.spellchecking.autodetect.short" : "Automatycznie", 28 "global.spellchecking.autodetect.short" : "Automatycznie",
20 "global.spellchecking.language" : "Język sprawdzania pisowni", 29 "global.spellchecking.language" : "Język sprawdzania pisowni",
21 "import.headline" : "Importuj usługi Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Usługi, które nie są jeszcze obsługiwane w Ferdi 5", 31 "import.headline" : "Importuj usługi Franz 4",
32 "import.notSupportedHeadline" : "Usługi, które nie są jeszcze obsługiwane w Franz 5",
23 "import.skip.label" : "Chcę dodać usługi samodzielnie", 33 "import.skip.label" : "Chcę dodać usługi samodzielnie",
24 "import.submit.label" : "Zaimportuj usługi", 34 "import.submit.label" : "Zaimportuj usługi",
25 "infobar.buttonChangelog" : "Co nowego?", 35 "infobar.buttonChangelog" : "Co nowego?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Odśwież usługi", 37 "infobar.buttonReloadServices" : "Odśwież usługi",
28 "infobar.requiredRequestsFailed" : "Nie można załadować usług i informacji użytkownika", 38 "infobar.requiredRequestsFailed" : "Nie można załadować usług i informacji użytkownika",
29 "infobar.servicesUpdated" : "Usługi zostały zaktualizowane.", 39 "infobar.servicesUpdated" : "Usługi zostały zaktualizowane.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Dostępna jest nowa wersja Franza.", 41 "infobar.updateAvailable" : "Dostępna jest nowa wersja Franza.",
31 "invite.email.label" : "Adres email", 42 "invite.email.label" : "Adres email",
32 "invite.headline.friends" : "Zaproś 3 znajomych lub kolegów", 43 "invite.headline.friends" : "Zaproś 3 znajomych lub kolegów",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.", 54 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.",
44 "login.submit.label" : "Zaloguj siÄ™", 55 "login.submit.label" : "Zaloguj siÄ™",
45 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.", 56 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "O Franz", 59 "menu.app.about" : "O Franz",
47 "menu.app.announcement" : "Co słychać?", 60 "menu.app.announcement" : "Co słychać?",
48 "menu.app.checkForUpdates" : "Sprawdź aktualizacje", 61 "menu.app.checkForUpdates" : "Sprawdź aktualizacje",
@@ -68,6 +81,9 @@
68 "menu.file" : "Plik", 81 "menu.file" : "Plik",
69 "menu.help" : "Pomoc", 82 "menu.help" : "Pomoc",
70 "menu.help.changelog" : "Lista zmian", 83 "menu.help.changelog" : "Lista zmian",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Dowiedz się więcej", 87 "menu.help.learnMore" : "Dowiedz się więcej",
72 "menu.help.privacy" : "Polityka prywatności", 88 "menu.help.privacy" : "Polityka prywatności",
73 "menu.help.support" : "Wsparcie", 89 "menu.help.support" : "Wsparcie",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "WÅ‚Ä…cz poprzedni serwis", 92 "menu.services.activatePreviousService" : "WÅ‚Ä…cz poprzedni serwis",
77 "menu.services.addNewService" : "Dodaj nową usługę...", 93 "menu.services.addNewService" : "Dodaj nową usługę...",
78 "menu.services.setNextServiceActive" : "WÅ‚Ä…cz kolejny serwis", 94 "menu.services.setNextServiceActive" : "WÅ‚Ä…cz kolejny serwis",
95 "menu.todos" : "Todos",
79 "menu.view" : "Widok", 96 "menu.view" : "Widok",
80 "menu.view.enterFullScreen" : "Włącz tryb pełnoekranowy", 97 "menu.view.enterFullScreen" : "Włącz tryb pełnoekranowy",
81 "menu.view.exitFullScreen" : "Zakończ tryb pełnoekranowy", 98 "menu.view.exitFullScreen" : "Zakończ tryb pełnoekranowy",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Pokaż narzędzia developerskie", 102 "menu.view.toggleDevTools" : "Pokaż narzędzia developerskie",
86 "menu.view.toggleFullScreen" : "Przełącz tryb pełnoekranowy", 103 "menu.view.toggleFullScreen" : "Przełącz tryb pełnoekranowy",
87 "menu.view.toggleServiceDevTools" : "Włącz narzędzia developerskie usługi", 104 "menu.view.toggleServiceDevTools" : "Włącz narzędzia developerskie usługi",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Powiększ", 106 "menu.view.zoomIn" : "Powiększ",
89 "menu.view.zoomOut" : "Pomniejsz", 107 "menu.view.zoomOut" : "Pomniejsz",
90 "menu.window" : "Okno", 108 "menu.window" : "Okno",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Wyślij", 121 "password.submit.label" : "Wyślij",
104 "password.successInfo" : "Proszę sprawdzić swój email", 122 "password.successInfo" : "Proszę sprawdzić swój email",
105 "premiumFeature.button.upgradeAccount" : "Ulepsz swoje konto", 123 "premiumFeature.button.upgradeAccount" : "Ulepsz swoje konto",
106 "pricing.headline" : "Wspieraj Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Nie chcę wspierać rozwoju aplikacji Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Chcę wspierać rozwój aplikacji Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Wybierz swój plan wsparcia", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Obszary robocze",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Przeładuj {name}", 151 "service.crashHandler.action" : "Przeładuj {name}",
111 "service.crashHandler.autoReload" : "Próba automatycznego odnowienia {name} za {seconds} sekund\/y", 152 "service.crashHandler.autoReload" : "Próba automatycznego odnowienia {name} za {seconds} sekund\/y",
112 "service.crashHandler.headline" : "O nie!", 153 "service.crashHandler.headline" : "O nie!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "O nie!", 159 "service.errorHandler.headline" : "O nie!",
119 "service.errorHandler.message" : "BÅ‚Ä…d", 160 "service.errorHandler.message" : "BÅ‚Ä…d",
120 "service.errorHandler.text" : "Nie udało się załadować {name}.", 161 "service.errorHandler.text" : "Nie udało się załadować {name}.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Åadowanie", 167 "service.webviewLoader.loading" : "Åadowanie",
122 "services.getStarted" : "Zacznij", 168 "services.getStarted" : "Zacznij",
123 "services.welcome" : "Witaj w programie Franz", 169 "services.welcome" : "Witaj w programie Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Zmień hasło", 181 "settings.account.headlinePassword" : "Zmień hasło",
136 "settings.account.headlineProfile" : "Uaktualnij profil", 182 "settings.account.headlineProfile" : "Uaktualnij profil",
137 "settings.account.headlineSubscription" : "Twoja subskrypcja", 183 "settings.account.headlineSubscription" : "Twoja subskrypcja",
138 "settings.account.headlineUpgrade" : "Ulepsz swoje konto i wspieraj aplikacjÄ™ Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Pobierz", 186 "settings.account.invoiceDownload" : "Pobierz",
140 "settings.account.manageSubscription.label" : "ZarzÄ…dzaj swoimi subskrypcjami", 187 "settings.account.manageSubscription.label" : "ZarzÄ…dzaj swoimi subskrypcjami",
141 "settings.account.successInfo" : "Twoje zmiany zostały zapisane", 188 "settings.account.successInfo" : "Twoje zmiany zostały zapisane",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Spróbuj ponownie", 192 "settings.account.tryReloadServices" : "Spróbuj ponownie",
143 "settings.account.tryReloadUserInfoRequest" : "Spróbuj ponownie", 193 "settings.account.tryReloadUserInfoRequest" : "Spróbuj ponownie",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Nie można wczytać informacji o użytkowniku", 195 "settings.account.userInfoRequestFailed" : "Nie można wczytać informacji o użytkowniku",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Wyczyść pamięć podręczną (cache)", 197 "settings.app.buttonClearAllCache" : "Wyczyść pamięć podręczną (cache)",
146 "settings.app.buttonInstallUpdate" : "Uruchom ponownie i zainstaluj aktualizacjÄ™", 198 "settings.app.buttonInstallUpdate" : "Uruchom ponownie i zainstaluj aktualizacjÄ™",
147 "settings.app.buttonSearchForUpdate" : "Sprawdź aktualizacje", 199 "settings.app.buttonSearchForUpdate" : "Sprawdź aktualizacje",
@@ -154,6 +206,7 @@
154 "settings.app.form.enableGPUAcceleration" : "WÅ‚Ä…cz akceleracjÄ™ GPU", 206 "settings.app.form.enableGPUAcceleration" : "WÅ‚Ä…cz akceleracjÄ™ GPU",
155 "settings.app.form.enableSpellchecking" : "WÅ‚Ä…cz sprawdzanie pisowni", 207 "settings.app.form.enableSpellchecking" : "WÅ‚Ä…cz sprawdzanie pisowni",
156 "settings.app.form.enableSystemTray" : "Pokaż Franza w obszarze powiadomień", 208 "settings.app.form.enableSystemTray" : "Pokaż Franza w obszarze powiadomień",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Język", 210 "settings.app.form.language" : "Język",
158 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikacjÄ™ Franz", 211 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikacjÄ™ Franz",
159 "settings.app.form.runInBackground" : "Zachowaj aplikację Ferdi w tle po zamknięciu okna", 212 "settings.app.form.runInBackground" : "Zachowaj aplikację Ferdi w tle po zamknięciu okna",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Twoje usługi", 235 "settings.navigation.yourServices" : "Twoje usługi",
183 "settings.navigation.yourWorkspaces" : "Twoje obszary robocze", 236 "settings.navigation.yourWorkspaces" : "Twoje obszary robocze",
184 "settings.recipes.all" : "Wszystkie usługi", 237 "settings.recipes.all" : "Wszystkie usługi",
185 "settings.recipes.dev" : "Rozwojowe", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Dostępne usługi", 245 "settings.recipes.headline" : "Dostępne usługi",
187 "settings.recipes.missingService" : "Brak usługi?", 246 "settings.recipes.missingService" : "Brak usługi?",
188 "settings.recipes.mostPopular" : "Najpopularniejsze", 247 "settings.recipes.mostPopular" : "Najpopularniejsze",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Otwórz edycję obszaru roboczego", 333 "sidebar.openWorkspaceDrawer" : "Otwórz edycję obszaru roboczego",
275 "sidebar.settings" : "Ustawienia", 334 "sidebar.settings" : "Ustawienia",
276 "sidebar.unmuteApp" : "Włącz powiadomienia i dźwięki", 335 "sidebar.unmuteApp" : "Włącz powiadomienia i dźwięki",
277 "signup.company.label" : "Firma",
278 "signup.email.label" : "Adres email", 336 "signup.email.label" : "Adres email",
279 "signup.emailDuplicate" : "Użytkownik z takim adresem email już istnieje", 337 "signup.emailDuplicate" : "Użytkownik z takim adresem email już istnieje",
280 "signup.firstname.label" : "ImiÄ™", 338 "signup.firstname.label" : "ImiÄ™",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "za darmo", 358 "subscription.type.free" : "za darmo",
301 "subscription.type.month" : "miesiÄ…c", 359 "subscription.type.month" : "miesiÄ…c",
302 "subscription.type.year" : "rok", 360 "subscription.type.year" : "rok",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Anuluj", 367 "subscriptionPopup.buttonCancel" : "Anuluj",
304 "subscriptionPopup.buttonDone" : "Zrobione", 368 "subscriptionPopup.buttonDone" : "Zrobione",
305 "tabs.item.deleteService" : "Usuń usługę", 369 "tabs.item.deleteService" : "Usuń usługę",
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 1a94c9179..f2c139193 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Recarregar", 2 "app.errorHandler.action" : "Recarregar",
3 "app.errorHandler.headline" : "Opa! Algo deu errado.", 3 "app.errorHandler.headline" : "Opa! Algo deu errado.",
4 "feature.announcements.changelog.headline" : "Mudanças no Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Mudanças no Franz {version}",
5 "feature.delayApp.action" : "Adquira uma licença de suporte Franz",
6 "feature.delayApp.headline" : "Por favor, adquira uma licença para pular o tempo de espera", 5 "feature.delayApp.headline" : "Por favor, adquira uma licença para pular o tempo de espera",
7 "feature.delayApp.text" : "Ferdi continuará em {seconds} segundos.", 6 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.",
7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Adquira uma licença de suporte Franz",
11 "feature.delayApp.upgrade.actionShort" : "Atualizar conta",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Enviar por e-mail", 13 "feature.shareFranz.action.email" : "Enviar por e-mail",
9 "feature.shareFranz.action.facebook" : "Compartilhar no Facebook", 14 "feature.shareFranz.action.facebook" : "Compartilhar no Facebook",
10 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter", 15 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter",
11 "feature.shareFranz.headline" : "Ferdi é melhor em grupo!", 16 "feature.shareFranz.headline" : "Ferdi é 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", 17 "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" : "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", 18 "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 quanto incrível o Ferdi é e nos ajude a espalhar a mensagem. ", 19 "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quanto incrível o Franz é e nos ajude a espalhar a mensagem. ",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.", 23 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Você não está conectado à internet", 25 "global.notConnectedToTheInternet" : "Você não está conectado à internet",
17 "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})", 26 "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})",
18 "global.spellchecking.autodetect" : "Detectar idioma automaticamente.", 27 "global.spellchecking.autodetect" : "Detectar idioma automaticamente.",
19 "global.spellchecking.autodetect.short" : "Automático", 28 "global.spellchecking.autodetect.short" : "Automático",
20 "global.spellchecking.language" : "Idioma para verificação ortográfica", 29 "global.spellchecking.language" : "Idioma para verificação ortográfica",
21 "import.headline" : "Importe seus serviços do Ferdi 4 ", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Ferdi 5 ", 31 "import.headline" : "Importe seus serviços do Franz 4 ",
32 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ",
23 "import.skip.label" : "Quero adicionar serviços manualmente", 33 "import.skip.label" : "Quero adicionar serviços manualmente",
24 "import.submit.label" : "Importar serviços", 34 "import.submit.label" : "Importar serviços",
25 "infobar.buttonChangelog" : "O que há de novo?", 35 "infobar.buttonChangelog" : "O que há de novo?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Recarregar serviços", 37 "infobar.buttonReloadServices" : "Recarregar serviços",
28 "infobar.requiredRequestsFailed" : "Não foi possível carregar os serviços e informações de usuário", 38 "infobar.requiredRequestsFailed" : "Não foi possível carregar os serviços e informações de usuário",
29 "infobar.servicesUpdated" : "Seus serviços foram atualizados.", 39 "infobar.servicesUpdated" : "Seus serviços foram atualizados.",
30 "infobar.updateAvailable" : "Uma nova atualização do Ferdi está disponível.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Uma nova atualização do Franz está disponível.",
31 "invite.email.label" : "Endereço de E-mail", 42 "invite.email.label" : "Endereço de E-mail",
32 "invite.headline.friends" : "Convide 3 amigos ou colegas", 43 "invite.headline.friends" : "Convide 3 amigos ou colegas",
33 "invite.name.label" : "Nome", 44 "invite.name.label" : "Nome",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Sua sessão expirou, faça o login novamente.", 54 "login.serverLogout" : "Sua sessão expirou, faça o login novamente.",
44 "login.submit.label" : "Entrar", 55 "login.submit.label" : "Entrar",
45 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.", 56 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Sobre Franz", 59 "menu.app.about" : "Sobre Franz",
47 "menu.app.announcement" : "Quais as novidades?", 60 "menu.app.announcement" : "Quais as novidades?",
48 "menu.app.checkForUpdates" : "Verificar se há atualizações", 61 "menu.app.checkForUpdates" : "Verificar se há atualizações",
@@ -68,6 +81,9 @@
68 "menu.file" : "Arquivo", 81 "menu.file" : "Arquivo",
69 "menu.help" : "Ajuda", 82 "menu.help" : "Ajuda",
70 "menu.help.changelog" : "Registro de Alterações ", 83 "menu.help.changelog" : "Registro de Alterações ",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Saiba Mais ", 87 "menu.help.learnMore" : "Saiba Mais ",
72 "menu.help.privacy" : "Declaração de Privacidade ", 88 "menu.help.privacy" : "Declaração de Privacidade ",
73 "menu.help.support" : "Suporte", 89 "menu.help.support" : "Suporte",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Pular para serviço anterior", 92 "menu.services.activatePreviousService" : "Pular para serviço anterior",
77 "menu.services.addNewService" : "Adicionar Novo Serviço", 93 "menu.services.addNewService" : "Adicionar Novo Serviço",
78 "menu.services.setNextServiceActive" : "Pular para próximo serviço", 94 "menu.services.setNextServiceActive" : "Pular para próximo serviço",
95 "menu.todos" : "Todos",
79 "menu.view" : "Visualizar ", 96 "menu.view" : "Visualizar ",
80 "menu.view.enterFullScreen" : "Modo Tela Cheia", 97 "menu.view.enterFullScreen" : "Modo Tela Cheia",
81 "menu.view.exitFullScreen" : "Sair da Tela Cheia", 98 "menu.view.exitFullScreen" : "Sair da Tela Cheia",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Ferramentas de Desenvolvedor", 102 "menu.view.toggleDevTools" : "Ferramentas de Desenvolvedor",
86 "menu.view.toggleFullScreen" : "Modo Tela Cheia", 103 "menu.view.toggleFullScreen" : "Modo Tela Cheia",
87 "menu.view.toggleServiceDevTools" : "Ferramentas de Serviços de Desenvolvedor", 104 "menu.view.toggleServiceDevTools" : "Ferramentas de Serviços de Desenvolvedor",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Ampliar", 106 "menu.view.zoomIn" : "Ampliar",
89 "menu.view.zoomOut" : "Reduzir", 107 "menu.view.zoomOut" : "Reduzir",
90 "menu.window" : "Modo Janela", 108 "menu.window" : "Modo Janela",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Enviar", 121 "password.submit.label" : "Enviar",
104 "password.successInfo" : "Por favor, verifique o seu e-mail", 122 "password.successInfo" : "Por favor, verifique o seu e-mail",
105 "premiumFeature.button.upgradeAccount" : "Atualizar conta", 123 "premiumFeature.button.upgradeAccount" : "Atualizar conta",
106 "pricing.headline" : "Apoie o Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Eu não quero apoiar o desenvolvimento do Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Eu quero apoiar o desenvolvimento do Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Selecione uma opção de plano", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Recarregar {name}", 151 "service.crashHandler.action" : "Recarregar {name}",
111 "service.crashHandler.autoReload" : "Tentando reestabelecer {name} automaticamente em {seconds} segundos", 152 "service.crashHandler.autoReload" : "Tentando reestabelecer {name} automaticamente em {seconds} segundos",
112 "service.crashHandler.headline" : "Ah, não!", 153 "service.crashHandler.headline" : "Ah, não!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Ah, não!", 159 "service.errorHandler.headline" : "Ah, não!",
119 "service.errorHandler.message" : "Erro", 160 "service.errorHandler.message" : "Erro",
120 "service.errorHandler.text" : "{name} não pôde ser carregado.", 161 "service.errorHandler.text" : "{name} não pôde ser carregado.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Carregando", 167 "service.webviewLoader.loading" : "Carregando",
122 "services.getStarted" : "Iniciar", 168 "services.getStarted" : "Iniciar",
123 "services.welcome" : "Bem-vindo ao Franz!", 169 "services.welcome" : "Bem-vindo ao Franz!",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Mudar senha", 181 "settings.account.headlinePassword" : "Mudar senha",
136 "settings.account.headlineProfile" : "Atualizar perfil", 182 "settings.account.headlineProfile" : "Atualizar perfil",
137 "settings.account.headlineSubscription" : "Sua assinatura", 183 "settings.account.headlineSubscription" : "Sua assinatura",
138 "settings.account.headlineUpgrade" : "Atualize a sua conta e ajude o Franz!", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Baixar", 186 "settings.account.invoiceDownload" : "Baixar",
140 "settings.account.manageSubscription.label" : "Gerencie a sua assinatura", 187 "settings.account.manageSubscription.label" : "Gerencie a sua assinatura",
141 "settings.account.successInfo" : "Suas alterações foram gravadas", 188 "settings.account.successInfo" : "Suas alterações foram gravadas",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Tente novamente", 192 "settings.account.tryReloadServices" : "Tente novamente",
143 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente", 193 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário", 195 "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Limpar cache", 197 "settings.app.buttonClearAllCache" : "Limpar cache",
146 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar atualização", 198 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar atualização",
147 "settings.app.buttonSearchForUpdate" : "Verificar por atualizações", 199 "settings.app.buttonSearchForUpdate" : "Verificar por atualizações",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Venha para o Lado Negro da força", 205 "settings.app.form.darkMode" : "Venha para o Lado Negro da força",
154 "settings.app.form.enableGPUAcceleration" : "Ativar Aceleração de GPU", 206 "settings.app.form.enableGPUAcceleration" : "Ativar Aceleração de GPU",
155 "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica", 207 "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica",
156 "settings.app.form.enableSystemTray" : "Exibir o Ferdi na barra de sistema", 208 "settings.app.form.enableSystemTray" : "Exibir o Franz na barra de sistema",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Idioma", 210 "settings.app.form.language" : "Idioma",
158 "settings.app.form.minimizeToSystemTray" : "Minimizar o Ferdi para a área de sistema", 211 "settings.app.form.minimizeToSystemTray" : "Minimizar o Ferdi para a área de sistema",
159 "settings.app.form.runInBackground" : "Manter o Ferdi no fundo quando fechar a janela", 212 "settings.app.form.runInBackground" : "Manter o Ferdi no fundo quando fechar a janela",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Seus serviços", 235 "settings.navigation.yourServices" : "Seus serviços",
183 "settings.navigation.yourWorkspaces" : "Suas áreas de trabalho", 236 "settings.navigation.yourWorkspaces" : "Suas áreas de trabalho",
184 "settings.recipes.all" : "Todos os serviços", 237 "settings.recipes.all" : "Todos os serviços",
185 "settings.recipes.dev" : "Desenvolvimento", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Serviços disponíveis", 245 "settings.recipes.headline" : "Serviços disponíveis",
187 "settings.recipes.missingService" : "Sentiu falta de algum serviço?", 246 "settings.recipes.missingService" : "Sentiu falta de algum serviço?",
188 "settings.recipes.mostPopular" : "Mais populares", 247 "settings.recipes.mostPopular" : "Mais populares",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Abrir menu da área de trabalho", 333 "sidebar.openWorkspaceDrawer" : "Abrir menu da área de trabalho",
275 "sidebar.settings" : "Ajustes", 334 "sidebar.settings" : "Ajustes",
276 "sidebar.unmuteApp" : "Ativar notificações e áudio", 335 "sidebar.unmuteApp" : "Ativar notificações e áudio",
277 "signup.company.label" : "Empresa",
278 "signup.email.label" : "Endereço de e-mail", 336 "signup.email.label" : "Endereço de e-mail",
279 "signup.emailDuplicate" : "Já existe um usuário com este endereço de e-mail", 337 "signup.emailDuplicate" : "Já existe um usuário com este endereço de e-mail",
280 "signup.firstname.label" : "Nome", 338 "signup.firstname.label" : "Nome",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "grátis", 358 "subscription.type.free" : "grátis",
301 "subscription.type.month" : "mês", 359 "subscription.type.month" : "mês",
302 "subscription.type.year" : "ano", 360 "subscription.type.year" : "ano",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Cancelar", 367 "subscriptionPopup.buttonCancel" : "Cancelar",
304 "subscriptionPopup.buttonDone" : "Feito", 368 "subscriptionPopup.buttonDone" : "Feito",
305 "tabs.item.deleteService" : "Excluir serviço", 369 "tabs.item.deleteService" : "Excluir serviço",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index ced5c9183..bad62fdf3 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -1,23 +1,33 @@
1{ 1{
2 "app.errorHandler.action" : "Recarregar", 2 "app.errorHandler.action" : "Recarregar",
3 "app.errorHandler.headline" : "Alguma coisa correu mal", 3 "app.errorHandler.headline" : "Alguma coisa correu mal",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Faz parte do grupo de apoio do Franz", 5 "feature.delayApp.headline" : "Por favor compre uma licença Franz Supporter para saltar a fila de espera",
6 "feature.delayApp.headline" : "Por favor compre uma licença Ferdi Supporter para saltar a fila de espera", 6 "feature.delayApp.text" : "Franz irá continuar em {seconds} segundos.",
7 "feature.delayApp.text" : "Ferdi irá continuar em {seconds} segundos.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Faz parte do grupo de apoio do Franz",
11 "feature.delayApp.upgrade.actionShort" : "Atualiza a tua conta",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Enviar por e-mail", 13 "feature.shareFranz.action.email" : "Enviar por e-mail",
9 "feature.shareFranz.action.facebook" : "Compartilahr no Facebook", 14 "feature.shareFranz.action.facebook" : "Compartilahr no Facebook",
10 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter", 15 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz", 23 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Não estás ligado à Internet", 25 "global.notConnectedToTheInternet" : "Não estás ligado à Internet",
17 "global.spellchecker.useDefault" : "Utilizar o Sistema por Omissão ({default})", 26 "global.spellchecker.useDefault" : "Utilizar o Sistema por Omissão ({default})",
18 "global.spellchecking.autodetect" : "Detectar a lingua automaticamente", 27 "global.spellchecking.autodetect" : "Detectar a lingua automaticamente",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Linguagem para correção ortográfica", 29 "global.spellchecking.language" : "Linguagem para correção ortográfica",
30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
21 "import.headline" : "Importa os teus serviços do Franz", 31 "import.headline" : "Importa os teus serviços do Franz",
22 "import.notSupportedHeadline" : "Estes serviços ainda não são suportados pelo Ferdi 5", 32 "import.notSupportedHeadline" : "Estes serviços ainda não são suportados pelo Ferdi 5",
23 "import.skip.label" : "Eu quero adicionar serviços manualmente", 33 "import.skip.label" : "Eu quero adicionar serviços manualmente",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Recarregar serviços", 37 "infobar.buttonReloadServices" : "Recarregar serviços",
28 "infobar.requiredRequestsFailed" : "Não foi possível carregar os serviços e informações do utilizador", 38 "infobar.requiredRequestsFailed" : "Não foi possível carregar os serviços e informações do utilizador",
29 "infobar.servicesUpdated" : "Os seus serviços foram atualizados.", 39 "infobar.servicesUpdated" : "Os seus serviços foram atualizados.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Está disponível uma nova atualização para o Franz", 41 "infobar.updateAvailable" : "Está disponível uma nova atualização para o Franz",
31 "invite.email.label" : "Endereço de e-mail", 42 "invite.email.label" : "Endereço de e-mail",
32 "invite.headline.friends" : "Convide 3 amigos ou colegas", 43 "invite.headline.friends" : "Convide 3 amigos ou colegas",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "A sua sessão expirou, inicie sessão novamente.", 54 "login.serverLogout" : "A sua sessão expirou, inicie sessão novamente.",
44 "login.submit.label" : "Iniciar sessão", 55 "login.submit.label" : "Iniciar sessão",
45 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.", 56 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Sobre o Franz", 59 "menu.app.about" : "Sobre o Franz",
47 "menu.app.announcement" : "O que há de novo?", 60 "menu.app.announcement" : "O que há de novo?",
48 "menu.app.checkForUpdates" : "Procurar atualizações", 61 "menu.app.checkForUpdates" : "Procurar atualizações",
@@ -68,6 +81,9 @@
68 "menu.file" : "Ficheiro", 81 "menu.file" : "Ficheiro",
69 "menu.help" : "Ajuda", 82 "menu.help" : "Ajuda",
70 "menu.help.changelog" : "Registo de alterações", 83 "menu.help.changelog" : "Registo de alterações",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Saber mais", 87 "menu.help.learnMore" : "Saber mais",
72 "menu.help.privacy" : "Declaração de privacidade", 88 "menu.help.privacy" : "Declaração de privacidade",
73 "menu.help.support" : "Suporte", 89 "menu.help.support" : "Suporte",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activar o serviço anterior", 92 "menu.services.activatePreviousService" : "Activar o serviço anterior",
77 "menu.services.addNewService" : "Adicionar Novo Serviço...", 93 "menu.services.addNewService" : "Adicionar Novo Serviço...",
78 "menu.services.setNextServiceActive" : "Activar o próximo serviço", 94 "menu.services.setNextServiceActive" : "Activar o próximo serviço",
95 "menu.todos" : "Todos",
79 "menu.view" : "Ver", 96 "menu.view" : "Ver",
80 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo", 97 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo",
81 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo", 98 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento", 102 "menu.view.toggleDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento",
86 "menu.view.toggleFullScreen" : "Ativar\/Desativar Ecrã Completo", 103 "menu.view.toggleFullScreen" : "Ativar\/Desativar Ecrã Completo",
87 "menu.view.toggleServiceDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento de Serviços", 104 "menu.view.toggleServiceDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento de Serviços",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Aumentar", 106 "menu.view.zoomIn" : "Aumentar",
89 "menu.view.zoomOut" : "Reduzir", 107 "menu.view.zoomOut" : "Reduzir",
90 "menu.window" : "Janela", 108 "menu.window" : "Janela",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Submeter", 121 "password.submit.label" : "Submeter",
104 "password.successInfo" : "Por favor verifique o seu endereço de e-mail", 122 "password.successInfo" : "Por favor verifique o seu endereço de e-mail",
105 "premiumFeature.button.upgradeAccount" : "Atualiza a tua conta", 123 "premiumFeature.button.upgradeAccount" : "Atualiza a tua conta",
106 "pricing.headline" : "Apoie o Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Não pretendo patrocinar o desenvolvimento do Franz", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Pretendo patrocinar o desenvolvimento do Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Selecione o seu plano", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Espaços de trabalho",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Recarregar {name}", 151 "service.crashHandler.action" : "Recarregar {name}",
111 "service.crashHandler.autoReload" : "A tentar restaurar automaticamente {name} em {seconds} segundos", 152 "service.crashHandler.autoReload" : "A tentar restaurar automaticamente {name} em {seconds} segundos",
112 "service.crashHandler.headline" : "Oh não!", 153 "service.crashHandler.headline" : "Oh não!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Oh não!", 159 "service.errorHandler.headline" : "Oh não!",
119 "service.errorHandler.message" : "Erro", 160 "service.errorHandler.message" : "Erro",
120 "service.errorHandler.text" : "{name} falhou o carregamento", 161 "service.errorHandler.text" : "{name} falhou o carregamento",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "A ler", 167 "service.webviewLoader.loading" : "A ler",
122 "services.getStarted" : "Vamos começar", 168 "services.getStarted" : "Vamos começar",
123 "services.welcome" : "Bem-vindo ao Franz", 169 "services.welcome" : "Bem-vindo ao Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Alterar palavra-passe", 181 "settings.account.headlinePassword" : "Alterar palavra-passe",
136 "settings.account.headlineProfile" : "Atualizar perfil", 182 "settings.account.headlineProfile" : "Atualizar perfil",
137 "settings.account.headlineSubscription" : "A sua subscrição", 183 "settings.account.headlineSubscription" : "A sua subscrição",
138 "settings.account.headlineUpgrade" : "Atualize a sua conta e ajude o Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Transferir", 186 "settings.account.invoiceDownload" : "Transferir",
140 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições", 187 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições",
141 "settings.account.successInfo" : "As suas alterações foram efetuadas com sucesso", 188 "settings.account.successInfo" : "As suas alterações foram efetuadas com sucesso",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Tentar novamente", 192 "settings.account.tryReloadServices" : "Tentar novamente",
143 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente", 193 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador", 195 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Limpar cache", 197 "settings.app.buttonClearAllCache" : "Limpar cache",
146 "settings.app.buttonInstallUpdate" : "Reiniciar & instalar atualização", 198 "settings.app.buttonInstallUpdate" : "Reiniciar & instalar atualização",
147 "settings.app.buttonSearchForUpdate" : "Procurar atualizações", 199 "settings.app.buttonSearchForUpdate" : "Procurar atualizações",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Junta-te ao Lado Negro", 205 "settings.app.form.darkMode" : "Junta-te ao Lado Negro",
154 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU", 206 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU",
155 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica", 207 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica",
156 "settings.app.form.enableSystemTray" : "Mostrar o Ferdi na barra do sistema", 208 "settings.app.form.enableSystemTray" : "Mostrar o Franz na barra do sistema",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Idioma", 210 "settings.app.form.language" : "Idioma",
158 "settings.app.form.minimizeToSystemTray" : "Minimizar o Ferdi para a barra do sistema", 211 "settings.app.form.minimizeToSystemTray" : "Minimizar o Ferdi para a barra do sistema",
159 "settings.app.form.runInBackground" : "Manter o Ferdi em segundo plano ao fechar a janela", 212 "settings.app.form.runInBackground" : "Manter o Ferdi em segundo plano ao fechar a janela",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Os seus serviços", 235 "settings.navigation.yourServices" : "Os seus serviços",
183 "settings.navigation.yourWorkspaces" : "Os teus Espaços de trabalho", 236 "settings.navigation.yourWorkspaces" : "Os teus Espaços de trabalho",
184 "settings.recipes.all" : "Todos os serviços", 237 "settings.recipes.all" : "Todos os serviços",
185 "settings.recipes.dev" : "Desenvolvimento", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Serviços disponíveis", 245 "settings.recipes.headline" : "Serviços disponíveis",
187 "settings.recipes.missingService" : "Falta um serviço?", 246 "settings.recipes.missingService" : "Falta um serviço?",
188 "settings.recipes.mostPopular" : "Os mais populares", 247 "settings.recipes.mostPopular" : "Os mais populares",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Abrir a janela do Espaço de trabalho", 333 "sidebar.openWorkspaceDrawer" : "Abrir a janela do Espaço de trabalho",
275 "sidebar.settings" : "Definições", 334 "sidebar.settings" : "Definições",
276 "sidebar.unmuteApp" : "Ativar notificações e áudio", 335 "sidebar.unmuteApp" : "Ativar notificações e áudio",
277 "signup.company.label" : "Empresa",
278 "signup.email.label" : "Endereço de email", 336 "signup.email.label" : "Endereço de email",
279 "signup.emailDuplicate" : "Já existe uma conta associada a este endereço de email", 337 "signup.emailDuplicate" : "Já existe uma conta associada a este endereço de email",
280 "signup.firstname.label" : "Primeiro Nome", 338 "signup.firstname.label" : "Primeiro Nome",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "Já tem uma conta, iniciar sessão?", 344 "signup.link.login" : "Já tem uma conta, iniciar sessão?",
287 "signup.password.label" : "Palavra-passe", 345 "signup.password.label" : "Palavra-passe",
288 "signup.submit.label" : "Criar uma conta", 346 "signup.submit.label" : "Criar uma conta",
289 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Sem anúncios, para sempre!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "em breve", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "Sem atrasos na aplicação nem mensagens para comprar uma licença", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Adicione serviços como Mattermost no local ou online", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Suporte Proxy para os serviços", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Suporte para correção ortográfica",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Ao subscrever uma Conta Premium, tem acesso a",
298 "subscription.paymentSessionError" : "Erro no serviço de pagamento",
299 "subscription.submit.label" : "Pretendo ajudar o desenvolvimento do Franz",
300 "subscription.type.free" : "gratuito",
301 "subscription.type.month" : "mês",
302 "subscription.type.year" : "ano",
303 "subscriptionPopup.buttonCancel" : "Cancelar", 353 "subscriptionPopup.buttonCancel" : "Cancelar",
304 "subscriptionPopup.buttonDone" : "Concluído", 354 "subscriptionPopup.buttonDone" : "Concluído",
305 "tabs.item.deleteService" : "Apagar serviço", 355 "tabs.item.deleteService" : "Apagar serviço",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 369b95a41..03b339dd5 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Перезагрузить", 2 "app.errorHandler.action" : "Перезагрузить",
3 "app.errorHandler.headline" : "Что-то пошло не так", 3 "app.errorHandler.headline" : "Что-то пошло не так",
4 "feature.announcements.changelog.headline" : "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² верÑии Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² верÑии Franz {version}",
5 "feature.delayApp.action" : "Получите лицензию Ferdi Supporter", 5 "feature.delayApp.headline" : "ПожалуйÑта приобретите лицензию Franz Supporter чтобы убрать ожидание",
6 "feature.delayApp.headline" : "ПожалуйÑта приобретите лицензию Ferdi Supporter чтобы убрать ожидание", 6 "feature.delayApp.text" : "Franz продолжит работу через {seconds} Ñекунд.",
7 "feature.delayApp.text" : "Ferdi продолжит работу через {seconds} Ñекунд.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Получите лицензию Franz Supporter",
11 "feature.delayApp.upgrade.actionShort" : "Перейти на платную подпиÑку",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Отправить email", 13 "feature.shareFranz.action.email" : "Отправить email",
9 "feature.shareFranz.action.facebook" : "ПоделитьÑÑ Ð½Ð° Facebook", 14 "feature.shareFranz.action.facebook" : "ПоделитьÑÑ Ð½Ð° Facebook",
10 "feature.shareFranz.action.twitter" : "ПоделитьÑÑ Ð² Twitter", 15 "feature.shareFranz.action.twitter" : "ПоделитьÑÑ Ð² Twitter",
11 "feature.shareFranz.headline" : "Сделаем Ferdi лучше вмеÑте!", 16 "feature.shareFranz.headline" : "Сделаем Ferdi лучше вмеÑте!",
12 "feature.shareFranz.shareText.email" : "Я добавил {count} ÑервиÑов во Franz! Теперь доÑтупны такие меÑÑенджеры как WhatsApp, Messenger, Slack, Skype и другие. Полый ÑпиÑок вы найдете на www.meetfranz.com", 17 "feature.shareFranz.shareText.email" : "Я добавил {count} ÑервиÑов во Franz! Теперь доÑтупны такие меÑÑенджеры как WhatsApp, Messenger, Slack, Skype и другие. Полый ÑпиÑок вы найдете на www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Я добавил {count} ÑервиÑ(ов) в Franz! Скачай беÑплатную аппку Ð´Ð»Ñ WhatsApp, Messenger, Slack, Skype и иже на www.meetfranz.com \/cc @FranzMessenger", 18 "feature.shareFranz.shareText.twitter" : "Я добавил {count} ÑервиÑ(ов) в Franz! Скачай беÑплатную аппку Ð´Ð»Ñ WhatsApp, Messenger, Slack, Skype и иже на www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "РаÑÑкажи Ñвоим друзьÑм и коллегам наÑколько прелеÑтен Ferdi и помоги нам развитьÑÑ", 19 "feature.shareFranz.text" : "РаÑÑкажи Ñвоим друзьÑм и коллегам наÑколько прелеÑтен Franz и помоги нам развитьÑÑ",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Ðевозможно подключитьÑÑ Ðº онлайн-ÑервиÑам Franz", 23 "global.api.unhealthy" : "Ðевозможно подключитьÑÑ Ðº онлайн-ÑервиÑам Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Ð’Ñ‹ не подключены к Ñети Интернет", 25 "global.notConnectedToTheInternet" : "Ð’Ñ‹ не подключены к Ñети Интернет",
17 "global.spellchecker.useDefault" : "ИÑпользовать ÑиÑтемные параметры по умолчанию ({default})", 26 "global.spellchecker.useDefault" : "ИÑпользовать ÑиÑтемные параметры по умолчанию ({default})",
18 "global.spellchecking.autodetect" : "Ðайти Ñзык автоматичеÑки", 27 "global.spellchecking.autodetect" : "Ðайти Ñзык автоматичеÑки",
19 "global.spellchecking.autodetect.short" : "Ðвто", 28 "global.spellchecking.autodetect.short" : "Ðвто",
20 "global.spellchecking.language" : "Проверка правопиÑаниÑ", 29 "global.spellchecking.language" : "Проверка правопиÑаниÑ",
21 "import.headline" : "Импортировать ваши ÑервиÑÑ‹ из Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "СервиÑÑ‹ пока ещё не поддерживаютÑÑ Ð² Ferdi 5", 31 "import.headline" : "Импортировать ваши ÑервиÑÑ‹ из Franz 4",
32 "import.notSupportedHeadline" : "СервиÑÑ‹ пока ещё не поддерживаютÑÑ Ð² Franz 5",
23 "import.skip.label" : "Я хочу добавить ÑервиÑÑ‹ вручную", 33 "import.skip.label" : "Я хочу добавить ÑервиÑÑ‹ вручную",
24 "import.submit.label" : "Импортировать ÑервиÑÑ‹", 34 "import.submit.label" : "Импортировать ÑервиÑÑ‹",
25 "infobar.buttonChangelog" : "Что новенького?", 35 "infobar.buttonChangelog" : "Что новенького?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Перезагрузить ÑервиÑÑ‹", 37 "infobar.buttonReloadServices" : "Перезагрузить ÑервиÑÑ‹",
28 "infobar.requiredRequestsFailed" : "Ðевозможно загрузить ÑервиÑÑ‹ и информацию пользователÑ", 38 "infobar.requiredRequestsFailed" : "Ðевозможно загрузить ÑервиÑÑ‹ и информацию пользователÑ",
29 "infobar.servicesUpdated" : "Ваши ÑервиÑÑ‹ были обновлены.", 39 "infobar.servicesUpdated" : "Ваши ÑервиÑÑ‹ были обновлены.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "ДоÑтупно обновление Franz.", 41 "infobar.updateAvailable" : "ДоÑтупно обновление Franz.",
31 "invite.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты", 42 "invite.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
32 "invite.headline.friends" : "ПриглаÑите 3-Ñ… друзей или коллег", 43 "invite.headline.friends" : "ПриглаÑите 3-Ñ… друзей или коллег",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "СеÑÑÐ¸Ñ ÑƒÑтарела, пожалуйÑта, войдите Ñнова.", 54 "login.serverLogout" : "СеÑÑÐ¸Ñ ÑƒÑтарела, пожалуйÑта, войдите Ñнова.",
44 "login.submit.label" : "Вход", 55 "login.submit.label" : "Вход",
45 "login.tokenExpired" : "СеÑÑÐ¸Ñ ÑƒÑтарела, пожалуйÑта, войдите Ñнова.", 56 "login.tokenExpired" : "СеÑÑÐ¸Ñ ÑƒÑтарела, пожалуйÑта, войдите Ñнова.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "О Franz", 59 "menu.app.about" : "О Franz",
47 "menu.app.announcement" : "Что нового?", 60 "menu.app.announcement" : "Что нового?",
48 "menu.app.checkForUpdates" : "Проверить обновлениÑ", 61 "menu.app.checkForUpdates" : "Проверить обновлениÑ",
@@ -68,6 +81,9 @@
68 "menu.file" : "Файл", 81 "menu.file" : "Файл",
69 "menu.help" : "Справка", 82 "menu.help" : "Справка",
70 "menu.help.changelog" : "Журнал изменений", 83 "menu.help.changelog" : "Журнал изменений",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Подробнее", 87 "menu.help.learnMore" : "Подробнее",
72 "menu.help.privacy" : "Политика конфиденциальноÑти", 88 "menu.help.privacy" : "Политика конфиденциальноÑти",
73 "menu.help.support" : "Поддержка", 89 "menu.help.support" : "Поддержка",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Ðктивировать предыдущий Ñервич", 92 "menu.services.activatePreviousService" : "Ðктивировать предыдущий Ñервич",
77 "menu.services.addNewService" : "Добавить новый ÑервиÑ...", 93 "menu.services.addNewService" : "Добавить новый ÑервиÑ...",
78 "menu.services.setNextServiceActive" : "Ðктивировать Ñледующий ÑервиÑ", 94 "menu.services.setNextServiceActive" : "Ðктивировать Ñледующий ÑервиÑ",
95 "menu.todos" : "Todos",
79 "menu.view" : "Вид", 96 "menu.view" : "Вид",
80 "menu.view.enterFullScreen" : "Ðа веÑÑŒ Ñкран", 97 "menu.view.enterFullScreen" : "Ðа веÑÑŒ Ñкран",
81 "menu.view.exitFullScreen" : "В окне", 98 "menu.view.exitFullScreen" : "В окне",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Показать инÑтрументы разработчика", 102 "menu.view.toggleDevTools" : "Показать инÑтрументы разработчика",
86 "menu.view.toggleFullScreen" : "ПереключитьÑÑ Ð½Ð° полный Ñкран", 103 "menu.view.toggleFullScreen" : "ПереключитьÑÑ Ð½Ð° полный Ñкран",
87 "menu.view.toggleServiceDevTools" : "Показать инÑтрументы разработчика ÑервиÑа", 104 "menu.view.toggleServiceDevTools" : "Показать инÑтрументы разработчика ÑервиÑа",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Увеличить маÑштаб", 106 "menu.view.zoomIn" : "Увеличить маÑштаб",
89 "menu.view.zoomOut" : "Уменьшить маÑштаб", 107 "menu.view.zoomOut" : "Уменьшить маÑштаб",
90 "menu.window" : "Окно", 108 "menu.window" : "Окно",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "ПринÑÑ‚ÑŒ", 121 "password.submit.label" : "ПринÑÑ‚ÑŒ",
104 "password.successInfo" : "Проверьте вашу Ñлектронную почту", 122 "password.successInfo" : "Проверьте вашу Ñлектронную почту",
105 "premiumFeature.button.upgradeAccount" : "Перейти на платную подпиÑку", 123 "premiumFeature.button.upgradeAccount" : "Перейти на платную подпиÑку",
106 "pricing.headline" : "Поддержать Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Я хочу поддержать разработку Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Выберите ваш план поддержки", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Окружение",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Перезагрузить {name}", 151 "service.crashHandler.action" : "Перезагрузить {name}",
111 "service.crashHandler.autoReload" : "ПытаюÑÑŒ автоматичеÑки воÑÑтановить {name} в течение {seconds} Ñекунд", 152 "service.crashHandler.autoReload" : "ПытаюÑÑŒ автоматичеÑки воÑÑтановить {name} в течение {seconds} Ñекунд",
112 "service.crashHandler.headline" : "О, нет!", 153 "service.crashHandler.headline" : "О, нет!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "О, нет!", 159 "service.errorHandler.headline" : "О, нет!",
119 "service.errorHandler.message" : "Ошибка", 160 "service.errorHandler.message" : "Ошибка",
120 "service.errorHandler.text" : "{name} не Ñмог загрузитьÑÑ.", 161 "service.errorHandler.text" : "{name} не Ñмог загрузитьÑÑ.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Загрузка", 167 "service.webviewLoader.loading" : "Загрузка",
122 "services.getStarted" : "Ðачать работу", 168 "services.getStarted" : "Ðачать работу",
123 "services.welcome" : "Добро пожаловать во Franz", 169 "services.welcome" : "Добро пожаловать во Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Сменить пароль", 181 "settings.account.headlinePassword" : "Сменить пароль",
136 "settings.account.headlineProfile" : "Обновить профиль", 182 "settings.account.headlineProfile" : "Обновить профиль",
137 "settings.account.headlineSubscription" : "Ваша подпиÑка", 183 "settings.account.headlineSubscription" : "Ваша подпиÑка",
138 "settings.account.headlineUpgrade" : "Улучшить аккаунт и поддержать Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Скачать", 186 "settings.account.invoiceDownload" : "Скачать",
140 "settings.account.manageSubscription.label" : "Управление вашей подпиÑкой", 187 "settings.account.manageSubscription.label" : "Управление вашей подпиÑкой",
141 "settings.account.successInfo" : "Ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ Ñохранены", 188 "settings.account.successInfo" : "Ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ Ñохранены",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Попробовать Ñнова", 192 "settings.account.tryReloadServices" : "Попробовать Ñнова",
143 "settings.account.tryReloadUserInfoRequest" : "Попробовать Ñнова", 193 "settings.account.tryReloadUserInfoRequest" : "Попробовать Ñнова",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Ðевозможно загрузить информацию пользователÑ", 195 "settings.account.userInfoRequestFailed" : "Ðевозможно загрузить информацию пользователÑ",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "ОчиÑтить кÑш", 197 "settings.app.buttonClearAllCache" : "ОчиÑтить кÑш",
146 "settings.app.buttonInstallUpdate" : "ПерезапуÑтить и обновить", 198 "settings.app.buttonInstallUpdate" : "ПерезапуÑтить и обновить",
147 "settings.app.buttonSearchForUpdate" : "Проверить обновлениÑ", 199 "settings.app.buttonSearchForUpdate" : "Проверить обновлениÑ",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Перейти на Тёмную Ñторону", 205 "settings.app.form.darkMode" : "Перейти на Тёмную Ñторону",
154 "settings.app.form.enableGPUAcceleration" : "Включить уÑкорение GPU", 206 "settings.app.form.enableGPUAcceleration" : "Включить уÑкорение GPU",
155 "settings.app.form.enableSpellchecking" : "Включить проверку правопиÑаниÑ", 207 "settings.app.form.enableSpellchecking" : "Включить проверку правопиÑаниÑ",
156 "settings.app.form.enableSystemTray" : "Показывать Ferdi в ÑиÑтемном трее", 208 "settings.app.form.enableSystemTray" : "Показывать Franz в ÑиÑтемном трее",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Язык", 210 "settings.app.form.language" : "Язык",
158 "settings.app.form.minimizeToSystemTray" : "Сворачивать Ferdi в ÑиÑтемный трей", 211 "settings.app.form.minimizeToSystemTray" : "Сворачивать Ferdi в ÑиÑтемный трей",
159 "settings.app.form.runInBackground" : "ОÑтавлÑÑ‚ÑŒ Ferdi в фоне при закрытии окна", 212 "settings.app.form.runInBackground" : "ОÑтавлÑÑ‚ÑŒ Ferdi в фоне при закрытии окна",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Ваши ÑервиÑÑ‹", 235 "settings.navigation.yourServices" : "Ваши ÑервиÑÑ‹",
183 "settings.navigation.yourWorkspaces" : "Ваши окружениÑ", 236 "settings.navigation.yourWorkspaces" : "Ваши окружениÑ",
184 "settings.recipes.all" : "Ð’Ñе ÑервиÑÑ‹", 237 "settings.recipes.all" : "Ð’Ñе ÑервиÑÑ‹",
185 "settings.recipes.dev" : "Разработка", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "ДоÑтупные ÑервиÑÑ‹", 245 "settings.recipes.headline" : "ДоÑтупные ÑервиÑÑ‹",
187 "settings.recipes.missingService" : "Ðе можете найти ÑервиÑ?", 246 "settings.recipes.missingService" : "Ðе можете найти ÑервиÑ?",
188 "settings.recipes.mostPopular" : "Самые популÑрные", 247 "settings.recipes.mostPopular" : "Самые популÑрные",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Открыть меню окружений", 333 "sidebar.openWorkspaceDrawer" : "Открыть меню окружений",
275 "sidebar.settings" : "ÐаÑтройки", 334 "sidebar.settings" : "ÐаÑтройки",
276 "sidebar.unmuteApp" : "Включить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸ звук", 335 "sidebar.unmuteApp" : "Включить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸ звук",
277 "signup.company.label" : "ОрганизациÑ",
278 "signup.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты", 336 "signup.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
279 "signup.emailDuplicate" : "Пользователь Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом Ñлектронной почты уже ÑущеÑтвует", 337 "signup.emailDuplicate" : "Пользователь Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом Ñлектронной почты уже ÑущеÑтвует",
280 "signup.firstname.label" : "ИмÑ", 338 "signup.firstname.label" : "ИмÑ",
@@ -300,6 +358,12 @@
300 "subscription.type.free" : "беÑплатно", 358 "subscription.type.free" : "беÑплатно",
301 "subscription.type.month" : "меÑÑц", 359 "subscription.type.month" : "меÑÑц",
302 "subscription.type.year" : "год", 360 "subscription.type.year" : "год",
361 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
362 "subscription.cta.allOptions" : "See all options",
363 "subscription.cta.choosePlan" : "Choose your plan",
364 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
365 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
366 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
303 "subscriptionPopup.buttonCancel" : "Отмена", 367 "subscriptionPopup.buttonCancel" : "Отмена",
304 "subscriptionPopup.buttonDone" : "Готово", 368 "subscriptionPopup.buttonDone" : "Готово",
305 "tabs.item.deleteService" : "Удалить ÑервиÑ", 369 "tabs.item.deleteService" : "Удалить ÑервиÑ",
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index a9fd4e9f4..cb1170d00 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Obnoviť", 2 "app.errorHandler.action" : "Obnoviť",
3 "app.errorHandler.headline" : "NieÄo sa pokazilo", 3 "app.errorHandler.headline" : "NieÄo sa pokazilo",
4 "feature.announcements.changelog.headline" : "Zmeny vo Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Zmeny vo Franz {version}",
5 "feature.delayApp.action" : "Získajte licenciu pre Ferdi podporu", 5 "feature.delayApp.headline" : "Prosím, kúp si licenciu Franz Supporter a nebudeÅ¡ musieÅ¥ ÄakaÅ¥",
6 "feature.delayApp.headline" : "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text" : "Franz bude pokraÄovaÅ¥ v {seconds} sekundách.",
7 "feature.delayApp.text" : "Ferdi bude pokraÄovaÅ¥ v {seconds} seundách.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Získajte licenciu pre Franz podporu",
11 "feature.delayApp.upgrade.actionShort" : "UpgradovaÅ¥ úÄet",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Odoslať ako e-mail", 13 "feature.shareFranz.action.email" : "Odoslať ako e-mail",
9 "feature.shareFranz.action.facebook" : "Zdielať na Facebook-u", 14 "feature.shareFranz.action.facebook" : "Zdielať na Facebook-u",
10 "feature.shareFranz.action.twitter" : "Zdieľať na Twitter-i", 15 "feature.shareFranz.action.twitter" : "Zdieľať na Twitter-i",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Franz je lepší spolu!",
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", 17 "feature.shareFranz.shareText.email" : "Pridali sme {count} služieb do Franz! Získajte zadarmo aplikáciu pre WhatsApp, Messenger, Slack, Skype a iné 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", 18 "feature.shareFranz.shareText.twitter" : "Pridal som {count} služieb do Franz! Získajte zadarmo aplikáciu pre WhatsApp, Messenger, Slack, Skype a iné na www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Povedzte vašim priateľom a známym aký je Franz skvelý a pomôžte nám rozšíriť sa do sveta.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz", 23 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.", 25 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.",
17 "global.spellchecker.useDefault" : "Použiť predvolené nastavenie systému ({default})", 26 "global.spellchecker.useDefault" : "Použiť predvolené nastavenie systému ({default})",
18 "global.spellchecking.autodetect" : "Automaticky rozpoznať jazyk", 27 "global.spellchecking.autodetect" : "Automaticky rozpoznať jazyk",
19 "global.spellchecking.autodetect.short" : "Automatický", 28 "global.spellchecking.autodetect.short" : "Automatický",
20 "global.spellchecking.language" : "Jazyk kontroly pravopisu", 29 "global.spellchecking.language" : "Jazyk kontroly pravopisu",
21 "import.headline" : "Importovať vaše služby z Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Ferdi 5", 31 "import.headline" : "Importovať vaše služby z Franz 4",
32 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5",
23 "import.skip.label" : "Chcem pridaÅ¥ služby ruÄne", 33 "import.skip.label" : "Chcem pridaÅ¥ služby ruÄne",
24 "import.submit.label" : "Importovať služby", 34 "import.submit.label" : "Importovať služby",
25 "infobar.buttonChangelog" : "Čo je nového?", 35 "infobar.buttonChangelog" : "Čo je nového?",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Obnoviť služby", 37 "infobar.buttonReloadServices" : "Obnoviť služby",
28 "infobar.requiredRequestsFailed" : "Nie je možné naÄítaÅ¥ služby a informácie o používateľovi", 38 "infobar.requiredRequestsFailed" : "Nie je možné naÄítaÅ¥ služby a informácie o používateľovi",
29 "infobar.servicesUpdated" : "Vaše služby boli aktualizované.", 39 "infobar.servicesUpdated" : "Vaše služby boli aktualizované.",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Je k dispozícii nová aktualizácia Franz.", 41 "infobar.updateAvailable" : "Je k dispozícii nová aktualizácia Franz.",
31 "invite.email.label" : "E-mailová adresa", 42 "invite.email.label" : "E-mailová adresa",
32 "invite.headline.friends" : "Pozvite troch vašich priateľov alebo kolegov", 43 "invite.headline.friends" : "Pozvite troch vašich priateľov alebo kolegov",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Vaša relácia vypršala, prihláste sa prosím znovu.", 54 "login.serverLogout" : "Vaša relácia vypršala, prihláste sa prosím znovu.",
44 "login.submit.label" : "Prihlásiť sa", 55 "login.submit.label" : "Prihlásiť sa",
45 "login.tokenExpired" : "Vaša relácia vypršala, prihláste sa prosím znovu.", 56 "login.tokenExpired" : "Vaša relácia vypršala, prihláste sa prosím znovu.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "O aplikácii", 59 "menu.app.about" : "O aplikácii",
47 "menu.app.announcement" : "Čo je nové?", 60 "menu.app.announcement" : "Čo je nové?",
48 "menu.app.checkForUpdates" : "Skontrolovať aktualizácie", 61 "menu.app.checkForUpdates" : "Skontrolovať aktualizácie",
@@ -68,6 +81,9 @@
68 "menu.file" : "Súbor", 81 "menu.file" : "Súbor",
69 "menu.help" : "Pomocník", 82 "menu.help" : "Pomocník",
70 "menu.help.changelog" : "Záznam zmien", 83 "menu.help.changelog" : "Záznam zmien",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Zistiť viac", 87 "menu.help.learnMore" : "Zistiť viac",
72 "menu.help.privacy" : "Vyhlásenie o ochrane súkromia", 88 "menu.help.privacy" : "Vyhlásenie o ochrane súkromia",
73 "menu.help.support" : "Podpora", 89 "menu.help.support" : "Podpora",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Aktivovať predchádzajúcu službu", 92 "menu.services.activatePreviousService" : "Aktivovať predchádzajúcu službu",
77 "menu.services.addNewService" : "Pridať novú službu...", 93 "menu.services.addNewService" : "Pridať novú službu...",
78 "menu.services.setNextServiceActive" : "Aktivujte ÄalÅ¡iu službu", 94 "menu.services.setNextServiceActive" : "Aktivujte ÄalÅ¡iu službu",
95 "menu.todos" : "Todos",
79 "menu.view" : "Zobraziť", 96 "menu.view" : "Zobraziť",
80 "menu.view.enterFullScreen" : "Na celú obrazovku", 97 "menu.view.enterFullScreen" : "Na celú obrazovku",
81 "menu.view.exitFullScreen" : "UkonÄiÅ¥ režim na celú obrazovku", 98 "menu.view.exitFullScreen" : "UkonÄiÅ¥ režim na celú obrazovku",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Prepnúť vývojárske nástroje", 102 "menu.view.toggleDevTools" : "Prepnúť vývojárske nástroje",
86 "menu.view.toggleFullScreen" : "Prepnúť na celú obrazovku", 103 "menu.view.toggleFullScreen" : "Prepnúť na celú obrazovku",
87 "menu.view.toggleServiceDevTools" : "Prepnúť vývojárske nástroje služby", 104 "menu.view.toggleServiceDevTools" : "Prepnúť vývojárske nástroje služby",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Priblížiť", 106 "menu.view.zoomIn" : "Priblížiť",
89 "menu.view.zoomOut" : "Oddialiť", 107 "menu.view.zoomOut" : "Oddialiť",
90 "menu.window" : "Okno", 108 "menu.window" : "Okno",
@@ -92,9 +110,9 @@
92 "menu.window.minimize" : "Minimalizovať", 110 "menu.window.minimize" : "Minimalizovať",
93 "menu.workspaces" : "Pracovný priestor", 111 "menu.workspaces" : "Pracovný priestor",
94 "menu.workspaces.addNewWorkspace" : "Pridať nový pracovný priestor ...", 112 "menu.workspaces.addNewWorkspace" : "Pridať nový pracovný priestor ...",
95 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 113 "menu.workspaces.closeWorkspaceDrawer" : "Zavrieť workspace záložku",
96 "menu.workspaces.defaultWorkspace" : "Všetky služby", 114 "menu.workspaces.defaultWorkspace" : "Všetky služby",
97 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 115 "menu.workspaces.openWorkspaceDrawer" : "Otvoriť workspace záložku",
98 "password.email.label" : "E-mailová adresa", 116 "password.email.label" : "E-mailová adresa",
99 "password.headline" : "Obnoviť heslo", 117 "password.headline" : "Obnoviť heslo",
100 "password.link.login" : "PrihlásiÅ¥ sa do vášho úÄtu", 118 "password.link.login" : "PrihlásiÅ¥ sa do vášho úÄtu",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Odoslať", 121 "password.submit.label" : "Odoslať",
104 "password.successInfo" : "Skontrolujte prosím váš e-mail", 122 "password.successInfo" : "Skontrolujte prosím váš e-mail",
105 "premiumFeature.button.upgradeAccount" : "UpgradovaÅ¥ úÄet", 123 "premiumFeature.button.upgradeAccount" : "UpgradovaÅ¥ úÄet",
106 "pricing.headline" : "Podporiť Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Nechcem podporiť vývoj aplikácie Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Chcem podporiť vývoj aplikácie Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Vyberte si váš plán podpory", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Znovu naÄítaÅ¥ {name}", 151 "service.crashHandler.action" : "Znovu naÄítaÅ¥ {name}",
111 "service.crashHandler.autoReload" : "Najbližší pokus o automatické obnovenie {name} o {seconds} sekúnd", 152 "service.crashHandler.autoReload" : "Najbližší pokus o automatické obnovenie {name} o {seconds} sekúnd",
112 "service.crashHandler.headline" : "Ale nie!", 153 "service.crashHandler.headline" : "Ale nie!",
@@ -117,7 +158,12 @@
117 "service.errorHandler.editAction" : "Upraviť {name}", 158 "service.errorHandler.editAction" : "Upraviť {name}",
118 "service.errorHandler.headline" : "Ale nie!", 159 "service.errorHandler.headline" : "Ale nie!",
119 "service.errorHandler.message" : "Chyba", 160 "service.errorHandler.message" : "Chyba",
120 "service.errorHandler.text" : "{name} has failed to load.", 161 "service.errorHandler.text" : "{name} sa nepodarilo naÄítaÅ¥.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "NaÄítava", 167 "service.webviewLoader.loading" : "NaÄítava",
122 "services.getStarted" : "ZaÄíname", 168 "services.getStarted" : "ZaÄíname",
123 "services.welcome" : "Vítajte v aplikácii Franz", 169 "services.welcome" : "Vítajte v aplikácii Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Zmeniť heslo", 181 "settings.account.headlinePassword" : "Zmeniť heslo",
136 "settings.account.headlineProfile" : "Aktualizovať profil", 182 "settings.account.headlineProfile" : "Aktualizovať profil",
137 "settings.account.headlineSubscription" : "Vaše odoberanie", 183 "settings.account.headlineSubscription" : "Vaše odoberanie",
138 "settings.account.headlineUpgrade" : "Povýšte svoj úÄet a podporte Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Prevziať", 186 "settings.account.invoiceDownload" : "Prevziať",
140 "settings.account.manageSubscription.label" : "Spravovať vaše odoberanie", 187 "settings.account.manageSubscription.label" : "Spravovať vaše odoberanie",
141 "settings.account.successInfo" : "Vaše zmeny boli uložené", 188 "settings.account.successInfo" : "Vaše zmeny boli uložené",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Skúsiť znova", 192 "settings.account.tryReloadServices" : "Skúsiť znova",
143 "settings.account.tryReloadUserInfoRequest" : "Skúsiť znova", 193 "settings.account.tryReloadUserInfoRequest" : "Skúsiť znova",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Nebolo možné naÄítaÅ¥ informácie o používateľovi", 195 "settings.account.userInfoRequestFailed" : "Nebolo možné naÄítaÅ¥ informácie o používateľovi",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "VyÄistiÅ¥ vyrovnávaciu pamäť", 197 "settings.app.buttonClearAllCache" : "VyÄistiÅ¥ vyrovnávaciu pamäť",
146 "settings.app.buttonInstallUpdate" : "Reštartovať a nainštalovať aktualizáciu", 198 "settings.app.buttonInstallUpdate" : "Reštartovať a nainštalovať aktualizáciu",
147 "settings.app.buttonSearchForUpdate" : "Skontrolovať aktualizácie", 199 "settings.app.buttonSearchForUpdate" : "Skontrolovať aktualizácie",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Spustiť Dark Side", 205 "settings.app.form.darkMode" : "Spustiť Dark Side",
154 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie", 206 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie",
155 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu", 207 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu",
156 "settings.app.form.enableSystemTray" : "Zobrazovať Ferdi v systémovej lište", 208 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Jazyk", 210 "settings.app.form.language" : "Jazyk",
158 "settings.app.form.minimizeToSystemTray" : "Minimalizovať Ferdi do systémovej lišty", 211 "settings.app.form.minimizeToSystemTray" : "Minimalizovať Ferdi do systémovej lišty",
159 "settings.app.form.runInBackground" : "Po zatvorení okna ponechať Ferdi spustený na pozadí", 212 "settings.app.form.runInBackground" : "Po zatvorení okna ponechať Ferdi spustený na pozadí",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Vaše služby", 235 "settings.navigation.yourServices" : "Vaše služby",
183 "settings.navigation.yourWorkspaces" : "Tvoje pracovné priestory", 236 "settings.navigation.yourWorkspaces" : "Tvoje pracovné priestory",
184 "settings.recipes.all" : "Všetky služby", 237 "settings.recipes.all" : "Všetky služby",
185 "settings.recipes.dev" : "Vývoj", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Dostupné služby", 245 "settings.recipes.headline" : "Dostupné služby",
187 "settings.recipes.missingService" : "Chýba vám služba?", 246 "settings.recipes.missingService" : "Chýba vám služba?",
188 "settings.recipes.mostPopular" : "Najpopulárnejšie", 247 "settings.recipes.mostPopular" : "Najpopulárnejšie",
@@ -265,16 +324,15 @@
265 "settings.workspaces.noWorkspacesAdded" : "Zatiaľ si nepridal žiadne pracovné priestory.", 324 "settings.workspaces.noWorkspacesAdded" : "Zatiaľ si nepridal žiadne pracovné priestory.",
266 "settings.workspaces.tryReloadWorkspaces" : "Skúsiť znova", 325 "settings.workspaces.tryReloadWorkspaces" : "Skúsiť znova",
267 "settings.workspaces.updatedInfo" : "Vaše zmeny boli uložené", 326 "settings.workspaces.updatedInfo" : "Vaše zmeny boli uložené",
268 "settings.workspaces.workspaceFeatureHeadline" : "Menej je viac: Predstavenie Ferdi Pracovné priestory", 327 "settings.workspaces.workspaceFeatureHeadline" : "Menej je viac: Predstavenie Franz Pracovné priestory",
269 "settings.workspaces.workspaceFeatureInfo" : "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 328 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspace vám umožňujú sústrediÅ¥ sa na to, Äo je práve dôležité. Nastavte si rozliÄné skupiny služieb a jednoducho medzi nimi kedykoľvek prepínajte. Vy rozhodujete ktoré služby, kedy a kde potrebujete, a my vám potom vieme pomôcÅ¥ sústrediÅ¥ sa na prácu - alebo jednoducho prepnúť z práce na Äokoľvek iné.",
270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 329 "settings.workspaces.workspacesRequestFailed" : "Nebolo možné naÄítaÅ¥ vaÅ¡e workspace",
271 "sidebar.addNewService" : "Pridať novú službu", 330 "sidebar.addNewService" : "Pridať novú službu",
272 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 331 "sidebar.closeWorkspaceDrawer" : "Zavrieť workspace záložku",
273 "sidebar.muteApp" : "Vypnúť upozornenia a zvuky", 332 "sidebar.muteApp" : "Vypnúť upozornenia a zvuky",
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Otvoriť workspace záložku",
275 "sidebar.settings" : "Nastavenia", 334 "sidebar.settings" : "Nastavenia",
276 "sidebar.unmuteApp" : "Povoliť oznámenia a zvuky", 335 "sidebar.unmuteApp" : "Povoliť oznámenia a zvuky",
277 "signup.company.label" : "SpoloÄnosÅ¥",
278 "signup.email.label" : "E-mailová adresa", 336 "signup.email.label" : "E-mailová adresa",
279 "signup.emailDuplicate" : "Používateľ s touto e-mailovou adresou už jestvuje", 337 "signup.emailDuplicate" : "Používateľ s touto e-mailovou adresou už jestvuje",
280 "signup.firstname.label" : "Krstné meno", 338 "signup.firstname.label" : "Krstné meno",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "Už máte úÄet, chcete sa prihlásiÅ¥?", 344 "signup.link.login" : "Už máte úÄet, chcete sa prihlásiÅ¥?",
287 "signup.password.label" : "Heslo", 345 "signup.password.label" : "Heslo",
288 "signup.submit.label" : "VytvoriÅ¥ úÄet", 346 "signup.submit.label" : "VytvoriÅ¥ úÄet",
289 "subscription.euTaxInfo" : "Pre obyvateľov EÚ: môže byť aplikovaná miestna daň", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Žiadne reklamy, nikdy!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "už Äoskoro", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Proxy support for services", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Support for spellchecker",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Platený úÄet Premium Supporter Ferdi zahŕňa",
298 "subscription.paymentSessionError" : "Nepodarilo sa inicializovať platbu od",
299 "subscription.submit.label" : "Chcem podporiť vývoj aplikácie Franz",
300 "subscription.type.free" : "zdarma",
301 "subscription.type.month" : "mesiac",
302 "subscription.type.year" : "rok",
303 "subscriptionPopup.buttonCancel" : "Zrušiť", 353 "subscriptionPopup.buttonCancel" : "Zrušiť",
304 "subscriptionPopup.buttonDone" : "DokonÄiÅ¥", 354 "subscriptionPopup.buttonDone" : "DokonÄiÅ¥",
305 "tabs.item.deleteService" : "Odstrániť službu", 355 "tabs.item.deleteService" : "Odstrániť službu",
@@ -313,20 +363,20 @@
313 "tabs.item.reload" : "Obnoviť", 363 "tabs.item.reload" : "Obnoviť",
314 "validation.email" : "{field} je neplatný", 364 "validation.email" : "{field} je neplatný",
315 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov", 365 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov",
316 "validation.oneRequired" : "At least one is required", 366 "validation.oneRequired" : "Je nutné zadať aspoň jeden",
317 "validation.required" : "{field} je povinné", 367 "validation.required" : "{field} je povinné",
318 "validation.url" : "{field} nie je platné URL", 368 "validation.url" : "{field} nie je platné URL",
319 "welcome.loginButton" : "PrihlásiÅ¥ sa do vášho úÄtu", 369 "welcome.loginButton" : "PrihlásiÅ¥ sa do vášho úÄtu",
320 "welcome.signupButton" : "VytvoriÅ¥ úÄet zdarma", 370 "welcome.signupButton" : "VytvoriÅ¥ úÄet zdarma",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 371 "workspaceDrawer.addNewWorkspaceLabel" : "Pridať nový workspace",
322 "workspaceDrawer.allServices" : "Všetky služby", 372 "workspaceDrawer.allServices" : "Všetky služby",
323 "workspaceDrawer.headline" : "Pracovný priestor", 373 "workspaceDrawer.headline" : "Pracovné plochy",
324 "workspaceDrawer.item.contextMenuEdit" : "edit", 374 "workspaceDrawer.item.contextMenuEdit" : "Upraviť",
325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 375 "workspaceDrawer.item.noServicesAddedYet" : "Zatiaľ žiadne služby",
326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 376 "workspaceDrawer.premiumCtaButtonLabel" : "Vytvorte váš prvý workspace",
327 "workspaceDrawer.proFeatureBadge" : "Premium feature", 377 "workspaceDrawer.proFeatureBadge" : "Prémiová funkcia",
328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 378 "workspaceDrawer.reactivatePremiumAccountLabel" : "Obnovte svoj prémiový úÄet",
329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 379 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspace vám umožňujú sústrediÅ¥ sa na to, Äo je práve dôležité. Nastavte si rozliÄné skupiny služieb a jednoducho medzi nimi kedykoľvek prepínajte.<\/p><p>Vy rozhodujete ktoré služby, kedy a kde potrebujete, a my vám potom vieme pomôcÅ¥ sústrediÅ¥ sa na prácu - alebo jednoducho prepnúť z práce na Äokoľvek iné. <\/p>",
330 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 380 "workspaceDrawer.workspacesSettingsTooltip" : "Upraviť nastavenia workspace",
331 "workspaces.switchingIndicator.switchingTo" : "Switching to" 381 "workspaces.switchingIndicator.switchingTo" : "Prepínanie na"
332} 382}
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index 93d94d065..93e3fb139 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Ponovno uÄitavanje", 2 "app.errorHandler.action" : "Ponovno uÄitavanje",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Something went wrong",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Get a Ferdi Supporter License", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.headline" : "Please purchase a Ferdi Supporter License to skip waiting", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.delayApp.text" : "Ferdi will continue in {seconds} seconds.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Get a Franz Supporter License",
11 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Send as email", 13 "feature.shareFranz.action.email" : "Send as email",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 14 "feature.shareFranz.action.facebook" : "Share on Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 15 "feature.shareFranz.action.twitter" : "Share on Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Nije moguće pristupiti Franz-ovim on-line servisima. ", 23 "global.api.unhealthy" : "Nije moguće pristupiti Franz-ovim on-line servisima. ",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Niste povezani sa serverom.", 25 "global.notConnectedToTheInternet" : "Niste povezani sa serverom.",
17 "global.spellchecker.useDefault" : "Use System Default ({default})", 26 "global.spellchecker.useDefault" : "Use System Default ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Spell checking language", 29 "global.spellchecking.language" : "Spell checking language",
21 "import.headline" : "Uvezite svoje Ferdi 4 servise", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Servis trenutno nije podržan u Ferdi 5", 31 "import.headline" : "Uvezite svoje Franz 4 servise",
32 "import.notSupportedHeadline" : "Servis trenutno nije podržan u Franz 5",
23 "import.skip.label" : "Желим да додам уÑлуге ручно", 33 "import.skip.label" : "Желим да додам уÑлуге ручно",
24 "import.submit.label" : "Uvezi servise", 34 "import.submit.label" : "Uvezi servise",
25 "infobar.buttonChangelog" : "Å ta je novo? ", 35 "infobar.buttonChangelog" : "Å ta je novo? ",
@@ -27,6 +37,7 @@
27 "infobar.buttonReloadServices" : "Ponovo uÄitaj servise ", 37 "infobar.buttonReloadServices" : "Ponovo uÄitaj servise ",
28 "infobar.requiredRequestsFailed" : "Nemoguće uÄitati servise i korisniÄke informacije", 38 "infobar.requiredRequestsFailed" : "Nemoguće uÄitati servise i korisniÄke informacije",
29 "infobar.servicesUpdated" : "Vaši servisi su ažurirani. ", 39 "infobar.servicesUpdated" : "Vaši servisi su ažurirani. ",
40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
30 "infobar.updateAvailable" : "Novo ažuriranje Franz-a je dostupno. ", 41 "infobar.updateAvailable" : "Novo ažuriranje Franz-a je dostupno. ",
31 "invite.email.label" : "Vaša e-adresa", 42 "invite.email.label" : "Vaša e-adresa",
32 "invite.headline.friends" : "Pozovite 3 vaša prijatelja ili kolege", 43 "invite.headline.friends" : "Pozovite 3 vaša prijatelja ili kolege",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.", 54 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.",
44 "login.submit.label" : "Prijavite se", 55 "login.submit.label" : "Prijavite se",
45 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 56 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "O Francu", 59 "menu.app.about" : "O Francu",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Potraži ažuriranja", 61 "menu.app.checkForUpdates" : "Potraži ažuriranja",
@@ -68,6 +81,9 @@
68 "menu.file" : "Датотека", 81 "menu.file" : "Датотека",
69 "menu.help" : "Помоћ", 82 "menu.help" : "Помоћ",
70 "menu.help.changelog" : "Дневник измена", 83 "menu.help.changelog" : "Дневник измена",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Сазнајте више", 87 "menu.help.learnMore" : "Сазнајте више",
72 "menu.help.privacy" : "Izjava o privatnosti", 88 "menu.help.privacy" : "Izjava o privatnosti",
73 "menu.help.support" : "Подршка", 89 "menu.help.support" : "Подршка",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Додај нову уÑлугу", 93 "menu.services.addNewService" : "Додај нову уÑлугу",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "Преглед", 96 "menu.view" : "Преглед",
80 "menu.view.enterFullScreen" : "Отвори у целом екрану", 97 "menu.view.enterFullScreen" : "Отвори у целом екрану",
81 "menu.view.exitFullScreen" : "ÐапуÑти цео екран", 98 "menu.view.exitFullScreen" : "ÐапуÑти цео екран",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Промени алатке за развој", 102 "menu.view.toggleDevTools" : "Промени алатке за развој",
86 "menu.view.toggleFullScreen" : "Преко целог екрана", 103 "menu.view.toggleFullScreen" : "Преко целог екрана",
87 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 104 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Увећај приказ", 106 "menu.view.zoomIn" : "Увећај приказ",
89 "menu.view.zoomOut" : "Умањи приказ", 107 "menu.view.zoomOut" : "Умањи приказ",
90 "menu.window" : "У прозору", 108 "menu.window" : "У прозору",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Pošalji", 121 "password.submit.label" : "Pošalji",
104 "password.successInfo" : "Molimo Vas da provjerite vašu e-mail adresu", 122 "password.successInfo" : "Molimo Vas da provjerite vašu e-mail adresu",
105 "premiumFeature.button.upgradeAccount" : "Upgrade account", 123 "premiumFeature.button.upgradeAccount" : "Upgrade account",
106 "pricing.headline" : "Podržite Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Ne želim da podržim razvoj Franz-a.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Želim da podržim razvoj Franz-a.", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Izaberite vaš plan za podržavanje", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Osvježi {ime}", 151 "service.crashHandler.action" : "Osvježi {ime}",
111 "service.crashHandler.autoReload" : "Pokušaću automatski povratiti {ime} u {sekundi} sekundi", 152 "service.crashHandler.autoReload" : "Pokušaću automatski povratiti {ime} u {sekundi} sekundi",
112 "service.crashHandler.headline" : "O, ne! ", 153 "service.crashHandler.headline" : "O, ne! ",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "O, ne! ", 159 "service.errorHandler.headline" : "O, ne! ",
119 "service.errorHandler.message" : "Greška ", 160 "service.errorHandler.message" : "Greška ",
120 "service.errorHandler.text" : "{name} has failed to load.", 161 "service.errorHandler.text" : "{name} has failed to load.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "ZapoÄnimo! ", 168 "services.getStarted" : "ZapoÄnimo! ",
123 "services.welcome" : "Dobrodošli u Franz", 169 "services.welcome" : "Dobrodošli u Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Promijenite lozinku", 181 "settings.account.headlinePassword" : "Promijenite lozinku",
136 "settings.account.headlineProfile" : "Ažurirajte profil", 182 "settings.account.headlineProfile" : "Ažurirajte profil",
137 "settings.account.headlineSubscription" : "Vaša pretplata", 183 "settings.account.headlineSubscription" : "Vaša pretplata",
138 "settings.account.headlineUpgrade" : "Nadogradite raÄun i podržite Franc", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Preuzmite", 186 "settings.account.invoiceDownload" : "Preuzmite",
140 "settings.account.manageSubscription.label" : "Upravljajte pretplatama", 187 "settings.account.manageSubscription.label" : "Upravljajte pretplatama",
141 "settings.account.successInfo" : "Vaše promjene su spremljene", 188 "settings.account.successInfo" : "Vaše promjene su spremljene",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Pokušajte ponovno", 192 "settings.account.tryReloadServices" : "Pokušajte ponovno",
143 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno", 193 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Nije moguće uÄitati informacije o korisniku", 195 "settings.account.userInfoRequestFailed" : "Nije moguće uÄitati informacije o korisniku",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "ОчиÑти кеш", 197 "settings.app.buttonClearAllCache" : "ОчиÑти кеш",
146 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje", 198 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje",
147 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja", 199 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja",
@@ -154,6 +206,7 @@
154 "settings.app.form.enableGPUAcceleration" : "Омогући убрзање графичке јединице", 206 "settings.app.form.enableGPUAcceleration" : "Омогући убрзање графичке јединице",
155 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 207 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
156 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 208 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Jezik", 210 "settings.app.form.language" : "Jezik",
158 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku", 211 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku",
159 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren", 212 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Vaše usluge", 235 "settings.navigation.yourServices" : "Vaše usluge",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Sve usluge", 237 "settings.recipes.all" : "Sve usluge",
185 "settings.recipes.dev" : "Razvoj", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Dostupne usluge", 245 "settings.recipes.headline" : "Dostupne usluge",
187 "settings.recipes.missingService" : "Da li neki servis nedostaje?", 246 "settings.recipes.missingService" : "Da li neki servis nedostaje?",
188 "settings.recipes.mostPopular" : "Najpopularniji", 247 "settings.recipes.mostPopular" : "Najpopularniji",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Postavke", 334 "sidebar.settings" : "Postavke",
276 "sidebar.unmuteApp" : "ИÑкључи обавештења и звукове", 335 "sidebar.unmuteApp" : "ИÑкључи обавештења и звукове",
277 "signup.company.label" : "Tvrtka",
278 "signup.email.label" : "Vaša e-adresa", 336 "signup.email.label" : "Vaša e-adresa",
279 "signup.emailDuplicate" : "Već postoji korisnik s tom e-mail adresom", 337 "signup.emailDuplicate" : "Već postoji korisnik s tom e-mail adresom",
280 "signup.firstname.label" : "Ime", 338 "signup.firstname.label" : "Ime",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "Imate raÄun? Prijavite se.", 344 "signup.link.login" : "Imate raÄun? Prijavite se.",
287 "signup.password.label" : "Lozinka", 345 "signup.password.label" : "Lozinka",
288 "signup.submit.label" : "Napravite novi raÄun", 346 "signup.submit.label" : "Napravite novi raÄun",
289 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Bez reklama, doživotno!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "Dolazi uskoro", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Proxy support for services", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Support for spellchecker",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Plaćeni\/Premium raÄun ukljuÄuje sljedeće:",
298 "subscription.paymentSessionError" : "Nemoguće inicijalizirati obrazac za uplatu",
299 "subscription.submit.label" : "Želim da podržim razvoj Franca.",
300 "subscription.type.free" : "Slobodno",
301 "subscription.type.month" : "mjesec",
302 "subscription.type.year" : "godina",
303 "subscriptionPopup.buttonCancel" : "Odustani", 353 "subscriptionPopup.buttonCancel" : "Odustani",
304 "subscriptionPopup.buttonDone" : "Završeno", 354 "subscriptionPopup.buttonDone" : "Završeno",
305 "tabs.item.deleteService" : "Izbriši servis", 355 "tabs.item.deleteService" : "Izbriši servis",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 860030c11..75e43d1ce 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -1,10 +1,15 @@
1{ 1{
2 "app.errorHandler.action" : "Tekrar Yükle", 2 "app.errorHandler.action" : "Tekrar Yükle",
3 "app.errorHandler.headline" : "Bir terslik çıktı", 3 "app.errorHandler.headline" : "Bir terslik çıktı",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Ferdi Destek Lisansı'nı alın", 5 "feature.delayApp.headline" : "Beklememek için Franz Destek Lisansı'nı satın alın",
6 "feature.delayApp.headline" : "Beklememek için Ferdi Destek Lisansı'nı satın alın", 6 "feature.delayApp.text" : "Franz {seconds} saniye sonra devam edecek.",
7 "feature.delayApp.text" : "Ferdi {seconds} saniye sonra devam edecek.", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Franz Destek Lisansı'nı alın",
11 "feature.delayApp.upgrade.actionShort" : "Hesabı Yükselt",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Mail olarak gönder", 13 "feature.shareFranz.action.email" : "Mail olarak gönder",
9 "feature.shareFranz.action.facebook" : "Facebook'ta PaylaÅŸ", 14 "feature.shareFranz.action.facebook" : "Facebook'ta PaylaÅŸ",
10 "feature.shareFranz.action.twitter" : "Twitter'da PaylaÅŸ", 15 "feature.shareFranz.action.twitter" : "Twitter'da PaylaÅŸ",
@@ -12,14 +17,19 @@
12 "feature.shareFranz.shareText.email" : "Franz'a {count} tane servis ekledim! WhatsApp, Messenger, Slack ve fazlasını içeren ücretsiz uygulamayı www.meetfranz.com adresinden edinin.", 17 "feature.shareFranz.shareText.email" : "Franz'a {count} tane servis ekledim! WhatsApp, Messenger, Slack ve fazlasını içeren ücretsiz uygulamayı www.meetfranz.com adresinden edinin.",
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", 18 "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" : "Arkadaşlarına ve meslektaşlarına Franz'ın ne kadar harika olduğunu söyle ve bize bu kelimeyi yaymamızda yardım et.", 19 "feature.shareFranz.text" : "Arkadaşlarına ve meslektaşlarına Franz'ın ne kadar harika olduğunu söyle ve bize bu kelimeyi yaymamızda yardım et.",
15 "global.api.unhealthy" : "Ferdi hizmetlerine ÅŸu anda eriÅŸilemiyor", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "Franz hizmetlerine ÅŸu anda eriÅŸilemiyor",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.", 25 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.",
17 "global.spellchecker.useDefault" : "Sistem Dilini Kullan ({default})", 26 "global.spellchecker.useDefault" : "Sistem Dilini Kullan ({default})",
18 "global.spellchecking.autodetect" : "Dili otomatik tespit et", 27 "global.spellchecking.autodetect" : "Dili otomatik tespit et",
19 "global.spellchecking.autodetect.short" : "Otomatik", 28 "global.spellchecking.autodetect.short" : "Otomatik",
20 "global.spellchecking.language" : "Ä°mla kontrol dili", 29 "global.spellchecking.language" : "Ä°mla kontrol dili",
21 "import.headline" : "Ferdi 4 servislerinizi içeri aktarın", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Henüz Ferdi 5'te desteklenmeyen servisler", 31 "import.headline" : "Franz 4 servislerinizi içeri aktarın",
32 "import.notSupportedHeadline" : "Henüz Franz 5'te desteklenmeyen servisler",
23 "import.skip.label" : "Servisleri kendim eklemek istiyorum", 33 "import.skip.label" : "Servisleri kendim eklemek istiyorum",
24 "import.submit.label" : "Servisleri içe aktar", 34 "import.submit.label" : "Servisleri içe aktar",
25 "infobar.buttonChangelog" : "Yeni ne var?", 35 "infobar.buttonChangelog" : "Yeni ne var?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Hizmetleri yeniden yükle", 37 "infobar.buttonReloadServices" : "Hizmetleri yeniden yükle",
28 "infobar.requiredRequestsFailed" : "Hizmetler ve kullanıcı bilgileri yüklenemedi", 38 "infobar.requiredRequestsFailed" : "Hizmetler ve kullanıcı bilgileri yüklenemedi",
29 "infobar.servicesUpdated" : "Hizmetleriniz güncellendi.", 39 "infobar.servicesUpdated" : "Hizmetleriniz güncellendi.",
30 "infobar.updateAvailable" : "Yeni Ferdi güncellemesi mevcut.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Yeni Franz güncellemesi mevcut.",
31 "invite.email.label" : "E-posta adresi", 42 "invite.email.label" : "E-posta adresi",
32 "invite.headline.friends" : "3 arkadaşını ya da çalışma arkadaşını davet et", 43 "invite.headline.friends" : "3 arkadaşını ya da çalışma arkadaşını davet et",
33 "invite.name.label" : "Ad", 44 "invite.name.label" : "Ad",
@@ -43,8 +54,10 @@
43 "login.serverLogout" : "Oturum süreniz dolmuş, lütfen tekrar giriş yapın.", 54 "login.serverLogout" : "Oturum süreniz dolmuş, lütfen tekrar giriş yapın.",
44 "login.submit.label" : "Oturum Aç", 55 "login.submit.label" : "Oturum Aç",
45 "login.tokenExpired" : "Oturum zaman aşımına uğradı, lütfen tekrar giriş yapın.", 56 "login.tokenExpired" : "Oturum zaman aşımına uğradı, lütfen tekrar giriş yapın.",
46 "menu.app.about" : "Ferdi Hakkında", 57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
47 "menu.app.announcement" : "What's new?", 58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
59 "menu.app.about" : "Franz Hakkında",
60 "menu.app.announcement" : "Neler yeni?",
48 "menu.app.checkForUpdates" : "Güncellemeleri kontrol et", 61 "menu.app.checkForUpdates" : "Güncellemeleri kontrol et",
49 "menu.app.hide" : "Gizle", 62 "menu.app.hide" : "Gizle",
50 "menu.app.hideOthers" : "DiÄŸerlerini Gizle", 63 "menu.app.hideOthers" : "DiÄŸerlerini Gizle",
@@ -68,6 +81,9 @@
68 "menu.file" : "Dosya", 81 "menu.file" : "Dosya",
69 "menu.help" : "Yardım", 82 "menu.help" : "Yardım",
70 "menu.help.changelog" : "Değişim Günlüğü", 83 "menu.help.changelog" : "Değişim Günlüğü",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Daha Fazlasını Öğrenin", 87 "menu.help.learnMore" : "Daha Fazlasını Öğrenin",
72 "menu.help.privacy" : "Gizlilik Sözleşmesi", 88 "menu.help.privacy" : "Gizlilik Sözleşmesi",
73 "menu.help.support" : "Destek", 89 "menu.help.support" : "Destek",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Yeni servis ekle...", 93 "menu.services.addNewService" : "Yeni servis ekle...",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "Görünüm", 96 "menu.view" : "Görünüm",
80 "menu.view.enterFullScreen" : "Tam Ekrana Geç", 97 "menu.view.enterFullScreen" : "Tam Ekrana Geç",
81 "menu.view.exitFullScreen" : "Tam Ekrandan Çık", 98 "menu.view.exitFullScreen" : "Tam Ekrandan Çık",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Geliştirici Araçlarına Geç", 102 "menu.view.toggleDevTools" : "Geliştirici Araçlarına Geç",
86 "menu.view.toggleFullScreen" : "Tam Ekrana Geç", 103 "menu.view.toggleFullScreen" : "Tam Ekrana Geç",
87 "menu.view.toggleServiceDevTools" : "Hizmet Geliştirici Araçlarını Değiştir", 104 "menu.view.toggleServiceDevTools" : "Hizmet Geliştirici Araçlarını Değiştir",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Yakınlaştır", 106 "menu.view.zoomIn" : "Yakınlaştır",
89 "menu.view.zoomOut" : "Uzaklaştır", 107 "menu.view.zoomOut" : "Uzaklaştır",
90 "menu.window" : "Pencere", 108 "menu.window" : "Pencere",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Gönder", 121 "password.submit.label" : "Gönder",
104 "password.successInfo" : "E-postanızı kontrol ediniz", 122 "password.successInfo" : "E-postanızı kontrol ediniz",
105 "premiumFeature.button.upgradeAccount" : "Hesabı Yükselt", 123 "premiumFeature.button.upgradeAccount" : "Hesabı Yükselt",
106 "pricing.headline" : "Franz'ı Destekle", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Franz'ın gelişimini desteklemek istemiyorum.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Franz'ın gelişimini desteklemek istiyorum", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Destek planınızı seçiniz", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "{name} yeniden yükle", 151 "service.crashHandler.action" : "{name} yeniden yükle",
111 "service.crashHandler.autoReload" : "{name}'i {seconds} saniye içerisinde otomatik onarmayı deniyoruz", 152 "service.crashHandler.autoReload" : "{name}'i {seconds} saniye içerisinde otomatik onarmayı deniyoruz",
112 "service.crashHandler.headline" : "Aman Tanrım hayır!", 153 "service.crashHandler.headline" : "Aman Tanrım hayır!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "Hayııırrr!", 159 "service.errorHandler.headline" : "Hayııırrr!",
119 "service.errorHandler.message" : "Hata", 160 "service.errorHandler.message" : "Hata",
120 "service.errorHandler.text" : "{name} yüklenemedi.", 161 "service.errorHandler.text" : "{name} yüklenemedi.",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Yükleniyor", 167 "service.webviewLoader.loading" : "Yükleniyor",
122 "services.getStarted" : "Haydi başlayalım", 168 "services.getStarted" : "Haydi başlayalım",
123 "services.welcome" : "Franz'a HoÅŸgeldiniz", 169 "services.welcome" : "Franz'a HoÅŸgeldiniz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Parolayı değiştir", 181 "settings.account.headlinePassword" : "Parolayı değiştir",
136 "settings.account.headlineProfile" : "Profili güncelle", 182 "settings.account.headlineProfile" : "Profili güncelle",
137 "settings.account.headlineSubscription" : "AboneliÄŸin", 183 "settings.account.headlineSubscription" : "AboneliÄŸin",
138 "settings.account.headlineUpgrade" : "Hesabını yükselt & Franz'ı destekle", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Ä°ndir", 186 "settings.account.invoiceDownload" : "Ä°ndir",
140 "settings.account.manageSubscription.label" : "Aboneliğini yönet", 187 "settings.account.manageSubscription.label" : "Aboneliğini yönet",
141 "settings.account.successInfo" : "DeÄŸiÅŸikliklerin kaydedildi", 188 "settings.account.successInfo" : "DeÄŸiÅŸikliklerin kaydedildi",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Tekrar deneyin", 192 "settings.account.tryReloadServices" : "Tekrar deneyin",
143 "settings.account.tryReloadUserInfoRequest" : "Tekrar deneyin", 193 "settings.account.tryReloadUserInfoRequest" : "Tekrar deneyin",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Kullanıcı bilgisi yüklenemedi", 195 "settings.account.userInfoRequestFailed" : "Kullanıcı bilgisi yüklenemedi",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "Önbelleği temizle", 197 "settings.app.buttonClearAllCache" : "Önbelleği temizle",
146 "settings.app.buttonInstallUpdate" : "Yeniden Başlat ve Güncelleştirmeleri Kur", 198 "settings.app.buttonInstallUpdate" : "Yeniden Başlat ve Güncelleştirmeleri Kur",
147 "settings.app.buttonSearchForUpdate" : "Güncellemeleri kontrol et", 199 "settings.app.buttonSearchForUpdate" : "Güncellemeleri kontrol et",
@@ -154,6 +206,7 @@
154 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et", 206 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et",
155 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir", 207 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir",
156 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster", 208 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Dil", 210 "settings.app.form.language" : "Dil",
158 "settings.app.form.minimizeToSystemTray" : "Franz'ı sistem tepsisine küçült", 211 "settings.app.form.minimizeToSystemTray" : "Franz'ı sistem tepsisine küçült",
159 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut", 212 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Servislerin", 235 "settings.navigation.yourServices" : "Servislerin",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Tüm servisler", 237 "settings.recipes.all" : "Tüm servisler",
185 "settings.recipes.dev" : "GeliÅŸtirme", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "Mevcut servisler", 245 "settings.recipes.headline" : "Mevcut servisler",
187 "settings.recipes.missingService" : "Aradığın servisi bulamadın mı?", 246 "settings.recipes.missingService" : "Aradığın servisi bulamadın mı?",
188 "settings.recipes.mostPopular" : "En popüler", 247 "settings.recipes.mostPopular" : "En popüler",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "Ayarlar", 334 "sidebar.settings" : "Ayarlar",
276 "sidebar.unmuteApp" : "Bildirimleri ve sesli uyarıları etkinleştir", 335 "sidebar.unmuteApp" : "Bildirimleri ve sesli uyarıları etkinleştir",
277 "signup.company.label" : "Kurum",
278 "signup.email.label" : "E-posta adresi", 336 "signup.email.label" : "E-posta adresi",
279 "signup.emailDuplicate" : "Bu email adresine sahip bir kullanıcı zaten mevcut", 337 "signup.emailDuplicate" : "Bu email adresine sahip bir kullanıcı zaten mevcut",
280 "signup.firstname.label" : "Ad", 338 "signup.firstname.label" : "Ad",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "Hali hazırda hesabınız varsa giriş yapmak ister misiniz?", 344 "signup.link.login" : "Hali hazırda hesabınız varsa giriş yapmak ister misiniz?",
287 "signup.password.label" : "Åžifre", 345 "signup.password.label" : "Åžifre",
288 "signup.submit.label" : "Hesap oluÅŸtur", 346 "signup.submit.label" : "Hesap oluÅŸtur",
289 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Reklam yok, asla!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "yakında geliyor", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "Uygulama gecikmeleri & yükseltme lisanları için dırdır yok", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "Mattermost gibi şirket-içi\/barındırılan servisler ekleyin", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Servisler için proxy desteği", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Yazım denetleyicisi desteği",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Ücretli Ferdi Premium Destekçi Hesabına dahil",
298 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı",
299 "subscription.submit.label" : "Franz'ın gelişimini desteklemek istiyorum",
300 "subscription.type.free" : "ücretsiz",
301 "subscription.type.month" : "ay",
302 "subscription.type.year" : "yıl",
303 "subscriptionPopup.buttonCancel" : "Ä°ptal", 353 "subscriptionPopup.buttonCancel" : "Ä°ptal",
304 "subscriptionPopup.buttonDone" : "Tamamlandı", 354 "subscriptionPopup.buttonDone" : "Tamamlandı",
305 "tabs.item.deleteService" : "Servisi sil", 355 "tabs.item.deleteService" : "Servisi sil",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index fe8f44d19..ee53608e6 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Перезавантажити", 2 "app.errorHandler.action" : "Перезавантажити",
3 "app.errorHandler.headline" : "ЩоÑÑŒ пішло не так", 3 "app.errorHandler.headline" : "ЩоÑÑŒ пішло не так",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
5 "feature.delayApp.action" : "Отримати ліцензію Ferdi Supporter ", 5 "feature.delayApp.headline" : "Будь лаÑка, придбайте ліцензію Franz Supporter аби пропуÑтити очікуваннÑ",
6 "feature.delayApp.headline" : "Будь лаÑка, придбайте ліцензію Ferdi Supporter аби пропуÑтити очікуваннÑ", 6 "feature.delayApp.text" : "Franz відновить роботу за {seconds} Ñекунд",
7 "feature.delayApp.text" : "Ferdi відновить роботу за {seconds} Ñекунд", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action" : "Отримати ліцензію Franz Supporter ",
11 "feature.delayApp.upgrade.actionShort" : "Преміум акаунт",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
8 "feature.shareFranz.action.email" : "Send as email", 13 "feature.shareFranz.action.email" : "Send as email",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 14 "feature.shareFranz.action.facebook" : "Share on Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 15 "feature.shareFranz.action.twitter" : "Share on Twitter",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 16 "feature.shareFranz.headline" : "Ferdi 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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
15 "global.api.unhealthy" : "Ðе можливо підключитиÑÑŒ до онлайн ÑервіÑів Franz", 23 "global.api.unhealthy" : "Ðе можливо підключитиÑÑŒ до онлайн ÑервіÑів Franz",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "Ви не підключені до Інтернету.", 25 "global.notConnectedToTheInternet" : "Ви не підключені до Інтернету.",
17 "global.spellchecker.useDefault" : "ВикориÑтовувати ÑиÑтемні параметри за змовчуваннÑм ({default})", 26 "global.spellchecker.useDefault" : "ВикориÑтовувати ÑиÑтемні параметри за змовчуваннÑм ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "Detect language automatically",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "Automatic",
20 "global.spellchecking.language" : "Мова перевірки правопиÑу", 29 "global.spellchecking.language" : "Мова перевірки правопиÑу",
21 "import.headline" : "Імпортувати ваші ÑервіÑи з Ferdi 4", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Ðаразі ÑервіÑи не підтримуютьÑÑ Ñƒ Ferdi 5", 31 "import.headline" : "Імпортувати ваші ÑервіÑи з Franz 4",
32 "import.notSupportedHeadline" : "Ðаразі ÑервіÑи не підтримуютьÑÑ Ñƒ Franz 5",
23 "import.skip.label" : "Я бажаю додати ÑÐµÑ€Ð²Ñ–Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ", 33 "import.skip.label" : "Я бажаю додати ÑÐµÑ€Ð²Ñ–Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ",
24 "import.submit.label" : "Імпортувати ÑервіÑи", 34 "import.submit.label" : "Імпортувати ÑервіÑи",
25 "infobar.buttonChangelog" : "Що нового?", 35 "infobar.buttonChangelog" : "Що нового?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "Перезавантажити ÑервіÑи", 37 "infobar.buttonReloadServices" : "Перезавантажити ÑервіÑи",
28 "infobar.requiredRequestsFailed" : "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ÑервіÑи та інформацію кориÑтувача", 38 "infobar.requiredRequestsFailed" : "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ÑервіÑи та інформацію кориÑтувача",
29 "infobar.servicesUpdated" : "Ваші ÑервіÑи було оновлено.", 39 "infobar.servicesUpdated" : "Ваші ÑервіÑи було оновлено.",
30 "infobar.updateAvailable" : "Ðове Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ferdi доÑтупне.", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Ðове Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Franz доÑтупне.",
31 "invite.email.label" : "Email адреÑа", 42 "invite.email.label" : "Email адреÑа",
32 "invite.headline.friends" : "ЗапроÑÑ–Ñ‚ÑŒ 3-Ñ… ваших друзів або колег", 43 "invite.headline.friends" : "ЗапроÑÑ–Ñ‚ÑŒ 3-Ñ… ваших друзів або колег",
33 "invite.name.label" : "Ім'Ñ", 44 "invite.name.label" : "Ім'Ñ",
@@ -43,6 +54,8 @@
43 "login.serverLogout" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, увійдіть знову.", 54 "login.serverLogout" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, увійдіть знову.",
44 "login.submit.label" : "Увійти", 55 "login.submit.label" : "Увійти",
45 "login.tokenExpired" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, увійдіть знову.", 56 "login.tokenExpired" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, увійдіть знову.",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "Про Franz", 59 "menu.app.about" : "Про Franz",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "What's new?",
48 "menu.app.checkForUpdates" : "Перевірити наÑвніÑÑ‚ÑŒ оновлень", 61 "menu.app.checkForUpdates" : "Перевірити наÑвніÑÑ‚ÑŒ оновлень",
@@ -68,6 +81,9 @@
68 "menu.file" : "Файл", 81 "menu.file" : "Файл",
69 "menu.help" : "Довідка", 82 "menu.help" : "Довідка",
70 "menu.help.changelog" : "Журнал змін", 83 "menu.help.changelog" : "Журнал змін",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "Докладніше", 87 "menu.help.learnMore" : "Докладніше",
72 "menu.help.privacy" : "ЗаÑва про конфіденційніÑÑ‚ÑŒ", 88 "menu.help.privacy" : "ЗаÑва про конфіденційніÑÑ‚ÑŒ",
73 "menu.help.support" : "Підтримка", 89 "menu.help.support" : "Підтримка",
@@ -76,6 +92,7 @@
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "Activate previous service",
77 "menu.services.addNewService" : "Додати ÑервіÑ", 93 "menu.services.addNewService" : "Додати ÑервіÑ",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "Activate next service",
95 "menu.todos" : "Todos",
79 "menu.view" : "ВиглÑд", 96 "menu.view" : "ВиглÑд",
80 "menu.view.enterFullScreen" : "Вікно на повний екран", 97 "menu.view.enterFullScreen" : "Вікно на повний екран",
81 "menu.view.exitFullScreen" : "Вийти з повного екрану", 98 "menu.view.exitFullScreen" : "Вийти з повного екрану",
@@ -85,6 +102,7 @@
85 "menu.view.toggleDevTools" : "Переключити інÑтрумент розробника", 102 "menu.view.toggleDevTools" : "Переключити інÑтрумент розробника",
86 "menu.view.toggleFullScreen" : "ПереключитиÑÑ Ð½Ð° повний екран", 103 "menu.view.toggleFullScreen" : "ПереключитиÑÑ Ð½Ð° повний екран",
87 "menu.view.toggleServiceDevTools" : "Переключити інÑтрументи розробника ÑервіÑу", 104 "menu.view.toggleServiceDevTools" : "Переключити інÑтрументи розробника ÑервіÑу",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "Збільшити маÑштаб", 106 "menu.view.zoomIn" : "Збільшити маÑштаб",
89 "menu.view.zoomOut" : "Зменьшити маÑштаб", 107 "menu.view.zoomOut" : "Зменьшити маÑштаб",
90 "menu.window" : "Вікно", 108 "menu.window" : "Вікно",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "Подати", 121 "password.submit.label" : "Подати",
104 "password.successInfo" : "Будь лаÑка, перевірте ваш email", 122 "password.successInfo" : "Будь лаÑка, перевірте ваш email",
105 "premiumFeature.button.upgradeAccount" : "Преміум акаунт", 123 "premiumFeature.button.upgradeAccount" : "Преміум акаунт",
106 "pricing.headline" : "Підтримайте Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "Я не хочу підтримувати розробку Franz.", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "Я хочу підтримати розробку Franz", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "Виберіть Ñвій план підтримки", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "Workspaces",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "Перезавантажити {name}", 151 "service.crashHandler.action" : "Перезавантажити {name}",
111 "service.crashHandler.autoReload" : "Спробую автоматично відновити {name} через {seconds} Ñ", 152 "service.crashHandler.autoReload" : "Спробую автоматично відновити {name} через {seconds} Ñ",
112 "service.crashHandler.headline" : "О, ні!", 153 "service.crashHandler.headline" : "О, ні!",
@@ -118,6 +159,11 @@
118 "service.errorHandler.headline" : "О, ні!", 159 "service.errorHandler.headline" : "О, ні!",
119 "service.errorHandler.message" : "Помилка", 160 "service.errorHandler.message" : "Помилка",
120 "service.errorHandler.text" : "{name} не завантажено", 161 "service.errorHandler.text" : "{name} не завантажено",
162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
121 "service.webviewLoader.loading" : "Loading", 167 "service.webviewLoader.loading" : "Loading",
122 "services.getStarted" : "Почати", 168 "services.getStarted" : "Почати",
123 "services.welcome" : "ЛаÑкаво проÑимо в Franz", 169 "services.welcome" : "ЛаÑкаво проÑимо в Franz",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "Змінити пароль", 181 "settings.account.headlinePassword" : "Змінити пароль",
136 "settings.account.headlineProfile" : "Оновити профіль", 182 "settings.account.headlineProfile" : "Оновити профіль",
137 "settings.account.headlineSubscription" : "Ваша підпиÑка", 183 "settings.account.headlineSubscription" : "Ваша підпиÑка",
138 "settings.account.headlineUpgrade" : "Оновити ваш акаунт і підтримати Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "Завантажити", 186 "settings.account.invoiceDownload" : "Завантажити",
140 "settings.account.manageSubscription.label" : "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾ÑŽ підпиÑкою", 187 "settings.account.manageSubscription.label" : "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾ÑŽ підпиÑкою",
141 "settings.account.successInfo" : "Ваші зміни були збережені", 188 "settings.account.successInfo" : "Ваші зміни були збережені",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "Спробуйте ще раз", 192 "settings.account.tryReloadServices" : "Спробуйте ще раз",
143 "settings.account.tryReloadUserInfoRequest" : "Спробуйте ще раз", 193 "settings.account.tryReloadUserInfoRequest" : "Спробуйте ще раз",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ інформацію кориÑтувача", 195 "settings.account.userInfoRequestFailed" : "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ інформацію кориÑтувача",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "ОчиÑтити кеш", 197 "settings.app.buttonClearAllCache" : "ОчиÑтити кеш",
146 "settings.app.buttonInstallUpdate" : "Перезавантажити Ñ– вÑтановити оновленнÑ", 198 "settings.app.buttonInstallUpdate" : "Перезавантажити Ñ– вÑтановити оновленнÑ",
147 "settings.app.buttonSearchForUpdate" : "Перевірити наÑвніÑÑ‚ÑŒ оновлень", 199 "settings.app.buttonSearchForUpdate" : "Перевірити наÑвніÑÑ‚ÑŒ оновлень",
@@ -153,7 +205,8 @@
153 "settings.app.form.darkMode" : "Переходь на Темну Сторону", 205 "settings.app.form.darkMode" : "Переходь на Темну Сторону",
154 "settings.app.form.enableGPUAcceleration" : "Ввімкнути приÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ GPU", 206 "settings.app.form.enableGPUAcceleration" : "Ввімкнути приÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ GPU",
155 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії", 207 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії",
156 "settings.app.form.enableSystemTray" : "Показувати Ferdi у ÑиÑтемному лотку", 208 "settings.app.form.enableSystemTray" : "Показувати Franz у ÑиÑтемному лотку",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "Мова", 210 "settings.app.form.language" : "Мова",
158 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Ferdi до ÑиÑтемного лотка", 211 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Ferdi до ÑиÑтемного лотка",
159 "settings.app.form.runInBackground" : "Тримати Ferdi в фоні при закритті вікна", 212 "settings.app.form.runInBackground" : "Тримати Ferdi в фоні при закритті вікна",
@@ -182,7 +235,13 @@
182 "settings.navigation.yourServices" : "Ваші ÑервіÑи", 235 "settings.navigation.yourServices" : "Ваші ÑервіÑи",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "Your workspaces",
184 "settings.recipes.all" : "Ð’ÑÑ– ÑервіÑи", 237 "settings.recipes.all" : "Ð’ÑÑ– ÑервіÑи",
185 "settings.recipes.dev" : "Розробка", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "ДоÑтупні ÑервіÑи", 245 "settings.recipes.headline" : "ДоÑтупні ÑервіÑи",
187 "settings.recipes.missingService" : "Ðе знайшли ÑервіÑу?", 246 "settings.recipes.missingService" : "Ðе знайшли ÑервіÑу?",
188 "settings.recipes.mostPopular" : "Ðайбільш популÑрні", 247 "settings.recipes.mostPopular" : "Ðайбільш популÑрні",
@@ -274,7 +333,6 @@
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
275 "sidebar.settings" : "ÐалаштуваннÑ", 334 "sidebar.settings" : "ÐалаштуваннÑ",
276 "sidebar.unmuteApp" : "Увімкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° звуки", 335 "sidebar.unmuteApp" : "Увімкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° звуки",
277 "signup.company.label" : "КомпаніÑ",
278 "signup.email.label" : "Email адреÑа", 336 "signup.email.label" : "Email адреÑа",
279 "signup.emailDuplicate" : "КориÑтувач із цією email адреÑою вже Ñ–Ñнує", 337 "signup.emailDuplicate" : "КориÑтувач із цією email адреÑою вже Ñ–Ñнує",
280 "signup.firstname.label" : "Ім`Ñ", 338 "signup.firstname.label" : "Ім`Ñ",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "У Ð²Ð°Ñ Ð²Ð¶Ðµ Ñ” обліковий запиÑ, увійти?", 344 "signup.link.login" : "У Ð²Ð°Ñ Ð²Ð¶Ðµ Ñ” обліковий запиÑ, увійти?",
287 "signup.password.label" : "Пароль", 345 "signup.password.label" : "Пароль",
288 "signup.submit.label" : "Створити акаунт", 346 "signup.submit.label" : "Створити акаунт",
289 "subscription.euTaxInfo" : "Ð”Ð»Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ–Ð² ЄС: можуть заÑтоÑовуватиÑÑ Ð¿Ð¾Ð´Ð°Ñ‚ÐºÐ¸", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "Жодної реклами!", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "очікуйте незабаром", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "ÐÑ–Ñких затримок та набридливих пропозицій з платних підпиÑок", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "СервіÑи, що виконуютьÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾\/вимагають хоÑтингу, приміром Mattermost", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "Підтримка прокÑÑ– ", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "Підтримка перевірки правопиÑу",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Платний Преміальний Ðкаунт Прихильника Ferdi включає",
298 "subscription.paymentSessionError" : "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ форму платежу",
299 "subscription.submit.label" : "Я хочу підтримати розробку Franz",
300 "subscription.type.free" : "безплатно",
301 "subscription.type.month" : "міÑÑць",
302 "subscription.type.year" : "рік",
303 "subscriptionPopup.buttonCancel" : "Відмінити", 353 "subscriptionPopup.buttonCancel" : "Відмінити",
304 "subscriptionPopup.buttonDone" : "Готово", 354 "subscriptionPopup.buttonDone" : "Готово",
305 "tabs.item.deleteService" : "Видалити ÑервіÑ", 355 "tabs.item.deleteService" : "Видалити ÑервіÑ",
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index dd004c821..58d1d7b5d 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -1,25 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "é‡æ–°è¼‰å…¥", 2 "app.errorHandler.action" : "é‡æ–°æ•´ç†",
3 "app.errorHandler.headline" : "有些æ±è¥¿å‡ºéŒ¯äº†", 3 "app.errorHandler.headline" : "糟糕ï¼æœ‰äº›åœ°æ–¹å‡ºå•é¡Œäº†ã€‚",
4 "feature.announcements.changelog.headline" : "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline" : "é€éŽ email 傳é€",
5 "feature.delayApp.action" : "å–å¾— Ferdi 支æ´æŽˆæ¬Š", 5 "feature.delayApp.headline" : "請購買 Franz 支æ´æŽˆæ¬Šä»¥è·³éŽç­‰å€™",
6 "feature.delayApp.headline" : "請購買 Ferdi 支æ´æŽˆæ¬Šä»¥è·³éŽç­‰å€™", 6 "feature.delayApp.text" : "Franz 會在 {seconds} 秒後繼續。",
7 "feature.delayApp.text" : "Ferdi 會在 {seconds} 秒後繼續。", 7 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
8 "feature.shareFranz.action.email" : "Send as email", 8 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 9 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 10 "feature.delayApp.upgrade.action" : "å–å¾— Franz 支æ´æŽˆæ¬Š",
11 "feature.shareFranz.headline" : "Ferdi is better together!", 11 "feature.delayApp.upgrade.actionShort" : "å‡ç´šå¸³è™Ÿ",
12 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
13 "feature.shareFranz.action.email" : "以電å­éƒµä»¶å‚³é€",
14 "feature.shareFranz.action.facebook" : "é€éŽ Facebook 分享",
15 "feature.shareFranz.action.twitter" : "在 Twitter 上分享",
16 "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", 17 "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", 18 "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 Ferdi is and help us to spread the word.", 19 "feature.shareFranz.text" : "告訴所有朋å‹å’ŒåŒäº‹Franz有多棒ï¼",
15 "global.api.unhealthy" : "無法連線至 Ferdi 的伺æœå™¨", 20 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade" : "Upgrade Account",
23 "global.api.unhealthy" : "無法連線至 Franz 的伺æœå™¨",
24 "global.franzProRequired" : "Franz Professional Required",
16 "global.notConnectedToTheInternet" : "你沒有連上網路。", 25 "global.notConnectedToTheInternet" : "你沒有連上網路。",
17 "global.spellchecker.useDefault" : "使用系統é è¨­ ({default})", 26 "global.spellchecker.useDefault" : "使用系統é è¨­ ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 27 "global.spellchecking.autodetect" : "自動åµæ¸¬èªžè¨€",
19 "global.spellchecking.autodetect.short" : "Automatic", 28 "global.spellchecking.autodetect.short" : "自動的",
20 "global.spellchecking.language" : "拼字檢查語言", 29 "global.spellchecking.language" : "拼字檢查語言",
21 "import.headline" : "匯入 Ferdi 4 çš„æœå‹™", 30 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
22 "import.notSupportedHeadline" : "Ferdi 5 尚未支æ´æ­¤æœå‹™", 31 "import.headline" : "匯入 Franz 4 çš„æœå‹™",
32 "import.notSupportedHeadline" : "Franz 5 尚未支æ´æ­¤æœå‹™",
23 "import.skip.label" : "手動添加æœå‹™", 33 "import.skip.label" : "手動添加æœå‹™",
24 "import.submit.label" : "匯入æœå‹™", 34 "import.submit.label" : "匯入æœå‹™",
25 "infobar.buttonChangelog" : "有什麼新功能呢?", 35 "infobar.buttonChangelog" : "有什麼新功能呢?",
@@ -27,7 +37,8 @@
27 "infobar.buttonReloadServices" : "é‡æ–°è¼‰å…¥æœå‹™", 37 "infobar.buttonReloadServices" : "é‡æ–°è¼‰å…¥æœå‹™",
28 "infobar.requiredRequestsFailed" : "無法載入æœå‹™å’Œä½¿ç”¨è€…資訊", 38 "infobar.requiredRequestsFailed" : "無法載入æœå‹™å’Œä½¿ç”¨è€…資訊",
29 "infobar.servicesUpdated" : "已經更新你的æœå‹™", 39 "infobar.servicesUpdated" : "已經更新你的æœå‹™",
30 "infobar.updateAvailable" : "Ferdi 有å¯ç”¨çš„æ›´æ–°", 40 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable" : "Franz 有å¯ç”¨çš„æ›´æ–°",
31 "invite.email.label" : "é›»å­éƒµä»¶åœ°å€", 42 "invite.email.label" : "é›»å­éƒµä»¶åœ°å€",
32 "invite.headline.friends" : "邀請 3 ä½æœ‹å‹æˆ–åŒäº‹", 43 "invite.headline.friends" : "邀請 3 ä½æœ‹å‹æˆ–åŒäº‹",
33 "invite.name.label" : "å稱", 44 "invite.name.label" : "å稱",
@@ -43,8 +54,10 @@
43 "login.serverLogout" : "您的登入期間已éŽæœŸï¼Œè«‹é‡æ–°ç™»éŒ„", 54 "login.serverLogout" : "您的登入期間已éŽæœŸï¼Œè«‹é‡æ–°ç™»éŒ„",
44 "login.submit.label" : "登入", 55 "login.submit.label" : "登入",
45 "login.tokenExpired" : "您的登入已éŽæœŸï¼Œè«‹é‡æ–°ç™»å…¥ã€‚", 56 "login.tokenExpired" : "您的登入已éŽæœŸï¼Œè«‹é‡æ–°ç™»å…¥ã€‚",
57 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
58 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
46 "menu.app.about" : "關於 Franz", 59 "menu.app.about" : "關於 Franz",
47 "menu.app.announcement" : "What's new?", 60 "menu.app.announcement" : "更新說明",
48 "menu.app.checkForUpdates" : "檢查更新", 61 "menu.app.checkForUpdates" : "檢查更新",
49 "menu.app.hide" : "éš±è—", 62 "menu.app.hide" : "éš±è—",
50 "menu.app.hideOthers" : "éš±è—其他", 63 "menu.app.hideOthers" : "éš±è—其他",
@@ -68,14 +81,18 @@
68 "menu.file" : "檔案", 81 "menu.file" : "檔案",
69 "menu.help" : "求助", 82 "menu.help" : "求助",
70 "menu.help.changelog" : "變更紀錄", 83 "menu.help.changelog" : "變更紀錄",
84 "menu.help.debugInfo" : "Copy Debug Information",
85 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
86 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
71 "menu.help.learnMore" : "深入瞭解", 87 "menu.help.learnMore" : "深入瞭解",
72 "menu.help.privacy" : "éš±ç§è²æ˜Ž", 88 "menu.help.privacy" : "éš±ç§è²æ˜Ž",
73 "menu.help.support" : "支æ´", 89 "menu.help.support" : "支æ´",
74 "menu.help.tos" : "æœå‹™æ¢æ¬¾", 90 "menu.help.tos" : "æœå‹™æ¢æ¬¾",
75 "menu.services" : "æœå‹™", 91 "menu.services" : "æœå‹™",
76 "menu.services.activatePreviousService" : "Activate previous service", 92 "menu.services.activatePreviousService" : "å•Ÿå‹•å‰ä¸€å€‹æœå‹™",
77 "menu.services.addNewService" : "新增æœå‹™", 93 "menu.services.addNewService" : "新增æœå‹™",
78 "menu.services.setNextServiceActive" : "Activate next service", 94 "menu.services.setNextServiceActive" : "啟動下一個æœå‹™",
95 "menu.todos" : "Todos",
79 "menu.view" : "檢視", 96 "menu.view" : "檢視",
80 "menu.view.enterFullScreen" : "進入全螢幕模å¼", 97 "menu.view.enterFullScreen" : "進入全螢幕模å¼",
81 "menu.view.exitFullScreen" : "離開全螢幕模å¼", 98 "menu.view.exitFullScreen" : "離開全螢幕模å¼",
@@ -85,16 +102,17 @@
85 "menu.view.toggleDevTools" : "切æ›é–‹ç™¼è€…工具", 102 "menu.view.toggleDevTools" : "切æ›é–‹ç™¼è€…工具",
86 "menu.view.toggleFullScreen" : "切æ›å…¨èž¢å¹•", 103 "menu.view.toggleFullScreen" : "切æ›å…¨èž¢å¹•",
87 "menu.view.toggleServiceDevTools" : "切æ›æœå‹™é–‹ç™¼è€…工具", 104 "menu.view.toggleServiceDevTools" : "切æ›æœå‹™é–‹ç™¼è€…工具",
105 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
88 "menu.view.zoomIn" : "放大", 106 "menu.view.zoomIn" : "放大",
89 "menu.view.zoomOut" : "縮å°", 107 "menu.view.zoomOut" : "縮å°",
90 "menu.window" : "視窗", 108 "menu.window" : "視窗",
91 "menu.window.close" : "關閉", 109 "menu.window.close" : "關閉",
92 "menu.window.minimize" : "最å°åŒ–", 110 "menu.window.minimize" : "最å°åŒ–",
93 "menu.workspaces" : "Workspaces", 111 "menu.workspaces" : "工作å€",
94 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 112 "menu.workspaces.addNewWorkspace" : "新增工作å€",
95 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 113 "menu.workspaces.closeWorkspaceDrawer" : "關閉工作空間",
96 "menu.workspaces.defaultWorkspace" : "所有æœå‹™", 114 "menu.workspaces.defaultWorkspace" : "所有æœå‹™",
97 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 115 "menu.workspaces.openWorkspaceDrawer" : "打開工作空間",
98 "password.email.label" : "é›»å­éƒµä»¶åœ°å€", 116 "password.email.label" : "é›»å­éƒµä»¶åœ°å€",
99 "password.headline" : "é‡è¨­å¯†ç¢¼", 117 "password.headline" : "é‡è¨­å¯†ç¢¼",
100 "password.link.login" : "登入您的帳號", 118 "password.link.login" : "登入您的帳號",
@@ -103,10 +121,33 @@
103 "password.submit.label" : "é€å‡º", 121 "password.submit.label" : "é€å‡º",
104 "password.successInfo" : "請檢查您的電å­éƒµä»¶", 122 "password.successInfo" : "請檢查您的電å­éƒµä»¶",
105 "premiumFeature.button.upgradeAccount" : "å‡ç´šå¸³è™Ÿ", 123 "premiumFeature.button.upgradeAccount" : "å‡ç´šå¸³è™Ÿ",
106 "pricing.headline" : "æ”¯æŒ Franz", 124 "pricing.features.adFree" : "Forever ad-free",
107 "pricing.link.skipPayment" : "我ä¸æƒ³æ”¯æŒ Ferdi 的開發。", 125 "pricing.features.appDelays" : "No Waiting Screens",
108 "pricing.submit.label" : "æˆ‘æƒ³æ”¯æŒ Ferdi 的開發。", 126 "pricing.features.customWebsites" : "Add Custom Websites",
109 "pricing.support.label" : "é¸æ“‡æ‚¨æ”¯æŒçš„計畫", 127 "pricing.features.onPremise" : "On-premise & other Hosted Services",
128 "pricing.features.serviceProxies" : "Service Proxies",
129 "pricing.features.spellchecker" : "Spellchecker support",
130 "pricing.features.teamManagement" : "Team Management",
131 "pricing.features.thirdPartyServices" : "Install 3rd party services",
132 "pricing.features.unlimitedServices" : "Add unlimited services",
133 "pricing.features.workspaces" : "工作å€",
134 "pricing.plan.free" : "Franz Free",
135 "pricing.plan.legacy" : "Franz Premium",
136 "pricing.plan.personal" : "Franz Personal",
137 "pricing.plan.personal-monthly" : "Franz Personal Monthly",
138 "pricing.plan.personal-yearly" : "Franz Personal Yearly",
139 "pricing.plan.pro" : "Franz Professional",
140 "pricing.plan.pro-monthly" : "Franz Professional Monthly",
141 "pricing.plan.pro-yearly" : "Franz Professional Yearly",
142 "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional",
143 "pricing.trial.cta.skip" : "Continue to Franz",
144 "pricing.trial.error" : "Sorry, we could not activate your trial!",
145 "pricing.trial.features.headline" : "Franz Professional includes:",
146 "pricing.trial.headline" : "Franz Professional",
147 "pricing.trial.subheadline" : "Your personal welcome offer:",
148 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
149 "pricing.trial.terms.headline" : "No strings attached",
150 "pricing.trial.terms.noCreditCard" : "No credit card required",
110 "service.crashHandler.action" : "é‡æ–°è¼‰å…¥{name}", 151 "service.crashHandler.action" : "é‡æ–°è¼‰å…¥{name}",
111 "service.crashHandler.autoReload" : "嘗試在{seconds}秒內自動æ¢å¾©{name}", 152 "service.crashHandler.autoReload" : "嘗試在{seconds}秒內自動æ¢å¾©{name}",
112 "service.crashHandler.headline" : "噢ä¸!", 153 "service.crashHandler.headline" : "噢ä¸!",
@@ -118,7 +159,12 @@
118 "service.errorHandler.headline" : "噢ä¸ï¼", 159 "service.errorHandler.headline" : "噢ä¸ï¼",
119 "service.errorHandler.message" : "錯誤", 160 "service.errorHandler.message" : "錯誤",
120 "service.errorHandler.text" : "{name} 載入失敗。", 161 "service.errorHandler.text" : "{name} 載入失敗。",
121 "service.webviewLoader.loading" : "Loading", 162 "service.restrictedHandler.action" : "Upgrade Account",
163 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
164 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
165 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
166 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
167 "service.webviewLoader.loading" : "正在載入",
122 "services.getStarted" : "開始", 168 "services.getStarted" : "開始",
123 "services.welcome" : "歡迎使用 Franz", 169 "services.welcome" : "歡迎使用 Franz",
124 "settings.account.account.editButton" : "編輯帳號", 170 "settings.account.account.editButton" : "編輯帳號",
@@ -135,13 +181,19 @@
135 "settings.account.headlinePassword" : "變更密碼", 181 "settings.account.headlinePassword" : "變更密碼",
136 "settings.account.headlineProfile" : "更新簡介", 182 "settings.account.headlineProfile" : "更新簡介",
137 "settings.account.headlineSubscription" : "您的訂閱", 183 "settings.account.headlineSubscription" : "您的訂閱",
138 "settings.account.headlineUpgrade" : "å‡ç´šæ‚¨çš„å¸³æˆ¶ä¸¦æ”¯æŒ Franz", 184 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
185 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
139 "settings.account.invoiceDownload" : "下載", 186 "settings.account.invoiceDownload" : "下載",
140 "settings.account.manageSubscription.label" : "管ç†æ‚¨çš„訂閱", 187 "settings.account.manageSubscription.label" : "管ç†æ‚¨çš„訂閱",
141 "settings.account.successInfo" : "您的更變已經被儲存", 188 "settings.account.successInfo" : "您的更變已經被儲存",
189 "settings.account.trial" : "Free Trial",
190 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
191 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
142 "settings.account.tryReloadServices" : "å†è©¦ä¸€æ¬¡", 192 "settings.account.tryReloadServices" : "å†è©¦ä¸€æ¬¡",
143 "settings.account.tryReloadUserInfoRequest" : "å†è©¦ä¸€æ¬¡", 193 "settings.account.tryReloadUserInfoRequest" : "å†è©¦ä¸€æ¬¡",
194 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
144 "settings.account.userInfoRequestFailed" : "無法載入使用者資訊。", 195 "settings.account.userInfoRequestFailed" : "無法載入使用者資訊。",
196 "settings.account.yourLicense" : "Your Franz License",
145 "settings.app.buttonClearAllCache" : "清除快å–", 197 "settings.app.buttonClearAllCache" : "清除快å–",
146 "settings.app.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°", 198 "settings.app.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°",
147 "settings.app.buttonSearchForUpdate" : "檢查更新", 199 "settings.app.buttonSearchForUpdate" : "檢查更新",
@@ -154,6 +206,7 @@
154 "settings.app.form.enableGPUAcceleration" : "啟用 GPU 加速", 206 "settings.app.form.enableGPUAcceleration" : "啟用 GPU 加速",
155 "settings.app.form.enableSpellchecking" : "啟用拼字檢查", 207 "settings.app.form.enableSpellchecking" : "啟用拼字檢查",
156 "settings.app.form.enableSystemTray" : "在系統列顯示 Franz", 208 "settings.app.form.enableSystemTray" : "在系統列顯示 Franz",
209 "settings.app.form.enableTodos" : "Enable Franz Todos",
157 "settings.app.form.language" : "語言", 210 "settings.app.form.language" : "語言",
158 "settings.app.form.minimizeToSystemTray" : "最å°åŒ– Ferdi 到系統列", 211 "settings.app.form.minimizeToSystemTray" : "最å°åŒ– Ferdi 到系統列",
159 "settings.app.form.runInBackground" : "當關閉視窗時,ä¿æŒ Ferdi 在背景é‹ä½œ", 212 "settings.app.form.runInBackground" : "當關閉視窗時,ä¿æŒ Ferdi 在背景é‹ä½œ",
@@ -165,7 +218,7 @@
165 "settings.app.headlineGeneral" : "一般", 218 "settings.app.headlineGeneral" : "一般",
166 "settings.app.headlineLanguage" : "語言", 219 "settings.app.headlineLanguage" : "語言",
167 "settings.app.headlineUpdates" : "æ›´æ–°", 220 "settings.app.headlineUpdates" : "æ›´æ–°",
168 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 221 "settings.app.languageDisclaimer" : "官方僅æ供英語與德語,其他語言由社群æ供翻譯。",
169 "settings.app.restartRequired" : "需è¦é‡å•Ÿä»¥æ›´è®Š", 222 "settings.app.restartRequired" : "需è¦é‡å•Ÿä»¥æ›´è®Š",
170 "settings.app.subheadlineCache" : "å¿«å–", 223 "settings.app.subheadlineCache" : "å¿«å–",
171 "settings.app.translationHelp" : "幫助我們將 Ferdi 翻譯æˆæ‚¨çš„語言。", 224 "settings.app.translationHelp" : "幫助我們將 Ferdi 翻譯æˆæ‚¨çš„語言。",
@@ -178,11 +231,17 @@
178 "settings.navigation.inviteFriends" : "邀請朋å‹", 231 "settings.navigation.inviteFriends" : "邀請朋å‹",
179 "settings.navigation.logout" : "登出", 232 "settings.navigation.logout" : "登出",
180 "settings.navigation.settings" : "設定", 233 "settings.navigation.settings" : "設定",
181 "settings.navigation.team" : "Manage Team", 234 "settings.navigation.team" : "管ç†åœ˜éšŠ",
182 "settings.navigation.yourServices" : "您的æœå‹™", 235 "settings.navigation.yourServices" : "您的æœå‹™",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 236 "settings.navigation.yourWorkspaces" : "所有工作å€",
184 "settings.recipes.all" : "所有æœå‹™", 237 "settings.recipes.all" : "所有æœå‹™",
185 "settings.recipes.dev" : "開發", 238 "settings.recipes.custom" : "Custom Services",
239 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
240 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
241 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
242 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
243 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
244 "settings.recipes.customService.openFolder" : "Open folder",
186 "settings.recipes.headline" : "å¯ä½¿ç”¨çš„æœå‹™", 245 "settings.recipes.headline" : "å¯ä½¿ç”¨çš„æœå‹™",
187 "settings.recipes.missingService" : "缺少æœå‹™?", 246 "settings.recipes.missingService" : "缺少æœå‹™?",
188 "settings.recipes.mostPopular" : "最熱門", 247 "settings.recipes.mostPopular" : "最熱門",
@@ -233,17 +292,17 @@
233 "settings.services.discoverServices" : "發ç¾æœå‹™", 292 "settings.services.discoverServices" : "發ç¾æœå‹™",
234 "settings.services.headline" : "您的æœå‹™", 293 "settings.services.headline" : "您的æœå‹™",
235 "settings.services.noServicesAdded" : "你尚未新增任何æœå‹™", 294 "settings.services.noServicesAdded" : "你尚未新增任何æœå‹™",
236 "settings.services.servicesRequestFailed" : "Could not load your services", 295 "settings.services.servicesRequestFailed" : "無法載入此æœå‹™",
237 "settings.services.tooltip.isDisabled" : "æœå‹™å·²åœç”¨", 296 "settings.services.tooltip.isDisabled" : "æœå‹™å·²åœç”¨",
238 "settings.services.tooltip.isMuted" : "所有的è²éŸ³éƒ½æ˜¯éœéŸ³", 297 "settings.services.tooltip.isMuted" : "所有的è²éŸ³éƒ½æ˜¯éœéŸ³",
239 "settings.services.tooltip.notificationsDisabled" : "通知已åœç”¨", 298 "settings.services.tooltip.notificationsDisabled" : "通知已åœç”¨",
240 "settings.services.updatedInfo" : "已儲存你的變更", 299 "settings.services.updatedInfo" : "已儲存你的變更",
241 "settings.team.contentHeadline" : "Ferdi for Teams", 300 "settings.team.contentHeadline" : "Franz 團隊",
242 "settings.team.copy" : "Ferdi 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!", 301 "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!",
243 "settings.team.headline" : "團隊", 302 "settings.team.headline" : "團隊",
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.", 303 "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.",
245 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 304 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
246 "settings.team.upgradeAction" : "Upgrade your Account", 305 "settings.team.upgradeAction" : "å‡ç´šä½ çš„帳戶",
247 "settings.user.form.accountType.company" : "å…¬å¸", 306 "settings.user.form.accountType.company" : "å…¬å¸",
248 "settings.user.form.accountType.individual" : "個人", 307 "settings.user.form.accountType.individual" : "個人",
249 "settings.user.form.accountType.label" : "帳戶類型", 308 "settings.user.form.accountType.label" : "帳戶類型",
@@ -254,27 +313,26 @@
254 "settings.user.form.lastname" : "姓", 313 "settings.user.form.lastname" : "姓",
255 "settings.user.form.newPassword" : "新密碼", 314 "settings.user.form.newPassword" : "新密碼",
256 "settings.workspace.add.form.name" : "å稱", 315 "settings.workspace.add.form.name" : "å稱",
257 "settings.workspace.add.form.submitButton" : "Create workspace", 316 "settings.workspace.add.form.submitButton" : "建立工作å€",
258 "settings.workspace.form.buttonDelete" : "Delete workspace", 317 "settings.workspace.form.buttonDelete" : "刪除工作å€",
259 "settings.workspace.form.buttonSave" : "Save workspace", 318 "settings.workspace.form.buttonSave" : "儲存工作å€",
260 "settings.workspace.form.name" : "å稱", 319 "settings.workspace.form.name" : "å稱",
261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 320 "settings.workspace.form.servicesInWorkspaceHeadline" : "這個工作å€çš„æœå‹™",
262 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 321 "settings.workspace.form.yourWorkspaces" : "你的工作å€",
263 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 322 "settings.workspaces.deletedInfo" : "æˆåŠŸåˆªé™¤å·¥ä½œå€",
264 "settings.workspaces.headline" : "Your workspaces", 323 "settings.workspaces.headline" : "你的工作å€",
265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 324 "settings.workspaces.noWorkspacesAdded" : "你尚未加入任何工作å€",
266 "settings.workspaces.tryReloadWorkspaces" : "å†è©¦ä¸€æ¬¡", 325 "settings.workspaces.tryReloadWorkspaces" : "å†è©¦ä¸€æ¬¡",
267 "settings.workspaces.updatedInfo" : "Your changes have been saved", 326 "settings.workspaces.updatedInfo" : "æˆåŠŸå„²å­˜",
268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Ferdi Workspaces", 327 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
269 "settings.workspaces.workspaceFeatureInfo" : "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 328 "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.",
270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 329 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
271 "sidebar.addNewService" : "新增新的æœå‹™", 330 "sidebar.addNewService" : "新增新的æœå‹™",
272 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 331 "sidebar.closeWorkspaceDrawer" : "關閉工作空間",
273 "sidebar.muteApp" : "關閉通知和通知音效", 332 "sidebar.muteApp" : "關閉通知和通知音效",
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 333 "sidebar.openWorkspaceDrawer" : "打開工作空間",
275 "sidebar.settings" : "設定", 334 "sidebar.settings" : "設定",
276 "sidebar.unmuteApp" : "開啟通知和通知音效", 335 "sidebar.unmuteApp" : "開啟通知和通知音效",
277 "signup.company.label" : "å…¬å¸",
278 "signup.email.label" : "é›»å­éƒµä»¶åœ°å€", 336 "signup.email.label" : "é›»å­éƒµä»¶åœ°å€",
279 "signup.emailDuplicate" : "該使用者的電å­éƒµä»¶ä½å€å·²å­˜åœ¨", 337 "signup.emailDuplicate" : "該使用者的電å­éƒµä»¶ä½å€å·²å­˜åœ¨",
280 "signup.firstname.label" : "å", 338 "signup.firstname.label" : "å",
@@ -286,20 +344,12 @@
286 "signup.link.login" : "已經有一個帳戶,登入?", 344 "signup.link.login" : "已經有一個帳戶,登入?",
287 "signup.password.label" : "密碼", 345 "signup.password.label" : "密碼",
288 "signup.submit.label" : "建立帳號", 346 "signup.submit.label" : "建立帳號",
289 "subscription.euTaxInfo" : "æ­ç›Ÿå±…民:å¯èƒ½æŽ¡ç”¨ç•¶åœ°éŠ·å”®ç¨…", 347 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
290 "subscription.features.ads" : "無廣告,永é !", 348 "subscription.cta.allOptions" : "See all options",
291 "subscription.features.comingSoon" : "å³å°‡æŽ¨å‡º", 349 "subscription.cta.choosePlan" : "Choose your plan",
292 "subscription.features.noInterruptions" : "å‡ç´šæŽˆæ¬Šæ²’有延é²èˆ‡æ‰“盹", 350 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
293 "subscription.features.onpremise.mattermost" : "加入如 Mattermost 等已é å®š \/ 託管的æœå‹™", 351 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
294 "subscription.features.proxy" : "æœå‹™çš„代ç†ä¼ºæœå™¨æ”¯æ´", 352 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
295 "subscription.features.spellchecker" : "支æ´æ‹¼å­—檢查",
296 "subscription.features.workspaces" : "Organize your services in workspaces",
297 "subscription.includedFeatures" : "Ferdi 高級支æ´å¸³æˆ¶åŒ…å«",
298 "subscription.paymentSessionError" : "無法åˆå§‹åŒ–付款表單",
299 "subscription.submit.label" : "æˆ‘æƒ³æ”¯æŒ Ferdi 開發",
300 "subscription.type.free" : "自由",
301 "subscription.type.month" : "月",
302 "subscription.type.year" : "å¹´",
303 "subscriptionPopup.buttonCancel" : "å–消", 353 "subscriptionPopup.buttonCancel" : "å–消",
304 "subscriptionPopup.buttonDone" : "完æˆ", 354 "subscriptionPopup.buttonDone" : "完æˆ",
305 "tabs.item.deleteService" : "刪除æœå‹™", 355 "tabs.item.deleteService" : "刪除æœå‹™",
@@ -320,7 +370,7 @@
320 "welcome.signupButton" : "建立å…費帳號", 370 "welcome.signupButton" : "建立å…費帳號",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 371 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
322 "workspaceDrawer.allServices" : "所有æœå‹™", 372 "workspaceDrawer.allServices" : "所有æœå‹™",
323 "workspaceDrawer.headline" : "Workspaces", 373 "workspaceDrawer.headline" : "工作å€",
324 "workspaceDrawer.item.contextMenuEdit" : "edit", 374 "workspaceDrawer.item.contextMenuEdit" : "edit",
325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 375 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 376 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
diff --git a/src/i18n/messages/src/components/TrialActivationInfoBar.json b/src/i18n/messages/src/components/TrialActivationInfoBar.json
new file mode 100644
index 000000000..65dd964a6
--- /dev/null
+++ b/src/i18n/messages/src/components/TrialActivationInfoBar.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "infobar.trialActivated",
4 "defaultMessage": "!!!Your trial was successfully activated. Happy messaging!",
5 "file": "src/components/TrialActivationInfoBar.js",
6 "start": {
7 "line": 11,
8 "column": 11
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json
index d3facf8e8..f15617ca5 100644
--- a/src/i18n/messages/src/components/auth/Pricing.json
+++ b/src/i18n/messages/src/components/auth/Pricing.json
@@ -1,53 +1,118 @@
1[ 1[
2 { 2 {
3 "id": "pricing.headline", 3 "id": "pricing.trial.headline",
4 "defaultMessage": "!!!Support Ferdi", 4 "defaultMessage": "!!!Franz Professional",
5 "file": "src/components/auth/Pricing.js", 5 "file": "src/components/auth/Pricing.js",
6 "start": { 6 "start": {
7 "line": 13, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 16, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
15 { 15 {
16 "id": "pricing.support.label", 16 "id": "pricing.trial.subheadline",
17 "defaultMessage": "!!!Select your support plan", 17 "defaultMessage": "!!!Your personal welcome offer:",
18 "file": "src/components/auth/Pricing.js", 18 "file": "src/components/auth/Pricing.js",
19 "start": { 19 "start": {
20 "line": 17, 20 "line": 19,
21 "column": 23 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 20, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
28 { 28 {
29 "id": "pricing.submit.label", 29 "id": "pricing.trial.terms.headline",
30 "defaultMessage": "!!!Support the development of Ferdi", 30 "defaultMessage": "!!!No strings attached",
31 "file": "src/components/auth/Pricing.js", 31 "file": "src/components/auth/Pricing.js",
32 "start": { 32 "start": {
33 "line": 21, 33 "line": 23,
34 "column": 29
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.trial.terms.noCreditCard",
43 "defaultMessage": "!!!No credit card required",
44 "file": "src/components/auth/Pricing.js",
45 "start": {
46 "line": 27,
47 "column": 16
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.automaticTrialEnd",
56 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
57 "file": "src/components/auth/Pricing.js",
58 "start": {
59 "line": 31,
34 "column": 21 60 "column": 21
35 }, 61 },
36 "end": { 62 "end": {
37 "line": 24, 63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.error",
69 "defaultMessage": "!!!Sorry, we could not activate your trial!",
70 "file": "src/components/auth/Pricing.js",
71 "start": {
72 "line": 35,
73 "column": 19
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.cta.accept",
82 "defaultMessage": "!!!Yes, upgrade my account to Franz Professional",
83 "file": "src/components/auth/Pricing.js",
84 "start": {
85 "line": 39,
86 "column": 13
87 },
88 "end": {
89 "line": 42,
90 "column": 3
91 }
92 },
93 {
94 "id": "pricing.trial.cta.skip",
95 "defaultMessage": "!!!Continue to Franz",
96 "file": "src/components/auth/Pricing.js",
97 "start": {
98 "line": 43,
99 "column": 11
100 },
101 "end": {
102 "line": 46,
38 "column": 3 103 "column": 3
39 } 104 }
40 }, 105 },
41 { 106 {
42 "id": "pricing.link.skipPayment", 107 "id": "pricing.trial.features.headline",
43 "defaultMessage": "!!!I don't want to support the development of Ferdi.", 108 "defaultMessage": "!!!Franz Professional includes:",
44 "file": "src/components/auth/Pricing.js", 109 "file": "src/components/auth/Pricing.js",
45 "start": { 110 "start": {
46 "line": 25, 111 "line": 47,
47 "column": 15 112 "column": 20
48 }, 113 },
49 "end": { 114 "end": {
50 "line": 28, 115 "line": 50,
51 "column": 3 116 "column": 3
52 } 117 }
53 } 118 }
diff --git a/src/i18n/messages/src/components/auth/Signup.json b/src/i18n/messages/src/components/auth/Signup.json
index 94daffdde..9aa7b25ab 100644
--- a/src/i18n/messages/src/components/auth/Signup.json
+++ b/src/i18n/messages/src/components/auth/Signup.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Sign up", 4 "defaultMessage": "!!!Sign up",
5 "file": "src/components/auth/Signup.js", 5 "file": "src/components/auth/Signup.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 21, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Firstname", 17 "defaultMessage": "!!!Firstname",
18 "file": "src/components/auth/Signup.js", 18 "file": "src/components/auth/Signup.js",
19 "start": { 19 "start": {
20 "line": 22, 20 "line": 21,
21 "column": 18 21 "column": 18
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 25, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Lastname", 30 "defaultMessage": "!!!Lastname",
31 "file": "src/components/auth/Signup.js", 31 "file": "src/components/auth/Signup.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 25,
34 "column": 17 34 "column": 17
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 29, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,24 +43,11 @@
43 "defaultMessage": "!!!Email address", 43 "defaultMessage": "!!!Email address",
44 "file": "src/components/auth/Signup.js", 44 "file": "src/components/auth/Signup.js",
45 "start": { 45 "start": {
46 "line": 30, 46 "line": 29,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 33, 50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "signup.company.label",
56 "defaultMessage": "!!!Company",
57 "file": "src/components/auth/Signup.js",
58 "start": {
59 "line": 34,
60 "column": 16
61 },
62 "end": {
63 "line": 37,
64 "column": 3 51 "column": 3
65 } 52 }
66 }, 53 },
@@ -69,11 +56,11 @@
69 "defaultMessage": "!!!Password", 56 "defaultMessage": "!!!Password",
70 "file": "src/components/auth/Signup.js", 57 "file": "src/components/auth/Signup.js",
71 "start": { 58 "start": {
72 "line": 38, 59 "line": 37,
73 "column": 17 60 "column": 17
74 }, 61 },
75 "end": { 62 "end": {
76 "line": 41, 63 "line": 40,
77 "column": 3 64 "column": 3
78 } 65 }
79 }, 66 },
@@ -82,11 +69,11 @@
82 "defaultMessage": "!!!By creating a Ferdi account you accept the", 69 "defaultMessage": "!!!By creating a Ferdi account you accept the",
83 "file": "src/components/auth/Signup.js", 70 "file": "src/components/auth/Signup.js",
84 "start": { 71 "start": {
85 "line": 42, 72 "line": 41,
86 "column": 13 73 "column": 13
87 }, 74 },
88 "end": { 75 "end": {
89 "line": 45, 76 "line": 44,
90 "column": 3 77 "column": 3
91 } 78 }
92 }, 79 },
@@ -95,11 +82,11 @@
95 "defaultMessage": "!!!Terms of service", 82 "defaultMessage": "!!!Terms of service",
96 "file": "src/components/auth/Signup.js", 83 "file": "src/components/auth/Signup.js",
97 "start": { 84 "start": {
98 "line": 46, 85 "line": 45,
99 "column": 9 86 "column": 9
100 }, 87 },
101 "end": { 88 "end": {
102 "line": 49, 89 "line": 48,
103 "column": 3 90 "column": 3
104 } 91 }
105 }, 92 },
@@ -108,11 +95,11 @@
108 "defaultMessage": "!!!Privacy Statement", 95 "defaultMessage": "!!!Privacy Statement",
109 "file": "src/components/auth/Signup.js", 96 "file": "src/components/auth/Signup.js",
110 "start": { 97 "start": {
111 "line": 50, 98 "line": 49,
112 "column": 11 99 "column": 11
113 }, 100 },
114 "end": { 101 "end": {
115 "line": 53, 102 "line": 52,
116 "column": 3 103 "column": 3
117 } 104 }
118 }, 105 },
@@ -121,11 +108,11 @@
121 "defaultMessage": "!!!Create account", 108 "defaultMessage": "!!!Create account",
122 "file": "src/components/auth/Signup.js", 109 "file": "src/components/auth/Signup.js",
123 "start": { 110 "start": {
124 "line": 54, 111 "line": 53,
125 "column": 21 112 "column": 21
126 }, 113 },
127 "end": { 114 "end": {
128 "line": 57, 115 "line": 56,
129 "column": 3 116 "column": 3
130 } 117 }
131 }, 118 },
@@ -134,11 +121,11 @@
134 "defaultMessage": "!!!Already have an account, sign in?", 121 "defaultMessage": "!!!Already have an account, sign in?",
135 "file": "src/components/auth/Signup.js", 122 "file": "src/components/auth/Signup.js",
136 "start": { 123 "start": {
137 "line": 58, 124 "line": 57,
138 "column": 13 125 "column": 13
139 }, 126 },
140 "end": { 127 "end": {
141 "line": 61, 128 "line": 60,
142 "column": 3 129 "column": 3
143 } 130 }
144 }, 131 },
@@ -147,11 +134,11 @@
147 "defaultMessage": "!!!A user with that email address already exists", 134 "defaultMessage": "!!!A user with that email address already exists",
148 "file": "src/components/auth/Signup.js", 135 "file": "src/components/auth/Signup.js",
149 "start": { 136 "start": {
150 "line": 62, 137 "line": 61,
151 "column": 18 138 "column": 18
152 }, 139 },
153 "end": { 140 "end": {
154 "line": 65, 141 "line": 64,
155 "column": 3 142 "column": 3
156 } 143 }
157 } 144 }
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index 5bb4ad3ba..593a7bcb3 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,11 +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": 25, 7 "line": 28,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 28, 11 "line": 31,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
18 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
19 "start": { 19 "start": {
20 "line": 29, 20 "line": 32,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 32, 24 "line": 35,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
diff --git a/src/i18n/messages/src/components/services/content/ServiceRestricted.json b/src/i18n/messages/src/components/services/content/ServiceRestricted.json
new file mode 100644
index 000000000..c1984afe3
--- /dev/null
+++ b/src/i18n/messages/src/components/services/content/ServiceRestricted.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "service.restrictedHandler.serviceLimit.headline",
4 "defaultMessage": "!!!You have reached your service limit.",
5 "file": "src/components/services/content/ServiceRestricted.js",
6 "start": {
7 "line": 11,
8 "column": 24
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "service.restrictedHandler.serviceLimit.text",
17 "defaultMessage": "!!!Please upgrade your account to use more than {count} services.",
18 "file": "src/components/services/content/ServiceRestricted.js",
19 "start": {
20 "line": 15,
21 "column": 20
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 },
28 {
29 "id": "service.restrictedHandler.customUrl.headline",
30 "defaultMessage": "!!!Franz Professional Plan required",
31 "file": "src/components/services/content/ServiceRestricted.js",
32 "start": {
33 "line": 19,
34 "column": 21
35 },
36 "end": {
37 "line": 22,
38 "column": 3
39 }
40 },
41 {
42 "id": "service.restrictedHandler.customUrl.text",
43 "defaultMessage": "!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
44 "file": "src/components/services/content/ServiceRestricted.js",
45 "start": {
46 "line": 23,
47 "column": 17
48 },
49 "end": {
50 "line": 26,
51 "column": 3
52 }
53 },
54 {
55 "id": "service.restrictedHandler.action",
56 "defaultMessage": "!!!Upgrade Account",
57 "file": "src/components/services/content/ServiceRestricted.js",
58 "start": {
59 "line": 27,
60 "column": 10
61 },
62 "end": {
63 "line": 30,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/services/content/Services.json b/src/i18n/messages/src/components/services/content/Services.json
index fac438178..cee7f42c0 100644
--- a/src/i18n/messages/src/components/services/content/Services.json
+++ b/src/i18n/messages/src/components/services/content/Services.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Welcome to Ferdi", 4 "defaultMessage": "!!!Welcome to Ferdi",
5 "file": "src/components/services/content/Services.js", 5 "file": "src/components/services/content/Services.js",
6 "start": { 6 "start": {
7 "line": 11, 7 "line": 14,
8 "column": 11 8 "column": 11
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 14, 11 "line": 17,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Get started", 17 "defaultMessage": "!!!Get started",
18 "file": "src/components/services/content/Services.js", 18 "file": "src/components/services/content/Services.js",
19 "start": { 19 "start": {
20 "line": 15, 20 "line": 18,
21 "column": 14 21 "column": 14
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 18, 24 "line": 21,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
index 2ed4849d2..48078c18d 100644
--- a/src/i18n/messages/src/components/settings/account/AccountDashboard.json
+++ b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Account", 4 "defaultMessage": "!!!Account",
5 "file": "src/components/settings/account/AccountDashboard.js", 5 "file": "src/components/settings/account/AccountDashboard.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 18,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 21,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,21 +17,8 @@
17 "defaultMessage": "!!!Your Subscription", 17 "defaultMessage": "!!!Your Subscription",
18 "file": "src/components/settings/account/AccountDashboard.js", 18 "file": "src/components/settings/account/AccountDashboard.js",
19 "start": { 19 "start": {
20 "line": 18,
21 "column": 24
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.account.headlineUpgrade",
30 "defaultMessage": "!!!Upgrade your Account",
31 "file": "src/components/settings/account/AccountDashboard.js",
32 "start": {
33 "line": 22, 20 "line": 22,
34 "column": 19 21 "column": 24
35 }, 22 },
36 "end": { 23 "end": {
37 "line": 25, 24 "line": 25,
@@ -65,15 +52,28 @@
65 } 52 }
66 }, 53 },
67 { 54 {
55 "id": "settings.account.upgradeToPro.label",
56 "defaultMessage": "!!!Upgrade to Franz Professional",
57 "file": "src/components/settings/account/AccountDashboard.js",
58 "start": {
59 "line": 34,
60 "column": 23
61 },
62 "end": {
63 "line": 37,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.account.accountType.basic", 68 "id": "settings.account.accountType.basic",
69 "defaultMessage": "!!!Basic Account", 69 "defaultMessage": "!!!Basic Account",
70 "file": "src/components/settings/account/AccountDashboard.js", 70 "file": "src/components/settings/account/AccountDashboard.js",
71 "start": { 71 "start": {
72 "line": 34, 72 "line": 38,
73 "column": 20 73 "column": 20
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 37, 76 "line": 41,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Premium Supporter Account", 82 "defaultMessage": "!!!Premium Supporter Account",
83 "file": "src/components/settings/account/AccountDashboard.js", 83 "file": "src/components/settings/account/AccountDashboard.js",
84 "start": { 84 "start": {
85 "line": 38, 85 "line": 42,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 41, 89 "line": 45,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Edit Account", 95 "defaultMessage": "!!!Edit Account",
96 "file": "src/components/settings/account/AccountDashboard.js", 96 "file": "src/components/settings/account/AccountDashboard.js",
97 "start": { 97 "start": {
98 "line": 42, 98 "line": 46,
99 "column": 21 99 "column": 21
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 45, 102 "line": 49,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!Invoices", 108 "defaultMessage": "!!Invoices",
109 "file": "src/components/settings/account/AccountDashboard.js", 109 "file": "src/components/settings/account/AccountDashboard.js",
110 "start": { 110 "start": {
111 "line": 46, 111 "line": 50,
112 "column": 18 112 "column": 18
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 49, 115 "line": 53,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Download", 121 "defaultMessage": "!!!Download",
122 "file": "src/components/settings/account/AccountDashboard.js", 122 "file": "src/components/settings/account/AccountDashboard.js",
123 "start": { 123 "start": {
124 "line": 50, 124 "line": 54,
125 "column": 19 125 "column": 19
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 53, 128 "line": 57,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Could not load user information", 134 "defaultMessage": "!!!Could not load user information",
135 "file": "src/components/settings/account/AccountDashboard.js", 135 "file": "src/components/settings/account/AccountDashboard.js",
136 "start": { 136 "start": {
137 "line": 54, 137 "line": 58,
138 "column": 25 138 "column": 25
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 57, 141 "line": 61,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Try again", 147 "defaultMessage": "!!!Try again",
148 "file": "src/components/settings/account/AccountDashboard.js", 148 "file": "src/components/settings/account/AccountDashboard.js",
149 "start": { 149 "start": {
150 "line": 58, 150 "line": 62,
151 "column": 28 151 "column": 28
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 61, 154 "line": 65,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Delete account", 160 "defaultMessage": "!!!Delete account",
161 "file": "src/components/settings/account/AccountDashboard.js", 161 "file": "src/components/settings/account/AccountDashboard.js",
162 "start": { 162 "start": {
163 "line": 62, 163 "line": 66,
164 "column": 17 164 "column": 17
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 65, 167 "line": 69,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
174 "file": "src/components/settings/account/AccountDashboard.js", 174 "file": "src/components/settings/account/AccountDashboard.js",
175 "start": { 175 "start": {
176 "line": 66, 176 "line": 70,
177 "column": 14 177 "column": 14
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 69, 180 "line": 73,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,63 @@
186 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 186 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
187 "file": "src/components/settings/account/AccountDashboard.js", 187 "file": "src/components/settings/account/AccountDashboard.js",
188 "start": { 188 "start": {
189 "line": 70, 189 "line": 74,
190 "column": 19 190 "column": 19
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 73, 193 "line": 77,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.account.trial",
199 "defaultMessage": "!!!Free Trial",
200 "file": "src/components/settings/account/AccountDashboard.js",
201 "start": {
202 "line": 78,
203 "column": 9
204 },
205 "end": {
206 "line": 81,
207 "column": 3
208 }
209 },
210 {
211 "id": "settings.account.yourLicense",
212 "defaultMessage": "!!!Your Franz License:",
213 "file": "src/components/settings/account/AccountDashboard.js",
214 "start": {
215 "line": 82,
216 "column": 15
217 },
218 "end": {
219 "line": 85,
220 "column": 3
221 }
222 },
223 {
224 "id": "settings.account.trialEndsIn",
225 "defaultMessage": "!!!Your free trial ends in {duration}.",
226 "file": "src/components/settings/account/AccountDashboard.js",
227 "start": {
228 "line": 86,
229 "column": 15
230 },
231 "end": {
232 "line": 89,
233 "column": 3
234 }
235 },
236 {
237 "id": "settings.account.trialUpdateBillingInfo",
238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
239 "file": "src/components/settings/account/AccountDashboard.js",
240 "start": {
241 "line": 90,
242 "column": 33
243 },
244 "end": {
245 "line": 93,
194 "column": 3 246 "column": 3
195 } 247 }
196 } 248 }
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
index 70a989211..7dfb3ce04 100644
--- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
+++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available services", 4 "defaultMessage": "!!!Available services",
5 "file": "src/components/settings/navigation/SettingsNavigation.js", 5 "file": "src/components/settings/navigation/SettingsNavigation.js",
6 "start": { 6 "start": {
7 "line": 13, 7 "line": 14,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 16, 11 "line": 17,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Your services", 17 "defaultMessage": "!!!Your services",
18 "file": "src/components/settings/navigation/SettingsNavigation.js", 18 "file": "src/components/settings/navigation/SettingsNavigation.js",
19 "start": { 19 "start": {
20 "line": 17, 20 "line": 18,
21 "column": 16 21 "column": 16
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 20, 24 "line": 21,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Your workspaces", 30 "defaultMessage": "!!!Your workspaces",
31 "file": "src/components/settings/navigation/SettingsNavigation.js", 31 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": { 32 "start": {
33 "line": 21, 33 "line": 22,
34 "column": 18 34 "column": 18
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 24, 37 "line": 25,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Account", 43 "defaultMessage": "!!!Account",
44 "file": "src/components/settings/navigation/SettingsNavigation.js", 44 "file": "src/components/settings/navigation/SettingsNavigation.js",
45 "start": { 45 "start": {
46 "line": 25, 46 "line": 26,
47 "column": 11 47 "column": 11
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 28, 50 "line": 29,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Manage Team", 56 "defaultMessage": "!!!Manage Team",
57 "file": "src/components/settings/navigation/SettingsNavigation.js", 57 "file": "src/components/settings/navigation/SettingsNavigation.js",
58 "start": { 58 "start": {
59 "line": 29, 59 "line": 30,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 32, 63 "line": 33,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Settings", 69 "defaultMessage": "!!!Settings",
70 "file": "src/components/settings/navigation/SettingsNavigation.js", 70 "file": "src/components/settings/navigation/SettingsNavigation.js",
71 "start": { 71 "start": {
72 "line": 33, 72 "line": 34,
73 "column": 12 73 "column": 12
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 36, 76 "line": 37,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Invite Friends", 82 "defaultMessage": "!!!Invite Friends",
83 "file": "src/components/settings/navigation/SettingsNavigation.js", 83 "file": "src/components/settings/navigation/SettingsNavigation.js",
84 "start": { 84 "start": {
85 "line": 37, 85 "line": 38,
86 "column": 17 86 "column": 17
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 40, 89 "line": 41,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Logout", 95 "defaultMessage": "!!!Logout",
96 "file": "src/components/settings/navigation/SettingsNavigation.js", 96 "file": "src/components/settings/navigation/SettingsNavigation.js",
97 "start": { 97 "start": {
98 "line": 41, 98 "line": 42,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 44, 102 "line": 45,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
index 7d9ed3283..1124f4d6a 100644
--- a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
+++ b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available Services", 4 "defaultMessage": "!!!Available Services",
5 "file": "src/components/settings/recipes/RecipesDashboard.js", 5 "file": "src/components/settings/recipes/RecipesDashboard.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 20,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 23,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Search service", 17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/recipes/RecipesDashboard.js", 18 "file": "src/components/settings/recipes/RecipesDashboard.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 24,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 27,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Most popular", 30 "defaultMessage": "!!!Most popular",
31 "file": "src/components/settings/recipes/RecipesDashboard.js", 31 "file": "src/components/settings/recipes/RecipesDashboard.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 28,
34 "column": 22 34 "column": 22
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 31,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,24 +43,24 @@
43 "defaultMessage": "!!!All services", 43 "defaultMessage": "!!!All services",
44 "file": "src/components/settings/recipes/RecipesDashboard.js", 44 "file": "src/components/settings/recipes/RecipesDashboard.js",
45 "start": { 45 "start": {
46 "line": 27, 46 "line": 32,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 30, 50 "line": 35,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
54 { 54 {
55 "id": "settings.recipes.dev", 55 "id": "settings.recipes.custom",
56 "defaultMessage": "!!!Development", 56 "defaultMessage": "!!!Custom Services",
57 "file": "src/components/settings/recipes/RecipesDashboard.js", 57 "file": "src/components/settings/recipes/RecipesDashboard.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 36,
60 "column": 14 60 "column": 17
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 34, 63 "line": 39,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Sorry, but no service matched your search term.", 69 "defaultMessage": "!!!Sorry, but no service matched your search term.",
70 "file": "src/components/settings/recipes/RecipesDashboard.js", 70 "file": "src/components/settings/recipes/RecipesDashboard.js",
71 "start": { 71 "start": {
72 "line": 35, 72 "line": 40,
73 "column": 16 73 "column": 16
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 38, 76 "line": 43,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Service successfully added", 82 "defaultMessage": "!!!Service successfully added",
83 "file": "src/components/settings/recipes/RecipesDashboard.js", 83 "file": "src/components/settings/recipes/RecipesDashboard.js",
84 "start": { 84 "start": {
85 "line": 39, 85 "line": 44,
86 "column": 31 86 "column": 31
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 42, 89 "line": 47,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,89 @@
95 "defaultMessage": "!!!Missing a service?", 95 "defaultMessage": "!!!Missing a service?",
96 "file": "src/components/settings/recipes/RecipesDashboard.js", 96 "file": "src/components/settings/recipes/RecipesDashboard.js",
97 "start": { 97 "start": {
98 "line": 43, 98 "line": 48,
99 "column": 18 99 "column": 18
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 46, 102 "line": 51,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.recipes.customService.intro",
108 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
109 "file": "src/components/settings/recipes/RecipesDashboard.js",
110 "start": {
111 "line": 52,
112 "column": 21
113 },
114 "end": {
115 "line": 55,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.recipes.customService.openFolder",
121 "defaultMessage": "!!!Open directory",
122 "file": "src/components/settings/recipes/RecipesDashboard.js",
123 "start": {
124 "line": 56,
125 "column": 14
126 },
127 "end": {
128 "line": 59,
129 "column": 3
130 }
131 },
132 {
133 "id": "settings.recipes.customService.openDevDocs",
134 "defaultMessage": "!!!Developer Documentation",
135 "file": "src/components/settings/recipes/RecipesDashboard.js",
136 "start": {
137 "line": 60,
138 "column": 15
139 },
140 "end": {
141 "line": 63,
142 "column": 3
143 }
144 },
145 {
146 "id": "settings.recipes.customService.headline.customRecipes",
147 "defaultMessage": "!!!Custom 3rd Party Recipes",
148 "file": "src/components/settings/recipes/RecipesDashboard.js",
149 "start": {
150 "line": 64,
151 "column": 25
152 },
153 "end": {
154 "line": 67,
155 "column": 3
156 }
157 },
158 {
159 "id": "settings.recipes.customService.headline.communityRecipes",
160 "defaultMessage": "!!!Community 3rd Party Recipes",
161 "file": "src/components/settings/recipes/RecipesDashboard.js",
162 "start": {
163 "line": 68,
164 "column": 28
165 },
166 "end": {
167 "line": 71,
168 "column": 3
169 }
170 },
171 {
172 "id": "settings.recipes.customService.headline.devRecipes",
173 "defaultMessage": "!!!Your Development Service Recipes",
174 "file": "src/components/settings/recipes/RecipesDashboard.js",
175 "start": {
176 "line": 72,
177 "column": 22
178 },
179 "end": {
180 "line": 75,
103 "column": 3 181 "column": 3
104 } 182 }
105 } 183 }
diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
index c59a6129f..45dc7b690 100644
--- a/src/i18n/messages/src/components/settings/services/EditServiceForm.json
+++ b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Save service", 4 "defaultMessage": "!!!Save service",
5 "file": "src/components/settings/services/EditServiceForm.js", 5 "file": "src/components/settings/services/EditServiceForm.js",
6 "start": { 6 "start": {
7 "line": 22, 7 "line": 24,
8 "column": 15 8 "column": 15
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 25, 11 "line": 27,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Delete Service", 17 "defaultMessage": "!!!Delete Service",
18 "file": "src/components/settings/services/EditServiceForm.js", 18 "file": "src/components/settings/services/EditServiceForm.js",
19 "start": { 19 "start": {
20 "line": 26, 20 "line": 28,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 29, 24 "line": 31,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Available services", 30 "defaultMessage": "!!!Available services",
31 "file": "src/components/settings/services/EditServiceForm.js", 31 "file": "src/components/settings/services/EditServiceForm.js",
32 "start": { 32 "start": {
33 "line": 30, 33 "line": 32,
34 "column": 21 34 "column": 21
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 33, 37 "line": 35,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Your services", 43 "defaultMessage": "!!!Your services",
44 "file": "src/components/settings/services/EditServiceForm.js", 44 "file": "src/components/settings/services/EditServiceForm.js",
45 "start": { 45 "start": {
46 "line": 34, 46 "line": 36,
47 "column": 16 47 "column": 16
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 37, 50 "line": 39,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Add {name}", 56 "defaultMessage": "!!!Add {name}",
57 "file": "src/components/settings/services/EditServiceForm.js", 57 "file": "src/components/settings/services/EditServiceForm.js",
58 "start": { 58 "start": {
59 "line": 38, 59 "line": 40,
60 "column": 22 60 "column": 22
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 41, 63 "line": 43,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Edit {name}", 69 "defaultMessage": "!!!Edit {name}",
70 "file": "src/components/settings/services/EditServiceForm.js", 70 "file": "src/components/settings/services/EditServiceForm.js",
71 "start": { 71 "start": {
72 "line": 42, 72 "line": 44,
73 "column": 23 73 "column": 23
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 45, 76 "line": 47,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Hosted", 82 "defaultMessage": "!!!Hosted",
83 "file": "src/components/settings/services/EditServiceForm.js", 83 "file": "src/components/settings/services/EditServiceForm.js",
84 "start": { 84 "start": {
85 "line": 46, 85 "line": 48,
86 "column": 13 86 "column": 13
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 49, 89 "line": 51,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Self hosted â­ï¸", 95 "defaultMessage": "!!!Self hosted â­ï¸",
96 "file": "src/components/settings/services/EditServiceForm.js", 96 "file": "src/components/settings/services/EditServiceForm.js",
97 "start": { 97 "start": {
98 "line": 50, 98 "line": 52,
99 "column": 16 99 "column": 16
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 53, 102 "line": 55,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Use the hosted {name} service.", 108 "defaultMessage": "!!!Use the hosted {name} service.",
109 "file": "src/components/settings/services/EditServiceForm.js", 109 "file": "src/components/settings/services/EditServiceForm.js",
110 "start": { 110 "start": {
111 "line": 54, 111 "line": 56,
112 "column": 20 112 "column": 20
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 57, 115 "line": 59,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Could not validate custom {name} server.", 121 "defaultMessage": "!!!Could not validate custom {name} server.",
122 "file": "src/components/settings/services/EditServiceForm.js", 122 "file": "src/components/settings/services/EditServiceForm.js",
123 "start": { 123 "start": {
124 "line": 58, 124 "line": 60,
125 "column": 28 125 "column": 28
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 61, 128 "line": 63,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.", 134 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
135 "file": "src/components/settings/services/EditServiceForm.js", 135 "file": "src/components/settings/services/EditServiceForm.js",
136 "start": { 136 "start": {
137 "line": 62, 137 "line": 64,
138 "column": 24 138 "column": 24
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 65, 141 "line": 67,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Upgrade your account", 147 "defaultMessage": "!!!Upgrade your account",
148 "file": "src/components/settings/services/EditServiceForm.js", 148 "file": "src/components/settings/services/EditServiceForm.js",
149 "start": { 149 "start": {
150 "line": 66, 150 "line": 68,
151 "column": 27 151 "column": 27
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 69, 154 "line": 71,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 160 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
161 "file": "src/components/settings/services/EditServiceForm.js", 161 "file": "src/components/settings/services/EditServiceForm.js",
162 "start": { 162 "start": {
163 "line": 70, 163 "line": 72,
164 "column": 23 164 "column": 23
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 73, 167 "line": 75,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 173 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
174 "file": "src/components/settings/services/EditServiceForm.js", 174 "file": "src/components/settings/services/EditServiceForm.js",
175 "start": { 175 "start": {
176 "line": 74, 176 "line": 76,
177 "column": 15 177 "column": 15
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 77, 180 "line": 79,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Notifications", 186 "defaultMessage": "!!!Notifications",
187 "file": "src/components/settings/services/EditServiceForm.js", 187 "file": "src/components/settings/services/EditServiceForm.js",
188 "start": { 188 "start": {
189 "line": 78, 189 "line": 80,
190 "column": 25 190 "column": 25
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 81, 193 "line": 83,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Unread message badges", 199 "defaultMessage": "!!!Unread message badges",
200 "file": "src/components/settings/services/EditServiceForm.js", 200 "file": "src/components/settings/services/EditServiceForm.js",
201 "start": { 201 "start": {
202 "line": 82, 202 "line": 84,
203 "column": 18 203 "column": 18
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 85, 206 "line": 87,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!General", 212 "defaultMessage": "!!!General",
213 "file": "src/components/settings/services/EditServiceForm.js", 213 "file": "src/components/settings/services/EditServiceForm.js",
214 "start": { 214 "start": {
215 "line": 86, 215 "line": 88,
216 "column": 19 216 "column": 19
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 89, 219 "line": 91,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Delete", 225 "defaultMessage": "!!!Delete",
226 "file": "src/components/settings/services/EditServiceForm.js", 226 "file": "src/components/settings/services/EditServiceForm.js",
227 "start": { 227 "start": {
228 "line": 90, 228 "line": 92,
229 "column": 14 229 "column": 14
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 93, 232 "line": 95,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Drop your image, or click here", 238 "defaultMessage": "!!!Drop your image, or click here",
239 "file": "src/components/settings/services/EditServiceForm.js", 239 "file": "src/components/settings/services/EditServiceForm.js",
240 "start": { 240 "start": {
241 "line": 94, 241 "line": 96,
242 "column": 14 242 "column": 14
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 97, 245 "line": 99,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 251 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
252 "file": "src/components/settings/services/EditServiceForm.js", 252 "file": "src/components/settings/services/EditServiceForm.js",
253 "start": { 253 "start": {
254 "line": 98, 254 "line": 100,
255 "column": 17 255 "column": 17
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 101, 258 "line": 103,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 264 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
265 "file": "src/components/settings/services/EditServiceForm.js", 265 "file": "src/components/settings/services/EditServiceForm.js",
266 "start": { 266 "start": {
267 "line": 102, 267 "line": 104,
268 "column": 20 268 "column": 20
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 105, 271 "line": 107,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 277 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
278 "file": "src/components/settings/services/EditServiceForm.js", 278 "file": "src/components/settings/services/EditServiceForm.js",
279 "start": { 279 "start": {
280 "line": 106, 280 "line": 108,
281 "column": 13 281 "column": 13
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 109, 284 "line": 111,
285 "column": 3 285 "column": 3
286 } 286 }
287 } 287 }
diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
index 3803c6512..fa661ea2f 100644
--- a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
+++ b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services", 4 "defaultMessage": "!!!Your services",
5 "file": "src/components/settings/services/ServicesDashboard.js", 5 "file": "src/components/settings/services/ServicesDashboard.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Search service", 17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/services/ServicesDashboard.js", 18 "file": "src/components/settings/services/ServicesDashboard.js",
19 "start": { 19 "start": {
20 "line": 18, 20 "line": 19,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 21, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!You haven't added any services yet.", 30 "defaultMessage": "!!!You haven't added any services yet.",
31 "file": "src/components/settings/services/ServicesDashboard.js", 31 "file": "src/components/settings/services/ServicesDashboard.js",
32 "start": { 32 "start": {
33 "line": 22, 33 "line": 23,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 25, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Sorry, but no service matched your search term.", 43 "defaultMessage": "!!!Sorry, but no service matched your search term.",
44 "file": "src/components/settings/services/ServicesDashboard.js", 44 "file": "src/components/settings/services/ServicesDashboard.js",
45 "start": { 45 "start": {
46 "line": 26, 46 "line": 27,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 29, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Discover services", 56 "defaultMessage": "!!!Discover services",
57 "file": "src/components/settings/services/ServicesDashboard.js", 57 "file": "src/components/settings/services/ServicesDashboard.js",
58 "start": { 58 "start": {
59 "line": 30, 59 "line": 31,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 33, 63 "line": 34,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Could not load your services", 69 "defaultMessage": "!!!Could not load your services",
70 "file": "src/components/settings/services/ServicesDashboard.js", 70 "file": "src/components/settings/services/ServicesDashboard.js",
71 "start": { 71 "start": {
72 "line": 34, 72 "line": 35,
73 "column": 25 73 "column": 25
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 37, 76 "line": 38,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Try again", 82 "defaultMessage": "!!!Try again",
83 "file": "src/components/settings/services/ServicesDashboard.js", 83 "file": "src/components/settings/services/ServicesDashboard.js",
84 "start": { 84 "start": {
85 "line": 38, 85 "line": 39,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 41, 89 "line": 42,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Your changes have been saved", 95 "defaultMessage": "!!!Your changes have been saved",
96 "file": "src/components/settings/services/ServicesDashboard.js", 96 "file": "src/components/settings/services/ServicesDashboard.js",
97 "start": { 97 "start": {
98 "line": 42, 98 "line": 43,
99 "column": 15 99 "column": 15
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 45, 102 "line": 46,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Service has been deleted", 108 "defaultMessage": "!!!Service has been deleted",
109 "file": "src/components/settings/services/ServicesDashboard.js", 109 "file": "src/components/settings/services/ServicesDashboard.js",
110 "start": { 110 "start": {
111 "line": 46, 111 "line": 47,
112 "column": 15 112 "column": 15
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 49, 115 "line": 50,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/i18n/messages/src/components/settings/team/TeamDashboard.json b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
index 89d038cf3..80adadb67 100644
--- a/src/i18n/messages/src/components/settings/team/TeamDashboard.json
+++ b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Team", 4 "defaultMessage": "!!!Team",
5 "file": "src/components/settings/team/TeamDashboard.js", 5 "file": "src/components/settings/team/TeamDashboard.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Ferdi for Teams", 17 "defaultMessage": "!!!Ferdi for Teams",
18 "file": "src/components/settings/team/TeamDashboard.js", 18 "file": "src/components/settings/team/TeamDashboard.js",
19 "start": { 19 "start": {
20 "line": 18, 20 "line": 21,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 21, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!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.", 30 "defaultMessage": "!!!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.",
31 "file": "src/components/settings/team/TeamDashboard.js", 31 "file": "src/components/settings/team/TeamDashboard.js",
32 "start": { 32 "start": {
33 "line": 22, 33 "line": 25,
34 "column": 9 34 "column": 9
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 25, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Ferdi 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!", 43 "defaultMessage": "!!!Ferdi 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!",
44 "file": "src/components/settings/team/TeamDashboard.js", 44 "file": "src/components/settings/team/TeamDashboard.js",
45 "start": { 45 "start": {
46 "line": 26, 46 "line": 29,
47 "column": 8 47 "column": 8
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 29, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Manage your Team on meetfranz.com", 56 "defaultMessage": "!!!Manage your Team on meetfranz.com",
57 "file": "src/components/settings/team/TeamDashboard.js", 57 "file": "src/components/settings/team/TeamDashboard.js",
58 "start": { 58 "start": {
59 "line": 30, 59 "line": 33,
60 "column": 16 60 "column": 16
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 33, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Upgrade your Account", 69 "defaultMessage": "!!!Upgrade your Account",
70 "file": "src/components/settings/team/TeamDashboard.js", 70 "file": "src/components/settings/team/TeamDashboard.js",
71 "start": { 71 "start": {
72 "line": 34, 72 "line": 37,
73 "column": 17 73 "column": 17
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 37, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 } 79 }
diff --git a/src/i18n/messages/src/components/subscription/SubscriptionForm.json b/src/i18n/messages/src/components/subscription/SubscriptionForm.json
index 506408caf..6d235254e 100644
--- a/src/i18n/messages/src/components/subscription/SubscriptionForm.json
+++ b/src/i18n/messages/src/components/subscription/SubscriptionForm.json
@@ -1,183 +1,53 @@
1[ 1[
2 { 2 {
3 "id": "subscription.submit.label", 3 "id": "subscription.cta.choosePlan",
4 "defaultMessage": "!!!Support the development of Franz", 4 "defaultMessage": "!!!Choose your plan",
5 "file": "src/components/subscription/SubscriptionForm.js", 5 "file": "src/components/subscription/SubscriptionForm.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 13,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.paymentSessionError",
17 "defaultMessage": "!!!Could not initialize payment form",
18 "file": "src/components/subscription/SubscriptionForm.js",
19 "start": {
20 "line": 18,
21 "column": 23
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.type.free",
30 "defaultMessage": "!!!free",
31 "file": "src/components/subscription/SubscriptionForm.js",
32 "start": {
33 "line": 22,
34 "column": 12
35 },
36 "end": {
37 "line": 25,
38 "column": 3 12 "column": 3
39 } 13 }
40 }, 14 },
41 { 15 {
42 "id": "subscription.type.month", 16 "id": "settings.account.headlineUpgradeAccount",
43 "defaultMessage": "!!!month", 17 "defaultMessage": "!!!Upgrade your account and get the full Franz experience",
44 "file": "src/components/subscription/SubscriptionForm.js", 18 "file": "src/components/subscription/SubscriptionForm.js",
45 "start": { 19 "start": {
46 "line": 26, 20 "line": 17,
47 "column": 15 21 "column": 18
48 }, 22 },
49 "end": { 23 "end": {
50 "line": 29, 24 "line": 20,
51 "column": 3 25 "column": 3
52 } 26 }
53 }, 27 },
54 { 28 {
55 "id": "subscription.type.year", 29 "id": "subscription.teaser.intro",
56 "defaultMessage": "!!!year", 30 "defaultMessage": "!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
57 "file": "src/components/subscription/SubscriptionForm.js", 31 "file": "src/components/subscription/SubscriptionForm.js",
58 "start": { 32 "start": {
59 "line": 30, 33 "line": 21,
60 "column": 14 34 "column": 14
61 }, 35 },
62 "end": { 36 "end": {
63 "line": 33, 37 "line": 24,
64 "column": 3 38 "column": 3
65 } 39 }
66 }, 40 },
67 { 41 {
68 "id": "subscription.includedFeatures", 42 "id": "subscription.teaser.includedFeatures",
69 "defaultMessage": "!!!The Ferdi Premium Supporter Account includes", 43 "defaultMessage": "!!!Paid Franz Plans include:",
70 "file": "src/components/subscription/SubscriptionForm.js", 44 "file": "src/components/subscription/SubscriptionForm.js",
71 "start": { 45 "start": {
72 "line": 34, 46 "line": 25,
73 "column": 20 47 "column": 20
74 }, 48 },
75 "end": { 49 "end": {
76 "line": 37, 50 "line": 28,
77 "column": 3
78 }
79 },
80 {
81 "id": "subscription.features.onpremise.mattermost",
82 "defaultMessage": "!!!Add on-premise/hosted services like Mattermost",
83 "file": "src/components/subscription/SubscriptionForm.js",
84 "start": {
85 "line": 38,
86 "column": 13
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 },
93 {
94 "id": "subscription.features.noInterruptions",
95 "defaultMessage": "!!!No app delays & nagging to upgrade license",
96 "file": "src/components/subscription/SubscriptionForm.js",
97 "start": {
98 "line": 42,
99 "column": 19
100 },
101 "end": {
102 "line": 45,
103 "column": 3
104 }
105 },
106 {
107 "id": "subscription.features.proxy",
108 "defaultMessage": "!!!Proxy support for services",
109 "file": "src/components/subscription/SubscriptionForm.js",
110 "start": {
111 "line": 46,
112 "column": 9
113 },
114 "end": {
115 "line": 49,
116 "column": 3
117 }
118 },
119 {
120 "id": "subscription.features.spellchecker",
121 "defaultMessage": "!!!Support for Spellchecker",
122 "file": "src/components/subscription/SubscriptionForm.js",
123 "start": {
124 "line": 50,
125 "column": 16
126 },
127 "end": {
128 "line": 53,
129 "column": 3
130 }
131 },
132 {
133 "id": "subscription.features.workspaces",
134 "defaultMessage": "!!!Organize your services in workspaces",
135 "file": "src/components/subscription/SubscriptionForm.js",
136 "start": {
137 "line": 54,
138 "column": 14
139 },
140 "end": {
141 "line": 57,
142 "column": 3
143 }
144 },
145 {
146 "id": "subscription.features.ads",
147 "defaultMessage": "!!!No ads, ever!",
148 "file": "src/components/subscription/SubscriptionForm.js",
149 "start": {
150 "line": 58,
151 "column": 7
152 },
153 "end": {
154 "line": 61,
155 "column": 3
156 }
157 },
158 {
159 "id": "subscription.features.comingSoon",
160 "defaultMessage": "!!!coming soon",
161 "file": "src/components/subscription/SubscriptionForm.js",
162 "start": {
163 "line": 62,
164 "column": 14
165 },
166 "end": {
167 "line": 65,
168 "column": 3
169 }
170 },
171 {
172 "id": "subscription.euTaxInfo",
173 "defaultMessage": "!!!EU residents: local sales tax may apply",
174 "file": "src/components/subscription/SubscriptionForm.js",
175 "start": {
176 "line": 66,
177 "column": 13
178 },
179 "end": {
180 "line": 69,
181 "column": 3 51 "column": 3
182 } 52 }
183 } 53 }
diff --git a/src/i18n/messages/src/components/subscription/TrialForm.json b/src/i18n/messages/src/components/subscription/TrialForm.json
new file mode 100644
index 000000000..8b387ba36
--- /dev/null
+++ b/src/i18n/messages/src/components/subscription/TrialForm.json
@@ -0,0 +1,93 @@
1[
2 {
3 "id": "subscription.cta.activateTrial",
4 "defaultMessage": "!!!Yes, start the free Franz Professional trial",
5 "file": "src/components/subscription/TrialForm.js",
6 "start": {
7 "line": 14,
8 "column": 21
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.cta.allOptions",
17 "defaultMessage": "!!!See all options",
18 "file": "src/components/subscription/TrialForm.js",
19 "start": {
20 "line": 18,
21 "column": 20
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.account.headlineTrialUpgrade",
30 "defaultMessage": "!!!Get the free 14 day Franz Professional Trial",
31 "file": "src/components/subscription/TrialForm.js",
32 "start": {
33 "line": 22,
34 "column": 18
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "subscription.includedProFeatures",
43 "defaultMessage": "!!!The Franz Professional Plan includes:",
44 "file": "src/components/subscription/TrialForm.js",
45 "start": {
46 "line": 26,
47 "column": 20
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/subscription/TrialForm.js",
58 "start": {
59 "line": 30,
60 "column": 29
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/subscription/TrialForm.js",
71 "start": {
72 "line": 34,
73 "column": 16
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/subscription/TrialForm.js",
84 "start": {
85 "line": 38,
86 "column": 21
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json b/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json
new file mode 100644
index 000000000..fd969da78
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json
@@ -0,0 +1,93 @@
1[
2 {
3 "id": "feature.delayApp.upgrade.action",
4 "defaultMessage": "!!!Get a Franz Supporter License",
5 "file": "src/components/ui/ActivateTrialButton/index.js",
6 "start": {
7 "line": 13,
8 "column": 10
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.delayApp.trial.action",
17 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
18 "file": "src/components/ui/ActivateTrialButton/index.js",
19 "start": {
20 "line": 17,
21 "column": 15
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.upgrade.actionShort",
30 "defaultMessage": "!!!Upgrade account",
31 "file": "src/components/ui/ActivateTrialButton/index.js",
32 "start": {
33 "line": 21,
34 "column": 15
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.delayApp.trial.actionShort",
43 "defaultMessage": "!!!Activate the free Franz Professional trial",
44 "file": "src/components/ui/ActivateTrialButton/index.js",
45 "start": {
46 "line": 25,
47 "column": 20
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/ui/ActivateTrialButton/index.js",
58 "start": {
59 "line": 29,
60 "column": 29
61 },
62 "end": {
63 "line": 32,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/ui/ActivateTrialButton/index.js",
71 "start": {
72 "line": 33,
73 "column": 16
74 },
75 "end": {
76 "line": 36,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/ui/ActivateTrialButton/index.js",
84 "start": {
85 "line": 37,
86 "column": 21
87 },
88 "end": {
89 "line": 40,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/FeatureList.json b/src/i18n/messages/src/components/ui/FeatureList.json
new file mode 100644
index 000000000..497e299a4
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/FeatureList.json
@@ -0,0 +1,132 @@
1[
2 {
3 "id": "pricing.features.unlimitedServices",
4 "defaultMessage": "!!!Add unlimited services",
5 "file": "src/components/ui/FeatureList.js",
6 "start": {
7 "line": 8,
8 "column": 21
9 },
10 "end": {
11 "line": 11,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.features.spellchecker",
17 "defaultMessage": "!!!Spellchecker support",
18 "file": "src/components/ui/FeatureList.js",
19 "start": {
20 "line": 12,
21 "column": 16
22 },
23 "end": {
24 "line": 15,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.features.workspaces",
30 "defaultMessage": "!!!Workspaces",
31 "file": "src/components/ui/FeatureList.js",
32 "start": {
33 "line": 16,
34 "column": 14
35 },
36 "end": {
37 "line": 19,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.features.customWebsites",
43 "defaultMessage": "!!!Add Custom Websites",
44 "file": "src/components/ui/FeatureList.js",
45 "start": {
46 "line": 20,
47 "column": 18
48 },
49 "end": {
50 "line": 23,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.features.onPremise",
56 "defaultMessage": "!!!On-premise & other Hosted Services",
57 "file": "src/components/ui/FeatureList.js",
58 "start": {
59 "line": 24,
60 "column": 13
61 },
62 "end": {
63 "line": 27,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.features.thirdPartyServices",
69 "defaultMessage": "!!!Install 3rd party services",
70 "file": "src/components/ui/FeatureList.js",
71 "start": {
72 "line": 28,
73 "column": 22
74 },
75 "end": {
76 "line": 31,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.features.serviceProxies",
82 "defaultMessage": "!!!Service Proxies",
83 "file": "src/components/ui/FeatureList.js",
84 "start": {
85 "line": 32,
86 "column": 18
87 },
88 "end": {
89 "line": 35,
90 "column": 3
91 }
92 },
93 {
94 "id": "pricing.features.teamManagement",
95 "defaultMessage": "!!!Team Management",
96 "file": "src/components/ui/FeatureList.js",
97 "start": {
98 "line": 36,
99 "column": 18
100 },
101 "end": {
102 "line": 39,
103 "column": 3
104 }
105 },
106 {
107 "id": "pricing.features.appDelays",
108 "defaultMessage": "!!!No Waiting Screens",
109 "file": "src/components/ui/FeatureList.js",
110 "start": {
111 "line": 40,
112 "column": 13
113 },
114 "end": {
115 "line": 43,
116 "column": 3
117 }
118 },
119 {
120 "id": "pricing.features.adFree",
121 "defaultMessage": "!!!Forever ad-free",
122 "file": "src/components/ui/FeatureList.js",
123 "start": {
124 "line": 44,
125 "column": 10
126 },
127 "end": {
128 "line": 47,
129 "column": 3
130 }
131 }
132] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/UpgradeButton/index.json b/src/i18n/messages/src/components/ui/UpgradeButton/index.json
new file mode 100644
index 000000000..28e44cb66
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/UpgradeButton/index.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "global.upgradeButton.upgradeToPro",
4 "defaultMessage": "!!!Upgrade to Franz Professional",
5 "file": "src/components/ui/UpgradeButton/index.js",
6 "start": {
7 "line": 13,
8 "column": 16
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index 7645ae2c2..f802893e8 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Language", 82 "defaultMessage": "!!!Language",
83 "file": "src/containers/settings/EditSettingsScreen.js", 83 "file": "src/containers/settings/EditSettingsScreen.js",
84 "start": { 84 "start": {
85 "line": 48, 85 "line": 44,
86 "column": 12 86 "column": 12
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 51, 89 "line": 47,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Dark Mode", 95 "defaultMessage": "!!!Dark Mode",
96 "file": "src/containers/settings/EditSettingsScreen.js", 96 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": { 97 "start": {
98 "line": 52, 98 "line": 48,
99 "column": 12 99 "column": 12
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 55, 102 "line": 51,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Display disabled services tabs", 108 "defaultMessage": "!!!Display disabled services tabs",
109 "file": "src/containers/settings/EditSettingsScreen.js", 109 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": { 110 "start": {
111 "line": 56, 111 "line": 52,
112 "column": 24 112 "column": 24
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 59, 115 "line": 55,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 121 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
122 "file": "src/containers/settings/EditSettingsScreen.js", 122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": { 123 "start": {
124 "line": 60, 124 "line": 56,
125 "column": 29 125 "column": 29
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 63, 128 "line": 59,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Enable spell checking", 134 "defaultMessage": "!!!Enable spell checking",
135 "file": "src/containers/settings/EditSettingsScreen.js", 135 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": { 136 "start": {
137 "line": 64, 137 "line": 60,
138 "column": 23 138 "column": 23
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 67, 141 "line": 63,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Enable GPU Acceleration", 147 "defaultMessage": "!!!Enable GPU Acceleration",
148 "file": "src/containers/settings/EditSettingsScreen.js", 148 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": { 149 "start": {
150 "line": 68, 150 "line": 64,
151 "column": 25 151 "column": 25
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 71, 154 "line": 67,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,10 +160,23 @@
160 "defaultMessage": "!!!Include beta versions", 160 "defaultMessage": "!!!Include beta versions",
161 "file": "src/containers/settings/EditSettingsScreen.js", 161 "file": "src/containers/settings/EditSettingsScreen.js",
162 "start": { 162 "start": {
163 "line": 72, 163 "line": 68,
164 "column": 8 164 "column": 8
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 71,
168 "column": 3
169 }
170 },
171 {
172 "id": "settings.app.form.enableTodos",
173 "defaultMessage": "!!!Enable Franz Todos",
174 "file": "src/containers/settings/EditSettingsScreen.js",
175 "start": {
176 "line": 72,
177 "column": 15
178 },
179 "end": {
167 "line": 75, 180 "line": 75,
168 "column": 3 181 "column": 3
169 } 182 }
diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json
index 2a3bd1fb0..6fe8b1334 100644
--- a/src/i18n/messages/src/features/delayApp/Component.json
+++ b/src/i18n/messages/src/features/delayApp/Component.json
@@ -4,24 +4,50 @@
4 "defaultMessage": "!!!Please purchase license to skip waiting", 4 "defaultMessage": "!!!Please purchase license to skip waiting",
5 "file": "src/features/delayApp/Component.js", 5 "file": "src/features/delayApp/Component.js",
6 "start": { 6 "start": {
7 "line": 13, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 16, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
15 { 15 {
16 "id": "feature.delayApp.action", 16 "id": "feature.delayApp.trial.headline",
17 "defaultMessage": "!!!Get a Ferdi Supporter License", 17 "defaultMessage": "!!!Get the free Franz Professional 14 day trial and skip the line",
18 "file": "src/features/delayApp/Component.js", 18 "file": "src/features/delayApp/Component.js",
19 "start": { 19 "start": {
20 "line": 17, 20 "line": 21,
21 "column": 17
22 },
23 "end": {
24 "line": 24,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.upgrade.action",
30 "defaultMessage": "!!!Get a Franz Supporter License",
31 "file": "src/features/delayApp/Component.js",
32 "start": {
33 "line": 25,
21 "column": 10 34 "column": 10
22 }, 35 },
23 "end": { 36 "end": {
24 "line": 20, 37 "line": 28,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.delayApp.trial.action",
43 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
44 "file": "src/features/delayApp/Component.js",
45 "start": {
46 "line": 29,
47 "column": 15
48 },
49 "end": {
50 "line": 32,
25 "column": 3 51 "column": 3
26 } 52 }
27 }, 53 },
@@ -30,11 +56,11 @@
30 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.", 56 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.",
31 "file": "src/features/delayApp/Component.js", 57 "file": "src/features/delayApp/Component.js",
32 "start": { 58 "start": {
33 "line": 21, 59 "line": 33,
34 "column": 8 60 "column": 8
35 }, 61 },
36 "end": { 62 "end": {
37 "line": 24, 63 "line": 36,
38 "column": 3 64 "column": 3
39 } 65 }
40 } 66 }
diff --git a/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json b/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json
new file mode 100644
index 000000000..e6e3cef99
--- /dev/null
+++ b/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "feature.announcements.changelog.headline",
4 "defaultMessage": "!!!Changes in Franz {version}",
5 "file": "src/features/serviceLimit/components/AnnouncementScreen.js",
6 "start": {
7 "line": 20,
8 "column": 12
9 },
10 "end": {
11 "line": 23,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json b/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json
new file mode 100644
index 000000000..df5bc03e8
--- /dev/null
+++ b/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "feature.serviceLimit.limitReached",
4 "defaultMessage": "!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.",
5 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6 "start": {
7 "line": 11,
8 "column": 16
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "premiumFeature.button.upgradeAccount",
17 "defaultMessage": "!!!Upgrade account",
18 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
19 "start": {
20 "line": 15,
21 "column": 10
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json
index a4ddd37b6..6e3e9ad19 100644
--- a/src/i18n/messages/src/features/shareFranz/Component.json
+++ b/src/i18n/messages/src/features/shareFranz/Component.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Ferdi is better together!", 4 "defaultMessage": "!!!Ferdi is better together!",
5 "file": "src/features/shareFranz/Component.js", 5 "file": "src/features/shareFranz/Component.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 18,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 21,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 17 "defaultMessage": "!!!Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
18 "file": "src/features/shareFranz/Component.js", 18 "file": "src/features/shareFranz/Component.js",
19 "start": { 19 "start": {
20 "line": 18, 20 "line": 22,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 21, 24 "line": 25,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Share as email", 30 "defaultMessage": "!!!Share as email",
31 "file": "src/features/shareFranz/Component.js", 31 "file": "src/features/shareFranz/Component.js",
32 "start": { 32 "start": {
33 "line": 22, 33 "line": 26,
34 "column": 16 34 "column": 16
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 25, 37 "line": 29,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Share on Facebook", 43 "defaultMessage": "!!!Share on Facebook",
44 "file": "src/features/shareFranz/Component.js", 44 "file": "src/features/shareFranz/Component.js",
45 "start": { 45 "start": {
46 "line": 26, 46 "line": 30,
47 "column": 19 47 "column": 19
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 29, 50 "line": 33,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Share on Twitter", 56 "defaultMessage": "!!!Share on Twitter",
57 "file": "src/features/shareFranz/Component.js", 57 "file": "src/features/shareFranz/Component.js",
58 "start": { 58 "start": {
59 "line": 30, 59 "line": 34,
60 "column": 18 60 "column": 18
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 33, 63 "line": 37,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 69 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
70 "file": "src/features/shareFranz/Component.js", 70 "file": "src/features/shareFranz/Component.js",
71 "start": { 71 "start": {
72 "line": 34, 72 "line": 38,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 37, 76 "line": 41,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", 82 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
83 "file": "src/features/shareFranz/Component.js", 83 "file": "src/features/shareFranz/Component.js",
84 "start": { 84 "start": {
85 "line": 38, 85 "line": 42,
86 "column": 20 86 "column": 20
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 41, 89 "line": 45,
90 "column": 3 90 "column": 3
91 } 91 }
92 } 92 }
diff --git a/src/i18n/messages/src/features/todos/components/TodosWebview.json b/src/i18n/messages/src/features/todos/components/TodosWebview.json
new file mode 100644
index 000000000..9cc3325d1
--- /dev/null
+++ b/src/i18n/messages/src/features/todos/components/TodosWebview.json
@@ -0,0 +1,41 @@
1[
2 {
3 "id": "feature.todos.premium.info",
4 "defaultMessage": "!!!Franz Todos are available to premium users now!",
5 "file": "src/features/todos/components/TodosWebview.js",
6 "start": {
7 "line": 18,
8 "column": 15
9 },
10 "end": {
11 "line": 21,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.todos.premium.upgrade",
17 "defaultMessage": "!!!Upgrade Account",
18 "file": "src/features/todos/components/TodosWebview.js",
19 "start": {
20 "line": 22,
21 "column": 14
22 },
23 "end": {
24 "line": 25,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.todos.premium.rollout",
30 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
31 "file": "src/features/todos/components/TodosWebview.js",
32 "start": {
33 "line": 26,
34 "column": 15
35 },
36 "end": {
37 "line": 29,
38 "column": 3
39 }
40 }
41] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
index e91bd85f8..2f340f1e9 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Workspaces", 4 "defaultMessage": "!!!Workspaces",
5 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!All services", 17 "defaultMessage": "!!!All services",
18 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 18 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 21,
21 "column": 15 21 "column": 15
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Workspaces settings", 30 "defaultMessage": "!!!Workspaces settings",
31 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 31 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 25,
34 "column": 29 34 "column": 29
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Info about workspace feature", 43 "defaultMessage": "!!!Info about workspace feature",
44 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 44 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
45 "start": { 45 "start": {
46 "line": 27, 46 "line": 29,
47 "column": 24 47 "column": 24
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 30, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Create your first workspace", 56 "defaultMessage": "!!!Create your first workspace",
57 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 57 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 33,
60 "column": 25 60 "column": 25
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 34, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Reactivate premium account", 69 "defaultMessage": "!!!Reactivate premium account",
70 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 70 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
71 "start": { 71 "start": {
72 "line": 35, 72 "line": 37,
73 "column": 28 73 "column": 28
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 38, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!add new workspace", 82 "defaultMessage": "!!!add new workspace",
83 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 83 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
84 "start": { 84 "start": {
85 "line": 39, 85 "line": 41,
86 "column": 24 86 "column": 24
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 42, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Premium feature", 95 "defaultMessage": "!!!Premium feature",
96 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 96 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
97 "start": { 97 "start": {
98 "line": 43, 98 "line": 45,
99 "column": 23 99 "column": 23
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 46, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
index 127bf136b..4111ba760 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your workspaces", 4 "defaultMessage": "!!!Your workspaces",
5 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
6 "start": { 6 "start": {
7 "line": 17, 7 "line": 19,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 20, 11 "line": 22,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!You haven't added any workspaces yet.", 17 "defaultMessage": "!!!You haven't added any workspaces yet.",
18 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 18 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
19 "start": { 19 "start": {
20 "line": 21, 20 "line": 23,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 24, 24 "line": 26,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load your workspaces", 30 "defaultMessage": "!!!Could not load your workspaces",
31 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 31 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
32 "start": { 32 "start": {
33 "line": 25, 33 "line": 27,
34 "column": 27 34 "column": 27
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 28, 37 "line": 30,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Try again", 43 "defaultMessage": "!!!Try again",
44 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 44 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
45 "start": { 45 "start": {
46 "line": 29, 46 "line": 31,
47 "column": 23 47 "column": 23
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 32, 50 "line": 34,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Your changes have been saved", 56 "defaultMessage": "!!!Your changes have been saved",
57 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 57 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
58 "start": { 58 "start": {
59 "line": 33, 59 "line": 35,
60 "column": 15 60 "column": 15
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 36, 63 "line": 38,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Workspace has been deleted", 69 "defaultMessage": "!!!Workspace has been deleted",
70 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 70 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
71 "start": { 71 "start": {
72 "line": 37, 72 "line": 39,
73 "column": 15 73 "column": 15
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 40, 76 "line": 42,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Info about workspace feature", 82 "defaultMessage": "!!!Info about workspace feature",
83 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 83 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
84 "start": { 84 "start": {
85 "line": 41, 85 "line": 43,
86 "column": 24 86 "column": 24
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 44, 89 "line": 46,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces", 95 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces",
96 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 96 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
97 "start": { 97 "start": {
98 "line": 45, 98 "line": 47,
99 "column": 28 99 "column": 28
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 48, 102 "line": 50,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/helpers/plan-helpers.json b/src/i18n/messages/src/helpers/plan-helpers.json
new file mode 100644
index 000000000..df8ee19e3
--- /dev/null
+++ b/src/i18n/messages/src/helpers/plan-helpers.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "pricing.plan.pro",
4 "defaultMessage": "!!!Franz Professional",
5 "file": "src/helpers/plan-helpers.js",
6 "start": {
7 "line": 5,
8 "column": 15
9 },
10 "end": {
11 "line": 8,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.plan.personal",
17 "defaultMessage": "!!!Franz Personal",
18 "file": "src/helpers/plan-helpers.js",
19 "start": {
20 "line": 9,
21 "column": 20
22 },
23 "end": {
24 "line": 12,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.plan.free",
30 "defaultMessage": "!!!Franz Free",
31 "file": "src/helpers/plan-helpers.js",
32 "start": {
33 "line": 13,
34 "column": 16
35 },
36 "end": {
37 "line": 16,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.plan.legacy",
43 "defaultMessage": "!!!Franz Premium",
44 "file": "src/helpers/plan-helpers.js",
45 "start": {
46 "line": 17,
47 "column": 18
48 },
49 "end": {
50 "line": 20,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/helpers/pricing-helpers.json b/src/i18n/messages/src/helpers/pricing-helpers.json
new file mode 100644
index 000000000..4030a3e3b
--- /dev/null
+++ b/src/i18n/messages/src/helpers/pricing-helpers.json
@@ -0,0 +1,80 @@
1[
2 {
3 "id": "pricing.plan.pro-yearly",
4 "defaultMessage": "!!!Franz Professional Yearly",
5 "file": "src/helpers/pricing-helpers.js",
6 "start": {
7 "line": 5,
8 "column": 22
9 },
10 "end": {
11 "line": 8,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.plan.pro-monthly",
17 "defaultMessage": "!!!Franz Professional Monthly",
18 "file": "src/helpers/pricing-helpers.js",
19 "start": {
20 "line": 9,
21 "column": 23
22 },
23 "end": {
24 "line": 12,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.plan.personal-yearly",
30 "defaultMessage": "!!!Franz Personal Yearly",
31 "file": "src/helpers/pricing-helpers.js",
32 "start": {
33 "line": 13,
34 "column": 27
35 },
36 "end": {
37 "line": 16,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.plan.personal-monthly",
43 "defaultMessage": "!!!Franz Personal Monthly",
44 "file": "src/helpers/pricing-helpers.js",
45 "start": {
46 "line": 17,
47 "column": 28
48 },
49 "end": {
50 "line": 20,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.plan.free",
56 "defaultMessage": "!!!Franz Free",
57 "file": "src/helpers/pricing-helpers.js",
58 "start": {
59 "line": 21,
60 "column": 16
61 },
62 "end": {
63 "line": 24,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.plan.legacy",
69 "defaultMessage": "!!!Franz Premium",
70 "file": "src/helpers/pricing-helpers.js",
71 "start": {
72 "line": 25,
73 "column": 18
74 },
75 "end": {
76 "line": 28,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json
index f94dcdf17..903de64cb 100644
--- a/src/i18n/messages/src/i18n/globalMessages.json
+++ b/src/i18n/messages/src/i18n/globalMessages.json
@@ -76,5 +76,18 @@
76 "line": 27, 76 "line": 27,
77 "column": 3 77 "column": 3
78 } 78 }
79 },
80 {
81 "id": "global.franzProRequired",
82 "defaultMessage": "!!!Franz Professional Required",
83 "file": "src/i18n/globalMessages.js",
84 "start": {
85 "line": 28,
86 "column": 15
87 },
88 "end": {
89 "line": 31,
90 "column": 3
91 }
79 } 92 }
80] \ No newline at end of file 93] \ No newline at end of file
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index a41c80c1c..43354bfca 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Edit", 4 "defaultMessage": "!!!Edit",
5 "file": "src/lib/Menu.js", 5 "file": "src/lib/Menu.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 18,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 21,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Undo", 17 "defaultMessage": "!!!Undo",
18 "file": "src/lib/Menu.js", 18 "file": "src/lib/Menu.js",
19 "start": { 19 "start": {
20 "line": 18, 20 "line": 22,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 21, 24 "line": 25,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Redo", 30 "defaultMessage": "!!!Redo",
31 "file": "src/lib/Menu.js", 31 "file": "src/lib/Menu.js",
32 "start": { 32 "start": {
33 "line": 22, 33 "line": 26,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 25, 37 "line": 29,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Cut", 43 "defaultMessage": "!!!Cut",
44 "file": "src/lib/Menu.js", 44 "file": "src/lib/Menu.js",
45 "start": { 45 "start": {
46 "line": 26, 46 "line": 30,
47 "column": 7 47 "column": 7
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 29, 50 "line": 33,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Copy", 56 "defaultMessage": "!!!Copy",
57 "file": "src/lib/Menu.js", 57 "file": "src/lib/Menu.js",
58 "start": { 58 "start": {
59 "line": 30, 59 "line": 34,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 33, 63 "line": 37,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Paste", 69 "defaultMessage": "!!!Paste",
70 "file": "src/lib/Menu.js", 70 "file": "src/lib/Menu.js",
71 "start": { 71 "start": {
72 "line": 34, 72 "line": 38,
73 "column": 9 73 "column": 9
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 37, 76 "line": 41,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Paste And Match Style", 82 "defaultMessage": "!!!Paste And Match Style",
83 "file": "src/lib/Menu.js", 83 "file": "src/lib/Menu.js",
84 "start": { 84 "start": {
85 "line": 38, 85 "line": 42,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 41, 89 "line": 45,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Delete", 95 "defaultMessage": "!!!Delete",
96 "file": "src/lib/Menu.js", 96 "file": "src/lib/Menu.js",
97 "start": { 97 "start": {
98 "line": 42, 98 "line": 46,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 45, 102 "line": 49,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Select All", 108 "defaultMessage": "!!!Select All",
109 "file": "src/lib/Menu.js", 109 "file": "src/lib/Menu.js",
110 "start": { 110 "start": {
111 "line": 46, 111 "line": 50,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 49, 115 "line": 53,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Speech", 121 "defaultMessage": "!!!Speech",
122 "file": "src/lib/Menu.js", 122 "file": "src/lib/Menu.js",
123 "start": { 123 "start": {
124 "line": 50, 124 "line": 54,
125 "column": 10 125 "column": 10
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 53, 128 "line": 57,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Start Speaking", 134 "defaultMessage": "!!!Start Speaking",
135 "file": "src/lib/Menu.js", 135 "file": "src/lib/Menu.js",
136 "start": { 136 "start": {
137 "line": 54, 137 "line": 58,
138 "column": 17 138 "column": 17
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 57, 141 "line": 61,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Stop Speaking", 147 "defaultMessage": "!!!Stop Speaking",
148 "file": "src/lib/Menu.js", 148 "file": "src/lib/Menu.js",
149 "start": { 149 "start": {
150 "line": 58, 150 "line": 62,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 61, 154 "line": 65,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Start Dictation", 160 "defaultMessage": "!!!Start Dictation",
161 "file": "src/lib/Menu.js", 161 "file": "src/lib/Menu.js",
162 "start": { 162 "start": {
163 "line": 62, 163 "line": 66,
164 "column": 18 164 "column": 18
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 65, 167 "line": 69,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Emoji & Symbols", 173 "defaultMessage": "!!!Emoji & Symbols",
174 "file": "src/lib/Menu.js", 174 "file": "src/lib/Menu.js",
175 "start": { 175 "start": {
176 "line": 66, 176 "line": 70,
177 "column": 16 177 "column": 16
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 69, 180 "line": 73,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Actual Size", 186 "defaultMessage": "!!!Actual Size",
187 "file": "src/lib/Menu.js", 187 "file": "src/lib/Menu.js",
188 "start": { 188 "start": {
189 "line": 70, 189 "line": 74,
190 "column": 13 190 "column": 13
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 73, 193 "line": 77,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Zoom In", 199 "defaultMessage": "!!!Zoom In",
200 "file": "src/lib/Menu.js", 200 "file": "src/lib/Menu.js",
201 "start": { 201 "start": {
202 "line": 74, 202 "line": 78,
203 "column": 10 203 "column": 10
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 77, 206 "line": 81,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Zoom Out", 212 "defaultMessage": "!!!Zoom Out",
213 "file": "src/lib/Menu.js", 213 "file": "src/lib/Menu.js",
214 "start": { 214 "start": {
215 "line": 78, 215 "line": 82,
216 "column": 11 216 "column": 11
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 81, 219 "line": 85,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Enter Full Screen", 225 "defaultMessage": "!!!Enter Full Screen",
226 "file": "src/lib/Menu.js", 226 "file": "src/lib/Menu.js",
227 "start": { 227 "start": {
228 "line": 82, 228 "line": 86,
229 "column": 19 229 "column": 19
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 85, 232 "line": 89,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Exit Full Screen", 238 "defaultMessage": "!!!Exit Full Screen",
239 "file": "src/lib/Menu.js", 239 "file": "src/lib/Menu.js",
240 "start": { 240 "start": {
241 "line": 86, 241 "line": 90,
242 "column": 18 242 "column": 18
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 89, 245 "line": 93,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Toggle Full Screen", 251 "defaultMessage": "!!!Toggle Full Screen",
252 "file": "src/lib/Menu.js", 252 "file": "src/lib/Menu.js",
253 "start": { 253 "start": {
254 "line": 90, 254 "line": 94,
255 "column": 20 255 "column": 20
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 93, 258 "line": 97,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,24 @@
264 "defaultMessage": "!!!Toggle Developer Tools", 264 "defaultMessage": "!!!Toggle Developer Tools",
265 "file": "src/lib/Menu.js", 265 "file": "src/lib/Menu.js",
266 "start": { 266 "start": {
267 "line": 94, 267 "line": 98,
268 "column": 18 268 "column": 18
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 97, 271 "line": 101,
272 "column": 3
273 }
274 },
275 {
276 "id": "menu.view.toggleTodosDevTools",
277 "defaultMessage": "!!!Toggle Todos Developer Tools",
278 "file": "src/lib/Menu.js",
279 "start": {
280 "line": 102,
281 "column": 23
282 },
283 "end": {
284 "line": 105,
272 "column": 3 285 "column": 3
273 } 286 }
274 }, 287 },
@@ -277,11 +290,11 @@
277 "defaultMessage": "!!!Toggle Service Developer Tools", 290 "defaultMessage": "!!!Toggle Service Developer Tools",
278 "file": "src/lib/Menu.js", 291 "file": "src/lib/Menu.js",
279 "start": { 292 "start": {
280 "line": 98, 293 "line": 106,
281 "column": 25 294 "column": 25
282 }, 295 },
283 "end": { 296 "end": {
284 "line": 101, 297 "line": 109,
285 "column": 3 298 "column": 3
286 } 299 }
287 }, 300 },
@@ -290,11 +303,11 @@
290 "defaultMessage": "!!!Reload Service", 303 "defaultMessage": "!!!Reload Service",
291 "file": "src/lib/Menu.js", 304 "file": "src/lib/Menu.js",
292 "start": { 305 "start": {
293 "line": 102, 306 "line": 110,
294 "column": 17 307 "column": 17
295 }, 308 },
296 "end": { 309 "end": {
297 "line": 105, 310 "line": 113,
298 "column": 3 311 "column": 3
299 } 312 }
300 }, 313 },
@@ -303,11 +316,11 @@
303 "defaultMessage": "!!!Reload Franz", 316 "defaultMessage": "!!!Reload Franz",
304 "file": "src/lib/Menu.js", 317 "file": "src/lib/Menu.js",
305 "start": { 318 "start": {
306 "line": 106, 319 "line": 114,
307 "column": 15 320 "column": 15
308 }, 321 },
309 "end": { 322 "end": {
310 "line": 109, 323 "line": 117,
311 "column": 3 324 "column": 3
312 } 325 }
313 }, 326 },
@@ -316,11 +329,11 @@
316 "defaultMessage": "!!!Minimize", 329 "defaultMessage": "!!!Minimize",
317 "file": "src/lib/Menu.js", 330 "file": "src/lib/Menu.js",
318 "start": { 331 "start": {
319 "line": 110, 332 "line": 118,
320 "column": 12 333 "column": 12
321 }, 334 },
322 "end": { 335 "end": {
323 "line": 113, 336 "line": 121,
324 "column": 3 337 "column": 3
325 } 338 }
326 }, 339 },
@@ -329,11 +342,11 @@
329 "defaultMessage": "!!!Close", 342 "defaultMessage": "!!!Close",
330 "file": "src/lib/Menu.js", 343 "file": "src/lib/Menu.js",
331 "start": { 344 "start": {
332 "line": 114, 345 "line": 122,
333 "column": 9 346 "column": 9
334 }, 347 },
335 "end": { 348 "end": {
336 "line": 117, 349 "line": 125,
337 "column": 3 350 "column": 3
338 } 351 }
339 }, 352 },
@@ -342,11 +355,11 @@
342 "defaultMessage": "!!!Learn More", 355 "defaultMessage": "!!!Learn More",
343 "file": "src/lib/Menu.js", 356 "file": "src/lib/Menu.js",
344 "start": { 357 "start": {
345 "line": 118, 358 "line": 126,
346 "column": 13 359 "column": 13
347 }, 360 },
348 "end": { 361 "end": {
349 "line": 121, 362 "line": 129,
350 "column": 3 363 "column": 3
351 } 364 }
352 }, 365 },
@@ -355,11 +368,11 @@
355 "defaultMessage": "!!!Changelog", 368 "defaultMessage": "!!!Changelog",
356 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
357 "start": { 370 "start": {
358 "line": 122, 371 "line": 130,
359 "column": 13 372 "column": 13
360 }, 373 },
361 "end": { 374 "end": {
362 "line": 125, 375 "line": 133,
363 "column": 3 376 "column": 3
364 } 377 }
365 }, 378 },
@@ -368,11 +381,11 @@
368 "defaultMessage": "!!!Support", 381 "defaultMessage": "!!!Support",
369 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
370 "start": { 383 "start": {
371 "line": 126, 384 "line": 134,
372 "column": 11 385 "column": 11
373 }, 386 },
374 "end": { 387 "end": {
375 "line": 129, 388 "line": 137,
376 "column": 3 389 "column": 3
377 } 390 }
378 }, 391 },
@@ -381,11 +394,11 @@
381 "defaultMessage": "!!!Copy Debug Information", 394 "defaultMessage": "!!!Copy Debug Information",
382 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
383 "start": { 396 "start": {
384 "line": 130, 397 "line": 138,
385 "column": 13 398 "column": 13
386 }, 399 },
387 "end": { 400 "end": {
388 "line": 133, 401 "line": 141,
389 "column": 3 402 "column": 3
390 } 403 }
391 }, 404 },
@@ -394,11 +407,11 @@
394 "defaultMessage": "!!!Ferdi Debug Information", 407 "defaultMessage": "!!!Ferdi Debug Information",
395 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
396 "start": { 409 "start": {
397 "line": 134, 410 "line": 142,
398 "column": 27 411 "column": 27
399 }, 412 },
400 "end": { 413 "end": {
401 "line": 137, 414 "line": 145,
402 "column": 3 415 "column": 3
403 } 416 }
404 }, 417 },
@@ -407,11 +420,11 @@
407 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 420 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
408 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
409 "start": { 422 "start": {
410 "line": 138, 423 "line": 146,
411 "column": 23 424 "column": 23
412 }, 425 },
413 "end": { 426 "end": {
414 "line": 141, 427 "line": 149,
415 "column": 3 428 "column": 3
416 } 429 }
417 }, 430 },
@@ -420,11 +433,11 @@
420 "defaultMessage": "!!!Terms of Service", 433 "defaultMessage": "!!!Terms of Service",
421 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
422 "start": { 435 "start": {
423 "line": 142, 436 "line": 150,
424 "column": 7 437 "column": 7
425 }, 438 },
426 "end": { 439 "end": {
427 "line": 145, 440 "line": 153,
428 "column": 3 441 "column": 3
429 } 442 }
430 }, 443 },
@@ -433,11 +446,11 @@
433 "defaultMessage": "!!!Privacy Statement", 446 "defaultMessage": "!!!Privacy Statement",
434 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
435 "start": { 448 "start": {
436 "line": 146, 449 "line": 154,
437 "column": 11 450 "column": 11
438 }, 451 },
439 "end": { 452 "end": {
440 "line": 149, 453 "line": 157,
441 "column": 3 454 "column": 3
442 } 455 }
443 }, 456 },
@@ -446,11 +459,11 @@
446 "defaultMessage": "!!!File", 459 "defaultMessage": "!!!File",
447 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
448 "start": { 461 "start": {
449 "line": 150, 462 "line": 158,
450 "column": 8 463 "column": 8
451 }, 464 },
452 "end": { 465 "end": {
453 "line": 153, 466 "line": 161,
454 "column": 3 467 "column": 3
455 } 468 }
456 }, 469 },
@@ -459,11 +472,11 @@
459 "defaultMessage": "!!!View", 472 "defaultMessage": "!!!View",
460 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
461 "start": { 474 "start": {
462 "line": 154, 475 "line": 162,
463 "column": 8 476 "column": 8
464 }, 477 },
465 "end": { 478 "end": {
466 "line": 157, 479 "line": 165,
467 "column": 3 480 "column": 3
468 } 481 }
469 }, 482 },
@@ -472,11 +485,11 @@
472 "defaultMessage": "!!!Services", 485 "defaultMessage": "!!!Services",
473 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
474 "start": { 487 "start": {
475 "line": 158, 488 "line": 166,
476 "column": 12 489 "column": 12
477 }, 490 },
478 "end": { 491 "end": {
479 "line": 161, 492 "line": 169,
480 "column": 3 493 "column": 3
481 } 494 }
482 }, 495 },
@@ -485,11 +498,11 @@
485 "defaultMessage": "!!!Window", 498 "defaultMessage": "!!!Window",
486 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
487 "start": { 500 "start": {
488 "line": 162, 501 "line": 170,
489 "column": 10 502 "column": 10
490 }, 503 },
491 "end": { 504 "end": {
492 "line": 165, 505 "line": 173,
493 "column": 3 506 "column": 3
494 } 507 }
495 }, 508 },
@@ -498,11 +511,11 @@
498 "defaultMessage": "!!!Help", 511 "defaultMessage": "!!!Help",
499 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
500 "start": { 513 "start": {
501 "line": 166, 514 "line": 174,
502 "column": 8 515 "column": 8
503 }, 516 },
504 "end": { 517 "end": {
505 "line": 169, 518 "line": 177,
506 "column": 3 519 "column": 3
507 } 520 }
508 }, 521 },
@@ -511,11 +524,11 @@
511 "defaultMessage": "!!!About Franz", 524 "defaultMessage": "!!!About Franz",
512 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
513 "start": { 526 "start": {
514 "line": 170, 527 "line": 178,
515 "column": 9 528 "column": 9
516 }, 529 },
517 "end": { 530 "end": {
518 "line": 173, 531 "line": 181,
519 "column": 3 532 "column": 3
520 } 533 }
521 }, 534 },
@@ -524,11 +537,11 @@
524 "defaultMessage": "!!!What's new?", 537 "defaultMessage": "!!!What's new?",
525 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
526 "start": { 539 "start": {
527 "line": 174, 540 "line": 182,
528 "column": 16 541 "column": 16
529 }, 542 },
530 "end": { 543 "end": {
531 "line": 177, 544 "line": 185,
532 "column": 3 545 "column": 3
533 } 546 }
534 }, 547 },
@@ -537,11 +550,11 @@
537 "defaultMessage": "!!!Settings", 550 "defaultMessage": "!!!Settings",
538 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
539 "start": { 552 "start": {
540 "line": 178, 553 "line": 186,
541 "column": 12 554 "column": 12
542 }, 555 },
543 "end": { 556 "end": {
544 "line": 181, 557 "line": 189,
545 "column": 3 558 "column": 3
546 } 559 }
547 }, 560 },
@@ -550,11 +563,11 @@
550 "defaultMessage": "!!!Check for updates", 563 "defaultMessage": "!!!Check for updates",
551 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
552 "start": { 565 "start": {
553 "line": 182, 566 "line": 190,
554 "column": 19 567 "column": 19
555 }, 568 },
556 "end": { 569 "end": {
557 "line": 185, 570 "line": 193,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!Hide", 576 "defaultMessage": "!!!Hide",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 186, 579 "line": 194,
567 "column": 8 580 "column": 8
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 189, 583 "line": 197,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!Hide Others", 589 "defaultMessage": "!!!Hide Others",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 190, 592 "line": 198,
580 "column": 14 593 "column": 14
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 193, 596 "line": 201,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!Unhide", 602 "defaultMessage": "!!!Unhide",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 194, 605 "line": 202,
593 "column": 10 606 "column": 10
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 197, 609 "line": 205,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,11 @@
602 "defaultMessage": "!!!Quit", 615 "defaultMessage": "!!!Quit",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 198, 618 "line": 206,
606 "column": 8 619 "column": 8
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 201, 622 "line": 209,
610 "column": 3 623 "column": 3
611 } 624 }
612 }, 625 },
@@ -615,11 +628,11 @@
615 "defaultMessage": "!!!Add New Service...", 628 "defaultMessage": "!!!Add New Service...",
616 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
617 "start": { 630 "start": {
618 "line": 202, 631 "line": 210,
619 "column": 17 632 "column": 17
620 }, 633 },
621 "end": { 634 "end": {
622 "line": 205, 635 "line": 213,
623 "column": 3 636 "column": 3
624 } 637 }
625 }, 638 },
@@ -628,11 +641,11 @@
628 "defaultMessage": "!!!Add New Workspace...", 641 "defaultMessage": "!!!Add New Workspace...",
629 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
630 "start": { 643 "start": {
631 "line": 206, 644 "line": 214,
632 "column": 19 645 "column": 19
633 }, 646 },
634 "end": { 647 "end": {
635 "line": 209, 648 "line": 217,
636 "column": 3 649 "column": 3
637 } 650 }
638 }, 651 },
@@ -641,11 +654,11 @@
641 "defaultMessage": "!!!Open workspace drawer", 654 "defaultMessage": "!!!Open workspace drawer",
642 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
643 "start": { 656 "start": {
644 "line": 210, 657 "line": 218,
645 "column": 23 658 "column": 23
646 }, 659 },
647 "end": { 660 "end": {
648 "line": 213, 661 "line": 221,
649 "column": 3 662 "column": 3
650 } 663 }
651 }, 664 },
@@ -654,11 +667,11 @@
654 "defaultMessage": "!!!Close workspace drawer", 667 "defaultMessage": "!!!Close workspace drawer",
655 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
656 "start": { 669 "start": {
657 "line": 214, 670 "line": 222,
658 "column": 24 671 "column": 24
659 }, 672 },
660 "end": { 673 "end": {
661 "line": 217, 674 "line": 225,
662 "column": 3 675 "column": 3
663 } 676 }
664 }, 677 },
@@ -667,11 +680,11 @@
667 "defaultMessage": "!!!Activate next service...", 680 "defaultMessage": "!!!Activate next service...",
668 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
669 "start": { 682 "start": {
670 "line": 218, 683 "line": 226,
671 "column": 23 684 "column": 23
672 }, 685 },
673 "end": { 686 "end": {
674 "line": 221, 687 "line": 229,
675 "column": 3 688 "column": 3
676 } 689 }
677 }, 690 },
@@ -680,11 +693,11 @@
680 "defaultMessage": "!!!Activate previous service...", 693 "defaultMessage": "!!!Activate previous service...",
681 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
682 "start": { 695 "start": {
683 "line": 222, 696 "line": 230,
684 "column": 27 697 "column": 27
685 }, 698 },
686 "end": { 699 "end": {
687 "line": 225, 700 "line": 233,
688 "column": 3 701 "column": 3
689 } 702 }
690 }, 703 },
@@ -693,11 +706,11 @@
693 "defaultMessage": "!!!Disable notifications & audio", 706 "defaultMessage": "!!!Disable notifications & audio",
694 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
695 "start": { 708 "start": {
696 "line": 226, 709 "line": 234,
697 "column": 11 710 "column": 11
698 }, 711 },
699 "end": { 712 "end": {
700 "line": 229, 713 "line": 237,
701 "column": 3 714 "column": 3
702 } 715 }
703 }, 716 },
@@ -706,11 +719,11 @@
706 "defaultMessage": "!!!Enable notifications & audio", 719 "defaultMessage": "!!!Enable notifications & audio",
707 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
708 "start": { 721 "start": {
709 "line": 230, 722 "line": 238,
710 "column": 13 723 "column": 13
711 }, 724 },
712 "end": { 725 "end": {
713 "line": 233, 726 "line": 241,
714 "column": 3 727 "column": 3
715 } 728 }
716 }, 729 },
@@ -719,11 +732,11 @@
719 "defaultMessage": "!!!Workspaces", 732 "defaultMessage": "!!!Workspaces",
720 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
721 "start": { 734 "start": {
722 "line": 234, 735 "line": 242,
723 "column": 14 736 "column": 14
724 }, 737 },
725 "end": { 738 "end": {
726 "line": 237, 739 "line": 245,
727 "column": 3 740 "column": 3
728 } 741 }
729 }, 742 },
@@ -732,11 +745,50 @@
732 "defaultMessage": "!!!Default", 745 "defaultMessage": "!!!Default",
733 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
734 "start": { 747 "start": {
735 "line": 238, 748 "line": 246,
736 "column": 20 749 "column": 20
737 }, 750 },
738 "end": { 751 "end": {
739 "line": 241, 752 "line": 249,
753 "column": 3
754 }
755 },
756 {
757 "id": "menu.todos",
758 "defaultMessage": "!!!Todos",
759 "file": "src/lib/Menu.js",
760 "start": {
761 "line": 250,
762 "column": 9
763 },
764 "end": {
765 "line": 253,
766 "column": 3
767 }
768 },
769 {
770 "id": "menu.Todoss.openTodosDrawer",
771 "defaultMessage": "!!!Open Todos drawer",
772 "file": "src/lib/Menu.js",
773 "start": {
774 "line": 254,
775 "column": 19
776 },
777 "end": {
778 "line": 257,
779 "column": 3
780 }
781 },
782 {
783 "id": "menu.Todoss.closeTodosDrawer",
784 "defaultMessage": "!!!Close Todos drawer",
785 "file": "src/lib/Menu.js",
786 "start": {
787 "line": 258,
788 "column": 20
789 },
790 "end": {
791 "line": 261,
740 "column": 3 792 "column": 3
741 } 793 }
742 } 794 }
diff --git a/src/index.html b/src/index.html
index f29aa2686..198c1ab7b 100644
--- a/src/index.html
+++ b/src/index.html
@@ -35,11 +35,16 @@
35 const originalReloadBehaviour = window._onLiveReloadFileChanged; 35 const originalReloadBehaviour = window._onLiveReloadFileChanged;
36 36
37 window._onLiveReloadFileChanged = (file) => { 37 window._onLiveReloadFileChanged = (file) => {
38 if (!file.path.includes('/build/webview/') && !file.path.includes('/build/index.js') && !file.path.includes('/build/electron/')) { 38 const isTodoPreloadPath = file.path.includes('/build/features/todos/preload.js');
39 if (!file.path.includes('/build/webview/') && !file.path.includes('/build/index.js') && !file.path.includes('/build/electron/') && !isTodoPreloadPath) {
39 originalReloadBehaviour(file); 40 originalReloadBehaviour(file);
40 } else { 41 } else {
41 if (file.path.includes('/build/webview/')) { 42 if (isTodoPreloadPath) {
42 debug('Livereload: Reloading all webvies'); 43 debug('Livereload: Reloading all webviews');
44 const webview = document.querySelector('webview[partition="persist:todos"]');
45 if (webview) webview.reload();
46 } else if (file.path.includes('/build/webview/')) {
47 debug('Livereload: Reloading all webviews');
43 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload()); 48 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload());
44 } else { 49 } else {
45 debug('Livereload: skip reload as only main process files have changed'); 50 debug('Livereload: skip reload as only main process files have changed');
diff --git a/src/index.js b/src/index.js
index 92740aaa2..839f607f6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -105,35 +105,6 @@ if (!gotTheLock) {
105 } 105 }
106 }); 106 });
107} 107}
108// const isSecondInstance = app.makeSingleInstance((argv) => {
109// if (mainWindow) {
110// if (mainWindow.isMinimized()) mainWindow.restore();
111// mainWindow.focus();
112
113// if (process.platform === 'win32') {
114// // Keep only command line / deep linked arguments
115// const url = argv.slice(1);
116
117// if (url) {
118// handleDeepLink(mainWindow, url.toString());
119// }
120// }
121// }
122
123// if (argv.includes('--reset-window')) {
124// // Needs to be delayed to not interfere with mainWindow.restore();
125// setTimeout(() => {
126// debug('Resetting windows via Task');
127// mainWindow.setPosition(DEFAULT_WINDOW_OPTIONS.x + 100, DEFAULT_WINDOW_OPTIONS.y + 100);
128// mainWindow.setSize(DEFAULT_WINDOW_OPTIONS.width, DEFAULT_WINDOW_OPTIONS.height);
129// }, 1);
130// }
131// });
132
133// if (isSecondInstance) {
134// console.log('An instance of Ferdi is already running. Exiting...');
135// app.exit();
136// }
137 108
138// Fix Unity indicator issue 109// Fix Unity indicator issue
139// https://github.com/electron/electron/issues/9046 110// https://github.com/electron/electron/issues/9046
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 7937aede9..13b31bcad 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -7,6 +7,9 @@ import { workspaceStore } from '../features/workspaces/index';
7import { workspaceActions } from '../features/workspaces/actions'; 7import { workspaceActions } from '../features/workspaces/actions';
8import { announcementActions } from '../features/announcements/actions'; 8import { announcementActions } from '../features/announcements/actions';
9import { announcementsStore } from '../features/announcements'; 9import { announcementsStore } from '../features/announcements';
10import TodoStore from '../features/todos/store';
11import { GA_CATEGORY_TODOS, todosStore } from '../features/todos';
12import { todoActions } from '../features/todos/actions';
10 13
11const { app, Menu, dialog } = remote; 14const { app, Menu, dialog } = remote;
12 15
@@ -95,6 +98,10 @@ const menuItems = defineMessages({
95 id: 'menu.view.toggleDevTools', 98 id: 'menu.view.toggleDevTools',
96 defaultMessage: '!!!Toggle Developer Tools', 99 defaultMessage: '!!!Toggle Developer Tools',
97 }, 100 },
101 toggleTodosDevTools: {
102 id: 'menu.view.toggleTodosDevTools',
103 defaultMessage: '!!!Toggle Todos Developer Tools',
104 },
98 toggleServiceDevTools: { 105 toggleServiceDevTools: {
99 id: 'menu.view.toggleServiceDevTools', 106 id: 'menu.view.toggleServiceDevTools',
100 defaultMessage: '!!!Toggle Service Developer Tools', 107 defaultMessage: '!!!Toggle Service Developer Tools',
@@ -239,6 +246,18 @@ const menuItems = defineMessages({
239 id: 'menu.workspaces.defaultWorkspace', 246 id: 'menu.workspaces.defaultWorkspace',
240 defaultMessage: '!!!Default', 247 defaultMessage: '!!!Default',
241 }, 248 },
249 todos: {
250 id: 'menu.todos',
251 defaultMessage: '!!!Todos',
252 },
253 openTodosDrawer: {
254 id: 'menu.Todoss.openTodosDrawer',
255 defaultMessage: '!!!Open Todos drawer',
256 },
257 closeTodosDrawer: {
258 id: 'menu.Todoss.closeTodosDrawer',
259 defaultMessage: '!!!Close Todos drawer',
260 },
242}); 261});
243 262
244function getActiveWebview() { 263function getActiveWebview() {
@@ -347,6 +366,11 @@ const _templateFactory = intl => [
347 visible: workspaceStore.isFeatureEnabled, 366 visible: workspaceStore.isFeatureEnabled,
348 }, 367 },
349 { 368 {
369 label: intl.formatMessage(menuItems.todos),
370 submenu: [],
371 visible: todosStore.isFeatureEnabled,
372 },
373 {
350 label: intl.formatMessage(menuItems.window), 374 label: intl.formatMessage(menuItems.window),
351 role: 'window', 375 role: 'window',
352 submenu: [ 376 submenu: [
@@ -619,6 +643,17 @@ export default class FranzMenu {
619 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0, 643 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0,
620 }); 644 });
621 645
646 if (this.stores.features.features.isTodosEnabled) {
647 tpl[1].submenu.push({
648 label: intl.formatMessage(menuItems.toggleTodosDevTools),
649 accelerator: `${cmdKey}+Shift+Alt+O`,
650 click: () => {
651 const webview = document.querySelector('webview[partition="persist:todos"]');
652 if (webview) webview.openDevTools();
653 },
654 });
655 }
656
622 tpl[1].submenu.unshift({ 657 tpl[1].submenu.unshift({
623 label: intl.formatMessage(menuItems.reloadService), 658 label: intl.formatMessage(menuItems.reloadService),
624 id: 'reloadService', // TODO: needed? 659 id: 'reloadService', // TODO: needed?
@@ -771,6 +806,10 @@ export default class FranzMenu {
771 tpl[4].submenu = this.workspacesMenu(); 806 tpl[4].submenu = this.workspacesMenu();
772 } 807 }
773 808
809 if (todosStore.isFeatureEnabled) {
810 tpl[5].submenu = this.todosMenu();
811 }
812
774 tpl[tpl.length - 1].submenu.push({ 813 tpl[tpl.length - 1].submenu.push({
775 type: 'separator', 814 type: 'separator',
776 }, this.debugMenu()); 815 }, this.debugMenu());
@@ -882,6 +921,31 @@ export default class FranzMenu {
882 return menu; 921 return menu;
883 } 922 }
884 923
924 todosMenu() {
925 const { isTodosPanelVisible } = TodoStore;
926 const { intl } = window.franz;
927 const menu = [];
928
929 // Open todos drawer:
930 const drawerLabel = (
931 isTodosPanelVisible ? menuItems.closeTodosDrawer : menuItems.openTodosDrawer
932 );
933 menu.push({
934 label: intl.formatMessage(drawerLabel),
935 accelerator: `${cmdKey}+T`,
936 click: () => {
937 todoActions.toggleTodosPanel();
938 gaEvent(GA_CATEGORY_TODOS, 'toggleDrawer', 'menu');
939 },
940 enabled: this.stores.user.isLoggedIn,
941 }, {
942 type: 'separator',
943 });
944
945 return menu;
946 }
947
948
885 debugMenu() { 949 debugMenu() {
886 const { intl } = window.ferdi; 950 const { intl } = window.ferdi;
887 951
diff --git a/src/models/Service.js b/src/models/Service.js
index bcf24b7d6..2303512af 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -4,6 +4,11 @@ import normalizeUrl from 'normalize-url';
4 4
5const debug = require('debug')('Franz:Service'); 5const debug = require('debug')('Franz:Service');
6 6
7export const RESTRICTION_TYPES = {
8 SERVICE_LIMIT: 0,
9 CUSTOM_URL: 1,
10};
11
7export default class Service { 12export default class Service {
8 id = ''; 13 id = '';
9 14
@@ -59,6 +64,12 @@ export default class Service {
59 64
60 @observable errorMessage = ''; 65 @observable errorMessage = '';
61 66
67 @observable isUsingCustomUrl = false;
68
69 @observable isServiceAccessRestricted = false;
70
71 @observable restrictionType = null;
72
62 constructor(data, recipe) { 73 constructor(data, recipe) {
63 if (!data) { 74 if (!data) {
64 console.error('Service config not valid'); 75 console.error('Service config not valid');
@@ -111,6 +122,10 @@ export default class Service {
111 this.unreadDirectMessageCount = 0; 122 this.unreadDirectMessageCount = 0;
112 this.unreadIndirectMessageCount = 0; 123 this.unreadIndirectMessageCount = 0;
113 } 124 }
125
126 if (this.recipe.hasCustomUrl && this.customUrl) {
127 this.isUsingCustomUrl = true;
128 }
114 }); 129 });
115 } 130 }
116 131
diff --git a/src/models/User.js b/src/models/User.js
index d12aef278..5a614efbe 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -20,6 +20,10 @@ export default class User {
20 20
21 @observable isSubscriptionOwner = false; 21 @observable isSubscriptionOwner = false;
22 22
23 @observable hasSubscription = true;
24
25 @observable hadSubscription = false;
26
23 @observable isPremium = true; 27 @observable isPremium = true;
24 28
25 @observable beta = false; 29 @observable beta = false;
@@ -32,6 +36,9 @@ export default class User {
32 36
33 @observable locale = false; 37 @observable locale = false;
34 38
39 @observable team = {};
40
41
35 constructor(data) { 42 constructor(data) {
36 if (!data.id) { 43 if (!data.id) {
37 throw Error('User requires Id'); 44 throw Error('User requires Id');
@@ -47,8 +54,13 @@ export default class User {
47 this.beta = data.beta || this.beta; 54 this.beta = data.beta || this.beta;
48 this.donor = data.donor || this.donor; 55 this.donor = data.donor || this.donor;
49 this.isDonor = data.isDonor || this.isDonor; 56 this.isDonor = data.isDonor || this.isDonor;
50 this.isSubscriptionOwner = data.isSubscriptionOwner || this.isSubscriptionOwner;
51 this.isMiner = data.isMiner || this.isMiner; 57 this.isMiner = data.isMiner || this.isMiner;
52 this.locale = data.locale || this.locale; 58 this.locale = data.locale || this.locale;
59
60 this.isSubscriptionOwner = data.isSubscriptionOwner || this.isSubscriptionOwner;
61 this.hasSubscription = data.hasSubscription || this.hasSubscription;
62 this.hadSubscription = data.hadSubscription || this.hadSubscription;
63
64 this.team = data.team || this.team;
53 } 65 }
54} 66}
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 2bfcdf640..61b63d52e 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -95,6 +95,7 @@ export default class AppStore extends Store {
95 this._offlineCheck.bind(this), 95 this._offlineCheck.bind(this),
96 this._setLocale.bind(this), 96 this._setLocale.bind(this),
97 this._muteAppHandler.bind(this), 97 this._muteAppHandler.bind(this),
98 this._handleFullScreen.bind(this),
98 ]); 99 ]);
99 } 100 }
100 101
@@ -347,6 +348,8 @@ export default class AppStore extends Store {
347 this.locale = this._getDefaultLocale(); 348 this.locale = this._getDefaultLocale();
348 } 349 }
349 350
351 moment.locale(this.locale);
352
350 debug(`Set locale to "${this.locale}"`); 353 debug(`Set locale to "${this.locale}"`);
351 } 354 }
352 355
@@ -367,6 +370,16 @@ export default class AppStore extends Store {
367 } 370 }
368 } 371 }
369 372
373 _handleFullScreen() {
374 const body = document.querySelector('body');
375
376 if (this.isFullScreen) {
377 body.classList.add('isFullScreen');
378 } else {
379 body.classList.remove('isFullScreen');
380 }
381 }
382
370 // Helpers 383 // Helpers
371 _appStartsCounter() { 384 _appStartsCounter() {
372 this.actions.settings.update({ 385 this.actions.settings.update({
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index e7832088b..cf28b6bec 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -16,6 +16,9 @@ import workspaces from '../features/workspaces';
16import shareFranz from '../features/shareFranz'; 16import shareFranz from '../features/shareFranz';
17import announcements from '../features/announcements'; 17import announcements from '../features/announcements';
18import settingsWS from '../features/settingsWS'; 18import settingsWS from '../features/settingsWS';
19import serviceLimit from '../features/serviceLimit';
20import communityRecipes from '../features/communityRecipes';
21import todos from '../features/todos';
19 22
20import { DEFAULT_FEATURES_CONFIG } from '../config'; 23import { DEFAULT_FEATURES_CONFIG } from '../config';
21 24
@@ -75,5 +78,8 @@ export default class FeaturesStore extends Store {
75 shareFranz(this.stores, this.actions); 78 shareFranz(this.stores, this.actions);
76 announcements(this.stores, this.actions); 79 announcements(this.stores, this.actions);
77 settingsWS(this.stores, this.actions); 80 settingsWS(this.stores, this.actions);
81 serviceLimit(this.stores, this.actions);
82 communityRecipes(this.stores, this.actions);
83 todos(this.stores, this.actions);
78 } 84 }
79} 85}
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 6c6b7589f..876851a66 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -12,6 +12,8 @@ import Request from './lib/Request';
12import CachedRequest from './lib/CachedRequest'; 12import CachedRequest from './lib/CachedRequest';
13import { matchRoute } from '../helpers/routing-helpers'; 13import { matchRoute } from '../helpers/routing-helpers';
14import { workspaceStore } from '../features/workspaces'; 14import { workspaceStore } from '../features/workspaces';
15import { serviceLimitStore } from '../features/serviceLimit';
16import { RESTRICTION_TYPES } from '../models/Service';
15 17
16const debug = require('debug')('Franz:ServiceStore'); 18const debug = require('debug')('Franz:ServiceStore');
17 19
@@ -74,6 +76,7 @@ export default class ServicesStore extends Store {
74 this._saveActiveService.bind(this), 76 this._saveActiveService.bind(this),
75 this._logoutReaction.bind(this), 77 this._logoutReaction.bind(this),
76 this._handleMuteSettings.bind(this), 78 this._handleMuteSettings.bind(this),
79 this._restrictServiceAccess.bind(this),
77 ]); 80 ]);
78 81
79 // Just bind this 82 // Just bind this
@@ -97,7 +100,10 @@ export default class ServicesStore extends Store {
97 if (this.stores.user.isLoggedIn) { 100 if (this.stores.user.isLoggedIn) {
98 const services = this.allServicesRequest.execute().result; 101 const services = this.allServicesRequest.execute().result;
99 if (services) { 102 if (services) {
100 return observable(services.slice().slice().sort((a, b) => a.order - b.order)); 103 return observable(services.slice().slice().sort((a, b) => a.order - b.order).map((s, index) => {
104 s.index = index;
105 return s;
106 }));
101 } 107 }
102 } 108 }
103 return []; 109 return [];
@@ -152,6 +158,8 @@ export default class ServicesStore extends Store {
152 158
153 // Actions 159 // Actions
154 @action async _createService({ recipeId, serviceData, redirect = true }) { 160 @action async _createService({ recipeId, serviceData, redirect = true }) {
161 if (serviceLimitStore.userHasReachedServiceLimit) return;
162
155 const data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData); 163 const data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData);
156 164
157 const response = await this.createServiceRequest.execute(recipeId, data)._promise; 165 const response = await this.createServiceRequest.execute(recipeId, data)._promise;
@@ -430,6 +438,9 @@ export default class ServicesStore extends Store {
430 redirect: false, 438 redirect: false,
431 }); 439 });
432 } 440 }
441 } else if (channel === 'feature:todos') {
442 Object.assign(args[0].data, { serviceId });
443 this.actions.todos.handleHostMessage(args[0]);
433 } 444 }
434 } 445 }
435 446
@@ -666,6 +677,35 @@ export default class ServicesStore extends Store {
666 return serviceData; 677 return serviceData;
667 } 678 }
668 679
680 _restrictServiceAccess() {
681 const { features } = this.stores.features;
682 const { userHasReachedServiceLimit, serviceLimit } = this.stores.serviceLimit;
683
684 this.all.map((service, index) => {
685 if (userHasReachedServiceLimit) {
686 service.isServiceAccessRestricted = index >= serviceLimit;
687
688 if (service.isServiceAccessRestricted) {
689 service.restrictionType = RESTRICTION_TYPES.SERVICE_LIMIT;
690
691 debug('Restricting access to server due to service limit');
692 }
693 }
694
695 if (service.isUsingCustomUrl) {
696 service.isServiceAccessRestricted = !features.isCustomUrlIncludedInCurrentPlan;
697
698 if (service.isServiceAccessRestricted) {
699 service.restrictionType = RESTRICTION_TYPES.CUSTOM_URL;
700
701 debug('Restricting access to server due to custom url');
702 }
703 }
704
705 return service;
706 });
707 }
708
669 // Helper 709 // Helper
670 _initializeServiceRecipeInWebview(serviceId) { 710 _initializeServiceRecipeInWebview(serviceId) {
671 const service = this.one(serviceId); 711 const service = this.one(serviceId);
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index d813e97b1..e1d9672b6 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -2,11 +2,15 @@ import { observable, computed, action } from 'mobx';
2import moment from 'moment'; 2import moment from 'moment';
3import jwt from 'jsonwebtoken'; 3import jwt from 'jsonwebtoken';
4import localStorage from 'mobx-localstorage'; 4import localStorage from 'mobx-localstorage';
5import ms from 'ms';
5 6
6import { isDevMode } from '../environment'; 7import { isDevMode } from '../environment';
7import Store from './lib/Store'; 8import Store from './lib/Store';
8import Request from './lib/Request'; 9import Request from './lib/Request';
9import CachedRequest from './lib/CachedRequest'; 10import CachedRequest from './lib/CachedRequest';
11import { sleep } from '../helpers/async-helpers';
12import { getPlan } from '../helpers/plan-helpers';
13import { PLANS } from '../config';
10 14
11const debug = require('debug')('Franz:UserStore'); 15const debug = require('debug')('Franz:UserStore');
12 16
@@ -36,6 +40,8 @@ export default class UserStore extends Store {
36 40
37 @observable passwordRequest = new Request(this.api.user, 'password'); 41 @observable passwordRequest = new Request(this.api.user, 'password');
38 42
43 @observable activateTrialRequest = new Request(this.api.user, 'activateTrial');
44
39 @observable inviteRequest = new Request(this.api.user, 'invite'); 45 @observable inviteRequest = new Request(this.api.user, 'invite');
40 46
41 @observable getUserInfoRequest = new CachedRequest(this.api.user, 'getInfo'); 47 @observable getUserInfoRequest = new CachedRequest(this.api.user, 'getInfo');
@@ -56,7 +62,9 @@ export default class UserStore extends Store {
56 62
57 @observable accountType; 63 @observable accountType;
58 64
59 @observable hasCompletedSignup = null; 65 @observable hasCompletedSignup = false;
66
67 @observable hasActivatedTrial = false;
60 68
61 @observable userData = {}; 69 @observable userData = {};
62 70
@@ -76,6 +84,7 @@ export default class UserStore extends Store {
76 this.actions.user.retrievePassword.listen(this._retrievePassword.bind(this)); 84 this.actions.user.retrievePassword.listen(this._retrievePassword.bind(this));
77 this.actions.user.logout.listen(this._logout.bind(this)); 85 this.actions.user.logout.listen(this._logout.bind(this));
78 this.actions.user.signup.listen(this._signup.bind(this)); 86 this.actions.user.signup.listen(this._signup.bind(this));
87 this.actions.user.activateTrial.listen(this._activateTrial.bind(this));
79 this.actions.user.invite.listen(this._invite.bind(this)); 88 this.actions.user.invite.listen(this._invite.bind(this));
80 this.actions.user.update.listen(this._update.bind(this)); 89 this.actions.user.update.listen(this._update.bind(this));
81 this.actions.user.resetStatus.listen(this._resetStatus.bind(this)); 90 this.actions.user.resetStatus.listen(this._resetStatus.bind(this));
@@ -86,6 +95,7 @@ export default class UserStore extends Store {
86 this.registerReactions([ 95 this.registerReactions([
87 // this._requireAuthenticatedUser, 96 // this._requireAuthenticatedUser,
88 this._getUserData.bind(this), 97 this._getUserData.bind(this),
98 this._resetTrialActivationState.bind(this),
89 ]); 99 ]);
90 } 100 }
91 101
@@ -141,10 +151,34 @@ export default class UserStore extends Store {
141 return this.getUserInfoRequest.execute().result || {}; 151 return this.getUserInfoRequest.execute().result || {};
142 } 152 }
143 153
154 @computed get team() {
155 return this.data.team || null;
156 }
157
144 @computed get isPremium() { 158 @computed get isPremium() {
145 return !!this.data.isPremium; 159 return !!this.data.isPremium;
146 } 160 }
147 161
162 @computed get isPremiumOverride() {
163 return ((!this.team || !this.team.plan) && this.isPremium) || (this.team.state === 'expired' && this.isPremium);
164 }
165
166 @computed get isPersonal() {
167 if (!this.team || !this.team.plan) return false;
168 const plan = getPlan(this.team.plan);
169
170 return plan === PLANS.PERSONAL;
171 }
172
173 @computed get isPro() {
174 if (this.isPremiumOverride) return true;
175
176 if (!this.team || (!this.team.plan || this.team.state === 'expired')) return false;
177 const plan = getPlan(this.team.plan);
178
179 return plan === PLANS.PRO || plan === PLANS.LEGACY;
180 }
181
148 @computed get legacyServices() { 182 @computed get legacyServices() {
149 return this.getLegacyServicesRequest.execute() || {}; 183 return this.getLegacyServicesRequest.execute() || {};
150 } 184 }
@@ -190,6 +224,21 @@ export default class UserStore extends Store {
190 this.actionStatus = request.result.status || []; 224 this.actionStatus = request.result.status || [];
191 } 225 }
192 226
227 @action async _activateTrial({ planId }) {
228 debug('activate trial', planId);
229
230 this.activateTrialRequest.execute({
231 plan: planId,
232 });
233
234 await this.activateTrialRequest._promise;
235
236 this.hasActivatedTrial = true;
237
238 this.stores.features.featuresRequest.invalidate({ immediately: true });
239 this.stores.user.getUserInfoRequest.invalidate({ immediately: true });
240 }
241
193 @action async _invite({ invites }) { 242 @action async _invite({ invites }) {
194 const data = invites.filter(invite => invite.email !== ''); 243 const data = invites.filter(invite => invite.email !== '');
195 244
@@ -305,6 +354,14 @@ export default class UserStore extends Store {
305 } 354 }
306 } 355 }
307 356
357 async _resetTrialActivationState() {
358 if (this.hasActivatedTrial) {
359 await sleep(ms('12s'));
360
361 this.hasActivatedTrial = false;
362 }
363 }
364
308 // Helpers 365 // Helpers
309 _parseToken(authToken) { 366 _parseToken(authToken) {
310 try { 367 try {
@@ -334,6 +391,15 @@ export default class UserStore extends Store {
334 } 391 }
335 } 392 }
336 393
394 getAuthURL(url) {
395 const parsedUrl = new URL(url);
396 const params = new URLSearchParams(parsedUrl.search.slice(1));
397
398 params.append('authToken', this.authToken);
399
400 return `${parsedUrl.origin}${parsedUrl.pathname}?${params.toString()}`;
401 }
402
337 async _migrateUserLocale() { 403 async _migrateUserLocale() {
338 await this.getUserInfoRequest._promise; 404 await this.getUserInfoRequest._promise;
339 405
diff --git a/src/stores/index.js b/src/stores/index.js
index 1912418a2..10dd56665 100644
--- a/src/stores/index.js
+++ b/src/stores/index.js
@@ -12,6 +12,9 @@ import RequestStore from './RequestStore';
12import GlobalErrorStore from './GlobalErrorStore'; 12import GlobalErrorStore from './GlobalErrorStore';
13import { workspaceStore } from '../features/workspaces'; 13import { workspaceStore } from '../features/workspaces';
14import { announcementsStore } from '../features/announcements'; 14import { announcementsStore } from '../features/announcements';
15import { serviceLimitStore } from '../features/serviceLimit';
16import { communityRecipesStore } from '../features/communityRecipes';
17import { todosStore } from '../features/todos';
15 18
16export default (api, actions, router) => { 19export default (api, actions, router) => {
17 const stores = {}; 20 const stores = {};
@@ -31,6 +34,9 @@ export default (api, actions, router) => {
31 globalError: new GlobalErrorStore(stores, api, actions), 34 globalError: new GlobalErrorStore(stores, api, actions),
32 workspaces: workspaceStore, 35 workspaces: workspaceStore,
33 announcements: announcementsStore, 36 announcements: announcementsStore,
37 serviceLimit: serviceLimitStore,
38 communityRecipes: communityRecipesStore,
39 todos: todosStore,
34 }); 40 });
35 // Initialize all stores 41 // Initialize all stores
36 Object.keys(stores).forEach((name) => { 42 Object.keys(stores).forEach((name) => {
diff --git a/src/styles/auth.scss b/src/styles/auth.scss
index cbc720559..44c752677 100644
--- a/src/styles/auth.scss
+++ b/src/styles/auth.scss
@@ -9,7 +9,7 @@
9 } 9 }
10 10
11 .auth__logo.auth__logo--sm { 11 .auth__logo.auth__logo--sm {
12 border: 4px solid $dark-theme-black; 12 border: none;
13 box-shadow: 0 0 6px rgba($dark-theme-black, .5); 13 box-shadow: 0 0 6px rgba($dark-theme-black, .5);
14 } 14 }
15 15
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index 9f226b61c..b18bd6dcf 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -32,14 +32,22 @@ html { overflow: hidden; }
32 .app-loader .app-loader__title { color: $dark-theme-gray-lightest; } 32 .app-loader .app-loader__title { color: $dark-theme-gray-lightest; }
33} 33}
34 34
35body.win32:not(.isFullScreen) .app .app__content {
36 height: calc(100% - 28px);
37}
38
35.app { 39.app {
36 display: flex; 40 .app__content {
37 flex-direction: column; 41 display: flex;
42 width: calc(100% + 300px);
43 }
38 44
39 .app__content { display: flex; } 45 .app__main-content {
46 display: flex;
47 width: 100%;
48 }
40 49
41 .app__service { 50 .app__service {
42 // position: relative;
43 display: flex; 51 display: flex;
44 flex: 1; 52 flex: 1;
45 flex-direction: column; 53 flex-direction: column;
diff --git a/src/styles/recipes.scss b/src/styles/recipes.scss
index 84222e1fe..5bdc60a57 100644
--- a/src/styles/recipes.scss
+++ b/src/styles/recipes.scss
@@ -2,6 +2,7 @@
2 2
3.theme__dark .recipe-teaser { 3.theme__dark .recipe-teaser {
4 background-color: $dark-theme-gray-dark; 4 background-color: $dark-theme-gray-dark;
5 color: $dark-theme-text-color;
5 6
6 &:hover { background-color: $dark-theme-gray; } 7 &:hover { background-color: $dark-theme-gray; }
7} 8}
@@ -12,7 +13,7 @@
12 display: flex; 13 display: flex;
13 flex-flow: row wrap; 14 flex-flow: row wrap;
14 height: auto; 15 height: auto;
15 min-height: 70%; 16 // min-height: 70%;
16 17
17 &.recipes__list--disabled { 18 &.recipes__list--disabled {
18 filter: grayscale(100%); 19 filter: grayscale(100%);
diff --git a/src/styles/reset.scss b/src/styles/reset.scss
index f46ede4a2..d87ce652a 100644
--- a/src/styles/reset.scss
+++ b/src/styles/reset.scss
@@ -51,7 +51,6 @@ button {
51 padding: 0; 51 padding: 0;
52 52
53 &:focus { outline: 0; } 53 &:focus { outline: 0; }
54 .theme__dark & { color: $dark-theme-gray-smoke; }
55} 54}
56 55
57html { 56html {
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index 1baff8b54..bb95ab5d2 100644
--- a/src/styles/settings.scss
+++ b/src/styles/settings.scss
@@ -1,45 +1,39 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3%headline { 3%headline {
4 color: $theme-gray-light; 4 color: #FFF;
5 font-size: 20px; 5 font-size: 20px;
6 font-weight: 400; 6 font-weight: 400;
7 letter-spacing: -1px; 7 letter-spacing: -1px;
8 8
9 a { color: $theme-gray-light; } 9 a { color: #FFF }
10} 10}
11 11
12%headline__dark { 12%headline__dark {
13 color: $dark-theme-gray-lightest; 13 color: #FFF;
14 font-size: 20px;
15 font-weight: 400;
16 letter-spacing: -1px;
14 17
15 a { color: $dark-theme-gray-lightest; } 18 a { color: #FFF }
16} 19}
17 20
18.theme__dark { 21.theme__dark {
19 .settings-wrapper { background: rgba($dark-theme-black, .8); } 22 .settings-wrapper { background: rgba($dark-theme-black, .8); }
20 23
21 .settings { 24 .settings {
22 background: $dark-theme-gray-darkest;
23 box-shadow: 0 20px 50px rgba($dark-theme-black, .5);
24
25 .settings__header { 25 .settings__header {
26 background: $dark-theme-gray-darker; 26 .mdi { color: #FFF }
27 27 }
28 h1,
29 .settings__header-item { @extend %headline__dark; }
30 28
31 .separator { border-right: 1px solid $dark-theme-gray-dark; } 29 .settings__main {
32 .mdi { color: $dark-theme-gray-lightest; } 30 background: $dark-theme-gray-darkest;
33 } 31 }
34 32
35 .settings__body::-webkit-scrollbar-thumb { background: $dark-theme-gray; } 33 .settings__body::-webkit-scrollbar-thumb { background: $dark-theme-gray; }
36 34
37 .settings__close { 35 .settings__close {
38 background: $dark-theme-gray-darker; 36 color: #FFF;
39 border-left: none;
40 color: $dark-theme-gray-lightest;
41
42 &:hover { background: darken($dark-theme-gray-darker, 5%); }
43 } 37 }
44 38
45 &__settings-group h3 { color: $dark-theme-gray-lightest; } 39 &__settings-group h3 { color: $dark-theme-gray-lightest; }
@@ -76,6 +70,11 @@
76 70
77 .settings-navigation__link { 71 .settings-navigation__link {
78 color: $dark-theme-gray-lightest; 72 color: $dark-theme-gray-lightest;
73 border-bottom: 1px solid darken($dark-theme-gray-darker, 3%);
74
75 &:last-child {
76 border: 0,
77 }
79 78
80 .badge { 79 .badge {
81 background: $dark-theme-gray-lighter; 80 background: $dark-theme-gray-lighter;
@@ -129,15 +128,14 @@
129} 128}
130 129
131.settings { 130.settings {
132 background: #FFF;
133 border-radius: $theme-border-radius; 131 border-radius: $theme-border-radius;
134 box-shadow: 0 20px 50px rgba(black, .5); 132 // box-shadow: 0 20px 50px rgba(black, .5);
135 display: flex; 133 display: flex;
136 height: 100%; 134 height: 100%;
137 max-height: 720px; 135 max-height: 720px;
138 max-width: 900px; 136 max-width: 900px;
139 min-height: 400px; 137 min-height: 400px;
140 overflow: hidden; 138 // overflow: hidden;
141 position: relative; 139 position: relative;
142 width: 100%; 140 width: 100%;
143 z-index: 9999; 141 z-index: 9999;
@@ -147,25 +145,32 @@
147 flex: 1; 145 flex: 1;
148 flex-direction: column; 146 flex-direction: column;
149 height: auto; 147 height: auto;
148 border-radius: $theme-border-radius;
149 overflow: hidden;
150 box-shadow: 0 20px 50px rgba($dark-theme-black, .5);
151 background: #FFF;
150 } 152 }
151 153
152 .settings__header { 154 .settings__header {
153 align-items: center; 155 align-items: center;
154 background: $theme-gray-lighter; 156 background: $theme-brand-primary;
155 display: flex; 157 display: flex;
156 height: 50px; 158 height: 50px;
157 padding: 0 40px; 159 padding: 0 40px;
158 width: calc(100% - 60px); 160 width: calc(100% - 60px);
161 color: #FFF;
159 162
160 h1 { 163 h1 {
161 @extend %headline; 164 @extend %headline;
162 margin: 0; 165 margin: 0;
163 } 166 }
164 167
165 .settings__header-item { @extend %headline; } 168 .settings__header-item {
169 @extend %headline;
170 }
166 171
167 .separator { 172 .separator {
168 border-right: 1px solid darken($theme-gray-lighter, 10%); 173 border-right: 1px solid darken($theme-brand-primary, 8%);
169 height: 100%; 174 height: 100%;
170 margin: 0 15px; 175 margin: 0 15px;
171 transform: skew(15deg) rotate(2deg); 176 transform: skew(15deg) rotate(2deg);
@@ -218,17 +223,18 @@
218 } 223 }
219 224
220 .settings__close { 225 .settings__close {
221 background: $theme-gray-lighter; 226 background: $theme-brand-primary;
222 border-left: 1px solid darken($theme-gray-lighter, 5%); 227 border-left: 1px solid darken($theme-brand-primary, 8%);
223 color: $theme-gray-light; 228 color: #FFF;
224 font-size: 20px; 229 font-size: 20px;
225 height: 50px; 230 height: 50px;
226 padding: 0 20px; 231 padding: 0 20px;
227 position: absolute; 232 position: absolute;
228 right: 0; 233 right: 0;
229 transition: background $theme-transition-time; 234 transition: background $theme-transition-time;
235 border-top-right-radius: $theme-border-radius;
230 236
231 &:hover { background: darken($theme-gray-lighter, 5%); } 237 &:hover { background: darken($theme-brand-primary, 5%); }
232 } 238 }
233 239
234 .search-input { margin-bottom: 30px; } 240 .search-input { margin-bottom: 30px; }
@@ -360,6 +366,7 @@
360 .account__subscription-button { margin-left: auto; } 366 .account__subscription-button { margin-left: auto; }
361 .franz-form__button { white-space: nowrap; } 367 .franz-form__button { white-space: nowrap; }
362 div { height: auto; } 368 div { height: auto; }
369 [data-type="franz-button"] div { height: 100% }
363 370
364 .invoices { 371 .invoices {
365 width: 100%; 372 width: 100%;
@@ -413,7 +420,13 @@
413 background: $theme-gray-lightest; 420 background: $theme-gray-lightest;
414 flex-direction: column; 421 flex-direction: column;
415 height: auto; 422 height: auto;
416 width: 200px; 423 width: 240px;
424 height: calc(100% - 100px);
425 align-self: center;
426 border-top-left-radius: $theme-border-radius;;
427 border-bottom-left-radius: $theme-border-radius;;
428 overflow: hidden;
429 box-shadow: 0 20px 50px rgba($dark-theme-black, .5);
417 430
418 .settings-navigation__link { 431 .settings-navigation__link {
419 align-items: center; 432 align-items: center;
@@ -425,6 +438,7 @@
425 padding: 0 20px; 438 padding: 0 20px;
426 text-decoration: none; 439 text-decoration: none;
427 transition: background $theme-transition-time, color $theme-transition-time; 440 transition: background $theme-transition-time, color $theme-transition-time;
441 border-bottom: 1px solid darken($theme-gray-lightest, 3%);
428 442
429 &:hover { 443 &:hover {
430 background: darken($theme-gray-lightest, 5%); 444 background: darken($theme-gray-lightest, 5%);
diff --git a/src/webview/contextMenu.js b/src/webview/contextMenu.js
index a4a6ab899..83914f581 100644
--- a/src/webview/contextMenu.js
+++ b/src/webview/contextMenu.js
@@ -39,6 +39,23 @@ const buildMenuTpl = (props, suggestions, isSpellcheckEnabled, defaultSpellcheck
39 { 39 {
40 type: 'separator', 40 type: 'separator',
41 }, { 41 }, {
42 id: 'createTodo',
43 label: `Create todo: "${textSelection.length > 15 ? `${textSelection.slice(0, 15)}...` : textSelection}"`,
44 visible: hasText,
45 click() {
46 debug('Create todo from selected text', textSelection);
47 ipcRenderer.sendToHost('feature:todos', {
48 action: 'todos:create',
49 data: {
50 title: textSelection,
51 url: window.location.href,
52 },
53 });
54 },
55 },
56 {
57 type: 'separator',
58 }, {
42 id: 'lookup', 59 id: 'lookup',
43 label: `Look Up "${textSelection.length > 15 ? `${textSelection.slice(0, 15)}...` : textSelection}"`, 60 label: `Look Up "${textSelection.length > 15 ? `${textSelection.slice(0, 15)}...` : textSelection}"`,
44 visible: isMac && props.mediaType === 'none' && hasText, 61 visible: isMac && props.mediaType === 'none' && hasText,
diff --git a/uidev/src/stories/button.stories.tsx b/uidev/src/stories/button.stories.tsx
index f7537895c..5c1c9246d 100644
--- a/uidev/src/stories/button.stories.tsx
+++ b/uidev/src/stories/button.stories.tsx
@@ -1,10 +1,10 @@
1import { mdiInformation } from '@mdi/js';
1import { observable } from 'mobx'; 2import { observable } from 'mobx';
2import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
3import React from 'react'; 4import React from 'react';
4import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
5 6
6import { Button, Input } from '@meetfranz/forms'; 7import { Button, Input } from '@meetfranz/forms';
7import { classes } from 'istanbul-lib-coverage';
8import { Classes } from 'jss'; 8import { Classes } from 'jss';
9import { storiesOf } from '../stores/stories'; 9import { storiesOf } from '../stores/stories';
10 10
@@ -92,7 +92,7 @@ storiesOf('Button')
92 )) 92 ))
93 .add('With icon', () => ( 93 .add('With icon', () => (
94 <WithStoreButton store={createStore({ 94 <WithStoreButton store={createStore({
95 icon: 'mdiInformation', 95 icon: mdiInformation,
96 })} /> 96 })} />
97 )) 97 ))
98 .add('As link', () => ( 98 .add('As link', () => (
@@ -131,7 +131,7 @@ storiesOf('Button')
131 <div className={classes.combinedElements}> 131 <div className={classes.combinedElements}>
132 <Input showLabel={false} className={classes.input} noMargin /> 132 <Input showLabel={false} className={classes.input} noMargin />
133 <WithStoreButton store={createStore({ 133 <WithStoreButton store={createStore({
134 icon: 'mdiInformation', 134 icon: mdiInformation,
135 })} /> 135 })} />
136 </div> 136 </div>
137 )), 137 )),
diff --git a/uidev/src/stories/icon.stories.tsx b/uidev/src/stories/icon.stories.tsx
index c8e7f8ced..f9aa1635b 100644
--- a/uidev/src/stories/icon.stories.tsx
+++ b/uidev/src/stories/icon.stories.tsx
@@ -1,53 +1,14 @@
1import { observable } from 'mobx'; 1import { mdiAccountCircle } from '@mdi/js';
2import { observer } from 'mobx-react';
3import React from 'react'; 2import React from 'react';
4import uuid from 'uuid/v4';
5 3
6import { Icon } from '@meetfranz/ui'; 4import { Icon } from '@meetfranz/ui';
7import { storiesOf } from '../stores/stories'; 5import { storiesOf } from '../stores/stories';
8 6
9// interface IStoreArgs {
10// value?: boolean;
11// checked?: boolean;
12// label?: string;
13// id?: string;
14// name?: string;
15// disabled?: boolean;
16// error?: string;
17// }
18
19// const createStore = (args?: IStoreArgs) => {
20// return observable(Object.assign({
21// id: `element-${uuid()}`,
22// name: 'toggle',
23// label: 'Label',
24// value: true,
25// checked: false,
26// disabled: false,
27// error: '',
28// }, args));
29// };
30
31// const WithStoreToggle = observer(({ store }: { store: any }) => (
32// <>
33// <Toggle
34// value={store.value}
35// checked={store.checked}
36// label={store.label}
37// id={store.id}
38// name={store.name}
39// disabled={store.disabled}
40// error={store.error}
41// onChange={() => store.checked = !store.checked}
42// />
43// </>
44// ));
45
46storiesOf('Icon') 7storiesOf('Icon')
47 .add('Basic', () => ( 8 .add('Basic', () => (
48 <> 9 <>
49 <Icon icon="mdiAccountCircle" /> 10 <Icon icon={mdiAccountCircle} />
50 <Icon icon="mdiAccountCircle" size={2} /> 11 <Icon icon={mdiAccountCircle} size={2} />
51 <Icon icon="mdiAccountCircle" size={3} /> 12 <Icon icon={mdiAccountCircle} size={3} />
52 </> 13 </>
53 )); 14 ));
diff --git a/uidev/src/stories/infobox.stories.tsx b/uidev/src/stories/infobox.stories.tsx
index 967c610aa..b0416b844 100644
--- a/uidev/src/stories/infobox.stories.tsx
+++ b/uidev/src/stories/infobox.stories.tsx
@@ -1,3 +1,4 @@
1import { mdiEarth } from '@mdi/js';
1import { observable } from 'mobx'; 2import { observable } from 'mobx';
2import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
3import React from 'react'; 4import React from 'react';
@@ -44,7 +45,7 @@ storiesOf('Infobox')
44 .add('Icon + Dismissable', () => ( 45 .add('Icon + Dismissable', () => (
45 <WithStoreInfobox 46 <WithStoreInfobox
46 store={createStore({ 47 store={createStore({
47 icon: 'mdiEarth', 48 icon: mdiEarth,
48 dismissable: true, 49 dismissable: true,
49 })} 50 })}
50 > 51 >
@@ -54,7 +55,7 @@ storiesOf('Infobox')
54 .add('With CTA', () => ( 55 .add('With CTA', () => (
55 <WithStoreInfobox 56 <WithStoreInfobox
56 store={createStore({ 57 store={createStore({
57 icon: 'mdiEarth', 58 icon: mdiEarth,
58 ctaLabel: 'Ok, hi!', 59 ctaLabel: 'Ok, hi!',
59 })} 60 })}
60 > 61 >
@@ -64,7 +65,7 @@ storiesOf('Infobox')
64 .add('With long text', () => ( 65 .add('With long text', () => (
65 <WithStoreInfobox 66 <WithStoreInfobox
66 store={createStore({ 67 store={createStore({
67 icon: 'mdiEarth', 68 icon: mdiEarth,
68 ctaLabel: 'Ok, hi!', 69 ctaLabel: 'Ok, hi!',
69 })} 70 })}
70 > 71 >
@@ -74,7 +75,7 @@ storiesOf('Infobox')
74 .add('Secondary', () => ( 75 .add('Secondary', () => (
75 <WithStoreInfobox 76 <WithStoreInfobox
76 store={createStore({ 77 store={createStore({
77 icon: 'mdiEarth', 78 icon: mdiEarth,
78 ctaLabel: 'Ok, hi!', 79 ctaLabel: 'Ok, hi!',
79 type: 'secondary', 80 type: 'secondary',
80 })} 81 })}
@@ -85,7 +86,7 @@ storiesOf('Infobox')
85 .add('Success', () => ( 86 .add('Success', () => (
86 <WithStoreInfobox 87 <WithStoreInfobox
87 store={createStore({ 88 store={createStore({
88 icon: 'mdiEarth', 89 icon: mdiEarth,
89 ctaLabel: 'Ok, hi!', 90 ctaLabel: 'Ok, hi!',
90 type: 'success', 91 type: 'success',
91 })} 92 })}
@@ -96,7 +97,7 @@ storiesOf('Infobox')
96 .add('Warning', () => ( 97 .add('Warning', () => (
97 <WithStoreInfobox 98 <WithStoreInfobox
98 store={createStore({ 99 store={createStore({
99 icon: 'mdiEarth', 100 icon: mdiEarth,
100 ctaLabel: 'Ok, hi!', 101 ctaLabel: 'Ok, hi!',
101 type: 'warning', 102 type: 'warning',
102 })} 103 })}
@@ -107,7 +108,7 @@ storiesOf('Infobox')
107 .add('Danger', () => ( 108 .add('Danger', () => (
108 <WithStoreInfobox 109 <WithStoreInfobox
109 store={createStore({ 110 store={createStore({
110 icon: 'mdiEarth', 111 icon: mdiEarth,
111 ctaLabel: 'Ok, hi!', 112 ctaLabel: 'Ok, hi!',
112 type: 'danger', 113 type: 'danger',
113 })} 114 })}
@@ -118,7 +119,7 @@ storiesOf('Infobox')
118 .add('Inverted', () => ( 119 .add('Inverted', () => (
119 <WithStoreInfobox 120 <WithStoreInfobox
120 store={createStore({ 121 store={createStore({
121 icon: 'mdiEarth', 122 icon: mdiEarth,
122 ctaLabel: 'Ok, hi!', 123 ctaLabel: 'Ok, hi!',
123 type: 'inverted', 124 type: 'inverted',
124 })} 125 })}