aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2018-03-20 11:28:04 +0100
committerLibravatar GitHub <noreply@github.com>2018-03-20 11:28:04 +0100
commit0f554020c0e45302b7c9c0006f82faaacdcdd83b (patch)
treeb4c054632d8034cadf25e6aed686371a61de77ea
parentMerge pull request #713 from meetfranz/develop (diff)
parentUpdate changelog [ci skip] (diff)
downloadferdium-app-0f554020c0e45302b7c9c0006f82faaacdcdd83b.tar.gz
ferdium-app-0f554020c0e45302b7c9c0006f82faaacdcdd83b.tar.zst
ferdium-app-0f554020c0e45302b7c9c0006f82faaacdcdd83b.zip
Merge pull request #808 from meetfranz/release/5.0.0-beta.17v5.0.0-beta.17
Franz 5.0.0 beta.17
-rw-r--r--.nvmrc1
-rw-r--r--.vscode/launch.json50
-rw-r--r--CHANGELOG.md32
-rw-r--r--package.json6
-rw-r--r--src/I18n.js9
-rw-r--r--src/api/server/LocalApi.js8
-rw-r--r--src/api/server/ServerApi.js60
-rw-r--r--src/components/layout/AppLayout.js122
-rw-r--r--src/components/services/tabs/TabItem.js12
-rw-r--r--src/containers/layout/AppLayoutContainer.js2
-rw-r--r--src/environment.js12
-rw-r--r--src/helpers/validation-helpers.js35
-rw-r--r--src/i18n/locales/ca.json47
-rw-r--r--src/i18n/locales/cs.json47
-rw-r--r--src/i18n/locales/de.json49
-rw-r--r--src/i18n/locales/el.json47
-rw-r--r--src/i18n/locales/en-US.json49
-rw-r--r--src/i18n/locales/es.json51
-rw-r--r--src/i18n/locales/fr.json97
-rw-r--r--src/i18n/locales/ga.json47
-rw-r--r--src/i18n/locales/hr.json69
-rw-r--r--src/i18n/locales/hu.json47
-rw-r--r--src/i18n/locales/id.json47
-rw-r--r--src/i18n/locales/it.json59
-rw-r--r--src/i18n/locales/ja.json47
-rw-r--r--src/i18n/locales/ka.json47
-rw-r--r--src/i18n/locales/nl-BE.json47
-rw-r--r--src/i18n/locales/nl.json47
-rw-r--r--src/i18n/locales/pl.json79
-rw-r--r--src/i18n/locales/pt-BR.json51
-rw-r--r--src/i18n/locales/pt.json215
-rw-r--r--src/i18n/locales/ru.json55
-rw-r--r--src/i18n/locales/sk.json47
-rw-r--r--src/i18n/locales/sr.json47
-rw-r--r--src/i18n/locales/tr.json57
-rw-r--r--src/i18n/locales/uk.json73
-rw-r--r--src/i18n/locales/zh-TW.json47
-rw-r--r--src/index.html13
-rw-r--r--src/index.js18
-rw-r--r--src/lib/Menu.js600
-rw-r--r--src/lib/analytics.js6
-rw-r--r--src/models/Recipe.js8
-rw-r--r--src/stores/AppStore.js31
-rw-r--r--src/stores/RecipesStore.js8
-rw-r--r--src/stores/RequestStore.js4
-rw-r--r--src/stores/ServicesStore.js16
-rw-r--r--src/styles/layout.scss10
-rw-r--r--src/styles/main.scss2
-rw-r--r--src/styles/title-bar.scss50
-rw-r--r--src/webview/plugin.js1
-rw-r--r--yarn.lock71
51 files changed, 2269 insertions, 433 deletions
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000..797ed2e27
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
8.2.1 \ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index a8300f84f..17d506895 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -9,7 +9,8 @@
9 "program": "${workspaceFolder}/build/index.js", 9 "program": "${workspaceFolder}/build/index.js",
10 "protocol": "inspector", 10 "protocol": "inspector",
11 "env": { 11 "env": {
12 "NODE_ENV": "development" 12 "NODE_ENV": "development",
13 "DEBUG": "*,-engine.io*,-socket.io*"
13 } 14 }
14 }, 15 },
15 { 16 {
@@ -18,9 +19,10 @@
18 "name": "Franz – Live API", 19 "name": "Franz – Live API",
19 "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", 20 "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
20 "program": "${workspaceFolder}/build/index.js", 21 "program": "${workspaceFolder}/build/index.js",
21 "protocol": "inspector", 22 "protocol": "inspector",
22 "env": { 23 "env": {
23 "LIVE_API": "1" 24 "LIVE_API": "1",
25 "DEBUG": "*,-engine.io*,-socket.io*"
24 } 26 }
25 }, 27 },
26 { 28 {
@@ -31,7 +33,47 @@
31 "program": "${workspaceFolder}/build/index.js", 33 "program": "${workspaceFolder}/build/index.js",
32 "protocol": "inspector", 34 "protocol": "inspector",
33 "env": { 35 "env": {
34 "LOCAL_API": "1" 36 "LOCAL_API": "1",
37 "DEBUG": "*,-engine.io*,-socket.io*"
38 }
39 },
40 {
41 "type": "node",
42 "request": "launch",
43 "name": "(Win Sim) Franz - Test API",
44 "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
45 "program": "${workspaceFolder}/build/index.js",
46 "protocol": "inspector",
47 "env": {
48 "NODE_ENV": "development",
49 "OS_PLATFORM": "win32",
50 "DEBUG": "*,-engine.io*,-socket.io*"
51 }
52 },
53 {
54 "type": "node",
55 "request": "launch",
56 "name": "(Win Sim) Franz – Live API",
57 "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
58 "program": "${workspaceFolder}/build/index.js",
59 "protocol": "inspector",
60 "env": {
61 "LIVE_API": "1",
62 "OS_PLATFORM": "win32",
63 "DEBUG": "*,-engine.io*,-socket.io*"
64 }
65 },
66 {
67 "type": "node",
68 "request": "launch",
69 "name": "(Win Sim) Franz – Local API",
70 "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
71 "program": "${workspaceFolder}/build/index.js",
72 "protocol": "inspector",
73 "env": {
74 "LOCAL_API": "1",
75 "OS_PLATFORM": "win32",
76 "DEBUG": "*,-engine.io*,-socket.io*"
35 } 77 }
36 } 78 }
37 ] 79 ]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 75d58602e..0d5364ef1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,35 @@
1<a name="5.0.0-beta.17"></a>
2# [5.0.0-beta.17](https://github.com/meetfranz/franz/compare/v5.0.0-beta.16...v5.0.0-beta.17) (2018-03-20)
3
4### General
5
6* **App:** Various performance improvments
7* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
8
9
10### Features
11
12* **Windows:** Replace window frame with custom menu bar ([9af5fd0](https://github.com/meetfranz/franz/commit/9af5fd0))
13* **Electron:** Update electron to 1.8.4 ([b9c6616](https://github.com/meetfranz/franz/commit/b9c6616))
14* **Mac:** Add dock bounce when new update is available ([47885bb](https://github.com/meetfranz/franz/commit/47885bb))
15* **Services:** Improve performance when reordering services ([82e832c](https://github.com/meetfranz/franz/commit/82e832c))
16* **Translations:** Add option to translate error messages and system menus ([82e832c](https://github.com/meetfranz/franz/commit/82e832c))
17
18### Bug Fixes
19
20* **App:** Fix app reload when coming back from sleep ([dd9f447](https://github.com/meetfranz/franz/commit/dd9f447))
21* **App:** Fix issue with app not showing services when recipe has invalid version (e.g. mailbox.org) ([dd9f447](https://github.com/meetfranz/franz/commit/dd9f447))
22* **Linux:** Fix missing/flickering ubuntu tray icon ([592f00a](https://github.com/meetfranz/franz/commit/592f00a))
23* **Service Tabs:** Remove "delete service" context menu when not in development mode ([3a5c3f0](https://github.com/meetfranz/franz/commit/3a5c3f0))
24* **Windows:** Improve app window handling ([dd9f447](https://github.com/meetfranz/franz/commit/dd9f447))
25
26
1<a name="5.0.0-beta.16"></a> 27<a name="5.0.0-beta.16"></a>
2# [5.0.0-beta.16](https://github.com/meetfranz/franz/compare/v5.0.0-beta.15...v5.0.0-beta.16) (2018-02-23) 28# [5.0.0-beta.16](https://github.com/meetfranz/franz/compare/v5.0.0-beta.15...v5.0.0-beta.16) (2018-02-23)
3 29
4### General 30### General
5* **App:** Update Electron version to 1.7.12 (fixes critical security vulnerability CVE-2018–1000006 ) ([c67d7d1](https://github.com/meetfranz/franz/commit/c67d7d1)) 31* **App:** Update Electron version to 1.7.12 (fixes critical security vulnerability CVE-2018–1000006 ) ([c67d7d1](https://github.com/meetfranz/franz/commit/c67d7d1))
32* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
6 33
7### Features 34### Features
8* **App:** Invite Friends in Settings ([ab33c44](https://github.com/meetfranz/franz/commit/ab33c44)) 35* **App:** Invite Friends in Settings ([ab33c44](https://github.com/meetfranz/franz/commit/ab33c44))
@@ -18,13 +45,15 @@ fix(App): Bugfix Fix memory leak in recipe polling loop
18* **App:** Fix Franz-wide form validation ([7618f51](https://github.com/meetfranz/franz/commit/7618f51)) 45* **App:** Fix Franz-wide form validation ([7618f51](https://github.com/meetfranz/franz/commit/7618f51))
19* **App:** Fix service tooltips not initialized properly ([8765b8f](https://github.com/meetfranz/franz/commit/8765b8f)) 46* **App:** Fix service tooltips not initialized properly ([8765b8f](https://github.com/meetfranz/franz/commit/8765b8f))
20* **Linux:** Invert tray icon color & add border for bright UI's ([0de9c60](https://github.com/meetfranz/franz/commit/0de9c60)) 47* **Linux:** Invert tray icon color & add border for bright UI's ([0de9c60](https://github.com/meetfranz/franz/commit/0de9c60))
21* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
22 48
23 49
24 50
25<a name="5.0.0-beta.15"></a> 51<a name="5.0.0-beta.15"></a>
26# [5.0.0-beta.15](https://github.com/meetfranz/franz/compare/v5.0.0-beta.14...v5.0.0-beta.15) (2018-01-10) 52# [5.0.0-beta.15](https://github.com/meetfranz/franz/compare/v5.0.0-beta.14...v5.0.0-beta.15) (2018-01-10)
27 53
54### General
55
56* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
28 57
29### Features 58### Features
30 59
@@ -37,7 +66,6 @@ fix(App): Bugfix Fix memory leak in recipe polling loop
37* **Services:** Improve handling of external links ([e2d6edf](https://github.com/meetfranz/franz/commit/e2d6edf)) 66* **Services:** Improve handling of external links ([e2d6edf](https://github.com/meetfranz/franz/commit/e2d6edf))
38* **Services:** Improve user experience of service search ([7e784c6](https://github.com/meetfranz/franz/commit/7e784c6)) 67* **Services:** Improve user experience of service search ([7e784c6](https://github.com/meetfranz/franz/commit/7e784c6))
39* **Account:** Enable a user to delete their own account ([1f3df73](https://github.com/meetfranz/franz/commit/1f3df73)) 68* **Account:** Enable a user to delete their own account ([1f3df73](https://github.com/meetfranz/franz/commit/1f3df73))
40* **Translations:** Improved translations. **[A million thanks to the amazing community. 🎉](http://i18n.meetfranz.com/)**
41 69
42 70
43 71
diff --git a/package.json b/package.json
index fd96c602b..1d7ab2852 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.0.0-beta.16", 5 "version": "5.0.0-beta.17",
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",
@@ -33,8 +33,10 @@
33 "babel-polyfill": "^6.23.0", 33 "babel-polyfill": "^6.23.0",
34 "babel-runtime": "^6.23.0", 34 "babel-runtime": "^6.23.0",
35 "classnames": "^2.2.5", 35 "classnames": "^2.2.5",
36 "debug-electron": "^0.0.4",
36 "du": "^0.1.0", 37 "du": "^0.1.0",
37 "electron-fetch": "^1.1.0", 38 "electron-fetch": "^1.1.0",
39 "electron-react-titlebar": "^0.7.1",
38 "electron-spellchecker": "^1.1.2", 40 "electron-spellchecker": "^1.1.2",
39 "electron-updater": "^2.4.3", 41 "electron-updater": "^2.4.3",
40 "electron-window-state": "^4.1.0", 42 "electron-window-state": "^4.1.0",
@@ -91,7 +93,7 @@
91 "cz-conventional-changelog": "^2.0.0", 93 "cz-conventional-changelog": "^2.0.0",
92 "del": "^2.2.2", 94 "del": "^2.2.2",
93 "dotenv": "^4.0.0", 95 "dotenv": "^4.0.0",
94 "electron": "^1.7.12", 96 "electron": "1.8.4",
95 "electron-builder": "19.15.1", 97 "electron-builder": "19.15.1",
96 "electron-packager": "^8.7.0", 98 "electron-packager": "^8.7.0",
97 "electron-rebuild": "^1.6.0", 99 "electron-rebuild": "^1.6.0",
diff --git a/src/I18n.js b/src/I18n.js
index ae3ba2fa9..4ee34157c 100644
--- a/src/I18n.js
+++ b/src/I18n.js
@@ -9,11 +9,18 @@ import UserStore from './stores/UserStore';
9 9
10@inject('stores') @observer 10@inject('stores') @observer
11export default class I18N extends Component { 11export default class I18N extends Component {
12 componentDidUpdate() {
13 window.franz.menu.rebuild();
14 }
15
12 render() { 16 render() {
13 const { stores, children } = this.props; 17 const { stores, children } = this.props;
14 const { locale } = stores.app; 18 const { locale } = stores.app;
15 return ( 19 return (
16 <IntlProvider {...{ locale, key: locale, messages: translations[locale] }}> 20 <IntlProvider
21 {...{ locale, key: locale, messages: translations[locale] }}
22 ref={(intlProvider) => { window.franz.intl = intlProvider ? intlProvider.getChildContext().intl : null; }}
23 >
17 {children} 24 {children}
18 </IntlProvider> 25 </IntlProvider>
19 ); 26 );
diff --git a/src/api/server/LocalApi.js b/src/api/server/LocalApi.js
index aa3a7d655..4d2497c61 100644
--- a/src/api/server/LocalApi.js
+++ b/src/api/server/LocalApi.js
@@ -3,6 +3,8 @@ import du from 'du';
3 3
4import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js'; 4import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js';
5 5
6const debug = require('debug')('LocalApi');
7
6const { session } = remote; 8const { session } = remote;
7 9
8export default class LocalApi { 10export default class LocalApi {
@@ -13,7 +15,7 @@ export default class LocalApi {
13 du(partitionsDir, (err, size) => { 15 du(partitionsDir, (err, size) => {
14 if (err) reject(err); 16 if (err) reject(err);
15 17
16 console.debug('LocalApi::getAppCacheSize resolves', size); 18 debug('LocalApi::getAppCacheSize resolves', size);
17 resolve(size); 19 resolve(size);
18 }); 20 });
19 }); 21 });
@@ -22,14 +24,14 @@ export default class LocalApi {
22 async clearCache(serviceId) { 24 async clearCache(serviceId) {
23 const s = session.fromPartition(`persist:service-${serviceId}`); 25 const s = session.fromPartition(`persist:service-${serviceId}`);
24 26
25 console.debug('LocalApi::clearCache resolves', serviceId); 27 debug('LocalApi::clearCache resolves', serviceId);
26 return new Promise(resolve => s.clearCache(resolve)); 28 return new Promise(resolve => s.clearCache(resolve));
27 } 29 }
28 30
29 async clearAppCache() { 31 async clearAppCache() {
30 const s = session.defaultSession; 32 const s = session.defaultSession;
31 33
32 console.debug('LocalApi::clearCache clearAppCache'); 34 debug('LocalApi::clearCache clearAppCache');
33 return new Promise(resolve => s.clearCache(resolve)); 35 return new Promise(resolve => s.clearCache(resolve));
34 } 36 }
35} 37}
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index 8f3297d13..353faa7f4 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -27,6 +27,8 @@ import {
27 removeServicePartitionDirectory, 27 removeServicePartitionDirectory,
28} from '../../helpers/service-helpers.js'; 28} from '../../helpers/service-helpers.js';
29 29
30const debug = require('debug')('ServerApi');
31
30module.paths.unshift( 32module.paths.unshift(
31 getDevRecipeDirectory(), 33 getDevRecipeDirectory(),
32 getRecipeDirectory(), 34 getRecipeDirectory(),
@@ -55,7 +57,7 @@ export default class ServerApi {
55 } 57 }
56 const u = await request.json(); 58 const u = await request.json();
57 59
58 console.debug('ServerApi::login resolves', u); 60 debug('ServerApi::login resolves', u);
59 return u.token; 61 return u.token;
60 } 62 }
61 63
@@ -69,7 +71,7 @@ export default class ServerApi {
69 } 71 }
70 const u = await request.json(); 72 const u = await request.json();
71 73
72 console.debug('ServerApi::signup resolves', u); 74 debug('ServerApi::signup resolves', u);
73 return u.token; 75 return u.token;
74 } 76 }
75 77
@@ -82,7 +84,7 @@ export default class ServerApi {
82 throw request; 84 throw request;
83 } 85 }
84 86
85 console.debug('ServerApi::inviteUser'); 87 debug('ServerApi::inviteUser');
86 return true; 88 return true;
87 } 89 }
88 90
@@ -98,7 +100,7 @@ export default class ServerApi {
98 } 100 }
99 const r = await request.json(); 101 const r = await request.json();
100 102
101 console.debug('ServerApi::retrievePassword'); 103 debug('ServerApi::retrievePassword');
102 return r; 104 return r;
103 } 105 }
104 106
@@ -112,7 +114,7 @@ export default class ServerApi {
112 const data = await request.json(); 114 const data = await request.json();
113 115
114 const user = new UserModel(data); 116 const user = new UserModel(data);
115 console.debug('ServerApi::userInfo resolves', user); 117 debug('ServerApi::userInfo resolves', user);
116 118
117 return user; 119 return user;
118 } 120 }
@@ -128,7 +130,7 @@ export default class ServerApi {
128 const updatedData = await request.json(); 130 const updatedData = await request.json();
129 131
130 const user = Object.assign(updatedData, { data: new UserModel(updatedData.data) }); 132 const user = Object.assign(updatedData, { data: new UserModel(updatedData.data) });
131 console.debug('ServerApi::updateUserInfo resolves', user); 133 debug('ServerApi::updateUserInfo resolves', user);
132 return user; 134 return user;
133 } 135 }
134 136
@@ -141,7 +143,7 @@ export default class ServerApi {
141 } 143 }
142 const data = await request.json(); 144 const data = await request.json();
143 145
144 console.debug('ServerApi::deleteAccount resolves', data); 146 debug('ServerApi::deleteAccount resolves', data);
145 return data; 147 return data;
146 } 148 }
147 149
@@ -157,7 +159,7 @@ export default class ServerApi {
157 159
158 let services = await this._mapServiceModels(data); 160 let services = await this._mapServiceModels(data);
159 services = services.filter(service => service !== null); 161 services = services.filter(service => service !== null);
160 console.debug('ServerApi::getServices resolves', services); 162 debug('ServerApi::getServices resolves', services);
161 return services; 163 return services;
162 } 164 }
163 165
@@ -181,7 +183,7 @@ export default class ServerApi {
181 183
182 const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); 184 const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) });
183 185
184 console.debug('ServerApi::createService resolves', service); 186 debug('ServerApi::createService resolves', service);
185 return service; 187 return service;
186 } 188 }
187 189
@@ -205,7 +207,7 @@ export default class ServerApi {
205 207
206 const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); 208 const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) });
207 209
208 console.debug('ServerApi::updateService resolves', service); 210 debug('ServerApi::updateService resolves', service);
209 return service; 211 return service;
210 } 212 }
211 213
@@ -240,7 +242,7 @@ export default class ServerApi {
240 throw request; 242 throw request;
241 } 243 }
242 const serviceData = await request.json(); 244 const serviceData = await request.json();
243 console.debug('ServerApi::reorderService resolves', serviceData); 245 debug('ServerApi::reorderService resolves', serviceData);
244 return serviceData; 246 return serviceData;
245 } 247 }
246 248
@@ -255,7 +257,7 @@ export default class ServerApi {
255 257
256 removeServicePartitionDirectory(id, true); 258 removeServicePartitionDirectory(id, true);
257 259
258 console.debug('ServerApi::deleteService resolves', data); 260 debug('ServerApi::deleteService resolves', data);
259 return data; 261 return data;
260 } 262 }
261 263
@@ -277,7 +279,7 @@ export default class ServerApi {
277 279
278 this.recipes = this.recipes.concat(this._getDevRecipes()); 280 this.recipes = this.recipes.concat(this._getDevRecipes());
279 281
280 console.debug('StubServerApi::getInstalledRecipes resolves', this.recipes); 282 debug('StubServerApi::getInstalledRecipes resolves', this.recipes);
281 return this.recipes; 283 return this.recipes;
282 } 284 }
283 285
@@ -290,7 +292,7 @@ export default class ServerApi {
290 throw request; 292 throw request;
291 } 293 }
292 const recipes = await request.json(); 294 const recipes = await request.json();
293 console.debug('ServerApi::getRecipeUpdates resolves', recipes); 295 debug('ServerApi::getRecipeUpdates resolves', recipes);
294 return recipes; 296 return recipes;
295 } 297 }
296 298
@@ -305,7 +307,7 @@ export default class ServerApi {
305 const data = await request.json(); 307 const data = await request.json();
306 308
307 const recipePreviews = this._mapRecipePreviewModel(data); 309 const recipePreviews = this._mapRecipePreviewModel(data);
308 console.debug('ServerApi::getRecipes resolves', recipePreviews); 310 debug('ServerApi::getRecipes resolves', recipePreviews);
309 311
310 return recipePreviews; 312 return recipePreviews;
311 } 313 }
@@ -322,7 +324,7 @@ export default class ServerApi {
322 // data = this._addLocalRecipesToPreviews(data); 324 // data = this._addLocalRecipesToPreviews(data);
323 325
324 const recipePreviews = this._mapRecipePreviewModel(data); 326 const recipePreviews = this._mapRecipePreviewModel(data);
325 console.debug('ServerApi::getFeaturedRecipes resolves', recipePreviews); 327 debug('ServerApi::getFeaturedRecipes resolves', recipePreviews);
326 return recipePreviews; 328 return recipePreviews;
327 } 329 }
328 330
@@ -336,7 +338,7 @@ export default class ServerApi {
336 const data = await request.json(); 338 const data = await request.json();
337 339
338 const recipePreviews = this._mapRecipePreviewModel(data); 340 const recipePreviews = this._mapRecipePreviewModel(data);
339 console.debug('ServerApi::searchRecipePreviews resolves', recipePreviews); 341 debug('ServerApi::searchRecipePreviews resolves', recipePreviews);
340 return recipePreviews; 342 return recipePreviews;
341 } 343 }
342 344
@@ -350,7 +352,7 @@ export default class ServerApi {
350 352
351 fs.ensureDirSync(recipeTempDirectory); 353 fs.ensureDirSync(recipeTempDirectory);
352 const res = await fetch(packageUrl); 354 const res = await fetch(packageUrl);
353 console.debug('Recipe downloaded', recipeId); 355 debug('Recipe downloaded', recipeId);
354 const buffer = await res.buffer(); 356 const buffer = await res.buffer();
355 fs.writeFileSync(archivePath, buffer); 357 fs.writeFileSync(archivePath, buffer);
356 358
@@ -392,7 +394,7 @@ export default class ServerApi {
392 const data = await request.json(); 394 const data = await request.json();
393 395
394 const plan = new PlanModel(data); 396 const plan = new PlanModel(data);
395 console.debug('ServerApi::getPlans resolves', plan); 397 debug('ServerApi::getPlans resolves', plan);
396 return plan; 398 return plan;
397 } 399 }
398 400
@@ -408,7 +410,7 @@ export default class ServerApi {
408 } 410 }
409 const data = await request.json(); 411 const data = await request.json();
410 412
411 console.debug('ServerApi::getHostedPage resolves', data); 413 debug('ServerApi::getHostedPage resolves', data);
412 return data; 414 return data;
413 } 415 }
414 416
@@ -421,7 +423,7 @@ export default class ServerApi {
421 } 423 }
422 const data = await request.json(); 424 const data = await request.json();
423 425
424 console.debug('ServerApi::getPaymentDashboardUrl resolves', data); 426 debug('ServerApi::getPaymentDashboardUrl resolves', data);
425 return data; 427 return data;
426 } 428 }
427 429
@@ -434,7 +436,7 @@ export default class ServerApi {
434 } 436 }
435 const data = await request.json(); 437 const data = await request.json();
436 const orders = this._mapOrderModels(data); 438 const orders = this._mapOrderModels(data);
437 console.debug('ServerApi::getSubscriptionOrders resolves', orders); 439 debug('ServerApi::getSubscriptionOrders resolves', orders);
438 return orders; 440 return orders;
439 } 441 }
440 442
@@ -451,7 +453,7 @@ export default class ServerApi {
451 } 453 }
452 const data = await request.json(); 454 const data = await request.json();
453 const news = this._mapNewsModels(data); 455 const news = this._mapNewsModels(data);
454 console.debug('ServerApi::getLatestNews resolves', news); 456 debug('ServerApi::getLatestNews resolves', news);
455 return news; 457 return news;
456 } 458 }
457 459
@@ -465,7 +467,7 @@ export default class ServerApi {
465 throw request; 467 throw request;
466 } 468 }
467 469
468 console.debug('ServerApi::hideNews resolves', id); 470 debug('ServerApi::hideNews resolves', id);
469 } 471 }
470 472
471 // Health Check 473 // Health Check
@@ -476,7 +478,7 @@ export default class ServerApi {
476 if (!request.ok) { 478 if (!request.ok) {
477 throw request; 479 throw request;
478 } 480 }
479 console.debug('ServerApi::healthCheck resolves'); 481 debug('ServerApi::healthCheck resolves');
480 } 482 }
481 483
482 async getLegacyServices() { 484 async getLegacyServices() {
@@ -502,7 +504,7 @@ export default class ServerApi {
502 return service; 504 return service;
503 })); 505 }));
504 506
505 console.debug('ServerApi::getLegacyServices resolves', services); 507 debug('ServerApi::getLegacyServices resolves', services);
506 return services; 508 return services;
507 } 509 }
508 } catch (err) { 510 } catch (err) {
@@ -535,7 +537,7 @@ export default class ServerApi {
535 537
536 return new ServiceModel(service, recipe); 538 return new ServiceModel(service, recipe);
537 } catch (e) { 539 } catch (e) {
538 console.debug(e); 540 debug(e);
539 return null; 541 return null;
540 } 542 }
541 } 543 }
@@ -553,7 +555,7 @@ export default class ServerApi {
553 555
554 await this.getRecipePackage(recipeId); 556 await this.getRecipePackage(recipeId);
555 557
556 console.debug('Rerun ServerAPI::getInstalledRecipes'); 558 debug('Rerun ServerAPI::getInstalledRecipes');
557 await this.getInstalledRecipes(); 559 await this.getInstalledRecipes();
558 560
559 recipe = this.recipes.find(r => r.id === recipeId); 561 recipe = this.recipes.find(r => r.id === recipeId);
@@ -653,7 +655,7 @@ export default class ServerApi {
653 655
654 return recipes; 656 return recipes;
655 } catch (err) { 657 } catch (err) {
656 console.debug('Could not load dev recipes'); 658 debug('Could not load dev recipes');
657 return false; 659 return false;
658 } 660 }
659 } 661 }
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 20dc2f764..66aef1730 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -2,10 +2,13 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import { TitleBar } from 'electron-react-titlebar';
5 6
6import InfoBar from '../ui/InfoBar'; 7import InfoBar from '../ui/InfoBar';
7import globalMessages from '../../i18n/globalMessages'; 8import globalMessages from '../../i18n/globalMessages';
8 9
10import { isWindows } from '../../environment';
11
9function createMarkup(HTMLString) { 12function createMarkup(HTMLString) {
10 return { __html: HTMLString }; 13 return { __html: HTMLString };
11} 14}
@@ -87,64 +90,67 @@ export default class AppLayout extends Component {
87 return ( 90 return (
88 <div> 91 <div>
89 <div className="app"> 92 <div className="app">
90 {sidebar} 93 {isWindows && <TitleBar menu={window.franz.menu.template} icon={'assets/images/logo.svg'} />}
91 <div className="app__service"> 94 <div className="app__content">
92 {news.length > 0 && news.map(item => ( 95 {sidebar}
93 <InfoBar 96 <div className="app__service">
94 key={item.id} 97 {news.length > 0 && news.map(item => (
95 position="top" 98 <InfoBar
96 type={item.type} 99 key={item.id}
97 sticky={item.sticky} 100 position="top"
98 onHide={() => removeNewsItem({ newsId: item.id })} 101 type={item.type}
99 > 102 sticky={item.sticky}
100 <span dangerouslySetInnerHTML={createMarkup(item.message)} /> 103 onHide={() => removeNewsItem({ newsId: item.id })}
101 </InfoBar> 104 >
102 ))} 105 <span dangerouslySetInnerHTML={createMarkup(item.message)} />
103 {!isOnline && ( 106 </InfoBar>
104 <InfoBar 107 ))}
105 type="danger" 108 {!isOnline && (
106 > 109 <InfoBar
107 <span className="mdi mdi-flash" /> 110 type="danger"
108 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 111 >
109 </InfoBar> 112 <span className="mdi mdi-flash" />
110 )} 113 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
111 {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( 114 </InfoBar>
112 <InfoBar 115 )}
113 type="danger" 116 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
114 ctaLabel="Try again" 117 <InfoBar
115 ctaLoading={areRequiredRequestsLoading} 118 type="danger"
116 sticky 119 ctaLabel="Try again"
117 onClick={retryRequiredRequests} 120 ctaLoading={areRequiredRequestsLoading}
118 > 121 sticky
119 <span className="mdi mdi-flash" /> 122 onClick={retryRequiredRequests}
120 {intl.formatMessage(messages.requiredRequestsFailed)} 123 >
121 </InfoBar> 124 <span className="mdi mdi-flash" />
122 )} 125 {intl.formatMessage(messages.requiredRequestsFailed)}
123 {showServicesUpdatedInfoBar && ( 126 </InfoBar>
124 <InfoBar 127 )}
125 type="primary" 128 {showServicesUpdatedInfoBar && (
126 ctaLabel={intl.formatMessage(messages.buttonReloadServices)} 129 <InfoBar
127 onClick={reloadServicesAfterUpdate} 130 type="primary"
128 sticky 131 ctaLabel={intl.formatMessage(messages.buttonReloadServices)}
129 > 132 onClick={reloadServicesAfterUpdate}
130 <span className="mdi mdi-power-plug" /> 133 sticky
131 {intl.formatMessage(messages.servicesUpdated)} 134 >
132 </InfoBar> 135 <span className="mdi mdi-power-plug" />
133 )} 136 {intl.formatMessage(messages.servicesUpdated)}
134 {appUpdateIsDownloaded && ( 137 </InfoBar>
135 <InfoBar 138 )}
136 type="primary" 139 {appUpdateIsDownloaded && (
137 ctaLabel={intl.formatMessage(messages.buttonInstallUpdate)} 140 <InfoBar
138 onClick={installAppUpdate} 141 type="primary"
139 sticky 142 ctaLabel={intl.formatMessage(messages.buttonInstallUpdate)}
140 > 143 onClick={installAppUpdate}
141 <span className="mdi mdi-information" /> 144 sticky
142 {intl.formatMessage(messages.updateAvailable)} <a href="https://meetfranz.com/changelog" target="_blank"> 145 >
143 <u>{intl.formatMessage(messages.changelog)}</u> 146 <span className="mdi mdi-information" />
144 </a> 147 {intl.formatMessage(messages.updateAvailable)} <a href="https://meetfranz.com/changelog" target="_blank">
145 </InfoBar> 148 <u>{intl.formatMessage(messages.changelog)}</u>
146 )} 149 </a>
147 {services} 150 </InfoBar>
151 )}
152 {services}
153 </div>
148 </div> 154 </div>
149 </div> 155 </div>
150 {children} 156 {children}
diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js
index 7aed8fda7..638262f7f 100644
--- a/src/components/services/tabs/TabItem.js
+++ b/src/components/services/tabs/TabItem.js
@@ -7,7 +7,7 @@ import classnames from 'classnames';
7import { SortableElement } from 'react-sortable-hoc'; 7import { SortableElement } from 'react-sortable-hoc';
8 8
9import ServiceModel from '../../../models/Service'; 9import ServiceModel from '../../../models/Service';
10import { ctrlKey } from '../../../environment'; 10import { isDevMode, ctrlKey } from '../../../environment';
11 11
12const { Menu } = remote; 12const { Menu } = remote;
13 13
@@ -119,10 +119,14 @@ class TabItem extends Component {
119 click: () => (service.isEnabled ? disableService() : enableService()), 119 click: () => (service.isEnabled ? disableService() : enableService()),
120 }, { 120 }, {
121 type: 'separator', 121 type: 'separator',
122 }, {
123 label: intl.formatMessage(messages.deleteService),
124 click: () => deleteService(),
125 }]; 122 }];
123
124 if (isDevMode) {
125 menuTemplate.push({
126 label: intl.formatMessage(messages.deleteService),
127 click: () => deleteService(),
128 });
129 }
126 const menu = Menu.buildFromTemplate(menuTemplate); 130 const menu = Menu.buildFromTemplate(menuTemplate);
127 131
128 let notificationBadge = null; 132 let notificationBadge = null;
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index e4a9d60c3..075bd5e34 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -94,7 +94,7 @@ export default class AppLayoutContainer extends Component {
94 94
95 const servicesContainer = ( 95 const servicesContainer = (
96 <Services 96 <Services
97 services={services.allDisplayed} 97 services={services.allDisplayedUnordered}
98 handleIPCMessage={handleIPCMessage} 98 handleIPCMessage={handleIPCMessage}
99 setWebviewReference={setWebviewReference} 99 setWebviewReference={setWebviewReference}
100 openWindow={openWindow} 100 openWindow={openWindow}
diff --git a/src/environment.js b/src/environment.js
index e185120c0..e1762129b 100644
--- a/src/environment.js
+++ b/src/environment.js
@@ -4,11 +4,17 @@ export const isDevMode = Boolean(process.execPath.match(/[\\/]electron/));
4export const useLiveAPI = process.env.LIVE_API; 4export const useLiveAPI = process.env.LIVE_API;
5export const useLocalAPI = process.env.LOCAL_API; 5export const useLocalAPI = process.env.LOCAL_API;
6 6
7export const isMac = process.platform === 'darwin'; 7let platform = process.platform;
8export const isWindows = process.platform === 'win32'; 8if (process.env.OS_PLATFORM) {
9export const isLinux = process.platform === 'linux'; 9 platform = process.env.OS_PLATFORM;
10}
11
12export const isMac = platform === 'darwin';
13export const isWindows = platform === 'win32';
14export const isLinux = platform === 'linux';
10 15
11export const ctrlKey = isMac ? '⌘' : 'Ctrl'; 16export const ctrlKey = isMac ? '⌘' : 'Ctrl';
17export const cmdKey = isMac ? 'Cmd' : 'Ctrl';
12 18
13let api; 19let api;
14if (!isDevMode || (isDevMode && useLiveAPI)) { 20if (!isDevMode || (isDevMode && useLiveAPI)) {
diff --git a/src/helpers/validation-helpers.js b/src/helpers/validation-helpers.js
index a8a242d54..2f762437d 100644
--- a/src/helpers/validation-helpers.js
+++ b/src/helpers/validation-helpers.js
@@ -1,6 +1,31 @@
1import { defineMessages } from 'react-intl';
2
3const messages = defineMessages({
4 required: {
5 id: 'validation.required',
6 defaultMessage: '!!!Field is required',
7 },
8 email: {
9 id: 'validation.email',
10 defaultMessage: '!!!Email not valid',
11 },
12 url: {
13 id: 'validation.url',
14 defaultMessage: '!!!Not a valid URL',
15 },
16 minLength: {
17 id: 'validation.minLength',
18 defaultMessage: '!!!Too few characters',
19 },
20 oneRequired: {
21 id: 'validation.oneRequired',
22 defaultMessage: '!!!At least one is required',
23 },
24});
25
1export function required({ field }) { 26export function required({ field }) {
2 const isValid = (field.value.trim() !== ''); 27 const isValid = (field.value.trim() !== '');
3 return [isValid, `${field.label} is required`]; 28 return [isValid, window.franz.intl.formatMessage(messages.required, { field: field.label })];
4} 29}
5 30
6export function email({ field }) { 31export function email({ field }) {
@@ -13,7 +38,7 @@ export function email({ field }) {
13 isValid = true; 38 isValid = true;
14 } 39 }
15 40
16 return [isValid, `${field.label} not valid`]; 41 return [isValid, window.franz.intl.formatMessage(messages.email, { field: field.label })];
17} 42}
18 43
19export function url({ field }) { 44export function url({ field }) {
@@ -27,7 +52,7 @@ export function url({ field }) {
27 isValid = true; 52 isValid = true;
28 } 53 }
29 54
30 return [isValid, `${field.label} is not a valid url`]; 55 return [isValid, window.franz.intl.formatMessage(messages.url, { field: field.label })];
31} 56}
32 57
33export function minLength(length) { 58export function minLength(length) {
@@ -36,13 +61,13 @@ export function minLength(length) {
36 if (field.touched) { 61 if (field.touched) {
37 isValid = field.value.length >= length; 62 isValid = field.value.length >= length;
38 } 63 }
39 return [isValid, `${field.label} should be at least ${length} characters long.`]; 64 return [isValid, window.franz.intl.formatMessage(messages.minLength, { field: field.label, length })];
40 }; 65 };
41} 66}
42 67
43export function oneRequired(targets) { 68export function oneRequired(targets) {
44 return ({ field, form }) => { 69 return ({ field, form }) => {
45 const invalidFields = targets.filter(target => form.$(target).value === ''); 70 const invalidFields = targets.filter(target => form.$(target).value === '');
46 return [targets.length !== invalidFields.length, `${field.label} is required`]; 71 return [targets.length !== invalidFields.length, window.franz.intl.formatMessage(messages.required, { field: field.label })];
47 }; 72 };
48} 73}
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index 524dfe0fb..be9059727 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "La teva sessió ha caducat, torna a iniciar la sessió.", 26 "login.serverLogout" : "La teva sessió ha caducat, torna a iniciar la sessió.",
27 "login.submit.label" : "Accedir", 27 "login.submit.label" : "Accedir",
28 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.", 28 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Configuració",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Edita",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Suprimeix",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Declaració de privacitat",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Correu electrònic", 72 "password.email.label" : "Correu electrònic",
30 "password.headline" : "Restablir contrasenya", 73 "password.headline" : "Restablir contrasenya",
31 "password.link.login" : "Inicia la sessió al teu compte", 74 "password.link.login" : "Inicia la sessió al teu compte",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Activa les notificacions", 240 "tabs.item.enableNotification" : "Activa les notificacions",
198 "tabs.item.enableService" : "Activa el servei", 241 "tabs.item.enableService" : "Activa el servei",
199 "tabs.item.reload" : "Recarrega", 242 "tabs.item.reload" : "Recarrega",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Inicia sessió al teu compte", 247 "welcome.loginButton" : "Inicia sessió al teu compte",
201 "welcome.signupButton" : "Crea un compte gratuït", 248 "welcome.signupButton" : "Crea un compte gratuït",
202 "welcome.slogan" : "Crea un compte gratuït" 249 "welcome.slogan" : "Crea un compte gratuït"
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index 62eb4a1ee..b4142b928 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Sezení vypršelo, je třeba se znovu přihlásit.", 26 "login.serverLogout" : "Sezení vypršelo, je třeba se znovu přihlásit.",
27 "login.submit.label" : "Přihlásit se", 27 "login.submit.label" : "Přihlásit se",
28 "login.tokenExpired" : "Sezení vypršelo, prosím přihlaste se znovu", 28 "login.tokenExpired" : "Sezení vypršelo, prosím přihlaste se znovu",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Nastavení",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Upravit",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Smazat",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Prohlášení o ochraně soukromí",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "E-mailová adresa", 72 "password.email.label" : "E-mailová adresa",
30 "password.headline" : "Obnovit heslo", 73 "password.headline" : "Obnovit heslo",
31 "password.link.login" : "Přihlásit se k účtu", 74 "password.link.login" : "Přihlásit se k účtu",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Povolit oznamování", 240 "tabs.item.enableNotification" : "Povolit oznamování",
198 "tabs.item.enableService" : "Zapnout službu", 241 "tabs.item.enableService" : "Zapnout službu",
199 "tabs.item.reload" : "Obnovit", 242 "tabs.item.reload" : "Obnovit",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Přihlášení do vašeho účtu", 247 "welcome.loginButton" : "Přihlášení do vašeho účtu",
201 "welcome.signupButton" : "Vytvořit účet zdarma", 248 "welcome.signupButton" : "Vytvořit účet zdarma",
202 "welcome.slogan" : "Zprávy, které pracují pro vás" 249 "welcome.slogan" : "Zprávy, které pracují pro vás"
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 7a03cce87..9aaef0465 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Deine Sitzung ist abgelaufen, bitte melde dich erneut an.", 26 "login.serverLogout" : "Deine Sitzung ist abgelaufen, bitte melde dich erneut an.",
27 "login.submit.label" : "Anmelden", 27 "login.submit.label" : "Anmelden",
28 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde dich erneut an.", 28 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde dich erneut an.",
29 "menu.app.about" : "Über Franz",
30 "menu.app.hide" : "Franz ausblenden",
31 "menu.app.hideOthers" : "Andere ausblenden",
32 "menu.app.quit" : "Franz Beenden",
33 "menu.app.settings" : "Einstellungen",
34 "menu.app.unhide" : "Alle einblenden",
35 "menu.edit" : "Bearbeiten",
36 "menu.edit.copy" : "Kopieren",
37 "menu.edit.cut" : "Ausschneiden",
38 "menu.edit.delete" : "Löschen",
39 "menu.edit.emojiSymbols" : "Emoji & Symbole",
40 "menu.edit.paste" : "Einfügen",
41 "menu.edit.pasteAndMatchStyle" : "Einfügen und Stil anpassen",
42 "menu.edit.redo" : "Wiederholen",
43 "menu.edit.selectAll" : "Alle auswählen",
44 "menu.edit.speech" : "Sprachausgabe",
45 "menu.edit.startDictation" : "Diktat starten ...",
46 "menu.edit.startSpeaking" : "Sprachausgabe starten",
47 "menu.edit.stopSpeaking" : "Sprachausgabe stoppen",
48 "menu.edit.undo" : "Widerrufen",
49 "menu.file" : "Datei",
50 "menu.help" : "Hilfe",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Mehr erfahren",
53 "menu.help.privacy" : "Datenschutzerklärung",
54 "menu.help.support" : "Hilfe",
55 "menu.help.tos" : "Nutzungsbedingungen",
56 "menu.services" : "Dienste",
57 "menu.services.addNewService" : "Dienst hinzufügen",
58 "menu.view" : "Darstellung",
59 "menu.view.enterFullScreen" : "Vollbildmodus",
60 "menu.view.exitFullScreen" : "Vollbildmodus aus",
61 "menu.view.reloadFranz" : "Franz neu laden",
62 "menu.view.reloadService" : "Dienst neu laden",
63 "menu.view.resetZoom" : "Originalgröße",
64 "menu.view.toggleDevTools" : "Entwicklertools anzeigen",
65 "menu.view.toggleFullScreen" : "Vollbildmodus umschalten",
66 "menu.view.toggleServiceDevTools" : "Entwicklertools für Dienst anzeigen",
67 "menu.view.zoomIn" : "Vergrößern",
68 "menu.view.zoomOut" : "Verkleinern",
69 "menu.window" : "Fenster",
70 "menu.window.close" : "Schließen",
71 "menu.window.minimize" : "Minimieren",
29 "password.email.label" : "E-Mail Adresse", 72 "password.email.label" : "E-Mail Adresse",
30 "password.headline" : "Passwort zurücksetzen", 73 "password.headline" : "Passwort zurücksetzen",
31 "password.link.login" : "An deinem Konto anmelden", 74 "password.link.login" : "An deinem Konto anmelden",
@@ -157,7 +200,7 @@
157 "settings.user.form.firstname" : "Vorname", 200 "settings.user.form.firstname" : "Vorname",
158 "settings.user.form.lastname" : "Nachname", 201 "settings.user.form.lastname" : "Nachname",
159 "settings.user.form.newPassword" : "Neues Passwort", 202 "settings.user.form.newPassword" : "Neues Passwort",
160 "sidebar.addNewService" : "Neuem Dienst hinzufügen", 203 "sidebar.addNewService" : "Neuen Dienst hinzufügen",
161 "sidebar.muteApp" : "Benachrichtigungen & Audio deaktivieren", 204 "sidebar.muteApp" : "Benachrichtigungen & Audio deaktivieren",
162 "sidebar.settings" : "Einstellungen", 205 "sidebar.settings" : "Einstellungen",
163 "sidebar.unmuteApp" : "Benachrichtigungen & Audio aktivieren", 206 "sidebar.unmuteApp" : "Benachrichtigungen & Audio aktivieren",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Benachrichtigungen aktivieren", 240 "tabs.item.enableNotification" : "Benachrichtigungen aktivieren",
198 "tabs.item.enableService" : "Dienst aktivieren", 241 "tabs.item.enableService" : "Dienst aktivieren",
199 "tabs.item.reload" : "Neuladen", 242 "tabs.item.reload" : "Neuladen",
243 "validation.email" : "{field} ist ungültig",
244 "validation.minLength" : "{field} muss mindestens {length} Zeichen enthalten",
245 "validation.required" : "{field} wird benötigt",
246 "validation.url" : "{field} ist keine gültige URL",
200 "welcome.loginButton" : "Bei Franz einloggen", 247 "welcome.loginButton" : "Bei Franz einloggen",
201 "welcome.signupButton" : "Kostenloses Konto erstellen", 248 "welcome.signupButton" : "Kostenloses Konto erstellen",
202 "welcome.slogan" : "Kommunikation, die für dich funktioniert" 249 "welcome.slogan" : "Kommunikation, die für dich funktioniert"
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index b0c465940..ae37d1f5e 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Η συνεδρία σας έληξε, συνδεθείτε ξανά.", 26 "login.serverLogout" : "Η συνεδρία σας έληξε, συνδεθείτε ξανά.",
27 "login.submit.label" : "Σύνδεση", 27 "login.submit.label" : "Σύνδεση",
28 "login.tokenExpired" : "Η συνεδρία σας έληξε, συνδεθείτε ξανά.", 28 "login.tokenExpired" : "Η συνεδρία σας έληξε, συνδεθείτε ξανά.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Ρυθμίσεις",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Επεξεργασία",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Διαγραφή",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Δήλωση απορρήτου",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Διεύθυνση ηλεκτρονικού ταχυδρομείου", 72 "password.email.label" : "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
30 "password.headline" : "Επαναφορά κωδικού πρόσβασης", 73 "password.headline" : "Επαναφορά κωδικού πρόσβασης",
31 "password.link.login" : "Σύνδεση στο λογαριασμό σας", 74 "password.link.login" : "Σύνδεση στο λογαριασμό σας",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Ενεργοποίηση ειδοποιήσεων", 240 "tabs.item.enableNotification" : "Ενεργοποίηση ειδοποιήσεων",
198 "tabs.item.enableService" : "Ενεργοποίηση υπηρεσίας", 241 "tabs.item.enableService" : "Ενεργοποίηση υπηρεσίας",
199 "tabs.item.reload" : "Επαναφόρτωση", 242 "tabs.item.reload" : "Επαναφόρτωση",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Σύνδεση στο λογαριασμό σας", 247 "welcome.loginButton" : "Σύνδεση στο λογαριασμό σας",
201 "welcome.signupButton" : "Δημιουργία δωρεάν λογαριασμού", 248 "welcome.signupButton" : "Δημιουργία δωρεάν λογαριασμού",
202 "welcome.slogan" : "Επικοινωνία που λειτουργεί για εσάς" 249 "welcome.slogan" : "Επικοινωνία που λειτουργεί για εσάς"
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index d5c0ea441..400a9a5d8 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -199,5 +199,52 @@
199 "service.crashHandler.action": "Reload {name}", 199 "service.crashHandler.action": "Reload {name}",
200 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 200 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
201 "service.disabledHandler.headline": "{name} is disabled", 201 "service.disabledHandler.headline": "{name} is disabled",
202 "service.disabledHandler.action": "Enable {name}" 202 "service.disabledHandler.action": "Enable {name}",
203 "menu.edit": "Edit",
204 "menu.edit.undo": "Undo",
205 "menu.edit.redo": "Redo",
206 "menu.edit.cut": "Cut",
207 "menu.edit.copy": "Copy",
208 "menu.edit.paste": "Paste",
209 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
210 "menu.edit.delete": "Delete",
211 "menu.edit.selectAll": "Select All",
212 "menu.edit.speech": "Speech",
213 "menu.edit.startSpeaking": "Start Speaking",
214 "menu.edit.stopSpeaking": "Stop Speaking",
215 "menu.edit.startDictation": "Start Dictation",
216 "menu.edit.emojiSymbols": "Emoji & Symbols",
217 "menu.view.resetZoom": "Actual Size",
218 "menu.view.zoomIn": "Zoom In",
219 "menu.view.zoomOut": "Zoom Out",
220 "menu.view.enterFullScreen": "Enter Full Screen",
221 "menu.view.exitFullScreen": "Exit Full Screen",
222 "menu.view.toggleFullScreen": "Toggle Full Screen",
223 "menu.view.toggleDevTools": "Toggle Developer Tools",
224 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
225 "menu.view.reloadService": "Reload Service",
226 "menu.view.reloadFranz": "Reload Franz",
227 "menu.window.minimize": "Minimize",
228 "menu.window.close": "Close",
229 "menu.help.learnMore": "Learn More",
230 "menu.help.changelog": "Changelog",
231 "menu.help.support": "Support",
232 "menu.help.tos": "Terms of Service",
233 "menu.help.privacy": "Privacy Statement",
234 "menu.file": "File",
235 "menu.view": "View",
236 "menu.services": "Services",
237 "menu.window": "Window",
238 "menu.help": "Help",
239 "menu.app.about": "About Franz",
240 "menu.app.settings": "Settings",
241 "menu.app.hide": "Hide",
242 "menu.app.hideOthers": "Hide Others",
243 "menu.app.unhide": "Unhide",
244 "menu.app.quit": "Quit",
245 "menu.services.addNewService": "Add New Service...",
246 "validation.required": "{field} is required",
247 "validation.email": "{field} is not valid",
248 "validation.url": "{field} is not a valid URL",
249 "validation.minLength": "{field} should be at least {length} characters long"
203} 250}
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 407266285..640f87c20 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,6 +1,6 @@
1{ 1{
2 "global.api.unhealthy" : "No se puede conectar a los servicios en línea de Franz.", 2 "global.api.unhealthy" : "No se puede conectar a los servicios en línea de Franz.",
3 "global.notConnectedToTheInternet" : "No estás conectado a Internet", 3 "global.notConnectedToTheInternet" : "No está conectado a Internet",
4 "import.headline" : "Importa tus servicios de Franz 4", 4 "import.headline" : "Importa tus servicios de Franz 4",
5 "import.notSupportedHeadline" : "Servicios no soportados aún en Franz 5", 5 "import.notSupportedHeadline" : "Servicios no soportados aún en Franz 5",
6 "import.skip.label" : "Quiero agregar servicios manualmente", 6 "import.skip.label" : "Quiero agregar servicios manualmente",
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.", 26 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.",
27 "login.submit.label" : "Iniciar sesión", 27 "login.submit.label" : "Iniciar sesión",
28 "login.tokenExpired" : "Tu sesión expiró, por favor la inicia sesión nuevamente.", 28 "login.tokenExpired" : "Tu sesión expiró, por favor la inicia sesión nuevamente.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Configuración",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Editar",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Borrar",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Declaración de privacidad",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Dirección de correo electrónico", 72 "password.email.label" : "Dirección de correo electrónico",
30 "password.headline" : "Restablecer contraseña", 73 "password.headline" : "Restablecer contraseña",
31 "password.link.login" : "Iniciar sesión en tu cuenta", 74 "password.link.login" : "Iniciar sesión en tu cuenta",
@@ -76,7 +119,7 @@
76 "settings.app.form.enableMenuBar" : "mostrar a franz en La barra de menús", 119 "settings.app.form.enableMenuBar" : "mostrar a franz en La barra de menús",
77 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica", 120 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica",
78 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema", 121 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema",
79 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 122 "settings.app.form.hideDockIcon" : "Ocultar Icono de Franz en barra de herramientas",
80 "settings.app.form.language" : "Idioma", 123 "settings.app.form.language" : "Idioma",
81 "settings.app.form.minimizeToSystemTray" : "Minimizar Franz a la bandeja del sistema", 124 "settings.app.form.minimizeToSystemTray" : "Minimizar Franz a la bandeja del sistema",
82 "settings.app.form.runInBackground" : "Mantener Franz en segundo plano al cerrar la ventana", 125 "settings.app.form.runInBackground" : "Mantener Franz en segundo plano al cerrar la ventana",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Activar notificaciones", 240 "tabs.item.enableNotification" : "Activar notificaciones",
198 "tabs.item.enableService" : "Activar servicio", 241 "tabs.item.enableService" : "Activar servicio",
199 "tabs.item.reload" : "Recargar", 242 "tabs.item.reload" : "Recargar",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Accede a tu cuenta", 247 "welcome.loginButton" : "Accede a tu cuenta",
201 "welcome.signupButton" : "Crear una cuenta gratuita", 248 "welcome.signupButton" : "Crear una cuenta gratuita",
202 "welcome.slogan" : "Mensajería que funciona para ti" 249 "welcome.slogan" : "Mensajería que funciona para ti"
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 35a55fcc2..a40a60833 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -1,6 +1,6 @@
1{ 1{
2 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz.", 2 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz",
3 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté(e) à Internet.", 3 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.",
4 "import.headline" : "Importez vos services depuis la version 4 de Franz.", 4 "import.headline" : "Importez vos services depuis la version 4 de Franz.",
5 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par Franz 5", 5 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par Franz 5",
6 "import.skip.label" : "Je veux ajouter des services manuellement", 6 "import.skip.label" : "Je veux ajouter des services manuellement",
@@ -16,7 +16,7 @@
16 "invite.name.label" : "Nom", 16 "invite.name.label" : "Nom",
17 "invite.skip.label" : "Je veux faire cela plus tard", 17 "invite.skip.label" : "Je veux faire cela plus tard",
18 "invite.submit.label" : "Envoyer des invitations", 18 "invite.submit.label" : "Envoyer des invitations",
19 "invite.successInfo" : "Invitations envoyées.", 19 "invite.successInfo" : "Invitations envoyées",
20 "login.email.label" : "Adresse e-mail", 20 "login.email.label" : "Adresse e-mail",
21 "login.headline" : "S'inscrire", 21 "login.headline" : "S'inscrire",
22 "login.invalidCredentials" : "E-mail ou mot de passe invalide", 22 "login.invalidCredentials" : "E-mail ou mot de passe invalide",
@@ -26,11 +26,54 @@
26 "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.", 26 "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.",
27 "login.submit.label" : "Connexion", 27 "login.submit.label" : "Connexion",
28 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.", 28 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Paramètres",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Éditer",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Supprimer",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Déclaration de confidentialité",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Adresse e-mail", 72 "password.email.label" : "Adresse e-mail",
30 "password.headline" : "Réinitialiser le mot de passe", 73 "password.headline" : "Réinitialiser le mot de passe",
31 "password.link.login" : "Connectez-vous à votre compte", 74 "password.link.login" : "Connectez-vous à votre compte",
32 "password.link.signup" : "Créer un compte gratuit.", 75 "password.link.signup" : "Créer un compte gratuit.",
33 "password.noUser" : "Aucun utilisateur n'a été trouvé avec cette adresse e-mail ", 76 "password.noUser" : "Aucun utilisateur n'a été trouvé avec cette adresse e-mail",
34 "password.submit.label" : "Soumettre", 77 "password.submit.label" : "Soumettre",
35 "password.successInfo" : "Merci de consulter vos e-mails", 78 "password.successInfo" : "Merci de consulter vos e-mails",
36 "pricing.headline" : "Soutenez Franz", 79 "pricing.headline" : "Soutenez Franz",
@@ -94,7 +137,7 @@
94 "settings.app.updateStatusAvailable" : "Mise à jour disponible, téléchargement en cours...", 137 "settings.app.updateStatusAvailable" : "Mise à jour disponible, téléchargement en cours...",
95 "settings.app.updateStatusSearching" : "Recherche d'une mise à jour", 138 "settings.app.updateStatusSearching" : "Recherche d'une mise à jour",
96 "settings.app.updateStatusUpToDate" : "Vous utilisez la dernière version de Franz", 139 "settings.app.updateStatusUpToDate" : "Vous utilisez la dernière version de Franz",
97 "settings.invite.headline" : "Invite 3 amis", 140 "settings.invite.headline" : "Invite des amis",
98 "settings.navigation.account" : "Compte", 141 "settings.navigation.account" : "Compte",
99 "settings.navigation.availableServices" : "Services disponibles", 142 "settings.navigation.availableServices" : "Services disponibles",
100 "settings.navigation.inviteFriends" : "Inviter des amis", 143 "settings.navigation.inviteFriends" : "Inviter des amis",
@@ -138,7 +181,7 @@
138 "settings.service.form.tabHosted" : "Hébergé", 181 "settings.service.form.tabHosted" : "Hébergé",
139 "settings.service.form.tabOnPremise" : "Auto-hébergé ⭐️", 182 "settings.service.form.tabOnPremise" : "Auto-hébergé ⭐️",
140 "settings.service.form.team" : "Équipe", 183 "settings.service.form.team" : "Équipe",
141 "settings.service.form.useHostedService" : "Utilisez le service hébergé {nom}.", 184 "settings.service.form.useHostedService" : "Utilisez le service hébergé {name}.",
142 "settings.service.form.yourServices" : "Vos services", 185 "settings.service.form.yourServices" : "Vos services",
143 "settings.services.deletedInfo" : "Le service a été supprimé", 186 "settings.services.deletedInfo" : "Le service a été supprimé",
144 "settings.services.discoverServices" : "Découvrir les services", 187 "settings.services.discoverServices" : "Découvrir les services",
@@ -174,30 +217,34 @@
174 "signup.password.label" : "Mot de passe", 217 "signup.password.label" : "Mot de passe",
175 "signup.submit.label" : "Créer un compte", 218 "signup.submit.label" : "Créer un compte",
176 "subscription.euTaxInfo" : "Résidents de l'UE : une taxe locale peut s'appliquer", 219 "subscription.euTaxInfo" : "Résidents de l'UE : une taxe locale peut s'appliquer",
177 "subscription.features.ads" : "No ads, ever!", 220 "subscription.features.ads" : "Plus de pubs !",
178 "subscription.features.comingSoon" : "coming soon", 221 "subscription.features.comingSoon" : "Bientôt disponible",
179 "subscription.features.customServices" : "Private services for you and your team", 222 "subscription.features.customServices" : "Services privés pour vous et votre équipe",
180 "subscription.features.encryptedSync" : "Encrypted session synchronization", 223 "subscription.features.encryptedSync" : "Synchronisation de session cryptée",
181 "subscription.features.onpremise" : "Ajouter des services locaux\/hébergés comme HipChat", 224 "subscription.features.onpremise" : "Ajouter des services locaux\/hébergés comme HipChat",
182 "subscription.features.vpn" : "Support des Proxy et VPN", 225 "subscription.features.vpn" : "Support des Proxy et VPN",
183 "subscription.includedFeatures" : "Le compte payant Supporter Premium Franz inclut", 226 "subscription.includedFeatures" : "Le compte payant Supporter Premium Franz inclut",
184 "subscription.paymentSessionError" : "Could not initialize payment form", 227 "subscription.paymentSessionError" : "Initialisation du paiement impossible",
185 "subscription.submit.label" : "I want to support the development of Franz", 228 "subscription.submit.label" : "Je souhaite aider au développement de Franz",
186 "subscription.type.free" : "free", 229 "subscription.type.free" : "gratuit",
187 "subscription.type.month" : "month", 230 "subscription.type.month" : "mois",
188 "subscription.type.year" : "year", 231 "subscription.type.year" : "année",
189 "subscriptionPopup.buttonCancel" : "Cancel", 232 "subscriptionPopup.buttonCancel" : "Annuler",
190 "subscriptionPopup.buttonDone" : "Done", 233 "subscriptionPopup.buttonDone" : "Terminé",
191 "tabs.item.deleteService" : "Delete service", 234 "tabs.item.deleteService" : "Supprimer le service",
192 "tabs.item.disableAudio" : "Désactiver l'audio", 235 "tabs.item.disableAudio" : "Désactiver l'audio",
193 "tabs.item.disableNotifications" : "Disable notifications", 236 "tabs.item.disableNotifications" : "Désactiver les notifications",
194 "tabs.item.disableService" : "Disable service", 237 "tabs.item.disableService" : "Désactiver le service",
195 "tabs.item.edit" : "Edit", 238 "tabs.item.edit" : "Éditer",
196 "tabs.item.enableAudio" : "Activer l'audio", 239 "tabs.item.enableAudio" : "Activer l'audio",
197 "tabs.item.enableNotification" : "Enable notifications", 240 "tabs.item.enableNotification" : "Activer les notifications",
198 "tabs.item.enableService" : "Activer le service", 241 "tabs.item.enableService" : "Activer le service",
199 "tabs.item.reload" : "Reload", 242 "tabs.item.reload" : "Recharger",
200 "welcome.loginButton" : "Login to your account", 243 "validation.email" : "{field} is not valid",
201 "welcome.signupButton" : "Create a free account", 244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
247 "welcome.loginButton" : "Se connecter sur son compte",
248 "welcome.signupButton" : "Créer un compte gratuit",
202 "welcome.slogan" : "Une messagerie qui fonctionne pour vous" 249 "welcome.slogan" : "Une messagerie qui fonctionne pour vous"
203} 250}
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 13b251755..80aeb0a1b 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "D'éag do sheisiún, logáil isteach arís le do thoil.", 26 "login.serverLogout" : "D'éag do sheisiún, logáil isteach arís le do thoil.",
27 "login.submit.label" : "Logáil isteach", 27 "login.submit.label" : "Logáil isteach",
28 "login.tokenExpired" : "D'éag do sheisiún, logáil isteach arís le do thoil.", 28 "login.tokenExpired" : "D'éag do sheisiún, logáil isteach arís le do thoil.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Socruithe",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Cuir in eagar",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Scrios",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Ráiteas phríobháideachais",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Seoladh ríomhphoist", 72 "password.email.label" : "Seoladh ríomhphoist",
30 "password.headline" : "Athshocraigh pasfhocal", 73 "password.headline" : "Athshocraigh pasfhocal",
31 "password.link.login" : "Logáil isteach i do chuntas", 74 "password.link.login" : "Logáil isteach i do chuntas",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Cumasaigh fógraí", 240 "tabs.item.enableNotification" : "Cumasaigh fógraí",
198 "tabs.item.enableService" : "Cumasaigh seirbhís", 241 "tabs.item.enableService" : "Cumasaigh seirbhís",
199 "tabs.item.reload" : "Athlódáil", 242 "tabs.item.reload" : "Athlódáil",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Logáil isteach i do chuntas", 247 "welcome.loginButton" : "Logáil isteach i do chuntas",
201 "welcome.signupButton" : "Cruthaigh cuntas nua", 248 "welcome.signupButton" : "Cruthaigh cuntas nua",
202 "welcome.slogan" : "Teachtaireachtaí a oibríonn duitse" 249 "welcome.slogan" : "Teachtaireachtaí a oibríonn duitse"
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index 97bfc19f4..72930f686 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -16,7 +16,7 @@
16 "invite.name.label" : "Ime", 16 "invite.name.label" : "Ime",
17 "invite.skip.label" : "Želim da ovo uradim kasnije", 17 "invite.skip.label" : "Želim da ovo uradim kasnije",
18 "invite.submit.label" : "Pošalji pozivnice", 18 "invite.submit.label" : "Pošalji pozivnice",
19 "invite.successInfo" : "Invitations sent successfully", 19 "invite.successInfo" : "Pozivnice uspješno poslane",
20 "login.email.label" : "Vaša e-adresa:", 20 "login.email.label" : "Vaša e-adresa:",
21 "login.headline" : "Prijavite se", 21 "login.headline" : "Prijavite se",
22 "login.invalidCredentials" : "E-mail ili lozinka nisu točni", 22 "login.invalidCredentials" : "E-mail ili lozinka nisu točni",
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.", 26 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.",
27 "login.submit.label" : "Prijavite se", 27 "login.submit.label" : "Prijavite se",
28 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 28 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Postavke",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Uredi",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Obriši",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Izjava o privatnosti ",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Vaša e-adresa", 72 "password.email.label" : "Vaša e-adresa",
30 "password.headline" : "Stvorite novu zaporku", 73 "password.headline" : "Stvorite novu zaporku",
31 "password.link.login" : "Prijavite se na Vaš račun", 74 "password.link.login" : "Prijavite se na Vaš račun",
@@ -68,12 +111,12 @@
68 "settings.app.buttonClearAllCache" : "Očisti memoriju", 111 "settings.app.buttonClearAllCache" : "Očisti memoriju",
69 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje", 112 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje",
70 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja", 113 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja",
71 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.", 114 "settings.app.cacheInfo" : "Franz predmemorija trenutno koristi {size} prostora na disku",
72 "settings.app.currentVersion" : "Trenutna verzija:", 115 "settings.app.currentVersion" : "Trenutna verzija:",
73 "settings.app.form.autoLaunchInBackground" : "Otvori u pozadini", 116 "settings.app.form.autoLaunchInBackground" : "Otvori u pozadini",
74 "settings.app.form.autoLaunchOnStart" : "Pokreni Franz sa sistemom", 117 "settings.app.form.autoLaunchOnStart" : "Pokreni Franz sa sistemom",
75 "settings.app.form.beta" : "Obuhvati i beta verzije", 118 "settings.app.form.beta" : "Obuhvati i beta verzije",
76 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 119 "settings.app.form.enableMenuBar" : "Prikaži Franz u traci izbornika",
77 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 120 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
78 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 121 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
79 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 122 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock",
@@ -89,15 +132,15 @@
89 "settings.app.headlineLanguage" : "Jezik", 132 "settings.app.headlineLanguage" : "Jezik",
90 "settings.app.headlineUpdates" : "Nadogradnje", 133 "settings.app.headlineUpdates" : "Nadogradnje",
91 "settings.app.restartRequired" : "Promjene postavki zahtijevaju ponovni zagon", 134 "settings.app.restartRequired" : "Promjene postavki zahtijevaju ponovni zagon",
92 "settings.app.subheadlineCache" : "Cache", 135 "settings.app.subheadlineCache" : "Predmemorija",
93 "settings.app.translationHelp" : "Pomozite nam prevesti aplikaciju na Vaš jezik. ", 136 "settings.app.translationHelp" : "Pomozite nam prevesti aplikaciju na Vaš jezik. ",
94 "settings.app.updateStatusAvailable" : "Nadogradnja dostupna, preuzimanje...", 137 "settings.app.updateStatusAvailable" : "Nadogradnja dostupna, preuzimanje...",
95 "settings.app.updateStatusSearching" : "Traže se ažuriranja", 138 "settings.app.updateStatusSearching" : "Traže se ažuriranja",
96 "settings.app.updateStatusUpToDate" : "Koristite najnoviju verziju Franca.", 139 "settings.app.updateStatusUpToDate" : "Koristite najnoviju verziju Franca.",
97 "settings.invite.headline" : "Invite Friends", 140 "settings.invite.headline" : "Pozovi prijatelje",
98 "settings.navigation.account" : "Račun", 141 "settings.navigation.account" : "Račun",
99 "settings.navigation.availableServices" : "Dostupne usluge", 142 "settings.navigation.availableServices" : "Dostupne usluge",
100 "settings.navigation.inviteFriends" : "Invite Friends", 143 "settings.navigation.inviteFriends" : "Pozovi prijatelje",
101 "settings.navigation.logout" : "Odjava", 144 "settings.navigation.logout" : "Odjava",
102 "settings.navigation.settings" : "Postavke", 145 "settings.navigation.settings" : "Postavke",
103 "settings.navigation.yourServices" : "Vaše usluge", 146 "settings.navigation.yourServices" : "Vaše usluge",
@@ -108,7 +151,7 @@
108 "settings.recipes.mostPopular" : "Najpopularniji", 151 "settings.recipes.mostPopular" : "Najpopularniji",
109 "settings.recipes.nothingFound" : "Žao nam je, ali ne postoje usluge koje se poklapaju s onima koje tražite. ", 152 "settings.recipes.nothingFound" : "Žao nam je, ali ne postoje usluge koje se poklapaju s onima koje tražite. ",
110 "settings.recipes.servicesSuccessfulAddedInfo" : "Usluga uspješno dodana. ", 153 "settings.recipes.servicesSuccessfulAddedInfo" : "Usluga uspješno dodana. ",
111 "settings.searchService" : "Search service", 154 "settings.searchService" : "Potraži servis",
112 "settings.service.error.goBack" : "Nazad do servisa", 155 "settings.service.error.goBack" : "Nazad do servisa",
113 "settings.service.error.headline" : "Greška", 156 "settings.service.error.headline" : "Greška",
114 "settings.service.error.message" : "Nemoguće učitati sadržaj usluge. ", 157 "settings.service.error.message" : "Nemoguće učitati sadržaj usluge. ",
@@ -126,10 +169,10 @@
126 "settings.service.form.enableService" : "Omogućite usluge", 169 "settings.service.form.enableService" : "Omogućite usluge",
127 "settings.service.form.headlineBadges" : "Unread message badges", 170 "settings.service.form.headlineBadges" : "Unread message badges",
128 "settings.service.form.headlineGeneral" : "Općenito", 171 "settings.service.form.headlineGeneral" : "Općenito",
129 "settings.service.form.headlineNotifications" : "Notifications", 172 "settings.service.form.headlineNotifications" : "Obavijesti",
130 "settings.service.form.icon" : "Custom icon", 173 "settings.service.form.icon" : "Prilagođena ikona",
131 "settings.service.form.iconDelete" : "Delete", 174 "settings.service.form.iconDelete" : "Obriši",
132 "settings.service.form.iconUpload" : "Drop your image, or click here", 175 "settings.service.form.iconUpload" : "Ispusti sliku ili klikni ovdje",
133 "settings.service.form.indirectMessageInfo" : "Vi ćete biti obavješteni o svim novim porukama na kanalu, ne samo o @imenima, kanalima, @ovdje, ...", 176 "settings.service.form.indirectMessageInfo" : "Vi ćete biti obavješteni o svim novim porukama na kanalu, ne samo o @imenima, kanalima, @ovdje, ...",
134 "settings.service.form.indirectMessages" : "Prikaži značku na svim novim porukuama", 177 "settings.service.form.indirectMessages" : "Prikaži značku na svim novim porukuama",
135 "settings.service.form.isMutedInfo" : "Kada je onemogućeno, sve obavijesti, svi zvukovi i sva pozadinska podrška će biti nečujna. ", 178 "settings.service.form.isMutedInfo" : "Kada je onemogućeno, sve obavijesti, svi zvukovi i sva pozadinska podrška će biti nečujna. ",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Omogući obavijesti", 240 "tabs.item.enableNotification" : "Omogući obavijesti",
198 "tabs.item.enableService" : "Omogući usluge", 241 "tabs.item.enableService" : "Omogući usluge",
199 "tabs.item.reload" : "Ponovno učitavanje", 242 "tabs.item.reload" : "Ponovno učitavanje",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Prijavite se na račun", 247 "welcome.loginButton" : "Prijavite se na račun",
201 "welcome.signupButton" : "Stvorite novi korisnički račun", 248 "welcome.signupButton" : "Stvorite novi korisnički račun",
202 "welcome.slogan" : "Poruke koje su stvorene za tebe" 249 "welcome.slogan" : "Poruke koje su stvorene za tebe"
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 15bdd33f4..308559f3b 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "A munkamenet lejárt, kérlek lépj be újra.", 26 "login.serverLogout" : "A munkamenet lejárt, kérlek lépj be újra.",
27 "login.submit.label" : "Bejelentkezés", 27 "login.submit.label" : "Bejelentkezés",
28 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.", 28 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Beállítások",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Szerkesztés",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Törlés",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Adatvédelmi Nyilatkozatot",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Email cím", 72 "password.email.label" : "Email cím",
30 "password.headline" : "Jelszó visszaállítása", 73 "password.headline" : "Jelszó visszaállítása",
31 "password.link.login" : "Jelentkezz be a fiókodba", 74 "password.link.login" : "Jelentkezz be a fiókodba",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Értesítések engedélyezése", 240 "tabs.item.enableNotification" : "Értesítések engedélyezése",
198 "tabs.item.enableService" : "Szolgáltatás engedélyezése", 241 "tabs.item.enableService" : "Szolgáltatás engedélyezése",
199 "tabs.item.reload" : "Újratöltés", 242 "tabs.item.reload" : "Újratöltés",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Jelentkezz be a fiókodba", 247 "welcome.loginButton" : "Jelentkezz be a fiókodba",
201 "welcome.signupButton" : "Új fiók létrehozása", 248 "welcome.signupButton" : "Új fiók létrehozása",
202 "welcome.slogan" : "Üzenetküldés okosan" 249 "welcome.slogan" : "Üzenetküldés okosan"
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 509c5ad9c..51820150f 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.", 26 "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.",
27 "login.submit.label" : "Masuk", 27 "login.submit.label" : "Masuk",
28 "login.tokenExpired" : "Sesi Anda kedaluwarsa, silakan masuk kembali.", 28 "login.tokenExpired" : "Sesi Anda kedaluwarsa, silakan masuk kembali.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Pengaturan",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Edit",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Hapus",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Pernyataan Privasi",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Alamat email", 72 "password.email.label" : "Alamat email",
30 "password.headline" : "Setel ulang sandi", 73 "password.headline" : "Setel ulang sandi",
31 "password.link.login" : "Masuk ke akun Anda", 74 "password.link.login" : "Masuk ke akun Anda",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Aktifkan pemberitahuan", 240 "tabs.item.enableNotification" : "Aktifkan pemberitahuan",
198 "tabs.item.enableService" : "Aktifkan layanan", 241 "tabs.item.enableService" : "Aktifkan layanan",
199 "tabs.item.reload" : "Muat Ulang", 242 "tabs.item.reload" : "Muat Ulang",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Masuk ke akun Anda", 247 "welcome.loginButton" : "Masuk ke akun Anda",
201 "welcome.signupButton" : "Buat akun gratis", 248 "welcome.signupButton" : "Buat akun gratis",
202 "welcome.slogan" : "Perpesanan yang bekerja untuk Anda" 249 "welcome.slogan" : "Perpesanan yang bekerja untuk Anda"
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index a1392afba..c45587c87 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -26,17 +26,60 @@
26 "login.serverLogout" : "La tua sessione è scaduta, accedi nuovamente.", 26 "login.serverLogout" : "La tua sessione è scaduta, accedi nuovamente.",
27 "login.submit.label" : "Accedi", 27 "login.submit.label" : "Accedi",
28 "login.tokenExpired" : "La tua sessione è scaduta, accedi nuovamente.", 28 "login.tokenExpired" : "La tua sessione è scaduta, accedi nuovamente.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Impostazioni",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Modifica",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Elimina",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Informativa sulla Privacy",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Indirizzo email", 72 "password.email.label" : "Indirizzo email",
30 "password.headline" : "Reimposta password", 73 "password.headline" : "Reimposta password",
31 "password.link.login" : "Accedi al tuo account", 74 "password.link.login" : "Accedi al tuo account",
32 "password.link.signup" : "Crea un account gratuito", 75 "password.link.signup" : "Crea un account gratuito",
33 "password.noUser" : "Non è stato trovato nessun utente con questo indirizzo e-mail", 76 "password.noUser" : "Non è stato trovato nessun utente con questo indirizzo e-mail",
34 "password.submit.label" : "Invia", 77 "password.submit.label" : "Invia",
35 "password.successInfo" : "Controlla la tua email", 78 "password.successInfo" : "Please check your email",
36 "pricing.headline" : "Supporta Franz", 79 "pricing.headline" : "Support Franz",
37 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz", 80 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz.",
38 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz", 81 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz",
39 "pricing.support.label" : "Seleziona il tuo piano di supporto", 82 "pricing.support.label" : "Select your support plan",
40 "service.crashHandler.action" : "Ricarica {name}", 83 "service.crashHandler.action" : "Ricarica {name}",
41 "service.crashHandler.autoReload" : "Tentativo di ripristino automatico di {name} in {seconds} secondi", 84 "service.crashHandler.autoReload" : "Tentativo di ripristino automatico di {name} in {seconds} secondi",
42 "service.crashHandler.headline" : "Oh no!", 85 "service.crashHandler.headline" : "Oh no!",
@@ -44,8 +87,8 @@
44 "service.disabledHandler.action" : "Attiva {name}", 87 "service.disabledHandler.action" : "Attiva {name}",
45 "service.disabledHandler.headline" : "{name} è disattivato", 88 "service.disabledHandler.headline" : "{name} è disattivato",
46 "services.getStarted" : "Iniziamo", 89 "services.getStarted" : "Iniziamo",
47 "services.welcome" : "Benvenuto in Franz", 90 "services.welcome" : "Welcome to Franz",
48 "settings.account.account.editButton" : "Modifica account", 91 "settings.account.account.editButton" : "Edit account",
49 "settings.account.accountType.basic" : "Account Basic", 92 "settings.account.accountType.basic" : "Account Basic",
50 "settings.account.accountType.premium" : "Premium Supporter Account", 93 "settings.account.accountType.premium" : "Premium Supporter Account",
51 "settings.account.buttonSave" : "Aggiorna profilo", 94 "settings.account.buttonSave" : "Aggiorna profilo",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Attiva notifiche", 240 "tabs.item.enableNotification" : "Attiva notifiche",
198 "tabs.item.enableService" : "Attiva servizio", 241 "tabs.item.enableService" : "Attiva servizio",
199 "tabs.item.reload" : "Aggiorna", 242 "tabs.item.reload" : "Aggiorna",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Accedi al tuo account", 247 "welcome.loginButton" : "Accedi al tuo account",
201 "welcome.signupButton" : "Crea un account gratuito", 248 "welcome.signupButton" : "Crea un account gratuito",
202 "welcome.slogan" : "Un sistema di messaggistica che funziona" 249 "welcome.slogan" : "Un sistema di messaggistica che funziona"
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 9fc0a211b..0634a8fc8 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "セッションの期限が切れました。ログインし直して下さい。", 26 "login.serverLogout" : "セッションの期限が切れました。ログインし直して下さい。",
27 "login.submit.label" : "サインイン", 27 "login.submit.label" : "サインイン",
28 "login.tokenExpired" : "セッションの期限が切れました。ログインし直して下さい。", 28 "login.tokenExpired" : "セッションの期限が切れました。ログインし直して下さい。",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "設定",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "編集",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "削除",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "プライバシーについて",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "メールアドレス", 72 "password.email.label" : "メールアドレス",
30 "password.headline" : "パスワードのリセット", 73 "password.headline" : "パスワードのリセット",
31 "password.link.login" : "サインイン", 74 "password.link.login" : "サインイン",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "通知を有効にする", 240 "tabs.item.enableNotification" : "通知を有効にする",
198 "tabs.item.enableService" : "サービスを有効にする", 241 "tabs.item.enableService" : "サービスを有効にする",
199 "tabs.item.reload" : "再読み込み", 242 "tabs.item.reload" : "再読み込み",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "アカウントにログイン", 247 "welcome.loginButton" : "アカウントにログイン",
201 "welcome.signupButton" : "無料アカウントを作成", 248 "welcome.signupButton" : "無料アカウントを作成",
202 "welcome.slogan" : "Messaging that works for you" 249 "welcome.slogan" : "Messaging that works for you"
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 67e81e12b..8eb0fff56 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "თქვენს სესიას ვადა გაუვიდა, შედით ანგარიშში ხელახლა.", 26 "login.serverLogout" : "თქვენს სესიას ვადა გაუვიდა, შედით ანგარიშში ხელახლა.",
27 "login.submit.label" : "შესვლა", 27 "login.submit.label" : "შესვლა",
28 "login.tokenExpired" : "თქვენს სესიას ვადა გაუვიდა, შედით ანგარიშში ხელახლა.", 28 "login.tokenExpired" : "თქვენს სესიას ვადა გაუვიდა, შედით ანგარიშში ხელახლა.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "პარამეტრები",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "რედაქტირება",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Delete",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "კონფიდენციალურობის შესახებ",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "მეილი", 72 "password.email.label" : "მეილი",
30 "password.headline" : "პაროლის აღდგენა", 73 "password.headline" : "პაროლის აღდგენა",
31 "password.link.login" : "შედით თქვენს ანგარიშში", 74 "password.link.login" : "შედით თქვენს ანგარიშში",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "შეტყობინებების ჩართვა", 240 "tabs.item.enableNotification" : "შეტყობინებების ჩართვა",
198 "tabs.item.enableService" : "სერვისის ჩართვა", 241 "tabs.item.enableService" : "სერვისის ჩართვა",
199 "tabs.item.reload" : "ჩატვირთვა", 242 "tabs.item.reload" : "ჩატვირთვა",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "შედით თქვენს ანგარიშში", 247 "welcome.loginButton" : "შედით თქვენს ანგარიშში",
201 "welcome.signupButton" : "შექმენი ანგარიში, ეს უფასოა", 248 "welcome.signupButton" : "შექმენი ანგარიში, ეს უფასოა",
202 "welcome.slogan" : "შეტყობინების აპლიკაცია, რომელიც მუშაობს შენთვის" 249 "welcome.slogan" : "შეტყობინების აპლიკაცია, რომელიც მუშაობს შენთვის"
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index dab23f607..fe0135a14 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 26 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
27 "login.submit.label" : "Log in", 27 "login.submit.label" : "Log in",
28 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 28 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Instellingen",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Aanpassen",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Delete",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Privacyverklaring",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "E-mailadres", 72 "password.email.label" : "E-mailadres",
30 "password.headline" : "Wachtwoord resetten", 73 "password.headline" : "Wachtwoord resetten",
31 "password.link.login" : "Log in op je account", 74 "password.link.login" : "Log in op je account",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Notificaties inschakelen", 240 "tabs.item.enableNotification" : "Notificaties inschakelen",
198 "tabs.item.enableService" : "Service aanzetten", 241 "tabs.item.enableService" : "Service aanzetten",
199 "tabs.item.reload" : "Herladen", 242 "tabs.item.reload" : "Herladen",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Inloggen op je account", 247 "welcome.loginButton" : "Inloggen op je account",
201 "welcome.signupButton" : "Maak een gratis account aan", 248 "welcome.signupButton" : "Maak een gratis account aan",
202 "welcome.slogan" : "Messaging that works for you" 249 "welcome.slogan" : "Messaging that works for you"
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index e2b14ceab..ac436fc54 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "De sessie is verlopen, log alsjeblieft opnieuw in.", 26 "login.serverLogout" : "De sessie is verlopen, log alsjeblieft opnieuw in.",
27 "login.submit.label" : "Inloggen", 27 "login.submit.label" : "Inloggen",
28 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 28 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Instellingen",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Bewerk",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Verwijderen",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Privacy Voorwaarden",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "E-mailadres", 72 "password.email.label" : "E-mailadres",
30 "password.headline" : "Wachtwoord vergeten", 73 "password.headline" : "Wachtwoord vergeten",
31 "password.link.login" : "Log in op je account", 74 "password.link.login" : "Log in op je account",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Meldingen inschakelen", 240 "tabs.item.enableNotification" : "Meldingen inschakelen",
198 "tabs.item.enableService" : "Service inschakelen", 241 "tabs.item.enableService" : "Service inschakelen",
199 "tabs.item.reload" : "Laad opnieuw", 242 "tabs.item.reload" : "Laad opnieuw",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Log in op je account", 247 "welcome.loginButton" : "Log in op je account",
201 "welcome.signupButton" : "Maak een gratis account", 248 "welcome.signupButton" : "Maak een gratis account",
202 "welcome.slogan" : "Messaging die voor jou werkt" 249 "welcome.slogan" : "Messaging die voor jou werkt"
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index 95e269ea7..74ffbe231 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -16,7 +16,7 @@
16 "invite.name.label" : "Imię", 16 "invite.name.label" : "Imię",
17 "invite.skip.label" : "Chcę to zrobić później", 17 "invite.skip.label" : "Chcę to zrobić później",
18 "invite.submit.label" : "Wyślij zaproszenia", 18 "invite.submit.label" : "Wyślij zaproszenia",
19 "invite.successInfo" : "Invitations sent successfully", 19 "invite.successInfo" : "Zaproszenia zostały wysłane",
20 "login.email.label" : "Adres email", 20 "login.email.label" : "Adres email",
21 "login.headline" : "Zaloguj się", 21 "login.headline" : "Zaloguj się",
22 "login.invalidCredentials" : "Adres email lub hasło są błędne", 22 "login.invalidCredentials" : "Adres email lub hasło są błędne",
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.", 26 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.",
27 "login.submit.label" : "Zaloguj się", 27 "login.submit.label" : "Zaloguj się",
28 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.", 28 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Ustawienia",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Edytuj",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Usuń",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Polityka prywatności",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Adres email", 72 "password.email.label" : "Adres email",
30 "password.headline" : "Wyzeruj hasło", 73 "password.headline" : "Wyzeruj hasło",
31 "password.link.login" : "Zaloguj się na swoje konto", 74 "password.link.login" : "Zaloguj się na swoje konto",
@@ -41,7 +84,7 @@
41 "service.crashHandler.autoReload" : "Próba automatycznego odnowienia {name} za {seconds} sekund\/y", 84 "service.crashHandler.autoReload" : "Próba automatycznego odnowienia {name} za {seconds} sekund\/y",
42 "service.crashHandler.headline" : "O nie!", 85 "service.crashHandler.headline" : "O nie!",
43 "service.crashHandler.text" : "{name} spowodował problem.", 86 "service.crashHandler.text" : "{name} spowodował problem.",
44 "service.disabledHandler.action" : "Dostpny {name}", 87 "service.disabledHandler.action" : "cz {name}",
45 "service.disabledHandler.headline" : "{name} jest wyłączony", 88 "service.disabledHandler.headline" : "{name} jest wyłączony",
46 "services.getStarted" : "Zacznij", 89 "services.getStarted" : "Zacznij",
47 "services.welcome" : "Witaj w programie Franz", 90 "services.welcome" : "Witaj w programie Franz",
@@ -65,18 +108,18 @@
65 "settings.account.successInfo" : "Twoje zmiany zostały zapisane", 108 "settings.account.successInfo" : "Twoje zmiany zostały zapisane",
66 "settings.account.tryReloadUserInfoRequest" : "Spróbuj ponownie", 109 "settings.account.tryReloadUserInfoRequest" : "Spróbuj ponownie",
67 "settings.account.userInfoRequestFailed" : "Nie można wczytać informacji o użytkowniku", 110 "settings.account.userInfoRequestFailed" : "Nie można wczytać informacji o użytkowniku",
68 "settings.app.buttonClearAllCache" : "Clear cache", 111 "settings.app.buttonClearAllCache" : "Wyczyść pamięć podręczną (cache)",
69 "settings.app.buttonInstallUpdate" : "Uruchom ponownie i zainstaluj aktualizację", 112 "settings.app.buttonInstallUpdate" : "Uruchom ponownie i zainstaluj aktualizację",
70 "settings.app.buttonSearchForUpdate" : "Sprawdź aktualizacje", 113 "settings.app.buttonSearchForUpdate" : "Sprawdź aktualizacje",
71 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.", 114 "settings.app.cacheInfo" : "Pamięć podręczna zajmuje obecnie {size} przestrzeni dyskowej",
72 "settings.app.currentVersion" : "Aktualna wersja:", 115 "settings.app.currentVersion" : "Aktualna wersja:",
73 "settings.app.form.autoLaunchInBackground" : "Otwórz w tle", 116 "settings.app.form.autoLaunchInBackground" : "Otwórz w tle",
74 "settings.app.form.autoLaunchOnStart" : "Uruchom Franz na początku", 117 "settings.app.form.autoLaunchOnStart" : "Uruchom Franz na początku",
75 "settings.app.form.beta" : "Uwzględnij wersje beta", 118 "settings.app.form.beta" : "Uwzględnij wersje beta",
76 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 119 "settings.app.form.enableMenuBar" : "Pokaż Franz na pasku menu",
77 "settings.app.form.enableSpellchecking" : "Włącz sprawdzanie pisowni", 120 "settings.app.form.enableSpellchecking" : "Włącz sprawdzanie pisowni",
78 "settings.app.form.enableSystemTray" : "Pokaż Franza w tacy systemowej", 121 "settings.app.form.enableSystemTray" : "Pokaż Franza w tacy systemowej",
79 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 122 "settings.app.form.hideDockIcon" : "Ukrywaj ikonę Franz w zasobniku systemowym",
80 "settings.app.form.language" : "Język", 123 "settings.app.form.language" : "Język",
81 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikację Franz", 124 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikację Franz",
82 "settings.app.form.runInBackground" : "Zachowaj aplikację Franz w tle po zamknięciu okna", 125 "settings.app.form.runInBackground" : "Zachowaj aplikację Franz w tle po zamknięciu okna",
@@ -89,15 +132,15 @@
89 "settings.app.headlineLanguage" : "Język", 132 "settings.app.headlineLanguage" : "Język",
90 "settings.app.headlineUpdates" : "Aktualizacje", 133 "settings.app.headlineUpdates" : "Aktualizacje",
91 "settings.app.restartRequired" : "Zmiany. wymagają ponownego uruchomienia", 134 "settings.app.restartRequired" : "Zmiany. wymagają ponownego uruchomienia",
92 "settings.app.subheadlineCache" : "Cache", 135 "settings.app.subheadlineCache" : "Pamięć podręczna",
93 "settings.app.translationHelp" : "Pomóż nam tłumaczyć Franz na Twój język.", 136 "settings.app.translationHelp" : "Pomóż nam tłumaczyć Franz na Twój język.",
94 "settings.app.updateStatusAvailable" : "Dostępna aktualizacja, pobieram...", 137 "settings.app.updateStatusAvailable" : "Dostępna aktualizacja, pobieram...",
95 "settings.app.updateStatusSearching" : "Szukam aktualizacji", 138 "settings.app.updateStatusSearching" : "Szukam aktualizacji",
96 "settings.app.updateStatusUpToDate" : "Używasz najnowszej wersji aplikacji Franz", 139 "settings.app.updateStatusUpToDate" : "Używasz najnowszej wersji aplikacji Franz",
97 "settings.invite.headline" : "Invite Friends", 140 "settings.invite.headline" : "Zaproś znajomych",
98 "settings.navigation.account" : "Konto", 141 "settings.navigation.account" : "Konto",
99 "settings.navigation.availableServices" : "Dostępne usługi", 142 "settings.navigation.availableServices" : "Dostępne usługi",
100 "settings.navigation.inviteFriends" : "Invite Friends", 143 "settings.navigation.inviteFriends" : "Zaproś znajomych",
101 "settings.navigation.logout" : "Wyloguj", 144 "settings.navigation.logout" : "Wyloguj",
102 "settings.navigation.settings" : "Ustawienia", 145 "settings.navigation.settings" : "Ustawienia",
103 "settings.navigation.yourServices" : "Twoje usługi", 146 "settings.navigation.yourServices" : "Twoje usługi",
@@ -108,7 +151,7 @@
108 "settings.recipes.mostPopular" : "Najpopularniejsze", 151 "settings.recipes.mostPopular" : "Najpopularniejsze",
109 "settings.recipes.nothingFound" : "Żadna usługa nie została znaleziona.", 152 "settings.recipes.nothingFound" : "Żadna usługa nie została znaleziona.",
110 "settings.recipes.servicesSuccessfulAddedInfo" : "Usługa została dodana pomyślnie", 153 "settings.recipes.servicesSuccessfulAddedInfo" : "Usługa została dodana pomyślnie",
111 "settings.searchService" : "Search service", 154 "settings.searchService" : "Wyszukaj serwis",
112 "settings.service.error.goBack" : "Wróć do usług", 155 "settings.service.error.goBack" : "Wróć do usług",
113 "settings.service.error.headline" : "Błąd", 156 "settings.service.error.headline" : "Błąd",
114 "settings.service.error.message" : "Nie można wczytać przepisu usługi.", 157 "settings.service.error.message" : "Nie można wczytać przepisu usługi.",
@@ -121,15 +164,15 @@
121 "settings.service.form.deleteButton" : "Usuń usługę", 164 "settings.service.form.deleteButton" : "Usuń usługę",
122 "settings.service.form.editServiceHeadline" : "Edytuj {name}", 165 "settings.service.form.editServiceHeadline" : "Edytuj {name}",
123 "settings.service.form.enableAudio" : "Włącz dźwięk", 166 "settings.service.form.enableAudio" : "Włącz dźwięk",
124 "settings.service.form.enableBadge" : "Show unread message badges", 167 "settings.service.form.enableBadge" : "Pokaż znacznik nieprzeczytanych wiadomości",
125 "settings.service.form.enableNotification" : "Aktywuj powiadomienia", 168 "settings.service.form.enableNotification" : "Aktywuj powiadomienia",
126 "settings.service.form.enableService" : "Aktywuj usługę", 169 "settings.service.form.enableService" : "Aktywuj usługę",
127 "settings.service.form.headlineBadges" : "Unread message badges", 170 "settings.service.form.headlineBadges" : "Znaczniki nieprzeczytanych wiadomości",
128 "settings.service.form.headlineGeneral" : "Ogólne", 171 "settings.service.form.headlineGeneral" : "Ogólne",
129 "settings.service.form.headlineNotifications" : "Notifications", 172 "settings.service.form.headlineNotifications" : "Powiadomienia",
130 "settings.service.form.icon" : "Custom icon", 173 "settings.service.form.icon" : "Własna ikona",
131 "settings.service.form.iconDelete" : "Delete", 174 "settings.service.form.iconDelete" : "Usuń",
132 "settings.service.form.iconUpload" : "Drop your image, or click here", 175 "settings.service.form.iconUpload" : "Przeciągnij i upuść obraz lub kliknij tutaj",
133 "settings.service.form.indirectMessageInfo" : "Będziesz informowany o wszystkich nowych wiadomościach na kanale, nie tylko @username, @channel, @here, ...", 176 "settings.service.form.indirectMessageInfo" : "Będziesz informowany o wszystkich nowych wiadomościach na kanale, nie tylko @username, @channel, @here, ...",
134 "settings.service.form.indirectMessages" : "Pokaż ikonę wiadomości dla wszystkich nowych wiadomości", 177 "settings.service.form.indirectMessages" : "Pokaż ikonę wiadomości dla wszystkich nowych wiadomości",
135 "settings.service.form.isMutedInfo" : "Kiedy nieaktywne, wszystkie dźwięki powiadomień są wyciszone", 178 "settings.service.form.isMutedInfo" : "Kiedy nieaktywne, wszystkie dźwięki powiadomień są wyciszone",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Włącz powiadomienia", 240 "tabs.item.enableNotification" : "Włącz powiadomienia",
198 "tabs.item.enableService" : "Aktywuj usługę", 241 "tabs.item.enableService" : "Aktywuj usługę",
199 "tabs.item.reload" : "Przeładuj", 242 "tabs.item.reload" : "Przeładuj",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Zaloguj się na swoje konto", 247 "welcome.loginButton" : "Zaloguj się na swoje konto",
201 "welcome.signupButton" : "Stwórz darmowe konto", 248 "welcome.signupButton" : "Stwórz darmowe konto",
202 "welcome.slogan" : "Komunikator który działa" 249 "welcome.slogan" : "Komunikator który działa"
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index acdf38f8d..6ba448999 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,5 +1,5 @@
1{ 1{
2 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços do Franz", 2 "global.api.unhealthy" : "Não foi possível conectar aos serviços do Franz",
3 "global.notConnectedToTheInternet" : "Você não está conectado à internet.", 3 "global.notConnectedToTheInternet" : "Você não está conectado à internet.",
4 "import.headline" : "Importe seus serviços do Franz 4", 4 "import.headline" : "Importe seus serviços do Franz 4",
5 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5", 5 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5",
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Sua sessão expirou, faça o login novamente.", 26 "login.serverLogout" : "Sua sessão expirou, faça o login novamente.",
27 "login.submit.label" : "Entrar", 27 "login.submit.label" : "Entrar",
28 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.", 28 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Ajustes",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Editar",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Excluir",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Declaração de privacidade",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Endereço de e-mail", 72 "password.email.label" : "Endereço de e-mail",
30 "password.headline" : "Trocar a senha", 73 "password.headline" : "Trocar a senha",
31 "password.link.login" : "Fazer login na sua conta", 74 "password.link.login" : "Fazer login na sua conta",
@@ -197,7 +240,11 @@
197 "tabs.item.enableNotification" : "Ativar notificações", 240 "tabs.item.enableNotification" : "Ativar notificações",
198 "tabs.item.enableService" : "Ativar serviço", 241 "tabs.item.enableService" : "Ativar serviço",
199 "tabs.item.reload" : "Recarregar", 242 "tabs.item.reload" : "Recarregar",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Entrar na sua conta", 247 "welcome.loginButton" : "Entrar na sua conta",
201 "welcome.signupButton" : "Criar uma conta grátis", 248 "welcome.signupButton" : "Criar uma conta grátis",
202 "welcome.slogan" : "Mensageria que funciona, para você" 249 "welcome.slogan" : "Mensagens que funcionam para você"
203} 250}
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index fb08ebd2a..9e6d6ac94 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -1,112 +1,155 @@
1{ 1{
2 "global.api.unhealthy" : "Não foi possível conectar aos serviços do Franz", 2 "global.api.unhealthy" : "Não foi possível conetar aos serviços do Franz",
3 "global.notConnectedToTheInternet" : "Não estás conectado à internet.", 3 "global.notConnectedToTheInternet" : "Não existe ligação à Internet.",
4 "import.headline" : "Importar os teus serviços do Franz 4", 4 "import.headline" : "Importe os seus serviços do Franz 4",
5 "import.notSupportedHeadline" : "Os serviços não são suportados no Franz 5", 5 "import.notSupportedHeadline" : "Serviços ainda não são suportados pelo Franz 5",
6 "import.skip.label" : "Quero adicionar serviços manualmente", 6 "import.skip.label" : "Quero adicionar serviços manualmente",
7 "import.submit.label" : "Importar serviços", 7 "import.submit.label" : "Importar serviços",
8 "infobar.buttonChangelog" : "Novidades?", 8 "infobar.buttonChangelog" : "Novidades?",
9 "infobar.buttonInstallUpdate" : "Reiniciar & Instalar Atualizações", 9 "infobar.buttonInstallUpdate" : "Reiniciar & Instalar Atualizações",
10 "infobar.buttonReloadServices" : "Recarregar serviços", 10 "infobar.buttonReloadServices" : "Recarregar serviços",
11 "infobar.requiredRequestsFailed" : "Não foi possivel carregar os serviços e informações do utilizador", 11 "infobar.requiredRequestsFailed" : "Não foi possivel carregar os serviços e informações do utilizador",
12 "infobar.servicesUpdated" : "Os teus serviços foram atualizados", 12 "infobar.servicesUpdated" : "Os seus serviços foram atualizados.",
13 "infobar.updateAvailable" : "Uma atualização está disponível", 13 "infobar.updateAvailable" : "Está disponível uma atualização",
14 "invite.email.label" : "Endereço de e-mail", 14 "invite.email.label" : "Endereço de e-mail",
15 "invite.headline.friends" : "Manda 3 convites aos teus amigos ou colegas", 15 "invite.headline.friends" : "Convide 3 amigos ou colegas",
16 "invite.name.label" : "Nome", 16 "invite.name.label" : "Nome",
17 "invite.skip.label" : "Quero adicionar mais tarde", 17 "invite.skip.label" : "Quero fazer isto mais tarde",
18 "invite.submit.label" : "Mandar convites", 18 "invite.submit.label" : "Enviar convites",
19 "invite.successInfo" : "Invitations sent successfully", 19 "invite.successInfo" : "Convites enviados com sucesso",
20 "login.email.label" : "Endereço de e-mail", 20 "login.email.label" : "Endereço de e-mail",
21 "login.headline" : "Registar", 21 "login.headline" : "Registar",
22 "login.invalidCredentials" : " O email ou a password estão incorretos", 22 "login.invalidCredentials" : "O email ou a palavra-passe estão incorretos",
23 "login.link.password" : "Repor a minha password", 23 "login.link.password" : "Repor a minha palavra-passe",
24 "login.link.signup" : "Criar uma conta gratuita", 24 "login.link.signup" : "Criar uma conta gratuita",
25 "login.password.label" : "Password", 25 "login.password.label" : "Palavra-passe",
26 "login.serverLogout" : "A tua sessão expirou, por favor, volta a fazer login.", 26 "login.serverLogout" : "A sua sessão expirou, inicie sessão novamente.",
27 "login.submit.label" : "Iniciar Sessão", 27 "login.submit.label" : "Iniciar sessão",
28 "login.tokenExpired" : "A tua sessão expirou, por favor, volta a fazer login.", 28 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Definições",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Editar",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Apagar",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Declaração de privacidade",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Endereço de e-mail", 72 "password.email.label" : "Endereço de e-mail",
30 "password.headline" : "Repor a minha password", 73 "password.headline" : "Repor a minha palavra-passe",
31 "password.link.login" : "Fazer login", 74 "password.link.login" : "Iniciar sessão",
32 "password.link.signup" : "Criar uma conta gratuita", 75 "password.link.signup" : "Criar uma conta gratuita",
33 "password.noUser" : "Não existe nenhuma conta associada a esse email", 76 "password.noUser" : "Não existe nenhuma conta associada a esse email",
34 "password.submit.label" : "Submeter", 77 "password.submit.label" : "Submeter",
35 "password.successInfo" : "Por favor, revê o teu email", 78 "password.successInfo" : "Por favor reveja o seu email",
36 "pricing.headline" : "Apoia o Franz", 79 "pricing.headline" : "Apoie o Franz",
37 "pricing.link.skipPayment" : "Não quero ajudar no desenvolvimento do Franz", 80 "pricing.link.skipPayment" : "Não pretendo ajudar no desenvolvimento do Franz",
38 "pricing.submit.label" : "Quero ajudar o desenvolvimento do Franz", 81 "pricing.submit.label" : "Pretendo ajudar no desenvolvimento do Franz",
39 "pricing.support.label" : "Seleciona o teu plano", 82 "pricing.support.label" : "Selecione o seu plano",
40 "service.crashHandler.action" : "Actualizar", 83 "service.crashHandler.action" : "Recarregar",
41 "service.crashHandler.autoReload" : "A tentar restaurar automaticamente {name} em {seconds} seconds", 84 "service.crashHandler.autoReload" : "A tentar restaurar automaticamente {name} em {seconds} segundos",
42 "service.crashHandler.headline" : "Oh não!", 85 "service.crashHandler.headline" : "Oh não!",
43 "service.crashHandler.text" : "{name} causou um erro.", 86 "service.crashHandler.text" : "{name} causou um erro.",
44 "service.disabledHandler.action" : "Habilitar {name}", 87 "service.disabledHandler.action" : "Ativar {name}",
45 "service.disabledHandler.headline" : "{name} está desactivado", 88 "service.disabledHandler.headline" : "{name} está desativado",
46 "services.getStarted" : "Vamos começar", 89 "services.getStarted" : "Vamos começar",
47 "services.welcome" : "Bem-vindo ao Franz", 90 "services.welcome" : "Bem-vindo ao Franz",
48 "settings.account.account.editButton" : "Editar conta", 91 "settings.account.account.editButton" : "Editar conta",
49 "settings.account.accountType.basic" : "Conta básica", 92 "settings.account.accountType.basic" : "Conta básica",
50 "settings.account.accountType.premium" : "Conta Premium, a ajudar o Franz", 93 "settings.account.accountType.premium" : "Conta Premium",
51 "settings.account.buttonSave" : "Atualizar o perfil", 94 "settings.account.buttonSave" : "Atualizar o perfil",
52 "settings.account.deleteAccount" : "Apagar conta", 95 "settings.account.deleteAccount" : "Apagar conta",
53 "settings.account.deleteEmailSent" : "Recebeu um email com um endereço para confirmar a remoção da sua conta. A sua conta e dados não são possiveis de restaurar!", 96 "settings.account.deleteEmailSent" : "Recebeu um email com um endereço para confirmar a remoção da sua conta. A sua conta e dados não poderão ser restaurados!",
54 "settings.account.deleteInfo" : "Se não precisa mais da sua conta Franz, pode apagar a conta e os seus dados aqui.", 97 "settings.account.deleteInfo" : "Se não necessita mais da sua conta Franz, pode apagar a sua conta e dados aqui.",
55 "settings.account.headline" : "Conta", 98 "settings.account.headline" : "Conta",
56 "settings.account.headlineAccount" : "Informação da conta", 99 "settings.account.headlineAccount" : "Informação da conta",
57 "settings.account.headlineDangerZone" : "Zona de perigo", 100 "settings.account.headlineDangerZone" : "Zona de perigo",
58 "settings.account.headlineInvoices" : "Faturas", 101 "settings.account.headlineInvoices" : "Faturas",
59 "settings.account.headlinePassword" : "Mudar password", 102 "settings.account.headlinePassword" : "Alterar palavra-passe",
60 "settings.account.headlineProfile" : "Actualizar o perfil", 103 "settings.account.headlineProfile" : "Atualizar perfil",
61 "settings.account.headlineSubscription" : "A tua subscrição", 104 "settings.account.headlineSubscription" : "A sua subscrição",
62 "settings.account.headlineUpgrade" : "Atualiza a tua conta e ajuda o Franz", 105 "settings.account.headlineUpgrade" : "Atualize a sua conta e ajude o Franz",
63 "settings.account.invoiceDownload" : "Descarregar", 106 "settings.account.invoiceDownload" : "Transferir",
64 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições", 107 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições",
65 "settings.account.successInfo" : "As tuas mudanças foram feitas com sucesso", 108 "settings.account.successInfo" : "As suas mudanças foram efetuadas com sucesso",
66 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente", 109 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente",
67 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador.", 110 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador",
68 "settings.app.buttonClearAllCache" : "Limpar a 'cache'", 111 "settings.app.buttonClearAllCache" : "Limpar cache",
69 "settings.app.buttonInstallUpdate" : "Reiniciar & Instalar Atualizações", 112 "settings.app.buttonInstallUpdate" : "Reiniciar & Instalar Atualizações",
70 "settings.app.buttonSearchForUpdate" : "Procurar por atualizações", 113 "settings.app.buttonSearchForUpdate" : "Procurar por atualizações",
71 "settings.app.cacheInfo" : "O 'chache' do Franz está a usar {size} do espaço do disco.", 114 "settings.app.cacheInfo" : "A cache do Franz está a usar {size} do espaço em disco.",
72 "settings.app.currentVersion" : "Versão atual", 115 "settings.app.currentVersion" : "Versão atual",
73 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano", 116 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano",
74 "settings.app.form.autoLaunchOnStart" : "Inicar o Franz quando inciar o computador", 117 "settings.app.form.autoLaunchOnStart" : "Iniciar o Franz com o início de sessão",
75 "settings.app.form.beta" : "Incluir versões instáveis (beta)", 118 "settings.app.form.beta" : "Incluir versões instáveis (beta)",
76 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 119 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu",
77 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica", 120 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica",
78 "settings.app.form.enableSystemTray" : "Mostrar o Franz na bandeja do sistema", 121 "settings.app.form.enableSystemTray" : "Mostrar o Franz na barra do sistema",
79 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 122 "settings.app.form.hideDockIcon" : "Esconder ícone na Dock",
80 "settings.app.form.language" : "Idioma:", 123 "settings.app.form.language" : "Idioma:",
81 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a bandeja do sistema", 124 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a barra do sistema",
82 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela", 125 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela",
83 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desactivados", 126 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados",
84 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar icon com o número de mensagens não lidas quando as notificações estão desactivadas", 127 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desactivadas",
85 "settings.app.headline" : "Definições", 128 "settings.app.headline" : "Definições",
86 "settings.app.headlineAdvanced" : "Avançado", 129 "settings.app.headlineAdvanced" : "Avançado",
87 "settings.app.headlineAppearance" : "Aparência", 130 "settings.app.headlineAppearance" : "Aparência",
88 "settings.app.headlineGeneral" : "Geral", 131 "settings.app.headlineGeneral" : "Geral",
89 "settings.app.headlineLanguage" : "Idioma:", 132 "settings.app.headlineLanguage" : "Idioma:",
90 "settings.app.headlineUpdates" : "Atualizações", 133 "settings.app.headlineUpdates" : "Atualizações",
91 "settings.app.restartRequired" : "Alterações requerem reiniciar", 134 "settings.app.restartRequired" : "Alterações requerem reinício",
92 "settings.app.subheadlineCache" : "Cache", 135 "settings.app.subheadlineCache" : "Cache",
93 "settings.app.translationHelp" : "Ajude a traduzir a Franz para a sua língua. ", 136 "settings.app.translationHelp" : "Ajude-nos a traduzir a Franz para a sua língua.",
94 "settings.app.updateStatusAvailable" : "Atualização disponivel, a descarregar...", 137 "settings.app.updateStatusAvailable" : "Atualização disponivel, a transferir...",
95 "settings.app.updateStatusSearching" : "Está a procurar atualizações", 138 "settings.app.updateStatusSearching" : "Procurando por atualizações",
96 "settings.app.updateStatusUpToDate" : "Estás a usar a última versão do Franz", 139 "settings.app.updateStatusUpToDate" : "Está a usar a versão mais recente do Franz",
97 "settings.invite.headline" : "Invite Friends", 140 "settings.invite.headline" : "Convide amigos",
98 "settings.navigation.account" : "Conta", 141 "settings.navigation.account" : "Conta",
99 "settings.navigation.availableServices" : "Serviços disponíveis", 142 "settings.navigation.availableServices" : "Serviços disponíveis",
100 "settings.navigation.inviteFriends" : "Invite Friends", 143 "settings.navigation.inviteFriends" : "Convide amigos",
101 "settings.navigation.logout" : "Terminar Sessão", 144 "settings.navigation.logout" : "Terminar sessão",
102 "settings.navigation.settings" : "Definições", 145 "settings.navigation.settings" : "Definições",
103 "settings.navigation.yourServices" : "Os teus serviços", 146 "settings.navigation.yourServices" : "Os seus serviços",
104 "settings.recipes.all" : "Todos os serviços", 147 "settings.recipes.all" : "Todos os serviços",
105 "settings.recipes.dev" : "Desenvolvimento", 148 "settings.recipes.dev" : "Desenvolvimento",
106 "settings.recipes.headline" : "Serviços disponíveis", 149 "settings.recipes.headline" : "Serviços disponíveis",
107 "settings.recipes.missingService" : "A faltar um serviço?", 150 "settings.recipes.missingService" : "A faltar um serviço?",
108 "settings.recipes.mostPopular" : "Os mais populares", 151 "settings.recipes.mostPopular" : "Os mais populares",
109 "settings.recipes.nothingFound" : "Desculpa, mas não existe nenhum serviço com este termo.", 152 "settings.recipes.nothingFound" : "Lamentamos, mas não existe nenhum serviço corresponde ao pesquisado.",
110 "settings.recipes.servicesSuccessfulAddedInfo" : "Serviço adicionado", 153 "settings.recipes.servicesSuccessfulAddedInfo" : "Serviço adicionado",
111 "settings.searchService" : "Pesquisa de serviço", 154 "settings.searchService" : "Pesquisa de serviço",
112 "settings.service.error.goBack" : "Voltar aos serviços", 155 "settings.service.error.goBack" : "Voltar aos serviços",
@@ -115,89 +158,93 @@
115 "settings.service.form.addServiceHeadline" : "Adicionar {name}", 158 "settings.service.form.addServiceHeadline" : "Adicionar {name}",
116 "settings.service.form.availableServices" : "Serviços disponíveis", 159 "settings.service.form.availableServices" : "Serviços disponíveis",
117 "settings.service.form.customUrl" : "Servidor personalizado", 160 "settings.service.form.customUrl" : "Servidor personalizado",
118 "settings.service.form.customUrlPremiumInfo" : "Para adicionar serviços de hospedagem própria, precisas de uma Conta Premium Franz.", 161 "settings.service.form.customUrlPremiumInfo" : "Para adicionar serviços com domínio próprio, é necessário uma Conta Premium.",
119 "settings.service.form.customUrlUpgradeAccount" : "Atualizar a conta", 162 "settings.service.form.customUrlUpgradeAccount" : "Atualizar a conta",
120 "settings.service.form.customUrlValidationError" : "Não foi possível validar o servidor {nome}.", 163 "settings.service.form.customUrlValidationError" : "Não foi possível validar o servidor {nome}.",
121 "settings.service.form.deleteButton" : "Apagar serviço", 164 "settings.service.form.deleteButton" : "Apagar serviço",
122 "settings.service.form.editServiceHeadline" : "Editar {name}", 165 "settings.service.form.editServiceHeadline" : "Editar {name}",
123 "settings.service.form.enableAudio" : "Activar áudio", 166 "settings.service.form.enableAudio" : "Ativar áudio",
124 "settings.service.form.enableBadge" : "Mostrar emblema de mensagens não vistas", 167 "settings.service.form.enableBadge" : "Mostrar emblema de mensagens não vistas",
125 "settings.service.form.enableNotification" : "Ativar notificações", 168 "settings.service.form.enableNotification" : "Ativar notificações",
126 "settings.service.form.enableService" : "Ativar serviço", 169 "settings.service.form.enableService" : "Ativar serviço",
127 "settings.service.form.headlineBadges" : "Emblema de mensagem não vista", 170 "settings.service.form.headlineBadges" : "Emblema de mensagem não vista",
128 "settings.service.form.headlineGeneral" : "Geral", 171 "settings.service.form.headlineGeneral" : "Geral",
129 "settings.service.form.headlineNotifications" : "Notificações", 172 "settings.service.form.headlineNotifications" : "Notificações",
130 "settings.service.form.icon" : "Icon personalizvel", 173 "settings.service.form.icon" : "Personalizar cone",
131 "settings.service.form.iconDelete" : "Apagar", 174 "settings.service.form.iconDelete" : "Apagar",
132 "settings.service.form.iconUpload" : "Arraste a sua imagem, ou clique aqui", 175 "settings.service.form.iconUpload" : "Arraste a sua imagem, ou clique aqui",
133 "settings.service.form.indirectMessageInfo" : "Serás notificado sobre todas as novas mensagens de um canal, não só @username, @channel, @here, ...", 176 "settings.service.form.indirectMessageInfo" : "Será notificado sobre todas as novas mensagens de um canal, não apenas @username, @channel, @here, ...",
134 "settings.service.form.indirectMessages" : "Mostrar o emblema da mensagem para todas as novas mensagens", 177 "settings.service.form.indirectMessages" : "Mostrar o emblema da mensagem para todas as novas mensagens",
135 "settings.service.form.isMutedInfo" : "Quando desactivado, todo o audio das notificações estará em silêncio", 178 "settings.service.form.isMutedInfo" : "Quando desativado, todas as notificações de áudio serão silenciadas",
136 "settings.service.form.name" : "Nome", 179 "settings.service.form.name" : "Nome",
137 "settings.service.form.saveButton" : "Guardar serviço", 180 "settings.service.form.saveButton" : "Guardar serviço",
138 "settings.service.form.tabHosted" : "Hospedado", 181 "settings.service.form.tabHosted" : "Com domínio",
139 "settings.service.form.tabOnPremise" : "Hospedado por si próprio ⭐️", 182 "settings.service.form.tabOnPremise" : "Com domínio próprio ⭐️",
140 "settings.service.form.team" : "Equipa", 183 "settings.service.form.team" : "Equipa",
141 "settings.service.form.useHostedService" : "Utilize o serviço oferecido por {name}.", 184 "settings.service.form.useHostedService" : "Utilize o serviço oferecido por {name}.",
142 "settings.service.form.yourServices" : "Os teus serviços", 185 "settings.service.form.yourServices" : "Os seus serviços",
143 "settings.services.deletedInfo" : "O serviço foi apagado", 186 "settings.services.deletedInfo" : "O serviço foi apagado",
144 "settings.services.discoverServices" : "Descobrir serviços", 187 "settings.services.discoverServices" : "Descobrir serviços",
145 "settings.services.headline" : "Os teus serviços", 188 "settings.services.headline" : "Os seus serviços",
146 "settings.services.noServicesAdded" : "Ainda não adicionaste nenhum serviço.", 189 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.",
147 "settings.services.tooltip.isDisabled" : "O serviço está desativado", 190 "settings.services.tooltip.isDisabled" : "O serviço está desativado",
148 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados", 191 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados",
149 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desabilitadas", 192 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas",
150 "settings.services.updatedInfo" : "As alterações foram guardadas", 193 "settings.services.updatedInfo" : "As alterações foram guardadas",
151 "settings.user.form.accountType.company" : "Empresa", 194 "settings.user.form.accountType.company" : "Empresa",
152 "settings.user.form.accountType.individual" : "Individual", 195 "settings.user.form.accountType.individual" : "Indivíduo",
153 "settings.user.form.accountType.label" : "Tipo de conta", 196 "settings.user.form.accountType.label" : "Tipo de conta",
154 "settings.user.form.accountType.non-profit" : "Sem fins lucrativos", 197 "settings.user.form.accountType.non-profit" : "Sem fins lucrativos",
155 "settings.user.form.currentPassword" : "Password atual", 198 "settings.user.form.currentPassword" : "Palavra-passe atual",
156 "settings.user.form.email" : "Email", 199 "settings.user.form.email" : "Email",
157 "settings.user.form.firstname" : "Primeiro Nome", 200 "settings.user.form.firstname" : "Primeiro Nome",
158 "settings.user.form.lastname" : "Último Nome", 201 "settings.user.form.lastname" : "Último Nome",
159 "settings.user.form.newPassword" : "Nova password", 202 "settings.user.form.newPassword" : "Nova palavra-passe",
160 "sidebar.addNewService" : "Adicionar um novo serviço", 203 "sidebar.addNewService" : "Adicionar um novo serviço",
161 "sidebar.muteApp" : "Desactivar notificações e audio", 204 "sidebar.muteApp" : "Desativar notificações e áudio",
162 "sidebar.settings" : "Definições", 205 "sidebar.settings" : "Definições",
163 "sidebar.unmuteApp" : "Activar notificações e audio", 206 "sidebar.unmuteApp" : "Ativar notificações e áudio",
164 "signup.company.label" : "Empresa", 207 "signup.company.label" : "Empresa",
165 "signup.email.label" : "Endereço de e-mail", 208 "signup.email.label" : "Endereço de e-mail",
166 "signup.emailDuplicate" : "Uma conta já tem esse email associado", 209 "signup.emailDuplicate" : "Já existe uma conta associada a este endereço",
167 "signup.firstname.label" : "Primeiro Nome", 210 "signup.firstname.label" : "Primeiro Nome",
168 "signup.headline" : "Iniciar Sessão", 211 "signup.headline" : "Criar conta",
169 "signup.lastname.label" : "Último Nome", 212 "signup.lastname.label" : "Último Nome",
170 "signup.legal.info" : "Ao criar uma conta Franz, aceitas", 213 "signup.legal.info" : "Ao criar uma conta Franz, aceita",
171 "signup.legal.privacy" : "Declaração de privacidade", 214 "signup.legal.privacy" : "Declaração de privacidade",
172 "signup.legal.terms" : "Termos de Serviço", 215 "signup.legal.terms" : "Termos de Serviço",
173 "signup.link.login" : "Já tens uma conta?", 216 "signup.link.login" : "Já tem conta, iniciar sessão?",
174 "signup.password.label" : "Password", 217 "signup.password.label" : "Palavra-passe",
175 "signup.submit.label" : "Criar uma Conta", 218 "signup.submit.label" : "Criar uma conta",
176 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas", 219 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas",
177 "subscription.features.ads" : "Sem anúncios, para sempre!", 220 "subscription.features.ads" : "Sem anúncios, para sempre!",
178 "subscription.features.comingSoon" : "Em breve!", 221 "subscription.features.comingSoon" : "Em breve!",
179 "subscription.features.customServices" : "Serviços privados para ti e para os teus amigos\/colegas", 222 "subscription.features.customServices" : "Serviços privados para si e para a sua equipa",
180 "subscription.features.encryptedSync" : "Sincronização encriptada de serviços", 223 "subscription.features.encryptedSync" : "Sincronização encriptada de serviços",
181 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat", 224 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat",
182 "subscription.features.vpn" : "Suporte para proxy\/VPN", 225 "subscription.features.vpn" : "Suporte para proxy\/VPN",
183 "subscription.includedFeatures" : "Ao pagares para o Franz Premium, tens acesso a", 226 "subscription.includedFeatures" : "Ao subscrever uma Conta Premium, tem acesso a",
184 "subscription.paymentSessionError" : "Erro no serviço de pagamento", 227 "subscription.paymentSessionError" : "Erro no serviço de pagamento",
185 "subscription.submit.label" : "Quero ajudar o desenvolvimento do Franz", 228 "subscription.submit.label" : "Pretendo ajudar o desenvolvimento do Franz",
186 "subscription.type.free" : "Gratuito", 229 "subscription.type.free" : "Gratuito",
187 "subscription.type.month" : "mês", 230 "subscription.type.month" : "mês",
188 "subscription.type.year" : "ano", 231 "subscription.type.year" : "ano",
189 "subscriptionPopup.buttonCancel" : "Cancelar", 232 "subscriptionPopup.buttonCancel" : "Cancelar",
190 "subscriptionPopup.buttonDone" : "Concluído", 233 "subscriptionPopup.buttonDone" : "Concluído",
191 "tabs.item.deleteService" : "Apagar serviço", 234 "tabs.item.deleteService" : "Apagar serviço",
192 "tabs.item.disableAudio" : "Desactivar audio", 235 "tabs.item.disableAudio" : "Desativar áudio",
193 "tabs.item.disableNotifications" : "Desativar notificações", 236 "tabs.item.disableNotifications" : "Desativar notificações",
194 "tabs.item.disableService" : "Desativar serviço", 237 "tabs.item.disableService" : "Desativar serviço",
195 "tabs.item.edit" : "Editar", 238 "tabs.item.edit" : "Editar",
196 "tabs.item.enableAudio" : "Activar áudio", 239 "tabs.item.enableAudio" : "Ativar áudio",
197 "tabs.item.enableNotification" : "Ativar notificações", 240 "tabs.item.enableNotification" : "Ativar notificações",
198 "tabs.item.enableService" : "Ativar serviço", 241 "tabs.item.enableService" : "Ativar serviço",
199 "tabs.item.reload" : "Recarregar", 242 "tabs.item.reload" : "Recarregar",
200 "welcome.loginButton" : "Fazer login", 243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
247 "welcome.loginButton" : "Iniciar sessão",
201 "welcome.signupButton" : "Criar uma conta gratuita", 248 "welcome.signupButton" : "Criar uma conta gratuita",
202 "welcome.slogan" : "Messaging that works for you" 249 "welcome.slogan" : "Messaging that works for you"
203} 250}
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 65b61c1e5..4d9f7f274 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -26,13 +26,56 @@
26 "login.serverLogout" : "Сессия устарела, пожалуйста, войдите снова.", 26 "login.serverLogout" : "Сессия устарела, пожалуйста, войдите снова.",
27 "login.submit.label" : "Вход", 27 "login.submit.label" : "Вход",
28 "login.tokenExpired" : "Сессия устарела, пожалуйста, войдите снова.", 28 "login.tokenExpired" : "Сессия устарела, пожалуйста, войдите снова.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Настройки",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Редактировать",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Удалить",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Политика конфиденциальности",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Email адрес", 72 "password.email.label" : "Email адрес",
30 "password.headline" : "стнлене парол", 73 "password.headline" : "осить парол",
31 "password.link.login" : "Вход", 74 "password.link.login" : "Вход",
32 "password.link.signup" : "Создать ат", 75 "password.link.signup" : "Создать учётую зсь олователя",
33 "password.noUser" : "Не найдено пользователя с таким email", 76 "password.noUser" : "Не найдено пользователя с таким email",
34 "password.submit.label" : "остновить", 77 "password.submit.label" : "нь",
35 "password.successInfo" : "Проверьте Ваш email", 78 "password.successInfo" : "Проверьте Вашу электронную почту",
36 "pricing.headline" : "Поддержать Franz", 79 "pricing.headline" : "Поддержать Franz",
37 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.", 80 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.",
38 "pricing.submit.label" : "Я хочу поддержать разработку Franz", 81 "pricing.submit.label" : "Я хочу поддержать разработку Franz",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Включить уведомления", 240 "tabs.item.enableNotification" : "Включить уведомления",
198 "tabs.item.enableService" : "Включить службу", 241 "tabs.item.enableService" : "Включить службу",
199 "tabs.item.reload" : "Перезагрузить", 242 "tabs.item.reload" : "Перезагрузить",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Вход", 247 "welcome.loginButton" : "Вход",
201 "welcome.signupButton" : "Создать аккаунт", 248 "welcome.signupButton" : "Создать аккаунт",
202 "welcome.slogan" : "Общение, которое просто работает" 249 "welcome.slogan" : "Общение, которое просто работает"
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index 35f06531f..87c1acebc 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Relácia vypršala, prihláste sa prosím znova.", 26 "login.serverLogout" : "Relácia vypršala, prihláste sa prosím znova.",
27 "login.submit.label" : "Prihlásiť sa", 27 "login.submit.label" : "Prihlásiť sa",
28 "login.tokenExpired" : "Relácia vypršala, prosím prihláste sa znova.", 28 "login.tokenExpired" : "Relácia vypršala, prosím prihláste sa znova.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Nastavenia",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Upraviť",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Zmazať",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Vyhlásenie o ochrane súkromia",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Emailová adresa", 72 "password.email.label" : "Emailová adresa",
30 "password.headline" : "Vynulovať heslo", 73 "password.headline" : "Vynulovať heslo",
31 "password.link.login" : "Prihlásenie do vašeho účtu", 74 "password.link.login" : "Prihlásenie do vašeho účtu",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Povoliť oznámenia", 240 "tabs.item.enableNotification" : "Povoliť oznámenia",
198 "tabs.item.enableService" : "Povoliť službu", 241 "tabs.item.enableService" : "Povoliť službu",
199 "tabs.item.reload" : "Obnoviť", 242 "tabs.item.reload" : "Obnoviť",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Prihláste sa k vášmu účtu", 247 "welcome.loginButton" : "Prihláste sa k vášmu účtu",
201 "welcome.signupButton" : "Vytvoriť užívateľský účet zdarma", 248 "welcome.signupButton" : "Vytvoriť užívateľský účet zdarma",
202 "welcome.slogan" : "Správy, ktoré pracujú pre vás" 249 "welcome.slogan" : "Správy, ktoré pracujú pre vás"
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index 90e1a04b9..d93712d88 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.", 26 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.",
27 "login.submit.label" : "Prijavite se", 27 "login.submit.label" : "Prijavite se",
28 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 28 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Postavke",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Uredi",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Delete",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Izjava o privatnosti",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Vaša e-adresa", 72 "password.email.label" : "Vaša e-adresa",
30 "password.headline" : "Stvorite novu zaporku", 73 "password.headline" : "Stvorite novu zaporku",
31 "password.link.login" : "Prijavite se na Vaš račun", 74 "password.link.login" : "Prijavite se na Vaš račun",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Omogući obavijesti", 240 "tabs.item.enableNotification" : "Omogući obavijesti",
198 "tabs.item.enableService" : "Omogući usluge", 241 "tabs.item.enableService" : "Omogući usluge",
199 "tabs.item.reload" : "Ponovno učitavanje", 242 "tabs.item.reload" : "Ponovno učitavanje",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Prijavite se na račun", 247 "welcome.loginButton" : "Prijavite se na račun",
201 "welcome.signupButton" : "Stvorite novi korisnički račun", 248 "welcome.signupButton" : "Stvorite novi korisnički račun",
202 "welcome.slogan" : "Poruke koje su stvorene za tebe" 249 "welcome.slogan" : "Poruke koje su stvorene za tebe"
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index bcf0dd483..96738d462 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -16,7 +16,7 @@
16 "invite.name.label" : "Ad", 16 "invite.name.label" : "Ad",
17 "invite.skip.label" : "Daha sonra yapmak istiyorum", 17 "invite.skip.label" : "Daha sonra yapmak istiyorum",
18 "invite.submit.label" : "Davetiye gönder", 18 "invite.submit.label" : "Davetiye gönder",
19 "invite.successInfo" : "Invitations sent successfully", 19 "invite.successInfo" : "Davetiyeler başarıyla gönderildi",
20 "login.email.label" : "E-posta adresi", 20 "login.email.label" : "E-posta adresi",
21 "login.headline" : "Oturum Aç", 21 "login.headline" : "Oturum Aç",
22 "login.invalidCredentials" : "Yanlış parola ya da e-posta adresi", 22 "login.invalidCredentials" : "Yanlış parola ya da e-posta adresi",
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Oturum süreniz dolmuş, lütfen tekrar giriş yapın.", 26 "login.serverLogout" : "Oturum süreniz dolmuş, lütfen tekrar giriş yapın.",
27 "login.submit.label" : "Oturum Aç", 27 "login.submit.label" : "Oturum Aç",
28 "login.tokenExpired" : "Oturum zaman aşımına uğradı, lütfen tekrar giriş yapın.", 28 "login.tokenExpired" : "Oturum zaman aşımına uğradı, lütfen tekrar giriş yapın.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Ayarlar",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Düzenle",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Sil",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Gizlilik Sözleşmesi",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "E-posta adresi", 72 "password.email.label" : "E-posta adresi",
30 "password.headline" : "Parola sıfırla", 73 "password.headline" : "Parola sıfırla",
31 "password.link.login" : "Hesabına giriş yap", 74 "password.link.login" : "Hesabına giriş yap",
@@ -73,10 +116,10 @@
73 "settings.app.form.autoLaunchInBackground" : "Arka planda aç", 116 "settings.app.form.autoLaunchInBackground" : "Arka planda aç",
74 "settings.app.form.autoLaunchOnStart" : "Franz'ı başlangıçta aç", 117 "settings.app.form.autoLaunchOnStart" : "Franz'ı başlangıçta aç",
75 "settings.app.form.beta" : "Beta versiyonları dahil et", 118 "settings.app.form.beta" : "Beta versiyonları dahil et",
76 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 119 "settings.app.form.enableMenuBar" : "Menü çubuğunda Franz göster",
77 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir", 120 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir",
78 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster", 121 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster",
79 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 122 "settings.app.form.hideDockIcon" : "Franz Simgesini Gösterme",
80 "settings.app.form.language" : "Dil", 123 "settings.app.form.language" : "Dil",
81 "settings.app.form.minimizeToSystemTray" : "Franz'ı sistem tepsisine küçült", 124 "settings.app.form.minimizeToSystemTray" : "Franz'ı sistem tepsisine küçült",
82 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut", 125 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut",
@@ -94,10 +137,10 @@
94 "settings.app.updateStatusAvailable" : "Güncelleme mevcut, indiriliyor...", 137 "settings.app.updateStatusAvailable" : "Güncelleme mevcut, indiriliyor...",
95 "settings.app.updateStatusSearching" : "Güncellemeleri denetliyor", 138 "settings.app.updateStatusSearching" : "Güncellemeleri denetliyor",
96 "settings.app.updateStatusUpToDate" : "Franz'ın son versiyonunu kullanıyorsun", 139 "settings.app.updateStatusUpToDate" : "Franz'ın son versiyonunu kullanıyorsun",
97 "settings.invite.headline" : "Invite Friends", 140 "settings.invite.headline" : "Arkadaşlarını davet et",
98 "settings.navigation.account" : "Hesap", 141 "settings.navigation.account" : "Hesap",
99 "settings.navigation.availableServices" : "Mevcut servisler", 142 "settings.navigation.availableServices" : "Mevcut servisler",
100 "settings.navigation.inviteFriends" : "Invite Friends", 143 "settings.navigation.inviteFriends" : "Arkadaşlarını Davet Et",
101 "settings.navigation.logout" : "Çıkış", 144 "settings.navigation.logout" : "Çıkış",
102 "settings.navigation.settings" : "Ayarlar", 145 "settings.navigation.settings" : "Ayarlar",
103 "settings.navigation.yourServices" : "Servislerin", 146 "settings.navigation.yourServices" : "Servislerin",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Bildirimleri etkinleştir", 240 "tabs.item.enableNotification" : "Bildirimleri etkinleştir",
198 "tabs.item.enableService" : "Servisi etkinleştir", 241 "tabs.item.enableService" : "Servisi etkinleştir",
199 "tabs.item.reload" : "Yeniden Yükle", 242 "tabs.item.reload" : "Yeniden Yükle",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Hesabına giriş yap", 247 "welcome.loginButton" : "Hesabına giriş yap",
201 "welcome.signupButton" : "Ücretsiz hesap oluştur", 248 "welcome.signupButton" : "Ücretsiz hesap oluştur",
202 "welcome.slogan" : "Sizin için çalışan mesajlaşma" 249 "welcome.slogan" : "Sizin için çalışan mesajlaşma"
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 4baf234ac..f7c946436 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -16,7 +16,7 @@
16 "invite.name.label" : "Ім'я", 16 "invite.name.label" : "Ім'я",
17 "invite.skip.label" : "Я хочу зробити це пізніше", 17 "invite.skip.label" : "Я хочу зробити це пізніше",
18 "invite.submit.label" : "Відправити запрошення", 18 "invite.submit.label" : "Відправити запрошення",
19 "invite.successInfo" : "Invitations sent successfully", 19 "invite.successInfo" : "Запрошення успішно відослані",
20 "login.email.label" : "Email адреса", 20 "login.email.label" : "Email адреса",
21 "login.headline" : "Увійти", 21 "login.headline" : "Увійти",
22 "login.invalidCredentials" : "Email або пароль некоректні", 22 "login.invalidCredentials" : "Email або пароль некоректні",
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "Ваша сесія закінчилась, будь ласка, зайдіть знову.", 26 "login.serverLogout" : "Ваша сесія закінчилась, будь ласка, зайдіть знову.",
27 "login.submit.label" : "Увійти", 27 "login.submit.label" : "Увійти",
28 "login.tokenExpired" : "Ваша сесія закінчилась, будь ласка, зайдіть знову.", 28 "login.tokenExpired" : "Ваша сесія закінчилась, будь ласка, зайдіть знову.",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "Налаштування",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "Редагувати",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Видалити",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "Заява про конфіденційність",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "Email адреса", 72 "password.email.label" : "Email адреса",
30 "password.headline" : "Скинути пароль", 73 "password.headline" : "Скинути пароль",
31 "password.link.login" : "Увійти до вашого акаунту", 74 "password.link.login" : "Увійти до вашого акаунту",
@@ -50,7 +93,7 @@
50 "settings.account.accountType.premium" : "Преміум Акаунт Прихильника", 93 "settings.account.accountType.premium" : "Преміум Акаунт Прихильника",
51 "settings.account.buttonSave" : "Оновити профіль", 94 "settings.account.buttonSave" : "Оновити профіль",
52 "settings.account.deleteAccount" : "Видалити обліковий запис", 95 "settings.account.deleteAccount" : "Видалити обліковий запис",
53 "settings.account.deleteEmailSent" : "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 96 "settings.account.deleteEmailSent" : "Ви отримали електронного листа з лінком, щоб підтвердити видалення облікового запису. Ваш обліковий запис і дані не можна буде відновити!",
54 "settings.account.deleteInfo" : "Якщо Вам більше не потрібний обліковий запис Franz, Ви можете його видалити і всі суміжні дані.", 97 "settings.account.deleteInfo" : "Якщо Вам більше не потрібний обліковий запис Franz, Ви можете його видалити і всі суміжні дані.",
55 "settings.account.headline" : "Акаунт", 98 "settings.account.headline" : "Акаунт",
56 "settings.account.headlineAccount" : "Інформація про акаунт", 99 "settings.account.headlineAccount" : "Інформація про акаунт",
@@ -65,22 +108,22 @@
65 "settings.account.successInfo" : "Ваші зміни були збережені", 108 "settings.account.successInfo" : "Ваші зміни були збережені",
66 "settings.account.tryReloadUserInfoRequest" : "Спробуйте ще раз", 109 "settings.account.tryReloadUserInfoRequest" : "Спробуйте ще раз",
67 "settings.account.userInfoRequestFailed" : "Не вдалося завантажити інформацію користувача", 110 "settings.account.userInfoRequestFailed" : "Не вдалося завантажити інформацію користувача",
68 "settings.app.buttonClearAllCache" : "Clear cache", 111 "settings.app.buttonClearAllCache" : "Очистити кеш",
69 "settings.app.buttonInstallUpdate" : "Перезавантажити і встановити оновлення", 112 "settings.app.buttonInstallUpdate" : "Перезавантажити і встановити оновлення",
70 "settings.app.buttonSearchForUpdate" : "Перевірити наявність оновлень", 113 "settings.app.buttonSearchForUpdate" : "Перевірити наявність оновлень",
71 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.", 114 "settings.app.cacheInfo" : "Кеш, який використовує Franz, займає {розмір} диску.",
72 "settings.app.currentVersion" : "Поточна версія:", 115 "settings.app.currentVersion" : "Поточна версія:",
73 "settings.app.form.autoLaunchInBackground" : "Відкрити у фоновому режимі", 116 "settings.app.form.autoLaunchInBackground" : "Відкрити у фоновому режимі",
74 "settings.app.form.autoLaunchOnStart" : "Запускати Franz на початку", 117 "settings.app.form.autoLaunchOnStart" : "Запускати Franz на початку",
75 "settings.app.form.beta" : "Включити бета-версії", 118 "settings.app.form.beta" : "Включити бета-версії",
76 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 119 "settings.app.form.enableMenuBar" : "Відображати Franz в панелі головного меню",
77 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії", 120 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії",
78 "settings.app.form.enableSystemTray" : "Показувати Franz у системному лотку", 121 "settings.app.form.enableSystemTray" : "Показувати Franz у системному лотку",
79 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 122 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock",
80 "settings.app.form.language" : "Мова", 123 "settings.app.form.language" : "Мова",
81 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Franz до системного лотка", 124 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Franz до системного лотка",
82 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна", 125 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна",
83 "settings.app.form.showDisabledServices" : "Display disabled services tabs", 126 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених сервісів",
84 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли сповіщення вимкнені", 127 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли сповіщення вимкнені",
85 "settings.app.headline" : "Налаштування", 128 "settings.app.headline" : "Налаштування",
86 "settings.app.headlineAdvanced" : "Advanced", 129 "settings.app.headlineAdvanced" : "Advanced",
@@ -89,15 +132,15 @@
89 "settings.app.headlineLanguage" : "Мова", 132 "settings.app.headlineLanguage" : "Мова",
90 "settings.app.headlineUpdates" : "Оновлення", 133 "settings.app.headlineUpdates" : "Оновлення",
91 "settings.app.restartRequired" : "Зміни потребують перезапуску", 134 "settings.app.restartRequired" : "Зміни потребують перезапуску",
92 "settings.app.subheadlineCache" : "Cache", 135 "settings.app.subheadlineCache" : "Кеш",
93 "settings.app.translationHelp" : "Допоможіть перекласти Franz на Вашу мову.", 136 "settings.app.translationHelp" : "Допоможіть перекласти Franz на Вашу мову.",
94 "settings.app.updateStatusAvailable" : "Оновлення доступне, завантаження...", 137 "settings.app.updateStatusAvailable" : "Оновлення доступне, завантаження...",
95 "settings.app.updateStatusSearching" : "Шукає оновлення", 138 "settings.app.updateStatusSearching" : "Шукає оновлення",
96 "settings.app.updateStatusUpToDate" : "Ви використовуєте останню версію Franz", 139 "settings.app.updateStatusUpToDate" : "Ви використовуєте останню версію Franz",
97 "settings.invite.headline" : "Invite Friends", 140 "settings.invite.headline" : "Запросити друзів",
98 "settings.navigation.account" : "Акаунт", 141 "settings.navigation.account" : "Акаунт",
99 "settings.navigation.availableServices" : "Доступні сервіси", 142 "settings.navigation.availableServices" : "Доступні сервіси",
100 "settings.navigation.inviteFriends" : "Invite Friends", 143 "settings.navigation.inviteFriends" : "Запросити друзів",
101 "settings.navigation.logout" : "Вийти", 144 "settings.navigation.logout" : "Вийти",
102 "settings.navigation.settings" : "Налаштування", 145 "settings.navigation.settings" : "Налаштування",
103 "settings.navigation.yourServices" : "Ваші сервіси", 146 "settings.navigation.yourServices" : "Ваші сервіси",
@@ -126,10 +169,10 @@
126 "settings.service.form.enableService" : "Увімкнути сервіс", 169 "settings.service.form.enableService" : "Увімкнути сервіс",
127 "settings.service.form.headlineBadges" : "Unread message badges", 170 "settings.service.form.headlineBadges" : "Unread message badges",
128 "settings.service.form.headlineGeneral" : "Загальні", 171 "settings.service.form.headlineGeneral" : "Загальні",
129 "settings.service.form.headlineNotifications" : "Notifications", 172 "settings.service.form.headlineNotifications" : "Сповіщення",
130 "settings.service.form.icon" : "Custom icon", 173 "settings.service.form.icon" : "Своя іконка",
131 "settings.service.form.iconDelete" : "Delete", 174 "settings.service.form.iconDelete" : "Видалити",
132 "settings.service.form.iconUpload" : "Drop your image, or click here", 175 "settings.service.form.iconUpload" : "Скиньте своє зображення або натисніть тут",
133 "settings.service.form.indirectMessageInfo" : "Ви отримаєте сповіщення про всі нові повідомлення в каналі, а не лише про @username, @channel, @here, ...", 176 "settings.service.form.indirectMessageInfo" : "Ви отримаєте сповіщення про всі нові повідомлення в каналі, а не лише про @username, @channel, @here, ...",
134 "settings.service.form.indirectMessages" : "Показувати значок повідомлення для всіх нових повідомлень", 177 "settings.service.form.indirectMessages" : "Показувати значок повідомлення для всіх нових повідомлень",
135 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted", 178 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "Увімкнути сповіщення", 240 "tabs.item.enableNotification" : "Увімкнути сповіщення",
198 "tabs.item.enableService" : "Увімкнути службу", 241 "tabs.item.enableService" : "Увімкнути службу",
199 "tabs.item.reload" : "Перезавантажити", 242 "tabs.item.reload" : "Перезавантажити",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "Увійдіть до свого акаунту", 247 "welcome.loginButton" : "Увійдіть до свого акаунту",
201 "welcome.signupButton" : "Створити безплатний акаунт", 248 "welcome.signupButton" : "Створити безплатний акаунт",
202 "welcome.slogan" : "Обмін повідомленнями, який працює для вас" 249 "welcome.slogan" : "Обмін повідомленнями, який працює для вас"
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index 5feef50f2..71e6d65bc 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -26,6 +26,49 @@
26 "login.serverLogout" : "您的登入期間已過期,請重新登錄", 26 "login.serverLogout" : "您的登入期間已過期,請重新登錄",
27 "login.submit.label" : "登入", 27 "login.submit.label" : "登入",
28 "login.tokenExpired" : "您的登入已過期,請重新登入。", 28 "login.tokenExpired" : "您的登入已過期,請重新登入。",
29 "menu.app.about" : "About Franz",
30 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit",
33 "menu.app.settings" : "設定",
34 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "編輯",
36 "menu.edit.copy" : "Copy",
37 "menu.edit.cut" : "Cut",
38 "menu.edit.delete" : "Delete",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols",
40 "menu.edit.paste" : "Paste",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo",
43 "menu.edit.selectAll" : "Select All",
44 "menu.edit.speech" : "Speech",
45 "menu.edit.startDictation" : "Start Dictation",
46 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo",
49 "menu.file" : "File",
50 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Learn More",
53 "menu.help.privacy" : "隱私聲明",
54 "menu.help.support" : "Support",
55 "menu.help.tos" : "Terms of Service",
56 "menu.services" : "Services",
57 "menu.services.addNewService" : "Add New Service...",
58 "menu.view" : "View",
59 "menu.view.enterFullScreen" : "Enter Full Screen",
60 "menu.view.exitFullScreen" : "Exit Full Screen",
61 "menu.view.reloadFranz" : "Reload Franz",
62 "menu.view.reloadService" : "Reload Service",
63 "menu.view.resetZoom" : "Actual Size",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In",
68 "menu.view.zoomOut" : "Zoom Out",
69 "menu.window" : "Window",
70 "menu.window.close" : "Close",
71 "menu.window.minimize" : "Minimize",
29 "password.email.label" : "電子郵件地址", 72 "password.email.label" : "電子郵件地址",
30 "password.headline" : "重設密碼", 73 "password.headline" : "重設密碼",
31 "password.link.login" : "登入您的帳號", 74 "password.link.login" : "登入您的帳號",
@@ -197,6 +240,10 @@
197 "tabs.item.enableNotification" : "啟用通知", 240 "tabs.item.enableNotification" : "啟用通知",
198 "tabs.item.enableService" : "啟用服務", 241 "tabs.item.enableService" : "啟用服務",
199 "tabs.item.reload" : "重新載入", 242 "tabs.item.reload" : "重新載入",
243 "validation.email" : "{field} is not valid",
244 "validation.minLength" : "{field} should be at least {length} characters long",
245 "validation.required" : "{field} is required",
246 "validation.url" : "{field} is not a valid URL",
200 "welcome.loginButton" : "登入您的帳戶", 247 "welcome.loginButton" : "登入您的帳戶",
201 "welcome.signupButton" : "建立免費帳號", 248 "welcome.signupButton" : "建立免費帳號",
202 "welcome.slogan" : "為你通信" 249 "welcome.slogan" : "為你通信"
diff --git a/src/index.html b/src/index.html
index 9e5acd705..5ce7f6a96 100644
--- a/src/index.html
+++ b/src/index.html
@@ -11,10 +11,15 @@
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 <script> 13 <script>
14 document.querySelector('body').classList.add(process.platform); 14 document.querySelector('body').classList.add(process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform);
15 15
16 const { isDevMode } = require('./environment'); 16 const { isDevMode } = require('./environment');
17 if (isDevMode) { 17 if (isDevMode) {
18 const debugging = require('debug');
19 debugging.enable(process.env.DEBUG);
20
21 const debug = debugging('Index');
22
18 document.querySelector('body').classList.add('isDevMode'); 23 document.querySelector('body').classList.add('isDevMode');
19 24
20 (function() { 25 (function() {
@@ -25,7 +30,7 @@
25 document.body.appendChild(s); 30 document.body.appendChild(s);
26 31
27 s.onload = () => { 32 s.onload = () => {
28 console.log('livereload loaded'); 33 debug('livereload loaded');
29 const originalReloadBehaviour = window._onLiveReloadFileChanged; 34 const originalReloadBehaviour = window._onLiveReloadFileChanged;
30 35
31 window._onLiveReloadFileChanged = (file) => { 36 window._onLiveReloadFileChanged = (file) => {
@@ -33,10 +38,10 @@
33 originalReloadBehaviour(file); 38 originalReloadBehaviour(file);
34 } else { 39 } else {
35 if (file.path.includes('/build/webview/')) { 40 if (file.path.includes('/build/webview/')) {
36 console.log('Livereload: Reloading all webvies'); 41 debug('Livereload: Reloading all webvies');
37 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload()); 42 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload());
38 } else { 43 } else {
39 console.log('Livereload: skip reload as only main process files have changed'); 44 debug('Livereload: skip reload as only main process files have changed');
40 } 45 }
41 } 46 }
42 } 47 }
diff --git a/src/index.js b/src/index.js
index f82bb3590..897943a85 100644
--- a/src/index.js
+++ b/src/index.js
@@ -4,7 +4,7 @@ import path from 'path';
4 4
5import windowStateKeeper from 'electron-window-state'; 5import windowStateKeeper from 'electron-window-state';
6 6
7import { isDevMode, isWindows } from './environment'; 7import { isDevMode, isMac, isWindows, isLinux } from './environment';
8import ipcApi from './electron/ipc-api'; 8import ipcApi from './electron/ipc-api';
9import Tray from './lib/Tray'; 9import Tray from './lib/Tray';
10import Settings from './electron/Settings'; 10import Settings from './electron/Settings';
@@ -18,8 +18,8 @@ let mainWindow;
18let willQuitApp = false; 18let willQuitApp = false;
19 19
20// Ensure that the recipe directory exists 20// Ensure that the recipe directory exists
21fs.ensureDir(path.join(app.getPath('userData'), 'recipes'));
22fs.emptyDirSync(path.join(app.getPath('userData'), 'recipes', 'temp')); 21fs.emptyDirSync(path.join(app.getPath('userData'), 'recipes', 'temp'));
22fs.ensureFileSync(path.join(app.getPath('userData'), 'window-state.json'));
23 23
24// Set App ID for Windows 24// Set App ID for Windows
25if (isWindows) { 25if (isWindows) {
@@ -48,11 +48,11 @@ if (isSecondInstance) {
48 app.exit(); 48 app.exit();
49} 49}
50 50
51// Lets disable Hardware Acceleration until we have a better solution 51// Fix Unity indicator issue
52// to deal with the high-perf-gpu requirement of some services 52// https://github.com/electron/electron/issues/9046
53 53if (isLinux && ['Pantheon', 'Unity:Unity7'].indexOf(process.env.XDG_CURRENT_DESKTOP) !== -1) {
54// Disabled to test tweetdeck glitches 54 process.env.XDG_CURRENT_DESKTOP = 'Unity';
55// app.disableHardwareAcceleration(); 55}
56 56
57// Initialize Settings 57// Initialize Settings
58const settings = new Settings(); 58const settings = new Settings();
@@ -72,9 +72,9 @@ const createWindow = () => {
72 height: mainWindowState.height, 72 height: mainWindowState.height,
73 minWidth: 600, 73 minWidth: 600,
74 minHeight: 500, 74 minHeight: 500,
75 titleBarStyle: 'hidden', 75 titleBarStyle: isMac ? 'hidden' : '',
76 frame: isLinux,
76 backgroundColor: '#3498db', 77 backgroundColor: '#3498db',
77 autoHideMenuBar: true,
78 }); 78 });
79 79
80 // Initialize System Tray 80 // Initialize System Tray
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 16e91374e..5a05e47b3 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -1,113 +1,477 @@
1import { remote, shell } from 'electron'; 1import { remote, shell } from 'electron';
2import { autorun, computed, observable, toJS } from 'mobx'; 2import { observable, autorun, computed } from 'mobx';
3import { defineMessages } from 'react-intl';
3 4
4import { isMac } from '../environment'; 5import { isMac, ctrlKey, cmdKey } from '../environment';
5 6
6const { app, Menu, dialog } = remote; 7const { app, Menu, dialog } = remote;
7 8
8const template = [ 9const menuItems = defineMessages({
10 edit: {
11 id: 'menu.edit',
12 defaultMessage: '!!!Edit',
13 },
14 undo: {
15 id: 'menu.edit.undo',
16 defaultMessage: '!!!Undo',
17 },
18 redo: {
19 id: 'menu.edit.redo',
20 defaultMessage: '!!!Redo',
21 },
22 cut: {
23 id: 'menu.edit.cut',
24 defaultMessage: '!!!Cut',
25 },
26 copy: {
27 id: 'menu.edit.copy',
28 defaultMessage: '!!!Copy',
29 },
30 paste: {
31 id: 'menu.edit.paste',
32 defaultMessage: '!!!Paste',
33 },
34 pasteAndMatchStyle: {
35 id: 'menu.edit.pasteAndMatchStyle',
36 defaultMessage: '!!!Paste And Match Style',
37 },
38 delete: {
39 id: 'menu.edit.delete',
40 defaultMessage: '!!!Delete',
41 },
42 selectAll: {
43 id: 'menu.edit.selectAll',
44 defaultMessage: '!!!Select All',
45 },
46 speech: {
47 id: 'menu.edit.speech',
48 defaultMessage: '!!!Speech',
49 },
50 startSpeaking: {
51 id: 'menu.edit.startSpeaking',
52 defaultMessage: '!!!Start Speaking',
53 },
54 stopSpeaking: {
55 id: 'menu.edit.stopSpeaking',
56 defaultMessage: '!!!Stop Speaking',
57 },
58 startDictation: {
59 id: 'menu.edit.startDictation',
60 defaultMessage: '!!!Start Dictation',
61 },
62 emojiSymbols: {
63 id: 'menu.edit.emojiSymbols',
64 defaultMessage: '!!!Emoji & Symbols',
65 },
66 resetZoom: {
67 id: 'menu.view.resetZoom',
68 defaultMessage: '!!!Actual Size',
69 },
70 zoomIn: {
71 id: 'menu.view.zoomIn',
72 defaultMessage: '!!!Zoom In',
73 },
74 zoomOut: {
75 id: 'menu.view.zoomOut',
76 defaultMessage: '!!!Zoom Out',
77 },
78 enterFullScreen: {
79 id: 'menu.view.enterFullScreen',
80 defaultMessage: '!!!Enter Full Screen',
81 },
82 exitFullScreen: {
83 id: 'menu.view.exitFullScreen',
84 defaultMessage: '!!!Exit Full Screen',
85 },
86 toggleFullScreen: {
87 id: 'menu.view.toggleFullScreen',
88 defaultMessage: '!!!Toggle Full Screen',
89 },
90 toggleDevTools: {
91 id: 'menu.view.toggleDevTools',
92 defaultMessage: '!!!Toggle Developer Tools',
93 },
94 toggleServiceDevTools: {
95 id: 'menu.view.toggleServiceDevTools',
96 defaultMessage: '!!!Toggle Service Developer Tools',
97 },
98 reloadService: {
99 id: 'menu.view.reloadService',
100 defaultMessage: '!!!Reload Service',
101 },
102 reloadFranz: {
103 id: 'menu.view.reloadFranz',
104 defaultMessage: '!!!Reload Franz',
105 },
106 minimize: {
107 id: 'menu.window.minimize',
108 defaultMessage: '!!!Minimize',
109 },
110 close: {
111 id: 'menu.window.close',
112 defaultMessage: '!!!Close',
113 },
114 learnMore: {
115 id: 'menu.help.learnMore',
116 defaultMessage: '!!!Learn More',
117 },
118 changelog: {
119 id: 'menu.help.changelog',
120 defaultMessage: '!!!Changelog',
121 },
122 support: {
123 id: 'menu.help.support',
124 defaultMessage: '!!!Support',
125 },
126 tos: {
127 id: 'menu.help.tos',
128 defaultMessage: '!!!Terms of Service',
129 },
130 privacy: {
131 id: 'menu.help.privacy',
132 defaultMessage: '!!!Privacy Statement',
133 },
134 file: {
135 id: 'menu.file',
136 defaultMessage: '!!!File',
137 },
138 view: {
139 id: 'menu.view',
140 defaultMessage: '!!!View',
141 },
142 services: {
143 id: 'menu.services',
144 defaultMessage: '!!!Services',
145 },
146 window: {
147 id: 'menu.window',
148 defaultMessage: '!!!Window',
149 },
150 help: {
151 id: 'menu.help',
152 defaultMessage: '!!!Help',
153 },
154 about: {
155 id: 'menu.app.about',
156 defaultMessage: '!!!About Franz',
157 },
158 settings: {
159 id: 'menu.app.settings',
160 defaultMessage: '!!!Settings',
161 },
162 hide: {
163 id: 'menu.app.hide',
164 defaultMessage: '!!!Hide',
165 },
166 hideOthers: {
167 id: 'menu.app.hideOthers',
168 defaultMessage: '!!!Hide Others',
169 },
170 unhide: {
171 id: 'menu.app.unhide',
172 defaultMessage: '!!!Unhide',
173 },
174 quit: {
175 id: 'menu.app.quit',
176 defaultMessage: '!!!Quit',
177 },
178 addNewService: {
179 id: 'menu.services.addNewService',
180 defaultMessage: '!!!Add New Service...',
181 },
182});
183
184function getActiveWebview() {
185 return window.franz.stores.services.active.webview;
186}
187
188const _templateFactory = intl => [
9 { 189 {
10 label: 'Edit', 190 label: intl.formatMessage(menuItems.edit),
11 submenu: [ 191 submenu: [
12 { 192 {
193 label: intl.formatMessage(menuItems.undo),
13 role: 'undo', 194 role: 'undo',
14 }, 195 },
15 { 196 {
197 label: intl.formatMessage(menuItems.redo),
16 role: 'redo', 198 role: 'redo',
17 }, 199 },
18 { 200 {
19 type: 'separator', 201 type: 'separator',
20 }, 202 },
21 { 203 {
22 role: 'cut', 204 label: intl.formatMessage(menuItems.cut),
205 accelerator: 'Cmd+X',
206 selector: 'cut:',
23 }, 207 },
24 { 208 {
25 label: 'Copy', 209 label: intl.formatMessage(menuItems.copy),
26 accelerator: 'CmdOrCtrl+C', 210 accelerator: 'Cmd+C',
27 selector: 'copy:', 211 selector: 'copy:',
28 }, 212 },
29 { 213 {
30 label: 'Paste', 214 label: intl.formatMessage(menuItems.paste),
31 accelerator: 'CmdOrCtrl+V', 215 accelerator: 'Cmd+V',
32 selector: 'paste:', 216 selector: 'paste:',
33 }, 217 },
34 { 218 {
35 role: 'pasteandmatchstyle', 219 label: intl.formatMessage(menuItems.pasteAndMatchStyle),
220 accelerator: 'Cmd+Shift+V',
221 selector: 'pasteAndMatchStyle:',
36 }, 222 },
37 { 223 {
224 label: intl.formatMessage(menuItems.delete),
38 role: 'delete', 225 role: 'delete',
39 }, 226 },
40 { 227 {
41 role: 'selectall', 228 label: intl.formatMessage(menuItems.selectAll),
229 accelerator: 'Cmd+A',
230 selector: 'selectAll:',
42 }, 231 },
43 ], 232 ],
44 }, 233 },
45 { 234 {
46 label: 'View', 235 label: intl.formatMessage(menuItems.view),
47 submenu: [ 236 submenu: [
48 { 237 {
49 type: 'separator', 238 type: 'separator',
50 }, 239 },
51 { 240 {
241 label: intl.formatMessage(menuItems.resetZoom),
52 role: 'resetzoom', 242 role: 'resetzoom',
53 }, 243 },
54 { 244 {
245 label: intl.formatMessage(menuItems.zoomIn),
246 // accelerator: 'Cmd+=',
55 role: 'zoomin', 247 role: 'zoomin',
56 accelerator: 'CommandOrControl+=',
57 }, 248 },
58 { 249 {
250 label: intl.formatMessage(menuItems.zoomOut),
59 role: 'zoomout', 251 role: 'zoomout',
60 }, 252 },
61 { 253 {
62 type: 'separator', 254 type: 'separator',
63 }, 255 },
64 { 256 {
257 label: app.mainWindow.isFullScreen() // label doesn't work, gets overridden by Electron
258 ? intl.formatMessage(menuItems.exitFullScreen)
259 : intl.formatMessage(menuItems.enterFullScreen),
65 role: 'togglefullscreen', 260 role: 'togglefullscreen',
66 }, 261 },
67 ], 262 ],
68 }, 263 },
69 { 264 {
70 label: 'Services', 265 label: intl.formatMessage(menuItems.services),
71 submenu: [], 266 submenu: [],
72 }, 267 },
73 { 268 {
269 label: intl.formatMessage(menuItems.window),
74 role: 'window', 270 role: 'window',
75 submenu: [ 271 submenu: [
76 { 272 {
273 label: intl.formatMessage(menuItems.minimize),
77 role: 'minimize', 274 role: 'minimize',
78 }, 275 },
79 { 276 {
277 label: intl.formatMessage(menuItems.close),
80 role: 'close', 278 role: 'close',
81 }, 279 },
82 ], 280 ],
83 }, 281 },
84 { 282 {
283 label: intl.formatMessage(menuItems.help),
85 role: 'help', 284 role: 'help',
86 submenu: [ 285 submenu: [
87 { 286 {
88 label: 'Learn More', 287 label: intl.formatMessage(menuItems.learnMore),
89 click() { shell.openExternal('http://meetfranz.com'); }, 288 click() { shell.openExternal('http://meetfranz.com'); },
90 }, 289 },
91 { 290 {
92 label: 'Changelog', 291 label: intl.formatMessage(menuItems.changelog),
93 click() { shell.openExternal('https://github.com/meetfranz/franz/blob/master/CHANGELOG.md'); }, 292 click() { shell.openExternal('https://github.com/meetfranz/franz/blob/master/CHANGELOG.md'); },
94 }, 293 },
95 { 294 {
96 type: 'separator', 295 type: 'separator',
97 }, 296 },
98 { 297 {
99 label: 'Support', 298 label: intl.formatMessage(menuItems.support),
100 click() { shell.openExternal('http://meetfranz.com/support'); }, 299 click() { shell.openExternal('http://meetfranz.com/support'); },
101 }, 300 },
102 { 301 {
103 type: 'separator', 302 type: 'separator',
104 }, 303 },
105 { 304 {
106 label: 'Terms of Service', 305 label: intl.formatMessage(menuItems.tos),
107 click() { shell.openExternal('https://meetfranz.com/terms'); }, 306 click() { shell.openExternal('https://meetfranz.com/terms'); },
108 }, 307 },
109 { 308 {
110 label: 'Privacy Statement', 309 label: intl.formatMessage(menuItems.privacy),
310 click() { shell.openExternal('https://meetfranz.com/privacy'); },
311 },
312 ],
313 },
314];
315
316const _titleBarTemplateFactory = intl => [
317 {
318 label: intl.formatMessage(menuItems.edit),
319 submenu: [
320 {
321 label: intl.formatMessage(menuItems.undo),
322 accelerator: `${ctrlKey}+Z`,
323 click() {
324 getActiveWebview().undo();
325 },
326 },
327 {
328 label: intl.formatMessage(menuItems.redo),
329 accelerator: `${ctrlKey}+Y`,
330 click() {
331 getActiveWebview().redo();
332 },
333 },
334 {
335 type: 'separator',
336 },
337 {
338 label: intl.formatMessage(menuItems.cut),
339 accelerator: `${ctrlKey}+X`,
340 click() {
341 getActiveWebview().cut();
342 },
343 },
344 {
345 label: intl.formatMessage(menuItems.copy),
346 accelerator: `${ctrlKey}+C`,
347 click() {
348 getActiveWebview().copy();
349 },
350 },
351 {
352 label: intl.formatMessage(menuItems.paste),
353 accelerator: `${ctrlKey}+V`,
354 click() {
355 getActiveWebview().paste();
356 },
357 },
358 {
359 label: intl.formatMessage(menuItems.pasteAndMatchStyle),
360 accelerator: `${ctrlKey}+Shift+V`,
361 click() {
362 getActiveWebview().pasteAndMatchStyle();
363 },
364 },
365 {
366 label: intl.formatMessage(menuItems.delete),
367 click() {
368 getActiveWebview().delete();
369 },
370 },
371 {
372 label: intl.formatMessage(menuItems.selectAll),
373 accelerator: `${ctrlKey}+A`,
374 click() {
375 getActiveWebview().selectAll();
376 },
377 },
378 ],
379 },
380 {
381 label: intl.formatMessage(menuItems.view),
382 submenu: [
383 {
384 type: 'separator',
385 },
386 {
387 label: intl.formatMessage(menuItems.resetZoom),
388 accelerator: `${ctrlKey}+0`,
389 click() {
390 getActiveWebview().setZoomLevel(0);
391 },
392 },
393 {
394 label: intl.formatMessage(menuItems.zoomIn),
395 accelerator: `${ctrlKey}+Plus`,
396 click() {
397 getActiveWebview().getZoomLevel((zoomLevel) => {
398 getActiveWebview().setZoomLevel(zoomLevel === 5 ? zoomLevel : zoomLevel + 1);
399 });
400 },
401 },
402 {
403 label: intl.formatMessage(menuItems.zoomOut),
404 accelerator: `${ctrlKey}+-`,
405 click() {
406 getActiveWebview().getZoomLevel((zoomLevel) => {
407 getActiveWebview().setZoomLevel(zoomLevel === -5 ? zoomLevel : zoomLevel - 1);
408 });
409 },
410 },
411 {
412 type: 'separator',
413 },
414 {
415 label: app.mainWindow.isFullScreen() // label doesn't work, gets overridden by Electron
416 ? intl.formatMessage(menuItems.exitFullScreen)
417 : intl.formatMessage(menuItems.enterFullScreen),
418 accelerator: `${ctrlKey}+F`,
419 click(menuItem, browserWindow) {
420 browserWindow.setFullScreen(!browserWindow.isFullScreen());
421 },
422 },
423 ],
424 },
425 {
426 label: intl.formatMessage(menuItems.services),
427 submenu: [],
428 },
429 {
430 label: intl.formatMessage(menuItems.window),
431 submenu: [
432 {
433 label: intl.formatMessage(menuItems.minimize),
434 accelerator: 'Alt+M',
435 click(menuItem, browserWindow) {
436 browserWindow.minimize();
437 },
438 },
439 {
440 label: intl.formatMessage(menuItems.close),
441 accelerator: 'Alt+W',
442 click(menuItem, browserWindow) {
443 browserWindow.close();
444 },
445 },
446 ],
447 },
448 {
449 label: '?',
450 submenu: [
451 {
452 label: intl.formatMessage(menuItems.learnMore),
453 click() { shell.openExternal('http://meetfranz.com'); },
454 },
455 {
456 label: intl.formatMessage(menuItems.changelog),
457 click() { shell.openExternal('https://github.com/meetfranz/franz/blob/master/CHANGELOG.md'); },
458 },
459 {
460 type: 'separator',
461 },
462 {
463 label: intl.formatMessage(menuItems.support),
464 click() { shell.openExternal('http://meetfranz.com/support'); },
465 },
466 {
467 type: 'separator',
468 },
469 {
470 label: intl.formatMessage(menuItems.tos),
471 click() { shell.openExternal('https://meetfranz.com/terms'); },
472 },
473 {
474 label: intl.formatMessage(menuItems.privacy),
111 click() { shell.openExternal('https://meetfranz.com/privacy'); }, 475 click() { shell.openExternal('https://meetfranz.com/privacy'); },
112 }, 476 },
113 ], 477 ],
@@ -115,7 +479,7 @@ const template = [
115]; 479];
116 480
117export default class FranzMenu { 481export default class FranzMenu {
118 @observable tpl = template; 482 @observable currentTemplate = [];
119 483
120 constructor(stores, actions) { 484 constructor(stores, actions) {
121 this.stores = stores; 485 this.stores = stores;
@@ -124,23 +488,45 @@ export default class FranzMenu {
124 autorun(this._build.bind(this)); 488 autorun(this._build.bind(this));
125 } 489 }
126 490
491 rebuild() {
492 this._build();
493 }
494
495 get template() {
496 return this.currentTemplate.toJS();
497 }
498
127 _build() { 499 _build() {
128 const tpl = toJS(this.tpl); 500 // console.log(window.franz);
501 const serviceTpl = Object.assign([], this.serviceTpl); // need to clone object so we don't modify computed (cached) object
502
503 if (window.franz === undefined) {
504 return;
505 }
506
507 const intl = window.franz.intl;
508 const tpl = isMac ? _templateFactory(intl) : _titleBarTemplateFactory(intl);
129 509
130 tpl[1].submenu.push({ 510 tpl[1].submenu.push({
131 role: 'toggledevtools', 511 type: 'separator',
512 }, {
513 label: intl.formatMessage(menuItems.toggleDevTools),
514 accelerator: `${cmdKey}+Alt+I`,
515 click: (menuItem, browserWindow) => {
516 browserWindow.webContents.toggleDevTools();
517 },
132 }, { 518 }, {
133 label: 'Toggle Service Developer Tools', 519 label: intl.formatMessage(menuItems.toggleServiceDevTools),
134 accelerator: 'CmdOrCtrl+Shift+Alt+i', 520 accelerator: `${cmdKey}+Shift+Alt+I`,
135 click: () => { 521 click: () => {
136 this.actions.service.openDevToolsForActiveService(); 522 this.actions.service.openDevToolsForActiveService();
137 }, 523 },
138 }); 524 });
139 525
140 tpl[1].submenu.unshift({ 526 tpl[1].submenu.unshift({
141 label: 'Reload Service', 527 label: intl.formatMessage(menuItems.reloadService),
142 id: 'reloadService', 528 id: 'reloadService', // TODO: needed?
143 accelerator: 'CmdOrCtrl+R', 529 accelerator: `${cmdKey}+R`,
144 click: () => { 530 click: () => {
145 if (this.stores.user.isLoggedIn 531 if (this.stores.user.isLoggedIn
146 && this.stores.services.enabled.length > 0) { 532 && this.stores.services.enabled.length > 0) {
@@ -150,93 +536,128 @@ export default class FranzMenu {
150 } 536 }
151 }, 537 },
152 }, { 538 }, {
153 label: 'Reload Franz', 539 label: intl.formatMessage(menuItems.reloadFranz),
154 accelerator: 'CmdOrCtrl+Shift+R', 540 accelerator: `${cmdKey}+Shift+R`,
155 click: () => { 541 click: () => {
156 window.location.reload(); 542 window.location.reload();
157 }, 543 },
158 }); 544 });
159 545
160 if (isMac) { 546 tpl.unshift({
161 tpl.unshift({ 547 label: isMac ? app.getName() : intl.formatMessage(menuItems.file),
162 label: app.getName(), 548 submenu: [
163 submenu: [ 549 {
164 { 550 label: intl.formatMessage(menuItems.about),
165 role: 'about', 551 role: 'about',
166 }, 552 },
167 { 553 {
168 type: 'separator', 554 type: 'separator',
169 }, 555 },
170 { 556 {
171 label: 'Settings', 557 label: intl.formatMessage(menuItems.settings),
172 accelerator: 'CmdOrCtrl+,', 558 accelerator: 'CmdOrCtrl+,',
173 click: () => { 559 click: () => {
174 this.actions.ui.openSettings({ path: 'app' }); 560 this.actions.ui.openSettings({ path: 'app' });
175 },
176 },
177 {
178 type: 'separator',
179 },
180 {
181 role: 'services',
182 submenu: [],
183 },
184 {
185 type: 'separator',
186 },
187 {
188 role: 'hide',
189 },
190 {
191 role: 'hideothers',
192 },
193 {
194 role: 'unhide',
195 },
196 {
197 type: 'separator',
198 },
199 {
200 role: 'quit',
201 }, 561 },
202 ], 562 },
203 }); 563 {
564 type: 'separator',
565 },
566 {
567 label: intl.formatMessage(menuItems.services),
568 role: 'services',
569 submenu: [],
570 },
571 {
572 type: 'separator',
573 },
574 {
575 label: intl.formatMessage(menuItems.hide),
576 role: 'hide',
577 },
578 {
579 label: intl.formatMessage(menuItems.hideOthers),
580 role: 'hideothers',
581 },
582 {
583 label: intl.formatMessage(menuItems.unhide),
584 role: 'unhide',
585 },
586 {
587 type: 'separator',
588 },
589 {
590 label: intl.formatMessage(menuItems.quit),
591 role: 'quit',
592 },
593 ],
594 });
595
596 const about = {
597 label: intl.formatMessage(menuItems.about),
598 click: () => {
599 dialog.showMessageBox({
600 type: 'info',
601 title: 'Franz',
602 message: 'Franz',
603 detail: `Version: ${remote.app.getVersion()}\nRelease: ${process.versions.electron} / ${process.platform} / ${process.arch}`,
604 });
605 },
606 };
607
608 if (isMac) {
204 // Edit menu. 609 // Edit menu.
205 tpl[1].submenu.push( 610 tpl[1].submenu.push(
206 { 611 {
207 type: 'separator', 612 type: 'separator',
208 }, 613 },
209 { 614 {
210 label: 'Speech', 615 label: intl.formatMessage(menuItems.speech),
211 submenu: [ 616 submenu: [
212 { 617 {
618 label: intl.formatMessage(menuItems.startSpeaking),
213 role: 'startspeaking', 619 role: 'startspeaking',
214 }, 620 },
215 { 621 {
622 label: intl.formatMessage(menuItems.stopSpeaking),
216 role: 'stopspeaking', 623 role: 'stopspeaking',
217 }, 624 },
218 ], 625 ],
219 }, 626 },
220 ); 627 );
628
629 tpl[4].submenu.unshift(about, {
630 type: 'separator',
631 });
221 } else { 632 } else {
222 tpl[4].submenu.unshift({ 633 tpl[0].submenu = [
223 role: 'about', 634 {
224 click: () => { 635 label: intl.formatMessage(menuItems.settings),
225 dialog.showMessageBox({ 636 accelerator: 'Ctrl+P',
226 type: 'info', 637 click: () => {
227 title: 'Franz', 638 this.actions.ui.openSettings({ path: 'app' });
228 message: 'Franz', 639 },
229 detail: `Version: ${remote.app.getVersion()}\nRelease: ${process.versions.electron} / ${process.platform} / ${process.arch}`,
230 });
231 }, 640 },
232 }); 641 {
233 } 642 type: 'separator',
643 },
644 {
645 label: intl.formatMessage(menuItems.quit),
646 accelerator: 'Alt+F4',
647 click: () => {
648 app.quit();
649 },
650 },
651 ];
234 652
235 const serviceTpl = this.serviceTpl; 653 tpl[5].submenu.push({
654 type: 'separator',
655 }, about);
656 }
236 657
237 serviceTpl.unshift({ 658 serviceTpl.unshift({
238 label: 'Add new Service', 659 label: intl.formatMessage(menuItems.addNewService),
239 accelerator: 'CmdOrCtrl+N', 660 accelerator: `${cmdKey}+N`,
240 click: () => { 661 click: () => {
241 this.actions.ui.openSettings({ path: 'recipes' }); 662 this.actions.ui.openSettings({ path: 'recipes' });
242 }, 663 },
@@ -245,9 +666,10 @@ export default class FranzMenu {
245 }); 666 });
246 667
247 if (serviceTpl.length > 0) { 668 if (serviceTpl.length > 0) {
248 tpl[isMac ? 3 : 2].submenu = toJS(this.serviceTpl); 669 tpl[3].submenu = serviceTpl;
249 } 670 }
250 671
672 this.currentTemplate = tpl;
251 const menu = Menu.buildFromTemplate(tpl); 673 const menu = Menu.buildFromTemplate(tpl);
252 Menu.setApplicationMenu(menu); 674 Menu.setApplicationMenu(menu);
253 } 675 }
@@ -258,7 +680,7 @@ export default class FranzMenu {
258 if (this.stores.user.isLoggedIn) { 680 if (this.stores.user.isLoggedIn) {
259 return services.map((service, i) => ({ 681 return services.map((service, i) => ({
260 label: this._getServiceName(service), 682 label: this._getServiceName(service),
261 accelerator: i <= 9 ? `CmdOrCtrl+${i + 1}` : null, 683 accelerator: i <= 9 ? `${cmdKey}+${i + 1}` : null,
262 type: 'radio', 684 type: 'radio',
263 checked: service.isActive, 685 checked: service.isActive,
264 click: () => { 686 click: () => {
diff --git a/src/lib/analytics.js b/src/lib/analytics.js
index b13bf8faa..585cbcdba 100644
--- a/src/lib/analytics.js
+++ b/src/lib/analytics.js
@@ -2,6 +2,8 @@ import { remote } from 'electron';
2import { GA_ID } from '../config'; 2import { GA_ID } from '../config';
3// import { isDevMode } from '../environment'; 3// import { isDevMode } from '../environment';
4 4
5const debug = require('debug')('Analytics');
6
5const { app } = remote; 7const { app } = remote;
6 8
7/* eslint-disable */ 9/* eslint-disable */
@@ -28,13 +30,13 @@ ga('send', 'App');
28export function gaPage(page) { 30export function gaPage(page) {
29 ga('send', 'pageview', page); 31 ga('send', 'pageview', page);
30 32
31 console.debug('GA track page', page); 33 debug('GA track page', page);
32} 34}
33 35
34export function gaEvent(category, action, label) { 36export function gaEvent(category, action, label) {
35 ga('send', 'event', category, action, label); 37 ga('send', 'event', category, action, label);
36 38
37 console.debug('GA track page', category, action); 39 debug('GA track page', category, action);
38} 40}
39 41
40setTimeout(() => { 42setTimeout(() => {
diff --git a/src/models/Recipe.js b/src/models/Recipe.js
index 1fc23ac89..032a9aa19 100644
--- a/src/models/Recipe.js
+++ b/src/models/Recipe.js
@@ -32,8 +32,12 @@ export default class Recipe {
32 throw Error(`Recipe '${data.name}' requires Id`); 32 throw Error(`Recipe '${data.name}' requires Id`);
33 } 33 }
34 34
35 if (!semver.valid(data.version)) { 35 try {
36 throw Error(`Version ${data.version} of recipe '${data.name}' is not a valid semver version`); 36 if (!semver.valid(data.version)) {
37 throw Error(`Version ${data.version} of recipe '${data.name}' is not a valid semver version`);
38 }
39 } catch (e) {
40 console.warn(e.message);
37 } 41 }
38 42
39 this.id = data.id || this.id; 43 this.id = data.id || this.id;
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 162422017..4ac8325d4 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -98,6 +98,10 @@ export default class AppStore extends Store {
98 ipcRenderer.on('autoUpdate', (event, data) => { 98 ipcRenderer.on('autoUpdate', (event, data) => {
99 if (data.available) { 99 if (data.available) {
100 this.updateStatus = this.updateStatusTypes.AVAILABLE; 100 this.updateStatus = this.updateStatusTypes.AVAILABLE;
101
102 if (isMac) {
103 app.dock.bounce();
104 }
101 } 105 }
102 106
103 if (data.available !== undefined && !data.available) { 107 if (data.available !== undefined && !data.available) {
@@ -124,19 +128,6 @@ export default class AppStore extends Store {
124 this.stores.router.push(data.url); 128 this.stores.router.push(data.url);
125 }); 129 });
126 130
127 // Reload all services after a healthy nap
128 // Alternative solution for powerMonitor as the resume event is not fired
129 // More information: https://github.com/electron/electron/issues/1615
130 const TIMEOUT = 5000;
131 let lastTime = (new Date()).getTime();
132 setInterval(() => {
133 const currentTime = (new Date()).getTime();
134 if (currentTime > (lastTime + TIMEOUT + 2000)) {
135 this._reactivateServices();
136 }
137 lastTime = currentTime;
138 }, TIMEOUT);
139
140 // Set active the next service 131 // Set active the next service
141 key( 132 key(
142 '⌘+pagedown, ctrl+pagedown, ⌘+alt+right, ctrl+tab', () => { 133 '⌘+pagedown, ctrl+pagedown, ⌘+alt+right, ctrl+tab', () => {
@@ -244,7 +235,7 @@ export default class AppStore extends Store {
244 } 235 }
245 236
246 @action _muteApp({ isMuted, overrideSystemMute = true }) { 237 @action _muteApp({ isMuted, overrideSystemMute = true }) {
247 this.isSystemMuteOverriden = overrideSystemMute; 238 this.isSystemMuteOverridden = overrideSystemMute;
248 239
249 this.actions.settings.update({ 240 this.actions.settings.update({
250 settings: { 241 settings: {
@@ -356,19 +347,9 @@ export default class AppStore extends Store {
356 return autoLauncher.isEnabled() || false; 347 return autoLauncher.isEnabled() || false;
357 } 348 }
358 349
359 _reactivateServices(retryCount = 0) {
360 if (!this.isOnline) {
361 console.debug('reactivateServices: computer is offline, trying again in 5s, retries:', retryCount);
362 setTimeout(() => this._reactivateServices(retryCount + 1), 5000);
363 } else {
364 console.debug('reactivateServices: reload Franz');
365 window.location.reload();
366 }
367 }
368
369 _systemDND() { 350 _systemDND() {
370 const dnd = getDoNotDisturb(); 351 const dnd = getDoNotDisturb();
371 if (dnd === this.stores.settings.all.isAppMuted || !this.isSystemMuteOverriden) { 352 if (dnd !== this.stores.settings.all.isAppMuted && !this.isSystemMuteOverridden) {
372 this.actions.app.muteApp({ 353 this.actions.app.muteApp({
373 isMuted: dnd, 354 isMuted: dnd,
374 overrideSystemMute: false, 355 overrideSystemMute: false,
diff --git a/src/stores/RecipesStore.js b/src/stores/RecipesStore.js
index 67fee1d50..a24308f6a 100644
--- a/src/stores/RecipesStore.js
+++ b/src/stores/RecipesStore.js
@@ -5,6 +5,8 @@ import CachedRequest from './lib/CachedRequest';
5import Request from './lib/Request'; 5import Request from './lib/Request';
6import { matchRoute } from '../helpers/routing-helpers'; 6import { matchRoute } from '../helpers/routing-helpers';
7 7
8const debug = require('debug')('RecipeStore');
9
8export default class RecipesStore extends Store { 10export default class RecipesStore extends Store {
9 @observable allRecipesRequest = new CachedRequest(this.api.recipes, 'all'); 11 @observable allRecipesRequest = new CachedRequest(this.api.recipes, 'all');
10 @observable installRecipeRequest = new Request(this.api.recipes, 'install'); 12 @observable installRecipeRequest = new Request(this.api.recipes, 'install');
@@ -34,7 +36,7 @@ export default class RecipesStore extends Store {
34 return activeRecipe; 36 return activeRecipe;
35 } 37 }
36 38
37 console.warn('Recipe not installed'); 39 debug(`Recipe ${match.id} not installed`);
38 } 40 }
39 41
40 return null; 42 return null;
@@ -54,10 +56,8 @@ export default class RecipesStore extends Store {
54 56
55 // Actions 57 // Actions
56 @action async _install({ recipeId }) { 58 @action async _install({ recipeId }) {
57 // console.log(this.installRecipeRequest._promise);
58 const recipe = await this.installRecipeRequest.execute(recipeId)._promise; 59 const recipe = await this.installRecipeRequest.execute(recipeId)._promise;
59 await this.allRecipesRequest.invalidate({ immediately: true })._promise; 60 await this.allRecipesRequest.invalidate({ immediately: true })._promise;
60 // console.log(this.installRecipeRequest._promise);
61 61
62 return recipe; 62 return recipe;
63 } 63 }
@@ -67,7 +67,7 @@ export default class RecipesStore extends Store {
67 const recipes = {}; 67 const recipes = {};
68 68
69 // Hackfix, reference this.all to fetch services 69 // Hackfix, reference this.all to fetch services
70 console.debug(`Check Recipe updates for ${this.all.map(recipe => recipe.id)}`); 70 debug(`Check Recipe updates for ${this.all.map(recipe => recipe.id)}`);
71 71
72 recipeIds.forEach((r) => { 72 recipeIds.forEach((r) => {
73 const recipe = this.one(r); 73 const recipe = this.one(r);
diff --git a/src/stores/RequestStore.js b/src/stores/RequestStore.js
index 4140ca362..595852583 100644
--- a/src/stores/RequestStore.js
+++ b/src/stores/RequestStore.js
@@ -2,6 +2,8 @@ import { action, computed, observable } from 'mobx';
2 2
3import Store from './lib/Store'; 3import Store from './lib/Store';
4 4
5const debug = require('debug')('RequestsStore');
6
5export default class RequestStore extends Store { 7export default class RequestStore extends Store {
6 @observable userInfoRequest; 8 @observable userInfoRequest;
7 @observable servicesRequest; 9 @observable servicesRequest;
@@ -52,7 +54,7 @@ export default class RequestStore extends Store {
52 } 54 }
53 55
54 this._autoRetry(); 56 this._autoRetry();
55 console.debug(`Retry required requests delayed in ${(delay) / 1000}s`); 57 debug(`Retry required requests delayed in ${(delay) / 1000}s`);
56 }, delay); 58 }, delay);
57 } 59 }
58 } 60 }
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index c38d0d9ee..f7d92b1ff 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -10,6 +10,8 @@ import CachedRequest from './lib/CachedRequest';
10import { matchRoute } from '../helpers/routing-helpers'; 10import { matchRoute } from '../helpers/routing-helpers';
11import { gaEvent } from '../lib/analytics'; 11import { gaEvent } from '../lib/analytics';
12 12
13const debug = require('debug')('ServiceStore');
14
13export default class ServicesStore extends Store { 15export default class ServicesStore extends Store {
14 @observable allServicesRequest = new CachedRequest(this.api.services, 'all'); 16 @observable allServicesRequest = new CachedRequest(this.api.services, 'all');
15 @observable createServiceRequest = new Request(this.api.services, 'create'); 17 @observable createServiceRequest = new Request(this.api.services, 'create');
@@ -87,6 +89,12 @@ export default class ServicesStore extends Store {
87 return this.stores.settings.all.showDisabledServices ? this.all : this.enabled; 89 return this.stores.settings.all.showDisabledServices ? this.all : this.enabled;
88 } 90 }
89 91
92 // This is just used to avoid unnecessary rerendering of resource-heavy webviews
93 @computed get allDisplayedUnordered() {
94 const services = this.allServicesRequest.execute().result || [];
95 return this.stores.settings.all.showDisabledServices ? services : services.filter(service => service.isEnabled);
96 }
97
90 @computed get filtered() { 98 @computed get filtered() {
91 return this.all.filter(service => service.name.toLowerCase().includes(this.filterNeedle.toLowerCase())); 99 return this.all.filter(service => service.name.toLowerCase().includes(this.filterNeedle.toLowerCase()));
92 } 100 }
@@ -103,7 +111,7 @@ export default class ServicesStore extends Store {
103 return activeService; 111 return activeService;
104 } 112 }
105 113
106 console.warn('Service not available'); 114 debug('Service not available');
107 } 115 }
108 116
109 return null; 117 return null;
@@ -117,10 +125,10 @@ export default class ServicesStore extends Store {
117 const recipesStore = this.stores.recipes; 125 const recipesStore = this.stores.recipes;
118 126
119 if (recipesStore.isInstalled(recipeId)) { 127 if (recipesStore.isInstalled(recipeId)) {
120 console.debug('Recipe is installed'); 128 debug(`Recipe ${recipeId} is installed`);
121 this._redirectToAddServiceRoute(recipeId); 129 this._redirectToAddServiceRoute(recipeId);
122 } else { 130 } else {
123 console.warn('Recipe is not installed'); 131 debug(`Recipe ${recipeId} is not installed`);
124 // We access the RecipeStore action directly 132 // We access the RecipeStore action directly
125 // returns Promise instead of action 133 // returns Promise instead of action
126 await this.stores.recipes._install({ recipeId }); 134 await this.stores.recipes._install({ recipeId });
@@ -487,7 +495,7 @@ export default class ServicesStore extends Store {
487 if (service) { 495 if (service) {
488 service.webview.openDevTools(); 496 service.webview.openDevTools();
489 } else { 497 } else {
490 console.warn('No service is active'); 498 debug('No service is active');
491 } 499 }
492 } 500 }
493 501
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index afdd7dec7..964a9fcea 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -6,7 +6,11 @@ html {
6 6
7.app { 7.app {
8 display: flex; 8 display: flex;
9 flex-direction: row; 9 flex-direction: column;
10
11 .app__content {
12 display: flex;
13 }
10 14
11 .app__service { 15 .app__service {
12 display: flex; 16 display: flex;
@@ -15,6 +19,10 @@ html {
15 } 19 }
16} 20}
17 21
22.electron-app-title-bar {
23 z-index: 99999999;
24}
25
18.window-draggable { 26.window-draggable {
19 position: absolute; 27 position: absolute;
20 width: 100%; 28 width: 100%;
diff --git a/src/styles/main.scss b/src/styles/main.scss
index 446bdca14..784a04d3d 100644
--- a/src/styles/main.scss
+++ b/src/styles/main.scss
@@ -4,6 +4,7 @@ $mdi-font-path: '../node_modules/mdi/fonts';
4} 4}
5 5
6@import './node_modules/mdi/scss/materialdesignicons.scss'; 6@import './node_modules/mdi/scss/materialdesignicons.scss';
7@import './node_modules/electron-react-titlebar/assets/style';
7 8
8// modules 9// modules
9@import './reset.scss'; 10@import './reset.scss';
@@ -28,6 +29,7 @@ $mdi-font-path: '../node_modules/mdi/fonts';
28@import './subscription-popup.scss'; 29@import './subscription-popup.scss';
29@import './content-tabs.scss'; 30@import './content-tabs.scss';
30@import './invite.scss'; 31@import './invite.scss';
32@import './title-bar.scss';
31 33
32// form 34// form
33@import './input.scss'; 35@import './input.scss';
diff --git a/src/styles/title-bar.scss b/src/styles/title-bar.scss
new file mode 100644
index 000000000..492245e2f
--- /dev/null
+++ b/src/styles/title-bar.scss
@@ -0,0 +1,50 @@
1#electron-app-title-bar {
2 background: $theme-gray-lightest;
3 border-bottom: 0;
4 box-shadow: 0px 0 8px rgba(#000, 0.1);
5
6 span {
7 line-height: normal;
8 }
9
10 div {
11 height: auto;
12 }
13
14 .toolbar-dropdown {
15 &.open {
16 box-shadow: 0px 0 8px rgba(#000, 0.1);
17 }
18
19 &:not(.open) {
20 .menu-item .menu-label {
21 opacity: 1;
22 }
23
24 &>.toolbar-button > button:hover {
25 background: $theme-brand-primary;
26 }
27 }
28 }
29
30 .list-item {
31 .menu-item {
32 margin: 4px;
33 border-radius: $theme-border-radius-small;
34 }
35 &.selected {
36 // background: $theme-brand-primary;
37 background: none;
38
39 .menu-item {
40 background: $theme-brand-primary;
41 }
42 }
43 }
44
45 .menu-pane {
46 box-shadow: 0px 0 10px rgba(#000, 0.5);
47 border-bottom-left-radius: $theme-border-radius-small;
48 border-bottom-right-radius: $theme-border-radius-small;
49 }
50}
diff --git a/src/webview/plugin.js b/src/webview/plugin.js
index d9e021e6d..52b19b3fd 100644
--- a/src/webview/plugin.js
+++ b/src/webview/plugin.js
@@ -30,7 +30,6 @@ new ContextMenuListener((info) => { // eslint-disable-line
30}); 30});
31 31
32ipcRenderer.on('settings-update', (e, data) => { 32ipcRenderer.on('settings-update', (e, data) => {
33 console.log('settings-update', data);
34 spellchecker.toggleSpellchecker(data.enableSpellchecking); 33 spellchecker.toggleSpellchecker(data.enableSpellchecking);
35}); 34});
36 35
diff --git a/yarn.lock b/yarn.lock
index c788006b7..49ddfc31a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -45,9 +45,9 @@
45 dependencies: 45 dependencies:
46 nan "^2.0.0" 46 nan "^2.0.0"
47 47
48"@types/node@^7.0.18": 48"@types/node@^8.0.24":
49 version "7.0.43" 49 version "8.9.5"
50 resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" 50 resolved "http://registry.npmjs.org/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976"
51 51
52abbrev@1: 52abbrev@1:
53 version "1.1.0" 53 version "1.1.0"
@@ -1367,7 +1367,7 @@ circular-json@^0.3.1:
1367 version "0.3.3" 1367 version "0.3.3"
1368 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 1368 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
1369 1369
1370classnames@^2.2.0, classnames@^2.2.5: 1370classnames@^2.2.0, classnames@^2.2.3, classnames@^2.2.5:
1371 version "2.2.5" 1371 version "2.2.5"
1372 resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" 1372 resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
1373 1373
@@ -1643,6 +1643,12 @@ dateformat@^2.0.0:
1643 version "2.0.0" 1643 version "2.0.0"
1644 resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" 1644 resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
1645 1645
1646debug-electron@^0.0.4:
1647 version "0.0.4"
1648 resolved "https://registry.yarnpkg.com/debug-electron/-/debug-electron-0.0.4.tgz#9b035349ac8107b4e43da200d2339c4fd5b169e7"
1649 dependencies:
1650 debug "^2.4.1"
1651
1646debug@1.0.4: 1652debug@1.0.4:
1647 version "1.0.4" 1653 version "1.0.4"
1648 resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.4.tgz#5b9c256bd54b6ec02283176fa8a0ede6d154cbf8" 1654 resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.4.tgz#5b9c256bd54b6ec02283176fa8a0ede6d154cbf8"
@@ -1667,6 +1673,12 @@ debug@^2.1.3, debug@^2.2.0, debug@^2.5.1, debug@^2.6.1, debug@^2.6.3, debug@^2.6
1667 dependencies: 1673 dependencies:
1668 ms "2.0.0" 1674 ms "2.0.0"
1669 1675
1676debug@^2.4.1:
1677 version "2.6.9"
1678 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
1679 dependencies:
1680 ms "2.0.0"
1681
1670debug@^3.0.1: 1682debug@^3.0.1:
1671 version "3.0.1" 1683 version "3.0.1"
1672 resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64" 1684 resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64"
@@ -1766,6 +1778,10 @@ doctrine@^2.0.0:
1766 esutils "^2.0.2" 1778 esutils "^2.0.2"
1767 isarray "^1.0.0" 1779 isarray "^1.0.0"
1768 1780
1781"dom-helpers@^2.4.0 || ^3.0.0":
1782 version "3.3.1"
1783 resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
1784
1769dom-helpers@^3.2.0: 1785dom-helpers@^3.2.0:
1770 version "3.2.1" 1786 version "3.2.1"
1771 resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" 1787 resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
@@ -1995,6 +2011,13 @@ electron-publish@19.15.0:
1995 fs-extra-p "^4.3.0" 2011 fs-extra-p "^4.3.0"
1996 mime "^1.3.6" 2012 mime "^1.3.6"
1997 2013
2014electron-react-titlebar@^0.7.1:
2015 version "0.7.1"
2016 resolved "https://registry.yarnpkg.com/electron-react-titlebar/-/electron-react-titlebar-0.7.1.tgz#d56517d01ef0e935caa994e9b577dfd63a56c66c"
2017 dependencies:
2018 lodash "^4.17.4"
2019 react-virtualized "^9.7.6"
2020
1998electron-rebuild@^1.6.0: 2021electron-rebuild@^1.6.0:
1999 version "1.6.0" 2022 version "1.6.0"
2000 resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-1.6.0.tgz#e8d26f4d8e9fe5388df35864b3658e5cfd4dcb7e" 2023 resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-1.6.0.tgz#e8d26f4d8e9fe5388df35864b3658e5cfd4dcb7e"
@@ -2066,11 +2089,11 @@ electron-window-state@^4.1.0:
2066 jsonfile "^2.2.3" 2089 jsonfile "^2.2.3"
2067 mkdirp "^0.5.1" 2090 mkdirp "^0.5.1"
2068 2091
2069electron@^1.7.12: 2092electron@1.8.4:
2070 version "1.7.12" 2093 version "1.8.4"
2071 resolved "https://registry.yarnpkg.com/electron/-/electron-1.7.12.tgz#dcc61a2c1b0c3df25f68b3425379a01abd01190e" 2094 resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.4.tgz#cca8d0e6889f238f55b414ad224f03e03b226a38"
2072 dependencies: 2095 dependencies:
2073 "@types/node" "^7.0.18" 2096 "@types/node" "^8.0.24"
2074 electron-download "^3.0.1" 2097 electron-download "^3.0.1"
2075 extract-zip "^1.0.3" 2098 extract-zip "^1.0.3"
2076 2099
@@ -2450,6 +2473,18 @@ fast-levenshtein@~2.0.4:
2450 version "2.0.6" 2473 version "2.0.6"
2451 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 2474 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
2452 2475
2476fbjs@^0.8.16:
2477 version "0.8.16"
2478 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
2479 dependencies:
2480 core-js "^1.0.0"
2481 isomorphic-fetch "^2.1.1"
2482 loose-envify "^1.0.0"
2483 object-assign "^4.1.0"
2484 promise "^7.1.1"
2485 setimmediate "^1.0.5"
2486 ua-parser-js "^0.7.9"
2487
2453fbjs@^0.8.9: 2488fbjs@^0.8.9:
2454 version "0.8.14" 2489 version "0.8.14"
2455 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.14.tgz#d1dbe2be254c35a91e09f31f9cd50a40b2a0ed1c" 2490 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.14.tgz#d1dbe2be254c35a91e09f31f9cd50a40b2a0ed1c"
@@ -4058,7 +4093,7 @@ longest@^1.0.1:
4058 version "1.0.1" 4093 version "1.0.1"
4059 resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 4094 resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
4060 4095
4061loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: 4096loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1:
4062 version "1.3.1" 4097 version "1.3.1"
4063 resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 4098 resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
4064 dependencies: 4099 dependencies:
@@ -4948,6 +4983,14 @@ prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8:
4948 fbjs "^0.8.9" 4983 fbjs "^0.8.9"
4949 loose-envify "^1.3.1" 4984 loose-envify "^1.3.1"
4950 4985
4986prop-types@^15.6.0:
4987 version "15.6.0"
4988 resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
4989 dependencies:
4990 fbjs "^0.8.16"
4991 loose-envify "^1.3.1"
4992 object-assign "^4.1.1"
4993
4951proxy-middleware@~0.15.0: 4994proxy-middleware@~0.15.0:
4952 version "0.15.0" 4995 version "0.15.0"
4953 resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.15.0.tgz#a3fdf1befb730f951965872ac2f6074c61477a56" 4996 resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.15.0.tgz#a3fdf1befb730f951965872ac2f6074c61477a56"
@@ -5126,6 +5169,16 @@ react-transition-group@^1.2.0:
5126 prop-types "^15.5.6" 5169 prop-types "^15.5.6"
5127 warning "^3.0.0" 5170 warning "^3.0.0"
5128 5171
5172react-virtualized@^9.7.6:
5173 version "9.18.5"
5174 resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.18.5.tgz#42dd390ebaa7ea809bfcaf775d39872641679b89"
5175 dependencies:
5176 babel-runtime "^6.26.0"
5177 classnames "^2.2.3"
5178 dom-helpers "^2.4.0 || ^3.0.0"
5179 loose-envify "^1.3.0"
5180 prop-types "^15.6.0"
5181
5129react@^15.4.1: 5182react@^15.4.1:
5130 version "15.6.1" 5183 version "15.6.1"
5131 resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df" 5184 resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df"