aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Amine Mouafik <amine@mouafik.fr>2019-08-05 19:06:51 +0700
committerLibravatar Amine Mouafik <amine@mouafik.fr>2019-08-05 19:06:51 +0700
commit19ff9d112fda59d114df1079622a3d365a51c14a (patch)
tree90e3e09e051a96a78ec80cd34363a062eac089a3
parentMention releases in README (diff)
parentbump version to 5.2.1-beta.1 (diff)
downloadferdium-app-19ff9d112fda59d114df1079622a3d365a51c14a.tar.gz
ferdium-app-19ff9d112fda59d114df1079622a3d365a51c14a.tar.zst
ferdium-app-19ff9d112fda59d114df1079622a3d365a51c14a.zip
Merge remote-tracking branch 'upstream/master'
# Conflicts: # src/components/layout/AppLayout.js
-rw-r--r--CHANGELOG.md50
-rw-r--r--package.json2
-rw-r--r--src/components/auth/AuthLayout.js6
-rw-r--r--src/components/layout/AppLayout.js177
-rw-r--r--src/containers/auth/AuthLayoutContainer.js10
-rw-r--r--src/containers/layout/AppLayoutContainer.js1
-rw-r--r--src/containers/settings/SettingsWindow.js35
-rw-r--r--src/features/delayApp/index.js5
-rw-r--r--src/features/delayApp/styles.js1
-rw-r--r--src/features/workspaces/store.js21
-rw-r--r--src/i18n/locales/defaultMessages.json139
-rw-r--r--src/i18n/locales/en-US.json5
-rw-r--r--src/i18n/locales/es.json20
-rw-r--r--src/i18n/locales/fr.json18
-rw-r--r--src/i18n/locales/hu.json24
-rw-r--r--src/i18n/locales/id.json4
-rw-r--r--src/i18n/locales/nl-BE.json102
-rw-r--r--src/i18n/locales/nl.json54
-rw-r--r--src/i18n/locales/pl.json18
-rw-r--r--src/i18n/locales/pt-BR.json22
-rw-r--r--src/i18n/locales/tr.json4
-rw-r--r--src/i18n/messages/src/lib/Menu.json139
-rw-r--r--src/index.html1
-rw-r--r--src/lib/Menu.js40
-rw-r--r--src/stores/AppStore.js27
-rw-r--r--src/stores/UIStore.js30
-rw-r--r--src/stores/lib/Reaction.js6
-rw-r--r--src/styles/reset.scss2
28 files changed, 602 insertions, 361 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 70b77637e..da7a6c608 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,53 @@
1## [5.2.1-beta.1](https://github.com/meetfranz/franz/compare/v5.2.0...v5.2.1-beta.1) (2019-07-30)
2
3
4### Bug Fixes
5
6* **Notifications:** Fix issue that blocked notifications from e.g. Slack ([44c413b](https://github.com/meetfranz/franz/commit/44c413b))
7
8
9### Features
10
11* **App:** Add option to copy debug information via the help menu ([4666e85](https://github.com/meetfranz/franz/commit/4666e85))
12
13
14
15# [5.2.0](https://github.com/meetfranz/franz/compare/v5.2.0-beta.4...v5.2.0) (2019-07-19)
16
17### Features
18* **Service:** You can now add any custom website 🥳
19
20### Bug Fixes
21
22* **Notifications:** Don't show notification badges when app is muted ([e844a64](https://github.com/meetfranz/franz/commit/e844a64))
23* **Settings:** Fix position of settings window
24* **Recipes:** Fix recipe install when directly accessing recipe e.g. via url ([eba50bc](https://github.com/meetfranz/franz/commit/eba50bc))
25* **Proxy:** Fix issue with service proxy authentication ([b9e5b23](https://github.com/meetfranz/franz/commit/b9e5b23))
26* **Announcements:** Fix issue with rendering announcements in workspaces ([1e38ec5](https://github.com/meetfranz/franz/commit/1e38ec5))
27* **Windows:** Add Workspaces menu & fix Window menu ([92a61d4](https://github.com/meetfranz/franz/commit/92a61d4))
28* **Windows:** Replace tray icon with high-res version ([a5eb399](https://github.com/meetfranz/franz/commit/a5eb399))
29* **Workspaces:** Fix service reordering within workspaces ([17f3a22](https://github.com/meetfranz/franz/commit/17f3a22))
30* **Workspaces:** Fix issue with service visibility after downgrade ([05294](https://github.com/meetfranz/franz/commit/05294))
31
32### General
33* **App:** Improved email validation ([dd8ddcc](https://github.com/meetfranz/franz/commit/dd8ddcc)) ([@Snuggle](https://github.com/Snuggle))
34* **App:** Update electron to 4.2.4 ([404c87a](https://github.com/meetfranz/franz/commit/404c87a))
35* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
36
37
38# [5.2.0-beta.4](https://github.com/meetfranz/franz/compare/v5.2.0-beta.3...v5.2.0-beta.4) (2019-07-01)
39
40
41### Bug Fixes
42
43* **Notifications:** Don't show notification badges when app is muted ([e844a64](https://github.com/meetfranz/franz/commit/e844a64))
44* **Settings:** Fix position of settings window
45
46### General
47
48* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
49
50
1# [5.2.0-beta.3](https://github.com/meetfranz/franz/compare/v5.2.0-beta.2...v5.2.0-beta.3) (2019-06-24) 51# [5.2.0-beta.3](https://github.com/meetfranz/franz/compare/v5.2.0-beta.2...v5.2.0-beta.3) (2019-06-24)
2 52
3### General 53### General
diff --git a/package.json b/package.json
index 517dd1c6f..639d078a0 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
2 "name": "franz", 2 "name": "franz",
3 "productName": "Franz", 3 "productName": "Franz",
4 "appId": "com.meetfranz.franz", 4 "appId": "com.meetfranz.franz",
5 "version": "5.2.0-beta.3", 5 "version": "5.2.1-beta.1",
6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.", 6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.",
7 "copyright": "adlk x franz - Stefan Malzner", 7 "copyright": "adlk x franz - Stefan Malzner",
8 "main": "index.js", 8 "main": "index.js",
diff --git a/src/components/auth/AuthLayout.js b/src/components/auth/AuthLayout.js
index 3d43d4e5c..75a8cfc61 100644
--- a/src/components/auth/AuthLayout.js
+++ b/src/components/auth/AuthLayout.js
@@ -22,7 +22,6 @@ export default @observer class AuthLayout extends Component {
22 retryHealthCheck: PropTypes.func.isRequired, 22 retryHealthCheck: PropTypes.func.isRequired,
23 isHealthCheckLoading: PropTypes.bool.isRequired, 23 isHealthCheckLoading: PropTypes.bool.isRequired,
24 isFullScreen: PropTypes.bool.isRequired, 24 isFullScreen: PropTypes.bool.isRequired,
25 darkMode: PropTypes.bool.isRequired,
26 nextAppReleaseVersion: PropTypes.string, 25 nextAppReleaseVersion: PropTypes.string,
27 installAppUpdate: PropTypes.func.isRequired, 26 installAppUpdate: PropTypes.func.isRequired,
28 appUpdateIsDownloaded: PropTypes.bool.isRequired, 27 appUpdateIsDownloaded: PropTypes.bool.isRequired,
@@ -45,7 +44,6 @@ export default @observer class AuthLayout extends Component {
45 retryHealthCheck, 44 retryHealthCheck,
46 isHealthCheckLoading, 45 isHealthCheckLoading,
47 isFullScreen, 46 isFullScreen,
48 darkMode,
49 nextAppReleaseVersion, 47 nextAppReleaseVersion,
50 installAppUpdate, 48 installAppUpdate,
51 appUpdateIsDownloaded, 49 appUpdateIsDownloaded,
@@ -53,7 +51,7 @@ export default @observer class AuthLayout extends Component {
53 const { intl } = this.context; 51 const { intl } = this.context;
54 52
55 return ( 53 return (
56 <div className={darkMode ? 'theme__dark' : ''}> 54 <>
57 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />} 55 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />}
58 <div className="auth"> 56 <div className="auth">
59 {!isOnline && ( 57 {!isOnline && (
@@ -93,7 +91,7 @@ export default @observer class AuthLayout extends Component {
93 <img src="./assets/images/adlk.svg" alt="" /> 91 <img src="./assets/images/adlk.svg" alt="" />
94 </Link> 92 </Link>
95 </div> 93 </div>
96 </div> 94 </>
97 ); 95 );
98 } 96 }
99} 97}
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 3372947cd..5edf96523 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -1,21 +1,21 @@
1import React, { Component } from 'react'; 1import React, { Component } from "react";
2import PropTypes from 'prop-types'; 2import PropTypes from "prop-types";
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from "mobx-react";
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from "react-intl";
5import { TitleBar } from 'electron-react-titlebar'; 5import { TitleBar } from "electron-react-titlebar";
6import injectSheet from 'react-jss'; 6import injectSheet from "react-jss";
7 7
8import InfoBar from '../ui/InfoBar'; 8import InfoBar from "../ui/InfoBar";
9import { Component as BasicAuth } from '../../features/basicAuth'; 9import { Component as BasicAuth } from "../../features/basicAuth";
10import { Component as ShareFranz } from '../../features/shareFranz'; 10import { Component as ShareFranz } from "../../features/shareFranz";
11import ErrorBoundary from '../util/ErrorBoundary'; 11import ErrorBoundary from "../util/ErrorBoundary";
12 12
13// import globalMessages from '../../i18n/globalMessages'; 13// import globalMessages from '../../i18n/globalMessages';
14 14
15import { isWindows } from '../../environment'; 15import { isWindows } from "../../environment";
16import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; 16import WorkspaceSwitchingIndicator from "../../features/workspaces/components/WorkspaceSwitchingIndicator";
17import { workspaceStore } from '../../features/workspaces'; 17import { workspaceStore } from "../../features/workspaces";
18import AppUpdateInfoBar from '../AppUpdateInfoBar'; 18import AppUpdateInfoBar from "../AppUpdateInfoBar";
19 19
20function createMarkup(HTMLString) { 20function createMarkup(HTMLString) {
21 return { __html: HTMLString }; 21 return { __html: HTMLString };
@@ -23,30 +23,33 @@ function createMarkup(HTMLString) {
23 23
24const messages = defineMessages({ 24const messages = defineMessages({
25 servicesUpdated: { 25 servicesUpdated: {
26 id: 'infobar.servicesUpdated', 26 id: "infobar.servicesUpdated",
27 defaultMessage: '!!!Your services have been updated.', 27 defaultMessage: "!!!Your services have been updated."
28 }, 28 },
29 buttonReloadServices: { 29 buttonReloadServices: {
30 id: 'infobar.buttonReloadServices', 30 id: "infobar.buttonReloadServices",
31 defaultMessage: '!!!Reload services', 31 defaultMessage: "!!!Reload services"
32 }, 32 },
33 requiredRequestsFailed: { 33 requiredRequestsFailed: {
34 id: 'infobar.requiredRequestsFailed', 34 id: "infobar.requiredRequestsFailed",
35 defaultMessage: '!!!Could not load services and user information', 35 defaultMessage: "!!!Could not load services and user information"
36 }, 36 }
37}); 37});
38 38
39const styles = theme => ({ 39const styles = theme => ({
40 appContent: { 40 appContent: {
41 width: `calc(100% + ${theme.workspaces.drawer.width}px)`, 41 width: `calc(100% + ${theme.workspaces.drawer.width}px)`,
42 transition: 'transform 0.5s ease', 42 transition: "transform 0.5s ease",
43 transform() { 43 transform() {
44 return workspaceStore.isWorkspaceDrawerOpen ? 'translateX(0)' : `translateX(-${theme.workspaces.drawer.width}px)`; 44 return workspaceStore.isWorkspaceDrawerOpen
45 }, 45 ? "translateX(0)"
46 }, 46 : `translateX(-${theme.workspaces.drawer.width}px)`;
47 }
48 }
47}); 49});
48 50
49@injectSheet(styles) @observer 51@injectSheet(styles)
52@observer
50class AppLayout extends Component { 53class AppLayout extends Component {
51 static propTypes = { 54 static propTypes = {
52 classes: PropTypes.object.isRequired, 55 classes: PropTypes.object.isRequired,
@@ -66,17 +69,16 @@ class AppLayout extends Component {
66 showRequiredRequestsError: PropTypes.bool.isRequired, 69 showRequiredRequestsError: PropTypes.bool.isRequired,
67 areRequiredRequestsSuccessful: PropTypes.bool.isRequired, 70 areRequiredRequestsSuccessful: PropTypes.bool.isRequired,
68 retryRequiredRequests: PropTypes.func.isRequired, 71 retryRequiredRequests: PropTypes.func.isRequired,
69 areRequiredRequestsLoading: PropTypes.bool.isRequired, 72 areRequiredRequestsLoading: PropTypes.bool.isRequired
70 darkMode: PropTypes.bool.isRequired,
71 }; 73 };
72 74
73 static defaultProps = { 75 static defaultProps = {
74 children: [], 76 children: [],
75 nextAppReleaseVersion: null, 77 nextAppReleaseVersion: null
76 }; 78 };
77 79
78 static contextTypes = { 80 static contextTypes = {
79 intl: intlShape, 81 intl: intlShape
80 }; 82 };
81 83
82 render() { 84 render() {
@@ -98,23 +100,27 @@ class AppLayout extends Component {
98 showRequiredRequestsError, 100 showRequiredRequestsError,
99 areRequiredRequestsSuccessful, 101 areRequiredRequestsSuccessful,
100 retryRequiredRequests, 102 retryRequiredRequests,
101 areRequiredRequestsLoading, 103 areRequiredRequestsLoading
102 darkMode,
103 } = this.props; 104 } = this.props;
104 105
105 const { intl } = this.context; 106 const { intl } = this.context;
106 107
107 return ( 108 return (
108 <ErrorBoundary> 109 <ErrorBoundary>
109 <div className={darkMode ? 'theme__dark' : ''}> 110 <div className="app">
110 <div className="app"> 111 {isWindows && !isFullScreen && (
111 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />} 112 <TitleBar
112 <div className={`app__content ${classes.appContent}`}> 113 menu={window.franz.menu.template}
113 {workspacesDrawer} 114 icon="assets/images/logo.svg"
114 {sidebar} 115 />
115 <div className="app__service"> 116 )}
116 <WorkspaceSwitchingIndicator /> 117 <div className={`app__content ${classes.appContent}`}>
117 {news.length > 0 && news.map(item => ( 118 {workspacesDrawer}
119 {sidebar}
120 <div className="app__service">
121 <WorkspaceSwitchingIndicator />
122 {news.length > 0 &&
123 news.map(item => (
118 <InfoBar 124 <InfoBar
119 key={item.id} 125 key={item.id}
120 position="top" 126 position="top"
@@ -122,52 +128,53 @@ class AppLayout extends Component {
122 sticky={item.sticky} 128 sticky={item.sticky}
123 onHide={() => removeNewsItem({ newsId: item.id })} 129 onHide={() => removeNewsItem({ newsId: item.id })}
124 > 130 >
125 <span dangerouslySetInnerHTML={createMarkup(item.message)} /> 131 <span
132 dangerouslySetInnerHTML={createMarkup(item.message)}
133 />
126 </InfoBar> 134 </InfoBar>
127 ))} 135 ))}
128 {/* {!isOnline && ( 136 {/* {!isOnline && (
129 <InfoBar 137 <InfoBar
130 type="danger" 138 type="danger"
131 sticky 139 sticky
132 > 140 >
133 <span className="mdi mdi-flash" /> 141 <span className="mdi mdi-flash" />
134 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 142 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
135 </InfoBar> 143 </InfoBar>
136 )} */} 144 )} */}
137 {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( 145 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
138 <InfoBar 146 <InfoBar
139 type="danger" 147 type="danger"
140 ctaLabel="Try again" 148 ctaLabel="Try again"
141 ctaLoading={areRequiredRequestsLoading} 149 ctaLoading={areRequiredRequestsLoading}
142 sticky 150 sticky
143 onClick={retryRequiredRequests} 151 onClick={retryRequiredRequests}
144 > 152 >
145 <span className="mdi mdi-flash" /> 153 <span className="mdi mdi-flash" />
146 {intl.formatMessage(messages.requiredRequestsFailed)} 154 {intl.formatMessage(messages.requiredRequestsFailed)}
147 </InfoBar> 155 </InfoBar>
148 )} 156 )}
149 {showServicesUpdatedInfoBar && ( 157 {showServicesUpdatedInfoBar && (
150 <InfoBar 158 <InfoBar
151 type="primary" 159 type="primary"
152 ctaLabel={intl.formatMessage(messages.buttonReloadServices)} 160 ctaLabel={intl.formatMessage(messages.buttonReloadServices)}
153 onClick={reloadServicesAfterUpdate} 161 onClick={reloadServicesAfterUpdate}
154 sticky 162 sticky
155 > 163 >
156 <span className="mdi mdi-power-plug" /> 164 <span className="mdi mdi-power-plug" />
157 {intl.formatMessage(messages.servicesUpdated)} 165 {intl.formatMessage(messages.servicesUpdated)}
158 </InfoBar> 166 </InfoBar>
159 )} 167 )}
160 {appUpdateIsDownloaded && ( 168 {appUpdateIsDownloaded && (
161 <AppUpdateInfoBar 169 <AppUpdateInfoBar
162 nextAppReleaseVersion={nextAppReleaseVersion} 170 nextAppReleaseVersion={nextAppReleaseVersion}
163 onInstallUpdate={installAppUpdate} 171 onInstallUpdate={installAppUpdate}
164 /> 172 />
165 )} 173 )}
166 <BasicAuth /> 174 <BasicAuth />
167 <ShareFranz /> 175 <ShareFranz />
168 {services} 176 {services}
169 {children} 177 {children}
170 </div>
171 </div> 178 </div>
172 </div> 179 </div>
173 </div> 180 </div>
diff --git a/src/containers/auth/AuthLayoutContainer.js b/src/containers/auth/AuthLayoutContainer.js
index 1f9c1ea61..427054d3d 100644
--- a/src/containers/auth/AuthLayoutContainer.js
+++ b/src/containers/auth/AuthLayoutContainer.js
@@ -2,7 +2,6 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4import { ThemeProvider } from 'react-jss'; 4import { ThemeProvider } from 'react-jss';
5import { theme } from '@meetfranz/theme';
6 5
7import AuthLayout from '../../components/auth/AuthLayout'; 6import AuthLayout from '../../components/auth/AuthLayout';
8import AppStore from '../../stores/AppStore'; 7import AppStore from '../../stores/AppStore';
@@ -24,24 +23,22 @@ export default @inject('stores', 'actions') @observer class AuthLayoutContainer
24 stores, actions, children, location, 23 stores, actions, children, location,
25 } = this.props; 24 } = this.props;
26 const { 25 const {
27 app, features, globalError, settings, 26 app, features, globalError,
28 } = stores; 27 } = stores;
29 28
30 const isLoadingBaseFeatures = features.defaultFeaturesRequest.isExecuting 29 const isLoadingBaseFeatures = features.defaultFeaturesRequest.isExecuting
31 && !features.defaultFeaturesRequest.wasExecuted; 30 && !features.defaultFeaturesRequest.wasExecuted;
32 31
33 const themeType = theme(settings.app.darkMode ? 'dark' : 'default');
34
35 if (isLoadingBaseFeatures) { 32 if (isLoadingBaseFeatures) {
36 return ( 33 return (
37 <ThemeProvider theme={theme(themeType)}> 34 <ThemeProvider theme={stores.ui.theme}>
38 <AppLoader /> 35 <AppLoader />
39 </ThemeProvider> 36 </ThemeProvider>
40 ); 37 );
41 } 38 }
42 39
43 return ( 40 return (
44 <ThemeProvider theme={theme(themeType)}> 41 <ThemeProvider theme={stores.ui.theme}>
45 <AuthLayout 42 <AuthLayout
46 error={globalError.response} 43 error={globalError.response}
47 pathname={location.pathname} 44 pathname={location.pathname}
@@ -50,7 +47,6 @@ export default @inject('stores', 'actions') @observer class AuthLayoutContainer
50 retryHealthCheck={actions.app.healthCheck} 47 retryHealthCheck={actions.app.healthCheck}
51 isHealthCheckLoading={app.healthCheckRequest.isExecuting} 48 isHealthCheckLoading={app.healthCheckRequest.isExecuting}
52 isFullScreen={app.isFullScreen} 49 isFullScreen={app.isFullScreen}
53 darkMode={app.isSystemDarkModeEnabled}
54 installAppUpdate={actions.app.installUpdate} 50 installAppUpdate={actions.app.installUpdate}
55 nextAppReleaseVersion={app.nextAppReleaseVersion} 51 nextAppReleaseVersion={app.nextAppReleaseVersion}
56 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED} 52 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED}
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index d290a6094..cf3da71e8 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -148,7 +148,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
148 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful} 148 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful}
149 retryRequiredRequests={retryRequiredRequests} 149 retryRequiredRequests={retryRequiredRequests}
150 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 150 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
151 darkMode={settings.all.app.darkMode}
152 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} 151 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
153 > 152 >
154 {React.Children.count(children) > 0 ? children : null} 153 {React.Children.count(children) > 0 ? children : null}
diff --git a/src/containers/settings/SettingsWindow.js b/src/containers/settings/SettingsWindow.js
index 663b9e2e4..440d32a46 100644
--- a/src/containers/settings/SettingsWindow.js
+++ b/src/containers/settings/SettingsWindow.js
@@ -1,4 +1,5 @@
1import React, { Component } from 'react'; 1import React, { Component } from 'react';
2import ReactDOM from 'react-dom';
2import PropTypes from 'prop-types'; 3import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react'; 4import { observer, inject } from 'mobx-react';
4 5
@@ -10,10 +11,23 @@ import ErrorBoundary from '../../components/util/ErrorBoundary';
10import { workspaceStore } from '../../features/workspaces'; 11import { workspaceStore } from '../../features/workspaces';
11 12
12export default @inject('stores', 'actions') @observer class SettingsContainer extends Component { 13export default @inject('stores', 'actions') @observer class SettingsContainer extends Component {
14 portalRoot = document.querySelector('#portalContainer');
15
16 el = document.createElement('div');
17
18 componentDidMount() {
19 this.portalRoot.appendChild(this.el);
20 }
21
22 componentWillUnmount() {
23 this.portalRoot.removeChild(this.el);
24 }
25
13 render() { 26 render() {
14 const { children, stores } = this.props; 27 const { children, stores } = this.props;
15 const { closeSettings } = this.props.actions.ui; 28 const { closeSettings } = this.props.actions.ui;
16 29
30
17 const navigation = ( 31 const navigation = (
18 <Navigation 32 <Navigation
19 serviceCount={stores.services.all.length} 33 serviceCount={stores.services.all.length}
@@ -21,15 +35,18 @@ export default @inject('stores', 'actions') @observer class SettingsContainer ex
21 /> 35 />
22 ); 36 );
23 37
24 return ( 38 return ReactDOM.createPortal(
25 <ErrorBoundary> 39 (
26 <Layout 40 <ErrorBoundary>
27 navigation={navigation} 41 <Layout
28 closeSettings={closeSettings} 42 navigation={navigation}
29 > 43 closeSettings={closeSettings}
30 {children} 44 >
31 </Layout> 45 {children}
32 </ErrorBoundary> 46 </Layout>
47 </ErrorBoundary>
48 ),
49 this.el,
33 ); 50 );
34 } 51 }
35} 52}
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index 67f0fc5e6..39fae3b20 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -33,7 +33,7 @@ export default function init(stores) {
33 }; 33 };
34 34
35 reaction( 35 reaction(
36 () => stores.user.isLoggedIn && stores.features.features.needToWaitToProceed && !stores.user.data.isPremium, 36 () => stores.user.isLoggedIn && stores.services.allServicesRequest.wasExecuted && stores.features.features.needToWaitToProceed && !stores.user.data.isPremium,
37 (isEnabled) => { 37 (isEnabled) => {
38 if (isEnabled) { 38 if (isEnabled) {
39 debug('Enabling `delayApp` feature'); 39 debug('Enabling `delayApp` feature');
@@ -45,6 +45,7 @@ export default function init(stores) {
45 45
46 autorun(() => { 46 autorun(() => {
47 if (stores.services.all.length === 0) { 47 if (stores.services.all.length === 0) {
48 debug('seas', stores.services.all.length);
48 shownAfterLaunch = true; 49 shownAfterLaunch = true;
49 return; 50 return;
50 } 51 }
@@ -64,7 +65,7 @@ export default function init(stores) {
64 debug('Resetting app delay'); 65 debug('Resetting app delay');
65 66
66 setVisibility(false); 67 setVisibility(false);
67 }, DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait + 1000); // timer needs to be able to hit 0 68 }, config.delayDuration + 1000); // timer needs to be able to hit 0
68 } 69 }
69 }); 70 });
70 } else { 71 } else {
diff --git a/src/features/delayApp/styles.js b/src/features/delayApp/styles.js
index 5c214cfdf..69c3c7a27 100644
--- a/src/features/delayApp/styles.js
+++ b/src/features/delayApp/styles.js
@@ -1,7 +1,6 @@
1export default theme => ({ 1export default theme => ({
2 container: { 2 container: {
3 background: theme.colorBackground, 3 background: theme.colorBackground,
4 position: 'absolute',
5 top: 0, 4 top: 0,
6 width: '100%', 5 width: '100%',
7 display: 'flex', 6 display: 'flex',
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index 07b16ff23..a82f6895c 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -79,7 +79,7 @@ export default class WorkspacesStore extends FeatureStore {
79 79
80 // ========== PUBLIC API ========= // 80 // ========== PUBLIC API ========= //
81 81
82 start(stores, actions) { 82 @action start(stores, actions) {
83 debug('WorkspacesStore::start'); 83 debug('WorkspacesStore::start');
84 this.stores = stores; 84 this.stores = stores;
85 this.actions = actions; 85 this.actions = actions;
@@ -104,7 +104,7 @@ export default class WorkspacesStore extends FeatureStore {
104 // REACTIONS 104 // REACTIONS
105 105
106 this._freeUserReactions = createReactions([ 106 this._freeUserReactions = createReactions([
107 this._stopPremiumActionsAndReactions, 107 this._disablePremiumFeatures,
108 this._openDrawerWithSettingsReaction, 108 this._openDrawerWithSettingsReaction,
109 this._setFeatureEnabledReaction, 109 this._setFeatureEnabledReaction,
110 this._setIsPremiumFeatureReaction, 110 this._setIsPremiumFeatureReaction,
@@ -123,10 +123,7 @@ export default class WorkspacesStore extends FeatureStore {
123 this.isFeatureActive = true; 123 this.isFeatureActive = true;
124 } 124 }
125 125
126 stop() { 126 @action reset() {
127 super.stop();
128 debug('WorkspacesStore::stop');
129 this.isFeatureActive = false;
130 this.activeWorkspace = null; 127 this.activeWorkspace = null;
131 this.nextWorkspace = null; 128 this.nextWorkspace = null;
132 this.workspaceBeingEdited = null; 129 this.workspaceBeingEdited = null;
@@ -134,6 +131,13 @@ export default class WorkspacesStore extends FeatureStore {
134 this.isWorkspaceDrawerOpen = false; 131 this.isWorkspaceDrawerOpen = false;
135 } 132 }
136 133
134 @action stop() {
135 super.stop();
136 debug('WorkspacesStore::stop');
137 this.reset();
138 this.isFeatureActive = false;
139 }
140
137 filterServicesByActiveWorkspace = (services) => { 141 filterServicesByActiveWorkspace = (services) => {
138 const { activeWorkspace, isFeatureActive } = this; 142 const { activeWorkspace, isFeatureActive } = this;
139 if (isFeatureActive && activeWorkspace) { 143 if (isFeatureActive && activeWorkspace) {
@@ -281,6 +285,7 @@ export default class WorkspacesStore extends FeatureStore {
281 }; 285 };
282 286
283 _activateLastUsedWorkspaceReaction = () => { 287 _activateLastUsedWorkspaceReaction = () => {
288 debug('_activateLastUsedWorkspaceReaction');
284 if (!this.activeWorkspace && this.userHasWorkspaces) { 289 if (!this.activeWorkspace && this.userHasWorkspaces) {
285 const { lastActiveWorkspace } = this.settings; 290 const { lastActiveWorkspace } = this.settings;
286 if (lastActiveWorkspace) { 291 if (lastActiveWorkspace) {
@@ -324,10 +329,12 @@ export default class WorkspacesStore extends FeatureStore {
324 }); 329 });
325 }; 330 };
326 331
327 _stopPremiumActionsAndReactions = () => { 332 _disablePremiumFeatures = () => {
328 if (!this.isUserAllowedToUseFeature) { 333 if (!this.isUserAllowedToUseFeature) {
334 debug('_disablePremiumFeatures');
329 this._stopActions(this._premiumUserActions); 335 this._stopActions(this._premiumUserActions);
330 this._stopReactions(this._premiumUserReactions); 336 this._stopReactions(this._premiumUserReactions);
337 this.reset();
331 } else { 338 } else {
332 this._startActions(this._premiumUserActions); 339 this._startActions(this._premiumUserActions);
333 this._startReactions(this._premiumUserReactions); 340 this._startReactions(this._premiumUserReactions);
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index d517b456b..eca3062c2 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -4291,328 +4291,367 @@
4291 } 4291 }
4292 }, 4292 },
4293 { 4293 {
4294 "defaultMessage": "!!!Terms of Service", 4294 "defaultMessage": "!!!Copy Debug Information",
4295 "end": { 4295 "end": {
4296 "column": 3, 4296 "column": 3,
4297 "line": 134 4297 "line": 134
4298 }, 4298 },
4299 "file": "src/lib/Menu.js", 4299 "file": "src/lib/Menu.js",
4300 "id": "menu.help.debugInfo",
4301 "start": {
4302 "column": 13,
4303 "line": 131
4304 }
4305 },
4306 {
4307 "defaultMessage": "!!!Franz Debug Information",
4308 "end": {
4309 "column": 3,
4310 "line": 138
4311 },
4312 "file": "src/lib/Menu.js",
4313 "id": "menu.help.debugInfoCopiedHeadline",
4314 "start": {
4315 "column": 27,
4316 "line": 135
4317 }
4318 },
4319 {
4320 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
4321 "end": {
4322 "column": 3,
4323 "line": 142
4324 },
4325 "file": "src/lib/Menu.js",
4326 "id": "menu.help.debugInfoCopiedBody",
4327 "start": {
4328 "column": 23,
4329 "line": 139
4330 }
4331 },
4332 {
4333 "defaultMessage": "!!!Terms of Service",
4334 "end": {
4335 "column": 3,
4336 "line": 146
4337 },
4338 "file": "src/lib/Menu.js",
4300 "id": "menu.help.tos", 4339 "id": "menu.help.tos",
4301 "start": { 4340 "start": {
4302 "column": 7, 4341 "column": 7,
4303 "line": 131 4342 "line": 143
4304 } 4343 }
4305 }, 4344 },
4306 { 4345 {
4307 "defaultMessage": "!!!Privacy Statement", 4346 "defaultMessage": "!!!Privacy Statement",
4308 "end": { 4347 "end": {
4309 "column": 3, 4348 "column": 3,
4310 "line": 138 4349 "line": 150
4311 }, 4350 },
4312 "file": "src/lib/Menu.js", 4351 "file": "src/lib/Menu.js",
4313 "id": "menu.help.privacy", 4352 "id": "menu.help.privacy",
4314 "start": { 4353 "start": {
4315 "column": 11, 4354 "column": 11,
4316 "line": 135 4355 "line": 147
4317 } 4356 }
4318 }, 4357 },
4319 { 4358 {
4320 "defaultMessage": "!!!File", 4359 "defaultMessage": "!!!File",
4321 "end": { 4360 "end": {
4322 "column": 3, 4361 "column": 3,
4323 "line": 142 4362 "line": 154
4324 }, 4363 },
4325 "file": "src/lib/Menu.js", 4364 "file": "src/lib/Menu.js",
4326 "id": "menu.file", 4365 "id": "menu.file",
4327 "start": { 4366 "start": {
4328 "column": 8, 4367 "column": 8,
4329 "line": 139 4368 "line": 151
4330 } 4369 }
4331 }, 4370 },
4332 { 4371 {
4333 "defaultMessage": "!!!View", 4372 "defaultMessage": "!!!View",
4334 "end": { 4373 "end": {
4335 "column": 3, 4374 "column": 3,
4336 "line": 146 4375 "line": 158
4337 }, 4376 },
4338 "file": "src/lib/Menu.js", 4377 "file": "src/lib/Menu.js",
4339 "id": "menu.view", 4378 "id": "menu.view",
4340 "start": { 4379 "start": {
4341 "column": 8, 4380 "column": 8,
4342 "line": 143 4381 "line": 155
4343 } 4382 }
4344 }, 4383 },
4345 { 4384 {
4346 "defaultMessage": "!!!Services", 4385 "defaultMessage": "!!!Services",
4347 "end": { 4386 "end": {
4348 "column": 3, 4387 "column": 3,
4349 "line": 150 4388 "line": 162
4350 }, 4389 },
4351 "file": "src/lib/Menu.js", 4390 "file": "src/lib/Menu.js",
4352 "id": "menu.services", 4391 "id": "menu.services",
4353 "start": { 4392 "start": {
4354 "column": 12, 4393 "column": 12,
4355 "line": 147 4394 "line": 159
4356 } 4395 }
4357 }, 4396 },
4358 { 4397 {
4359 "defaultMessage": "!!!Window", 4398 "defaultMessage": "!!!Window",
4360 "end": { 4399 "end": {
4361 "column": 3, 4400 "column": 3,
4362 "line": 154 4401 "line": 166
4363 }, 4402 },
4364 "file": "src/lib/Menu.js", 4403 "file": "src/lib/Menu.js",
4365 "id": "menu.window", 4404 "id": "menu.window",
4366 "start": { 4405 "start": {
4367 "column": 10, 4406 "column": 10,
4368 "line": 151 4407 "line": 163
4369 } 4408 }
4370 }, 4409 },
4371 { 4410 {
4372 "defaultMessage": "!!!Help", 4411 "defaultMessage": "!!!Help",
4373 "end": { 4412 "end": {
4374 "column": 3, 4413 "column": 3,
4375 "line": 158 4414 "line": 170
4376 }, 4415 },
4377 "file": "src/lib/Menu.js", 4416 "file": "src/lib/Menu.js",
4378 "id": "menu.help", 4417 "id": "menu.help",
4379 "start": { 4418 "start": {
4380 "column": 8, 4419 "column": 8,
4381 "line": 155 4420 "line": 167
4382 } 4421 }
4383 }, 4422 },
4384 { 4423 {
4385 "defaultMessage": "!!!About Franz", 4424 "defaultMessage": "!!!About Franz",
4386 "end": { 4425 "end": {
4387 "column": 3, 4426 "column": 3,
4388 "line": 162 4427 "line": 174
4389 }, 4428 },
4390 "file": "src/lib/Menu.js", 4429 "file": "src/lib/Menu.js",
4391 "id": "menu.app.about", 4430 "id": "menu.app.about",
4392 "start": { 4431 "start": {
4393 "column": 9, 4432 "column": 9,
4394 "line": 159 4433 "line": 171
4395 } 4434 }
4396 }, 4435 },
4397 { 4436 {
4398 "defaultMessage": "!!!What's new?", 4437 "defaultMessage": "!!!What's new?",
4399 "end": { 4438 "end": {
4400 "column": 3, 4439 "column": 3,
4401 "line": 166 4440 "line": 178
4402 }, 4441 },
4403 "file": "src/lib/Menu.js", 4442 "file": "src/lib/Menu.js",
4404 "id": "menu.app.announcement", 4443 "id": "menu.app.announcement",
4405 "start": { 4444 "start": {
4406 "column": 16, 4445 "column": 16,
4407 "line": 163 4446 "line": 175
4408 } 4447 }
4409 }, 4448 },
4410 { 4449 {
4411 "defaultMessage": "!!!Settings", 4450 "defaultMessage": "!!!Settings",
4412 "end": { 4451 "end": {
4413 "column": 3, 4452 "column": 3,
4414 "line": 170 4453 "line": 182
4415 }, 4454 },
4416 "file": "src/lib/Menu.js", 4455 "file": "src/lib/Menu.js",
4417 "id": "menu.app.settings", 4456 "id": "menu.app.settings",
4418 "start": { 4457 "start": {
4419 "column": 12, 4458 "column": 12,
4420 "line": 167 4459 "line": 179
4421 } 4460 }
4422 }, 4461 },
4423 { 4462 {
4424 "defaultMessage": "!!!Check for updates", 4463 "defaultMessage": "!!!Check for updates",
4425 "end": { 4464 "end": {
4426 "column": 3, 4465 "column": 3,
4427 "line": 174 4466 "line": 186
4428 }, 4467 },
4429 "file": "src/lib/Menu.js", 4468 "file": "src/lib/Menu.js",
4430 "id": "menu.app.checkForUpdates", 4469 "id": "menu.app.checkForUpdates",
4431 "start": { 4470 "start": {
4432 "column": 19, 4471 "column": 19,
4433 "line": 171 4472 "line": 183
4434 } 4473 }
4435 }, 4474 },
4436 { 4475 {
4437 "defaultMessage": "!!!Hide", 4476 "defaultMessage": "!!!Hide",
4438 "end": { 4477 "end": {
4439 "column": 3, 4478 "column": 3,
4440 "line": 178 4479 "line": 190
4441 }, 4480 },
4442 "file": "src/lib/Menu.js", 4481 "file": "src/lib/Menu.js",
4443 "id": "menu.app.hide", 4482 "id": "menu.app.hide",
4444 "start": { 4483 "start": {
4445 "column": 8, 4484 "column": 8,
4446 "line": 175 4485 "line": 187
4447 } 4486 }
4448 }, 4487 },
4449 { 4488 {
4450 "defaultMessage": "!!!Hide Others", 4489 "defaultMessage": "!!!Hide Others",
4451 "end": { 4490 "end": {
4452 "column": 3, 4491 "column": 3,
4453 "line": 182 4492 "line": 194
4454 }, 4493 },
4455 "file": "src/lib/Menu.js", 4494 "file": "src/lib/Menu.js",
4456 "id": "menu.app.hideOthers", 4495 "id": "menu.app.hideOthers",
4457 "start": { 4496 "start": {
4458 "column": 14, 4497 "column": 14,
4459 "line": 179 4498 "line": 191
4460 } 4499 }
4461 }, 4500 },
4462 { 4501 {
4463 "defaultMessage": "!!!Unhide", 4502 "defaultMessage": "!!!Unhide",
4464 "end": { 4503 "end": {
4465 "column": 3, 4504 "column": 3,
4466 "line": 186 4505 "line": 198
4467 }, 4506 },
4468 "file": "src/lib/Menu.js", 4507 "file": "src/lib/Menu.js",
4469 "id": "menu.app.unhide", 4508 "id": "menu.app.unhide",
4470 "start": { 4509 "start": {
4471 "column": 10, 4510 "column": 10,
4472 "line": 183 4511 "line": 195
4473 } 4512 }
4474 }, 4513 },
4475 { 4514 {
4476 "defaultMessage": "!!!Quit", 4515 "defaultMessage": "!!!Quit",
4477 "end": { 4516 "end": {
4478 "column": 3, 4517 "column": 3,
4479 "line": 190 4518 "line": 202
4480 }, 4519 },
4481 "file": "src/lib/Menu.js", 4520 "file": "src/lib/Menu.js",
4482 "id": "menu.app.quit", 4521 "id": "menu.app.quit",
4483 "start": { 4522 "start": {
4484 "column": 8, 4523 "column": 8,
4485 "line": 187 4524 "line": 199
4486 } 4525 }
4487 }, 4526 },
4488 { 4527 {
4489 "defaultMessage": "!!!Add New Service...", 4528 "defaultMessage": "!!!Add New Service...",
4490 "end": { 4529 "end": {
4491 "column": 3, 4530 "column": 3,
4492 "line": 194 4531 "line": 206
4493 }, 4532 },
4494 "file": "src/lib/Menu.js", 4533 "file": "src/lib/Menu.js",
4495 "id": "menu.services.addNewService", 4534 "id": "menu.services.addNewService",
4496 "start": { 4535 "start": {
4497 "column": 17, 4536 "column": 17,
4498 "line": 191 4537 "line": 203
4499 } 4538 }
4500 }, 4539 },
4501 { 4540 {
4502 "defaultMessage": "!!!Add New Workspace...", 4541 "defaultMessage": "!!!Add New Workspace...",
4503 "end": { 4542 "end": {
4504 "column": 3, 4543 "column": 3,
4505 "line": 198 4544 "line": 210
4506 }, 4545 },
4507 "file": "src/lib/Menu.js", 4546 "file": "src/lib/Menu.js",
4508 "id": "menu.workspaces.addNewWorkspace", 4547 "id": "menu.workspaces.addNewWorkspace",
4509 "start": { 4548 "start": {
4510 "column": 19, 4549 "column": 19,
4511 "line": 195 4550 "line": 207
4512 } 4551 }
4513 }, 4552 },
4514 { 4553 {
4515 "defaultMessage": "!!!Open workspace drawer", 4554 "defaultMessage": "!!!Open workspace drawer",
4516 "end": { 4555 "end": {
4517 "column": 3, 4556 "column": 3,
4518 "line": 202 4557 "line": 214
4519 }, 4558 },
4520 "file": "src/lib/Menu.js", 4559 "file": "src/lib/Menu.js",
4521 "id": "menu.workspaces.openWorkspaceDrawer", 4560 "id": "menu.workspaces.openWorkspaceDrawer",
4522 "start": { 4561 "start": {
4523 "column": 23, 4562 "column": 23,
4524 "line": 199 4563 "line": 211
4525 } 4564 }
4526 }, 4565 },
4527 { 4566 {
4528 "defaultMessage": "!!!Close workspace drawer", 4567 "defaultMessage": "!!!Close workspace drawer",
4529 "end": { 4568 "end": {
4530 "column": 3, 4569 "column": 3,
4531 "line": 206 4570 "line": 218
4532 }, 4571 },
4533 "file": "src/lib/Menu.js", 4572 "file": "src/lib/Menu.js",
4534 "id": "menu.workspaces.closeWorkspaceDrawer", 4573 "id": "menu.workspaces.closeWorkspaceDrawer",
4535 "start": { 4574 "start": {
4536 "column": 24, 4575 "column": 24,
4537 "line": 203 4576 "line": 215
4538 } 4577 }
4539 }, 4578 },
4540 { 4579 {
4541 "defaultMessage": "!!!Activate next service...", 4580 "defaultMessage": "!!!Activate next service...",
4542 "end": { 4581 "end": {
4543 "column": 3, 4582 "column": 3,
4544 "line": 210 4583 "line": 222
4545 }, 4584 },
4546 "file": "src/lib/Menu.js", 4585 "file": "src/lib/Menu.js",
4547 "id": "menu.services.setNextServiceActive", 4586 "id": "menu.services.setNextServiceActive",
4548 "start": { 4587 "start": {
4549 "column": 23, 4588 "column": 23,
4550 "line": 207 4589 "line": 219
4551 } 4590 }
4552 }, 4591 },
4553 { 4592 {
4554 "defaultMessage": "!!!Activate previous service...", 4593 "defaultMessage": "!!!Activate previous service...",
4555 "end": { 4594 "end": {
4556 "column": 3, 4595 "column": 3,
4557 "line": 214 4596 "line": 226
4558 }, 4597 },
4559 "file": "src/lib/Menu.js", 4598 "file": "src/lib/Menu.js",
4560 "id": "menu.services.activatePreviousService", 4599 "id": "menu.services.activatePreviousService",
4561 "start": { 4600 "start": {
4562 "column": 27, 4601 "column": 27,
4563 "line": 211 4602 "line": 223
4564 } 4603 }
4565 }, 4604 },
4566 { 4605 {
4567 "defaultMessage": "!!!Disable notifications & audio", 4606 "defaultMessage": "!!!Disable notifications & audio",
4568 "end": { 4607 "end": {
4569 "column": 3, 4608 "column": 3,
4570 "line": 218 4609 "line": 230
4571 }, 4610 },
4572 "file": "src/lib/Menu.js", 4611 "file": "src/lib/Menu.js",
4573 "id": "sidebar.muteApp", 4612 "id": "sidebar.muteApp",
4574 "start": { 4613 "start": {
4575 "column": 11, 4614 "column": 11,
4576 "line": 215 4615 "line": 227
4577 } 4616 }
4578 }, 4617 },
4579 { 4618 {
4580 "defaultMessage": "!!!Enable notifications & audio", 4619 "defaultMessage": "!!!Enable notifications & audio",
4581 "end": { 4620 "end": {
4582 "column": 3, 4621 "column": 3,
4583 "line": 222 4622 "line": 234
4584 }, 4623 },
4585 "file": "src/lib/Menu.js", 4624 "file": "src/lib/Menu.js",
4586 "id": "sidebar.unmuteApp", 4625 "id": "sidebar.unmuteApp",
4587 "start": { 4626 "start": {
4588 "column": 13, 4627 "column": 13,
4589 "line": 219 4628 "line": 231
4590 } 4629 }
4591 }, 4630 },
4592 { 4631 {
4593 "defaultMessage": "!!!Workspaces", 4632 "defaultMessage": "!!!Workspaces",
4594 "end": { 4633 "end": {
4595 "column": 3, 4634 "column": 3,
4596 "line": 226 4635 "line": 238
4597 }, 4636 },
4598 "file": "src/lib/Menu.js", 4637 "file": "src/lib/Menu.js",
4599 "id": "menu.workspaces", 4638 "id": "menu.workspaces",
4600 "start": { 4639 "start": {
4601 "column": 14, 4640 "column": 14,
4602 "line": 223 4641 "line": 235
4603 } 4642 }
4604 }, 4643 },
4605 { 4644 {
4606 "defaultMessage": "!!!Default", 4645 "defaultMessage": "!!!Default",
4607 "end": { 4646 "end": {
4608 "column": 3, 4647 "column": 3,
4609 "line": 230 4648 "line": 242
4610 }, 4649 },
4611 "file": "src/lib/Menu.js", 4650 "file": "src/lib/Menu.js",
4612 "id": "menu.workspaces.defaultWorkspace", 4651 "id": "menu.workspaces.defaultWorkspace",
4613 "start": { 4652 "start": {
4614 "column": 20, 4653 "column": 20,
4615 "line": 227 4654 "line": 239
4616 } 4655 }
4617 } 4656 }
4618 ], 4657 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index e2edbd596..27987e5b7 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -68,6 +68,9 @@
68 "menu.file": "File", 68 "menu.file": "File",
69 "menu.help": "Help", 69 "menu.help": "Help",
70 "menu.help.changelog": "Changelog", 70 "menu.help.changelog": "Changelog",
71 "menu.help.debugInfo": "Copy Debug Information",
72 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
73 "menu.help.debugInfoCopiedHeadline": "Franz Debug Information",
71 "menu.help.learnMore": "Learn More", 74 "menu.help.learnMore": "Learn More",
72 "menu.help.privacy": "Privacy Statement", 75 "menu.help.privacy": "Privacy Statement",
73 "menu.help.support": "Support", 76 "menu.help.support": "Support",
@@ -329,4 +332,4 @@
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>", 332 "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>",
330 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 333 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
331 "workspaces.switchingIndicator.switchingTo": "Switching to" 334 "workspaces.switchingIndicator.switchingTo": "Switching to"
332} \ No newline at end of file 335}
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 27f4c7d88..15ade7941 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,11 +1,11 @@
1{ 1{
2 "app.errorHandler.action" : "Recargar", 2 "app.errorHandler.action" : "Actualizar",
3 "app.errorHandler.headline" : "Ha surgido un error", 3 "app.errorHandler.headline" : "Algo salió mal",
4 "feature.announcements.changelog.headline" : "Cambios en Franz {version}", 4 "feature.announcements.changelog.headline" : "Cambios en Franz {version}",
5 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz", 5 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz",
6 "feature.delayApp.headline" : "Por favor, compra una Licencia de Soporte de Franz para saltar la espera", 6 "feature.delayApp.headline" : "Por favor compra una Licencia de Soporte de Franz para omitir la espera",
7 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.", 7 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.",
8 "feature.shareFranz.action.email" : "Envía como correo", 8 "feature.shareFranz.action.email" : "Enviar como correo",
9 "feature.shareFranz.action.facebook" : "Compartir en Facebook", 9 "feature.shareFranz.action.facebook" : "Compartir en Facebook",
10 "feature.shareFranz.action.twitter" : "Compartir en Twitter", 10 "feature.shareFranz.action.twitter" : "Compartir en Twitter",
11 "feature.shareFranz.headline" : "¡Juntos mejoramos Franz!", 11 "feature.shareFranz.headline" : "¡Juntos mejoramos Franz!",
@@ -19,7 +19,7 @@
19 "global.spellchecking.autodetect.short" : "Automático", 19 "global.spellchecking.autodetect.short" : "Automático",
20 "global.spellchecking.language" : "Corrector de ortografía", 20 "global.spellchecking.language" : "Corrector de ortografía",
21 "import.headline" : "Importa tus servicios de Franz 4", 21 "import.headline" : "Importa tus servicios de Franz 4",
22 "import.notSupportedHeadline" : "Servicios no admitidos aún en Franz 5", 22 "import.notSupportedHeadline" : "Servicios aún no admitidos en Franz 5",
23 "import.skip.label" : "Quiero agregar servicios manualmente", 23 "import.skip.label" : "Quiero agregar servicios manualmente",
24 "import.submit.label" : "Importar servicios", 24 "import.submit.label" : "Importar servicios",
25 "infobar.buttonChangelog" : "¿Qué hay de nuevo?", 25 "infobar.buttonChangelog" : "¿Qué hay de nuevo?",
@@ -43,7 +43,7 @@
43 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.", 43 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.",
44 "login.submit.label" : "Iniciar sesión", 44 "login.submit.label" : "Iniciar sesión",
45 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.", 45 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.",
46 "menu.app.about" : "Sobre Franz", 46 "menu.app.about" : "Acerca de Franz",
47 "menu.app.announcement" : "¿Qué hay de nuevo?", 47 "menu.app.announcement" : "¿Qué hay de nuevo?",
48 "menu.app.checkForUpdates" : "Comprobar actualizaciones", 48 "menu.app.checkForUpdates" : "Comprobar actualizaciones",
49 "menu.app.hide" : "Ocultar", 49 "menu.app.hide" : "Ocultar",
@@ -70,7 +70,7 @@
70 "menu.help.changelog" : "Registro de cambios", 70 "menu.help.changelog" : "Registro de cambios",
71 "menu.help.learnMore" : "Conocer más", 71 "menu.help.learnMore" : "Conocer más",
72 "menu.help.privacy" : "Declaración de privacidad", 72 "menu.help.privacy" : "Declaración de privacidad",
73 "menu.help.support" : "Ayuda técnica", 73 "menu.help.support" : "Soporte",
74 "menu.help.tos" : "Términos del Servicio", 74 "menu.help.tos" : "Términos del Servicio",
75 "menu.services" : "Servicios", 75 "menu.services" : "Servicios",
76 "menu.services.activatePreviousService" : "Activa el servicio previo", 76 "menu.services.activatePreviousService" : "Activa el servicio previo",
@@ -144,7 +144,7 @@
144 "settings.account.userInfoRequestFailed" : "No se pudo cargar la información de usuario", 144 "settings.account.userInfoRequestFailed" : "No se pudo cargar la información de usuario",
145 "settings.app.buttonClearAllCache" : "Limpiar caché", 145 "settings.app.buttonClearAllCache" : "Limpiar caché",
146 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar actualizaciones", 146 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar actualizaciones",
147 "settings.app.buttonSearchForUpdate" : "Comprobar actualizaciones", 147 "settings.app.buttonSearchForUpdate" : "Buscar actualizaciones",
148 "settings.app.cacheInfo" : "El cache de Franz actualmente usa {size} de espacio en disco.", 148 "settings.app.cacheInfo" : "El cache de Franz actualmente usa {size} de espacio en disco.",
149 "settings.app.currentVersion" : "Versión actual:", 149 "settings.app.currentVersion" : "Versión actual:",
150 "settings.app.form.autoLaunchInBackground" : "Abrir en segundo plano", 150 "settings.app.form.autoLaunchInBackground" : "Abrir en segundo plano",
@@ -165,7 +165,7 @@
165 "settings.app.headlineGeneral" : "General", 165 "settings.app.headlineGeneral" : "General",
166 "settings.app.headlineLanguage" : "Idioma", 166 "settings.app.headlineLanguage" : "Idioma",
167 "settings.app.headlineUpdates" : "Actualizaciones", 167 "settings.app.headlineUpdates" : "Actualizaciones",
168 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "Las traducciones oficiales son en inglés y alemán. Todos los demás idiomas son traducciones basadas en la comunidad.",
169 "settings.app.restartRequired" : "Los cambios requieren reiniciar", 169 "settings.app.restartRequired" : "Los cambios requieren reiniciar",
170 "settings.app.subheadlineCache" : "Caché", 170 "settings.app.subheadlineCache" : "Caché",
171 "settings.app.translationHelp" : "Ayúdanos a traducir Franz a tu idioma.", 171 "settings.app.translationHelp" : "Ayúdanos a traducir Franz a tu idioma.",
@@ -265,7 +265,7 @@
265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
266 "settings.workspaces.tryReloadWorkspaces" : "Inténtalo de nuevo", 266 "settings.workspaces.tryReloadWorkspaces" : "Inténtalo de nuevo",
267 "settings.workspaces.updatedInfo" : "Tus cambios han sido guardados", 267 "settings.workspaces.updatedInfo" : "Tus cambios han sido guardados",
268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Menos es más: Presentación de Franz Workspaces",
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 Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
271 "sidebar.addNewService" : "Añadir nuevo servicio", 271 "sidebar.addNewService" : "Añadir nuevo servicio",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 90072f2b7..9227ff28f 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -3,7 +3,7 @@
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",
6 "feature.delayApp.headline" : "Veuillez acheter une licence de Supporter Franz pour sauter le temps d'attente", 6 "feature.delayApp.headline" : "Achetez une licence de Supporter Franz pour ne plus avoir de temps d'attente",
7 "feature.delayApp.text" : "Franz reprendra dans {seconds} secondes.", 7 "feature.delayApp.text" : "Franz reprendra dans {seconds} secondes.",
8 "feature.shareFranz.action.email" : "Envoyer par mail", 8 "feature.shareFranz.action.email" : "Envoyer par mail",
9 "feature.shareFranz.action.facebook" : "Partager sur Facebook", 9 "feature.shareFranz.action.facebook" : "Partager sur Facebook",
@@ -11,7 +11,7 @@
11 "feature.shareFranz.headline" : "Franz est meilleur quand on est tous ensemble !", 11 "feature.shareFranz.headline" : "Franz est meilleur quand on est tous ensemble !",
12 "feature.shareFranz.shareText.email" : "J'ai ajouté {count} services à Franz ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et cie sur www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "J'ai ajouté {count} services à Franz ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et cie sur www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "J'ai ajouté {count} services à Franz! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et compagnie sur www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "J'ai ajouté {count} services à Franz! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et compagnie sur www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Dites à vos amis et collègues combien Franz est super et aidez nous à faire passer le mot.", 14 "feature.shareFranz.text" : "Dites à vos amis et collègues a quel point Franz est super et aidez nous à faire passer le mot.",
15 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz", 15 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz",
16 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.", 16 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.",
17 "global.spellchecker.useDefault" : "Par défaut ({default})", 17 "global.spellchecker.useDefault" : "Par défaut ({default})",
@@ -19,7 +19,7 @@
19 "global.spellchecking.autodetect.short" : "Automatiquement", 19 "global.spellchecking.autodetect.short" : "Automatiquement",
20 "global.spellchecking.language" : "Langue de la vérification orthographique", 20 "global.spellchecking.language" : "Langue de la vérification orthographique",
21 "import.headline" : "Importez vos services depuis la version 4 de Franz.", 21 "import.headline" : "Importez vos services depuis la version 4 de Franz.",
22 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par Franz 5", 22 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par la version 5 de Franz",
23 "import.skip.label" : "Je veux ajouter des services manuellement", 23 "import.skip.label" : "Je veux ajouter des services manuellement",
24 "import.submit.label" : "Importer des services", 24 "import.submit.label" : "Importer des services",
25 "infobar.buttonChangelog" : "Nouveautés", 25 "infobar.buttonChangelog" : "Nouveautés",
@@ -27,7 +27,7 @@
27 "infobar.buttonReloadServices" : "Recharger les services", 27 "infobar.buttonReloadServices" : "Recharger les services",
28 "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur", 28 "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur",
29 "infobar.servicesUpdated" : "Vos services ont été mis à jour.", 29 "infobar.servicesUpdated" : "Vos services ont été mis à jour.",
30 "infobar.updateAvailable" : "Une nouvelle mise à jour pour Franz est disponible.", 30 "infobar.updateAvailable" : "Une nouvelle mise à jour de Franz est disponible.",
31 "invite.email.label" : "Adresse Email", 31 "invite.email.label" : "Adresse Email",
32 "invite.headline.friends" : "Invitez 3 amis ou collègues", 32 "invite.headline.friends" : "Invitez 3 amis ou collègues",
33 "invite.name.label" : "Nom", 33 "invite.name.label" : "Nom",
@@ -44,7 +44,7 @@
44 "login.submit.label" : "Se connecter", 44 "login.submit.label" : "Se connecter",
45 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.", 45 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.",
46 "menu.app.about" : "À propos de Franz", 46 "menu.app.about" : "À propos de Franz",
47 "menu.app.announcement" : "Quoi de neuf? ", 47 "menu.app.announcement" : "Quoi de neuf ? ",
48 "menu.app.checkForUpdates" : "Vérifier les mises à jour", 48 "menu.app.checkForUpdates" : "Vérifier les mises à jour",
49 "menu.app.hide" : "Masquer", 49 "menu.app.hide" : "Masquer",
50 "menu.app.hideOthers" : "Masquer les autres", 50 "menu.app.hideOthers" : "Masquer les autres",
@@ -70,7 +70,7 @@
70 "menu.help.changelog" : "Liste des modifications", 70 "menu.help.changelog" : "Liste des modifications",
71 "menu.help.learnMore" : "En savoir plus", 71 "menu.help.learnMore" : "En savoir plus",
72 "menu.help.privacy" : "Déclaration de confidentialité", 72 "menu.help.privacy" : "Déclaration de confidentialité",
73 "menu.help.support" : "Support", 73 "menu.help.support" : "Assistance",
74 "menu.help.tos" : "Conditions d'utilisation", 74 "menu.help.tos" : "Conditions d'utilisation",
75 "menu.services" : "Services", 75 "menu.services" : "Services",
76 "menu.services.activatePreviousService" : "Activer le service précédent", 76 "menu.services.activatePreviousService" : "Activer le service précédent",
@@ -79,9 +79,9 @@
79 "menu.view" : "Aperçu", 79 "menu.view" : "Aperçu",
80 "menu.view.enterFullScreen" : "Entrer en mode plein écran", 80 "menu.view.enterFullScreen" : "Entrer en mode plein écran",
81 "menu.view.exitFullScreen" : "Sortir du mode plein écran", 81 "menu.view.exitFullScreen" : "Sortir du mode plein écran",
82 "menu.view.reloadFranz" : "Actualiser Franz", 82 "menu.view.reloadFranz" : "Recharger Franz",
83 "menu.view.reloadService" : "Redémarrer le service", 83 "menu.view.reloadService" : "Redémarrer le service",
84 "menu.view.resetZoom" : "Taille réelle", 84 "menu.view.resetZoom" : "Taille actuelle",
85 "menu.view.toggleDevTools" : "Activer les outils développeur", 85 "menu.view.toggleDevTools" : "Activer les outils développeur",
86 "menu.view.toggleFullScreen" : "Activer \/ désactiver le mode plein écran", 86 "menu.view.toggleFullScreen" : "Activer \/ désactiver le mode plein écran",
87 "menu.view.toggleServiceDevTools" : "Activer les outils de développement WebKit", 87 "menu.view.toggleServiceDevTools" : "Activer les outils de développement WebKit",
@@ -102,7 +102,7 @@
102 "password.noUser" : "Aucun utilisateur n'a été trouvé avec cette adresse email", 102 "password.noUser" : "Aucun utilisateur n'a été trouvé avec cette adresse email",
103 "password.submit.label" : "Soumettre", 103 "password.submit.label" : "Soumettre",
104 "password.successInfo" : "Merci de consulter vos emails", 104 "password.successInfo" : "Merci de consulter vos emails",
105 "premiumFeature.button.upgradeAccount" : "Mettre à niveau mon compte", 105 "premiumFeature.button.upgradeAccount" : "Augmenter le niveau de mon compte",
106 "pricing.headline" : "Soutenez Franz", 106 "pricing.headline" : "Soutenez Franz",
107 "pricing.link.skipPayment" : "Je ne veux pas soutenir le développement de Franz.", 107 "pricing.link.skipPayment" : "Je ne veux pas soutenir le développement de Franz.",
108 "pricing.submit.label" : "Je veux soutenir le développement de Franz", 108 "pricing.submit.label" : "Je veux soutenir le développement de Franz",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 701568b1c..43e0da91a 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -8,7 +8,7 @@
8 "feature.shareFranz.action.email" : "Küldés email-ben", 8 "feature.shareFranz.action.email" : "Küldés email-ben",
9 "feature.shareFranz.action.facebook" : "Megosztás Facebook-on", 9 "feature.shareFranz.action.facebook" : "Megosztás Facebook-on",
10 "feature.shareFranz.action.twitter" : "Megosztás Twitter-en", 10 "feature.shareFranz.action.twitter" : "Megosztás Twitter-en",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "A Franz barátokkal együtt mégjobb!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
@@ -44,7 +44,7 @@
44 "login.submit.label" : "Bejelentkezés", 44 "login.submit.label" : "Bejelentkezés",
45 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.", 45 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.",
46 "menu.app.about" : "Névjegy", 46 "menu.app.about" : "Névjegy",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Mi újság?",
48 "menu.app.checkForUpdates" : "Frissítések keresése", 48 "menu.app.checkForUpdates" : "Frissítések keresése",
49 "menu.app.hide" : "Elrejt", 49 "menu.app.hide" : "Elrejt",
50 "menu.app.hideOthers" : "Többi elrejtése", 50 "menu.app.hideOthers" : "Többi elrejtése",
@@ -233,17 +233,17 @@
233 "settings.services.discoverServices" : "Szolgáltatások felfedezése", 233 "settings.services.discoverServices" : "Szolgáltatások felfedezése",
234 "settings.services.headline" : "Szolgáltatásaid", 234 "settings.services.headline" : "Szolgáltatásaid",
235 "settings.services.noServicesAdded" : "Még nem adtál hozzá egyetlen szolgáltatást sem eddig.", 235 "settings.services.noServicesAdded" : "Még nem adtál hozzá egyetlen szolgáltatást sem eddig.",
236 "settings.services.servicesRequestFailed" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "Szolgáltatásaid betöltése sikertelen",
237 "settings.services.tooltip.isDisabled" : "A szolgáltatás le van tiltva", 237 "settings.services.tooltip.isDisabled" : "A szolgáltatás le van tiltva",
238 "settings.services.tooltip.isMuted" : "Minden hang lenémítva", 238 "settings.services.tooltip.isMuted" : "Minden hang lenémítva",
239 "settings.services.tooltip.notificationsDisabled" : "Értesítések letiltva", 239 "settings.services.tooltip.notificationsDisabled" : "Értesítések letiltva",
240 "settings.services.updatedInfo" : "A módosításokat elmentettük", 240 "settings.services.updatedInfo" : "A módosításokat elmentettük",
241 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Franz for Teams",
242 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.copy" : "A Franz for Teams lehetőséget teremt arra, hogy meghívd munkatársaidat a csapatodba email-en keresztül, és kezelhesd a Franz előfizetéseiket és fiókbeállításaikat. Ne fecséreld az idődet minden egyes csapattag regisztrációjára, felejtsd el a sok-sok egyéni számlát és különböző lejárati időt - egy mindenek felett!",
243 "settings.team.headline" : "Csapat", 243 "settings.team.headline" : "Csapat",
244 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.intro" : "Te és a csapatod Franz-ot használtok? Egy fiókból kezelheted kollégáid, barátaid vagy családtagjaid Prémium előfizetéseit.",
245 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Csapat kezelése a meetfranz.com-on",
246 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Előfizetés",
247 "settings.user.form.accountType.company" : "Cég", 247 "settings.user.form.accountType.company" : "Cég",
248 "settings.user.form.accountType.individual" : "Egyén", 248 "settings.user.form.accountType.individual" : "Egyén",
249 "settings.user.form.accountType.label" : "Fiók típusa", 249 "settings.user.form.accountType.label" : "Fiók típusa",
@@ -293,7 +293,7 @@
293 "subscription.features.onpremise.mattermost" : "Saját kiszolgálós szolgáltatások hozzáadása, pl.: Mattermost", 293 "subscription.features.onpremise.mattermost" : "Saját kiszolgálós szolgáltatások hozzáadása, pl.: Mattermost",
294 "subscription.features.proxy" : "Proxy támogatás a szolgáltatásokhoz", 294 "subscription.features.proxy" : "Proxy támogatás a szolgáltatásokhoz",
295 "subscription.features.spellchecker" : "Támogatás a Helyesírás-ellenőrzőhöz", 295 "subscription.features.spellchecker" : "Támogatás a Helyesírás-ellenőrzőhöz",
296 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Rendezd szolgáltatásaidat Munkaterületekbe",
297 "subscription.includedFeatures" : "Az előfizetett Franz Prémium Támogató Fiók tartalmazza", 297 "subscription.includedFeatures" : "Az előfizetett Franz Prémium Támogató Fiók tartalmazza",
298 "subscription.paymentSessionError" : "Nem sikerült a fizetési felületet betölteni", 298 "subscription.paymentSessionError" : "Nem sikerült a fizetési felületet betölteni",
299 "subscription.submit.label" : "Szeretném támogatni a Franz fejlesztését", 299 "subscription.submit.label" : "Szeretném támogatni a Franz fejlesztését",
@@ -313,12 +313,12 @@
313 "tabs.item.reload" : "Újratöltés", 313 "tabs.item.reload" : "Újratöltés",
314 "validation.email" : "{field} nem érvényes", 314 "validation.email" : "{field} nem érvényes",
315 "validation.minLength" : "{field} mezőnek legalább {length} karakter hosszúnak kell lennie", 315 "validation.minLength" : "{field} mezőnek legalább {length} karakter hosszúnak kell lennie",
316 "validation.oneRequired" : "At least one is required", 316 "validation.oneRequired" : "Legalább egy kitöltése szükséges",
317 "validation.required" : "{field} kitöltése kötelező", 317 "validation.required" : "{field} kitöltése kötelező",
318 "validation.url" : "{field} nem érvényes URL", 318 "validation.url" : "{field} nem érvényes URL",
319 "welcome.loginButton" : "Jelentkezz be a fiókodba", 319 "welcome.loginButton" : "Jelentkezz be a fiókodba",
320 "welcome.signupButton" : "Új fiók létrehozása", 320 "welcome.signupButton" : "Új fiók létrehozása",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Munkaterület hozzáadása",
322 "workspaceDrawer.allServices" : "Összes szolgáltatás", 322 "workspaceDrawer.allServices" : "Összes szolgáltatás",
323 "workspaceDrawer.headline" : "Munkaterületek", 323 "workspaceDrawer.headline" : "Munkaterületek",
324 "workspaceDrawer.item.contextMenuEdit" : "szerkeszt", 324 "workspaceDrawer.item.contextMenuEdit" : "szerkeszt",
@@ -326,7 +326,7 @@
326 "workspaceDrawer.premiumCtaButtonLabel" : "Készítsd el az első munkaterületedet", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Készítsd el az első munkaterületedet",
327 "workspaceDrawer.proFeatureBadge" : "Prémium funkció", 327 "workspaceDrawer.proFeatureBadge" : "Prémium funkció",
328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Prémium fiók reaktiválása", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Prémium fiók reaktiválása",
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>A Franz Munkaterületek lehetÅ‘vé teszik, hogy összpontosíts a jelenleg fontos dolgokra. Ãllítsd be a különbözÅ‘ szolgáltatáskészleteket és könnyedén válthatsz közöttük bármikor.<\/p><p>Te döntöd el, hogy mely szolgáltatásokra van szükséged, mikor és hol, így segíthetünk abban, hogy a teljesítményed csúcsán maradhass, vagy ha csak akarod, egyszerűen kikapcsold a munkával kapcsolatos dolgokat.<\/p>",
330 "workspaceDrawer.workspacesSettingsTooltip" : "Munkaterület beállítások szerkesztése", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Munkaterület beállítások szerkesztése",
331 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Váltás"
332} 332}
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 819aca177..fb6434869 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -10,7 +10,7 @@
10 "feature.shareFranz.action.twitter" : "Bagikan di Twitter", 10 "feature.shareFranz.action.twitter" : "Bagikan di Twitter",
11 "feature.shareFranz.headline" : "Franz lebih baik bersama!", 11 "feature.shareFranz.headline" : "Franz lebih baik bersama!",
12 "feature.shareFranz.shareText.email" : "Saya telah menambahkan layanan {count} ke Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Saya telah menambahkan layanan {count} ke Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.meetfranz.com",
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" : "Saya telah menambahkan {count} layanan di Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan lainnya di www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Beri tahu teman dan kolega Anda betapa hebatnya Franz dan bantu kami menyebarkan berita.", 14 "feature.shareFranz.text" : "Beri tahu teman dan kolega Anda betapa hebatnya Franz dan bantu kami menyebarkan berita.",
15 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz", 15 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz",
16 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.", 16 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.",
@@ -144,7 +144,7 @@
144 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna", 144 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna",
145 "settings.app.buttonClearAllCache" : "Bersihkan singgahan", 145 "settings.app.buttonClearAllCache" : "Bersihkan singgahan",
146 "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru", 146 "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru",
147 "settings.app.buttonSearchForUpdate" : "Periksa versi baru", 147 "settings.app.buttonSearchForUpdate" : "Periksa pembaruan",
148 "settings.app.cacheInfo" : "Singgahan Franz sedang menggunakan ruang disk {size}.", 148 "settings.app.cacheInfo" : "Singgahan Franz sedang menggunakan ruang disk {size}.",
149 "settings.app.currentVersion" : "Versi saat ini:", 149 "settings.app.currentVersion" : "Versi saat ini:",
150 "settings.app.form.autoLaunchInBackground" : "Buka di latar belakang", 150 "settings.app.form.autoLaunchInBackground" : "Buka di latar belakang",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index 1eda8856f..83e207542 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -1,22 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Herladen", 2 "app.errorHandler.action" : "Herladen",
3 "app.errorHandler.headline" : "Er ging iets mis", 3 "app.errorHandler.headline" : "Er ging iets mis",
4 "feature.announcements.changelog.headline" : "Changes in Franz {version}", 4 "feature.announcements.changelog.headline" : "Wijzigingen in Franz {versie}",
5 "feature.delayApp.action" : "Neem een Franz Supporter Licentie ", 5 "feature.delayApp.action" : "Neem een Franz Supporter Licentie ",
6 "feature.delayApp.headline" : "Neem een Franz Supporter Licentie om niet meer te hoeven wachten", 6 "feature.delayApp.headline" : "Neem een Franz Supporter Licentie om niet meer te hoeven wachten",
7 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.", 7 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.",
8 "feature.shareFranz.action.email" : "Send as email", 8 "feature.shareFranz.action.email" : "Verstuur als e-mail",
9 "feature.shareFranz.action.facebook" : "Share on Facebook", 9 "feature.shareFranz.action.facebook" : "Deel op Facebook",
10 "feature.shareFranz.action.twitter" : "Share on Twitter", 10 "feature.shareFranz.action.twitter" : "Deel op Twitter",
11 "feature.shareFranz.headline" : "Franz is better together!", 11 "feature.shareFranz.headline" : "Franz is beter samen!",
12 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Ik heb {telling} diensten toegevoegd aan Franz! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Ik heb {tel} diensten toegevoegd aan Franz! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text" : "Vertel je vrienden en collega's hoe geweldig Franz is en help ons het woord te verspreiden.",
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" : "Je hebt geen internet verbinding.", 16 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.",
17 "global.spellchecker.useDefault" : "Gebruik Systeemstandaard ({default})", 17 "global.spellchecker.useDefault" : "Gebruik Systeemstandaard ({default})",
18 "global.spellchecking.autodetect" : "Detect language automatically", 18 "global.spellchecking.autodetect" : "Taal automatisch herkennen",
19 "global.spellchecking.autodetect.short" : "Automatic", 19 "global.spellchecking.autodetect.short" : "Automatisch",
20 "global.spellchecking.language" : "Taal spellingscontrole", 20 "global.spellchecking.language" : "Taal spellingscontrole",
21 "import.headline" : "Importeer je Franz 4 services", 21 "import.headline" : "Importeer je Franz 4 services",
22 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5", 22 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5",
@@ -44,7 +44,7 @@
44 "login.submit.label" : "Inloggen", 44 "login.submit.label" : "Inloggen",
45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 45 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
46 "menu.app.about" : "Over Franz", 46 "menu.app.about" : "Over Franz",
47 "menu.app.announcement" : "What's new?", 47 "menu.app.announcement" : "Wat is er nieuw?",
48 "menu.app.checkForUpdates" : "Controleer op updates", 48 "menu.app.checkForUpdates" : "Controleer op updates",
49 "menu.app.hide" : "Verbergen", 49 "menu.app.hide" : "Verbergen",
50 "menu.app.hideOthers" : "Andere Verbergen", 50 "menu.app.hideOthers" : "Andere Verbergen",
@@ -73,9 +73,9 @@
73 "menu.help.support" : "Ondersteuning", 73 "menu.help.support" : "Ondersteuning",
74 "menu.help.tos" : "Servicevoorwaarden", 74 "menu.help.tos" : "Servicevoorwaarden",
75 "menu.services" : "Services", 75 "menu.services" : "Services",
76 "menu.services.activatePreviousService" : "Activate previous service", 76 "menu.services.activatePreviousService" : "Vorige dienst activeren",
77 "menu.services.addNewService" : "Nieuwe service toevoegen...", 77 "menu.services.addNewService" : "Nieuwe service toevoegen...",
78 "menu.services.setNextServiceActive" : "Activate next service", 78 "menu.services.setNextServiceActive" : "Volgende dienst activeren",
79 "menu.view" : "Weergave", 79 "menu.view" : "Weergave",
80 "menu.view.enterFullScreen" : "Volledig scherm openen", 80 "menu.view.enterFullScreen" : "Volledig scherm openen",
81 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 81 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -90,11 +90,11 @@
90 "menu.window" : "Venster", 90 "menu.window" : "Venster",
91 "menu.window.close" : "Sluiten", 91 "menu.window.close" : "Sluiten",
92 "menu.window.minimize" : "Minimaliseren", 92 "menu.window.minimize" : "Minimaliseren",
93 "menu.workspaces" : "Workspaces", 93 "menu.workspaces" : "Werkruimten",
94 "menu.workspaces.addNewWorkspace" : "Add New Workspace...", 94 "menu.workspaces.addNewWorkspace" : "Voeg nieuwe werkruimte toe...",
95 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer", 95 "menu.workspaces.closeWorkspaceDrawer" : "Werkruimtepagina sluiten",
96 "menu.workspaces.defaultWorkspace" : "Alle services", 96 "menu.workspaces.defaultWorkspace" : "Alle services",
97 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer", 97 "menu.workspaces.openWorkspaceDrawer" : "Werkruimtepagina openen",
98 "password.email.label" : "E-mailadres", 98 "password.email.label" : "E-mailadres",
99 "password.headline" : "Wachtwoord resetten", 99 "password.headline" : "Wachtwoord resetten",
100 "password.link.login" : "Log in op je account", 100 "password.link.login" : "Log in op je account",
@@ -118,7 +118,7 @@
118 "service.errorHandler.headline" : "Oh nee!", 118 "service.errorHandler.headline" : "Oh nee!",
119 "service.errorHandler.message" : "Fout", 119 "service.errorHandler.message" : "Fout",
120 "service.errorHandler.text" : "{name} kon niet geladen worden.", 120 "service.errorHandler.text" : "{name} kon niet geladen worden.",
121 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Aan het laden",
122 "services.getStarted" : "Beginnen", 122 "services.getStarted" : "Beginnen",
123 "services.welcome" : "Welkom bij Franz", 123 "services.welcome" : "Welkom bij Franz",
124 "settings.account.account.editButton" : "Account bewerken", 124 "settings.account.account.editButton" : "Account bewerken",
@@ -165,7 +165,7 @@
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" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "Officiële vertalingen zijn in het Engels en Duits. Alle andere tallen zijn op de gemeenschap gebaseerde vertalingen.",
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 te vertalen naar uw taal.",
@@ -178,10 +178,10 @@
178 "settings.navigation.inviteFriends" : "Nodig vrienden uit", 178 "settings.navigation.inviteFriends" : "Nodig vrienden uit",
179 "settings.navigation.logout" : "Uitloggen", 179 "settings.navigation.logout" : "Uitloggen",
180 "settings.navigation.settings" : "Instellingen", 180 "settings.navigation.settings" : "Instellingen",
181 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Beheer Team",
182 "settings.navigation.yourServices" : "Jouw services", 182 "settings.navigation.yourServices" : "Jouw services",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Jouw werkruimtes",
184 "settings.recipes.all" : "Alle services", 184 "settings.recipes.all" : "Alle diensten",
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 service?", 187 "settings.recipes.missingService" : "Mist er een service?",
@@ -233,17 +233,17 @@
233 "settings.services.discoverServices" : "Services ontdekken", 233 "settings.services.discoverServices" : "Services ontdekken",
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" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "Kan je diensten 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" : "Alle geluiden zijn uitgeschakeld",
239 "settings.services.tooltip.notificationsDisabled" : "Notificaties staan uit", 239 "settings.services.tooltip.notificationsDisabled" : "Notificaties staan uit",
240 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen", 240 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen",
241 "settings.team.contentHeadline" : "Franz for Teams", 241 "settings.team.contentHeadline" : "Frans voor Teams",
242 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.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!",
243 "settings.team.headline" : "Team", 243 "settings.team.headline" : "Team",
244 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.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.",
245 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Beheer je Team op meetfranz.com",
246 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Upgrade je Account",
247 "settings.user.form.accountType.company" : "Bedrijf", 247 "settings.user.form.accountType.company" : "Bedrijf",
248 "settings.user.form.accountType.individual" : "Particulier", 248 "settings.user.form.accountType.individual" : "Particulier",
249 "settings.user.form.accountType.label" : "Account type", 249 "settings.user.form.accountType.label" : "Account type",
@@ -254,24 +254,24 @@
254 "settings.user.form.lastname" : "Achternaam", 254 "settings.user.form.lastname" : "Achternaam",
255 "settings.user.form.newPassword" : "Nieuw wachtwoord", 255 "settings.user.form.newPassword" : "Nieuw wachtwoord",
256 "settings.workspace.add.form.name" : "Naam", 256 "settings.workspace.add.form.name" : "Naam",
257 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Maak werkruimte aan",
258 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Verwijder werkruimte",
259 "settings.workspace.form.buttonSave" : "Save workspace", 259 "settings.workspace.form.buttonSave" : "Bewaar werkruimte",
260 "settings.workspace.form.name" : "Naam", 260 "settings.workspace.form.name" : "Naam",
261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Diensten in deze Werkruimte",
262 "settings.workspace.form.yourWorkspaces" : "Your workspaces", 262 "settings.workspace.form.yourWorkspaces" : "Jouw werkruimtes",
263 "settings.workspaces.deletedInfo" : "Workspace has been deleted", 263 "settings.workspaces.deletedInfo" : "Werkruimte is verwijderd",
264 "settings.workspaces.headline" : "Your workspaces", 264 "settings.workspaces.headline" : "Je werkruimtes",
265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Je hebt nog geen werkruimtes toegevoegd.",
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: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Minder is meer: we presenteren Franz Werkruimtes",
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 Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Kan je werkruimtes niet laden",
271 "sidebar.addNewService" : "Nieuw service toevoegen", 271 "sidebar.addNewService" : "Nieuw service toevoegen",
272 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer", 272 "sidebar.closeWorkspaceDrawer" : "Werkruimtelade sluiten",
273 "sidebar.muteApp" : "Berichten & geluid uitschakelen", 273 "sidebar.muteApp" : "Berichten & geluid uitschakelen",
274 "sidebar.openWorkspaceDrawer" : "Open workspace drawer", 274 "sidebar.openWorkspaceDrawer" : "Werkruimtelade openen",
275 "sidebar.settings" : "Instellingen", 275 "sidebar.settings" : "Instellingen",
276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen", 276 "sidebar.unmuteApp" : "Berichten & geluid inschakelen",
277 "signup.company.label" : "Bedrijf", 277 "signup.company.label" : "Bedrijf",
@@ -293,7 +293,7 @@
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 ondersteuning voor services", 294 "subscription.features.proxy" : "Proxy ondersteuning voor services",
295 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck", 295 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
296 "subscription.features.workspaces" : "Organize your services in workspaces", 296 "subscription.features.workspaces" : "Organiseer je diensten in werkruimtes",
297 "subscription.includedFeatures" : "Een betalend account voor Franz omvat", 297 "subscription.includedFeatures" : "Een betalend account voor Franz omvat",
298 "subscription.paymentSessionError" : "Betalingsformulier kon niet geladen worden", 298 "subscription.paymentSessionError" : "Betalingsformulier kon niet geladen worden",
299 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz steunen", 299 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz steunen",
@@ -313,20 +313,20 @@
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} moet minimaal {length} karakters lang zijn",
316 "validation.oneRequired" : "At least one is required", 316 "validation.oneRequired" : "Ten minste één is 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 niet een geldige URL",
319 "welcome.loginButton" : "Inloggen op je account", 319 "welcome.loginButton" : "Inloggen op je account",
320 "welcome.signupButton" : "Maak een gratis account aan", 320 "welcome.signupButton" : "Maak een gratis account aan",
321 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Voeg een nieuwe werkruimte toe",
322 "workspaceDrawer.allServices" : "Alle services", 322 "workspaceDrawer.allServices" : "Alle diensten",
323 "workspaceDrawer.headline" : "Workspaces", 323 "workspaceDrawer.headline" : "Werkruimtes",
324 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "bewerken",
325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Nog geen diensten toegevoegd",
326 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel" : "Maak je eerste werkruimte aan",
327 "workspaceDrawer.proFeatureBadge" : "Premium feature", 327 "workspaceDrawer.proFeatureBadge" : "Premium feature",
328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account", 328 "workspaceDrawer.reactivatePremiumAccountLabel" : "Heractiveer premium account",
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 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>",
330 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Pas werkruimte instellingen aan",
331 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Overschakelen naar"
332} 332}
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index fdb96a7db..a05297a64 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -165,7 +165,7 @@
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" : "Official translations are English & German. All other languages are community based translations.", 168 "settings.app.languageDisclaimer" : "Officiële vertalingen zijn in het Engels en Duits. Alle andere talen zijn 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 te vertalen naar uw taal.",
@@ -178,9 +178,9 @@
178 "settings.navigation.inviteFriends" : "Nodig vrienden uit", 178 "settings.navigation.inviteFriends" : "Nodig vrienden uit",
179 "settings.navigation.logout" : "Uitloggen", 179 "settings.navigation.logout" : "Uitloggen",
180 "settings.navigation.settings" : "Instellingen", 180 "settings.navigation.settings" : "Instellingen",
181 "settings.navigation.team" : "Manage Team", 181 "settings.navigation.team" : "Beheer Team",
182 "settings.navigation.yourServices" : "Jouw services", 182 "settings.navigation.yourServices" : "Jouw services",
183 "settings.navigation.yourWorkspaces" : "Your workspaces", 183 "settings.navigation.yourWorkspaces" : "Jouw werkruimtes",
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",
@@ -233,17 +233,17 @@
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" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "Kan jouw diensten 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" : "Alle geluiden zijn 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 groepen",
242 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!", 242 "settings.team.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!",
243 "settings.team.headline" : "Team", 243 "settings.team.headline" : "Team",
244 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.", 244 "settings.team.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.",
245 "settings.team.manageAction" : "Manage your Team on meetfranz.com", 245 "settings.team.manageAction" : "Beheer je Team op meetfranz.com",
246 "settings.team.upgradeAction" : "Upgrade your Account", 246 "settings.team.upgradeAction" : "Jouw Account opwaarderen",
247 "settings.user.form.accountType.company" : "Bedrijf", 247 "settings.user.form.accountType.company" : "Bedrijf",
248 "settings.user.form.accountType.individual" : "Individueel", 248 "settings.user.form.accountType.individual" : "Individueel",
249 "settings.user.form.accountType.label" : "Accounttype", 249 "settings.user.form.accountType.label" : "Accounttype",
@@ -254,24 +254,24 @@
254 "settings.user.form.lastname" : "Achternaam", 254 "settings.user.form.lastname" : "Achternaam",
255 "settings.user.form.newPassword" : "Nieuw wachtwoord", 255 "settings.user.form.newPassword" : "Nieuw wachtwoord",
256 "settings.workspace.add.form.name" : "Naam", 256 "settings.workspace.add.form.name" : "Naam",
257 "settings.workspace.add.form.submitButton" : "Create workspace", 257 "settings.workspace.add.form.submitButton" : "Maak werkruimte aan",
258 "settings.workspace.form.buttonDelete" : "Delete workspace", 258 "settings.workspace.form.buttonDelete" : "Verwijder werkruimte",
259 "settings.workspace.form.buttonSave" : "Save workspace", 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" : "Services in this Workspace", 261 "settings.workspace.form.servicesInWorkspaceHeadline" : "Diensten 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",
265 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.", 265 "settings.workspaces.noWorkspacesAdded" : "Je hebt nog geen werkruimtes toegevoegd.",
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: Introducing Franz Workspaces", 268 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Zie hier Franz Werkruimtes",
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 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.",
270 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces", 270 "settings.workspaces.workspacesRequestFailed" : "Kan jouw werkruimtes niet laden",
271 "sidebar.addNewService" : "Voeg service toe", 271 "sidebar.addNewService" : "Voeg service toe",
272 "sidebar.closeWorkspaceDrawer" : "Werkruimtepagina sluiten", 272 "sidebar.closeWorkspaceDrawer" : "Werkruimte pagina sluiten",
273 "sidebar.muteApp" : "Schakel berichten & geluid uit", 273 "sidebar.muteApp" : "Schakel berichten & geluid uit",
274 "sidebar.openWorkspaceDrawer" : "Werkruimtepagina 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",
277 "signup.company.label" : "Bedrijf", 277 "signup.company.label" : "Bedrijf",
@@ -293,7 +293,7 @@
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 diensten",
295 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck", 295 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
296 "subscription.features.workspaces" : "Organize your services in workspaces", 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",
299 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen", 299 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen",
@@ -313,20 +313,20 @@
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} moet minimaal {length} karakters lang zijn",
316 "validation.oneRequired" : "At least one is required", 316 "validation.oneRequired" : "Er is op zijn minst éé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 niet een 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" : "Add new workspace", 321 "workspaceDrawer.addNewWorkspaceLabel" : "Voeg een nieuwe werkruimte toe",
322 "workspaceDrawer.allServices" : "Alle services", 322 "workspaceDrawer.allServices" : "Alle diensten",
323 "workspaceDrawer.headline" : "Werkruimtes", 323 "workspaceDrawer.headline" : "Werkruimtes",
324 "workspaceDrawer.item.contextMenuEdit" : "edit", 324 "workspaceDrawer.item.contextMenuEdit" : "bewerken",
325 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet" : "Nog geen diensten 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" : "Heractiveer premium account",
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 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>",
330 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings", 330 "workspaceDrawer.workspacesSettingsTooltip" : "Pas werkruimte instellingen aan",
331 "workspaces.switchingIndicator.switchingTo" : "Switching to" 331 "workspaces.switchingIndicator.switchingTo" : "Overschakelen naar"
332} 332}
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index a5d1ea377..5ade8a5a9 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -1,35 +1,35 @@
1{ 1{
2 "app.errorHandler.action" : "Prz‚aduj", 2 "app.errorHandler.action" : "OdÅ›wi¼",
3 "app.errorHandler.headline" : "Coś poszło nie tak", 3 "app.errorHandler.headline" : "Coś poszło nie tak.",
4 "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}", 4 "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}",
5 "feature.delayApp.action" : "Uzyskaj licencjÄ™ Franz Supporter", 5 "feature.delayApp.action" : "Uzyskaj licencjÄ™ Franz Supporter",
6 "feature.delayApp.headline" : "Aby nie czekać kup licencję Franz Supporter", 6 "feature.delayApp.headline" : "Aby nie czekać, kup licencję Franz Supporter",
7 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.", 7 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.",
8 "feature.shareFranz.action.email" : "Wyślij jako email", 8 "feature.shareFranz.action.email" : "Wyślij jako email",
9 "feature.shareFranz.action.facebook" : "Udostępnij na Facebooku", 9 "feature.shareFranz.action.facebook" : "Udostępnij na Facebooku",
10 "feature.shareFranz.action.twitter" : "Udostępnij na Twitterze", 10 "feature.shareFranz.action.twitter" : "Udostępnij na Twitterze",
11 "feature.shareFranz.headline" : "Franz jest lepszy, gdy tworzymy go razem!", 11 "feature.shareFranz.headline" : "Franz jest lepszy, gdy tworzymy go razem!",
12 "feature.shareFranz.shareText.email" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikacją WhatsApp, Messenger, Slack, Skype i inne na www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikację z WhatsApp, Messenger, Slack, Skype i innymi na www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikacją WhatsApp, Messenger, Slack, Skype i inne na www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Dodałem {count} serwisów do Franza! Pobierz darmową aplikację z WhatsApp, Messenger, Slack, Skype i innymi na www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Powiedz znajomym i kolegom o tym, jak odlotowy jest Franz i pomóż nam go spopularyzować.", 14 "feature.shareFranz.text" : "Powiedz znajomym i kolegom o tym, jak odlotowy jest Franz i pomóż nam go spopularyzować.",
15 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online", 15 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online",
16 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.", 16 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.",
17 "global.spellchecker.useDefault" : "Użyj domyślnego dla systemu ({default})", 17 "global.spellchecker.useDefault" : "Użyj domyślnego dla systemu ({default})",
18 "global.spellchecking.autodetect" : "Automatycznie wykryj język", 18 "global.spellchecking.autodetect" : "Automatycznie wykryj język",
19 "global.spellchecking.autodetect.short" : "Automatycznie", 19 "global.spellchecking.autodetect.short" : "Automatycznie",
20 "global.spellchecking.language" : "Język słownika", 20 "global.spellchecking.language" : "Język sprawdzania pisowni",
21 "import.headline" : "Importuj usługi Franz 4", 21 "import.headline" : "Importuj usługi Franz 4",
22 "import.notSupportedHeadline" : "Usługi, które nie są jeszcze obsługiwane w Franz 5", 22 "import.notSupportedHeadline" : "Usługi, które nie są jeszcze obsługiwane w Franz 5",
23 "import.skip.label" : "Chcę dodać usługi samodzielnie", 23 "import.skip.label" : "Chcę dodać usługi samodzielnie",
24 "import.submit.label" : "Zaimportuj usługi", 24 "import.submit.label" : "Zaimportuj usługi",
25 "infobar.buttonChangelog" : "Co nowego?", 25 "infobar.buttonChangelog" : "Co nowego?",
26 "infobar.buttonInstallUpdate" : "Uruchom ponownie i zainstaluj aktualizacjÄ™", 26 "infobar.buttonInstallUpdate" : "Uruchom ponownie i zainstaluj aktualizacjÄ™",
27 "infobar.buttonReloadServices" : "Załaduj ponownie usługi", 27 "infobar.buttonReloadServices" : "Odśwież usługi",
28 "infobar.requiredRequestsFailed" : "Nie można załadować usług i informacji użytkownika", 28 "infobar.requiredRequestsFailed" : "Nie można załadować usług i informacji użytkownika",
29 "infobar.servicesUpdated" : "Usługi zostały zaktualizowane.", 29 "infobar.servicesUpdated" : "Usługi zostały zaktualizowane.",
30 "infobar.updateAvailable" : "Dostępna jest nowa wersja Franza.", 30 "infobar.updateAvailable" : "Dostępna jest nowa wersja Franza.",
31 "invite.email.label" : "Adres email", 31 "invite.email.label" : "Adres email",
32 "invite.headline.friends" : "Zaproś 3 znajomych lub współpracowników", 32 "invite.headline.friends" : "Zaproś 3 znajomych lub kolegów",
33 "invite.name.label" : "ImiÄ™", 33 "invite.name.label" : "ImiÄ™",
34 "invite.skip.label" : "Chcę to zrobić później", 34 "invite.skip.label" : "Chcę to zrobić później",
35 "invite.submit.label" : "Wyślij zaproszenia", 35 "invite.submit.label" : "Wyślij zaproszenia",
@@ -37,7 +37,7 @@
37 "login.email.label" : "Adres email", 37 "login.email.label" : "Adres email",
38 "login.headline" : "Zaloguj siÄ™", 38 "login.headline" : "Zaloguj siÄ™",
39 "login.invalidCredentials" : "Adres email lub hasło są błędne", 39 "login.invalidCredentials" : "Adres email lub hasło są błędne",
40 "login.link.password" : "Przypomnij hasło", 40 "login.link.password" : "Zresetuj hasło",
41 "login.link.signup" : "Załóż darmowe konto", 41 "login.link.signup" : "Załóż darmowe konto",
42 "login.password.label" : "Hasło", 42 "login.password.label" : "Hasło",
43 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.", 43 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.",
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 27fd796a4..60d74495e 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,23 +1,23 @@
1{ 1{
2 "app.errorHandler.action" : "Atualizar", 2 "app.errorHandler.action" : "Recarregar",
3 "app.errorHandler.headline" : "Alguma coisa deu errado", 3 "app.errorHandler.headline" : "Opa! Algo deu errado.",
4 "feature.announcements.changelog.headline" : "Mudanças no Franz {version}", 4 "feature.announcements.changelog.headline" : "Mudanças no Franz {version}",
5 "feature.delayApp.action" : "Adquira uma licença Franz Supporter", 5 "feature.delayApp.action" : "Adquira uma licença de suporte Franz",
6 "feature.delayApp.headline" : "Por favor, adquira uma licença Franz Supporter para pular o tempo de espera", 6 "feature.delayApp.headline" : "Por favor, adquira uma licença para pular o tempo de espera",
7 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.", 7 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.",
8 "feature.shareFranz.action.email" : "Enviar como e-mail", 8 "feature.shareFranz.action.email" : "Enviar por e-mail",
9 "feature.shareFranz.action.facebook" : "Compartilhar no Facebook", 9 "feature.shareFranz.action.facebook" : "Compartilhar no Facebook",
10 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter", 10 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter",
11 "feature.shareFranz.headline" : "Franz é melhor em grupo!", 11 "feature.shareFranz.headline" : "Franz é melhor em grupo!",
12 "feature.shareFranz.shareText.email" : "Eu adicionei {count} serviços ao Franz! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em www.meetfranz.com", 12 "feature.shareFranz.shareText.email" : "Eu adicionei {count} serviços ao Franz! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em www.meetfranz.com",
13 "feature.shareFranz.shareText.twitter" : "Eu adicionei uma contagem de serviços para o Franz! Baixe gratuitamente o aplicativo para WhatsApp, Messenger, Slack, Skype e outros em www.meetfranz.com \/cc @FranzMessenger", 13 "feature.shareFranz.shareText.twitter" : "Eu adicionei uma contagem de serviços para o Franz! Baixe gratuitamente o aplicativo para WhatsApp, Messenger, Slack, Skype e outros em www.meetfranz.com \/cc @FranzMessenger",
14 "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quão incrível Franz é e nos ajude a espalhar a mensagem. ", 14 "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quanto incrível o Franz é e nos ajude a espalhar a mensagem. ",
15 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.", 15 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.",
16 "global.notConnectedToTheInternet" : "Você não está conectado à internet", 16 "global.notConnectedToTheInternet" : "Você não está conectado à internet",
17 "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})", 17 "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})",
18 "global.spellchecking.autodetect" : "Detectar linguagem automaticamente.", 18 "global.spellchecking.autodetect" : "Detectar idioma automaticamente.",
19 "global.spellchecking.autodetect.short" : "Automático", 19 "global.spellchecking.autodetect.short" : "Automático",
20 "global.spellchecking.language" : "Idioma de verificação ortográfica", 20 "global.spellchecking.language" : "Idioma para verificação ortográfica",
21 "import.headline" : "Importe seus serviços do Franz 4 ", 21 "import.headline" : "Importe seus serviços do Franz 4 ",
22 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ", 22 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ",
23 "import.skip.label" : "Quero adicionar serviços manualmente", 23 "import.skip.label" : "Quero adicionar serviços manualmente",
@@ -50,7 +50,7 @@
50 "menu.app.hideOthers" : "Ocultar Outros", 50 "menu.app.hideOthers" : "Ocultar Outros",
51 "menu.app.quit" : "Sair", 51 "menu.app.quit" : "Sair",
52 "menu.app.settings" : "Configurações", 52 "menu.app.settings" : "Configurações",
53 "menu.app.unhide" : "Reexibir", 53 "menu.app.unhide" : "Mostrar",
54 "menu.edit" : "Editar", 54 "menu.edit" : "Editar",
55 "menu.edit.copy" : "Copiar", 55 "menu.edit.copy" : "Copiar",
56 "menu.edit.cut" : "Cortar", 56 "menu.edit.cut" : "Cortar",
@@ -60,7 +60,7 @@
60 "menu.edit.pasteAndMatchStyle" : "Colar e Corresponder ao Estilo", 60 "menu.edit.pasteAndMatchStyle" : "Colar e Corresponder ao Estilo",
61 "menu.edit.redo" : "Refazer", 61 "menu.edit.redo" : "Refazer",
62 "menu.edit.selectAll" : "Selecionar Tudo", 62 "menu.edit.selectAll" : "Selecionar Tudo",
63 "menu.edit.speech" : "Discurso", 63 "menu.edit.speech" : "Falar",
64 "menu.edit.startDictation" : "Iniciar Digitação", 64 "menu.edit.startDictation" : "Iniciar Digitação",
65 "menu.edit.startSpeaking" : "Começar a Falar", 65 "menu.edit.startSpeaking" : "Começar a Falar",
66 "menu.edit.stopSpeaking" : "Parar de Falar", 66 "menu.edit.stopSpeaking" : "Parar de Falar",
@@ -144,7 +144,7 @@
144 "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário", 144 "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário",
145 "settings.app.buttonClearAllCache" : "Limpar cache", 145 "settings.app.buttonClearAllCache" : "Limpar cache",
146 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar atualização", 146 "settings.app.buttonInstallUpdate" : "Reiniciar e instalar atualização",
147 "settings.app.buttonSearchForUpdate" : "Verificar se há atualizações", 147 "settings.app.buttonSearchForUpdate" : "Verificar por atualizações",
148 "settings.app.cacheInfo" : "O cache do Franz está usando {size} de espaço em disco atualmente.", 148 "settings.app.cacheInfo" : "O cache do Franz está usando {size} de espaço em disco atualmente.",
149 "settings.app.currentVersion" : "Versão atual:", 149 "settings.app.currentVersion" : "Versão atual:",
150 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano", 150 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index d8200b4f3..1dc5ce838 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -118,7 +118,7 @@
118 "service.errorHandler.headline" : "Hayııırrr!", 118 "service.errorHandler.headline" : "Hayııırrr!",
119 "service.errorHandler.message" : "Hata", 119 "service.errorHandler.message" : "Hata",
120 "service.errorHandler.text" : "{name} yüklenemedi.", 120 "service.errorHandler.text" : "{name} yüklenemedi.",
121 "service.webviewLoader.loading" : "Loading", 121 "service.webviewLoader.loading" : "Yükleniyor",
122 "services.getStarted" : "Haydi başlayalım", 122 "services.getStarted" : "Haydi başlayalım",
123 "services.welcome" : "Franz'a HoÅŸgeldiniz", 123 "services.welcome" : "Franz'a HoÅŸgeldiniz",
124 "settings.account.account.editButton" : "Hesabı düzenle", 124 "settings.account.account.editButton" : "Hesabı düzenle",
@@ -233,7 +233,7 @@
233 "settings.services.discoverServices" : "Servisleri keÅŸfet", 233 "settings.services.discoverServices" : "Servisleri keÅŸfet",
234 "settings.services.headline" : "Servislerin", 234 "settings.services.headline" : "Servislerin",
235 "settings.services.noServicesAdded" : "Henüz hiç servis eklemedin.", 235 "settings.services.noServicesAdded" : "Henüz hiç servis eklemedin.",
236 "settings.services.servicesRequestFailed" : "Could not load your services", 236 "settings.services.servicesRequestFailed" : "Hizmetiniz yüklenemedi",
237 "settings.services.tooltip.isDisabled" : "Servis devre dışı", 237 "settings.services.tooltip.isDisabled" : "Servis devre dışı",
238 "settings.services.tooltip.isMuted" : "Tüm sesler kapalı", 238 "settings.services.tooltip.isMuted" : "Tüm sesler kapalı",
239 "settings.services.tooltip.notificationsDisabled" : "Bildirimler devre dışı", 239 "settings.services.tooltip.notificationsDisabled" : "Bildirimler devre dışı",
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index daafb0900..6f878cbd1 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -377,15 +377,54 @@
377 } 377 }
378 }, 378 },
379 { 379 {
380 "id": "menu.help.debugInfo",
381 "defaultMessage": "!!!Copy Debug Information",
382 "file": "src/lib/Menu.js",
383 "start": {
384 "line": 131,
385 "column": 13
386 },
387 "end": {
388 "line": 134,
389 "column": 3
390 }
391 },
392 {
393 "id": "menu.help.debugInfoCopiedHeadline",
394 "defaultMessage": "!!!Franz Debug Information",
395 "file": "src/lib/Menu.js",
396 "start": {
397 "line": 135,
398 "column": 27
399 },
400 "end": {
401 "line": 138,
402 "column": 3
403 }
404 },
405 {
406 "id": "menu.help.debugInfoCopiedBody",
407 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
408 "file": "src/lib/Menu.js",
409 "start": {
410 "line": 139,
411 "column": 23
412 },
413 "end": {
414 "line": 142,
415 "column": 3
416 }
417 },
418 {
380 "id": "menu.help.tos", 419 "id": "menu.help.tos",
381 "defaultMessage": "!!!Terms of Service", 420 "defaultMessage": "!!!Terms of Service",
382 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
383 "start": { 422 "start": {
384 "line": 131, 423 "line": 143,
385 "column": 7 424 "column": 7
386 }, 425 },
387 "end": { 426 "end": {
388 "line": 134, 427 "line": 146,
389 "column": 3 428 "column": 3
390 } 429 }
391 }, 430 },
@@ -394,11 +433,11 @@
394 "defaultMessage": "!!!Privacy Statement", 433 "defaultMessage": "!!!Privacy Statement",
395 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
396 "start": { 435 "start": {
397 "line": 135, 436 "line": 147,
398 "column": 11 437 "column": 11
399 }, 438 },
400 "end": { 439 "end": {
401 "line": 138, 440 "line": 150,
402 "column": 3 441 "column": 3
403 } 442 }
404 }, 443 },
@@ -407,11 +446,11 @@
407 "defaultMessage": "!!!File", 446 "defaultMessage": "!!!File",
408 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
409 "start": { 448 "start": {
410 "line": 139, 449 "line": 151,
411 "column": 8 450 "column": 8
412 }, 451 },
413 "end": { 452 "end": {
414 "line": 142, 453 "line": 154,
415 "column": 3 454 "column": 3
416 } 455 }
417 }, 456 },
@@ -420,11 +459,11 @@
420 "defaultMessage": "!!!View", 459 "defaultMessage": "!!!View",
421 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
422 "start": { 461 "start": {
423 "line": 143, 462 "line": 155,
424 "column": 8 463 "column": 8
425 }, 464 },
426 "end": { 465 "end": {
427 "line": 146, 466 "line": 158,
428 "column": 3 467 "column": 3
429 } 468 }
430 }, 469 },
@@ -433,11 +472,11 @@
433 "defaultMessage": "!!!Services", 472 "defaultMessage": "!!!Services",
434 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
435 "start": { 474 "start": {
436 "line": 147, 475 "line": 159,
437 "column": 12 476 "column": 12
438 }, 477 },
439 "end": { 478 "end": {
440 "line": 150, 479 "line": 162,
441 "column": 3 480 "column": 3
442 } 481 }
443 }, 482 },
@@ -446,11 +485,11 @@
446 "defaultMessage": "!!!Window", 485 "defaultMessage": "!!!Window",
447 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
448 "start": { 487 "start": {
449 "line": 151, 488 "line": 163,
450 "column": 10 489 "column": 10
451 }, 490 },
452 "end": { 491 "end": {
453 "line": 154, 492 "line": 166,
454 "column": 3 493 "column": 3
455 } 494 }
456 }, 495 },
@@ -459,11 +498,11 @@
459 "defaultMessage": "!!!Help", 498 "defaultMessage": "!!!Help",
460 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
461 "start": { 500 "start": {
462 "line": 155, 501 "line": 167,
463 "column": 8 502 "column": 8
464 }, 503 },
465 "end": { 504 "end": {
466 "line": 158, 505 "line": 170,
467 "column": 3 506 "column": 3
468 } 507 }
469 }, 508 },
@@ -472,11 +511,11 @@
472 "defaultMessage": "!!!About Franz", 511 "defaultMessage": "!!!About Franz",
473 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
474 "start": { 513 "start": {
475 "line": 159, 514 "line": 171,
476 "column": 9 515 "column": 9
477 }, 516 },
478 "end": { 517 "end": {
479 "line": 162, 518 "line": 174,
480 "column": 3 519 "column": 3
481 } 520 }
482 }, 521 },
@@ -485,11 +524,11 @@
485 "defaultMessage": "!!!What's new?", 524 "defaultMessage": "!!!What's new?",
486 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
487 "start": { 526 "start": {
488 "line": 163, 527 "line": 175,
489 "column": 16 528 "column": 16
490 }, 529 },
491 "end": { 530 "end": {
492 "line": 166, 531 "line": 178,
493 "column": 3 532 "column": 3
494 } 533 }
495 }, 534 },
@@ -498,11 +537,11 @@
498 "defaultMessage": "!!!Settings", 537 "defaultMessage": "!!!Settings",
499 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
500 "start": { 539 "start": {
501 "line": 167, 540 "line": 179,
502 "column": 12 541 "column": 12
503 }, 542 },
504 "end": { 543 "end": {
505 "line": 170, 544 "line": 182,
506 "column": 3 545 "column": 3
507 } 546 }
508 }, 547 },
@@ -511,11 +550,11 @@
511 "defaultMessage": "!!!Check for updates", 550 "defaultMessage": "!!!Check for updates",
512 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
513 "start": { 552 "start": {
514 "line": 171, 553 "line": 183,
515 "column": 19 554 "column": 19
516 }, 555 },
517 "end": { 556 "end": {
518 "line": 174, 557 "line": 186,
519 "column": 3 558 "column": 3
520 } 559 }
521 }, 560 },
@@ -524,11 +563,11 @@
524 "defaultMessage": "!!!Hide", 563 "defaultMessage": "!!!Hide",
525 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
526 "start": { 565 "start": {
527 "line": 175, 566 "line": 187,
528 "column": 8 567 "column": 8
529 }, 568 },
530 "end": { 569 "end": {
531 "line": 178, 570 "line": 190,
532 "column": 3 571 "column": 3
533 } 572 }
534 }, 573 },
@@ -537,11 +576,11 @@
537 "defaultMessage": "!!!Hide Others", 576 "defaultMessage": "!!!Hide Others",
538 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
539 "start": { 578 "start": {
540 "line": 179, 579 "line": 191,
541 "column": 14 580 "column": 14
542 }, 581 },
543 "end": { 582 "end": {
544 "line": 182, 583 "line": 194,
545 "column": 3 584 "column": 3
546 } 585 }
547 }, 586 },
@@ -550,11 +589,11 @@
550 "defaultMessage": "!!!Unhide", 589 "defaultMessage": "!!!Unhide",
551 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
552 "start": { 591 "start": {
553 "line": 183, 592 "line": 195,
554 "column": 10 593 "column": 10
555 }, 594 },
556 "end": { 595 "end": {
557 "line": 186, 596 "line": 198,
558 "column": 3 597 "column": 3
559 } 598 }
560 }, 599 },
@@ -563,11 +602,11 @@
563 "defaultMessage": "!!!Quit", 602 "defaultMessage": "!!!Quit",
564 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
565 "start": { 604 "start": {
566 "line": 187, 605 "line": 199,
567 "column": 8 606 "column": 8
568 }, 607 },
569 "end": { 608 "end": {
570 "line": 190, 609 "line": 202,
571 "column": 3 610 "column": 3
572 } 611 }
573 }, 612 },
@@ -576,11 +615,11 @@
576 "defaultMessage": "!!!Add New Service...", 615 "defaultMessage": "!!!Add New Service...",
577 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
578 "start": { 617 "start": {
579 "line": 191, 618 "line": 203,
580 "column": 17 619 "column": 17
581 }, 620 },
582 "end": { 621 "end": {
583 "line": 194, 622 "line": 206,
584 "column": 3 623 "column": 3
585 } 624 }
586 }, 625 },
@@ -589,11 +628,11 @@
589 "defaultMessage": "!!!Add New Workspace...", 628 "defaultMessage": "!!!Add New Workspace...",
590 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
591 "start": { 630 "start": {
592 "line": 195, 631 "line": 207,
593 "column": 19 632 "column": 19
594 }, 633 },
595 "end": { 634 "end": {
596 "line": 198, 635 "line": 210,
597 "column": 3 636 "column": 3
598 } 637 }
599 }, 638 },
@@ -602,11 +641,11 @@
602 "defaultMessage": "!!!Open workspace drawer", 641 "defaultMessage": "!!!Open workspace drawer",
603 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
604 "start": { 643 "start": {
605 "line": 199, 644 "line": 211,
606 "column": 23 645 "column": 23
607 }, 646 },
608 "end": { 647 "end": {
609 "line": 202, 648 "line": 214,
610 "column": 3 649 "column": 3
611 } 650 }
612 }, 651 },
@@ -615,11 +654,11 @@
615 "defaultMessage": "!!!Close workspace drawer", 654 "defaultMessage": "!!!Close workspace drawer",
616 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
617 "start": { 656 "start": {
618 "line": 203, 657 "line": 215,
619 "column": 24 658 "column": 24
620 }, 659 },
621 "end": { 660 "end": {
622 "line": 206, 661 "line": 218,
623 "column": 3 662 "column": 3
624 } 663 }
625 }, 664 },
@@ -628,11 +667,11 @@
628 "defaultMessage": "!!!Activate next service...", 667 "defaultMessage": "!!!Activate next service...",
629 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
630 "start": { 669 "start": {
631 "line": 207, 670 "line": 219,
632 "column": 23 671 "column": 23
633 }, 672 },
634 "end": { 673 "end": {
635 "line": 210, 674 "line": 222,
636 "column": 3 675 "column": 3
637 } 676 }
638 }, 677 },
@@ -641,11 +680,11 @@
641 "defaultMessage": "!!!Activate previous service...", 680 "defaultMessage": "!!!Activate previous service...",
642 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
643 "start": { 682 "start": {
644 "line": 211, 683 "line": 223,
645 "column": 27 684 "column": 27
646 }, 685 },
647 "end": { 686 "end": {
648 "line": 214, 687 "line": 226,
649 "column": 3 688 "column": 3
650 } 689 }
651 }, 690 },
@@ -654,11 +693,11 @@
654 "defaultMessage": "!!!Disable notifications & audio", 693 "defaultMessage": "!!!Disable notifications & audio",
655 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
656 "start": { 695 "start": {
657 "line": 215, 696 "line": 227,
658 "column": 11 697 "column": 11
659 }, 698 },
660 "end": { 699 "end": {
661 "line": 218, 700 "line": 230,
662 "column": 3 701 "column": 3
663 } 702 }
664 }, 703 },
@@ -667,11 +706,11 @@
667 "defaultMessage": "!!!Enable notifications & audio", 706 "defaultMessage": "!!!Enable notifications & audio",
668 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
669 "start": { 708 "start": {
670 "line": 219, 709 "line": 231,
671 "column": 13 710 "column": 13
672 }, 711 },
673 "end": { 712 "end": {
674 "line": 222, 713 "line": 234,
675 "column": 3 714 "column": 3
676 } 715 }
677 }, 716 },
@@ -680,11 +719,11 @@
680 "defaultMessage": "!!!Workspaces", 719 "defaultMessage": "!!!Workspaces",
681 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
682 "start": { 721 "start": {
683 "line": 223, 722 "line": 235,
684 "column": 14 723 "column": 14
685 }, 724 },
686 "end": { 725 "end": {
687 "line": 226, 726 "line": 238,
688 "column": 3 727 "column": 3
689 } 728 }
690 }, 729 },
@@ -693,11 +732,11 @@
693 "defaultMessage": "!!!Default", 732 "defaultMessage": "!!!Default",
694 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
695 "start": { 734 "start": {
696 "line": 227, 735 "line": 239,
697 "column": 20 736 "column": 20
698 }, 737 },
699 "end": { 738 "end": {
700 "line": 230, 739 "line": 242,
701 "column": 3 740 "column": 3
702 } 741 }
703 } 742 }
diff --git a/src/index.html b/src/index.html
index bf15e2d4e..f29aa2686 100644
--- a/src/index.html
+++ b/src/index.html
@@ -10,6 +10,7 @@
10 <div class="window-draggable"></div> 10 <div class="window-draggable"></div>
11 <div class="dev-warning">DEV MODE</div> 11 <div class="dev-warning">DEV MODE</div>
12 <div id="root"></div> 12 <div id="root"></div>
13 <div id="portalContainer"></div>
13 <script> 14 <script>
14 document.querySelector('body').classList.add(process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform); 15 document.querySelector('body').classList.add(process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform);
15 16
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index e0dfd736e..22d788918 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -1,4 +1,4 @@
1import { remote, shell } from 'electron'; 1import { remote, shell, clipboard } from 'electron';
2import { observable, autorun } from 'mobx'; 2import { observable, autorun } from 'mobx';
3import { defineMessages } from 'react-intl'; 3import { defineMessages } from 'react-intl';
4 4
@@ -128,6 +128,18 @@ const menuItems = defineMessages({
128 id: 'menu.help.support', 128 id: 'menu.help.support',
129 defaultMessage: '!!!Support', 129 defaultMessage: '!!!Support',
130 }, 130 },
131 debugInfo: {
132 id: 'menu.help.debugInfo',
133 defaultMessage: '!!!Copy Debug Information',
134 },
135 debugInfoCopiedHeadline: {
136 id: 'menu.help.debugInfoCopiedHeadline',
137 defaultMessage: '!!!Franz Debug Information',
138 },
139 debugInfoCopiedBody: {
140 id: 'menu.help.debugInfoCopiedBody',
141 defaultMessage: '!!!Your Debug Information has been copied to your clipboard.',
142 },
131 tos: { 143 tos: {
132 id: 'menu.help.tos', 144 id: 'menu.help.tos',
133 defaultMessage: '!!!Terms of Service', 145 defaultMessage: '!!!Terms of Service',
@@ -760,6 +772,10 @@ export default class FranzMenu {
760 tpl[4].submenu = this.workspacesMenu(); 772 tpl[4].submenu = this.workspacesMenu();
761 } 773 }
762 774
775 tpl[tpl.length - 1].submenu.push({
776 type: 'separator',
777 }, this.debugMenu());
778
763 this.currentTemplate = tpl; 779 this.currentTemplate = tpl;
764 const menu = Menu.buildFromTemplate(tpl); 780 const menu = Menu.buildFromTemplate(tpl);
765 Menu.setApplicationMenu(menu); 781 Menu.setApplicationMenu(menu);
@@ -870,6 +886,28 @@ export default class FranzMenu {
870 return menu; 886 return menu;
871 } 887 }
872 888
889 debugMenu() {
890 const { intl } = window.franz;
891
892 return {
893 label: intl.formatMessage(menuItems.debugInfo),
894 click: () => {
895 const { debugInfo } = this.stores.app;
896
897 clipboard.write({
898 text: JSON.stringify(debugInfo),
899 });
900
901 this.actions.app.notify({
902 title: intl.formatMessage(menuItems.debugInfoCopiedHeadline),
903 options: {
904 body: intl.formatMessage(menuItems.debugInfoCopiedBody),
905 },
906 });
907 },
908 };
909 }
910
873 _getServiceName(service) { 911 _getServiceName(service) {
874 if (service.name) { 912 if (service.name) {
875 return service.name; 913 return service.name;
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 72c4b4d0b..2ac306a2a 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -8,6 +8,9 @@ import AutoLaunch from 'auto-launch';
8import prettyBytes from 'pretty-bytes'; 8import prettyBytes from 'pretty-bytes';
9import ms from 'ms'; 9import ms from 'ms';
10import { URL } from 'url'; 10import { URL } from 'url';
11import os from 'os';
12import path from 'path';
13import { readJsonSync } from 'fs-extra';
11 14
12import Store from './lib/Store'; 15import Store from './lib/Store';
13import Request from './lib/Request'; 16import Request from './lib/Request';
@@ -23,7 +26,7 @@ import { isValidExternalURL } from '../helpers/url-helpers';
23 26
24const debug = require('debug')('Franz:AppStore'); 27const debug = require('debug')('Franz:AppStore');
25 28
26const { app, systemPreferences } = remote; 29const { app, systemPreferences, screen } = remote;
27 30
28const mainWindow = remote.getCurrentWindow(); 31const mainWindow = remote.getCurrentWindow();
29 32
@@ -182,6 +185,26 @@ export default class AppStore extends Store {
182 return prettyBytes(this.getAppCacheSizeRequest.execute().result || 0); 185 return prettyBytes(this.getAppCacheSizeRequest.execute().result || 0);
183 } 186 }
184 187
188 @computed get debugInfo() {
189 return {
190 host: {
191 platform: process.platform,
192 release: os.release(),
193 screens: screen.getAllDisplays(),
194 },
195 franz: {
196 version: app.getVersion(),
197 electron: process.versions.electron,
198 installedRecipes: this.stores.recipes.all.map(recipe => ({ id: recipe.id, version: recipe.version })),
199 devRecipes: this.stores.recipePreviews.dev.map(recipe => ({ id: recipe.id, version: recipe.version })),
200 services: this.stores.services.all.map(service => ({ id: service.id, recipe: service.recipe.id })),
201 workspaces: this.stores.workspaces.workspaces.map(workspace => ({ id: workspace.id, services: workspace.services })),
202 windowSettings: readJsonSync(path.join(app.getPath('userData'), 'window-state.json')),
203 user: this.stores.user.data.id,
204 },
205 };
206 }
207
185 // Actions 208 // Actions
186 @action _notify({ 209 @action _notify({
187 title, options, notificationId, serviceId = null, 210 title, options, notificationId, serviceId = null,
@@ -189,7 +212,7 @@ export default class AppStore extends Store {
189 if (this.stores.settings.all.app.isAppMuted) return; 212 if (this.stores.settings.all.app.isAppMuted) return;
190 213
191 // TODO: is there a simple way to use blobs for notifications without storing them on disk? 214 // TODO: is there a simple way to use blobs for notifications without storing them on disk?
192 if (options.icon.startsWith('blob:')) { 215 if (options.icon && options.icon.startsWith('blob:')) {
193 delete options.icon; 216 delete options.icon;
194 } 217 }
195 218
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index a95a8e1e0..9680c5bcc 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -1,4 +1,9 @@
1import { action, observable, computed } from 'mobx'; 1import {
2 action,
3 observable,
4 computed,
5 reaction,
6} from 'mobx';
2import { theme } from '@meetfranz/theme'; 7import { theme } from '@meetfranz/theme';
3 8
4import Store from './lib/Store'; 9import Store from './lib/Store';
@@ -15,10 +20,18 @@ export default class UIStore extends Store {
15 this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this)); 20 this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this));
16 } 21 }
17 22
23 setup() {
24 reaction(
25 () => this.isDarkThemeActive,
26 () => this._setupThemeInDOM(),
27 { fireImmediately: true },
28 );
29 }
30
18 @computed get showMessageBadgesEvenWhenMuted() { 31 @computed get showMessageBadgesEvenWhenMuted() {
19 const settings = this.stores.settings.all; 32 const settings = this.stores.settings.all;
20 33
21 return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.isAppMuted; 34 return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.app.isAppMuted;
22 } 35 }
23 36
24 @computed get isDarkThemeActive() { 37 @computed get isDarkThemeActive() {
@@ -26,7 +39,7 @@ export default class UIStore extends Store {
26 } 39 }
27 40
28 @computed get theme() { 41 @computed get theme() {
29 if (this.isDarkThemeActive) return theme('dark'); 42 if (this.isDarkThemeActive || this.stores.settings.app.darkMode) return theme('dark');
30 return theme('default'); 43 return theme('default');
31 } 44 }
32 45
@@ -47,4 +60,15 @@ export default class UIStore extends Store {
47 } 60 }
48 this.showServicesUpdatedInfoBar = visibility; 61 this.showServicesUpdatedInfoBar = visibility;
49 } 62 }
63
64 // Reactions
65 _setupThemeInDOM() {
66 const body = document.querySelector('body');
67
68 if (!this.isDarkThemeActive) {
69 body.classList.remove('theme__dark');
70 } else {
71 body.classList.add('theme__dark');
72 }
73 }
50} 74}
diff --git a/src/stores/lib/Reaction.js b/src/stores/lib/Reaction.js
index f2642908f..f8009b7f6 100644
--- a/src/stores/lib/Reaction.js
+++ b/src/stores/lib/Reaction.js
@@ -13,15 +13,15 @@ export default class Reaction {
13 13
14 start() { 14 start() {
15 if (!this.isRunning) { 15 if (!this.isRunning) {
16 this.dispose = autorun(() => this.reaction()); 16 this.dispose = autorun(this.reaction);
17 this.isActive = true; 17 this.isRunning = true;
18 } 18 }
19 } 19 }
20 20
21 stop() { 21 stop() {
22 if (this.isRunning) { 22 if (this.isRunning) {
23 this.dispose(); 23 this.dispose();
24 this.isActive = false; 24 this.isRunning = false;
25 } 25 }
26 } 26 }
27} 27}
diff --git a/src/styles/reset.scss b/src/styles/reset.scss
index 80328dcef..f46ede4a2 100644
--- a/src/styles/reset.scss
+++ b/src/styles/reset.scss
@@ -64,7 +64,7 @@ body {
64 font-size: 1.4rem; 64 font-size: 1.4rem;
65 line-height: 1; 65 line-height: 1;
66 66
67 .theme__dark { color: $dark-theme-gray-smoke; } 67 &.theme__dark { color: $dark-theme-gray-smoke; }
68} 68}
69 69
70* { 70* {