aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-09-05 14:34:13 +0200
committerLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-09-05 14:34:13 +0200
commit5336eab8b279eea886d8ce6efb03bd771d65ddc8 (patch)
tree79ebdf1a60ed0f2f1c8de93c90e90d7d2f5dab47 /src
parentMerge branch 'feature/todos' into develop (diff)
parentFix headline spacing (diff)
downloadferdium-app-5336eab8b279eea886d8ce6efb03bd771d65ddc8.tar.gz
ferdium-app-5336eab8b279eea886d8ce6efb03bd771d65ddc8.tar.zst
ferdium-app-5336eab8b279eea886d8ce6efb03bd771d65ddc8.zip
Merge branch 'develop' of https://github.com/meetfranz/franz into develop
Diffstat (limited to 'src')
-rw-r--r--src/assets/images/workspaces/teaser_dark.pngbin179047 -> 0 bytes
-rw-r--r--src/assets/images/workspaces/teaser_light.pngbin182321 -> 0 bytes
-rw-r--r--src/components/TrialActivationInfoBar.js2
-rw-r--r--src/components/settings/account/AccountDashboard.js4
-rw-r--r--src/components/settings/team/TeamDashboard.js73
-rw-r--r--src/components/ui/UpgradeButton/index.js89
-rw-r--r--src/config.js2
-rw-r--r--src/containers/settings/AccountScreen.js1
-rw-r--r--src/containers/settings/TeamScreen.js1
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js2
-rw-r--r--src/environment.js2
-rw-r--r--src/features/delayApp/Component.js1
-rw-r--r--src/features/todos/components/TodosWebview.js12
-rw-r--r--src/features/todos/store.js20
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js167
-rw-r--r--src/features/workspaces/containers/WorkspacesScreen.js2
-rw-r--r--src/i18n/globalMessages.js4
-rw-r--r--src/i18n/locales/cs.json2
-rw-r--r--src/i18n/locales/defaultMessages.json71
-rw-r--r--src/i18n/locales/en-US.json6
-rw-r--r--src/i18n/locales/fr.json2
-rw-r--r--src/i18n/locales/nl.json114
-rw-r--r--src/i18n/locales/sk.json58
-rw-r--r--src/i18n/messages/src/components/settings/team/TeamDashboard.json24
-rw-r--r--src/i18n/messages/src/components/ui/UpgradeButton/index.json15
-rw-r--r--src/i18n/messages/src/features/todos/components/TodosWebview.json4
-rw-r--r--src/i18n/messages/src/i18n/globalMessages.json13
-rw-r--r--src/stores/AppStore.js11
-rw-r--r--src/stores/UIStore.js1
-rw-r--r--src/stores/UserStore.js10
-rw-r--r--src/styles/layout.scss6
-rw-r--r--src/styles/settings.scss71
32 files changed, 519 insertions, 271 deletions
diff --git a/src/assets/images/workspaces/teaser_dark.png b/src/assets/images/workspaces/teaser_dark.png
deleted file mode 100644
index 5b6d7334b..000000000
--- a/src/assets/images/workspaces/teaser_dark.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/workspaces/teaser_light.png b/src/assets/images/workspaces/teaser_light.png
deleted file mode 100644
index 635af43fa..000000000
--- a/src/assets/images/workspaces/teaser_light.png
+++ /dev/null
Binary files differ
diff --git a/src/components/TrialActivationInfoBar.js b/src/components/TrialActivationInfoBar.js
index acdf51d08..77ab97565 100644
--- a/src/components/TrialActivationInfoBar.js
+++ b/src/components/TrialActivationInfoBar.js
@@ -20,7 +20,7 @@ const styles = {
20 position: 'absolute', 20 position: 'absolute',
21 top: -50, 21 top: -50,
22 transition: 'top 0.3s', 22 transition: 'top 0.3s',
23 zIndex: 300, 23 zIndex: 500,
24 width: 'calc(100% - 300px)', 24 width: 'calc(100% - 300px)',
25 }, 25 },
26 show: { 26 show: {
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 4fd1e8163..ac2594604 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -97,6 +97,7 @@ const messages = defineMessages({
97class AccountDashboard extends Component { 97class AccountDashboard extends Component {
98 static propTypes = { 98 static propTypes = {
99 user: MobxPropTypes.observableObject.isRequired, 99 user: MobxPropTypes.observableObject.isRequired,
100 isPremiumOverrideUser: PropTypes.bool.isRequired,
100 isProUser: PropTypes.bool.isRequired, 101 isProUser: PropTypes.bool.isRequired,
101 isLoading: PropTypes.bool.isRequired, 102 isLoading: PropTypes.bool.isRequired,
102 userInfoRequestFailed: PropTypes.bool.isRequired, 103 userInfoRequestFailed: PropTypes.bool.isRequired,
@@ -117,6 +118,7 @@ class AccountDashboard extends Component {
117 render() { 118 render() {
118 const { 119 const {
119 user, 120 user,
121 isPremiumOverrideUser,
120 isProUser, 122 isProUser,
121 isLoading, 123 isLoading,
122 userInfoRequestFailed, 124 userInfoRequestFailed,
@@ -213,7 +215,7 @@ class AccountDashboard extends Component {
213 {intl.formatMessage(messages.yourLicense)} 215 {intl.formatMessage(messages.yourLicense)}
214 </H2> 216 </H2>
215 <p> 217 <p>
216 {planName} 218 {isPremiumOverrideUser ? 'Franz Premium' : planName}
217 {user.team.isTrial && ( 219 {user.team.isTrial && (
218 <> 220 <>
219 {' – '} 221 {' – '}
diff --git a/src/components/settings/team/TeamDashboard.js b/src/components/settings/team/TeamDashboard.js
index 990ee52e7..366b0113a 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="Franz 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 </> 163 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Franz for Teams" />
137 </PremiumFeatureContainer> 164 </div>
138 <Button 165 <div className={classes.buttonContainer}>
139 label={intl.formatMessage(messages.manageButton)} 166 {!isProUser ? (
140 onClick={openTeamManagement} 167 <UpgradeButton
141 className={classes.cta} 168 className={classes.cta}
142 /> 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/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 fba739ddd..78a92d948 100644
--- a/src/config.js
+++ b/src/config.js
@@ -20,7 +20,7 @@ export 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';
22// export const DEV_API_WEBSITE = 'https://meetfranz.com';t 22// export const DEV_API_WEBSITE = 'https://meetfranz.com';t
23export const DEV_API_WEBSITE = 'http://hash-3ac3ccd2472269cf585c58a4f6973d86f3c9e7bd.franzstaging.com/'; // TODO: revert me 23export const DEV_API_WEBSITE = 'http://hash-58883791519ef6288c952316bdce7fb462283893.franzstaging.com/'; // TODO: revert me
24export const LIVE_API_WEBSITE = 'https://meetfranz.com'; 24export const LIVE_API_WEBSITE = 'https://meetfranz.com';
25 25
26export const STATS_API = 'https://stats.franzinfra.com'; 26export const STATS_API = 'https://stats.franzinfra.com';
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index 2b5eba91c..9c74cf2ab 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -42,6 +42,7 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
42 <ErrorBoundary> 42 <ErrorBoundary>
43 <AccountDashboard 43 <AccountDashboard
44 user={user.data} 44 user={user.data}
45 isPremiumOverrideUser={user.isPremiumOverride}
45 isProUser={user.isPro} 46 isProUser={user.isPro}
46 isLoading={isLoadingUserInfo} 47 isLoading={isLoadingUserInfo}
47 isLoadingPlans={isLoadingPlans} 48 isLoadingPlans={isLoadingPlans}
diff --git a/src/containers/settings/TeamScreen.js b/src/containers/settings/TeamScreen.js
index b7b1b78cb..f600c9947 100644
--- a/src/containers/settings/TeamScreen.js
+++ b/src/containers/settings/TeamScreen.js
@@ -30,6 +30,7 @@ export default @inject('stores', 'actions') @observer class TeamScreen extends C
30 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 30 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError}
31 retryUserInfoRequest={() => this.reloadData()} 31 retryUserInfoRequest={() => this.reloadData()}
32 openTeamManagement={() => this.handleWebsiteLink('/user/team')} 32 openTeamManagement={() => this.handleWebsiteLink('/user/team')}
33 isProUser={user.isPro}
33 /> 34 />
34 </ErrorBoundary> 35 </ErrorBoundary>
35 ); 36 );
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
index e9e457084..726b10628 100644
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ b/src/containers/subscription/SubscriptionFormScreen.js
@@ -19,7 +19,7 @@ export default @inject('stores', 'actions') @observer class SubscriptionFormScre
19 features, 19 features,
20 } = stores; 20 } = stores;
21 21
22 let hostedPageURL = !user.data.hadSubscription ? features.features.planSelectionURL : features.features.subscribeURL; 22 let hostedPageURL = features.features.planSelectionURL;
23 hostedPageURL = user.getAuthURL(hostedPageURL); 23 hostedPageURL = user.getAuthURL(hostedPageURL);
24 24
25 actions.app.openExternalUrl({ url: hostedPageURL }); 25 actions.app.openExternalUrl({ url: hostedPageURL });
diff --git a/src/environment.js b/src/environment.js
index 707449e09..4be2c7d70 100644
--- a/src/environment.js
+++ b/src/environment.js
@@ -37,8 +37,10 @@ let web;
37let todos; 37let todos;
38if (!isDevMode || (isDevMode && useLiveAPI)) { 38if (!isDevMode || (isDevMode && useLiveAPI)) {
39 api = LIVE_API; 39 api = LIVE_API;
40 // api = DEV_API;
40 wsApi = LIVE_WS_API; 41 wsApi = LIVE_WS_API;
41 web = LIVE_API_WEBSITE; 42 web = LIVE_API_WEBSITE;
43 // web = DEV_API_WEBSITE;
42 todos = PRODUCTION_TODOS_FRONTEND_URL; 44 todos = PRODUCTION_TODOS_FRONTEND_URL;
43} else if (isDevMode && useLocalAPI) { 45} else if (isDevMode && useLocalAPI) {
44 api = LOCAL_API; 46 api = LOCAL_API;
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js
index de5653f04..6344edb89 100644
--- a/src/features/delayApp/Component.js
+++ b/src/features/delayApp/Component.js
@@ -77,7 +77,6 @@ export default @inject('stores', 'actions') @injectSheet(styles) @observer class
77 const { defaultTrialPlan } = stores.features.features; 77 const { defaultTrialPlan } = stores.features.features;
78 78
79 if (!hadSubscription) { 79 if (!hadSubscription) {
80 console.log('directly activate trial');
81 actions.user.activateTrial({ planId: defaultTrialPlan }); 80 actions.user.activateTrial({ planId: defaultTrialPlan });
82 81
83 gaEvent('DelayApp', 'subscribe_click', 'Delay App Feature'); 82 gaEvent('DelayApp', 'subscribe_click', 'Delay App Feature');
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index 143955a7b..c06183e37 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -9,7 +9,7 @@ import { defineMessages, intlShape } from 'react-intl';
9import { mdiChevronRight, mdiCheckAll } from '@mdi/js'; 9import { mdiChevronRight, mdiCheckAll } from '@mdi/js';
10import * as environment from '../../../environment'; 10import * as environment from '../../../environment';
11import Appear from '../../../components/ui/effects/Appear'; 11import Appear from '../../../components/ui/effects/Appear';
12import ActivateTrialButton from '../../../components/ui/ActivateTrialButton'; 12import UpgradeButton from '../../../components/ui/UpgradeButton';
13 13
14const OPEN_TODOS_BUTTON_SIZE = 45; 14const OPEN_TODOS_BUTTON_SIZE = 45;
15const CLOSE_TODOS_BUTTON_SIZE = 35; 15const CLOSE_TODOS_BUTTON_SIZE = 35;
@@ -17,7 +17,7 @@ const CLOSE_TODOS_BUTTON_SIZE = 35;
17const messages = defineMessages({ 17const messages = defineMessages({
18 premiumInfo: { 18 premiumInfo: {
19 id: 'feature.todos.premium.info', 19 id: 'feature.todos.premium.info',
20 defaultMessage: '!!!The Franz Todos Preview is currently only available for Franz Premium accounts.', 20 defaultMessage: '!!!Franz Todos are available to premium users now!',
21 }, 21 },
22 upgradeCTA: { 22 upgradeCTA: {
23 id: 'feature.todos.premium.upgrade', 23 id: 'feature.todos.premium.upgrade',
@@ -25,7 +25,7 @@ const messages = defineMessages({
25 }, 25 },
26 rolloutInfo: { 26 rolloutInfo: {
27 id: 'feature.todos.premium.rollout', 27 id: 'feature.todos.premium.rollout',
28 defaultMessage: '!!!Franz Todos will be available to everyone soon.', 28 defaultMessage: '!!!Everyone else will have to wait a little longer.',
29 }, 29 },
30}); 30});
31 31
@@ -112,7 +112,7 @@ const styles = theme => ({
112 alignItems: 'center', 112 alignItems: 'center',
113 width: '80%', 113 width: '80%',
114 maxWidth: 300, 114 maxWidth: 300,
115 margin: [-50, 'auto', 0], 115 margin: [0, 'auto'],
116 textAlign: 'center', 116 textAlign: 'center',
117 }, 117 },
118 premiumIcon: { 118 premiumIcon: {
@@ -281,10 +281,10 @@ class TodosWebview extends Component {
281 ) : ( 281 ) : (
282 <Appear> 282 <Appear>
283 <div className={classes.premiumContainer}> 283 <div className={classes.premiumContainer}>
284 <Icon icon={mdiCheckAll} className={classes.premiumIcon} size={5} /> 284 <Icon icon={mdiCheckAll} className={classes.premiumIcon} size={4} />
285 <p>{intl.formatMessage(messages.premiumInfo)}</p> 285 <p>{intl.formatMessage(messages.premiumInfo)}</p>
286 <p>{intl.formatMessage(messages.rolloutInfo)}</p> 286 <p>{intl.formatMessage(messages.rolloutInfo)}</p>
287 <ActivateTrialButton 287 <UpgradeButton
288 className={classes.premiumCTA} 288 className={classes.premiumCTA}
289 gaEventInfo={{ category: 'Todos', event: 'upgrade' }} 289 gaEventInfo={{ category: 'Todos', event: 'upgrade' }}
290 short 290 short
diff --git a/src/features/todos/store.js b/src/features/todos/store.js
index 170408ebb..aebe0dcbe 100644
--- a/src/features/todos/store.js
+++ b/src/features/todos/store.js
@@ -30,7 +30,7 @@ export default class TodoStore extends FeatureStore {
30 } 30 }
31 31
32 @computed get isTodosPanelVisible() { 32 @computed get isTodosPanelVisible() {
33 if (this.stores.services.all.length === 0 || delayAppState.isDelayAppScreenVisible) return false; 33 if (delayAppState.isDelayAppScreenVisible) return false;
34 if (this.settings.isTodosPanelVisible === undefined) return DEFAULT_TODOS_VISIBLE; 34 if (this.settings.isTodosPanelVisible === undefined) return DEFAULT_TODOS_VISIBLE;
35 35
36 return this.settings.isTodosPanelVisible; 36 return this.settings.isTodosPanelVisible;
@@ -62,6 +62,7 @@ export default class TodoStore extends FeatureStore {
62 this._allReactions = createReactions([ 62 this._allReactions = createReactions([
63 this._setFeatureEnabledReaction, 63 this._setFeatureEnabledReaction,
64 this._updateTodosConfig, 64 this._updateTodosConfig,
65 this._firstLaunchReaction,
65 ]); 66 ]);
66 67
67 this._registerReactions(this._allReactions); 68 this._registerReactions(this._allReactions);
@@ -156,5 +157,20 @@ export default class TodoStore extends FeatureStore {
156 _updateTodosConfig = () => { 157 _updateTodosConfig = () => {
157 // Resend the config if any part changes in Franz: 158 // Resend the config if any part changes in Franz:
158 this._onTodosClientInitialized(); 159 this._onTodosClientInitialized();
159 } 160 };
161
162 _firstLaunchReaction = () => {
163 const { stats } = this.stores.settings.all;
164
165 // Hide todos layer on first app start but show on second
166 if (stats.appStarts <= 1) {
167 this._updateSettings({
168 isTodosPanelVisible: false,
169 });
170 } else if (stats.appStarts <= 2) {
171 this._updateSettings({
172 isTodosPanelVisible: true,
173 });
174 }
175 };
160} 176}
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index 059a681de..70e213912 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes, inject } 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,9 +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';
15import UIStore from '../../../stores/UIStore'; 14import UIStore from '../../../stores/UIStore';
16import ActivateTrialButton from '../../../components/ui/ActivateTrialButton'; 15import globalMessages from '../../../i18n/globalMessages';
16import UpgradeButton from '../../../components/ui/UpgradeButton';
17 17
18const messages = defineMessages({ 18const messages = defineMessages({
19 headline: { 19 headline: {
@@ -50,7 +50,7 @@ const messages = defineMessages({
50 }, 50 },
51}); 51});
52 52
53const styles = theme => ({ 53const styles = () => ({
54 table: { 54 table: {
55 width: '100%', 55 width: '100%',
56 '& td': { 56 '& td': {
@@ -64,23 +64,24 @@ const styles = theme => ({
64 height: 'auto', 64 height: 'auto',
65 }, 65 },
66 premiumAnnouncement: { 66 premiumAnnouncement: {
67 padding: 20,
68 // backgroundColor: '#3498db',
69 marginLeft: -20,
70 marginBottom: 40,
71 paddingBottom: 40,
72 height: 'auto', 67 height: 'auto',
68 },
69 premiumAnnouncementContainer: {
73 display: 'flex', 70 display: 'flex',
74 borderBottom: [1, 'solid', theme.inputBackground], 71 },
72 announcementHeadline: {
73 marginBottom: 0,
75 }, 74 },
76 teaserImage: { 75 teaserImage: {
77 width: 200, 76 width: 250,
78 height: '100%', 77 margin: [-8, 0, 0, 20],
79 float: 'left', 78 alignSelf: 'center',
80 margin: [-8, 0, 0, -20],
81 }, 79 },
82 upgradeCTA: { 80 upgradeCTA: {
83 marginTop: 20, 81 margin: [40, 'auto'],
82 },
83 proRequired: {
84 margin: [10, 0, 40],
84 }, 85 },
85}); 86});
86 87
@@ -152,76 +153,80 @@ class WorkspacesDashboard extends Component {
152 153
153 {workspaceStore.isPremiumUpgradeRequired && ( 154 {workspaceStore.isPremiumUpgradeRequired && (
154 <div className={classes.premiumAnnouncement}> 155 <div className={classes.premiumAnnouncement}>
155 <img src={`./assets/images/workspaces/teaser_${this.props.stores.ui.isDarkThemeActive ? 'dark' : 'light'}.png`} className={classes.teaserImage} alt="" /> 156
156 <div> 157 <h1 className={classes.announcementHeadline}>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h1>
157 <h2>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h2> 158 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge>
158 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p> 159 <div className={classes.premiumAnnouncementContainer}>
159 <ActivateTrialButton 160 <div className={classes.premiumAnnouncementContent}>
160 className={classes.upgradeCTA} 161 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p>
161 gaEventInfo={{ category: 'Workspaces', event: 'upgrade' }} 162 <UpgradeButton
162 short 163 className={classes.upgradeCTA}
163 /> 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="" />
164 </div> 170 </div>
165 </div> 171 </div>
166 )} 172 )}
167 173
168 <PremiumFeatureContainer 174 {!workspaceStore.isPremiumUpgradeRequired && (
169 condition={() => workspaceStore.isPremiumUpgradeRequired} 175 <>
170 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'workspaces' }} 176 {/* ===== Create workspace form ===== */}
171 > 177 <div className={classes.createForm}>
172 {/* ===== Create workspace form ===== */} 178 <CreateWorkspaceForm
173 <div className={classes.createForm}> 179 isSubmitting={createWorkspaceRequest.isExecuting}
174 <CreateWorkspaceForm 180 onSubmit={onCreateWorkspaceSubmit}
175 isSubmitting={createWorkspaceRequest.isExecuting} 181 />
176 onSubmit={onCreateWorkspaceSubmit} 182 </div>
177 /> 183 {getUserWorkspacesRequest.isExecuting ? (
178 </div> 184 <Loader />
179 {getUserWorkspacesRequest.isExecuting ? ( 185 ) : (
180 <Loader /> 186 <Fragment>
181 ) : ( 187 {/* ===== Workspace could not be loaded error ===== */}
182 <Fragment> 188 {getUserWorkspacesRequest.error ? (
183 {/* ===== Workspace could not be loaded error ===== */} 189 <Infobox
184 {getUserWorkspacesRequest.error ? ( 190 icon="alert"
185 <Infobox 191 type="danger"
186 icon="alert" 192 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)}
187 type="danger" 193 ctaLoading={getUserWorkspacesRequest.isExecuting}
188 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)} 194 ctaOnClick={getUserWorkspacesRequest.retry}
189 ctaLoading={getUserWorkspacesRequest.isExecuting} 195 >
190 ctaOnClick={getUserWorkspacesRequest.retry} 196 {intl.formatMessage(messages.workspacesRequestFailed)}
191 > 197 </Infobox>
192 {intl.formatMessage(messages.workspacesRequestFailed)} 198 ) : (
193 </Infobox> 199 <Fragment>
194 ) : ( 200 {workspaces.length === 0 ? (
195 <Fragment> 201 <div className="align-middle settings__empty-state">
196 {workspaces.length === 0 ? ( 202 {/* ===== Workspaces empty state ===== */}
197 <div className="align-middle settings__empty-state"> 203 <p className="settings__empty-text">
198 {/* ===== Workspaces empty state ===== */} 204 <span className="emoji">
199 <p className="settings__empty-text"> 205 <img src="./assets/images/emoji/sad.png" alt="" />
200 <span className="emoji"> 206 </span>
201 <img src="./assets/images/emoji/sad.png" alt="" /> 207 {intl.formatMessage(messages.noServicesAdded)}
202 </span> 208 </p>
203 {intl.formatMessage(messages.noServicesAdded)} 209 </div>
204 </p> 210 ) : (
205 </div> 211 <table className={classes.table}>
206 ) : ( 212 {/* ===== Workspaces list ===== */}
207 <table className={classes.table}> 213 <tbody>
208 {/* ===== Workspaces list ===== */} 214 {workspaces.map(workspace => (
209 <tbody> 215 <WorkspaceItem
210 {workspaces.map(workspace => ( 216 key={workspace.id}
211 <WorkspaceItem 217 workspace={workspace}
212 key={workspace.id} 218 onItemClick={w => onWorkspaceClick(w)}
213 workspace={workspace} 219 />
214 onItemClick={w => onWorkspaceClick(w)} 220 ))}
215 /> 221 </tbody>
216 ))} 222 </table>
217 </tbody> 223 )}
218 </table> 224 </Fragment>
219 )} 225 )}
220 </Fragment> 226 </Fragment>
221 )} 227 )}
222 </Fragment> 228 </>
223 )} 229 )}
224 </PremiumFeatureContainer>
225 </div> 230 </div>
226 </div> 231 </div>
227 ); 232 );
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/i18n/globalMessages.js b/src/i18n/globalMessages.js
index 1b5ece223..af8479c59 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/cs.json b/src/i18n/locales/cs.json
index 809c5d5a8..36732b44d 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -8,7 +8,7 @@
8 "feature.shareFranz.action.email" : "Poslat jako e-mail", 8 "feature.shareFranz.action.email" : "Poslat jako e-mail",
9 "feature.shareFranz.action.facebook" : "Sdílet na Facebooku", 9 "feature.shareFranz.action.facebook" : "Sdílet na Facebooku",
10 "feature.shareFranz.action.twitter" : "Sdílet na Twitteru", 10 "feature.shareFranz.action.twitter" : "Sdílet na Twitteru",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "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", 12 "feature.shareFranz.shareText.email" : "Přidali jsme {count} služeb do Franze. Získejte zdarma aplikace pro WhatsApp, Messenger, SLack, Skype a další na www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 367184c01..1204005dc 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -2530,78 +2530,78 @@
2530 "defaultMessage": "!!!Team", 2530 "defaultMessage": "!!!Team",
2531 "end": { 2531 "end": {
2532 "column": 3, 2532 "column": 3,
2533 "line": 17 2533 "line": 19
2534 }, 2534 },
2535 "file": "src/components/settings/team/TeamDashboard.js", 2535 "file": "src/components/settings/team/TeamDashboard.js",
2536 "id": "settings.team.headline", 2536 "id": "settings.team.headline",
2537 "start": { 2537 "start": {
2538 "column": 12, 2538 "column": 12,
2539 "line": 14 2539 "line": 16
2540 } 2540 }
2541 }, 2541 },
2542 { 2542 {
2543 "defaultMessage": "!!!Franz for Teams", 2543 "defaultMessage": "!!!Franz for Teams",
2544 "end": { 2544 "end": {
2545 "column": 3, 2545 "column": 3,
2546 "line": 21 2546 "line": 23
2547 }, 2547 },
2548 "file": "src/components/settings/team/TeamDashboard.js", 2548 "file": "src/components/settings/team/TeamDashboard.js",
2549 "id": "settings.team.contentHeadline", 2549 "id": "settings.team.contentHeadline",
2550 "start": { 2550 "start": {
2551 "column": 19, 2551 "column": 19,
2552 "line": 18 2552 "line": 20
2553 } 2553 }
2554 }, 2554 },
2555 { 2555 {
2556 "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.", 2556 "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.",
2557 "end": { 2557 "end": {
2558 "column": 3, 2558 "column": 3,
2559 "line": 25 2559 "line": 27
2560 }, 2560 },
2561 "file": "src/components/settings/team/TeamDashboard.js", 2561 "file": "src/components/settings/team/TeamDashboard.js",
2562 "id": "settings.team.intro", 2562 "id": "settings.team.intro",
2563 "start": { 2563 "start": {
2564 "column": 9, 2564 "column": 9,
2565 "line": 22 2565 "line": 24
2566 } 2566 }
2567 }, 2567 },
2568 { 2568 {
2569 "defaultMessage": "!!!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!", 2569 "defaultMessage": "!!!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!",
2570 "end": { 2570 "end": {
2571 "column": 3, 2571 "column": 3,
2572 "line": 29 2572 "line": 31
2573 }, 2573 },
2574 "file": "src/components/settings/team/TeamDashboard.js", 2574 "file": "src/components/settings/team/TeamDashboard.js",
2575 "id": "settings.team.copy", 2575 "id": "settings.team.copy",
2576 "start": { 2576 "start": {
2577 "column": 8, 2577 "column": 8,
2578 "line": 26 2578 "line": 28
2579 } 2579 }
2580 }, 2580 },
2581 { 2581 {
2582 "defaultMessage": "!!!Manage your Team on meetfranz.com", 2582 "defaultMessage": "!!!Manage your Team on meetfranz.com",
2583 "end": { 2583 "end": {
2584 "column": 3, 2584 "column": 3,
2585 "line": 33 2585 "line": 35
2586 }, 2586 },
2587 "file": "src/components/settings/team/TeamDashboard.js", 2587 "file": "src/components/settings/team/TeamDashboard.js",
2588 "id": "settings.team.manageAction", 2588 "id": "settings.team.manageAction",
2589 "start": { 2589 "start": {
2590 "column": 16, 2590 "column": 16,
2591 "line": 30 2591 "line": 32
2592 } 2592 }
2593 }, 2593 },
2594 { 2594 {
2595 "defaultMessage": "!!!Upgrade your Account", 2595 "defaultMessage": "!!!Upgrade your Account",
2596 "end": { 2596 "end": {
2597 "column": 3, 2597 "column": 3,
2598 "line": 37 2598 "line": 39
2599 }, 2599 },
2600 "file": "src/components/settings/team/TeamDashboard.js", 2600 "file": "src/components/settings/team/TeamDashboard.js",
2601 "id": "settings.team.upgradeAction", 2601 "id": "settings.team.upgradeAction",
2602 "start": { 2602 "start": {
2603 "column": 17, 2603 "column": 17,
2604 "line": 34 2604 "line": 36
2605 } 2605 }
2606 } 2606 }
2607 ], 2607 ],
@@ -3105,6 +3105,24 @@
3105 { 3105 {
3106 "descriptors": [ 3106 "descriptors": [
3107 { 3107 {
3108 "defaultMessage": "!!!Upgrade to Franz Professional",
3109 "end": {
3110 "column": 3,
3111 "line": 16
3112 },
3113 "file": "src/components/ui/UpgradeButton/index.js",
3114 "id": "global.upgradeButton.upgradeToPro",
3115 "start": {
3116 "column": 16,
3117 "line": 13
3118 }
3119 }
3120 ],
3121 "path": "src/components/ui/UpgradeButton/index.json"
3122 },
3123 {
3124 "descriptors": [
3125 {
3108 "defaultMessage": "!!!Loading", 3126 "defaultMessage": "!!!Loading",
3109 "end": { 3127 "end": {
3110 "column": 3, 3128 "column": 3,
@@ -3870,42 +3888,42 @@
3870 { 3888 {
3871 "descriptors": [ 3889 "descriptors": [
3872 { 3890 {
3873 "defaultMessage": "!!!The Franz Todos Preview is currently only available for Franz Premium accounts.", 3891 "defaultMessage": "!!!Franz Todos are available to premium users now!",
3874 "end": { 3892 "end": {
3875 "column": 3, 3893 "column": 3,
3876 "line": 22 3894 "line": 21
3877 }, 3895 },
3878 "file": "src/features/todos/components/TodosWebview.js", 3896 "file": "src/features/todos/components/TodosWebview.js",
3879 "id": "feature.todos.premium.info", 3897 "id": "feature.todos.premium.info",
3880 "start": { 3898 "start": {
3881 "column": 15, 3899 "column": 15,
3882 "line": 19 3900 "line": 18
3883 } 3901 }
3884 }, 3902 },
3885 { 3903 {
3886 "defaultMessage": "!!!Upgrade Account", 3904 "defaultMessage": "!!!Upgrade Account",
3887 "end": { 3905 "end": {
3888 "column": 3, 3906 "column": 3,
3889 "line": 26 3907 "line": 25
3890 }, 3908 },
3891 "file": "src/features/todos/components/TodosWebview.js", 3909 "file": "src/features/todos/components/TodosWebview.js",
3892 "id": "feature.todos.premium.upgrade", 3910 "id": "feature.todos.premium.upgrade",
3893 "start": { 3911 "start": {
3894 "column": 14, 3912 "column": 14,
3895 "line": 23 3913 "line": 22
3896 } 3914 }
3897 }, 3915 },
3898 { 3916 {
3899 "defaultMessage": "!!!Franz Todos will be available to everyone soon.", 3917 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
3900 "end": { 3918 "end": {
3901 "column": 3, 3919 "column": 3,
3902 "line": 30 3920 "line": 29
3903 }, 3921 },
3904 "file": "src/features/todos/components/TodosWebview.js", 3922 "file": "src/features/todos/components/TodosWebview.js",
3905 "id": "feature.todos.premium.rollout", 3923 "id": "feature.todos.premium.rollout",
3906 "start": { 3924 "start": {
3907 "column": 15, 3925 "column": 15,
3908 "line": 27 3926 "line": 26
3909 } 3927 }
3910 } 3928 }
3911 ], 3929 ],
@@ -4594,6 +4612,19 @@
4594 "column": 39, 4612 "column": 39,
4595 "line": 24 4613 "line": 24
4596 } 4614 }
4615 },
4616 {
4617 "defaultMessage": "!!!Franz Professional Required",
4618 "end": {
4619 "column": 3,
4620 "line": 31
4621 },
4622 "file": "src/i18n/globalMessages.js",
4623 "id": "global.franzProRequired",
4624 "start": {
4625 "column": 15,
4626 "line": 28
4627 }
4597 } 4628 }
4598 ], 4629 ],
4599 "path": "src/i18n/globalMessages.json" 4630 "path": "src/i18n/globalMessages.json"
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index f11d5ca91..4fe9bd52a 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -17,15 +17,17 @@
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", 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",
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", 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",
19 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Franz 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": "The Franz Todos Preview is currently only available for Franz Premium accounts.", 20 "feature.todos.premium.info": "Franz Todos are available to premium users now!",
21 "feature.todos.premium.rollout": "Franz Todos will be available to everyone soon.", 21 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade": "Upgrade Account", 22 "feature.todos.premium.upgrade": "Upgrade Account",
23 "global.api.unhealthy": "Can't connect to Franz online services", 23 "global.api.unhealthy": "Can't connect to Franz online services",
24 "global.franzProRequired": "Franz Professional Required",
24 "global.notConnectedToTheInternet": "You are not connected to the internet.", 25 "global.notConnectedToTheInternet": "You are not connected to the internet.",
25 "global.spellchecker.useDefault": "Use System Default ({default})", 26 "global.spellchecker.useDefault": "Use System Default ({default})",
26 "global.spellchecking.autodetect": "Detect language automatically", 27 "global.spellchecking.autodetect": "Detect language automatically",
27 "global.spellchecking.autodetect.short": "Automatic", 28 "global.spellchecking.autodetect.short": "Automatic",
28 "global.spellchecking.language": "Spell checking language", 29 "global.spellchecking.language": "Spell checking language",
30 "global.upgradeButton.upgradeToPro": "Upgrade to Franz Professional",
29 "import.headline": "Import your Franz 4 services", 31 "import.headline": "Import your Franz 4 services",
30 "import.notSupportedHeadline": "Services not yet supported in Franz 5", 32 "import.notSupportedHeadline": "Services not yet supported in Franz 5",
31 "import.skip.label": "I want to add services manually", 33 "import.skip.label": "I want to add services manually",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 9227ff28f..451247c8b 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -1,5 +1,5 @@
1{ 1{
2 "app.errorHandler.action" : "Recharger", 2 "app.errorHandler.action" : "Rafraîchir",
3 "app.errorHandler.headline" : "Une erreur s'est produite", 3 "app.errorHandler.headline" : "Une erreur s'est produite",
4 "feature.announcements.changelog.headline" : "Changements dans Franz {version}", 4 "feature.announcements.changelog.headline" : "Changements dans Franz {version}",
5 "feature.delayApp.action" : "Obtenez une licence de Supporter Franz", 5 "feature.delayApp.action" : "Obtenez une licence de Supporter Franz",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index a05297a64..fd80dbdb9 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -1,6 +1,6 @@
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 Franz {version}", 4 "feature.announcements.changelog.headline" : "Wijzigingen in Franz {version}",
5 "feature.delayApp.action" : "Sponsor Franz", 5 "feature.delayApp.action" : "Sponsor Franz",
6 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan", 6 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan",
@@ -9,27 +9,27 @@
9 "feature.shareFranz.action.facebook" : "Deel op Facebook", 9 "feature.shareFranz.action.facebook" : "Deel op Facebook",
10 "feature.shareFranz.action.twitter" : "Deel op Twitter", 10 "feature.shareFranz.action.twitter" : "Deel op Twitter",
11 "feature.shareFranz.headline" : "Franz is leuker samen!", 11 "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", 12 "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", 13 "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 Franz is en help ons om bekender te worden", 14 "feature.shareFranz.text" : "Vertel je vrienden en collega's hoe geweldig Franz is en help ons om bekender te worden.",
15 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services", 15 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services.",
16 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.", 16 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.",
17 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})", 17 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})",
18 "global.spellchecking.autodetect" : "Taal automatisch herkennen", 18 "global.spellchecking.autodetect" : "Taal automatisch herkennen",
19 "global.spellchecking.autodetect.short" : "Automatisch", 19 "global.spellchecking.autodetect.short" : "Automatisch",
20 "global.spellchecking.language" : "Spelling checken", 20 "global.spellchecking.language" : "Taal voor spellingcontrole",
21 "import.headline" : "Importeer uw Franz 4-services", 21 "import.headline" : "Importeer uw Franz 4-services",
22 "import.notSupportedHeadline" : "Services die nog niet ondersteund worden in Franz 5", 22 "import.notSupportedHeadline" : "Services die (nog) niet ondersteund worden in Franz 5",
23 "import.skip.label" : "Ik wil services handmatig toevoegen", 23 "import.skip.label" : "Ik wil diensten handmatig toevoegen",
24 "import.submit.label" : "Importeer services", 24 "import.submit.label" : "Importeer services",
25 "infobar.buttonChangelog" : "Wat is er nieuw?", 25 "infobar.buttonChangelog" : "Wat is er nieuw?",
26 "infobar.buttonInstallUpdate" : "Opnieuw opstarten & update installeren", 26 "infobar.buttonInstallUpdate" : "Opnieuw opstarten & update installeren",
27 "infobar.buttonReloadServices" : "Services opnieuw laden", 27 "infobar.buttonReloadServices" : "Services opnieuw laden",
28 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden", 28 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden",
29 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.", 29 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.",
30 "infobar.updateAvailable" : "Er is een nieuwe update voor Franz beschikbaar.", 30 "infobar.updateAvailable" : "Een nieuwe update voor Franz is beschikbaar.",
31 "invite.email.label" : "E-mailadres", 31 "invite.email.label" : "E-mailadres",
32 "invite.headline.friends" : "Nodig 3 van je vrienden of collega's uit", 32 "invite.headline.friends" : "Nodig 3 vrienden of collega's uit",
33 "invite.name.label" : "Naam", 33 "invite.name.label" : "Naam",
34 "invite.skip.label" : "Ik wil dit later doen", 34 "invite.skip.label" : "Ik wil dit later doen",
35 "invite.submit.label" : "Uitnodigingen verzenden", 35 "invite.submit.label" : "Uitnodigingen verzenden",
@@ -62,20 +62,20 @@
62 "menu.edit.selectAll" : "Selecteer alles", 62 "menu.edit.selectAll" : "Selecteer alles",
63 "menu.edit.speech" : "Spraak", 63 "menu.edit.speech" : "Spraak",
64 "menu.edit.startDictation" : "Beginnen met dicteren", 64 "menu.edit.startDictation" : "Beginnen met dicteren",
65 "menu.edit.startSpeaking" : "Beginnen met praten", 65 "menu.edit.startSpeaking" : "Begin met spreken",
66 "menu.edit.stopSpeaking" : "Stoppen met spreken", 66 "menu.edit.stopSpeaking" : "Stop met spreken",
67 "menu.edit.undo" : "Ongedaan maken", 67 "menu.edit.undo" : "Ongedaan maken",
68 "menu.file" : "Bestand", 68 "menu.file" : "Bestand",
69 "menu.help" : "Hulp", 69 "menu.help" : "Hulp",
70 "menu.help.changelog" : "Wijzigingenlogboek", 70 "menu.help.changelog" : "Wijzigingenlogboek",
71 "menu.help.learnMore" : "Meer informatie", 71 "menu.help.learnMore" : "Meer informatie",
72 "menu.help.privacy" : "Privacy Voorwaarden", 72 "menu.help.privacy" : "Privacyvoorwaarden",
73 "menu.help.support" : "Ondersteuning", 73 "menu.help.support" : "Ondersteuning",
74 "menu.help.tos" : "Servicevoorwaarden", 74 "menu.help.tos" : "Servicevoorwaarden",
75 "menu.services" : "Diensten", 75 "menu.services" : "Services",
76 "menu.services.activatePreviousService" : "Activeer vorige dienst", 76 "menu.services.activatePreviousService" : "Activeer vorige service",
77 "menu.services.addNewService" : "Nieuwe dienst toevoegen", 77 "menu.services.addNewService" : "Nieuwe service toevoegen...",
78 "menu.services.setNextServiceActive" : "Activeer volgende dienst", 78 "menu.services.setNextServiceActive" : "Activeer volgende service",
79 "menu.view" : "Weergave", 79 "menu.view" : "Weergave",
80 "menu.view.enterFullScreen" : "Gebruik volledig scherm", 80 "menu.view.enterFullScreen" : "Gebruik volledig scherm",
81 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 81 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -101,14 +101,14 @@
101 "password.link.signup" : "Maak een gratis account", 101 "password.link.signup" : "Maak een gratis account",
102 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres", 102 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres",
103 "password.submit.label" : "Verzenden", 103 "password.submit.label" : "Verzenden",
104 "password.successInfo" : "Controleer alsjeblieft je e-mail", 104 "password.successInfo" : "Controleer je e-mail",
105 "premiumFeature.button.upgradeAccount" : "Upgrade Account", 105 "premiumFeature.button.upgradeAccount" : "Upgrade Account",
106 "pricing.headline" : "Steun Franz", 106 "pricing.headline" : "Steun Franz",
107 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.", 107 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz (nog) niet ondersteunen.",
108 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz steunen", 108 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz steunen",
109 "pricing.support.label" : "Selecteer je ondersteuningsplan", 109 "pricing.support.label" : "Selecteer je ondersteuningsplan",
110 "service.crashHandler.action" : "Laad {name} opnieuw", 110 "service.crashHandler.action" : "Laad {name} opnieuw",
111 "service.crashHandler.autoReload" : "Ga proberen om {name} te herstellen over {seconds} seconden", 111 "service.crashHandler.autoReload" : "Bezig om {name} te herstellen over {seconds} seconden",
112 "service.crashHandler.headline" : "Oh nee!", 112 "service.crashHandler.headline" : "Oh nee!",
113 "service.crashHandler.text" : "{name} heeft een fout veroorzaakt.", 113 "service.crashHandler.text" : "{name} heeft een fout veroorzaakt.",
114 "service.disabledHandler.action" : "Activeer {name}", 114 "service.disabledHandler.action" : "Activeer {name}",
@@ -126,8 +126,8 @@
126 "settings.account.accountType.premium" : "Premium Supporter Account", 126 "settings.account.accountType.premium" : "Premium Supporter Account",
127 "settings.account.buttonSave" : "Update profiel", 127 "settings.account.buttonSave" : "Update profiel",
128 "settings.account.deleteAccount" : "Verwijder account", 128 "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!", 129 "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.", 130 "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", 131 "settings.account.headline" : "Account",
132 "settings.account.headlineAccount" : "Accountinformatie", 132 "settings.account.headlineAccount" : "Accountinformatie",
133 "settings.account.headlineDangerZone" : "Gevarenzone", 133 "settings.account.headlineDangerZone" : "Gevarenzone",
@@ -143,20 +143,20 @@
143 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 143 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
144 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden", 144 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden",
145 "settings.app.buttonClearAllCache" : "Cache legen", 145 "settings.app.buttonClearAllCache" : "Cache legen",
146 "settings.app.buttonInstallUpdate" : "Herstart & installeer update", 146 "settings.app.buttonInstallUpdate" : "Opnieuw opstarten en updates installeren",
147 "settings.app.buttonSearchForUpdate" : "Controleer op updates", 147 "settings.app.buttonSearchForUpdate" : "Controleer op updates",
148 "settings.app.cacheInfo" : "De Franz-cache gebruikt op dit moment {size} schijfruimte.", 148 "settings.app.cacheInfo" : "Franz gebruikt op dit moment {size} schijfruimte aan tijdelijke bestanden.",
149 "settings.app.currentVersion" : "Huidige versie:", 149 "settings.app.currentVersion" : "Huidige versie:",
150 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond", 150 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond",
151 "settings.app.form.autoLaunchOnStart" : "Open Franz bij opstarten", 151 "settings.app.form.autoLaunchOnStart" : "Open Franz bij opstarten",
152 "settings.app.form.beta" : "Inclusief bètaversies", 152 "settings.app.form.beta" : "Inclusief bètaversies",
153 "settings.app.form.darkMode" : "Stap over naar de donkere kant", 153 "settings.app.form.darkMode" : "Stap over naar de donkere kant",
154 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart acceleratie in ", 154 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart-acceleratie in ",
155 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan", 155 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan",
156 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk", 156 "settings.app.form.enableSystemTray" : "Pictogram voor Franz in systeemvak tonen",
157 "settings.app.form.language" : "Taal", 157 "settings.app.form.language" : "Taal",
158 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk", 158 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar systeemvak",
159 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt", 159 "settings.app.form.runInBackground" : "Houd Franz open op de achtergrond wanneer het venster gesloten wordt",
160 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services", 160 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services",
161 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld", 161 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld",
162 "settings.app.headline" : "Instellingen", 162 "settings.app.headline" : "Instellingen",
@@ -165,10 +165,10 @@
165 "settings.app.headlineGeneral" : "Algemeen", 165 "settings.app.headlineGeneral" : "Algemeen",
166 "settings.app.headlineLanguage" : "Taal", 166 "settings.app.headlineLanguage" : "Taal",
167 "settings.app.headlineUpdates" : "Updates", 167 "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.", 168 "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", 169 "settings.app.restartRequired" : "Deze wijziging heeft een herstart nodig",
170 "settings.app.subheadlineCache" : "Cache", 170 "settings.app.subheadlineCache" : "Cache",
171 "settings.app.translationHelp" : "Help ons om Franz te vertalen naar uw taal.", 171 "settings.app.translationHelp" : "Help ons om Franz uw taal te laten spreken.",
172 "settings.app.updateStatusAvailable" : "Update beschikbaar, downloaden...", 172 "settings.app.updateStatusAvailable" : "Update beschikbaar, downloaden...",
173 "settings.app.updateStatusSearching" : "Zoekt naar updates", 173 "settings.app.updateStatusSearching" : "Zoekt naar updates",
174 "settings.app.updateStatusUpToDate" : "Je gebruikt de laatste versie van Franz", 174 "settings.app.updateStatusUpToDate" : "Je gebruikt de laatste versie van Franz",
@@ -184,7 +184,7 @@
184 "settings.recipes.all" : "Alle services", 184 "settings.recipes.all" : "Alle services",
185 "settings.recipes.dev" : "Ontwikkeling", 185 "settings.recipes.dev" : "Ontwikkeling",
186 "settings.recipes.headline" : "Beschikbare services", 186 "settings.recipes.headline" : "Beschikbare services",
187 "settings.recipes.missingService" : "Mist er een dienst?", 187 "settings.recipes.missingService" : "Mis je een service?",
188 "settings.recipes.mostPopular" : "Meest populair", 188 "settings.recipes.mostPopular" : "Meest populair",
189 "settings.recipes.nothingFound" : "Sorry, geen service gevonden met deze zoekterm.", 189 "settings.recipes.nothingFound" : "Sorry, geen service gevonden met deze zoekterm.",
190 "settings.recipes.servicesSuccessfulAddedInfo" : "Service succesvol toegevoegd", 190 "settings.recipes.servicesSuccessfulAddedInfo" : "Service succesvol toegevoegd",
@@ -213,7 +213,7 @@
213 "settings.service.form.iconUpload" : "Sleep en drop je afbeelding, of klik hier", 213 "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, ...", 214 "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", 215 "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", 216 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld, worden meldingen en audio niet afgespeeld",
217 "settings.service.form.name" : "Naam", 217 "settings.service.form.name" : "Naam",
218 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy instellingen", 218 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy instellingen",
219 "settings.service.form.proxy.host" : "Proxy Host\/IP", 219 "settings.service.form.proxy.host" : "Proxy Host\/IP",
@@ -233,15 +233,15 @@
233 "settings.services.discoverServices" : "Ontdek services", 233 "settings.services.discoverServices" : "Ontdek services",
234 "settings.services.headline" : "Jouw services", 234 "settings.services.headline" : "Jouw services",
235 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.", 235 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.",
236 "settings.services.servicesRequestFailed" : "Kan jouw diensten niet laden", 236 "settings.services.servicesRequestFailed" : "Kan jouw services niet laden",
237 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld", 237 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld",
238 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld", 238 "settings.services.tooltip.isMuted" : "Geluid is uitgeschakeld",
239 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld", 239 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld",
240 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen", 240 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen",
241 "settings.team.contentHeadline" : "Franz voor groepen", 241 "settings.team.contentHeadline" : "Franz voor Teams",
242 "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 teamlid apart, vergeet meerdere facturen en verschillende afrekeningsperiodes - één team regeert alles!", 242 "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", 243 "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.", 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. En dat alles vanuit één account.",
245 "settings.team.manageAction" : "Beheer je Team op meetfranz.com", 245 "settings.team.manageAction" : "Beheer je Team op meetfranz.com",
246 "settings.team.upgradeAction" : "Jouw Account opwaarderen", 246 "settings.team.upgradeAction" : "Jouw Account opwaarderen",
247 "settings.user.form.accountType.company" : "Bedrijf", 247 "settings.user.form.accountType.company" : "Bedrijf",
@@ -258,7 +258,7 @@
258 "settings.workspace.form.buttonDelete" : "Verwijder werkruimte", 258 "settings.workspace.form.buttonDelete" : "Verwijder werkruimte",
259 "settings.workspace.form.buttonSave" : "Sla werkruimte op", 259 "settings.workspace.form.buttonSave" : "Sla werkruimte op",
260 "settings.workspace.form.name" : "Naam", 260 "settings.workspace.form.name" : "Naam",
261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Diensten in deze werkruimte", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in deze werkruimte",
262 "settings.workspace.form.yourWorkspaces" : "Jouw werkruimtes", 262 "settings.workspace.form.yourWorkspaces" : "Jouw werkruimtes",
263 "settings.workspaces.deletedInfo" : "Werkruimte is verwijderd", 263 "settings.workspaces.deletedInfo" : "Werkruimte is verwijderd",
264 "settings.workspaces.headline" : "Jouw werkplaatsen", 264 "settings.workspaces.headline" : "Jouw werkplaatsen",
@@ -266,11 +266,11 @@
266 "settings.workspaces.tryReloadWorkspaces" : "Probeer opnieuw", 266 "settings.workspaces.tryReloadWorkspaces" : "Probeer opnieuw",
267 "settings.workspaces.updatedInfo" : "Je wijzigingen zijn opgeslagen", 267 "settings.workspaces.updatedInfo" : "Je wijzigingen zijn opgeslagen",
268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Zie hier Franz Werkruimtes", 268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Zie hier Franz Werkruimtes",
269 "settings.workspaces.workspaceFeatureInfo" : "Franz 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.", 269 "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", 270 "settings.workspaces.workspacesRequestFailed" : "Kan jouw werkruimtes niet laden",
271 "sidebar.addNewService" : "Voeg service toe", 271 "sidebar.addNewService" : "Voeg service toe",
272 "sidebar.closeWorkspaceDrawer" : "Werkruimte pagina sluiten", 272 "sidebar.closeWorkspaceDrawer" : "Werkruimte pagina sluiten",
273 "sidebar.muteApp" : "Schakel berichten & geluid uit", 273 "sidebar.muteApp" : "Berichten & geluid uitschakelen",
274 "sidebar.openWorkspaceDrawer" : "Werkruimte pagina openen", 274 "sidebar.openWorkspaceDrawer" : "Werkruimte pagina openen",
275 "sidebar.settings" : "Instellingen", 275 "sidebar.settings" : "Instellingen",
276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen", 276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen",
@@ -281,18 +281,18 @@
281 "signup.headline" : "Aanmelden", 281 "signup.headline" : "Aanmelden",
282 "signup.lastname.label" : "Achternaam", 282 "signup.lastname.label" : "Achternaam",
283 "signup.legal.info" : "Door een Franz-account aan te maken ga je akkoord met de", 283 "signup.legal.info" : "Door een Franz-account aan te maken ga je akkoord met de",
284 "signup.legal.privacy" : "Privacy Voorwaarden", 284 "signup.legal.privacy" : "Privacyvoorwaarden",
285 "signup.legal.terms" : "Gebruiksvoorwaarden", 285 "signup.legal.terms" : "Gebruiksvoorwaarden",
286 "signup.link.login" : "Al een account? Log in!", 286 "signup.link.login" : "Heb je al een account? Log in!",
287 "signup.password.label" : "Wachtwoord", 287 "signup.password.label" : "Wachtwoord",
288 "signup.submit.label" : "Account aanmaken", 288 "signup.submit.label" : "Account aanmaken",
289 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn", 289 "subscription.euTaxInfo" : "EU-bewoners: lokale belastingen kunnen van toepassing zijn",
290 "subscription.features.ads" : "Geen advertenties, nooit!", 290 "subscription.features.ads" : "Geen advertenties, nooit!",
291 "subscription.features.comingSoon" : "komt binnenkort", 291 "subscription.features.comingSoon" : "Binnenkort",
292 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades", 292 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades",
293 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe", 293 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe",
294 "subscription.features.proxy" : "Proxy understeuning voor diensten", 294 "subscription.features.proxy" : "Proxy understeuning voor services",
295 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck", 295 "subscription.features.spellchecker" : "Ondersteuning voor spellingcontrole",
296 "subscription.features.workspaces" : "Beheer je diensten in de werkruimtes", 296 "subscription.features.workspaces" : "Beheer je diensten in de werkruimtes",
297 "subscription.includedFeatures" : "Betaald Franz Premium Supporter Account bevat", 297 "subscription.includedFeatures" : "Betaald Franz Premium Supporter Account bevat",
298 "subscription.paymentSessionError" : "Kan betaalformulier niet initialiseren", 298 "subscription.paymentSessionError" : "Kan betaalformulier niet initialiseren",
@@ -303,30 +303,30 @@
303 "subscriptionPopup.buttonCancel" : "Annuleer", 303 "subscriptionPopup.buttonCancel" : "Annuleer",
304 "subscriptionPopup.buttonDone" : "Klaar", 304 "subscriptionPopup.buttonDone" : "Klaar",
305 "tabs.item.deleteService" : "Verwijder service", 305 "tabs.item.deleteService" : "Verwijder service",
306 "tabs.item.disableAudio" : "Schakel audio uit", 306 "tabs.item.disableAudio" : "Audio uitschakelen",
307 "tabs.item.disableNotifications" : "Schakel meldingen uit", 307 "tabs.item.disableNotifications" : "Meldingen uitschakelen",
308 "tabs.item.disableService" : "Schakel service uit", 308 "tabs.item.disableService" : "Service uitschakelen",
309 "tabs.item.edit" : "Bewerken", 309 "tabs.item.edit" : "Bewerken",
310 "tabs.item.enableAudio" : "Audio inschakelen", 310 "tabs.item.enableAudio" : "Audio inschakelen",
311 "tabs.item.enableNotification" : "Meldingen inschakelen", 311 "tabs.item.enableNotification" : "Meldingen inschakelen",
312 "tabs.item.enableService" : "Service inschakelen", 312 "tabs.item.enableService" : "Service inschakelen",
313 "tabs.item.reload" : "Herladen", 313 "tabs.item.reload" : "Herladen",
314 "validation.email" : "{field} is niet geldig", 314 "validation.email" : "{field} is niet geldig",
315 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn", 315 "validation.minLength" : "{field} dient minimaal {length} karakters lang te zijn",
316 "validation.oneRequired" : "Er is op zijn minst één vereist", 316 "validation.oneRequired" : "Minstens één vereist",
317 "validation.required" : "{field} is vereist", 317 "validation.required" : "{field} is vereist",
318 "validation.url" : "{field} is niet een geldige URL", 318 "validation.url" : "{field} is geen geldige URL",
319 "welcome.loginButton" : "Log in op je account", 319 "welcome.loginButton" : "Log in op je account",
320 "welcome.signupButton" : "Maak een gratis account", 320 "welcome.signupButton" : "Maak een gratis account",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Voeg een nieuwe werkruimte toe", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Voeg een nieuwe werkruimte toe",
322 "workspaceDrawer.allServices" : "Alle diensten", 322 "workspaceDrawer.allServices" : "Alle services",
323 "workspaceDrawer.headline" : "Werkruimtes", 323 "workspaceDrawer.headline" : "Werkruimtes",
324 "workspaceDrawer.item.contextMenuEdit" : "bewerken", 324 "workspaceDrawer.item.contextMenuEdit" : "bewerken",
325 "workspaceDrawer.item.noServicesAddedYet" : "Nog geen diensten toegevoegd", 325 "workspaceDrawer.item.noServicesAddedYet" : "Nog geen services toegevoegd",
326 "workspaceDrawer.premiumCtaButtonLabel" : "Maak je eerste werkruimte", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Maak je eerste werkruimte",
327 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Premium feature",
328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Heractiveer premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Premium account heractiveren",
329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz 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>", 329 "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", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Werkruimte instellingen aanpassen",
331 "workspaces.switchingIndicator.switchingTo" : "Overschakelen naar" 331 "workspaces.switchingIndicator.switchingTo" : "Overschakelen naar"
332} 332}
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index 3b051e975..bd08d5e4d 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -3,15 +3,15 @@
3 "app.errorHandler.headline" : "Niečo sa pokazilo", 3 "app.errorHandler.headline" : "Niečo sa pokazilo",
4 "feature.announcements.changelog.headline" : "Zmeny vo Franz {version}", 4 "feature.announcements.changelog.headline" : "Zmeny vo Franz {version}",
5 "feature.delayApp.action" : "Získajte licenciu pre Franz podporu", 5 "feature.delayApp.action" : "Získajte licenciu pre Franz podporu",
6 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 6 "feature.delayApp.headline" : "Prosím, p si licenciu Franz Supporter a nebudeš musi čakať",
7 "feature.delayApp.text" : "Franz bude pokračovať v {seconds} seundách.", 7 "feature.delayApp.text" : "Franz bude pokračovať v {seconds} sekundách.",
8 "feature.shareFranz.action.email" : "Odoslať ako e-mail", 8 "feature.shareFranz.action.email" : "Odoslať ako e-mail",
9 "feature.shareFranz.action.facebook" : "Zdielať na Facebook-u", 9 "feature.shareFranz.action.facebook" : "Zdielať na Facebook-u",
10 "feature.shareFranz.action.twitter" : "Zdieľať na Twitter-i", 10 "feature.shareFranz.action.twitter" : "Zdieľať na Twitter-i",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "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", 12 "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", 13 "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 Franz is and help us to spread the word.", 14 "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.",
15 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz", 15 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz",
16 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.", 16 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.",
17 "global.spellchecker.useDefault" : "Použiť predvolené nastavenie systému ({default})", 17 "global.spellchecker.useDefault" : "Použiť predvolené nastavenie systému ({default})",
@@ -92,9 +92,9 @@
92 "menu.window.minimize" : "Minimalizovať", 92 "menu.window.minimize" : "Minimalizovať",
93 "menu.workspaces" : "Pracovný priestor", 93 "menu.workspaces" : "Pracovný priestor",
94 "menu.workspaces.addNewWorkspace" : "Pridať nový pracovný priestor ...", 94 "menu.workspaces.addNewWorkspace" : "Pridať nový pracovný priestor ...",
95 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Zavrieť workspace záložku",
96 "menu.workspaces.defaultWorkspace" : "Všetky služby", 96 "menu.workspaces.defaultWorkspace" : "Všetky služby",
97 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Otvoriť workspace záložku",
98 "password.email.label" : "E-mailová adresa", 98 "password.email.label" : "E-mailová adresa",
99 "password.headline" : "Obnoviť heslo", 99 "password.headline" : "Obnoviť heslo",
100 "password.link.login" : "Prihlásiť sa do vášho účtu", 100 "password.link.login" : "Prihlásiť sa do vášho účtu",
@@ -117,7 +117,7 @@
117 "service.errorHandler.editAction" : "Upraviť {name}", 117 "service.errorHandler.editAction" : "Upraviť {name}",
118 "service.errorHandler.headline" : "Ale nie!", 118 "service.errorHandler.headline" : "Ale nie!",
119 "service.errorHandler.message" : "Chyba", 119 "service.errorHandler.message" : "Chyba",
120 "service.errorHandler.text" : "{name} has failed to load.", 120 "service.errorHandler.text" : "{name} sa nepodarilo načítať.",
121 "service.webviewLoader.loading" : "Načítava", 121 "service.webviewLoader.loading" : "Načítava",
122 "services.getStarted" : "Začíname", 122 "services.getStarted" : "Začíname",
123 "services.welcome" : "Vítajte v aplikácii Franz", 123 "services.welcome" : "Vítajte v aplikácii Franz",
@@ -266,12 +266,12 @@
266 "settings.workspaces.tryReloadWorkspaces" : "Skúsiť znova", 266 "settings.workspaces.tryReloadWorkspaces" : "Skúsiť znova",
267 "settings.workspaces.updatedInfo" : "Vaše zmeny boli uložené", 267 "settings.workspaces.updatedInfo" : "Vaše zmeny boli uložené",
268 "settings.workspaces.workspaceFeatureHeadline" : "Menej je viac: Predstavenie Franz Pracovné priestory", 268 "settings.workspaces.workspaceFeatureHeadline" : "Menej je viac: Predstavenie Franz Pracovné priestory",
269 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 269 "settings.workspaces.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", 270 "settings.workspaces.workspacesRequestFailed" : "Nebolo možné načítať vaše workspace",
271 "sidebar.addNewService" : "Pridať novú službu", 271 "sidebar.addNewService" : "Pridať novú službu",
272 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Zavrieť workspace záložku",
273 "sidebar.muteApp" : "Vypnúť upozornenia a zvuky", 273 "sidebar.muteApp" : "Vypnúť upozornenia a zvuky",
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Otvoriť workspace záložku",
275 "sidebar.settings" : "Nastavenia", 275 "sidebar.settings" : "Nastavenia",
276 "sidebar.unmuteApp" : "Povoliť oznámenia a zvuky", 276 "sidebar.unmuteApp" : "Povoliť oznámenia a zvuky",
277 "signup.company.label" : "Spoločnosť", 277 "signup.company.label" : "Spoločnosť",
@@ -289,11 +289,11 @@
289 "subscription.euTaxInfo" : "Pre obyvateľov EÚ: môže byť aplikovaná miestna daň", 289 "subscription.euTaxInfo" : "Pre obyvateľov EÚ: môže byť aplikovaná miestna daň",
290 "subscription.features.ads" : "Žiadne reklamy, nikdy!", 290 "subscription.features.ads" : "Žiadne reklamy, nikdy!",
291 "subscription.features.comingSoon" : "už čoskoro", 291 "subscription.features.comingSoon" : "už čoskoro",
292 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 292 "subscription.features.noInterruptions" : "Žiadne oneskorenia a obťažovania po aktivovaní licencie",
293 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 293 "subscription.features.onpremise.mattermost" : "Prid on-premise\/hostovanú službu ako Mattermost",
294 "subscription.features.proxy" : "Proxy support for services", 294 "subscription.features.proxy" : "Podpora proxy pre služby",
295 "subscription.features.spellchecker" : "Support for spellchecker", 295 "subscription.features.spellchecker" : "Podpora pre kontrolovanie pravopisných chýb",
296 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Organizujte ve služby vo workspace",
297 "subscription.includedFeatures" : "Platený účet Premium Supporter Franz zahŕňa", 297 "subscription.includedFeatures" : "Platený účet Premium Supporter Franz zahŕňa",
298 "subscription.paymentSessionError" : "Nepodarilo sa inicializovať platbu od", 298 "subscription.paymentSessionError" : "Nepodarilo sa inicializovať platbu od",
299 "subscription.submit.label" : "Chcem podporiť vývoj aplikácie Franz", 299 "subscription.submit.label" : "Chcem podporiť vývoj aplikácie Franz",
@@ -313,20 +313,20 @@
313 "tabs.item.reload" : "Obnoviť", 313 "tabs.item.reload" : "Obnoviť",
314 "validation.email" : "{field} je neplatný", 314 "validation.email" : "{field} je neplatný",
315 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov", 315 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov",
316 "validation.oneRequired" : "At least one is required", 316 "validation.oneRequired" : "Je nutné zadať aspoň jeden",
317 "validation.required" : "{field} je povinné", 317 "validation.required" : "{field} je povinné",
318 "validation.url" : "{field} nie je platné URL", 318 "validation.url" : "{field} nie je platné URL",
319 "welcome.loginButton" : "Prihlásiť sa do vášho účtu", 319 "welcome.loginButton" : "Prihlásiť sa do vášho účtu",
320 "welcome.signupButton" : "Vytvoriť účet zdarma", 320 "welcome.signupButton" : "Vytvoriť účet zdarma",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Prid nový workspace",
322 "workspaceDrawer.allServices" : "Všetky služby", 322 "workspaceDrawer.allServices" : "Všetky služby",
323 "workspaceDrawer.headline" : "Pracovn priestor", 323 "workspaceDrawer.headline" : "Pracovn plochy",
324 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "Upraviť",
325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Zati žiadne služby",
326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Vytvorte váš pr workspace",
327 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Prémiová funkcia",
328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Obnovte svoj prémiový účet",
329 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>", 329 "workspaceDrawer.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", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Upraviť nastavenia workspace",
331 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Prepínanie na"
332} 332}
diff --git a/src/i18n/messages/src/components/settings/team/TeamDashboard.json b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
index 6bccc25ff..0c33fee5f 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": "!!!Franz for Teams", 17 "defaultMessage": "!!!Franz 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": "!!!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!", 43 "defaultMessage": "!!!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!",
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/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/features/todos/components/TodosWebview.json b/src/i18n/messages/src/features/todos/components/TodosWebview.json
index 2387112b4..9cc3325d1 100644
--- a/src/i18n/messages/src/features/todos/components/TodosWebview.json
+++ b/src/i18n/messages/src/features/todos/components/TodosWebview.json
@@ -1,7 +1,7 @@
1[ 1[
2 { 2 {
3 "id": "feature.todos.premium.info", 3 "id": "feature.todos.premium.info",
4 "defaultMessage": "!!!The Franz Todos Preview is currently only available for Franz Premium accounts.", 4 "defaultMessage": "!!!Franz Todos are available to premium users now!",
5 "file": "src/features/todos/components/TodosWebview.js", 5 "file": "src/features/todos/components/TodosWebview.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 18,
@@ -27,7 +27,7 @@
27 }, 27 },
28 { 28 {
29 "id": "feature.todos.premium.rollout", 29 "id": "feature.todos.premium.rollout",
30 "defaultMessage": "!!!Franz Todos will be available to everyone soon.", 30 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
31 "file": "src/features/todos/components/TodosWebview.js", 31 "file": "src/features/todos/components/TodosWebview.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 26,
diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json
index 28001614f..f4fd5b8b0 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/stores/AppStore.js b/src/stores/AppStore.js
index 6054e6721..315235ba4 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -94,6 +94,7 @@ export default class AppStore extends Store {
94 this._offlineCheck.bind(this), 94 this._offlineCheck.bind(this),
95 this._setLocale.bind(this), 95 this._setLocale.bind(this),
96 this._muteAppHandler.bind(this), 96 this._muteAppHandler.bind(this),
97 this._handleFullScreen.bind(this),
97 ]); 98 ]);
98 } 99 }
99 100
@@ -379,6 +380,16 @@ export default class AppStore extends Store {
379 } 380 }
380 } 381 }
381 382
383 _handleFullScreen() {
384 const body = document.querySelector('body');
385
386 if (this.isFullScreen) {
387 body.classList.add('isFullScreen');
388 } else {
389 body.classList.remove('isFullScreen');
390 }
391 }
392
382 // Helpers 393 // Helpers
383 _appStartsCounter() { 394 _appStartsCounter() {
384 this.actions.settings.update({ 395 this.actions.settings.update({
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index 2c785111f..9680c5bcc 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -46,7 +46,6 @@ export default class UIStore extends Store {
46 // Actions 46 // Actions
47 @action _openSettings({ path = '/settings' }) { 47 @action _openSettings({ path = '/settings' }) {
48 const settingsPath = path !== '/settings' ? `/settings/${path}` : path; 48 const settingsPath = path !== '/settings' ? `/settings/${path}` : path;
49 console.log(settingsPath);
50 this.stores.router.push(settingsPath); 49 this.stores.router.push(settingsPath);
51 } 50 }
52 51
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 7ac7d2375..6e6f745c7 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -160,6 +160,10 @@ export default class UserStore extends Store {
160 return !!this.data.isPremium; 160 return !!this.data.isPremium;
161 } 161 }
162 162
163 @computed get isPremiumOverride() {
164 return (!this.team.plan && this.isPremium) || (this.team.state === 'expired' && this.isPremium);
165 }
166
163 @computed get isPersonal() { 167 @computed get isPersonal() {
164 if (!this.team.plan) return false; 168 if (!this.team.plan) return false;
165 const plan = getPlan(this.team.plan); 169 const plan = getPlan(this.team.plan);
@@ -168,12 +172,12 @@ export default class UserStore extends Store {
168 } 172 }
169 173
170 @computed get isPro() { 174 @computed get isPro() {
171 if (!this.team.plan && this.isPremium) return true; 175 if (this.isPremiumOverride) return true;
172 176
173 if (!this.team.plan) return false; 177 if ((!this.team.plan || this.team.state === 'expired')) return false;
174 const plan = getPlan(this.team.plan); 178 const plan = getPlan(this.team.plan);
175 179
176 return plan === PLANS.PRO; 180 return plan === PLANS.PRO || plan === PLANS.LEGACY;
177 } 181 }
178 182
179 @computed get legacyServices() { 183 @computed get legacyServices() {
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index 10027da60..b18bd6dcf 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -32,9 +32,11 @@ 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
35.app { 35body.win32:not(.isFullScreen) .app .app__content {
36 //display: flex; 36 height: calc(100% - 28px);
37}
37 38
39.app {
38 .app__content { 40 .app__content {
39 display: flex; 41 display: flex;
40 width: calc(100% + 300px); 42 width: calc(100% + 300px);
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index 0955aaa0c..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; }
@@ -414,7 +420,13 @@
414 background: $theme-gray-lightest; 420 background: $theme-gray-lightest;
415 flex-direction: column; 421 flex-direction: column;
416 height: auto; 422 height: auto;
417 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);
418 430
419 .settings-navigation__link { 431 .settings-navigation__link {
420 align-items: center; 432 align-items: center;
@@ -426,6 +438,7 @@
426 padding: 0 20px; 438 padding: 0 20px;
427 text-decoration: none; 439 text-decoration: none;
428 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%);
429 442
430 &:hover { 443 &:hover {
431 background: darken($theme-gray-lightest, 5%); 444 background: darken($theme-gray-lightest, 5%);