aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md43
-rw-r--r--package-lock.json68
-rw-r--r--package.json6
-rw-r--r--src/components/auth/AuthLayout.js6
-rw-r--r--src/components/layout/AppLayout.js126
-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/announcements/components/AnnouncementScreen.js2
-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/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/index.html1
-rw-r--r--src/stores/UIStore.js30
-rw-r--r--src/stores/lib/Reaction.js6
-rw-r--r--src/styles/layout.scss2
-rw-r--r--src/styles/reset.scss2
-rw-r--r--src/webview/contextMenu.js5
-rw-r--r--src/webview/spellchecker.js17
28 files changed, 355 insertions, 298 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e1fe2ab45..e5af4ccfa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,46 @@
1# [5.2.0](https://github.com/meetfranz/franz/compare/v5.2.0-beta.4...v5.2.0) (2019-07-19)
2
3### Features
4* **Service:** You can now add any custom website 🥳
5
6### Bug Fixes
7
8* **Notifications:** Don't show notification badges when app is muted ([e844a64](https://github.com/meetfranz/franz/commit/e844a64))
9* **Settings:** Fix position of settings window
10* **Recipes:** Fix recipe install when directly accessing recipe e.g. via url ([eba50bc](https://github.com/meetfranz/franz/commit/eba50bc))
11* **Proxy:** Fix issue with service proxy authentication ([b9e5b23](https://github.com/meetfranz/franz/commit/b9e5b23))
12* **Announcements:** Fix issue with rendering announcements in workspaces ([1e38ec5](https://github.com/meetfranz/franz/commit/1e38ec5))
13* **Windows:** Add Workspaces menu & fix Window menu ([92a61d4](https://github.com/meetfranz/franz/commit/92a61d4))
14* **Windows:** Replace tray icon with high-res version ([a5eb399](https://github.com/meetfranz/franz/commit/a5eb399))
15* **Workspaces:** Fix service reordering within workspaces ([17f3a22](https://github.com/meetfranz/franz/commit/17f3a22))
16* **Workspaces:** Fix issue with service visibility after downgrade ([05294](https://github.com/meetfranz/franz/commit/05294))
17
18### General
19* **App:** Improved email validation ([dd8ddcc](https://github.com/meetfranz/franz/commit/dd8ddcc)) ([@Snuggle](https://github.com/Snuggle))
20* **App:** Update electron to 4.2.4 ([404c87a](https://github.com/meetfranz/franz/commit/404c87a))
21* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
22
23
24# [5.2.0-beta.4](https://github.com/meetfranz/franz/compare/v5.2.0-beta.3...v5.2.0-beta.4) (2019-07-01)
25
26
27### Bug Fixes
28
29* **Notifications:** Don't show notification badges when app is muted ([e844a64](https://github.com/meetfranz/franz/commit/e844a64))
30* **Settings:** Fix position of settings window
31
32### General
33
34* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
35
36
37# [5.2.0-beta.3](https://github.com/meetfranz/franz/compare/v5.2.0-beta.2...v5.2.0-beta.3) (2019-06-24)
38
39### General
40
41* **App:** Downgraded electron to 4.2.4 ([404c87a](https://github.com/meetfranz/franz/commit/404c87a))
42
43
1# [5.2.0-beta.2](https://github.com/meetfranz/franz/compare/v5.2.0-beta.1...v5.2.0-beta.2) (2019-06-12) 44# [5.2.0-beta.2](https://github.com/meetfranz/franz/compare/v5.2.0-beta.1...v5.2.0-beta.2) (2019-06-12)
2 45
3 46
diff --git a/package-lock.json b/package-lock.json
index 9e3579e88..17513869a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "franz", 2 "name": "franz",
3 "version": "5.2.0-beta.2", 3 "version": "5.2.0",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
@@ -2179,7 +2179,7 @@
2179 }, 2179 },
2180 "dependencies": { 2180 "dependencies": {
2181 "@meetfranz/theme": { 2181 "@meetfranz/theme": {
2182 "version": "1.0.13", 2182 "version": "1.0.14",
2183 "bundled": true, 2183 "bundled": true,
2184 "requires": { 2184 "requires": {
2185 "color": "^3.1.0" 2185 "color": "^3.1.0"
@@ -2203,7 +2203,7 @@
2203 }, 2203 },
2204 "dependencies": { 2204 "dependencies": {
2205 "@meetfranz/theme": { 2205 "@meetfranz/theme": {
2206 "version": "1.0.13", 2206 "version": "1.0.14",
2207 "bundled": true, 2207 "bundled": true,
2208 "requires": { 2208 "requires": {
2209 "color": "^3.1.0" 2209 "color": "^3.1.0"
@@ -6803,9 +6803,9 @@
6803 "dev": true 6803 "dev": true
6804 }, 6804 },
6805 "electron": { 6805 "electron": {
6806 "version": "5.0.2", 6806 "version": "4.2.4",
6807 "resolved": "https://registry.npmjs.org/electron/-/electron-5.0.2.tgz", 6807 "resolved": "https://registry.npmjs.org/electron/-/electron-4.2.4.tgz",
6808 "integrity": "sha512-bUHKQhyuOen/q8iHTkrnzqB9CAwBDI+vHbeu21kpq2bqAD+t25yfrmUEcYHaPL4fZOAhk6nnRqskF6/Xd+aZxg==", 6808 "integrity": "sha512-d4wEwJluMsRyRgbukLmFVTb6l1J+mc3RLB1ctbpMlSWDFvs+zknPWa+cHBzTWwrdgwINLddr69qsAW1ku6FqYw==",
6809 "dev": true, 6809 "dev": true,
6810 "requires": { 6810 "requires": {
6811 "@types/node": "^10.12.18", 6811 "@types/node": "^10.12.18",
@@ -6814,9 +6814,9 @@
6814 }, 6814 },
6815 "dependencies": { 6815 "dependencies": {
6816 "@types/node": { 6816 "@types/node": {
6817 "version": "10.14.4", 6817 "version": "10.14.9",
6818 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.4.tgz", 6818 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.9.tgz",
6819 "integrity": "sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg==", 6819 "integrity": "sha512-NelG/dSahlXYtSoVPErrp06tYFrvzj8XLWmKA+X8x0W//4MqbUyZu++giUG/v0bjAT6/Qxa8IjodrfdACyb0Fg==",
6820 "dev": true 6820 "dev": true
6821 } 6821 }
6822 } 6822 }
@@ -7043,12 +7043,14 @@
7043 } 7043 }
7044 }, 7044 },
7045 "electron-hunspell": { 7045 "electron-hunspell": {
7046 "version": "1.0.0-beta.7", 7046 "version": "0.1.1",
7047 "resolved": "https://registry.npmjs.org/electron-hunspell/-/electron-hunspell-1.0.0-beta.7.tgz", 7047 "resolved": "https://registry.npmjs.org/electron-hunspell/-/electron-hunspell-0.1.1.tgz",
7048 "integrity": "sha512-BByCXqU8sZbuzyoxKcBYjycp8ORiqjeYZd2OT8RNjVW+XGPmZkHewXUu4tUa1IXW6ij6IqojV5kr+xhYKLN1DA==", 7048 "integrity": "sha512-B3nOQqHexIX+8bz72FZkNk+iFBrdqS9DpV2SaH+t7T9SLbONBVBRLJ2Jj2ytXFUzvw81q7vz2dfxPCddh/E3ww==",
7049 "requires": { 7049 "requires": {
7050 "hunspell-asm": "^2.0.0", 7050 "hunspell-asm": "1.0.2",
7051 "tslib": "1.9.3" 7051 "lodash": "^4.17.11",
7052 "tslib": "1.9.3",
7053 "unixify": "1.0.0"
7052 } 7054 }
7053 }, 7055 },
7054 "electron-is-dev": { 7056 "electron-is-dev": {
@@ -11379,34 +11381,14 @@
11379 } 11381 }
11380 }, 11382 },
11381 "hunspell-asm": { 11383 "hunspell-asm": {
11382 "version": "2.0.0", 11384 "version": "1.0.2",
11383 "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-2.0.0.tgz", 11385 "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz",
11384 "integrity": "sha512-FMIUBpy+bRREFAvC63RcYEK9U6+FdlEojGSVsvMTpuZ2CekYyUBwEfG4+ExIQOQyEN0U6f1MoVgrFqvgPNSA2g==", 11386 "integrity": "sha512-UTLBvc0yZiIcHl9qrgxnFTZbX3zF4CprzEY+u+N0iXlUKZnUJRIgvgppTdgiQTsucm5b0aN/rHsgXz2q/0kBRA==",
11385 "requires": { 11387 "requires": {
11386 "emscripten-wasm-loader": "^2.2.3", 11388 "emscripten-wasm-loader": "^1.0.0",
11387 "nanoid": "^2.0.1", 11389 "nanoid": "^1.0.2",
11388 "tslib": "^1.9.3", 11390 "tslib": "^1.9.0",
11389 "unixify": "^1.0.0" 11391 "unixify": "^1.0.0"
11390 },
11391 "dependencies": {
11392 "emscripten-wasm-loader": {
11393 "version": "2.2.3",
11394 "resolved": "https://registry.npmjs.org/emscripten-wasm-loader/-/emscripten-wasm-loader-2.2.3.tgz",
11395 "integrity": "sha512-//gI0afvtVnY7smttrPOW/BM+pTJLmdIcXAQV3fgRdQ0o6wm2vdSI0kjLYVOeo/rbtRsGgVuMLu6fT+O//EfaA==",
11396 "requires": {
11397 "getroot": "^1.0.0",
11398 "nanoid": "^1.3.4",
11399 "tslib": "^1.9.3",
11400 "unixify": "^1.0.0"
11401 },
11402 "dependencies": {
11403 "nanoid": {
11404 "version": "1.3.4",
11405 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz",
11406 "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ=="
11407 }
11408 }
11409 }
11410 } 11392 }
11411 }, 11393 },
11412 "husky": { 11394 "husky": {
@@ -14385,9 +14367,9 @@
14385 "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" 14367 "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw=="
14386 }, 14368 },
14387 "nanoid": { 14369 "nanoid": {
14388 "version": "2.0.3", 14370 "version": "1.3.4",
14389 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.3.tgz", 14371 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz",
14390 "integrity": "sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw==" 14372 "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ=="
14391 }, 14373 },
14392 "nanomatch": { 14374 "nanomatch": {
14393 "version": "1.2.13", 14375 "version": "1.2.13",
diff --git a/package.json b/package.json
index 9060c32db..bc5079084 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.2", 5 "version": "5.2.0",
6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.", 6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.",
7 "copyright": "adlk x franz - Stefan Malzner", 7 "copyright": "adlk x franz - Stefan Malzner",
8 "main": "index.js", 8 "main": "index.js",
@@ -47,7 +47,7 @@
47 "du": "^0.1.0", 47 "du": "^0.1.0",
48 "electron-dl": "1.12.0", 48 "electron-dl": "1.12.0",
49 "electron-fetch": "1.3.0", 49 "electron-fetch": "1.3.0",
50 "electron-hunspell": "1.0.0-beta.7", 50 "electron-hunspell": "0.1.1",
51 "electron-is-dev": "1.0.1", 51 "electron-is-dev": "1.0.1",
52 "electron-react-titlebar": "0.8.1", 52 "electron-react-titlebar": "0.8.1",
53 "electron-updater": "4.0.6", 53 "electron-updater": "4.0.6",
@@ -118,7 +118,7 @@
118 "cross-env": "^5.0.5", 118 "cross-env": "^5.0.5",
119 "cz-conventional-changelog": "2.1.0", 119 "cz-conventional-changelog": "2.1.0",
120 "dotenv": "^4.0.0", 120 "dotenv": "^4.0.0",
121 "electron": "5.0.2", 121 "electron": "4.2.4",
122 "electron-builder": "20.40.2", 122 "electron-builder": "20.40.2",
123 "electron-rebuild": "1.8.4", 123 "electron-rebuild": "1.8.4",
124 "eslint": "5.10.0", 124 "eslint": "5.10.0",
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 797db6eb5..7f2f707fb 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -71,7 +71,6 @@ class AppLayout extends Component {
71 areRequiredRequestsSuccessful: PropTypes.bool.isRequired, 71 areRequiredRequestsSuccessful: PropTypes.bool.isRequired,
72 retryRequiredRequests: PropTypes.func.isRequired, 72 retryRequiredRequests: PropTypes.func.isRequired,
73 areRequiredRequestsLoading: PropTypes.bool.isRequired, 73 areRequiredRequestsLoading: PropTypes.bool.isRequired,
74 darkMode: PropTypes.bool.isRequired,
75 isDelayAppScreenVisible: PropTypes.bool.isRequired, 74 isDelayAppScreenVisible: PropTypes.bool.isRequired,
76 }; 75 };
77 76
@@ -105,7 +104,6 @@ class AppLayout extends Component {
105 areRequiredRequestsSuccessful, 104 areRequiredRequestsSuccessful,
106 retryRequiredRequests, 105 retryRequiredRequests,
107 areRequiredRequestsLoading, 106 areRequiredRequestsLoading,
108 darkMode,
109 isDelayAppScreenVisible, 107 isDelayAppScreenVisible,
110 } = this.props; 108 } = this.props;
111 109
@@ -113,69 +111,67 @@ class AppLayout extends Component {
113 111
114 return ( 112 return (
115 <ErrorBoundary> 113 <ErrorBoundary>
116 <div className={(darkMode ? 'theme__dark' : '')}> 114 <div className="app">
117 <div className="app"> 115 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />}
118 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />} 116 <div className={`app__content ${classes.appContent}`}>
119 <div className={`app__content ${classes.appContent}`}> 117 {workspacesDrawer}
120 {workspacesDrawer} 118 {sidebar}
121 {sidebar} 119 <div className="app__service">
122 <div className="app__service"> 120 <WorkspaceSwitchingIndicator />
123 <WorkspaceSwitchingIndicator /> 121 {news.length > 0 && news.map(item => (
124 {news.length > 0 && news.map(item => ( 122 <InfoBar
125 <InfoBar 123 key={item.id}
126 key={item.id} 124 position="top"
127 position="top" 125 type={item.type}
128 type={item.type} 126 sticky={item.sticky}
129 sticky={item.sticky} 127 onHide={() => removeNewsItem({ newsId: item.id })}
130 onHide={() => removeNewsItem({ newsId: item.id })} 128 >
131 > 129 <span dangerouslySetInnerHTML={createMarkup(item.message)} />
132 <span dangerouslySetInnerHTML={createMarkup(item.message)} /> 130 </InfoBar>
133 </InfoBar> 131 ))}
134 ))} 132 {/* {!isOnline && (
135 {/* {!isOnline && ( 133 <InfoBar
136 <InfoBar 134 type="danger"
137 type="danger" 135 sticky
138 sticky 136 >
139 > 137 <span className="mdi mdi-flash" />
140 <span className="mdi mdi-flash" /> 138 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
141 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 139 </InfoBar>
142 </InfoBar> 140 )} */}
143 )} */} 141 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
144 {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( 142 <InfoBar
145 <InfoBar 143 type="danger"
146 type="danger" 144 ctaLabel="Try again"
147 ctaLabel="Try again" 145 ctaLoading={areRequiredRequestsLoading}
148 ctaLoading={areRequiredRequestsLoading} 146 sticky
149 sticky 147 onClick={retryRequiredRequests}
150 onClick={retryRequiredRequests} 148 >
151 > 149 <span className="mdi mdi-flash" />
152 <span className="mdi mdi-flash" /> 150 {intl.formatMessage(messages.requiredRequestsFailed)}
153 {intl.formatMessage(messages.requiredRequestsFailed)} 151 </InfoBar>
154 </InfoBar> 152 )}
155 )} 153 {showServicesUpdatedInfoBar && (
156 {showServicesUpdatedInfoBar && ( 154 <InfoBar
157 <InfoBar 155 type="primary"
158 type="primary" 156 ctaLabel={intl.formatMessage(messages.buttonReloadServices)}
159 ctaLabel={intl.formatMessage(messages.buttonReloadServices)} 157 onClick={reloadServicesAfterUpdate}
160 onClick={reloadServicesAfterUpdate} 158 sticky
161 sticky 159 >
162 > 160 <span className="mdi mdi-power-plug" />
163 <span className="mdi mdi-power-plug" /> 161 {intl.formatMessage(messages.servicesUpdated)}
164 {intl.formatMessage(messages.servicesUpdated)} 162 </InfoBar>
165 </InfoBar> 163 )}
166 )} 164 {appUpdateIsDownloaded && (
167 {appUpdateIsDownloaded && ( 165 <AppUpdateInfoBar
168 <AppUpdateInfoBar 166 nextAppReleaseVersion={nextAppReleaseVersion}
169 nextAppReleaseVersion={nextAppReleaseVersion} 167 onInstallUpdate={installAppUpdate}
170 onInstallUpdate={installAppUpdate} 168 />
171 /> 169 )}
172 )} 170 {isDelayAppScreenVisible && (<DelayApp />)}
173 {isDelayAppScreenVisible && (<DelayApp />)} 171 <BasicAuth />
174 <BasicAuth /> 172 <ShareFranz />
175 <ShareFranz /> 173 {services}
176 {services} 174 {children}
177 {children}
178 </div>
179 </div> 175 </div>
180 <TodosWebview authToken={authToken} /> 176 <TodosWebview authToken={authToken} />
181 </div> 177 </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 473280c54..8a48f4924 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -151,7 +151,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
151 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful} 151 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful}
152 retryRequiredRequests={retryRequiredRequests} 152 retryRequiredRequests={retryRequiredRequests}
153 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 153 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
154 darkMode={settings.all.app.darkMode}
155 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} 154 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
156 > 155 >
157 {React.Children.count(children) > 0 ? children : null} 156 {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/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js
index e7c5fe395..03bd5ba41 100644
--- a/src/features/announcements/components/AnnouncementScreen.js
+++ b/src/features/announcements/components/AnnouncementScreen.js
@@ -28,7 +28,7 @@ const smallScreen = '1000px';
28const styles = theme => ({ 28const styles = theme => ({
29 container: { 29 container: {
30 background: theme.colorBackground, 30 background: theme.colorBackground,
31 position: 'absolute', 31 position: 'relative',
32 top: 0, 32 top: 0,
33 zIndex: 140, 33 zIndex: 140,
34 width: '100%', 34 width: '100%',
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/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 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 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 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" : "Szolltatá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" : "Przeaduj", 2 "app.errorHandler.action" : "Odświe",
3 "app.errorHandler.headline" : "Coś poszło nie tak", 3 "app.errorHandler.headline" : "Coś poszło nie tak.",
4 "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}", 4 "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}",
5 "feature.delayApp.action" : "Uzyskaj licencję 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 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/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/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/layout.scss b/src/styles/layout.scss
index c9cc94e15..739082445 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -40,7 +40,7 @@ html { overflow: hidden; }
40 } 40 }
41 41
42 .app__service { 42 .app__service {
43 position: relative; 43 // position: relative;
44 display: flex; 44 display: flex;
45 flex: 1; 45 flex: 1;
46 flex-direction: column; 46 flex-direction: column;
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* {
diff --git a/src/webview/contextMenu.js b/src/webview/contextMenu.js
index 967e8e667..a4a6ab899 100644
--- a/src/webview/contextMenu.js
+++ b/src/webview/contextMenu.js
@@ -280,13 +280,12 @@ const buildMenuTpl = (props, suggestions, isSpellcheckEnabled, defaultSpellcheck
280}; 280};
281 281
282export default function contextMenu(spellcheckProvider, isSpellcheckEnabled, getDefaultSpellcheckerLanguage, getSpellcheckerLanguage) { 282export default function contextMenu(spellcheckProvider, isSpellcheckEnabled, getDefaultSpellcheckerLanguage, getSpellcheckerLanguage) {
283 webContents.on('context-menu', async (e, props) => { 283 webContents.on('context-menu', (e, props) => {
284 e.preventDefault(); 284 e.preventDefault();
285 285
286 let suggestions = []; 286 let suggestions = [];
287 if (spellcheckProvider && props.misspelledWord) { 287 if (spellcheckProvider && props.misspelledWord) {
288 debug('Mispelled word', props.misspelledWord); 288 suggestions = spellcheckProvider.getSuggestion(props.misspelledWord);
289 suggestions = await spellcheckProvider.getSuggestion(props.misspelledWord);
290 289
291 debug('Suggestions', suggestions); 290 debug('Suggestions', suggestions);
292 } 291 }
diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js
index 417d1ea1a..9158b3b94 100644
--- a/src/webview/spellchecker.js
+++ b/src/webview/spellchecker.js
@@ -1,8 +1,6 @@
1import { webFrame } from 'electron'; 1import { webFrame } from 'electron';
2import { attachSpellCheckProvider, SpellCheckerProvider } from 'electron-hunspell'; 2import { SpellCheckerProvider } from 'electron-hunspell';
3import { ENVIRONMENT } from 'hunspell-asm';
4import path from 'path'; 3import path from 'path';
5import { readFileSync } from 'fs';
6 4
7import { DICTIONARY_PATH } from '../config'; 5import { DICTIONARY_PATH } from '../config';
8import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 6import { SPELLCHECKER_LOCALES } from '../i18n/languages';
@@ -12,12 +10,11 @@ const debug = require('debug')('Franz:spellchecker');
12let provider; 10let provider;
13let currentDict; 11let currentDict;
14let _isEnabled = false; 12let _isEnabled = false;
15let attached;
16 13
17async function loadDictionary(locale) { 14async function loadDictionary(locale) {
18 try { 15 try {
19 const fileLocation = path.join(DICTIONARY_PATH, `hunspell-dict-${locale}/${locale}`); 16 const fileLocation = path.join(DICTIONARY_PATH, `hunspell-dict-${locale}/${locale}`);
20 await provider.loadDictionary(locale, readFileSync(`${fileLocation}.dic`), readFileSync(`${fileLocation}.aff`)); 17 await provider.loadDictionary(locale, `${fileLocation}.dic`, `${fileLocation}.aff`);
21 debug('Loaded dictionary', locale, 'from', fileLocation); 18 debug('Loaded dictionary', locale, 'from', fileLocation);
22 } catch (err) { 19 } catch (err) {
23 console.error('Could not load dictionary', err); 20 console.error('Could not load dictionary', err);
@@ -44,7 +41,7 @@ export async function switchDict(locale) {
44 provider.unloadDictionary(locale); 41 provider.unloadDictionary(locale);
45 } 42 }
46 loadDictionary(locale); 43 loadDictionary(locale);
47 attached.switchLanguage(locale); 44 provider.switchDictionary(locale);
48 45
49 debug('Switched dictionary to', locale); 46 debug('Switched dictionary to', locale);
50 47
@@ -61,14 +58,12 @@ export default async function initialize(languageCode = 'en-us') {
61 const locale = languageCode.toLowerCase(); 58 const locale = languageCode.toLowerCase();
62 59
63 debug('Init spellchecker'); 60 debug('Init spellchecker');
64 await provider.initialize({ environment: ENVIRONMENT.NODE }); 61 await provider.initialize();
65 62 // await loadDictionaries();
66 debug('Attaching spellcheck provider');
67 attached = await attachSpellCheckProvider(provider);
68 63
69 debug('Available spellchecker dictionaries', provider.availableDictionaries); 64 debug('Available spellchecker dictionaries', provider.availableDictionaries);
70 65
71 attached.switchLanguage(locale); 66 switchDict(locale);
72 67
73 return provider; 68 return provider;
74 } catch (err) { 69 } catch (err) {