aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--electron-builder.yml1
-rw-r--r--package.json2
-rw-r--r--packages/theme/src/themes/dark/index.ts1
-rw-r--r--packages/theme/src/themes/default/index.ts1
-rw-r--r--src/components/services/content/ServiceView.js19
-rw-r--r--src/components/services/content/ServiceWebview.js14
-rw-r--r--src/components/services/content/Services.js12
-rw-r--r--src/components/ui/Modal/styles.js2
-rw-r--r--src/features/delayApp/index.js4
-rw-r--r--src/features/webControls/components/WebControls.js59
-rw-r--r--src/features/webControls/constants.js1
-rw-r--r--src/features/webControls/containers/WebControlsScreen.js13
-rw-r--r--src/features/workspaces/components/WorkspaceDrawer.js4
-rw-r--r--src/features/workspaces/components/WorkspaceDrawerItem.js4
-rw-r--r--src/i18n/locales/defaultMessages.json359
-rw-r--r--src/i18n/locales/en-US.json6
-rw-r--r--src/i18n/locales/zh-HANT.json2
-rw-r--r--src/i18n/messages/src/features/webControls/components/WebControls.json67
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json8
-rw-r--r--src/i18n/messages/src/lib/Menu.json281
-rw-r--r--src/index.js17
-rw-r--r--src/lib/Menu.js23
-rw-r--r--src/models/Service.js41
-rw-r--r--src/stores/ServicesStore.js3
-rw-r--r--src/webview/recipe.js12
25 files changed, 632 insertions, 324 deletions
diff --git a/electron-builder.yml b/electron-builder.yml
index b2c243e49..df7d2223a 100644
--- a/electron-builder.yml
+++ b/electron-builder.yml
@@ -11,6 +11,7 @@ mac:
11 gatekeeperAssess: false 11 gatekeeperAssess: false
12 category: public.app-category.productivity 12 category: public.app-category.productivity
13 icon: ./build-helpers/images/icon.icns 13 icon: ./build-helpers/images/icon.icns
14 darkModeSupport: true
14 15
15afterSign: ./build-helpers/notarize.js 16afterSign: ./build-helpers/notarize.js
16 17
diff --git a/package.json b/package.json
index eb5e0de6c..838be1299 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
2 "name": "ferdi", 2 "name": "ferdi",
3 "productName": "Ferdi", 3 "productName": "Ferdi",
4 "appId": "com.kytwb.ferdi", 4 "appId": "com.kytwb.ferdi",
5 "version": "5.3.4-beta.7", 5 "version": "5.4.0-beta.1",
6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.", 6 "description": "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more.",
7 "copyright": "kytwb", 7 "copyright": "kytwb",
8 "main": "index.js", 8 "main": "index.js",
diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts
index e94f54c55..67d0cfb71 100644
--- a/packages/theme/src/themes/dark/index.ts
+++ b/packages/theme/src/themes/dark/index.ts
@@ -66,6 +66,7 @@ export const selectSearchColor = inputBackground;
66 66
67// Modal 67// Modal
68export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.8).rgb().string(); 68export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.8).rgb().string();
69export const colorModalBackground = colorContentBackground;
69 70
70// Services 71// Services
71export const services = merge({}, defaultStyles.services, { 72export const services = merge({}, defaultStyles.services, {
diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts
index 79a6d676f..1862fef6f 100644
--- a/packages/theme/src/themes/default/index.ts
+++ b/packages/theme/src/themes/default/index.ts
@@ -145,6 +145,7 @@ export const badgeBorderRadius = 50;
145 145
146// Modal 146// Modal
147export const colorModalOverlayBackground = color('#000').alpha(0.5).rgb().string(); 147export const colorModalOverlayBackground = color('#000').alpha(0.5).rgb().string();
148export const colorModalBackground = colorContentBackground;
148 149
149// Services 150// Services
150export const services = { 151export const services = {
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index f6686548d..e5f095952 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -13,6 +13,7 @@ import ServiceDisabled from './ServiceDisabled';
13import ServiceWebview from './ServiceWebview'; 13import ServiceWebview from './ServiceWebview';
14import SettingsStore from '../../../stores/SettingsStore'; 14import SettingsStore from '../../../stores/SettingsStore';
15import WebControlsScreen from '../../../features/webControls/containers/WebControlsScreen'; 15import WebControlsScreen from '../../../features/webControls/containers/WebControlsScreen';
16import { CUSTOM_WEBSITE_ID } from '../../../features/webControls/constants';
16 17
17export default @observer @inject('stores') class ServiceView extends Component { 18export default @observer @inject('stores') class ServiceView extends Component {
18 static propTypes = { 19 static propTypes = {
@@ -179,15 +180,17 @@ export default @observer @inject('stores') class ServiceView extends Component {
179 </Fragment> 180 </Fragment>
180 ) : ( 181 ) : (
181 <> 182 <>
182 {service.recipe.id === 'franz-custom-website' && (
183 <WebControlsScreen service={service} />
184 )}
185 {!this.state.hibernate ? ( 183 {!this.state.hibernate ? (
186 <ServiceWebview 184 <>
187 service={service} 185 {service.recipe.id === CUSTOM_WEBSITE_ID && (
188 setWebviewReference={setWebviewReference} 186 <WebControlsScreen service={service} />
189 detachService={detachService} 187 )}
190 /> 188 <ServiceWebview
189 service={service}
190 setWebviewReference={setWebviewReference}
191 detachService={detachService}
192 />
193 </>
191 ) : ( 194 ) : (
192 <div> 195 <div>
193 <span role="img" aria-label="Sleeping Emoji">😴</span> 196 <span role="img" aria-label="Sleeping Emoji">😴</span>
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index 03d6d5bcc..e6ebb6afb 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -38,6 +38,13 @@ class ServiceWebview extends Component {
38 detachService({ service }); 38 detachService({ service });
39 } 39 }
40 40
41 refocusWebview = () => {
42 const { webview } = this;
43 if (!webview) return;
44 webview.view.blur();
45 webview.view.focus();
46 };
47
41 render() { 48 render() {
42 const { 49 const {
43 service, 50 service,
@@ -46,7 +53,12 @@ class ServiceWebview extends Component {
46 53
47 return ( 54 return (
48 <ElectronWebView 55 <ElectronWebView
49 ref={(webview) => { this.webview = webview; }} 56 ref={(webview) => {
57 this.webview = webview;
58 if (webview && webview.view) {
59 webview.view.addEventListener('did-stop-loading', this.refocusWebview);
60 }
61 }}
50 autosize 62 autosize
51 src={service.url} 63 src={service.url}
52 preload="./webview/recipe.js" 64 preload="./webview/recipe.js"
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index 1afbaabc4..edff29ae8 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -64,16 +64,24 @@ export default @observer @injectSheet(styles) class Services extends Component {
64 64
65 state = { 65 state = {
66 showConfetti: true, 66 showConfetti: true,
67 } 67 };
68
69 _confettiTimeout = null;
68 70
69 componentDidMount() { 71 componentDidMount() {
70 window.setTimeout(() => { 72 this._confettiTimeout = window.setTimeout(() => {
71 this.setState({ 73 this.setState({
72 showConfetti: false, 74 showConfetti: false,
73 }); 75 });
74 }, ms('8s')); 76 }, ms('8s'));
75 } 77 }
76 78
79 componentWillUnmount() {
80 if (this._confettiTimeout) {
81 clearTimeout(this._confettiTimeout);
82 }
83 }
84
77 render() { 85 render() {
78 const { 86 const {
79 services, 87 services,
diff --git a/src/components/ui/Modal/styles.js b/src/components/ui/Modal/styles.js
index 49b970c97..c2bebf9bb 100644
--- a/src/components/ui/Modal/styles.js
+++ b/src/components/ui/Modal/styles.js
@@ -13,7 +13,7 @@ export default theme => ({
13 display: 'flex', 13 display: 'flex',
14 }, 14 },
15 modal: { 15 modal: {
16 background: '#FFF', 16 background: theme.colorModalBackground,
17 maxWidth: '90%', 17 maxWidth: '90%',
18 height: 'auto', 18 height: 'auto',
19 margin: 'auto auto', 19 margin: 'auto auto',
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index a80ea4c72..5cc6c9506 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -57,12 +57,12 @@ export default function init(stores) {
57 57
58 setVisibility(true); 58 setVisibility(true);
59 59
60 timeLastDelay = moment();
61 shownAfterLaunch = true;
62 60
63 setTimeout(() => { 61 setTimeout(() => {
64 debug('Resetting app delay'); 62 debug('Resetting app delay');
65 63
64 shownAfterLaunch = true;
65 timeLastDelay = moment();
66 setVisibility(false); 66 setVisibility(false);
67 }, config.delayDuration + 1000); // timer needs to be able to hit 0 67 }, config.delayDuration + 1000); // timer needs to be able to hit 0
68 } else { 68 } else {
diff --git a/src/features/webControls/components/WebControls.js b/src/features/webControls/components/WebControls.js
index 03f601a17..c6331073b 100644
--- a/src/features/webControls/components/WebControls.js
+++ b/src/features/webControls/components/WebControls.js
@@ -3,11 +3,35 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss'; 4import injectSheet from 'react-jss';
5import { Icon } from '@meetfranz/ui'; 5import { Icon } from '@meetfranz/ui';
6import { defineMessages, intlShape } from 'react-intl';
6 7
7import { 8import {
8 mdiReload, mdiArrowRight, mdiArrowLeft, mdiHomeOutline, 9 mdiReload, mdiArrowRight, mdiArrowLeft, mdiHomeOutline, mdiEarth,
9} from '@mdi/js'; 10} from '@mdi/js';
10 11
12const messages = defineMessages({
13 goHome: {
14 id: 'webControls.goHome',
15 defaultMessage: '!!!Home',
16 },
17 openInBrowser: {
18 id: 'webControls.openInBrowser',
19 defaultMessage: '!!!Open in Browser',
20 },
21 back: {
22 id: 'webControls.back',
23 defaultMessage: '!!!Back',
24 },
25 forward: {
26 id: 'webControls.forward',
27 defaultMessage: '!!!Forward',
28 },
29 reload: {
30 id: 'webControls.reload',
31 defaultMessage: '!!!Reload',
32 },
33});
34
11const styles = theme => ({ 35const styles = theme => ({
12 root: { 36 root: {
13 background: theme.colorBackground, 37 background: theme.colorBackground,
@@ -18,7 +42,7 @@ const styles = theme => ({
18 display: 'flex', 42 display: 'flex',
19 flexDirection: 'row', 43 flexDirection: 'row',
20 alignItems: 'center', 44 alignItems: 'center',
21 padding: [0, 20], 45 padding: [0, 10],
22 46
23 '& + div': { 47 '& + div': {
24 height: 'calc(100% - 50px)', 48 height: 'calc(100% - 50px)',
@@ -45,7 +69,7 @@ const styles = theme => ({
45 input: { 69 input: {
46 marginBottom: 0, 70 marginBottom: 0,
47 height: 'auto', 71 height: 'auto',
48 marginLeft: 10, 72 margin: [0, 10],
49 flex: 1, 73 flex: 1,
50 border: 0, 74 border: 0,
51 padding: [4, 10], 75 padding: [4, 10],
@@ -68,10 +92,15 @@ class WebControls extends Component {
68 canGoForward: PropTypes.bool.isRequired, 92 canGoForward: PropTypes.bool.isRequired,
69 goForward: PropTypes.func.isRequired, 93 goForward: PropTypes.func.isRequired,
70 reload: PropTypes.func.isRequired, 94 reload: PropTypes.func.isRequired,
95 openInBrowser: PropTypes.func.isRequired,
71 url: PropTypes.string.isRequired, 96 url: PropTypes.string.isRequired,
72 navigate: PropTypes.func.isRequired, 97 navigate: PropTypes.func.isRequired,
73 } 98 }
74 99
100 static contextTypes = {
101 intl: intlShape,
102 };
103
75 static getDerivedStateFromProps(props, state) { 104 static getDerivedStateFromProps(props, state) {
76 const { url } = props; 105 const { url } = props;
77 const { editUrl } = state; 106 const { editUrl } = state;
@@ -100,6 +129,7 @@ class WebControls extends Component {
100 canGoForward, 129 canGoForward,
101 goForward, 130 goForward,
102 reload, 131 reload,
132 openInBrowser,
103 url, 133 url,
104 navigate, 134 navigate,
105 } = this.props; 135 } = this.props;
@@ -109,12 +139,16 @@ class WebControls extends Component {
109 editUrl, 139 editUrl,
110 } = this.state; 140 } = this.state;
111 141
142 const { intl } = this.context;
143
112 return ( 144 return (
113 <div className={classes.root}> 145 <div className={classes.root}>
114 <button 146 <button
115 onClick={goHome} 147 onClick={goHome}
116 type="button" 148 type="button"
117 className={classes.button} 149 className={classes.button}
150 data-tip={intl.formatMessage(messages.goHome)}
151 data-place="bottom"
118 > 152 >
119 <Icon 153 <Icon
120 icon={mdiHomeOutline} 154 icon={mdiHomeOutline}
@@ -126,6 +160,8 @@ class WebControls extends Component {
126 type="button" 160 type="button"
127 className={classes.button} 161 className={classes.button}
128 disabled={!canGoBack} 162 disabled={!canGoBack}
163 data-tip={intl.formatMessage(messages.back)}
164 data-place="bottom"
129 > 165 >
130 <Icon 166 <Icon
131 icon={mdiArrowLeft} 167 icon={mdiArrowLeft}
@@ -137,6 +173,8 @@ class WebControls extends Component {
137 type="button" 173 type="button"
138 className={classes.button} 174 className={classes.button}
139 disabled={!canGoForward} 175 disabled={!canGoForward}
176 data-tip={intl.formatMessage(messages.forward)}
177 data-place="bottom"
140 > 178 >
141 <Icon 179 <Icon
142 icon={mdiArrowRight} 180 icon={mdiArrowRight}
@@ -147,6 +185,8 @@ class WebControls extends Component {
147 onClick={reload} 185 onClick={reload}
148 type="button" 186 type="button"
149 className={classes.button} 187 className={classes.button}
188 data-tip={intl.formatMessage(messages.reload)}
189 data-place="bottom"
150 > 190 >
151 <Icon 191 <Icon
152 icon={mdiReload} 192 icon={mdiReload}
@@ -160,6 +200,7 @@ class WebControls extends Component {
160 inputUrl: event.target.value, 200 inputUrl: event.target.value,
161 })} 201 })}
162 onFocus={(event) => { 202 onFocus={(event) => {
203 console.log('on focus event');
163 event.target.select(); 204 event.target.select();
164 this.setState({ 205 this.setState({
165 editUrl: true, 206 editUrl: true,
@@ -182,6 +223,18 @@ class WebControls extends Component {
182 }} 223 }}
183 ref={this.inputRef} 224 ref={this.inputRef}
184 /> 225 />
226 <button
227 onClick={openInBrowser}
228 type="button"
229 className={classes.button}
230 data-tip={intl.formatMessage(messages.openInBrowser)}
231 data-place="bottom"
232 >
233 <Icon
234 icon={mdiEarth}
235 className={classes.icon}
236 />
237 </button>
185 </div> 238 </div>
186 ); 239 );
187 } 240 }
diff --git a/src/features/webControls/constants.js b/src/features/webControls/constants.js
new file mode 100644
index 000000000..270a3568e
--- /dev/null
+++ b/src/features/webControls/constants.js
@@ -0,0 +1 @@
export const CUSTOM_WEBSITE_ID = 'franz-custom-website';
diff --git a/src/features/webControls/containers/WebControlsScreen.js b/src/features/webControls/containers/WebControlsScreen.js
index 1452d5a3d..cada01a6f 100644
--- a/src/features/webControls/containers/WebControlsScreen.js
+++ b/src/features/webControls/containers/WebControlsScreen.js
@@ -9,7 +9,6 @@ import Service from '../../../models/Service';
9 9
10const URL_EVENTS = [ 10const URL_EVENTS = [
11 'load-commit', 11 'load-commit',
12 // 'dom-ready',
13 'will-navigate', 12 'will-navigate',
14 'did-navigate', 13 'did-navigate',
15 'did-navigate-in-page', 14 'did-navigate-in-page',
@@ -97,11 +96,20 @@ class WebControlsScreen extends Component {
97 this.url = url; 96 this.url = url;
98 } 97 }
99 98
99 openInBrowser() {
100 const { openExternalUrl } = this.props.actions.app;
101
102 if (!this.webview) return;
103
104 openExternalUrl({ url: this.url });
105 }
106
100 render() { 107 render() {
101 return ( 108 return (
102 <WebControls 109 <WebControls
103 goHome={() => this.goHome()} 110 goHome={() => this.goHome()}
104 reload={() => this.reload()} 111 reload={() => this.reload()}
112 openInBrowser={() => this.openInBrowser()}
105 canGoBack={this.canGoBack} 113 canGoBack={this.canGoBack}
106 goBack={() => this.goBack()} 114 goBack={() => this.goBack()}
107 canGoForward={this.canGoForward} 115 canGoForward={this.canGoForward}
@@ -121,6 +129,9 @@ WebControlsScreen.wrappedComponent.propTypes = {
121 services: PropTypes.instanceOf(ServicesStore).isRequired, 129 services: PropTypes.instanceOf(ServicesStore).isRequired,
122 }).isRequired, 130 }).isRequired,
123 actions: PropTypes.shape({ 131 actions: PropTypes.shape({
132 app: PropTypes.shape({
133 openExternalUrl: PropTypes.func.isRequired,
134 }).isRequired,
124 service: PropTypes.shape({ 135 service: PropTypes.shape({
125 reloadActive: PropTypes.func.isRequired, 136 reloadActive: PropTypes.func.isRequired,
126 }).isRequired, 137 }).isRequired,
diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js
index f4ee89a14..e991b9909 100644
--- a/src/features/workspaces/components/WorkspaceDrawer.js
+++ b/src/features/workspaces/components/WorkspaceDrawer.js
@@ -199,8 +199,9 @@ class WorkspaceDrawer extends Component {
199 }} 199 }}
200 services={getServicesForWorkspace(null)} 200 services={getServicesForWorkspace(null)}
201 isActive={actualWorkspace == null} 201 isActive={actualWorkspace == null}
202 shortcutIndex={0}
202 /> 203 />
203 {workspaces.map(workspace => ( 204 {workspaces.map((workspace, index) => (
204 <WorkspaceDrawerItem 205 <WorkspaceDrawerItem
205 key={workspace.id} 206 key={workspace.id}
206 name={workspace.name} 207 name={workspace.name}
@@ -212,6 +213,7 @@ class WorkspaceDrawer extends Component {
212 }} 213 }}
213 onContextMenuEditClick={() => workspaceActions.edit({ workspace })} 214 onContextMenuEditClick={() => workspaceActions.edit({ workspace })}
214 services={getServicesForWorkspace(workspace)} 215 services={getServicesForWorkspace(workspace)}
216 shortcutIndex={index + 1}
215 /> 217 />
216 ))} 218 ))}
217 <div 219 <div
diff --git a/src/features/workspaces/components/WorkspaceDrawerItem.js b/src/features/workspaces/components/WorkspaceDrawerItem.js
index 59a2144d3..18f424d8a 100644
--- a/src/features/workspaces/components/WorkspaceDrawerItem.js
+++ b/src/features/workspaces/components/WorkspaceDrawerItem.js
@@ -5,6 +5,7 @@ import { observer } from 'mobx-react';
5import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
6import classnames from 'classnames'; 6import classnames from 'classnames';
7import { defineMessages, intlShape } from 'react-intl'; 7import { defineMessages, intlShape } from 'react-intl';
8import { ctrlKey } from '../../../environment';
8 9
9const { Menu } = remote; 10const { Menu } = remote;
10 11
@@ -69,6 +70,7 @@ class WorkspaceDrawerItem extends Component {
69 onClick: PropTypes.func.isRequired, 70 onClick: PropTypes.func.isRequired,
70 services: PropTypes.arrayOf(PropTypes.string).isRequired, 71 services: PropTypes.arrayOf(PropTypes.string).isRequired,
71 onContextMenuEditClick: PropTypes.func, 72 onContextMenuEditClick: PropTypes.func,
73 shortcutIndex: PropTypes.number.isRequired,
72 }; 74 };
73 75
74 static defaultProps = { 76 static defaultProps = {
@@ -87,6 +89,7 @@ class WorkspaceDrawerItem extends Component {
87 onClick, 89 onClick,
88 onContextMenuEditClick, 90 onContextMenuEditClick,
89 services, 91 services,
92 shortcutIndex,
90 } = this.props; 93 } = this.props;
91 const { intl } = this.context; 94 const { intl } = this.context;
92 95
@@ -112,6 +115,7 @@ class WorkspaceDrawerItem extends Component {
112 onContextMenu={() => ( 115 onContextMenu={() => (
113 onContextMenuEditClick && contextMenu.popup(remote.getCurrentWindow()) 116 onContextMenuEditClick && contextMenu.popup(remote.getCurrentWindow())
114 )} 117 )}
118 data-tip={`${shortcutIndex <= 9 ? `(${ctrlKey}+Alt+${shortcutIndex})` : ''}`}
115 > 119 >
116 <span 120 <span
117 className={classnames([ 121 className={classnames([
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index f5b268cba..1e8944ead 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -4532,6 +4532,76 @@
4532 { 4532 {
4533 "descriptors": [ 4533 "descriptors": [
4534 { 4534 {
4535 "defaultMessage": "!!!Home",
4536 "end": {
4537 "column": 3,
4538 "line": 16
4539 },
4540 "file": "src/features/webControls/components/WebControls.js",
4541 "id": "webControls.goHome",
4542 "start": {
4543 "column": 10,
4544 "line": 13
4545 }
4546 },
4547 {
4548 "defaultMessage": "!!!Open in Browser",
4549 "end": {
4550 "column": 3,
4551 "line": 20
4552 },
4553 "file": "src/features/webControls/components/WebControls.js",
4554 "id": "webControls.openInBrowser",
4555 "start": {
4556 "column": 17,
4557 "line": 17
4558 }
4559 },
4560 {
4561 "defaultMessage": "!!!Back",
4562 "end": {
4563 "column": 3,
4564 "line": 24
4565 },
4566 "file": "src/features/webControls/components/WebControls.js",
4567 "id": "webControls.back",
4568 "start": {
4569 "column": 8,
4570 "line": 21
4571 }
4572 },
4573 {
4574 "defaultMessage": "!!!Forward",
4575 "end": {
4576 "column": 3,
4577 "line": 28
4578 },
4579 "file": "src/features/webControls/components/WebControls.js",
4580 "id": "webControls.forward",
4581 "start": {
4582 "column": 11,
4583 "line": 25
4584 }
4585 },
4586 {
4587 "defaultMessage": "!!!Reload",
4588 "end": {
4589 "column": 3,
4590 "line": 32
4591 },
4592 "file": "src/features/webControls/components/WebControls.js",
4593 "id": "webControls.reload",
4594 "start": {
4595 "column": 10,
4596 "line": 29
4597 }
4598 }
4599 ],
4600 "path": "src/features/webControls/components/WebControls.json"
4601 },
4602 {
4603 "descriptors": [
4604 {
4535 "defaultMessage": "!!!Create workspace", 4605 "defaultMessage": "!!!Create workspace",
4536 "end": { 4606 "end": {
4537 "column": 3, 4607 "column": 3,
@@ -4797,26 +4867,26 @@
4797 "defaultMessage": "!!!No services added yet", 4867 "defaultMessage": "!!!No services added yet",
4798 "end": { 4868 "end": {
4799 "column": 3, 4869 "column": 3,
4800 "line": 15 4870 "line": 16
4801 }, 4871 },
4802 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", 4872 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
4803 "id": "workspaceDrawer.item.noServicesAddedYet", 4873 "id": "workspaceDrawer.item.noServicesAddedYet",
4804 "start": { 4874 "start": {
4805 "column": 22, 4875 "column": 22,
4806 "line": 12 4876 "line": 13
4807 } 4877 }
4808 }, 4878 },
4809 { 4879 {
4810 "defaultMessage": "!!!edit", 4880 "defaultMessage": "!!!edit",
4811 "end": { 4881 "end": {
4812 "column": 3, 4882 "column": 3,
4813 "line": 19 4883 "line": 20
4814 }, 4884 },
4815 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", 4885 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
4816 "id": "workspaceDrawer.item.contextMenuEdit", 4886 "id": "workspaceDrawer.item.contextMenuEdit",
4817 "start": { 4887 "start": {
4818 "column": 19, 4888 "column": 19,
4819 "line": 16 4889 "line": 17
4820 } 4890 }
4821 } 4891 }
4822 ], 4892 ],
@@ -5261,871 +5331,884 @@
5261 "defaultMessage": "!!!Edit", 5331 "defaultMessage": "!!!Edit",
5262 "end": { 5332 "end": {
5263 "column": 3, 5333 "column": 3,
5264 "line": 19 5334 "line": 20
5265 }, 5335 },
5266 "file": "src/lib/Menu.js", 5336 "file": "src/lib/Menu.js",
5267 "id": "menu.edit", 5337 "id": "menu.edit",
5268 "start": { 5338 "start": {
5269 "column": 8, 5339 "column": 8,
5270 "line": 16 5340 "line": 17
5271 } 5341 }
5272 }, 5342 },
5273 { 5343 {
5274 "defaultMessage": "!!!Undo", 5344 "defaultMessage": "!!!Undo",
5275 "end": { 5345 "end": {
5276 "column": 3, 5346 "column": 3,
5277 "line": 23 5347 "line": 24
5278 }, 5348 },
5279 "file": "src/lib/Menu.js", 5349 "file": "src/lib/Menu.js",
5280 "id": "menu.edit.undo", 5350 "id": "menu.edit.undo",
5281 "start": { 5351 "start": {
5282 "column": 8, 5352 "column": 8,
5283 "line": 20 5353 "line": 21
5284 } 5354 }
5285 }, 5355 },
5286 { 5356 {
5287 "defaultMessage": "!!!Redo", 5357 "defaultMessage": "!!!Redo",
5288 "end": { 5358 "end": {
5289 "column": 3, 5359 "column": 3,
5290 "line": 27 5360 "line": 28
5291 }, 5361 },
5292 "file": "src/lib/Menu.js", 5362 "file": "src/lib/Menu.js",
5293 "id": "menu.edit.redo", 5363 "id": "menu.edit.redo",
5294 "start": { 5364 "start": {
5295 "column": 8, 5365 "column": 8,
5296 "line": 24 5366 "line": 25
5297 } 5367 }
5298 }, 5368 },
5299 { 5369 {
5300 "defaultMessage": "!!!Cut", 5370 "defaultMessage": "!!!Cut",
5301 "end": { 5371 "end": {
5302 "column": 3, 5372 "column": 3,
5303 "line": 31 5373 "line": 32
5304 }, 5374 },
5305 "file": "src/lib/Menu.js", 5375 "file": "src/lib/Menu.js",
5306 "id": "menu.edit.cut", 5376 "id": "menu.edit.cut",
5307 "start": { 5377 "start": {
5308 "column": 7, 5378 "column": 7,
5309 "line": 28 5379 "line": 29
5310 } 5380 }
5311 }, 5381 },
5312 { 5382 {
5313 "defaultMessage": "!!!Copy", 5383 "defaultMessage": "!!!Copy",
5314 "end": { 5384 "end": {
5315 "column": 3, 5385 "column": 3,
5316 "line": 35 5386 "line": 36
5317 }, 5387 },
5318 "file": "src/lib/Menu.js", 5388 "file": "src/lib/Menu.js",
5319 "id": "menu.edit.copy", 5389 "id": "menu.edit.copy",
5320 "start": { 5390 "start": {
5321 "column": 8, 5391 "column": 8,
5322 "line": 32 5392 "line": 33
5323 } 5393 }
5324 }, 5394 },
5325 { 5395 {
5326 "defaultMessage": "!!!Paste", 5396 "defaultMessage": "!!!Paste",
5327 "end": { 5397 "end": {
5328 "column": 3, 5398 "column": 3,
5329 "line": 39 5399 "line": 40
5330 }, 5400 },
5331 "file": "src/lib/Menu.js", 5401 "file": "src/lib/Menu.js",
5332 "id": "menu.edit.paste", 5402 "id": "menu.edit.paste",
5333 "start": { 5403 "start": {
5334 "column": 9, 5404 "column": 9,
5335 "line": 36 5405 "line": 37
5336 } 5406 }
5337 }, 5407 },
5338 { 5408 {
5339 "defaultMessage": "!!!Paste And Match Style", 5409 "defaultMessage": "!!!Paste And Match Style",
5340 "end": { 5410 "end": {
5341 "column": 3, 5411 "column": 3,
5342 "line": 43 5412 "line": 44
5343 }, 5413 },
5344 "file": "src/lib/Menu.js", 5414 "file": "src/lib/Menu.js",
5345 "id": "menu.edit.pasteAndMatchStyle", 5415 "id": "menu.edit.pasteAndMatchStyle",
5346 "start": { 5416 "start": {
5347 "column": 22, 5417 "column": 22,
5348 "line": 40 5418 "line": 41
5349 } 5419 }
5350 }, 5420 },
5351 { 5421 {
5352 "defaultMessage": "!!!Delete", 5422 "defaultMessage": "!!!Delete",
5353 "end": { 5423 "end": {
5354 "column": 3, 5424 "column": 3,
5355 "line": 47 5425 "line": 48
5356 }, 5426 },
5357 "file": "src/lib/Menu.js", 5427 "file": "src/lib/Menu.js",
5358 "id": "menu.edit.delete", 5428 "id": "menu.edit.delete",
5359 "start": { 5429 "start": {
5360 "column": 10, 5430 "column": 10,
5361 "line": 44 5431 "line": 45
5362 } 5432 }
5363 }, 5433 },
5364 { 5434 {
5365 "defaultMessage": "!!!Select All", 5435 "defaultMessage": "!!!Select All",
5366 "end": { 5436 "end": {
5367 "column": 3, 5437 "column": 3,
5368 "line": 51 5438 "line": 52
5369 }, 5439 },
5370 "file": "src/lib/Menu.js", 5440 "file": "src/lib/Menu.js",
5371 "id": "menu.edit.selectAll", 5441 "id": "menu.edit.selectAll",
5372 "start": { 5442 "start": {
5373 "column": 13, 5443 "column": 13,
5374 "line": 48 5444 "line": 49
5375 } 5445 }
5376 }, 5446 },
5377 { 5447 {
5378 "defaultMessage": "!!!Speech", 5448 "defaultMessage": "!!!Speech",
5379 "end": { 5449 "end": {
5380 "column": 3, 5450 "column": 3,
5381 "line": 55 5451 "line": 56
5382 }, 5452 },
5383 "file": "src/lib/Menu.js", 5453 "file": "src/lib/Menu.js",
5384 "id": "menu.edit.speech", 5454 "id": "menu.edit.speech",
5385 "start": { 5455 "start": {
5386 "column": 10, 5456 "column": 10,
5387 "line": 52 5457 "line": 53
5388 } 5458 }
5389 }, 5459 },
5390 { 5460 {
5391 "defaultMessage": "!!!Start Speaking", 5461 "defaultMessage": "!!!Start Speaking",
5392 "end": { 5462 "end": {
5393 "column": 3, 5463 "column": 3,
5394 "line": 59 5464 "line": 60
5395 }, 5465 },
5396 "file": "src/lib/Menu.js", 5466 "file": "src/lib/Menu.js",
5397 "id": "menu.edit.startSpeaking", 5467 "id": "menu.edit.startSpeaking",
5398 "start": { 5468 "start": {
5399 "column": 17, 5469 "column": 17,
5400 "line": 56 5470 "line": 57
5401 } 5471 }
5402 }, 5472 },
5403 { 5473 {
5404 "defaultMessage": "!!!Stop Speaking", 5474 "defaultMessage": "!!!Stop Speaking",
5405 "end": { 5475 "end": {
5406 "column": 3, 5476 "column": 3,
5407 "line": 63 5477 "line": 64
5408 }, 5478 },
5409 "file": "src/lib/Menu.js", 5479 "file": "src/lib/Menu.js",
5410 "id": "menu.edit.stopSpeaking", 5480 "id": "menu.edit.stopSpeaking",
5411 "start": { 5481 "start": {
5412 "column": 16, 5482 "column": 16,
5413 "line": 60 5483 "line": 61
5414 } 5484 }
5415 }, 5485 },
5416 { 5486 {
5417 "defaultMessage": "!!!Start Dictation", 5487 "defaultMessage": "!!!Start Dictation",
5418 "end": { 5488 "end": {
5419 "column": 3, 5489 "column": 3,
5420 "line": 67 5490 "line": 68
5421 }, 5491 },
5422 "file": "src/lib/Menu.js", 5492 "file": "src/lib/Menu.js",
5423 "id": "menu.edit.startDictation", 5493 "id": "menu.edit.startDictation",
5424 "start": { 5494 "start": {
5425 "column": 18, 5495 "column": 18,
5426 "line": 64 5496 "line": 65
5427 } 5497 }
5428 }, 5498 },
5429 { 5499 {
5430 "defaultMessage": "!!!Emoji & Symbols", 5500 "defaultMessage": "!!!Emoji & Symbols",
5431 "end": { 5501 "end": {
5432 "column": 3, 5502 "column": 3,
5433 "line": 71 5503 "line": 72
5434 }, 5504 },
5435 "file": "src/lib/Menu.js", 5505 "file": "src/lib/Menu.js",
5436 "id": "menu.edit.emojiSymbols", 5506 "id": "menu.edit.emojiSymbols",
5437 "start": { 5507 "start": {
5438 "column": 16, 5508 "column": 16,
5439 "line": 68 5509 "line": 69
5440 } 5510 }
5441 }, 5511 },
5442 { 5512 {
5443 "defaultMessage": "!!!Open Quick Switch", 5513 "defaultMessage": "!!!Open Quick Switch",
5444 "end": { 5514 "end": {
5445 "column": 3, 5515 "column": 3,
5446 "line": 75 5516 "line": 76
5447 }, 5517 },
5448 "file": "src/lib/Menu.js", 5518 "file": "src/lib/Menu.js",
5449 "id": "menu.view.openQuickSwitch", 5519 "id": "menu.view.openQuickSwitch",
5450 "start": { 5520 "start": {
5451 "column": 19, 5521 "column": 19,
5452 "line": 72 5522 "line": 73
5453 } 5523 }
5454 }, 5524 },
5455 { 5525 {
5456 "defaultMessage": "!!!Back", 5526 "defaultMessage": "!!!Back",
5457 "end": { 5527 "end": {
5458 "column": 3, 5528 "column": 3,
5459 "line": 79 5529 "line": 80
5460 }, 5530 },
5461 "file": "src/lib/Menu.js", 5531 "file": "src/lib/Menu.js",
5462 "id": "menu.view.back", 5532 "id": "menu.view.back",
5463 "start": { 5533 "start": {
5464 "column": 8, 5534 "column": 8,
5465 "line": 76 5535 "line": 77
5466 } 5536 }
5467 }, 5537 },
5468 { 5538 {
5469 "defaultMessage": "!!!Forward", 5539 "defaultMessage": "!!!Forward",
5470 "end": { 5540 "end": {
5471 "column": 3, 5541 "column": 3,
5472 "line": 83 5542 "line": 84
5473 }, 5543 },
5474 "file": "src/lib/Menu.js", 5544 "file": "src/lib/Menu.js",
5475 "id": "menu.view.forward", 5545 "id": "menu.view.forward",
5476 "start": { 5546 "start": {
5477 "column": 11, 5547 "column": 11,
5478 "line": 80 5548 "line": 81
5479 } 5549 }
5480 }, 5550 },
5481 { 5551 {
5482 "defaultMessage": "!!!Actual Size", 5552 "defaultMessage": "!!!Actual Size",
5483 "end": { 5553 "end": {
5484 "column": 3, 5554 "column": 3,
5485 "line": 87 5555 "line": 88
5486 }, 5556 },
5487 "file": "src/lib/Menu.js", 5557 "file": "src/lib/Menu.js",
5488 "id": "menu.view.resetZoom", 5558 "id": "menu.view.resetZoom",
5489 "start": { 5559 "start": {
5490 "column": 13, 5560 "column": 13,
5491 "line": 84 5561 "line": 85
5492 } 5562 }
5493 }, 5563 },
5494 { 5564 {
5495 "defaultMessage": "!!!Zoom In", 5565 "defaultMessage": "!!!Zoom In",
5496 "end": { 5566 "end": {
5497 "column": 3, 5567 "column": 3,
5498 "line": 91 5568 "line": 92
5499 }, 5569 },
5500 "file": "src/lib/Menu.js", 5570 "file": "src/lib/Menu.js",
5501 "id": "menu.view.zoomIn", 5571 "id": "menu.view.zoomIn",
5502 "start": { 5572 "start": {
5503 "column": 10, 5573 "column": 10,
5504 "line": 88 5574 "line": 89
5505 } 5575 }
5506 }, 5576 },
5507 { 5577 {
5508 "defaultMessage": "!!!Zoom Out", 5578 "defaultMessage": "!!!Zoom Out",
5509 "end": { 5579 "end": {
5510 "column": 3, 5580 "column": 3,
5511 "line": 95 5581 "line": 96
5512 }, 5582 },
5513 "file": "src/lib/Menu.js", 5583 "file": "src/lib/Menu.js",
5514 "id": "menu.view.zoomOut", 5584 "id": "menu.view.zoomOut",
5515 "start": { 5585 "start": {
5516 "column": 11, 5586 "column": 11,
5517 "line": 92 5587 "line": 93
5518 } 5588 }
5519 }, 5589 },
5520 { 5590 {
5521 "defaultMessage": "!!!Enter Full Screen", 5591 "defaultMessage": "!!!Enter Full Screen",
5522 "end": { 5592 "end": {
5523 "column": 3, 5593 "column": 3,
5524 "line": 99 5594 "line": 100
5525 }, 5595 },
5526 "file": "src/lib/Menu.js", 5596 "file": "src/lib/Menu.js",
5527 "id": "menu.view.enterFullScreen", 5597 "id": "menu.view.enterFullScreen",
5528 "start": { 5598 "start": {
5529 "column": 19, 5599 "column": 19,
5530 "line": 96 5600 "line": 97
5531 } 5601 }
5532 }, 5602 },
5533 { 5603 {
5534 "defaultMessage": "!!!Exit Full Screen", 5604 "defaultMessage": "!!!Exit Full Screen",
5535 "end": { 5605 "end": {
5536 "column": 3, 5606 "column": 3,
5537 "line": 103 5607 "line": 104
5538 }, 5608 },
5539 "file": "src/lib/Menu.js", 5609 "file": "src/lib/Menu.js",
5540 "id": "menu.view.exitFullScreen", 5610 "id": "menu.view.exitFullScreen",
5541 "start": { 5611 "start": {
5542 "column": 18, 5612 "column": 18,
5543 "line": 100 5613 "line": 101
5544 } 5614 }
5545 }, 5615 },
5546 { 5616 {
5547 "defaultMessage": "!!!Toggle Full Screen", 5617 "defaultMessage": "!!!Toggle Full Screen",
5548 "end": { 5618 "end": {
5549 "column": 3, 5619 "column": 3,
5550 "line": 107 5620 "line": 108
5551 }, 5621 },
5552 "file": "src/lib/Menu.js", 5622 "file": "src/lib/Menu.js",
5553 "id": "menu.view.toggleFullScreen", 5623 "id": "menu.view.toggleFullScreen",
5554 "start": { 5624 "start": {
5555 "column": 20, 5625 "column": 20,
5556 "line": 104 5626 "line": 105
5557 } 5627 }
5558 }, 5628 },
5559 { 5629 {
5560 "defaultMessage": "!!!Toggle Developer Tools", 5630 "defaultMessage": "!!!Toggle Developer Tools",
5561 "end": { 5631 "end": {
5562 "column": 3, 5632 "column": 3,
5563 "line": 111 5633 "line": 112
5564 }, 5634 },
5565 "file": "src/lib/Menu.js", 5635 "file": "src/lib/Menu.js",
5566 "id": "menu.view.toggleDevTools", 5636 "id": "menu.view.toggleDevTools",
5567 "start": { 5637 "start": {
5568 "column": 18, 5638 "column": 18,
5569 "line": 108 5639 "line": 109
5570 } 5640 }
5571 }, 5641 },
5572 { 5642 {
5573 "defaultMessage": "!!!Toggle Todos Developer Tools", 5643 "defaultMessage": "!!!Toggle Todos Developer Tools",
5574 "end": { 5644 "end": {
5575 "column": 3, 5645 "column": 3,
5576 "line": 115 5646 "line": 116
5577 }, 5647 },
5578 "file": "src/lib/Menu.js", 5648 "file": "src/lib/Menu.js",
5579 "id": "menu.view.toggleTodosDevTools", 5649 "id": "menu.view.toggleTodosDevTools",
5580 "start": { 5650 "start": {
5581 "column": 23, 5651 "column": 23,
5582 "line": 112 5652 "line": 113
5583 } 5653 }
5584 }, 5654 },
5585 { 5655 {
5586 "defaultMessage": "!!!Toggle Service Developer Tools", 5656 "defaultMessage": "!!!Toggle Service Developer Tools",
5587 "end": { 5657 "end": {
5588 "column": 3, 5658 "column": 3,
5589 "line": 119 5659 "line": 120
5590 }, 5660 },
5591 "file": "src/lib/Menu.js", 5661 "file": "src/lib/Menu.js",
5592 "id": "menu.view.toggleServiceDevTools", 5662 "id": "menu.view.toggleServiceDevTools",
5593 "start": { 5663 "start": {
5594 "column": 25, 5664 "column": 25,
5595 "line": 116 5665 "line": 117
5596 } 5666 }
5597 }, 5667 },
5598 { 5668 {
5599 "defaultMessage": "!!!Reload Service", 5669 "defaultMessage": "!!!Reload Service",
5600 "end": { 5670 "end": {
5601 "column": 3, 5671 "column": 3,
5602 "line": 123 5672 "line": 124
5603 }, 5673 },
5604 "file": "src/lib/Menu.js", 5674 "file": "src/lib/Menu.js",
5605 "id": "menu.view.reloadService", 5675 "id": "menu.view.reloadService",
5606 "start": { 5676 "start": {
5607 "column": 17, 5677 "column": 17,
5608 "line": 120 5678 "line": 121
5609 } 5679 }
5610 }, 5680 },
5611 { 5681 {
5612 "defaultMessage": "!!!Reload Ferdi", 5682 "defaultMessage": "!!!Reload Ferdi",
5613 "end": { 5683 "end": {
5614 "column": 3, 5684 "column": 3,
5615 "line": 127 5685 "line": 128
5616 }, 5686 },
5617 "file": "src/lib/Menu.js", 5687 "file": "src/lib/Menu.js",
5618 "id": "menu.view.reloadFranz", 5688 "id": "menu.view.reloadFranz",
5619 "start": { 5689 "start": {
5620 "column": 15, 5690 "column": 15,
5621 "line": 124 5691 "line": 125
5622 } 5692 }
5623 }, 5693 },
5624 { 5694 {
5625 "defaultMessage": "!!!Lock Ferdi", 5695 "defaultMessage": "!!!Lock Ferdi",
5626 "end": { 5696 "end": {
5627 "column": 3, 5697 "column": 3,
5628 "line": 131 5698 "line": 132
5629 }, 5699 },
5630 "file": "src/lib/Menu.js", 5700 "file": "src/lib/Menu.js",
5631 "id": "menu.view.lockFerdi", 5701 "id": "menu.view.lockFerdi",
5632 "start": { 5702 "start": {
5633 "column": 13, 5703 "column": 13,
5634 "line": 128 5704 "line": 129
5635 } 5705 }
5636 }, 5706 },
5637 { 5707 {
5638 "defaultMessage": "!!!Minimize", 5708 "defaultMessage": "!!!Minimize",
5639 "end": { 5709 "end": {
5640 "column": 3, 5710 "column": 3,
5641 "line": 135 5711 "line": 136
5642 }, 5712 },
5643 "file": "src/lib/Menu.js", 5713 "file": "src/lib/Menu.js",
5644 "id": "menu.window.minimize", 5714 "id": "menu.window.minimize",
5645 "start": { 5715 "start": {
5646 "column": 12, 5716 "column": 12,
5647 "line": 132 5717 "line": 133
5648 } 5718 }
5649 }, 5719 },
5650 { 5720 {
5651 "defaultMessage": "!!!Close", 5721 "defaultMessage": "!!!Close",
5652 "end": { 5722 "end": {
5653 "column": 3, 5723 "column": 3,
5654 "line": 139 5724 "line": 140
5655 }, 5725 },
5656 "file": "src/lib/Menu.js", 5726 "file": "src/lib/Menu.js",
5657 "id": "menu.window.close", 5727 "id": "menu.window.close",
5658 "start": { 5728 "start": {
5659 "column": 9, 5729 "column": 9,
5660 "line": 136 5730 "line": 137
5661 } 5731 }
5662 }, 5732 },
5663 { 5733 {
5664 "defaultMessage": "!!!Learn More", 5734 "defaultMessage": "!!!Learn More",
5665 "end": { 5735 "end": {
5666 "column": 3, 5736 "column": 3,
5667 "line": 143 5737 "line": 144
5668 }, 5738 },
5669 "file": "src/lib/Menu.js", 5739 "file": "src/lib/Menu.js",
5670 "id": "menu.help.learnMore", 5740 "id": "menu.help.learnMore",
5671 "start": { 5741 "start": {
5672 "column": 13, 5742 "column": 13,
5673 "line": 140 5743 "line": 141
5674 } 5744 }
5675 }, 5745 },
5676 { 5746 {
5677 "defaultMessage": "!!!Changelog", 5747 "defaultMessage": "!!!Changelog",
5678 "end": { 5748 "end": {
5679 "column": 3, 5749 "column": 3,
5680 "line": 147 5750 "line": 148
5681 }, 5751 },
5682 "file": "src/lib/Menu.js", 5752 "file": "src/lib/Menu.js",
5683 "id": "menu.help.changelog", 5753 "id": "menu.help.changelog",
5684 "start": { 5754 "start": {
5685 "column": 13, 5755 "column": 13,
5686 "line": 144 5756 "line": 145
5687 } 5757 }
5688 }, 5758 },
5689 { 5759 {
5690 "defaultMessage": "!!!Support", 5760 "defaultMessage": "!!!Support",
5691 "end": { 5761 "end": {
5692 "column": 3, 5762 "column": 3,
5693 "line": 151 5763 "line": 152
5694 }, 5764 },
5695 "file": "src/lib/Menu.js", 5765 "file": "src/lib/Menu.js",
5696 "id": "menu.help.support", 5766 "id": "menu.help.support",
5697 "start": { 5767 "start": {
5698 "column": 11, 5768 "column": 11,
5699 "line": 148 5769 "line": 149
5700 } 5770 }
5701 }, 5771 },
5702 { 5772 {
5703 "defaultMessage": "!!!Copy Debug Information", 5773 "defaultMessage": "!!!Copy Debug Information",
5704 "end": { 5774 "end": {
5705 "column": 3, 5775 "column": 3,
5706 "line": 155 5776 "line": 156
5707 }, 5777 },
5708 "file": "src/lib/Menu.js", 5778 "file": "src/lib/Menu.js",
5709 "id": "menu.help.debugInfo", 5779 "id": "menu.help.debugInfo",
5710 "start": { 5780 "start": {
5711 "column": 13, 5781 "column": 13,
5712 "line": 152 5782 "line": 153
5713 } 5783 }
5714 }, 5784 },
5715 { 5785 {
5716 "defaultMessage": "!!!Ferdi Debug Information", 5786 "defaultMessage": "!!!Ferdi Debug Information",
5717 "end": { 5787 "end": {
5718 "column": 3, 5788 "column": 3,
5719 "line": 159 5789 "line": 160
5720 }, 5790 },
5721 "file": "src/lib/Menu.js", 5791 "file": "src/lib/Menu.js",
5722 "id": "menu.help.debugInfoCopiedHeadline", 5792 "id": "menu.help.debugInfoCopiedHeadline",
5723 "start": { 5793 "start": {
5724 "column": 27, 5794 "column": 27,
5725 "line": 156 5795 "line": 157
5726 } 5796 }
5727 }, 5797 },
5728 { 5798 {
5729 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 5799 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
5730 "end": { 5800 "end": {
5731 "column": 3, 5801 "column": 3,
5732 "line": 163 5802 "line": 164
5733 }, 5803 },
5734 "file": "src/lib/Menu.js", 5804 "file": "src/lib/Menu.js",
5735 "id": "menu.help.debugInfoCopiedBody", 5805 "id": "menu.help.debugInfoCopiedBody",
5736 "start": { 5806 "start": {
5737 "column": 23, 5807 "column": 23,
5738 "line": 160 5808 "line": 161
5739 } 5809 }
5740 }, 5810 },
5741 { 5811 {
5742 "defaultMessage": "!!!Terms of Service", 5812 "defaultMessage": "!!!Terms of Service",
5743 "end": { 5813 "end": {
5744 "column": 3, 5814 "column": 3,
5745 "line": 167 5815 "line": 168
5746 }, 5816 },
5747 "file": "src/lib/Menu.js", 5817 "file": "src/lib/Menu.js",
5748 "id": "menu.help.tos", 5818 "id": "menu.help.tos",
5749 "start": { 5819 "start": {
5750 "column": 7, 5820 "column": 7,
5751 "line": 164 5821 "line": 165
5752 } 5822 }
5753 }, 5823 },
5754 { 5824 {
5755 "defaultMessage": "!!!Privacy Statement", 5825 "defaultMessage": "!!!Privacy Statement",
5756 "end": { 5826 "end": {
5757 "column": 3, 5827 "column": 3,
5758 "line": 171 5828 "line": 172
5759 }, 5829 },
5760 "file": "src/lib/Menu.js", 5830 "file": "src/lib/Menu.js",
5761 "id": "menu.help.privacy", 5831 "id": "menu.help.privacy",
5762 "start": { 5832 "start": {
5763 "column": 11, 5833 "column": 11,
5764 "line": 168 5834 "line": 169
5765 } 5835 }
5766 }, 5836 },
5767 { 5837 {
5768 "defaultMessage": "!!!File", 5838 "defaultMessage": "!!!File",
5769 "end": { 5839 "end": {
5770 "column": 3, 5840 "column": 3,
5771 "line": 175 5841 "line": 176
5772 }, 5842 },
5773 "file": "src/lib/Menu.js", 5843 "file": "src/lib/Menu.js",
5774 "id": "menu.file", 5844 "id": "menu.file",
5775 "start": { 5845 "start": {
5776 "column": 8, 5846 "column": 8,
5777 "line": 172 5847 "line": 173
5778 } 5848 }
5779 }, 5849 },
5780 { 5850 {
5781 "defaultMessage": "!!!View", 5851 "defaultMessage": "!!!View",
5782 "end": { 5852 "end": {
5783 "column": 3, 5853 "column": 3,
5784 "line": 179 5854 "line": 180
5785 }, 5855 },
5786 "file": "src/lib/Menu.js", 5856 "file": "src/lib/Menu.js",
5787 "id": "menu.view", 5857 "id": "menu.view",
5788 "start": { 5858 "start": {
5789 "column": 8, 5859 "column": 8,
5790 "line": 176 5860 "line": 177
5791 } 5861 }
5792 }, 5862 },
5793 { 5863 {
5794 "defaultMessage": "!!!Services", 5864 "defaultMessage": "!!!Services",
5795 "end": { 5865 "end": {
5796 "column": 3, 5866 "column": 3,
5797 "line": 183 5867 "line": 184
5798 }, 5868 },
5799 "file": "src/lib/Menu.js", 5869 "file": "src/lib/Menu.js",
5800 "id": "menu.services", 5870 "id": "menu.services",
5801 "start": { 5871 "start": {
5802 "column": 12, 5872 "column": 12,
5803 "line": 180 5873 "line": 181
5804 } 5874 }
5805 }, 5875 },
5806 { 5876 {
5807 "defaultMessage": "!!!Window", 5877 "defaultMessage": "!!!Window",
5808 "end": { 5878 "end": {
5809 "column": 3, 5879 "column": 3,
5810 "line": 187 5880 "line": 188
5811 }, 5881 },
5812 "file": "src/lib/Menu.js", 5882 "file": "src/lib/Menu.js",
5813 "id": "menu.window", 5883 "id": "menu.window",
5814 "start": { 5884 "start": {
5815 "column": 10, 5885 "column": 10,
5816 "line": 184 5886 "line": 185
5817 } 5887 }
5818 }, 5888 },
5819 { 5889 {
5820 "defaultMessage": "!!!Help", 5890 "defaultMessage": "!!!Help",
5821 "end": { 5891 "end": {
5822 "column": 3, 5892 "column": 3,
5823 "line": 191 5893 "line": 192
5824 }, 5894 },
5825 "file": "src/lib/Menu.js", 5895 "file": "src/lib/Menu.js",
5826 "id": "menu.help", 5896 "id": "menu.help",
5827 "start": { 5897 "start": {
5828 "column": 8, 5898 "column": 8,
5829 "line": 188 5899 "line": 189
5830 } 5900 }
5831 }, 5901 },
5832 { 5902 {
5833 "defaultMessage": "!!!About Ferdi", 5903 "defaultMessage": "!!!About Ferdi",
5834 "end": { 5904 "end": {
5835 "column": 3, 5905 "column": 3,
5836 "line": 195 5906 "line": 196
5837 }, 5907 },
5838 "file": "src/lib/Menu.js", 5908 "file": "src/lib/Menu.js",
5839 "id": "menu.app.about", 5909 "id": "menu.app.about",
5840 "start": { 5910 "start": {
5841 "column": 9, 5911 "column": 9,
5842 "line": 192 5912 "line": 193
5843 } 5913 }
5844 }, 5914 },
5845 { 5915 {
5846 "defaultMessage": "!!!What's new?", 5916 "defaultMessage": "!!!What's new?",
5847 "end": { 5917 "end": {
5848 "column": 3, 5918 "column": 3,
5849 "line": 199 5919 "line": 200
5850 }, 5920 },
5851 "file": "src/lib/Menu.js", 5921 "file": "src/lib/Menu.js",
5852 "id": "menu.app.announcement", 5922 "id": "menu.app.announcement",
5853 "start": { 5923 "start": {
5854 "column": 16, 5924 "column": 16,
5855 "line": 196 5925 "line": 197
5856 } 5926 }
5857 }, 5927 },
5858 { 5928 {
5859 "defaultMessage": "!!!Settings", 5929 "defaultMessage": "!!!Settings",
5860 "end": { 5930 "end": {
5861 "column": 3, 5931 "column": 3,
5862 "line": 203 5932 "line": 204
5863 }, 5933 },
5864 "file": "src/lib/Menu.js", 5934 "file": "src/lib/Menu.js",
5865 "id": "menu.app.settings", 5935 "id": "menu.app.settings",
5866 "start": { 5936 "start": {
5867 "column": 12, 5937 "column": 12,
5868 "line": 200 5938 "line": 201
5869 } 5939 }
5870 }, 5940 },
5871 { 5941 {
5872 "defaultMessage": "!!!Check for updates", 5942 "defaultMessage": "!!!Check for updates",
5873 "end": { 5943 "end": {
5874 "column": 3, 5944 "column": 3,
5875 "line": 207 5945 "line": 208
5876 }, 5946 },
5877 "file": "src/lib/Menu.js", 5947 "file": "src/lib/Menu.js",
5878 "id": "menu.app.checkForUpdates", 5948 "id": "menu.app.checkForUpdates",
5879 "start": { 5949 "start": {
5880 "column": 19, 5950 "column": 19,
5881 "line": 204 5951 "line": 205
5882 } 5952 }
5883 }, 5953 },
5884 { 5954 {
5885 "defaultMessage": "!!!Hide", 5955 "defaultMessage": "!!!Hide",
5886 "end": { 5956 "end": {
5887 "column": 3, 5957 "column": 3,
5888 "line": 211 5958 "line": 212
5889 }, 5959 },
5890 "file": "src/lib/Menu.js", 5960 "file": "src/lib/Menu.js",
5891 "id": "menu.app.hide", 5961 "id": "menu.app.hide",
5892 "start": { 5962 "start": {
5893 "column": 8, 5963 "column": 8,
5894 "line": 208 5964 "line": 209
5895 } 5965 }
5896 }, 5966 },
5897 { 5967 {
5898 "defaultMessage": "!!!Hide Others", 5968 "defaultMessage": "!!!Hide Others",
5899 "end": { 5969 "end": {
5900 "column": 3, 5970 "column": 3,
5901 "line": 215 5971 "line": 216
5902 }, 5972 },
5903 "file": "src/lib/Menu.js", 5973 "file": "src/lib/Menu.js",
5904 "id": "menu.app.hideOthers", 5974 "id": "menu.app.hideOthers",
5905 "start": { 5975 "start": {
5906 "column": 14, 5976 "column": 14,
5907 "line": 212 5977 "line": 213
5908 } 5978 }
5909 }, 5979 },
5910 { 5980 {
5911 "defaultMessage": "!!!Unhide", 5981 "defaultMessage": "!!!Unhide",
5912 "end": { 5982 "end": {
5913 "column": 3, 5983 "column": 3,
5914 "line": 219 5984 "line": 220
5915 }, 5985 },
5916 "file": "src/lib/Menu.js", 5986 "file": "src/lib/Menu.js",
5917 "id": "menu.app.unhide", 5987 "id": "menu.app.unhide",
5918 "start": { 5988 "start": {
5919 "column": 10, 5989 "column": 10,
5920 "line": 216 5990 "line": 217
5921 } 5991 }
5922 }, 5992 },
5923 { 5993 {
5924 "defaultMessage": "!!!Auto-hide menu bar", 5994 "defaultMessage": "!!!Auto-hide menu bar",
5925 "end": { 5995 "end": {
5926 "column": 3, 5996 "column": 3,
5927 "line": 223 5997 "line": 224
5928 }, 5998 },
5929 "file": "src/lib/Menu.js", 5999 "file": "src/lib/Menu.js",
5930 "id": "menu.app.autohideMenuBar", 6000 "id": "menu.app.autohideMenuBar",
5931 "start": { 6001 "start": {
5932 "column": 19, 6002 "column": 19,
5933 "line": 220 6003 "line": 221
5934 } 6004 }
5935 }, 6005 },
5936 { 6006 {
5937 "defaultMessage": "!!!Quit", 6007 "defaultMessage": "!!!Quit",
5938 "end": { 6008 "end": {
5939 "column": 3, 6009 "column": 3,
5940 "line": 227 6010 "line": 228
5941 }, 6011 },
5942 "file": "src/lib/Menu.js", 6012 "file": "src/lib/Menu.js",
5943 "id": "menu.app.quit", 6013 "id": "menu.app.quit",
5944 "start": { 6014 "start": {
5945 "column": 8, 6015 "column": 8,
5946 "line": 224 6016 "line": 225
5947 } 6017 }
5948 }, 6018 },
5949 { 6019 {
5950 "defaultMessage": "!!!Add New Service...", 6020 "defaultMessage": "!!!Add New Service...",
5951 "end": { 6021 "end": {
5952 "column": 3, 6022 "column": 3,
5953 "line": 231 6023 "line": 232
5954 }, 6024 },
5955 "file": "src/lib/Menu.js", 6025 "file": "src/lib/Menu.js",
5956 "id": "menu.services.addNewService", 6026 "id": "menu.services.addNewService",
5957 "start": { 6027 "start": {
5958 "column": 17, 6028 "column": 17,
5959 "line": 228 6029 "line": 229
5960 } 6030 }
5961 }, 6031 },
5962 { 6032 {
5963 "defaultMessage": "!!!Add New Workspace...", 6033 "defaultMessage": "!!!Add New Workspace...",
5964 "end": { 6034 "end": {
5965 "column": 3, 6035 "column": 3,
5966 "line": 235 6036 "line": 236
5967 }, 6037 },
5968 "file": "src/lib/Menu.js", 6038 "file": "src/lib/Menu.js",
5969 "id": "menu.workspaces.addNewWorkspace", 6039 "id": "menu.workspaces.addNewWorkspace",
5970 "start": { 6040 "start": {
5971 "column": 19, 6041 "column": 19,
5972 "line": 232 6042 "line": 233
5973 } 6043 }
5974 }, 6044 },
5975 { 6045 {
5976 "defaultMessage": "!!!Open workspace drawer", 6046 "defaultMessage": "!!!Open workspace drawer",
5977 "end": { 6047 "end": {
5978 "column": 3, 6048 "column": 3,
5979 "line": 239 6049 "line": 240
5980 }, 6050 },
5981 "file": "src/lib/Menu.js", 6051 "file": "src/lib/Menu.js",
5982 "id": "menu.workspaces.openWorkspaceDrawer", 6052 "id": "menu.workspaces.openWorkspaceDrawer",
5983 "start": { 6053 "start": {
5984 "column": 23, 6054 "column": 23,
5985 "line": 236 6055 "line": 237
5986 } 6056 }
5987 }, 6057 },
5988 { 6058 {
5989 "defaultMessage": "!!!Close workspace drawer", 6059 "defaultMessage": "!!!Close workspace drawer",
5990 "end": { 6060 "end": {
5991 "column": 3, 6061 "column": 3,
5992 "line": 243 6062 "line": 244
5993 }, 6063 },
5994 "file": "src/lib/Menu.js", 6064 "file": "src/lib/Menu.js",
5995 "id": "menu.workspaces.closeWorkspaceDrawer", 6065 "id": "menu.workspaces.closeWorkspaceDrawer",
5996 "start": { 6066 "start": {
5997 "column": 24, 6067 "column": 24,
5998 "line": 240 6068 "line": 241
5999 } 6069 }
6000 }, 6070 },
6001 { 6071 {
6002 "defaultMessage": "!!!Activate next service...", 6072 "defaultMessage": "!!!Activate next service...",
6003 "end": { 6073 "end": {
6004 "column": 3, 6074 "column": 3,
6005 "line": 247 6075 "line": 248
6006 }, 6076 },
6007 "file": "src/lib/Menu.js", 6077 "file": "src/lib/Menu.js",
6008 "id": "menu.services.setNextServiceActive", 6078 "id": "menu.services.setNextServiceActive",
6009 "start": { 6079 "start": {
6010 "column": 23, 6080 "column": 23,
6011 "line": 244 6081 "line": 245
6012 } 6082 }
6013 }, 6083 },
6014 { 6084 {
6015 "defaultMessage": "!!!Activate previous service...", 6085 "defaultMessage": "!!!Activate previous service...",
6016 "end": { 6086 "end": {
6017 "column": 3, 6087 "column": 3,
6018 "line": 251 6088 "line": 252
6019 }, 6089 },
6020 "file": "src/lib/Menu.js", 6090 "file": "src/lib/Menu.js",
6021 "id": "menu.services.activatePreviousService", 6091 "id": "menu.services.activatePreviousService",
6022 "start": { 6092 "start": {
6023 "column": 27, 6093 "column": 27,
6024 "line": 248 6094 "line": 249
6025 } 6095 }
6026 }, 6096 },
6027 { 6097 {
6028 "defaultMessage": "!!!Disable notifications & audio", 6098 "defaultMessage": "!!!Disable notifications & audio",
6029 "end": { 6099 "end": {
6030 "column": 3, 6100 "column": 3,
6031 "line": 255 6101 "line": 256
6032 }, 6102 },
6033 "file": "src/lib/Menu.js", 6103 "file": "src/lib/Menu.js",
6034 "id": "sidebar.muteApp", 6104 "id": "sidebar.muteApp",
6035 "start": { 6105 "start": {
6036 "column": 11, 6106 "column": 11,
6037 "line": 252 6107 "line": 253
6038 } 6108 }
6039 }, 6109 },
6040 { 6110 {
6041 "defaultMessage": "!!!Enable notifications & audio", 6111 "defaultMessage": "!!!Enable notifications & audio",
6042 "end": { 6112 "end": {
6043 "column": 3, 6113 "column": 3,
6044 "line": 259 6114 "line": 260
6045 }, 6115 },
6046 "file": "src/lib/Menu.js", 6116 "file": "src/lib/Menu.js",
6047 "id": "sidebar.unmuteApp", 6117 "id": "sidebar.unmuteApp",
6048 "start": { 6118 "start": {
6049 "column": 13, 6119 "column": 13,
6050 "line": 256 6120 "line": 257
6051 } 6121 }
6052 }, 6122 },
6053 { 6123 {
6054 "defaultMessage": "!!!Workspaces", 6124 "defaultMessage": "!!!Workspaces",
6055 "end": { 6125 "end": {
6056 "column": 3, 6126 "column": 3,
6057 "line": 263 6127 "line": 264
6058 }, 6128 },
6059 "file": "src/lib/Menu.js", 6129 "file": "src/lib/Menu.js",
6060 "id": "menu.workspaces", 6130 "id": "menu.workspaces",
6061 "start": { 6131 "start": {
6062 "column": 14, 6132 "column": 14,
6063 "line": 260 6133 "line": 261
6064 } 6134 }
6065 }, 6135 },
6066 { 6136 {
6067 "defaultMessage": "!!!Default", 6137 "defaultMessage": "!!!Default",
6068 "end": { 6138 "end": {
6069 "column": 3, 6139 "column": 3,
6070 "line": 267 6140 "line": 268
6071 }, 6141 },
6072 "file": "src/lib/Menu.js", 6142 "file": "src/lib/Menu.js",
6073 "id": "menu.workspaces.defaultWorkspace", 6143 "id": "menu.workspaces.defaultWorkspace",
6074 "start": { 6144 "start": {
6075 "column": 20, 6145 "column": 20,
6076 "line": 264 6146 "line": 265
6077 } 6147 }
6078 }, 6148 },
6079 { 6149 {
6080 "defaultMessage": "!!!Todos", 6150 "defaultMessage": "!!!Todos",
6081 "end": { 6151 "end": {
6082 "column": 3, 6152 "column": 3,
6083 "line": 271 6153 "line": 272
6084 }, 6154 },
6085 "file": "src/lib/Menu.js", 6155 "file": "src/lib/Menu.js",
6086 "id": "menu.todos", 6156 "id": "menu.todos",
6087 "start": { 6157 "start": {
6088 "column": 9, 6158 "column": 9,
6089 "line": 268 6159 "line": 269
6090 } 6160 }
6091 }, 6161 },
6092 { 6162 {
6093 "defaultMessage": "!!!Open Todos drawer", 6163 "defaultMessage": "!!!Open Todos drawer",
6094 "end": { 6164 "end": {
6095 "column": 3, 6165 "column": 3,
6096 "line": 275 6166 "line": 276
6097 }, 6167 },
6098 "file": "src/lib/Menu.js", 6168 "file": "src/lib/Menu.js",
6099 "id": "menu.Todoss.openTodosDrawer", 6169 "id": "menu.Todoss.openTodosDrawer",
6100 "start": { 6170 "start": {
6101 "column": 19, 6171 "column": 19,
6102 "line": 272 6172 "line": 273
6103 } 6173 }
6104 }, 6174 },
6105 { 6175 {
6106 "defaultMessage": "!!!Close Todos drawer", 6176 "defaultMessage": "!!!Close Todos drawer",
6107 "end": { 6177 "end": {
6108 "column": 3, 6178 "column": 3,
6109 "line": 279 6179 "line": 280
6110 }, 6180 },
6111 "file": "src/lib/Menu.js", 6181 "file": "src/lib/Menu.js",
6112 "id": "menu.Todoss.closeTodosDrawer", 6182 "id": "menu.Todoss.closeTodosDrawer",
6113 "start": { 6183 "start": {
6114 "column": 20, 6184 "column": 20,
6115 "line": 276 6185 "line": 277
6116 } 6186 }
6117 }, 6187 },
6118 { 6188 {
6119 "defaultMessage": "!!!Enable Todos", 6189 "defaultMessage": "!!!Enable Todos",
6120 "end": { 6190 "end": {
6121 "column": 3, 6191 "column": 3,
6122 "line": 283 6192 "line": 284
6123 }, 6193 },
6124 "file": "src/lib/Menu.js", 6194 "file": "src/lib/Menu.js",
6125 "id": "menu.todos.enableTodos", 6195 "id": "menu.todos.enableTodos",
6126 "start": { 6196 "start": {
6127 "column": 15, 6197 "column": 15,
6128 "line": 280 6198 "line": 281
6199 }
6200 },
6201 {
6202 "defaultMessage": "!!!Home",
6203 "end": {
6204 "column": 3,
6205 "line": 288
6206 },
6207 "file": "src/lib/Menu.js",
6208 "id": "menu.services.goHome",
6209 "start": {
6210 "column": 17,
6211 "line": 285
6129 } 6212 }
6130 } 6213 }
6131 ], 6214 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 319a55f28..140ca740b 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -102,6 +102,7 @@
102 "menu.services": "Services", 102 "menu.services": "Services",
103 "menu.services.activatePreviousService": "Activate previous service", 103 "menu.services.activatePreviousService": "Activate previous service",
104 "menu.services.addNewService": "Add New Service...", 104 "menu.services.addNewService": "Add New Service...",
105 "menu.services.goHome": "Home",
105 "menu.services.setNextServiceActive": "Activate next service", 106 "menu.services.setNextServiceActive": "Activate next service",
106 "menu.todos": "Todos", 107 "menu.todos": "Todos",
107 "menu.todos.enableTodos": "Enable Todos", 108 "menu.todos.enableTodos": "Enable Todos",
@@ -415,6 +416,11 @@
415 "validation.oneRequired": "At least one is required", 416 "validation.oneRequired": "At least one is required",
416 "validation.required": "{field} is required", 417 "validation.required": "{field} is required",
417 "validation.url": "{field} is not a valid URL", 418 "validation.url": "{field} is not a valid URL",
419 "webControls.back": "Back",
420 "webControls.forward": "Forward",
421 "webControls.goHome": "Home",
422 "webControls.openInBrowser": "Open in Browser",
423 "webControls.reload": "Reload",
418 "welcome.loginButton": "Login to your account", 424 "welcome.loginButton": "Login to your account",
419 "welcome.signupButton": "Create a free account", 425 "welcome.signupButton": "Create a free account",
420 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace", 426 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace",
diff --git a/src/i18n/locales/zh-HANT.json b/src/i18n/locales/zh-HANT.json
index 7d2c353ea..9dc68c697 100644
--- a/src/i18n/locales/zh-HANT.json
+++ b/src/i18n/locales/zh-HANT.json
@@ -227,6 +227,7 @@
227 "settings.app.form.enableSystemTray": "在系統匣上顯示", 227 "settings.app.form.enableSystemTray": "在系統匣上顯示",
228 "settings.app.form.enableTodos": "Enable Ferdi Todos", 228 "settings.app.form.enableTodos": "Enable Ferdi Todos",
229 "settings.app.form.hibernate": "Enable service hibernation", 229 "settings.app.form.hibernate": "Enable service hibernation",
230 "settings.app.form.hibernationStrategy": "Hibernation strategy",
230 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded", 231 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded",
231 "settings.app.form.language": "語言", 232 "settings.app.form.language": "語言",
232 "settings.app.form.lockPassword": "Ferdi Lock password", 233 "settings.app.form.lockPassword": "Ferdi Lock password",
@@ -247,6 +248,7 @@
247 "settings.app.headlineGeneral": "一般", 248 "settings.app.headlineGeneral": "一般",
248 "settings.app.headlineLanguage": "語言", 249 "settings.app.headlineLanguage": "語言",
249 "settings.app.headlineUpdates": "æ›´æ–°", 250 "settings.app.headlineUpdates": "æ›´æ–°",
251 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
250 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 252 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
251 "settings.app.lockInfo": "Ferdi password lock allows you to keep your messages protected.\nUsing Ferdi password lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 253 "settings.app.lockInfo": "Ferdi password lock allows you to keep your messages protected.\nUsing Ferdi password lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.",
252 "settings.app.lockedPassword": "Ferdi Lock Password", 254 "settings.app.lockedPassword": "Ferdi Lock Password",
diff --git a/src/i18n/messages/src/features/webControls/components/WebControls.json b/src/i18n/messages/src/features/webControls/components/WebControls.json
new file mode 100644
index 000000000..969437e98
--- /dev/null
+++ b/src/i18n/messages/src/features/webControls/components/WebControls.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "webControls.goHome",
4 "defaultMessage": "!!!Home",
5 "file": "src/features/webControls/components/WebControls.js",
6 "start": {
7 "line": 13,
8 "column": 10
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "webControls.openInBrowser",
17 "defaultMessage": "!!!Open in Browser",
18 "file": "src/features/webControls/components/WebControls.js",
19 "start": {
20 "line": 17,
21 "column": 17
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "webControls.back",
30 "defaultMessage": "!!!Back",
31 "file": "src/features/webControls/components/WebControls.js",
32 "start": {
33 "line": 21,
34 "column": 8
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "webControls.forward",
43 "defaultMessage": "!!!Forward",
44 "file": "src/features/webControls/components/WebControls.js",
45 "start": {
46 "line": 25,
47 "column": 11
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 },
54 {
55 "id": "webControls.reload",
56 "defaultMessage": "!!!Reload",
57 "file": "src/features/webControls/components/WebControls.js",
58 "start": {
59 "line": 29,
60 "column": 10
61 },
62 "end": {
63 "line": 32,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json
index 4ff190606..1b6664787 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!No services added yet", 4 "defaultMessage": "!!!No services added yet",
5 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", 5 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
6 "start": { 6 "start": {
7 "line": 12, 7 "line": 13,
8 "column": 22 8 "column": 22
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 15, 11 "line": 16,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!edit", 17 "defaultMessage": "!!!edit",
18 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", 18 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
19 "start": { 19 "start": {
20 "line": 16, 20 "line": 17,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 19, 24 "line": 20,
25 "column": 3 25 "column": 3
26 } 26 }
27 } 27 }
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index c09148b2f..f69d951fd 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Edit", 4 "defaultMessage": "!!!Edit",
5 "file": "src/lib/Menu.js", 5 "file": "src/lib/Menu.js",
6 "start": { 6 "start": {
7 "line": 16, 7 "line": 17,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 19, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Undo", 17 "defaultMessage": "!!!Undo",
18 "file": "src/lib/Menu.js", 18 "file": "src/lib/Menu.js",
19 "start": { 19 "start": {
20 "line": 20, 20 "line": 21,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 23, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Redo", 30 "defaultMessage": "!!!Redo",
31 "file": "src/lib/Menu.js", 31 "file": "src/lib/Menu.js",
32 "start": { 32 "start": {
33 "line": 24, 33 "line": 25,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 27, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Cut", 43 "defaultMessage": "!!!Cut",
44 "file": "src/lib/Menu.js", 44 "file": "src/lib/Menu.js",
45 "start": { 45 "start": {
46 "line": 28, 46 "line": 29,
47 "column": 7 47 "column": 7
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 31, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Copy", 56 "defaultMessage": "!!!Copy",
57 "file": "src/lib/Menu.js", 57 "file": "src/lib/Menu.js",
58 "start": { 58 "start": {
59 "line": 32, 59 "line": 33,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 35, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Paste", 69 "defaultMessage": "!!!Paste",
70 "file": "src/lib/Menu.js", 70 "file": "src/lib/Menu.js",
71 "start": { 71 "start": {
72 "line": 36, 72 "line": 37,
73 "column": 9 73 "column": 9
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 39, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Paste And Match Style", 82 "defaultMessage": "!!!Paste And Match Style",
83 "file": "src/lib/Menu.js", 83 "file": "src/lib/Menu.js",
84 "start": { 84 "start": {
85 "line": 40, 85 "line": 41,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 43, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Delete", 95 "defaultMessage": "!!!Delete",
96 "file": "src/lib/Menu.js", 96 "file": "src/lib/Menu.js",
97 "start": { 97 "start": {
98 "line": 44, 98 "line": 45,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 47, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Select All", 108 "defaultMessage": "!!!Select All",
109 "file": "src/lib/Menu.js", 109 "file": "src/lib/Menu.js",
110 "start": { 110 "start": {
111 "line": 48, 111 "line": 49,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 51, 115 "line": 52,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Speech", 121 "defaultMessage": "!!!Speech",
122 "file": "src/lib/Menu.js", 122 "file": "src/lib/Menu.js",
123 "start": { 123 "start": {
124 "line": 52, 124 "line": 53,
125 "column": 10 125 "column": 10
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 55, 128 "line": 56,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Start Speaking", 134 "defaultMessage": "!!!Start Speaking",
135 "file": "src/lib/Menu.js", 135 "file": "src/lib/Menu.js",
136 "start": { 136 "start": {
137 "line": 56, 137 "line": 57,
138 "column": 17 138 "column": 17
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 59, 141 "line": 60,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Stop Speaking", 147 "defaultMessage": "!!!Stop Speaking",
148 "file": "src/lib/Menu.js", 148 "file": "src/lib/Menu.js",
149 "start": { 149 "start": {
150 "line": 60, 150 "line": 61,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 63, 154 "line": 64,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Start Dictation", 160 "defaultMessage": "!!!Start Dictation",
161 "file": "src/lib/Menu.js", 161 "file": "src/lib/Menu.js",
162 "start": { 162 "start": {
163 "line": 64, 163 "line": 65,
164 "column": 18 164 "column": 18
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 67, 167 "line": 68,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Emoji & Symbols", 173 "defaultMessage": "!!!Emoji & Symbols",
174 "file": "src/lib/Menu.js", 174 "file": "src/lib/Menu.js",
175 "start": { 175 "start": {
176 "line": 68, 176 "line": 69,
177 "column": 16 177 "column": 16
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 71, 180 "line": 72,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Open Quick Switch", 186 "defaultMessage": "!!!Open Quick Switch",
187 "file": "src/lib/Menu.js", 187 "file": "src/lib/Menu.js",
188 "start": { 188 "start": {
189 "line": 72, 189 "line": 73,
190 "column": 19 190 "column": 19
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 75, 193 "line": 76,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Back", 199 "defaultMessage": "!!!Back",
200 "file": "src/lib/Menu.js", 200 "file": "src/lib/Menu.js",
201 "start": { 201 "start": {
202 "line": 76, 202 "line": 77,
203 "column": 8 203 "column": 8
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 79, 206 "line": 80,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Forward", 212 "defaultMessage": "!!!Forward",
213 "file": "src/lib/Menu.js", 213 "file": "src/lib/Menu.js",
214 "start": { 214 "start": {
215 "line": 80, 215 "line": 81,
216 "column": 11 216 "column": 11
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 83, 219 "line": 84,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Actual Size", 225 "defaultMessage": "!!!Actual Size",
226 "file": "src/lib/Menu.js", 226 "file": "src/lib/Menu.js",
227 "start": { 227 "start": {
228 "line": 84, 228 "line": 85,
229 "column": 13 229 "column": 13
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 87, 232 "line": 88,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Zoom In", 238 "defaultMessage": "!!!Zoom In",
239 "file": "src/lib/Menu.js", 239 "file": "src/lib/Menu.js",
240 "start": { 240 "start": {
241 "line": 88, 241 "line": 89,
242 "column": 10 242 "column": 10
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 91, 245 "line": 92,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Zoom Out", 251 "defaultMessage": "!!!Zoom Out",
252 "file": "src/lib/Menu.js", 252 "file": "src/lib/Menu.js",
253 "start": { 253 "start": {
254 "line": 92, 254 "line": 93,
255 "column": 11 255 "column": 11
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 95, 258 "line": 96,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Enter Full Screen", 264 "defaultMessage": "!!!Enter Full Screen",
265 "file": "src/lib/Menu.js", 265 "file": "src/lib/Menu.js",
266 "start": { 266 "start": {
267 "line": 96, 267 "line": 97,
268 "column": 19 268 "column": 19
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 99, 271 "line": 100,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Exit Full Screen", 277 "defaultMessage": "!!!Exit Full Screen",
278 "file": "src/lib/Menu.js", 278 "file": "src/lib/Menu.js",
279 "start": { 279 "start": {
280 "line": 100, 280 "line": 101,
281 "column": 18 281 "column": 18
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 103, 284 "line": 104,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Toggle Full Screen", 290 "defaultMessage": "!!!Toggle Full Screen",
291 "file": "src/lib/Menu.js", 291 "file": "src/lib/Menu.js",
292 "start": { 292 "start": {
293 "line": 104, 293 "line": 105,
294 "column": 20 294 "column": 20
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 107, 297 "line": 108,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Toggle Developer Tools", 303 "defaultMessage": "!!!Toggle Developer Tools",
304 "file": "src/lib/Menu.js", 304 "file": "src/lib/Menu.js",
305 "start": { 305 "start": {
306 "line": 108, 306 "line": 109,
307 "column": 18 307 "column": 18
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 111, 310 "line": 112,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Toggle Todos Developer Tools", 316 "defaultMessage": "!!!Toggle Todos Developer Tools",
317 "file": "src/lib/Menu.js", 317 "file": "src/lib/Menu.js",
318 "start": { 318 "start": {
319 "line": 112, 319 "line": 113,
320 "column": 23 320 "column": 23
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 115, 323 "line": 116,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Toggle Service Developer Tools", 329 "defaultMessage": "!!!Toggle Service Developer Tools",
330 "file": "src/lib/Menu.js", 330 "file": "src/lib/Menu.js",
331 "start": { 331 "start": {
332 "line": 116, 332 "line": 117,
333 "column": 25 333 "column": 25
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 119, 336 "line": 120,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Reload Service", 342 "defaultMessage": "!!!Reload Service",
343 "file": "src/lib/Menu.js", 343 "file": "src/lib/Menu.js",
344 "start": { 344 "start": {
345 "line": 120, 345 "line": 121,
346 "column": 17 346 "column": 17
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 123, 349 "line": 124,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Reload Ferdi", 355 "defaultMessage": "!!!Reload Ferdi",
356 "file": "src/lib/Menu.js", 356 "file": "src/lib/Menu.js",
357 "start": { 357 "start": {
358 "line": 124, 358 "line": 125,
359 "column": 15 359 "column": 15
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 127, 362 "line": 128,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Lock Ferdi", 368 "defaultMessage": "!!!Lock Ferdi",
369 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
370 "start": { 370 "start": {
371 "line": 128, 371 "line": 129,
372 "column": 13 372 "column": 13
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 131, 375 "line": 132,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Minimize", 381 "defaultMessage": "!!!Minimize",
382 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
383 "start": { 383 "start": {
384 "line": 132, 384 "line": 133,
385 "column": 12 385 "column": 12
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 135, 388 "line": 136,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Close", 394 "defaultMessage": "!!!Close",
395 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
396 "start": { 396 "start": {
397 "line": 136, 397 "line": 137,
398 "column": 9 398 "column": 9
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 139, 401 "line": 140,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!Learn More", 407 "defaultMessage": "!!!Learn More",
408 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
409 "start": { 409 "start": {
410 "line": 140, 410 "line": 141,
411 "column": 13 411 "column": 13
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 143, 414 "line": 144,
415 "column": 3 415 "column": 3
416 } 416 }
417 }, 417 },
@@ -420,11 +420,11 @@
420 "defaultMessage": "!!!Changelog", 420 "defaultMessage": "!!!Changelog",
421 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
422 "start": { 422 "start": {
423 "line": 144, 423 "line": 145,
424 "column": 13 424 "column": 13
425 }, 425 },
426 "end": { 426 "end": {
427 "line": 147, 427 "line": 148,
428 "column": 3 428 "column": 3
429 } 429 }
430 }, 430 },
@@ -433,11 +433,11 @@
433 "defaultMessage": "!!!Support", 433 "defaultMessage": "!!!Support",
434 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
435 "start": { 435 "start": {
436 "line": 148, 436 "line": 149,
437 "column": 11 437 "column": 11
438 }, 438 },
439 "end": { 439 "end": {
440 "line": 151, 440 "line": 152,
441 "column": 3 441 "column": 3
442 } 442 }
443 }, 443 },
@@ -446,11 +446,11 @@
446 "defaultMessage": "!!!Copy Debug Information", 446 "defaultMessage": "!!!Copy Debug Information",
447 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
448 "start": { 448 "start": {
449 "line": 152, 449 "line": 153,
450 "column": 13 450 "column": 13
451 }, 451 },
452 "end": { 452 "end": {
453 "line": 155, 453 "line": 156,
454 "column": 3 454 "column": 3
455 } 455 }
456 }, 456 },
@@ -459,11 +459,11 @@
459 "defaultMessage": "!!!Ferdi Debug Information", 459 "defaultMessage": "!!!Ferdi Debug Information",
460 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
461 "start": { 461 "start": {
462 "line": 156, 462 "line": 157,
463 "column": 27 463 "column": 27
464 }, 464 },
465 "end": { 465 "end": {
466 "line": 159, 466 "line": 160,
467 "column": 3 467 "column": 3
468 } 468 }
469 }, 469 },
@@ -472,11 +472,11 @@
472 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 472 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
473 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
474 "start": { 474 "start": {
475 "line": 160, 475 "line": 161,
476 "column": 23 476 "column": 23
477 }, 477 },
478 "end": { 478 "end": {
479 "line": 163, 479 "line": 164,
480 "column": 3 480 "column": 3
481 } 481 }
482 }, 482 },
@@ -485,11 +485,11 @@
485 "defaultMessage": "!!!Terms of Service", 485 "defaultMessage": "!!!Terms of Service",
486 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
487 "start": { 487 "start": {
488 "line": 164, 488 "line": 165,
489 "column": 7 489 "column": 7
490 }, 490 },
491 "end": { 491 "end": {
492 "line": 167, 492 "line": 168,
493 "column": 3 493 "column": 3
494 } 494 }
495 }, 495 },
@@ -498,11 +498,11 @@
498 "defaultMessage": "!!!Privacy Statement", 498 "defaultMessage": "!!!Privacy Statement",
499 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
500 "start": { 500 "start": {
501 "line": 168, 501 "line": 169,
502 "column": 11 502 "column": 11
503 }, 503 },
504 "end": { 504 "end": {
505 "line": 171, 505 "line": 172,
506 "column": 3 506 "column": 3
507 } 507 }
508 }, 508 },
@@ -511,11 +511,11 @@
511 "defaultMessage": "!!!File", 511 "defaultMessage": "!!!File",
512 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
513 "start": { 513 "start": {
514 "line": 172, 514 "line": 173,
515 "column": 8 515 "column": 8
516 }, 516 },
517 "end": { 517 "end": {
518 "line": 175, 518 "line": 176,
519 "column": 3 519 "column": 3
520 } 520 }
521 }, 521 },
@@ -524,11 +524,11 @@
524 "defaultMessage": "!!!View", 524 "defaultMessage": "!!!View",
525 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
526 "start": { 526 "start": {
527 "line": 176, 527 "line": 177,
528 "column": 8 528 "column": 8
529 }, 529 },
530 "end": { 530 "end": {
531 "line": 179, 531 "line": 180,
532 "column": 3 532 "column": 3
533 } 533 }
534 }, 534 },
@@ -537,11 +537,11 @@
537 "defaultMessage": "!!!Services", 537 "defaultMessage": "!!!Services",
538 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
539 "start": { 539 "start": {
540 "line": 180, 540 "line": 181,
541 "column": 12 541 "column": 12
542 }, 542 },
543 "end": { 543 "end": {
544 "line": 183, 544 "line": 184,
545 "column": 3 545 "column": 3
546 } 546 }
547 }, 547 },
@@ -550,11 +550,11 @@
550 "defaultMessage": "!!!Window", 550 "defaultMessage": "!!!Window",
551 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
552 "start": { 552 "start": {
553 "line": 184, 553 "line": 185,
554 "column": 10 554 "column": 10
555 }, 555 },
556 "end": { 556 "end": {
557 "line": 187, 557 "line": 188,
558 "column": 3 558 "column": 3
559 } 559 }
560 }, 560 },
@@ -563,11 +563,11 @@
563 "defaultMessage": "!!!Help", 563 "defaultMessage": "!!!Help",
564 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
565 "start": { 565 "start": {
566 "line": 188, 566 "line": 189,
567 "column": 8 567 "column": 8
568 }, 568 },
569 "end": { 569 "end": {
570 "line": 191, 570 "line": 192,
571 "column": 3 571 "column": 3
572 } 572 }
573 }, 573 },
@@ -576,11 +576,11 @@
576 "defaultMessage": "!!!About Ferdi", 576 "defaultMessage": "!!!About Ferdi",
577 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
578 "start": { 578 "start": {
579 "line": 192, 579 "line": 193,
580 "column": 9 580 "column": 9
581 }, 581 },
582 "end": { 582 "end": {
583 "line": 195, 583 "line": 196,
584 "column": 3 584 "column": 3
585 } 585 }
586 }, 586 },
@@ -589,11 +589,11 @@
589 "defaultMessage": "!!!What's new?", 589 "defaultMessage": "!!!What's new?",
590 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
591 "start": { 591 "start": {
592 "line": 196, 592 "line": 197,
593 "column": 16 593 "column": 16
594 }, 594 },
595 "end": { 595 "end": {
596 "line": 199, 596 "line": 200,
597 "column": 3 597 "column": 3
598 } 598 }
599 }, 599 },
@@ -602,11 +602,11 @@
602 "defaultMessage": "!!!Settings", 602 "defaultMessage": "!!!Settings",
603 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
604 "start": { 604 "start": {
605 "line": 200, 605 "line": 201,
606 "column": 12 606 "column": 12
607 }, 607 },
608 "end": { 608 "end": {
609 "line": 203, 609 "line": 204,
610 "column": 3 610 "column": 3
611 } 611 }
612 }, 612 },
@@ -615,11 +615,11 @@
615 "defaultMessage": "!!!Check for updates", 615 "defaultMessage": "!!!Check for updates",
616 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
617 "start": { 617 "start": {
618 "line": 204, 618 "line": 205,
619 "column": 19 619 "column": 19
620 }, 620 },
621 "end": { 621 "end": {
622 "line": 207, 622 "line": 208,
623 "column": 3 623 "column": 3
624 } 624 }
625 }, 625 },
@@ -628,11 +628,11 @@
628 "defaultMessage": "!!!Hide", 628 "defaultMessage": "!!!Hide",
629 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
630 "start": { 630 "start": {
631 "line": 208, 631 "line": 209,
632 "column": 8 632 "column": 8
633 }, 633 },
634 "end": { 634 "end": {
635 "line": 211, 635 "line": 212,
636 "column": 3 636 "column": 3
637 } 637 }
638 }, 638 },
@@ -641,11 +641,11 @@
641 "defaultMessage": "!!!Hide Others", 641 "defaultMessage": "!!!Hide Others",
642 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
643 "start": { 643 "start": {
644 "line": 212, 644 "line": 213,
645 "column": 14 645 "column": 14
646 }, 646 },
647 "end": { 647 "end": {
648 "line": 215, 648 "line": 216,
649 "column": 3 649 "column": 3
650 } 650 }
651 }, 651 },
@@ -654,11 +654,11 @@
654 "defaultMessage": "!!!Unhide", 654 "defaultMessage": "!!!Unhide",
655 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
656 "start": { 656 "start": {
657 "line": 216, 657 "line": 217,
658 "column": 10 658 "column": 10
659 }, 659 },
660 "end": { 660 "end": {
661 "line": 219, 661 "line": 220,
662 "column": 3 662 "column": 3
663 } 663 }
664 }, 664 },
@@ -667,11 +667,11 @@
667 "defaultMessage": "!!!Auto-hide menu bar", 667 "defaultMessage": "!!!Auto-hide menu bar",
668 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
669 "start": { 669 "start": {
670 "line": 220, 670 "line": 221,
671 "column": 19 671 "column": 19
672 }, 672 },
673 "end": { 673 "end": {
674 "line": 223, 674 "line": 224,
675 "column": 3 675 "column": 3
676 } 676 }
677 }, 677 },
@@ -680,11 +680,11 @@
680 "defaultMessage": "!!!Quit", 680 "defaultMessage": "!!!Quit",
681 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
682 "start": { 682 "start": {
683 "line": 224, 683 "line": 225,
684 "column": 8 684 "column": 8
685 }, 685 },
686 "end": { 686 "end": {
687 "line": 227, 687 "line": 228,
688 "column": 3 688 "column": 3
689 } 689 }
690 }, 690 },
@@ -693,11 +693,11 @@
693 "defaultMessage": "!!!Add New Service...", 693 "defaultMessage": "!!!Add New Service...",
694 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
695 "start": { 695 "start": {
696 "line": 228, 696 "line": 229,
697 "column": 17 697 "column": 17
698 }, 698 },
699 "end": { 699 "end": {
700 "line": 231, 700 "line": 232,
701 "column": 3 701 "column": 3
702 } 702 }
703 }, 703 },
@@ -706,11 +706,11 @@
706 "defaultMessage": "!!!Add New Workspace...", 706 "defaultMessage": "!!!Add New Workspace...",
707 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
708 "start": { 708 "start": {
709 "line": 232, 709 "line": 233,
710 "column": 19 710 "column": 19
711 }, 711 },
712 "end": { 712 "end": {
713 "line": 235, 713 "line": 236,
714 "column": 3 714 "column": 3
715 } 715 }
716 }, 716 },
@@ -719,11 +719,11 @@
719 "defaultMessage": "!!!Open workspace drawer", 719 "defaultMessage": "!!!Open workspace drawer",
720 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
721 "start": { 721 "start": {
722 "line": 236, 722 "line": 237,
723 "column": 23 723 "column": 23
724 }, 724 },
725 "end": { 725 "end": {
726 "line": 239, 726 "line": 240,
727 "column": 3 727 "column": 3
728 } 728 }
729 }, 729 },
@@ -732,11 +732,11 @@
732 "defaultMessage": "!!!Close workspace drawer", 732 "defaultMessage": "!!!Close workspace drawer",
733 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
734 "start": { 734 "start": {
735 "line": 240, 735 "line": 241,
736 "column": 24 736 "column": 24
737 }, 737 },
738 "end": { 738 "end": {
739 "line": 243, 739 "line": 244,
740 "column": 3 740 "column": 3
741 } 741 }
742 }, 742 },
@@ -745,11 +745,11 @@
745 "defaultMessage": "!!!Activate next service...", 745 "defaultMessage": "!!!Activate next service...",
746 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
747 "start": { 747 "start": {
748 "line": 244, 748 "line": 245,
749 "column": 23 749 "column": 23
750 }, 750 },
751 "end": { 751 "end": {
752 "line": 247, 752 "line": 248,
753 "column": 3 753 "column": 3
754 } 754 }
755 }, 755 },
@@ -758,11 +758,11 @@
758 "defaultMessage": "!!!Activate previous service...", 758 "defaultMessage": "!!!Activate previous service...",
759 "file": "src/lib/Menu.js", 759 "file": "src/lib/Menu.js",
760 "start": { 760 "start": {
761 "line": 248, 761 "line": 249,
762 "column": 27 762 "column": 27
763 }, 763 },
764 "end": { 764 "end": {
765 "line": 251, 765 "line": 252,
766 "column": 3 766 "column": 3
767 } 767 }
768 }, 768 },
@@ -771,11 +771,11 @@
771 "defaultMessage": "!!!Disable notifications & audio", 771 "defaultMessage": "!!!Disable notifications & audio",
772 "file": "src/lib/Menu.js", 772 "file": "src/lib/Menu.js",
773 "start": { 773 "start": {
774 "line": 252, 774 "line": 253,
775 "column": 11 775 "column": 11
776 }, 776 },
777 "end": { 777 "end": {
778 "line": 255, 778 "line": 256,
779 "column": 3 779 "column": 3
780 } 780 }
781 }, 781 },
@@ -784,11 +784,11 @@
784 "defaultMessage": "!!!Enable notifications & audio", 784 "defaultMessage": "!!!Enable notifications & audio",
785 "file": "src/lib/Menu.js", 785 "file": "src/lib/Menu.js",
786 "start": { 786 "start": {
787 "line": 256, 787 "line": 257,
788 "column": 13 788 "column": 13
789 }, 789 },
790 "end": { 790 "end": {
791 "line": 259, 791 "line": 260,
792 "column": 3 792 "column": 3
793 } 793 }
794 }, 794 },
@@ -797,11 +797,11 @@
797 "defaultMessage": "!!!Workspaces", 797 "defaultMessage": "!!!Workspaces",
798 "file": "src/lib/Menu.js", 798 "file": "src/lib/Menu.js",
799 "start": { 799 "start": {
800 "line": 260, 800 "line": 261,
801 "column": 14 801 "column": 14
802 }, 802 },
803 "end": { 803 "end": {
804 "line": 263, 804 "line": 264,
805 "column": 3 805 "column": 3
806 } 806 }
807 }, 807 },
@@ -810,11 +810,11 @@
810 "defaultMessage": "!!!Default", 810 "defaultMessage": "!!!Default",
811 "file": "src/lib/Menu.js", 811 "file": "src/lib/Menu.js",
812 "start": { 812 "start": {
813 "line": 264, 813 "line": 265,
814 "column": 20 814 "column": 20
815 }, 815 },
816 "end": { 816 "end": {
817 "line": 267, 817 "line": 268,
818 "column": 3 818 "column": 3
819 } 819 }
820 }, 820 },
@@ -823,11 +823,11 @@
823 "defaultMessage": "!!!Todos", 823 "defaultMessage": "!!!Todos",
824 "file": "src/lib/Menu.js", 824 "file": "src/lib/Menu.js",
825 "start": { 825 "start": {
826 "line": 268, 826 "line": 269,
827 "column": 9 827 "column": 9
828 }, 828 },
829 "end": { 829 "end": {
830 "line": 271, 830 "line": 272,
831 "column": 3 831 "column": 3
832 } 832 }
833 }, 833 },
@@ -836,11 +836,11 @@
836 "defaultMessage": "!!!Open Todos drawer", 836 "defaultMessage": "!!!Open Todos drawer",
837 "file": "src/lib/Menu.js", 837 "file": "src/lib/Menu.js",
838 "start": { 838 "start": {
839 "line": 272, 839 "line": 273,
840 "column": 19 840 "column": 19
841 }, 841 },
842 "end": { 842 "end": {
843 "line": 275, 843 "line": 276,
844 "column": 3 844 "column": 3
845 } 845 }
846 }, 846 },
@@ -849,11 +849,11 @@
849 "defaultMessage": "!!!Close Todos drawer", 849 "defaultMessage": "!!!Close Todos drawer",
850 "file": "src/lib/Menu.js", 850 "file": "src/lib/Menu.js",
851 "start": { 851 "start": {
852 "line": 276, 852 "line": 277,
853 "column": 20 853 "column": 20
854 }, 854 },
855 "end": { 855 "end": {
856 "line": 279, 856 "line": 280,
857 "column": 3 857 "column": 3
858 } 858 }
859 }, 859 },
@@ -862,11 +862,24 @@
862 "defaultMessage": "!!!Enable Todos", 862 "defaultMessage": "!!!Enable Todos",
863 "file": "src/lib/Menu.js", 863 "file": "src/lib/Menu.js",
864 "start": { 864 "start": {
865 "line": 280, 865 "line": 281,
866 "column": 15 866 "column": 15
867 }, 867 },
868 "end": { 868 "end": {
869 "line": 283, 869 "line": 284,
870 "column": 3
871 }
872 },
873 {
874 "id": "menu.services.goHome",
875 "defaultMessage": "!!!Home",
876 "file": "src/lib/Menu.js",
877 "start": {
878 "line": 285,
879 "column": 17
880 },
881 "end": {
882 "line": 288,
870 "column": 3 883 "column": 3
871 } 884 }
872 } 885 }
diff --git a/src/index.js b/src/index.js
index 449bbad19..2ee404c0b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -336,22 +336,7 @@ app.on('login', (event, webContents, request, authInfo, callback) => {
336 debug('browser login event', authInfo); 336 debug('browser login event', authInfo);
337 event.preventDefault(); 337 event.preventDefault();
338 338
339 if (authInfo.isProxy && authInfo.scheme === 'basic') { 339 if (!authInfo.isProxy && authInfo.scheme === 'basic') {
340 debug('Sending service echo ping');
341 webContents.send('get-service-id');
342
343 ipcMain.once('service-id', (e, id) => {
344 debug('Received service id', id);
345
346 const ps = proxySettings.get(id);
347 if (ps) {
348 debug('Sending proxy auth callback for service', id);
349 callback(ps.user, ps.password);
350 } else {
351 debug('No proxy auth config found for', id);
352 }
353 });
354 } else if (authInfo.scheme === 'basic') {
355 debug('basic auth handler', authInfo); 340 debug('basic auth handler', authInfo);
356 basicAuthHandler(mainWindow, authInfo); 341 basicAuthHandler(mainWindow, authInfo);
357 } 342 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 01aee6f5c..f223283f9 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -9,6 +9,7 @@ import { announcementActions } from '../features/announcements/actions';
9import { announcementsStore } from '../features/announcements'; 9import { announcementsStore } from '../features/announcements';
10import { todosStore } from '../features/todos'; 10import { todosStore } from '../features/todos';
11import { todoActions } from '../features/todos/actions'; 11import { todoActions } from '../features/todos/actions';
12import { CUSTOM_WEBSITE_ID } from '../features/webControls/constants';
12 13
13const { app, Menu, dialog } = remote; 14const { app, Menu, dialog } = remote;
14 15
@@ -281,6 +282,10 @@ const menuItems = defineMessages({
281 id: 'menu.todos.enableTodos', 282 id: 'menu.todos.enableTodos',
282 defaultMessage: '!!!Enable Todos', 283 defaultMessage: '!!!Enable Todos',
283 }, 284 },
285 serviceGoHome: {
286 id: 'menu.services.goHome',
287 defaultMessage: '!!!Home',
288 },
284}); 289});
285 290
286function getActiveWebview() { 291function getActiveWebview() {
@@ -767,8 +772,12 @@ export default class FranzMenu {
767 accelerator: `${cmdKey}+R`, 772 accelerator: `${cmdKey}+R`,
768 click: () => { 773 click: () => {
769 if (this.stores.user.isLoggedIn 774 if (this.stores.user.isLoggedIn
770 && this.stores.services.enabled.length > 0) { 775 && this.stores.services.enabled.length > 0) {
771 this.actions.service.reloadActive(); 776 if (this.stores.services.active.recipe.id === CUSTOM_WEBSITE_ID) {
777 this.stores.services.active.webview.reload();
778 } else {
779 this.actions.service.reloadActive();
780 }
772 } else { 781 } else {
773 window.location.reload(); 782 window.location.reload();
774 } 783 }
@@ -995,6 +1004,16 @@ export default class FranzMenu {
995 }, 1004 },
996 }))); 1005 })));
997 1006
1007 if (services.active && services.active.recipe.id === CUSTOM_WEBSITE_ID) {
1008 menu.push({
1009 type: 'separator',
1010 }, {
1011 label: intl.formatMessage(menuItems.serviceGoHome),
1012 accelerator: `${cmdKey}+shift+H`,
1013 click: () => this.actions.service.reloadActive(),
1014 });
1015 }
1016
998 return menu; 1017 return menu;
999 } 1018 }
1000 1019
diff --git a/src/models/Service.js b/src/models/Service.js
index 3ab6e2603..ddc169d47 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -192,19 +192,24 @@ export default class Service {
192 return userAgent; 192 return userAgent;
193 } 193 }
194 194
195 initializeWebViewEvents({ handleIPCMessage, openWindow }) { 195 initializeWebViewEvents({ handleIPCMessage, openWindow, stores }) {
196 const webContents = this.webview.getWebContents();
197
196 this.webview.addEventListener('ipc-message', e => handleIPCMessage({ 198 this.webview.addEventListener('ipc-message', e => handleIPCMessage({
197 serviceId: this.id, 199 serviceId: this.id,
198 channel: e.channel, 200 channel: e.channel,
199 args: e.args, 201 args: e.args,
200 })); 202 }));
201 203
202 this.webview.addEventListener('new-window', (event, url, frameName, options) => openWindow({ 204 this.webview.addEventListener('new-window', (event, url, frameName, options) => {
203 event, 205 console.log('open window', event, url, frameName, options);
204 url, 206 openWindow({
205 frameName, 207 event,
206 options, 208 url,
207 })); 209 frameName,
210 options,
211 });
212 });
208 213
209 this.webview.addEventListener('did-start-loading', (event) => { 214 this.webview.addEventListener('did-start-loading', (event) => {
210 debug('Did start load', this.name, event); 215 debug('Did start load', this.name, event);
@@ -238,6 +243,28 @@ export default class Service {
238 debug('Service crashed', this.name); 243 debug('Service crashed', this.name);
239 this.hasCrashed = true; 244 this.hasCrashed = true;
240 }); 245 });
246
247 webContents.on('login', (event, request, authInfo, callback) => {
248 // const authCallback = callback;
249 debug('browser login event', authInfo);
250 event.preventDefault();
251
252 if (authInfo.isProxy && authInfo.scheme === 'basic') {
253 debug('Sending service echo ping');
254 webContents.send('get-service-id');
255
256 debug('Received service id', this.id);
257
258 const ps = stores.settings.proxy[this.id];
259
260 if (ps) {
261 debug('Sending proxy auth callback for service', this.id);
262 callback(ps.user, ps.password);
263 } else {
264 debug('No proxy auth config found for', this.id);
265 }
266 }
267 });
241 } 268 }
242 269
243 initializeWebViewListener() { 270 initializeWebViewListener() {
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 3173004d4..076ecc204 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -370,6 +370,7 @@ export default class ServicesStore extends Store {
370 service.initializeWebViewEvents({ 370 service.initializeWebViewEvents({
371 handleIPCMessage: this.actions.service.handleIPCMessage, 371 handleIPCMessage: this.actions.service.handleIPCMessage,
372 openWindow: this.actions.service.openWindow, 372 openWindow: this.actions.service.openWindow,
373 stores: this.stores,
373 }); 374 });
374 service.initializeWebViewListener(); 375 service.initializeWebViewListener();
375 } 376 }
@@ -727,6 +728,8 @@ export default class ServicesStore extends Store {
727 const serviceData = data; 728 const serviceData = data;
728 const recipe = this.stores.recipes.one(recipeId); 729 const recipe = this.stores.recipes.one(recipeId);
729 730
731 if (!recipe) return;
732
730 if (recipe.hasTeamId && recipe.hasCustomUrl && data.team && data.customUrl) { 733 if (recipe.hasTeamId && recipe.hasCustomUrl && data.team && data.customUrl) {
731 delete serviceData.team; 734 delete serviceData.team;
732 } 735 }
diff --git a/src/webview/recipe.js b/src/webview/recipe.js
index b30199f03..3f2338b68 100644
--- a/src/webview/recipe.js
+++ b/src/webview/recipe.js
@@ -19,6 +19,7 @@ import contextMenu from './contextMenu';
19import './notifications'; 19import './notifications';
20 20
21import { DEFAULT_APP_SETTINGS } from '../config'; 21import { DEFAULT_APP_SETTINGS } from '../config';
22import { isDevMode } from '../environment';
22 23
23const debug = require('debug')('Ferdi:Plugin'); 24const debug = require('debug')('Ferdi:Plugin');
24 25
@@ -39,7 +40,7 @@ class RecipeController {
39 'settings-update': 'updateAppSettings', 40 'settings-update': 'updateAppSettings',
40 'service-settings-update': 'updateServiceSettings', 41 'service-settings-update': 'updateServiceSettings',
41 'get-service-id': 'serviceIdEcho', 42 'get-service-id': 'serviceIdEcho',
42 } 43 };
43 44
44 constructor() { 45 constructor() {
45 this.initialize(); 46 this.initialize();
@@ -195,6 +196,7 @@ new RecipeController();
195// Patching window.open 196// Patching window.open
196const originalWindowOpen = window.open; 197const originalWindowOpen = window.open;
197 198
199
198window.open = (url, frameName, features) => { 200window.open = (url, frameName, features) => {
199 if (!url && !frameName && !features) { 201 if (!url && !frameName && !features) {
200 // The service hasn't yet supplied a URL (as used in Skype). 202 // The service hasn't yet supplied a URL (as used in Skype).
@@ -209,7 +211,7 @@ window.open = (url, frameName, features) => {
209 // Has the service changed the URL yet? 211 // Has the service changed the URL yet?
210 if (newWindow.location.href !== '') { 212 if (newWindow.location.href !== '') {
211 // Open the new URL 213 // Open the new URL
212 window.open(newWindow.location.href); 214 ipcRenderer.sendToHost('new-window', newWindow.location.href);
213 clearInterval(checkInterval); 215 clearInterval(checkInterval);
214 } 216 }
215 }, 0); 217 }, 0);
@@ -223,9 +225,13 @@ window.open = (url, frameName, features) => {
223 } 225 }
224 226
225 // We need to differentiate if the link should be opened in a popup or in the systems default browser 227 // We need to differentiate if the link should be opened in a popup or in the systems default browser
226 if (!frameName && !features) { 228 if (!frameName && !features && typeof features !== 'string') {
227 return ipcRenderer.sendToHost('new-window', url); 229 return ipcRenderer.sendToHost('new-window', url);
228 } 230 }
229 231
230 return originalWindowOpen(url, frameName, features); 232 return originalWindowOpen(url, frameName, features);
231}; 233};
234
235if (isDevMode) {
236 window.log = console.log;
237}