aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--src/app.js2
-rw-r--r--src/components/auth/Locked.js115
-rw-r--r--src/components/layout/Sidebar.js27
-rw-r--r--src/components/settings/settings/EditSettingsForm.js42
-rw-r--r--src/config.js5
-rw-r--r--src/containers/auth/LockedScreen.js72
-rw-r--r--src/containers/settings/EditSettingsScreen.js25
-rw-r--r--src/i18n/locales/defaultMessages.json400
-rw-r--r--src/i18n/locales/en-US.json11
-rw-r--r--src/i18n/messages/src/components/auth/Locked.json67
-rw-r--r--src/i18n/messages/src/components/layout/Sidebar.json13
-rw-r--r--src/i18n/messages/src/components/settings/settings/EditSettingsForm.json90
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json62
-rw-r--r--src/i18n/messages/src/lib/Menu.json165
-rw-r--r--src/lib/Menu.js19
-rw-r--r--src/stores/SettingsStore.js28
17 files changed, 888 insertions, 256 deletions
diff --git a/README.md b/README.md
index e4cdd9bdb..d6f53adac 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,7 @@ You can find the installers in the [latest release](https://github.com/kytwb/fer
25- [x] Makes all users Premium by default 25- [x] Makes all users Premium by default
26- [x] [Add option to change server to a custom](https://github.com/kytwb/ferdi/wiki/Custom-Server) [ferdi-server](https://github.com/vantezzen/ferdi-server) 26- [x] [Add option to change server to a custom](https://github.com/kytwb/ferdi/wiki/Custom-Server) [ferdi-server](https://github.com/vantezzen/ferdi-server)
27- [x] Add "Private Notification"-Mode, that hides message content from notifications (as suggested in [meetfranz/franz#879](https://github.com/meetfranz/franz/issues/879)) 27- [x] Add "Private Notification"-Mode, that hides message content from notifications (as suggested in [meetfranz/franz#879](https://github.com/meetfranz/franz/issues/879))
28- [x] Add Password Lock feature to keep your messages protected. ([ferdi#41](https://github.com/kytwb/ferdi/issues/41) and [meetfranz#810](https://github.com/meetfranz/franz/issues/810))
28- [x] [Add CTRL+← and CTRL+→ shortcuts and menu options to go back and forward in the service browsing history](https://github.com/kytwb/ferdi/issues/39) 29- [x] [Add CTRL+← and CTRL+→ shortcuts and menu options to go back and forward in the service browsing history](https://github.com/kytwb/ferdi/issues/39)
29- [x] Add "npm run prepare-code" command for development to lint and beautify code 30- [x] Add "npm run prepare-code" command for development to lint and beautify code
30- [x] Remove "Franz is better together" popup 31- [x] Remove "Franz is better together" popup
diff --git a/src/app.js b/src/app.js
index 797c178a3..e16c01456 100644
--- a/src/app.js
+++ b/src/app.js
@@ -32,6 +32,7 @@ import EditSettingsScreen from './containers/settings/EditSettingsScreen';
32import InviteSettingsScreen from './containers/settings/InviteScreen'; 32import InviteSettingsScreen from './containers/settings/InviteScreen';
33import WelcomeScreen from './containers/auth/WelcomeScreen'; 33import WelcomeScreen from './containers/auth/WelcomeScreen';
34import LoginScreen from './containers/auth/LoginScreen'; 34import LoginScreen from './containers/auth/LoginScreen';
35import LockedScreen from './containers/auth/LockedScreen';
35import PasswordScreen from './containers/auth/PasswordScreen'; 36import PasswordScreen from './containers/auth/PasswordScreen';
36import SignupScreen from './containers/auth/SignupScreen'; 37import SignupScreen from './containers/auth/SignupScreen';
37import ImportScreen from './containers/auth/ImportScreen'; 38import ImportScreen from './containers/auth/ImportScreen';
@@ -94,6 +95,7 @@ window.addEventListener('load', () => {
94 <IndexRedirect to="/auth/welcome" /> 95 <IndexRedirect to="/auth/welcome" />
95 <Route path="/auth/welcome" component={WelcomeScreen} /> 96 <Route path="/auth/welcome" component={WelcomeScreen} />
96 <Route path="/auth/login" component={LoginScreen} /> 97 <Route path="/auth/login" component={LoginScreen} />
98 <Route path="/auth/locked" component={LockedScreen} />
97 <Route path="/auth/signup"> 99 <Route path="/auth/signup">
98 <IndexRedirect to="/auth/signup/form" /> 100 <IndexRedirect to="/auth/signup/form" />
99 <Route path="/auth/signup/form" component={SignupScreen} /> 101 <Route path="/auth/signup/form" component={SignupScreen} />
diff --git a/src/components/auth/Locked.js b/src/components/auth/Locked.js
new file mode 100644
index 000000000..045621d0a
--- /dev/null
+++ b/src/components/auth/Locked.js
@@ -0,0 +1,115 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import Form from '../../lib/Form';
7import { required } from '../../helpers/validation-helpers';
8import Input from '../ui/Input';
9import Button from '../ui/Button';
10import Infobox from '../ui/Infobox';
11
12import { globalError as globalErrorPropType } from '../../prop-types';
13
14const messages = defineMessages({
15 headline: {
16 id: 'locked.headline',
17 defaultMessage: '!!!Locked',
18 },
19 info: {
20 id: 'locked.info',
21 defaultMessage: '!!!Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.',
22 },
23 passwordLabel: {
24 id: 'locked.password.label',
25 defaultMessage: '!!!Password',
26 },
27 submitButtonLabel: {
28 id: 'locked.submit.label',
29 defaultMessage: '!!!Unlock',
30 },
31 invalidCredentials: {
32 id: 'locked.invalidCredentials',
33 defaultMessage: '!!!Password invalid',
34 },
35});
36
37export default @observer class Locked extends Component {
38 static propTypes = {
39 onSubmit: PropTypes.func.isRequired,
40 isSubmitting: PropTypes.bool.isRequired,
41 error: globalErrorPropType.isRequired,
42 };
43
44 static contextTypes = {
45 intl: intlShape,
46 };
47
48 form = new Form({
49 fields: {
50 password: {
51 label: this.context.intl.formatMessage(messages.passwordLabel),
52 value: '',
53 validators: [required],
54 type: 'password',
55 },
56 },
57 }, this.context.intl);
58
59 submit(e) {
60 e.preventDefault();
61 this.form.submit({
62 onSuccess: (form) => {
63 this.props.onSubmit(form.values());
64 },
65 onError: () => { },
66 });
67 }
68
69 render() {
70 const { form } = this;
71 const { intl } = this.context;
72 const {
73 isSubmitting,
74 error,
75 } = this.props;
76
77 return (
78 <div className="auth__container">
79 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}>
80 <img
81 src="./assets/images/logo.svg"
82 className="auth__logo"
83 alt=""
84 />
85 <h1>{intl.formatMessage(messages.headline)}</h1>
86 <Infobox type="warning">
87 {intl.formatMessage(messages.info)}
88 </Infobox>
89 <Input
90 field={form.$('password')}
91 showPasswordToggle
92 />
93 {error.code === 'invalid-credentials' && (
94 <p className="error-message center">{intl.formatMessage(messages.invalidCredentials)}</p>
95 )}
96 {isSubmitting ? (
97 <Button
98 className="auth__button is-loading"
99 buttonType="secondary"
100 label={`${intl.formatMessage(messages.submitButtonLabel)} ...`}
101 loaded={false}
102 disabled
103 />
104 ) : (
105 <Button
106 type="submit"
107 className="auth__button"
108 label={intl.formatMessage(messages.submitButtonLabel)}
109 />
110 )}
111 </form>
112 </div>
113 );
114 }
115}
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index 729bd35af..d26eb852d 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import ReactTooltip from 'react-tooltip'; 3import ReactTooltip from 'react-tooltip';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import { observer } from 'mobx-react'; 5import { inject, observer } from 'mobx-react';
6import { Link } from 'react-router'; 6import { Link } from 'react-router';
7 7
8import Tabbar from '../services/tabs/Tabbar'; 8import Tabbar from '../services/tabs/Tabbar';
@@ -44,9 +44,13 @@ const messages = defineMessages({
44 id: 'sidebar.closeTodosDrawer', 44 id: 'sidebar.closeTodosDrawer',
45 defaultMessage: '!!!Close Franz Todos', 45 defaultMessage: '!!!Close Franz Todos',
46 }, 46 },
47 lockFerdi: {
48 id: 'sidebar.lockFerdi',
49 defaultMessage: '!!!Lock Ferdi',
50 },
47}); 51});
48 52
49export default @observer class Sidebar extends Component { 53export default @inject('stores', 'actions') @observer class Sidebar extends Component {
50 static propTypes = { 54 static propTypes = {
51 openSettings: PropTypes.func.isRequired, 55 openSettings: PropTypes.func.isRequired,
52 toggleMuteApp: PropTypes.func.isRequired, 56 toggleMuteApp: PropTypes.func.isRequired,
@@ -87,6 +91,8 @@ export default @observer class Sidebar extends Component {
87 isAppMuted, 91 isAppMuted,
88 isWorkspaceDrawerOpen, 92 isWorkspaceDrawerOpen,
89 toggleWorkspaceDrawer, 93 toggleWorkspaceDrawer,
94 stores,
95 actions,
90 } = this.props; 96 } = this.props;
91 const { intl } = this.context; 97 const { intl } = this.context;
92 const todosToggleMessage = ( 98 const todosToggleMessage = (
@@ -107,6 +113,23 @@ export default @observer class Sidebar extends Component {
107 /> 113 />
108 { isLoggedIn ? ( 114 { isLoggedIn ? (
109 <> 115 <>
116 { stores.settings.all.app.lockingFeatureEnabled ? (
117 <button
118 type="button"
119 className={`sidebar__button sidebar__button--audio ${isAppMuted ? 'is-muted' : ''}`}
120 onClick={() => {
121 actions.settings.update({
122 type: 'app',
123 data: {
124 locked: true,
125 },
126 });
127 }}
128 data-tip={`${intl.formatMessage(messages.lockFerdi)} (${ctrlKey}+Shift+L)`}
129 >
130 <i className="mdi mdi-lock" />
131 </button>
132 ) : null}
110 {todosStore.isFeatureEnabled && todosStore.isFeatureEnabledByUser ? ( 133 {todosStore.isFeatureEnabled && todosStore.isFeatureEnabledByUser ? (
111 <button 134 <button
112 type="button" 135 type="button"
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index b4e6e08a1..0152857a6 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -30,6 +30,14 @@ const messages = defineMessages({
30 id: 'settings.app.todoServerInfo', 30 id: 'settings.app.todoServerInfo',
31 defaultMessage: '!!!This server will be used for the "Franz Todo" feature. The default server will only work for premium users. (default: https://app.franztodos.com)', 31 defaultMessage: '!!!This server will be used for the "Franz Todo" feature. The default server will only work for premium users. (default: https://app.franztodos.com)',
32 }, 32 },
33 lockedPassword: {
34 id: 'settings.app.lockedPassword',
35 defaultMessage: '!!!Ferdi Lock Password',
36 },
37 lockedPasswordInfo: {
38 id: 'settings.app.lockedPasswordInfo',
39 defaultMessage: '!!!Please make sure to set a password you\'ll remember.\nIf you loose this password, you will have to reinstall Ferdi.',
40 },
33 headlineLanguage: { 41 headlineLanguage: {
34 id: 'settings.app.headlineLanguage', 42 id: 'settings.app.headlineLanguage',
35 defaultMessage: '!!!Language', 43 defaultMessage: '!!!Language',
@@ -159,6 +167,7 @@ export default @observer class EditSettingsForm extends Component {
159 } 167 }
160 168
161 const isLoggedIn = Boolean(localStorage.getItem('authToken')); 169 const isLoggedIn = Boolean(localStorage.getItem('authToken'));
170 const lockingFeatureEnabled = window.ferdi.stores.settings.all.app.lockingFeatureEnabled;
162 171
163 return ( 172 return (
164 <div className="settings__main"> 173 <div className="settings__main">
@@ -205,6 +214,7 @@ export default @observer class EditSettingsForm extends Component {
205 Please still consider 214 Please still consider
206 {' '} 215 {' '}
207 <a href="https://www.meetfranz.com/pricing" target="_blank">paying for a Franz account</a> 216 <a href="https://www.meetfranz.com/pricing" target="_blank">paying for a Franz account</a>
217 {' '}
208 or 218 or
209 {' '} 219 {' '}
210 <a href="https://github.com/vantezzen/ferdi-server" target="_blank">using a self-hosted ferdi-server</a> 220 <a href="https://github.com/vantezzen/ferdi-server" target="_blank">using a self-hosted ferdi-server</a>
@@ -225,12 +235,42 @@ export default @observer class EditSettingsForm extends Component {
225 placeholder="Todo Server" 235 placeholder="Todo Server"
226 onChange={e => this.submit(e)} 236 onChange={e => this.submit(e)}
227 field={form.$('todoServer')} 237 field={form.$('todoServer')}
228 autoFocus
229 /> 238 />
230 <p>{ intl.formatMessage(messages.todoServerInfo) }</p> 239 <p>{ intl.formatMessage(messages.todoServerInfo) }</p>
231 </> 240 </>
232 )} 241 )}
233 242
243 <Toggle field={form.$('lockingFeatureEnabled')} />
244 {lockingFeatureEnabled && (
245 <>
246 <Input
247 placeholder={intl.formatMessage(messages.lockedPassword)}
248 onChange={e => this.submit(e)}
249 field={form.$('lockedPassword')}
250 type="password"
251 />
252 <p>
253 { intl.formatMessage(messages.lockedPasswordInfo) }
254 </p>
255 </>
256 )}
257 <p
258 className="settings__message"
259 style={{
260 borderTop: 0, marginTop: 0, paddingTop: 0, marginBottom: '2rem',
261 }}
262 >
263 <span>
264 Ferdi password lock allows you to keep your messages protected.
265 <br />
266 Using Ferdi password lock, you will be prompted to enter your password everytime you
267 start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut
268 {' '}
269 <code>CMD/CTRL+Shift+L</code>
270 </span>
271 </p>
272
273
234 {/* Appearance */} 274 {/* Appearance */}
235 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2> 275 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2>
236 <Toggle field={form.$('showDisabledServices')} /> 276 <Toggle field={form.$('showDisabledServices')} />
diff --git a/src/config.js b/src/config.js
index 66789f2a4..77fb34d3c 100644
--- a/src/config.js
+++ b/src/config.js
@@ -31,6 +31,8 @@ export const DEVELOPMENT_TODOS_FRONTEND_URL = 'https://development--franz-todos.
31 31
32export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12'; 32export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12';
33 33
34export const DEFAULT_LOCK_PASSWORD = 'ferdi';
35
34export const DEFAULT_APP_SETTINGS = { 36export const DEFAULT_APP_SETTINGS = {
35 autoLaunchInBackground: false, 37 autoLaunchInBackground: false,
36 runInBackground: true, 38 runInBackground: true,
@@ -51,6 +53,9 @@ export const DEFAULT_APP_SETTINGS = {
51 enableGPUAcceleration: true, 53 enableGPUAcceleration: true,
52 serviceLimit: 5, 54 serviceLimit: 5,
53 autohideMenuBar: false, 55 autohideMenuBar: false,
56 lockingFeatureEnabled: false,
57 locked: false,
58 lockedPassword: '',
54}; 59};
55 60
56export const DEFAULT_FEATURES_CONFIG = { 61export const DEFAULT_FEATURES_CONFIG = {
diff --git a/src/containers/auth/LockedScreen.js b/src/containers/auth/LockedScreen.js
new file mode 100644
index 000000000..94285fb06
--- /dev/null
+++ b/src/containers/auth/LockedScreen.js
@@ -0,0 +1,72 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import Locked from '../../components/auth/Locked';
5import SettingsStore from '../../stores/SettingsStore';
6import { DEFAULT_LOCK_PASSWORD } from '../../config';
7
8import { globalError as globalErrorPropType } from '../../prop-types';
9
10export default @inject('stores', 'actions') @observer class LockedScreen extends Component {
11 static propTypes = {
12 error: globalErrorPropType.isRequired,
13 };
14
15 state = {
16 error: false,
17 }
18
19 constructor(props) {
20 super(props);
21
22 this.onSubmit = this.onSubmit.bind(this);
23 }
24
25 onSubmit(values) {
26 const { password } = values;
27
28 let correctPassword = this.props.stores.settings.all.app.lockedPassword;
29 if (!correctPassword) {
30 // Lock feature was enabled but no password was set
31 // Use default lock password so user can exit
32 correctPassword = DEFAULT_LOCK_PASSWORD;
33 }
34
35 if (String(password) === String(correctPassword)) {
36 this.props.actions.settings.update({
37 type: 'app',
38 data: {
39 locked: false,
40 },
41 });
42 } else {
43 this.setState({
44 error: {
45 code: 'invalid-credentials',
46 },
47 });
48 }
49 }
50
51 render() {
52 const { stores, error } = this.props;
53 return (
54 <Locked
55 onSubmit={this.onSubmit}
56 isSubmitting={stores.user.loginRequest.isExecuting}
57 error={this.state.error || error}
58 />
59 );
60 }
61}
62
63LockedScreen.wrappedComponent.propTypes = {
64 actions: PropTypes.shape({
65 settings: PropTypes.shape({
66 update: PropTypes.func.isRequired,
67 }).isRequired,
68 }).isRequired,
69 stores: PropTypes.shape({
70 settings: PropTypes.instanceOf(SettingsStore).isRequired,
71 }).isRequired,
72};
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 778b70ad9..1b134622a 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -9,7 +9,7 @@ import UserStore from '../../stores/UserStore';
9import TodosStore from '../../features/todos/store'; 9import TodosStore from '../../features/todos/store';
10import Form from '../../lib/Form'; 10import Form from '../../lib/Form';
11import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages'; 11import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages';
12import { DEFAULT_APP_SETTINGS } from '../../config'; 12import { DEFAULT_APP_SETTINGS, DEFAULT_LOCK_PASSWORD } from '../../config';
13import { config as spellcheckerConfig } from '../../features/spellchecker'; 13import { config as spellcheckerConfig } from '../../features/spellchecker';
14 14
15import { getSelectOptions } from '../../helpers/i18n-helpers'; 15import { getSelectOptions } from '../../helpers/i18n-helpers';
@@ -57,6 +57,14 @@ const messages = defineMessages({
57 id: 'settings.app.form.todoServer', 57 id: 'settings.app.form.todoServer',
58 defaultMessage: '!!!Todo Server', 58 defaultMessage: '!!!Todo Server',
59 }, 59 },
60 enableLock: {
61 id: 'settings.app.form.enableLock',
62 defaultMessage: '!!!Enable Ferdi password lock',
63 },
64 lockPassword: {
65 id: 'settings.app.form.lockPassword',
66 defaultMessage: '!!!Ferdi Lock password',
67 },
60 language: { 68 language: {
61 id: 'settings.app.form.language', 69 id: 'settings.app.form.language',
62 defaultMessage: '!!!Language', 70 defaultMessage: '!!!Language',
@@ -124,6 +132,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
124 privateNotifications: settingsData.privateNotifications, 132 privateNotifications: settingsData.privateNotifications,
125 server: settingsData.server, 133 server: settingsData.server,
126 todoServer: settingsData.todoServer, 134 todoServer: settingsData.todoServer,
135 lockingFeatureEnabled: settingsData.lockingFeatureEnabled,
136 lockedPassword: settingsData.lockedPassword,
127 enableGPUAcceleration: settingsData.enableGPUAcceleration, 137 enableGPUAcceleration: settingsData.enableGPUAcceleration,
128 showDisabledServices: settingsData.showDisabledServices, 138 showDisabledServices: settingsData.showDisabledServices,
129 darkMode: settingsData.darkMode, 139 darkMode: settingsData.darkMode,
@@ -214,6 +224,17 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
214 value: settings.all.app.todoServer || TODOS_FRONTEND, 224 value: settings.all.app.todoServer || TODOS_FRONTEND,
215 default: TODOS_FRONTEND, 225 default: TODOS_FRONTEND,
216 }, 226 },
227 lockingFeatureEnabled: {
228 label: intl.formatMessage(messages.enableLock),
229 value: settings.all.app.lockingFeatureEnabled || false,
230 default: false,
231 },
232 lockedPassword: {
233 label: intl.formatMessage(messages.lockPassword),
234 value: settings.all.app.lockedPassword || DEFAULT_LOCK_PASSWORD,
235 default: DEFAULT_LOCK_PASSWORD,
236 type: 'password',
237 },
217 showDisabledServices: { 238 showDisabledServices: {
218 label: intl.formatMessage(messages.showDisabledServices), 239 label: intl.formatMessage(messages.showDisabledServices),
219 value: settings.all.app.showDisabledServices, 240 value: settings.all.app.showDisabledServices,
@@ -290,6 +311,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
290 updateStatusTypes, 311 updateStatusTypes,
291 isClearingAllCache, 312 isClearingAllCache,
292 server, 313 server,
314 lockingFeatureEnabled,
293 } = app; 315 } = app;
294 const { 316 const {
295 checkForUpdates, 317 checkForUpdates,
@@ -316,6 +338,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
316 isTodosEnabled={todos.isFeatureActive} 338 isTodosEnabled={todos.isFeatureActive}
317 isWorkspaceEnabled={workspaces.isFeatureActive} 339 isWorkspaceEnabled={workspaces.isFeatureActive}
318 server={server || 'https://api.franzinfra.com'} 340 server={server || 'https://api.franzinfra.com'}
341 lockingFeatureEnabled={lockingFeatureEnabled}
319 /> 342 />
320 </ErrorBoundary> 343 </ErrorBoundary>
321 ); 344 );
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index da79ff5c9..febdd0d53 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -199,6 +199,76 @@
199 { 199 {
200 "descriptors": [ 200 "descriptors": [
201 { 201 {
202 "defaultMessage": "!!!Locked",
203 "end": {
204 "column": 3,
205 "line": 18
206 },
207 "file": "src/components/auth/Locked.js",
208 "id": "locked.headline",
209 "start": {
210 "column": 12,
211 "line": 15
212 }
213 },
214 {
215 "defaultMessage": "!!!Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.",
216 "end": {
217 "column": 3,
218 "line": 22
219 },
220 "file": "src/components/auth/Locked.js",
221 "id": "locked.info",
222 "start": {
223 "column": 8,
224 "line": 19
225 }
226 },
227 {
228 "defaultMessage": "!!!Password",
229 "end": {
230 "column": 3,
231 "line": 26
232 },
233 "file": "src/components/auth/Locked.js",
234 "id": "locked.password.label",
235 "start": {
236 "column": 17,
237 "line": 23
238 }
239 },
240 {
241 "defaultMessage": "!!!Unlock",
242 "end": {
243 "column": 3,
244 "line": 30
245 },
246 "file": "src/components/auth/Locked.js",
247 "id": "locked.submit.label",
248 "start": {
249 "column": 21,
250 "line": 27
251 }
252 },
253 {
254 "defaultMessage": "!!!Password invalid",
255 "end": {
256 "column": 3,
257 "line": 34
258 },
259 "file": "src/components/auth/Locked.js",
260 "id": "locked.invalidCredentials",
261 "start": {
262 "column": 22,
263 "line": 31
264 }
265 }
266 ],
267 "path": "src/components/auth/Locked.json"
268 },
269 {
270 "descriptors": [
271 {
202 "defaultMessage": "!!!Sign in", 272 "defaultMessage": "!!!Sign in",
203 "end": { 273 "end": {
204 "column": 3, 274 "column": 3,
@@ -903,6 +973,19 @@
903 "column": 20, 973 "column": 20,
904 "line": 43 974 "line": 43
905 } 975 }
976 },
977 {
978 "defaultMessage": "!!!Lock Ferdi",
979 "end": {
980 "column": 3,
981 "line": 50
982 },
983 "file": "src/components/layout/Sidebar.js",
984 "id": "sidebar.lockFerdi",
985 "start": {
986 "column": 13,
987 "line": 47
988 }
906 } 989 }
907 ], 990 ],
908 "path": "src/components/layout/Sidebar.json" 991 "path": "src/components/layout/Sidebar.json"
@@ -2431,211 +2514,237 @@
2431 } 2514 }
2432 }, 2515 },
2433 { 2516 {
2434 "defaultMessage": "!!!Language", 2517 "defaultMessage": "!!!Ferdi Lock Password",
2435 "end": { 2518 "end": {
2436 "column": 3, 2519 "column": 3,
2437 "line": 36 2520 "line": 36
2438 }, 2521 },
2439 "file": "src/components/settings/settings/EditSettingsForm.js", 2522 "file": "src/components/settings/settings/EditSettingsForm.js",
2523 "id": "settings.app.lockedPassword",
2524 "start": {
2525 "column": 18,
2526 "line": 33
2527 }
2528 },
2529 {
2530 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
2531 "end": {
2532 "column": 3,
2533 "line": 40
2534 },
2535 "file": "src/components/settings/settings/EditSettingsForm.js",
2536 "id": "settings.app.lockedPasswordInfo",
2537 "start": {
2538 "column": 22,
2539 "line": 37
2540 }
2541 },
2542 {
2543 "defaultMessage": "!!!Language",
2544 "end": {
2545 "column": 3,
2546 "line": 44
2547 },
2548 "file": "src/components/settings/settings/EditSettingsForm.js",
2440 "id": "settings.app.headlineLanguage", 2549 "id": "settings.app.headlineLanguage",
2441 "start": { 2550 "start": {
2442 "column": 20, 2551 "column": 20,
2443 "line": 33 2552 "line": 41
2444 } 2553 }
2445 }, 2554 },
2446 { 2555 {
2447 "defaultMessage": "!!!Updates", 2556 "defaultMessage": "!!!Updates",
2448 "end": { 2557 "end": {
2449 "column": 3, 2558 "column": 3,
2450 "line": 40 2559 "line": 48
2451 }, 2560 },
2452 "file": "src/components/settings/settings/EditSettingsForm.js", 2561 "file": "src/components/settings/settings/EditSettingsForm.js",
2453 "id": "settings.app.headlineUpdates", 2562 "id": "settings.app.headlineUpdates",
2454 "start": { 2563 "start": {
2455 "column": 19, 2564 "column": 19,
2456 "line": 37 2565 "line": 45
2457 } 2566 }
2458 }, 2567 },
2459 { 2568 {
2460 "defaultMessage": "!!!Appearance", 2569 "defaultMessage": "!!!Appearance",
2461 "end": { 2570 "end": {
2462 "column": 3, 2571 "column": 3,
2463 "line": 44 2572 "line": 52
2464 }, 2573 },
2465 "file": "src/components/settings/settings/EditSettingsForm.js", 2574 "file": "src/components/settings/settings/EditSettingsForm.js",
2466 "id": "settings.app.headlineAppearance", 2575 "id": "settings.app.headlineAppearance",
2467 "start": { 2576 "start": {
2468 "column": 22, 2577 "column": 22,
2469 "line": 41 2578 "line": 49
2470 } 2579 }
2471 }, 2580 },
2472 { 2581 {
2473 "defaultMessage": "!!!Advanced", 2582 "defaultMessage": "!!!Advanced",
2474 "end": { 2583 "end": {
2475 "column": 3, 2584 "column": 3,
2476 "line": 48 2585 "line": 56
2477 }, 2586 },
2478 "file": "src/components/settings/settings/EditSettingsForm.js", 2587 "file": "src/components/settings/settings/EditSettingsForm.js",
2479 "id": "settings.app.headlineAdvanced", 2588 "id": "settings.app.headlineAdvanced",
2480 "start": { 2589 "start": {
2481 "column": 20, 2590 "column": 20,
2482 "line": 45 2591 "line": 53
2483 } 2592 }
2484 }, 2593 },
2485 { 2594 {
2486 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 2595 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
2487 "end": { 2596 "end": {
2488 "column": 3, 2597 "column": 3,
2489 "line": 52 2598 "line": 60
2490 }, 2599 },
2491 "file": "src/components/settings/settings/EditSettingsForm.js", 2600 "file": "src/components/settings/settings/EditSettingsForm.js",
2492 "id": "settings.app.translationHelp", 2601 "id": "settings.app.translationHelp",
2493 "start": { 2602 "start": {
2494 "column": 19, 2603 "column": 19,
2495 "line": 49 2604 "line": 57
2496 } 2605 }
2497 }, 2606 },
2498 { 2607 {
2499 "defaultMessage": "!!!Cache", 2608 "defaultMessage": "!!!Cache",
2500 "end": { 2609 "end": {
2501 "column": 3, 2610 "column": 3,
2502 "line": 56 2611 "line": 64
2503 }, 2612 },
2504 "file": "src/components/settings/settings/EditSettingsForm.js", 2613 "file": "src/components/settings/settings/EditSettingsForm.js",
2505 "id": "settings.app.subheadlineCache", 2614 "id": "settings.app.subheadlineCache",
2506 "start": { 2615 "start": {
2507 "column": 20, 2616 "column": 20,
2508 "line": 53 2617 "line": 61
2509 } 2618 }
2510 }, 2619 },
2511 { 2620 {
2512 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 2621 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
2513 "end": { 2622 "end": {
2514 "column": 3, 2623 "column": 3,
2515 "line": 60 2624 "line": 68
2516 }, 2625 },
2517 "file": "src/components/settings/settings/EditSettingsForm.js", 2626 "file": "src/components/settings/settings/EditSettingsForm.js",
2518 "id": "settings.app.cacheInfo", 2627 "id": "settings.app.cacheInfo",
2519 "start": { 2628 "start": {
2520 "column": 13, 2629 "column": 13,
2521 "line": 57 2630 "line": 65
2522 } 2631 }
2523 }, 2632 },
2524 { 2633 {
2525 "defaultMessage": "!!!Clear cache", 2634 "defaultMessage": "!!!Clear cache",
2526 "end": { 2635 "end": {
2527 "column": 3, 2636 "column": 3,
2528 "line": 64 2637 "line": 72
2529 }, 2638 },
2530 "file": "src/components/settings/settings/EditSettingsForm.js", 2639 "file": "src/components/settings/settings/EditSettingsForm.js",
2531 "id": "settings.app.buttonClearAllCache", 2640 "id": "settings.app.buttonClearAllCache",
2532 "start": { 2641 "start": {
2533 "column": 23, 2642 "column": 23,
2534 "line": 61 2643 "line": 69
2535 } 2644 }
2536 }, 2645 },
2537 { 2646 {
2538 "defaultMessage": "!!!Check for updates", 2647 "defaultMessage": "!!!Check for updates",
2539 "end": { 2648 "end": {
2540 "column": 3, 2649 "column": 3,
2541 "line": 68 2650 "line": 76
2542 }, 2651 },
2543 "file": "src/components/settings/settings/EditSettingsForm.js", 2652 "file": "src/components/settings/settings/EditSettingsForm.js",
2544 "id": "settings.app.buttonSearchForUpdate", 2653 "id": "settings.app.buttonSearchForUpdate",
2545 "start": { 2654 "start": {
2546 "column": 25, 2655 "column": 25,
2547 "line": 65 2656 "line": 73
2548 } 2657 }
2549 }, 2658 },
2550 { 2659 {
2551 "defaultMessage": "!!!Restart & install update", 2660 "defaultMessage": "!!!Restart & install update",
2552 "end": { 2661 "end": {
2553 "column": 3, 2662 "column": 3,
2554 "line": 72 2663 "line": 80
2555 }, 2664 },
2556 "file": "src/components/settings/settings/EditSettingsForm.js", 2665 "file": "src/components/settings/settings/EditSettingsForm.js",
2557 "id": "settings.app.buttonInstallUpdate", 2666 "id": "settings.app.buttonInstallUpdate",
2558 "start": { 2667 "start": {
2559 "column": 23, 2668 "column": 23,
2560 "line": 69 2669 "line": 77
2561 } 2670 }
2562 }, 2671 },
2563 { 2672 {
2564 "defaultMessage": "!!!Is searching for update", 2673 "defaultMessage": "!!!Is searching for update",
2565 "end": { 2674 "end": {
2566 "column": 3, 2675 "column": 3,
2567 "line": 76 2676 "line": 84
2568 }, 2677 },
2569 "file": "src/components/settings/settings/EditSettingsForm.js", 2678 "file": "src/components/settings/settings/EditSettingsForm.js",
2570 "id": "settings.app.updateStatusSearching", 2679 "id": "settings.app.updateStatusSearching",
2571 "start": { 2680 "start": {
2572 "column": 25, 2681 "column": 25,
2573 "line": 73 2682 "line": 81
2574 } 2683 }
2575 }, 2684 },
2576 { 2685 {
2577 "defaultMessage": "!!!Update available, downloading...", 2686 "defaultMessage": "!!!Update available, downloading...",
2578 "end": { 2687 "end": {
2579 "column": 3, 2688 "column": 3,
2580 "line": 80 2689 "line": 88
2581 }, 2690 },
2582 "file": "src/components/settings/settings/EditSettingsForm.js", 2691 "file": "src/components/settings/settings/EditSettingsForm.js",
2583 "id": "settings.app.updateStatusAvailable", 2692 "id": "settings.app.updateStatusAvailable",
2584 "start": { 2693 "start": {
2585 "column": 25, 2694 "column": 25,
2586 "line": 77 2695 "line": 85
2587 } 2696 }
2588 }, 2697 },
2589 { 2698 {
2590 "defaultMessage": "!!!You are using the latest version of Ferdi", 2699 "defaultMessage": "!!!You are using the latest version of Ferdi",
2591 "end": { 2700 "end": {
2592 "column": 3, 2701 "column": 3,
2593 "line": 84 2702 "line": 92
2594 }, 2703 },
2595 "file": "src/components/settings/settings/EditSettingsForm.js", 2704 "file": "src/components/settings/settings/EditSettingsForm.js",
2596 "id": "settings.app.updateStatusUpToDate", 2705 "id": "settings.app.updateStatusUpToDate",
2597 "start": { 2706 "start": {
2598 "column": 24, 2707 "column": 24,
2599 "line": 81 2708 "line": 89
2600 } 2709 }
2601 }, 2710 },
2602 { 2711 {
2603 "defaultMessage": "!!!Current version:", 2712 "defaultMessage": "!!!Current version:",
2604 "end": { 2713 "end": {
2605 "column": 3, 2714 "column": 3,
2606 "line": 88 2715 "line": 96
2607 }, 2716 },
2608 "file": "src/components/settings/settings/EditSettingsForm.js", 2717 "file": "src/components/settings/settings/EditSettingsForm.js",
2609 "id": "settings.app.currentVersion", 2718 "id": "settings.app.currentVersion",
2610 "start": { 2719 "start": {
2611 "column": 18, 2720 "column": 18,
2612 "line": 85 2721 "line": 93
2613 } 2722 }
2614 }, 2723 },
2615 { 2724 {
2616 "defaultMessage": "!!!Changes require restart", 2725 "defaultMessage": "!!!Changes require restart",
2617 "end": { 2726 "end": {
2618 "column": 3, 2727 "column": 3,
2619 "line": 92 2728 "line": 100
2620 }, 2729 },
2621 "file": "src/components/settings/settings/EditSettingsForm.js", 2730 "file": "src/components/settings/settings/EditSettingsForm.js",
2622 "id": "settings.app.restartRequired", 2731 "id": "settings.app.restartRequired",
2623 "start": { 2732 "start": {
2624 "column": 29, 2733 "column": 29,
2625 "line": 89 2734 "line": 97
2626 } 2735 }
2627 }, 2736 },
2628 { 2737 {
2629 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 2738 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
2630 "end": { 2739 "end": {
2631 "column": 3, 2740 "column": 3,
2632 "line": 96 2741 "line": 104
2633 }, 2742 },
2634 "file": "src/components/settings/settings/EditSettingsForm.js", 2743 "file": "src/components/settings/settings/EditSettingsForm.js",
2635 "id": "settings.app.languageDisclaimer", 2744 "id": "settings.app.languageDisclaimer",
2636 "start": { 2745 "start": {
2637 "column": 22, 2746 "column": 22,
2638 "line": 93 2747 "line": 101
2639 } 2748 }
2640 } 2749 }
2641 ], 2750 ],
@@ -3632,120 +3741,146 @@
3632 } 3741 }
3633 }, 3742 },
3634 { 3743 {
3635 "defaultMessage": "!!!Language", 3744 "defaultMessage": "!!!Enable Ferdi password lock",
3636 "end": { 3745 "end": {
3637 "column": 3, 3746 "column": 3,
3638 "line": 63 3747 "line": 63
3639 }, 3748 },
3640 "file": "src/containers/settings/EditSettingsScreen.js", 3749 "file": "src/containers/settings/EditSettingsScreen.js",
3750 "id": "settings.app.form.enableLock",
3751 "start": {
3752 "column": 14,
3753 "line": 60
3754 }
3755 },
3756 {
3757 "defaultMessage": "!!!Ferdi Lock password",
3758 "end": {
3759 "column": 3,
3760 "line": 67
3761 },
3762 "file": "src/containers/settings/EditSettingsScreen.js",
3763 "id": "settings.app.form.lockPassword",
3764 "start": {
3765 "column": 16,
3766 "line": 64
3767 }
3768 },
3769 {
3770 "defaultMessage": "!!!Language",
3771 "end": {
3772 "column": 3,
3773 "line": 71
3774 },
3775 "file": "src/containers/settings/EditSettingsScreen.js",
3641 "id": "settings.app.form.language", 3776 "id": "settings.app.form.language",
3642 "start": { 3777 "start": {
3643 "column": 12, 3778 "column": 12,
3644 "line": 60 3779 "line": 68
3645 } 3780 }
3646 }, 3781 },
3647 { 3782 {
3648 "defaultMessage": "!!!Dark Mode", 3783 "defaultMessage": "!!!Dark Mode",
3649 "end": { 3784 "end": {
3650 "column": 3, 3785 "column": 3,
3651 "line": 67 3786 "line": 75
3652 }, 3787 },
3653 "file": "src/containers/settings/EditSettingsScreen.js", 3788 "file": "src/containers/settings/EditSettingsScreen.js",
3654 "id": "settings.app.form.darkMode", 3789 "id": "settings.app.form.darkMode",
3655 "start": { 3790 "start": {
3656 "column": 12, 3791 "column": 12,
3657 "line": 64 3792 "line": 72
3658 } 3793 }
3659 }, 3794 },
3660 { 3795 {
3661 "defaultMessage": "!!!Display disabled services tabs", 3796 "defaultMessage": "!!!Display disabled services tabs",
3662 "end": { 3797 "end": {
3663 "column": 3, 3798 "column": 3,
3664 "line": 71 3799 "line": 79
3665 }, 3800 },
3666 "file": "src/containers/settings/EditSettingsScreen.js", 3801 "file": "src/containers/settings/EditSettingsScreen.js",
3667 "id": "settings.app.form.showDisabledServices", 3802 "id": "settings.app.form.showDisabledServices",
3668 "start": { 3803 "start": {
3669 "column": 24, 3804 "column": 24,
3670 "line": 68 3805 "line": 76
3671 } 3806 }
3672 }, 3807 },
3673 { 3808 {
3674 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 3809 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
3675 "end": { 3810 "end": {
3676 "column": 3, 3811 "column": 3,
3677 "line": 75 3812 "line": 83
3678 }, 3813 },
3679 "file": "src/containers/settings/EditSettingsScreen.js", 3814 "file": "src/containers/settings/EditSettingsScreen.js",
3680 "id": "settings.app.form.showMessagesBadgesWhenMuted", 3815 "id": "settings.app.form.showMessagesBadgesWhenMuted",
3681 "start": { 3816 "start": {
3682 "column": 29, 3817 "column": 29,
3683 "line": 72 3818 "line": 80
3684 } 3819 }
3685 }, 3820 },
3686 { 3821 {
3687 "defaultMessage": "!!!Enable spell checking", 3822 "defaultMessage": "!!!Enable spell checking",
3688 "end": { 3823 "end": {
3689 "column": 3, 3824 "column": 3,
3690 "line": 79 3825 "line": 87
3691 }, 3826 },
3692 "file": "src/containers/settings/EditSettingsScreen.js", 3827 "file": "src/containers/settings/EditSettingsScreen.js",
3693 "id": "settings.app.form.enableSpellchecking", 3828 "id": "settings.app.form.enableSpellchecking",
3694 "start": { 3829 "start": {
3695 "column": 23, 3830 "column": 23,
3696 "line": 76 3831 "line": 84
3697 } 3832 }
3698 }, 3833 },
3699 { 3834 {
3700 "defaultMessage": "!!!Enable GPU Acceleration", 3835 "defaultMessage": "!!!Enable GPU Acceleration",
3701 "end": { 3836 "end": {
3702 "column": 3, 3837 "column": 3,
3703 "line": 83 3838 "line": 91
3704 }, 3839 },
3705 "file": "src/containers/settings/EditSettingsScreen.js", 3840 "file": "src/containers/settings/EditSettingsScreen.js",
3706 "id": "settings.app.form.enableGPUAcceleration", 3841 "id": "settings.app.form.enableGPUAcceleration",
3707 "start": { 3842 "start": {
3708 "column": 25, 3843 "column": 25,
3709 "line": 80 3844 "line": 88
3710 } 3845 }
3711 }, 3846 },
3712 { 3847 {
3713 "defaultMessage": "!!!Include beta versions", 3848 "defaultMessage": "!!!Include beta versions",
3714 "end": { 3849 "end": {
3715 "column": 3, 3850 "column": 3,
3716 "line": 87 3851 "line": 95
3717 }, 3852 },
3718 "file": "src/containers/settings/EditSettingsScreen.js", 3853 "file": "src/containers/settings/EditSettingsScreen.js",
3719 "id": "settings.app.form.beta", 3854 "id": "settings.app.form.beta",
3720 "start": { 3855 "start": {
3721 "column": 8, 3856 "column": 8,
3722 "line": 84 3857 "line": 92
3723 } 3858 }
3724 }, 3859 },
3725 { 3860 {
3726 "defaultMessage": "!!!Enable Franz Todos", 3861 "defaultMessage": "!!!Enable Franz Todos",
3727 "end": { 3862 "end": {
3728 "column": 3, 3863 "column": 3,
3729 "line": 91 3864 "line": 99
3730 }, 3865 },
3731 "file": "src/containers/settings/EditSettingsScreen.js", 3866 "file": "src/containers/settings/EditSettingsScreen.js",
3732 "id": "settings.app.form.enableTodos", 3867 "id": "settings.app.form.enableTodos",
3733 "start": { 3868 "start": {
3734 "column": 15, 3869 "column": 15,
3735 "line": 88 3870 "line": 96
3736 } 3871 }
3737 }, 3872 },
3738 { 3873 {
3739 "defaultMessage": "!!!Keep all workspaces loaded", 3874 "defaultMessage": "!!!Keep all workspaces loaded",
3740 "end": { 3875 "end": {
3741 "column": 3, 3876 "column": 3,
3742 "line": 95 3877 "line": 103
3743 }, 3878 },
3744 "file": "src/containers/settings/EditSettingsScreen.js", 3879 "file": "src/containers/settings/EditSettingsScreen.js",
3745 "id": "settings.app.form.keepAllWorkspacesLoaded", 3880 "id": "settings.app.form.keepAllWorkspacesLoaded",
3746 "start": { 3881 "start": {
3747 "column": 27, 3882 "column": 27,
3748 "line": 92 3883 "line": 100
3749 } 3884 }
3750 } 3885 }
3751 ], 3886 ],
@@ -5204,497 +5339,510 @@
5204 } 5339 }
5205 }, 5340 },
5206 { 5341 {
5207 "defaultMessage": "!!!Minimize", 5342 "defaultMessage": "!!!Lock Ferdi",
5208 "end": { 5343 "end": {
5209 "column": 3, 5344 "column": 3,
5210 "line": 127 5345 "line": 127
5211 }, 5346 },
5212 "file": "src/lib/Menu.js", 5347 "file": "src/lib/Menu.js",
5348 "id": "menu.view.lockFerdi",
5349 "start": {
5350 "column": 13,
5351 "line": 124
5352 }
5353 },
5354 {
5355 "defaultMessage": "!!!Minimize",
5356 "end": {
5357 "column": 3,
5358 "line": 131
5359 },
5360 "file": "src/lib/Menu.js",
5213 "id": "menu.window.minimize", 5361 "id": "menu.window.minimize",
5214 "start": { 5362 "start": {
5215 "column": 12, 5363 "column": 12,
5216 "line": 124 5364 "line": 128
5217 } 5365 }
5218 }, 5366 },
5219 { 5367 {
5220 "defaultMessage": "!!!Close", 5368 "defaultMessage": "!!!Close",
5221 "end": { 5369 "end": {
5222 "column": 3, 5370 "column": 3,
5223 "line": 131 5371 "line": 135
5224 }, 5372 },
5225 "file": "src/lib/Menu.js", 5373 "file": "src/lib/Menu.js",
5226 "id": "menu.window.close", 5374 "id": "menu.window.close",
5227 "start": { 5375 "start": {
5228 "column": 9, 5376 "column": 9,
5229 "line": 128 5377 "line": 132
5230 } 5378 }
5231 }, 5379 },
5232 { 5380 {
5233 "defaultMessage": "!!!Learn More", 5381 "defaultMessage": "!!!Learn More",
5234 "end": { 5382 "end": {
5235 "column": 3, 5383 "column": 3,
5236 "line": 135 5384 "line": 139
5237 }, 5385 },
5238 "file": "src/lib/Menu.js", 5386 "file": "src/lib/Menu.js",
5239 "id": "menu.help.learnMore", 5387 "id": "menu.help.learnMore",
5240 "start": { 5388 "start": {
5241 "column": 13, 5389 "column": 13,
5242 "line": 132 5390 "line": 136
5243 } 5391 }
5244 }, 5392 },
5245 { 5393 {
5246 "defaultMessage": "!!!Changelog", 5394 "defaultMessage": "!!!Changelog",
5247 "end": { 5395 "end": {
5248 "column": 3, 5396 "column": 3,
5249 "line": 139 5397 "line": 143
5250 }, 5398 },
5251 "file": "src/lib/Menu.js", 5399 "file": "src/lib/Menu.js",
5252 "id": "menu.help.changelog", 5400 "id": "menu.help.changelog",
5253 "start": { 5401 "start": {
5254 "column": 13, 5402 "column": 13,
5255 "line": 136 5403 "line": 140
5256 } 5404 }
5257 }, 5405 },
5258 { 5406 {
5259 "defaultMessage": "!!!Support", 5407 "defaultMessage": "!!!Support",
5260 "end": { 5408 "end": {
5261 "column": 3, 5409 "column": 3,
5262 "line": 143 5410 "line": 147
5263 }, 5411 },
5264 "file": "src/lib/Menu.js", 5412 "file": "src/lib/Menu.js",
5265 "id": "menu.help.support", 5413 "id": "menu.help.support",
5266 "start": { 5414 "start": {
5267 "column": 11, 5415 "column": 11,
5268 "line": 140 5416 "line": 144
5269 } 5417 }
5270 }, 5418 },
5271 { 5419 {
5272 "defaultMessage": "!!!Copy Debug Information", 5420 "defaultMessage": "!!!Copy Debug Information",
5273 "end": { 5421 "end": {
5274 "column": 3, 5422 "column": 3,
5275 "line": 147 5423 "line": 151
5276 }, 5424 },
5277 "file": "src/lib/Menu.js", 5425 "file": "src/lib/Menu.js",
5278 "id": "menu.help.debugInfo", 5426 "id": "menu.help.debugInfo",
5279 "start": { 5427 "start": {
5280 "column": 13, 5428 "column": 13,
5281 "line": 144 5429 "line": 148
5282 } 5430 }
5283 }, 5431 },
5284 { 5432 {
5285 "defaultMessage": "!!!Ferdi Debug Information", 5433 "defaultMessage": "!!!Ferdi Debug Information",
5286 "end": { 5434 "end": {
5287 "column": 3, 5435 "column": 3,
5288 "line": 151 5436 "line": 155
5289 }, 5437 },
5290 "file": "src/lib/Menu.js", 5438 "file": "src/lib/Menu.js",
5291 "id": "menu.help.debugInfoCopiedHeadline", 5439 "id": "menu.help.debugInfoCopiedHeadline",
5292 "start": { 5440 "start": {
5293 "column": 27, 5441 "column": 27,
5294 "line": 148 5442 "line": 152
5295 } 5443 }
5296 }, 5444 },
5297 { 5445 {
5298 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 5446 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
5299 "end": { 5447 "end": {
5300 "column": 3, 5448 "column": 3,
5301 "line": 155 5449 "line": 159
5302 }, 5450 },
5303 "file": "src/lib/Menu.js", 5451 "file": "src/lib/Menu.js",
5304 "id": "menu.help.debugInfoCopiedBody", 5452 "id": "menu.help.debugInfoCopiedBody",
5305 "start": { 5453 "start": {
5306 "column": 23, 5454 "column": 23,
5307 "line": 152 5455 "line": 156
5308 } 5456 }
5309 }, 5457 },
5310 { 5458 {
5311 "defaultMessage": "!!!Terms of Service", 5459 "defaultMessage": "!!!Terms of Service",
5312 "end": { 5460 "end": {
5313 "column": 3, 5461 "column": 3,
5314 "line": 159 5462 "line": 163
5315 }, 5463 },
5316 "file": "src/lib/Menu.js", 5464 "file": "src/lib/Menu.js",
5317 "id": "menu.help.tos", 5465 "id": "menu.help.tos",
5318 "start": { 5466 "start": {
5319 "column": 7, 5467 "column": 7,
5320 "line": 156 5468 "line": 160
5321 } 5469 }
5322 }, 5470 },
5323 { 5471 {
5324 "defaultMessage": "!!!Privacy Statement", 5472 "defaultMessage": "!!!Privacy Statement",
5325 "end": { 5473 "end": {
5326 "column": 3, 5474 "column": 3,
5327 "line": 163 5475 "line": 167
5328 }, 5476 },
5329 "file": "src/lib/Menu.js", 5477 "file": "src/lib/Menu.js",
5330 "id": "menu.help.privacy", 5478 "id": "menu.help.privacy",
5331 "start": { 5479 "start": {
5332 "column": 11, 5480 "column": 11,
5333 "line": 160 5481 "line": 164
5334 } 5482 }
5335 }, 5483 },
5336 { 5484 {
5337 "defaultMessage": "!!!File", 5485 "defaultMessage": "!!!File",
5338 "end": { 5486 "end": {
5339 "column": 3, 5487 "column": 3,
5340 "line": 167 5488 "line": 171
5341 }, 5489 },
5342 "file": "src/lib/Menu.js", 5490 "file": "src/lib/Menu.js",
5343 "id": "menu.file", 5491 "id": "menu.file",
5344 "start": { 5492 "start": {
5345 "column": 8, 5493 "column": 8,
5346 "line": 164 5494 "line": 168
5347 } 5495 }
5348 }, 5496 },
5349 { 5497 {
5350 "defaultMessage": "!!!View", 5498 "defaultMessage": "!!!View",
5351 "end": { 5499 "end": {
5352 "column": 3, 5500 "column": 3,
5353 "line": 171 5501 "line": 175
5354 }, 5502 },
5355 "file": "src/lib/Menu.js", 5503 "file": "src/lib/Menu.js",
5356 "id": "menu.view", 5504 "id": "menu.view",
5357 "start": { 5505 "start": {
5358 "column": 8, 5506 "column": 8,
5359 "line": 168 5507 "line": 172
5360 } 5508 }
5361 }, 5509 },
5362 { 5510 {
5363 "defaultMessage": "!!!Services", 5511 "defaultMessage": "!!!Services",
5364 "end": { 5512 "end": {
5365 "column": 3, 5513 "column": 3,
5366 "line": 175 5514 "line": 179
5367 }, 5515 },
5368 "file": "src/lib/Menu.js", 5516 "file": "src/lib/Menu.js",
5369 "id": "menu.services", 5517 "id": "menu.services",
5370 "start": { 5518 "start": {
5371 "column": 12, 5519 "column": 12,
5372 "line": 172 5520 "line": 176
5373 } 5521 }
5374 }, 5522 },
5375 { 5523 {
5376 "defaultMessage": "!!!Window", 5524 "defaultMessage": "!!!Window",
5377 "end": { 5525 "end": {
5378 "column": 3, 5526 "column": 3,
5379 "line": 179 5527 "line": 183
5380 }, 5528 },
5381 "file": "src/lib/Menu.js", 5529 "file": "src/lib/Menu.js",
5382 "id": "menu.window", 5530 "id": "menu.window",
5383 "start": { 5531 "start": {
5384 "column": 10, 5532 "column": 10,
5385 "line": 176 5533 "line": 180
5386 } 5534 }
5387 }, 5535 },
5388 { 5536 {
5389 "defaultMessage": "!!!Help", 5537 "defaultMessage": "!!!Help",
5390 "end": { 5538 "end": {
5391 "column": 3, 5539 "column": 3,
5392 "line": 183 5540 "line": 187
5393 }, 5541 },
5394 "file": "src/lib/Menu.js", 5542 "file": "src/lib/Menu.js",
5395 "id": "menu.help", 5543 "id": "menu.help",
5396 "start": { 5544 "start": {
5397 "column": 8, 5545 "column": 8,
5398 "line": 180 5546 "line": 184
5399 } 5547 }
5400 }, 5548 },
5401 { 5549 {
5402 "defaultMessage": "!!!About Ferdi", 5550 "defaultMessage": "!!!About Ferdi",
5403 "end": { 5551 "end": {
5404 "column": 3, 5552 "column": 3,
5405 "line": 187 5553 "line": 191
5406 }, 5554 },
5407 "file": "src/lib/Menu.js", 5555 "file": "src/lib/Menu.js",
5408 "id": "menu.app.about", 5556 "id": "menu.app.about",
5409 "start": { 5557 "start": {
5410 "column": 9, 5558 "column": 9,
5411 "line": 184 5559 "line": 188
5412 } 5560 }
5413 }, 5561 },
5414 { 5562 {
5415 "defaultMessage": "!!!What's new?", 5563 "defaultMessage": "!!!What's new?",
5416 "end": { 5564 "end": {
5417 "column": 3, 5565 "column": 3,
5418 "line": 191 5566 "line": 195
5419 }, 5567 },
5420 "file": "src/lib/Menu.js", 5568 "file": "src/lib/Menu.js",
5421 "id": "menu.app.announcement", 5569 "id": "menu.app.announcement",
5422 "start": { 5570 "start": {
5423 "column": 16, 5571 "column": 16,
5424 "line": 188 5572 "line": 192
5425 } 5573 }
5426 }, 5574 },
5427 { 5575 {
5428 "defaultMessage": "!!!Settings", 5576 "defaultMessage": "!!!Settings",
5429 "end": { 5577 "end": {
5430 "column": 3, 5578 "column": 3,
5431 "line": 195 5579 "line": 199
5432 }, 5580 },
5433 "file": "src/lib/Menu.js", 5581 "file": "src/lib/Menu.js",
5434 "id": "menu.app.settings", 5582 "id": "menu.app.settings",
5435 "start": { 5583 "start": {
5436 "column": 12, 5584 "column": 12,
5437 "line": 192 5585 "line": 196
5438 } 5586 }
5439 }, 5587 },
5440 { 5588 {
5441 "defaultMessage": "!!!Check for updates", 5589 "defaultMessage": "!!!Check for updates",
5442 "end": { 5590 "end": {
5443 "column": 3, 5591 "column": 3,
5444 "line": 199 5592 "line": 203
5445 }, 5593 },
5446 "file": "src/lib/Menu.js", 5594 "file": "src/lib/Menu.js",
5447 "id": "menu.app.checkForUpdates", 5595 "id": "menu.app.checkForUpdates",
5448 "start": { 5596 "start": {
5449 "column": 19, 5597 "column": 19,
5450 "line": 196 5598 "line": 200
5451 } 5599 }
5452 }, 5600 },
5453 { 5601 {
5454 "defaultMessage": "!!!Hide", 5602 "defaultMessage": "!!!Hide",
5455 "end": { 5603 "end": {
5456 "column": 3, 5604 "column": 3,
5457 "line": 203 5605 "line": 207
5458 }, 5606 },
5459 "file": "src/lib/Menu.js", 5607 "file": "src/lib/Menu.js",
5460 "id": "menu.app.hide", 5608 "id": "menu.app.hide",
5461 "start": { 5609 "start": {
5462 "column": 8, 5610 "column": 8,
5463 "line": 200 5611 "line": 204
5464 } 5612 }
5465 }, 5613 },
5466 { 5614 {
5467 "defaultMessage": "!!!Hide Others", 5615 "defaultMessage": "!!!Hide Others",
5468 "end": { 5616 "end": {
5469 "column": 3, 5617 "column": 3,
5470 "line": 207 5618 "line": 211
5471 }, 5619 },
5472 "file": "src/lib/Menu.js", 5620 "file": "src/lib/Menu.js",
5473 "id": "menu.app.hideOthers", 5621 "id": "menu.app.hideOthers",
5474 "start": { 5622 "start": {
5475 "column": 14, 5623 "column": 14,
5476 "line": 204 5624 "line": 208
5477 } 5625 }
5478 }, 5626 },
5479 { 5627 {
5480 "defaultMessage": "!!!Unhide", 5628 "defaultMessage": "!!!Unhide",
5481 "end": { 5629 "end": {
5482 "column": 3, 5630 "column": 3,
5483 "line": 211 5631 "line": 215
5484 }, 5632 },
5485 "file": "src/lib/Menu.js", 5633 "file": "src/lib/Menu.js",
5486 "id": "menu.app.unhide", 5634 "id": "menu.app.unhide",
5487 "start": { 5635 "start": {
5488 "column": 10, 5636 "column": 10,
5489 "line": 208 5637 "line": 212
5490 } 5638 }
5491 }, 5639 },
5492 { 5640 {
5493 "defaultMessage": "!!!Auto-hide menu bar", 5641 "defaultMessage": "!!!Auto-hide menu bar",
5494 "end": { 5642 "end": {
5495 "column": 3, 5643 "column": 3,
5496 "line": 215 5644 "line": 219
5497 }, 5645 },
5498 "file": "src/lib/Menu.js", 5646 "file": "src/lib/Menu.js",
5499 "id": "menu.app.autohideMenuBar", 5647 "id": "menu.app.autohideMenuBar",
5500 "start": { 5648 "start": {
5501 "column": 19, 5649 "column": 19,
5502 "line": 212 5650 "line": 216
5503 } 5651 }
5504 }, 5652 },
5505 { 5653 {
5506 "defaultMessage": "!!!Quit", 5654 "defaultMessage": "!!!Quit",
5507 "end": { 5655 "end": {
5508 "column": 3, 5656 "column": 3,
5509 "line": 219 5657 "line": 223
5510 }, 5658 },
5511 "file": "src/lib/Menu.js", 5659 "file": "src/lib/Menu.js",
5512 "id": "menu.app.quit", 5660 "id": "menu.app.quit",
5513 "start": { 5661 "start": {
5514 "column": 8, 5662 "column": 8,
5515 "line": 216 5663 "line": 220
5516 } 5664 }
5517 }, 5665 },
5518 { 5666 {
5519 "defaultMessage": "!!!Add New Service...", 5667 "defaultMessage": "!!!Add New Service...",
5520 "end": { 5668 "end": {
5521 "column": 3, 5669 "column": 3,
5522 "line": 223 5670 "line": 227
5523 }, 5671 },
5524 "file": "src/lib/Menu.js", 5672 "file": "src/lib/Menu.js",
5525 "id": "menu.services.addNewService", 5673 "id": "menu.services.addNewService",
5526 "start": { 5674 "start": {
5527 "column": 17, 5675 "column": 17,
5528 "line": 220 5676 "line": 224
5529 } 5677 }
5530 }, 5678 },
5531 { 5679 {
5532 "defaultMessage": "!!!Add New Workspace...", 5680 "defaultMessage": "!!!Add New Workspace...",
5533 "end": { 5681 "end": {
5534 "column": 3, 5682 "column": 3,
5535 "line": 227 5683 "line": 231
5536 }, 5684 },
5537 "file": "src/lib/Menu.js", 5685 "file": "src/lib/Menu.js",
5538 "id": "menu.workspaces.addNewWorkspace", 5686 "id": "menu.workspaces.addNewWorkspace",
5539 "start": { 5687 "start": {
5540 "column": 19, 5688 "column": 19,
5541 "line": 224 5689 "line": 228
5542 } 5690 }
5543 }, 5691 },
5544 { 5692 {
5545 "defaultMessage": "!!!Open workspace drawer", 5693 "defaultMessage": "!!!Open workspace drawer",
5546 "end": { 5694 "end": {
5547 "column": 3, 5695 "column": 3,
5548 "line": 231 5696 "line": 235
5549 }, 5697 },
5550 "file": "src/lib/Menu.js", 5698 "file": "src/lib/Menu.js",
5551 "id": "menu.workspaces.openWorkspaceDrawer", 5699 "id": "menu.workspaces.openWorkspaceDrawer",
5552 "start": { 5700 "start": {
5553 "column": 23, 5701 "column": 23,
5554 "line": 228 5702 "line": 232
5555 } 5703 }
5556 }, 5704 },
5557 { 5705 {
5558 "defaultMessage": "!!!Close workspace drawer", 5706 "defaultMessage": "!!!Close workspace drawer",
5559 "end": { 5707 "end": {
5560 "column": 3, 5708 "column": 3,
5561 "line": 235 5709 "line": 239
5562 }, 5710 },
5563 "file": "src/lib/Menu.js", 5711 "file": "src/lib/Menu.js",
5564 "id": "menu.workspaces.closeWorkspaceDrawer", 5712 "id": "menu.workspaces.closeWorkspaceDrawer",
5565 "start": { 5713 "start": {
5566 "column": 24, 5714 "column": 24,
5567 "line": 232 5715 "line": 236
5568 } 5716 }
5569 }, 5717 },
5570 { 5718 {
5571 "defaultMessage": "!!!Activate next service...", 5719 "defaultMessage": "!!!Activate next service...",
5572 "end": { 5720 "end": {
5573 "column": 3, 5721 "column": 3,
5574 "line": 239 5722 "line": 243
5575 }, 5723 },
5576 "file": "src/lib/Menu.js", 5724 "file": "src/lib/Menu.js",
5577 "id": "menu.services.setNextServiceActive", 5725 "id": "menu.services.setNextServiceActive",
5578 "start": { 5726 "start": {
5579 "column": 23, 5727 "column": 23,
5580 "line": 236 5728 "line": 240
5581 } 5729 }
5582 }, 5730 },
5583 { 5731 {
5584 "defaultMessage": "!!!Activate previous service...", 5732 "defaultMessage": "!!!Activate previous service...",
5585 "end": { 5733 "end": {
5586 "column": 3, 5734 "column": 3,
5587 "line": 243 5735 "line": 247
5588 }, 5736 },
5589 "file": "src/lib/Menu.js", 5737 "file": "src/lib/Menu.js",
5590 "id": "menu.services.activatePreviousService", 5738 "id": "menu.services.activatePreviousService",
5591 "start": { 5739 "start": {
5592 "column": 27, 5740 "column": 27,
5593 "line": 240 5741 "line": 244
5594 } 5742 }
5595 }, 5743 },
5596 { 5744 {
5597 "defaultMessage": "!!!Disable notifications & audio", 5745 "defaultMessage": "!!!Disable notifications & audio",
5598 "end": { 5746 "end": {
5599 "column": 3, 5747 "column": 3,
5600 "line": 247 5748 "line": 251
5601 }, 5749 },
5602 "file": "src/lib/Menu.js", 5750 "file": "src/lib/Menu.js",
5603 "id": "sidebar.muteApp", 5751 "id": "sidebar.muteApp",
5604 "start": { 5752 "start": {
5605 "column": 11, 5753 "column": 11,
5606 "line": 244 5754 "line": 248
5607 } 5755 }
5608 }, 5756 },
5609 { 5757 {
5610 "defaultMessage": "!!!Enable notifications & audio", 5758 "defaultMessage": "!!!Enable notifications & audio",
5611 "end": { 5759 "end": {
5612 "column": 3, 5760 "column": 3,
5613 "line": 251 5761 "line": 255
5614 }, 5762 },
5615 "file": "src/lib/Menu.js", 5763 "file": "src/lib/Menu.js",
5616 "id": "sidebar.unmuteApp", 5764 "id": "sidebar.unmuteApp",
5617 "start": { 5765 "start": {
5618 "column": 13, 5766 "column": 13,
5619 "line": 248 5767 "line": 252
5620 } 5768 }
5621 }, 5769 },
5622 { 5770 {
5623 "defaultMessage": "!!!Workspaces", 5771 "defaultMessage": "!!!Workspaces",
5624 "end": { 5772 "end": {
5625 "column": 3, 5773 "column": 3,
5626 "line": 255 5774 "line": 259
5627 }, 5775 },
5628 "file": "src/lib/Menu.js", 5776 "file": "src/lib/Menu.js",
5629 "id": "menu.workspaces", 5777 "id": "menu.workspaces",
5630 "start": { 5778 "start": {
5631 "column": 14, 5779 "column": 14,
5632 "line": 252 5780 "line": 256
5633 } 5781 }
5634 }, 5782 },
5635 { 5783 {
5636 "defaultMessage": "!!!Default", 5784 "defaultMessage": "!!!Default",
5637 "end": { 5785 "end": {
5638 "column": 3, 5786 "column": 3,
5639 "line": 259 5787 "line": 263
5640 }, 5788 },
5641 "file": "src/lib/Menu.js", 5789 "file": "src/lib/Menu.js",
5642 "id": "menu.workspaces.defaultWorkspace", 5790 "id": "menu.workspaces.defaultWorkspace",
5643 "start": { 5791 "start": {
5644 "column": 20, 5792 "column": 20,
5645 "line": 256 5793 "line": 260
5646 } 5794 }
5647 }, 5795 },
5648 { 5796 {
5649 "defaultMessage": "!!!Todos", 5797 "defaultMessage": "!!!Todos",
5650 "end": { 5798 "end": {
5651 "column": 3, 5799 "column": 3,
5652 "line": 263 5800 "line": 267
5653 }, 5801 },
5654 "file": "src/lib/Menu.js", 5802 "file": "src/lib/Menu.js",
5655 "id": "menu.todos", 5803 "id": "menu.todos",
5656 "start": { 5804 "start": {
5657 "column": 9, 5805 "column": 9,
5658 "line": 260 5806 "line": 264
5659 } 5807 }
5660 }, 5808 },
5661 { 5809 {
5662 "defaultMessage": "!!!Open Todos drawer", 5810 "defaultMessage": "!!!Open Todos drawer",
5663 "end": { 5811 "end": {
5664 "column": 3, 5812 "column": 3,
5665 "line": 267 5813 "line": 271
5666 }, 5814 },
5667 "file": "src/lib/Menu.js", 5815 "file": "src/lib/Menu.js",
5668 "id": "menu.Todoss.openTodosDrawer", 5816 "id": "menu.Todoss.openTodosDrawer",
5669 "start": { 5817 "start": {
5670 "column": 19, 5818 "column": 19,
5671 "line": 264 5819 "line": 268
5672 } 5820 }
5673 }, 5821 },
5674 { 5822 {
5675 "defaultMessage": "!!!Close Todos drawer", 5823 "defaultMessage": "!!!Close Todos drawer",
5676 "end": { 5824 "end": {
5677 "column": 3, 5825 "column": 3,
5678 "line": 271 5826 "line": 275
5679 }, 5827 },
5680 "file": "src/lib/Menu.js", 5828 "file": "src/lib/Menu.js",
5681 "id": "menu.Todoss.closeTodosDrawer", 5829 "id": "menu.Todoss.closeTodosDrawer",
5682 "start": { 5830 "start": {
5683 "column": 20, 5831 "column": 20,
5684 "line": 268 5832 "line": 272
5685 } 5833 }
5686 }, 5834 },
5687 { 5835 {
5688 "defaultMessage": "!!!Enable Todos", 5836 "defaultMessage": "!!!Enable Todos",
5689 "end": { 5837 "end": {
5690 "column": 3, 5838 "column": 3,
5691 "line": 275 5839 "line": 279
5692 }, 5840 },
5693 "file": "src/lib/Menu.js", 5841 "file": "src/lib/Menu.js",
5694 "id": "menu.todos.enableTodos", 5842 "id": "menu.todos.enableTodos",
5695 "start": { 5843 "start": {
5696 "column": 15, 5844 "column": 15,
5697 "line": 272 5845 "line": 276
5698 } 5846 }
5699 } 5847 }
5700 ], 5848 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 4b008a717..fb1d84cb6 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -46,6 +46,11 @@
46 "invite.skip.label": "I want to do this later", 46 "invite.skip.label": "I want to do this later",
47 "invite.submit.label": "Send invites", 47 "invite.submit.label": "Send invites",
48 "invite.successInfo": "Invitations sent successfully", 48 "invite.successInfo": "Invitations sent successfully",
49 "locked.headline": "Locked",
50 "locked.info": "Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.",
51 "locked.invalidCredentials": "Password invalid",
52 "locked.password.label": "Password",
53 "locked.submit.label": "Unlock",
49 "login.customServerQuestion": "Using a custom Ferdi server?", 54 "login.customServerQuestion": "Using a custom Ferdi server?",
50 "login.customServerSuggestion": "Try importing your Franz account", 55 "login.customServerSuggestion": "Try importing your Franz account",
51 "login.email.label": "Email address", 56 "login.email.label": "Email address",
@@ -103,6 +108,7 @@
103 "menu.view.enterFullScreen": "Enter Full Screen", 108 "menu.view.enterFullScreen": "Enter Full Screen",
104 "menu.view.exitFullScreen": "Exit Full Screen", 109 "menu.view.exitFullScreen": "Exit Full Screen",
105 "menu.view.forward": "Forward", 110 "menu.view.forward": "Forward",
111 "menu.view.lockFerdi": "Lock Ferdi",
106 "menu.view.reloadFranz": "Reload Ferdi", 112 "menu.view.reloadFranz": "Reload Ferdi",
107 "menu.view.reloadService": "Reload Service", 113 "menu.view.reloadService": "Reload Service",
108 "menu.view.resetZoom": "Actual Size", 114 "menu.view.resetZoom": "Actual Size",
@@ -213,11 +219,13 @@
213 "settings.app.form.beta": "Include beta versions", 219 "settings.app.form.beta": "Include beta versions",
214 "settings.app.form.darkMode": "Join the Dark Side", 220 "settings.app.form.darkMode": "Join the Dark Side",
215 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration", 221 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration",
222 "settings.app.form.enableLock": "Enable Ferdi password lock",
216 "settings.app.form.enableSpellchecking": "Enable spell checking", 223 "settings.app.form.enableSpellchecking": "Enable spell checking",
217 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 224 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
218 "settings.app.form.enableTodos": "Enable Ferdi Todos", 225 "settings.app.form.enableTodos": "Enable Ferdi Todos",
219 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded", 226 "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded",
220 "settings.app.form.language": "Language", 227 "settings.app.form.language": "Language",
228 "settings.app.form.lockPassword": "Ferdi Lock password",
221 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray", 229 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray",
222 "settings.app.form.privateNotifications": "Don't show message content in notifications", 230 "settings.app.form.privateNotifications": "Don't show message content in notifications",
223 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window", 231 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window",
@@ -232,6 +240,8 @@
232 "settings.app.headlineLanguage": "Language", 240 "settings.app.headlineLanguage": "Language",
233 "settings.app.headlineUpdates": "Updates", 241 "settings.app.headlineUpdates": "Updates",
234 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 242 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
243 "settings.app.lockedPassword": "Ferdi Lock Password",
244 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
235 "settings.app.restartRequired": "Changes require restart", 245 "settings.app.restartRequired": "Changes require restart",
236 "settings.app.serverInfo": "We advice you to logout after changing your server as your settings might not be saved otherwise.", 246 "settings.app.serverInfo": "We advice you to logout after changing your server as your settings might not be saved otherwise.",
237 "settings.app.subheadlineCache": "Cache", 247 "settings.app.subheadlineCache": "Cache",
@@ -345,6 +355,7 @@
345 "sidebar.addNewService": "Add new service", 355 "sidebar.addNewService": "Add new service",
346 "sidebar.closeTodosDrawer": "Close Ferdi Todos", 356 "sidebar.closeTodosDrawer": "Close Ferdi Todos",
347 "sidebar.closeWorkspaceDrawer": "Close workspace drawer", 357 "sidebar.closeWorkspaceDrawer": "Close workspace drawer",
358 "sidebar.lockFerdi": "Lock Ferdi",
348 "sidebar.muteApp": "Disable notifications & audio", 359 "sidebar.muteApp": "Disable notifications & audio",
349 "sidebar.openTodosDrawer": "Open Ferdi Todos", 360 "sidebar.openTodosDrawer": "Open Ferdi Todos",
350 "sidebar.openWorkspaceDrawer": "Open workspace drawer", 361 "sidebar.openWorkspaceDrawer": "Open workspace drawer",
diff --git a/src/i18n/messages/src/components/auth/Locked.json b/src/i18n/messages/src/components/auth/Locked.json
new file mode 100644
index 000000000..86b1cae90
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Locked.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "locked.headline",
4 "defaultMessage": "!!!Locked",
5 "file": "src/components/auth/Locked.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "locked.info",
17 "defaultMessage": "!!!Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.",
18 "file": "src/components/auth/Locked.js",
19 "start": {
20 "line": 19,
21 "column": 8
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "locked.password.label",
30 "defaultMessage": "!!!Password",
31 "file": "src/components/auth/Locked.js",
32 "start": {
33 "line": 23,
34 "column": 17
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "locked.submit.label",
43 "defaultMessage": "!!!Unlock",
44 "file": "src/components/auth/Locked.js",
45 "start": {
46 "line": 27,
47 "column": 21
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "locked.invalidCredentials",
56 "defaultMessage": "!!!Password invalid",
57 "file": "src/components/auth/Locked.js",
58 "start": {
59 "line": 31,
60 "column": 22
61 },
62 "end": {
63 "line": 34,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json
index 837dc54bc..ddd9cd094 100644
--- a/src/i18n/messages/src/components/layout/Sidebar.json
+++ b/src/i18n/messages/src/components/layout/Sidebar.json
@@ -102,5 +102,18 @@
102 "line": 46, 102 "line": 46,
103 "column": 3 103 "column": 3
104 } 104 }
105 },
106 {
107 "id": "sidebar.lockFerdi",
108 "defaultMessage": "!!!Lock Ferdi",
109 "file": "src/components/layout/Sidebar.js",
110 "start": {
111 "line": 47,
112 "column": 13
113 },
114 "end": {
115 "line": 50,
116 "column": 3
117 }
105 } 118 }
106] \ No newline at end of file 119] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
index 2aebc79e3..125fcf0b9 100644
--- a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
+++ b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
@@ -52,15 +52,41 @@
52 } 52 }
53 }, 53 },
54 { 54 {
55 "id": "settings.app.lockedPassword",
56 "defaultMessage": "!!!Ferdi Lock Password",
57 "file": "src/components/settings/settings/EditSettingsForm.js",
58 "start": {
59 "line": 33,
60 "column": 18
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.app.lockedPasswordInfo",
69 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
70 "file": "src/components/settings/settings/EditSettingsForm.js",
71 "start": {
72 "line": 37,
73 "column": 22
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
55 "id": "settings.app.headlineLanguage", 81 "id": "settings.app.headlineLanguage",
56 "defaultMessage": "!!!Language", 82 "defaultMessage": "!!!Language",
57 "file": "src/components/settings/settings/EditSettingsForm.js", 83 "file": "src/components/settings/settings/EditSettingsForm.js",
58 "start": { 84 "start": {
59 "line": 33, 85 "line": 41,
60 "column": 20 86 "column": 20
61 }, 87 },
62 "end": { 88 "end": {
63 "line": 36, 89 "line": 44,
64 "column": 3 90 "column": 3
65 } 91 }
66 }, 92 },
@@ -69,11 +95,11 @@
69 "defaultMessage": "!!!Updates", 95 "defaultMessage": "!!!Updates",
70 "file": "src/components/settings/settings/EditSettingsForm.js", 96 "file": "src/components/settings/settings/EditSettingsForm.js",
71 "start": { 97 "start": {
72 "line": 37, 98 "line": 45,
73 "column": 19 99 "column": 19
74 }, 100 },
75 "end": { 101 "end": {
76 "line": 40, 102 "line": 48,
77 "column": 3 103 "column": 3
78 } 104 }
79 }, 105 },
@@ -82,11 +108,11 @@
82 "defaultMessage": "!!!Appearance", 108 "defaultMessage": "!!!Appearance",
83 "file": "src/components/settings/settings/EditSettingsForm.js", 109 "file": "src/components/settings/settings/EditSettingsForm.js",
84 "start": { 110 "start": {
85 "line": 41, 111 "line": 49,
86 "column": 22 112 "column": 22
87 }, 113 },
88 "end": { 114 "end": {
89 "line": 44, 115 "line": 52,
90 "column": 3 116 "column": 3
91 } 117 }
92 }, 118 },
@@ -95,11 +121,11 @@
95 "defaultMessage": "!!!Advanced", 121 "defaultMessage": "!!!Advanced",
96 "file": "src/components/settings/settings/EditSettingsForm.js", 122 "file": "src/components/settings/settings/EditSettingsForm.js",
97 "start": { 123 "start": {
98 "line": 45, 124 "line": 53,
99 "column": 20 125 "column": 20
100 }, 126 },
101 "end": { 127 "end": {
102 "line": 48, 128 "line": 56,
103 "column": 3 129 "column": 3
104 } 130 }
105 }, 131 },
@@ -108,11 +134,11 @@
108 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 134 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
109 "file": "src/components/settings/settings/EditSettingsForm.js", 135 "file": "src/components/settings/settings/EditSettingsForm.js",
110 "start": { 136 "start": {
111 "line": 49, 137 "line": 57,
112 "column": 19 138 "column": 19
113 }, 139 },
114 "end": { 140 "end": {
115 "line": 52, 141 "line": 60,
116 "column": 3 142 "column": 3
117 } 143 }
118 }, 144 },
@@ -121,11 +147,11 @@
121 "defaultMessage": "!!!Cache", 147 "defaultMessage": "!!!Cache",
122 "file": "src/components/settings/settings/EditSettingsForm.js", 148 "file": "src/components/settings/settings/EditSettingsForm.js",
123 "start": { 149 "start": {
124 "line": 53, 150 "line": 61,
125 "column": 20 151 "column": 20
126 }, 152 },
127 "end": { 153 "end": {
128 "line": 56, 154 "line": 64,
129 "column": 3 155 "column": 3
130 } 156 }
131 }, 157 },
@@ -134,11 +160,11 @@
134 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 160 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
135 "file": "src/components/settings/settings/EditSettingsForm.js", 161 "file": "src/components/settings/settings/EditSettingsForm.js",
136 "start": { 162 "start": {
137 "line": 57, 163 "line": 65,
138 "column": 13 164 "column": 13
139 }, 165 },
140 "end": { 166 "end": {
141 "line": 60, 167 "line": 68,
142 "column": 3 168 "column": 3
143 } 169 }
144 }, 170 },
@@ -147,11 +173,11 @@
147 "defaultMessage": "!!!Clear cache", 173 "defaultMessage": "!!!Clear cache",
148 "file": "src/components/settings/settings/EditSettingsForm.js", 174 "file": "src/components/settings/settings/EditSettingsForm.js",
149 "start": { 175 "start": {
150 "line": 61, 176 "line": 69,
151 "column": 23 177 "column": 23
152 }, 178 },
153 "end": { 179 "end": {
154 "line": 64, 180 "line": 72,
155 "column": 3 181 "column": 3
156 } 182 }
157 }, 183 },
@@ -160,11 +186,11 @@
160 "defaultMessage": "!!!Check for updates", 186 "defaultMessage": "!!!Check for updates",
161 "file": "src/components/settings/settings/EditSettingsForm.js", 187 "file": "src/components/settings/settings/EditSettingsForm.js",
162 "start": { 188 "start": {
163 "line": 65, 189 "line": 73,
164 "column": 25 190 "column": 25
165 }, 191 },
166 "end": { 192 "end": {
167 "line": 68, 193 "line": 76,
168 "column": 3 194 "column": 3
169 } 195 }
170 }, 196 },
@@ -173,11 +199,11 @@
173 "defaultMessage": "!!!Restart & install update", 199 "defaultMessage": "!!!Restart & install update",
174 "file": "src/components/settings/settings/EditSettingsForm.js", 200 "file": "src/components/settings/settings/EditSettingsForm.js",
175 "start": { 201 "start": {
176 "line": 69, 202 "line": 77,
177 "column": 23 203 "column": 23
178 }, 204 },
179 "end": { 205 "end": {
180 "line": 72, 206 "line": 80,
181 "column": 3 207 "column": 3
182 } 208 }
183 }, 209 },
@@ -186,11 +212,11 @@
186 "defaultMessage": "!!!Is searching for update", 212 "defaultMessage": "!!!Is searching for update",
187 "file": "src/components/settings/settings/EditSettingsForm.js", 213 "file": "src/components/settings/settings/EditSettingsForm.js",
188 "start": { 214 "start": {
189 "line": 73, 215 "line": 81,
190 "column": 25 216 "column": 25
191 }, 217 },
192 "end": { 218 "end": {
193 "line": 76, 219 "line": 84,
194 "column": 3 220 "column": 3
195 } 221 }
196 }, 222 },
@@ -199,11 +225,11 @@
199 "defaultMessage": "!!!Update available, downloading...", 225 "defaultMessage": "!!!Update available, downloading...",
200 "file": "src/components/settings/settings/EditSettingsForm.js", 226 "file": "src/components/settings/settings/EditSettingsForm.js",
201 "start": { 227 "start": {
202 "line": 77, 228 "line": 85,
203 "column": 25 229 "column": 25
204 }, 230 },
205 "end": { 231 "end": {
206 "line": 80, 232 "line": 88,
207 "column": 3 233 "column": 3
208 } 234 }
209 }, 235 },
@@ -212,11 +238,11 @@
212 "defaultMessage": "!!!You are using the latest version of Ferdi", 238 "defaultMessage": "!!!You are using the latest version of Ferdi",
213 "file": "src/components/settings/settings/EditSettingsForm.js", 239 "file": "src/components/settings/settings/EditSettingsForm.js",
214 "start": { 240 "start": {
215 "line": 81, 241 "line": 89,
216 "column": 24 242 "column": 24
217 }, 243 },
218 "end": { 244 "end": {
219 "line": 84, 245 "line": 92,
220 "column": 3 246 "column": 3
221 } 247 }
222 }, 248 },
@@ -225,11 +251,11 @@
225 "defaultMessage": "!!!Current version:", 251 "defaultMessage": "!!!Current version:",
226 "file": "src/components/settings/settings/EditSettingsForm.js", 252 "file": "src/components/settings/settings/EditSettingsForm.js",
227 "start": { 253 "start": {
228 "line": 85, 254 "line": 93,
229 "column": 18 255 "column": 18
230 }, 256 },
231 "end": { 257 "end": {
232 "line": 88, 258 "line": 96,
233 "column": 3 259 "column": 3
234 } 260 }
235 }, 261 },
@@ -238,11 +264,11 @@
238 "defaultMessage": "!!!Changes require restart", 264 "defaultMessage": "!!!Changes require restart",
239 "file": "src/components/settings/settings/EditSettingsForm.js", 265 "file": "src/components/settings/settings/EditSettingsForm.js",
240 "start": { 266 "start": {
241 "line": 89, 267 "line": 97,
242 "column": 29 268 "column": 29
243 }, 269 },
244 "end": { 270 "end": {
245 "line": 92, 271 "line": 100,
246 "column": 3 272 "column": 3
247 } 273 }
248 }, 274 },
@@ -251,11 +277,11 @@
251 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 277 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
252 "file": "src/components/settings/settings/EditSettingsForm.js", 278 "file": "src/components/settings/settings/EditSettingsForm.js",
253 "start": { 279 "start": {
254 "line": 93, 280 "line": 101,
255 "column": 22 281 "column": 22
256 }, 282 },
257 "end": { 283 "end": {
258 "line": 96, 284 "line": 104,
259 "column": 3 285 "column": 3
260 } 286 }
261 } 287 }
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index 83902a8a2..83d9cefe8 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -104,15 +104,41 @@
104 } 104 }
105 }, 105 },
106 { 106 {
107 "id": "settings.app.form.enableLock",
108 "defaultMessage": "!!!Enable Ferdi password lock",
109 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": {
111 "line": 60,
112 "column": 14
113 },
114 "end": {
115 "line": 63,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.app.form.lockPassword",
121 "defaultMessage": "!!!Ferdi Lock password",
122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": {
124 "line": 64,
125 "column": 16
126 },
127 "end": {
128 "line": 67,
129 "column": 3
130 }
131 },
132 {
107 "id": "settings.app.form.language", 133 "id": "settings.app.form.language",
108 "defaultMessage": "!!!Language", 134 "defaultMessage": "!!!Language",
109 "file": "src/containers/settings/EditSettingsScreen.js", 135 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": { 136 "start": {
111 "line": 60, 137 "line": 68,
112 "column": 12 138 "column": 12
113 }, 139 },
114 "end": { 140 "end": {
115 "line": 63, 141 "line": 71,
116 "column": 3 142 "column": 3
117 } 143 }
118 }, 144 },
@@ -121,11 +147,11 @@
121 "defaultMessage": "!!!Dark Mode", 147 "defaultMessage": "!!!Dark Mode",
122 "file": "src/containers/settings/EditSettingsScreen.js", 148 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": { 149 "start": {
124 "line": 64, 150 "line": 72,
125 "column": 12 151 "column": 12
126 }, 152 },
127 "end": { 153 "end": {
128 "line": 67, 154 "line": 75,
129 "column": 3 155 "column": 3
130 } 156 }
131 }, 157 },
@@ -134,11 +160,11 @@
134 "defaultMessage": "!!!Display disabled services tabs", 160 "defaultMessage": "!!!Display disabled services tabs",
135 "file": "src/containers/settings/EditSettingsScreen.js", 161 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": { 162 "start": {
137 "line": 68, 163 "line": 76,
138 "column": 24 164 "column": 24
139 }, 165 },
140 "end": { 166 "end": {
141 "line": 71, 167 "line": 79,
142 "column": 3 168 "column": 3
143 } 169 }
144 }, 170 },
@@ -147,11 +173,11 @@
147 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 173 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
148 "file": "src/containers/settings/EditSettingsScreen.js", 174 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": { 175 "start": {
150 "line": 72, 176 "line": 80,
151 "column": 29 177 "column": 29
152 }, 178 },
153 "end": { 179 "end": {
154 "line": 75, 180 "line": 83,
155 "column": 3 181 "column": 3
156 } 182 }
157 }, 183 },
@@ -160,11 +186,11 @@
160 "defaultMessage": "!!!Enable spell checking", 186 "defaultMessage": "!!!Enable spell checking",
161 "file": "src/containers/settings/EditSettingsScreen.js", 187 "file": "src/containers/settings/EditSettingsScreen.js",
162 "start": { 188 "start": {
163 "line": 76, 189 "line": 84,
164 "column": 23 190 "column": 23
165 }, 191 },
166 "end": { 192 "end": {
167 "line": 79, 193 "line": 87,
168 "column": 3 194 "column": 3
169 } 195 }
170 }, 196 },
@@ -173,11 +199,11 @@
173 "defaultMessage": "!!!Enable GPU Acceleration", 199 "defaultMessage": "!!!Enable GPU Acceleration",
174 "file": "src/containers/settings/EditSettingsScreen.js", 200 "file": "src/containers/settings/EditSettingsScreen.js",
175 "start": { 201 "start": {
176 "line": 80, 202 "line": 88,
177 "column": 25 203 "column": 25
178 }, 204 },
179 "end": { 205 "end": {
180 "line": 83, 206 "line": 91,
181 "column": 3 207 "column": 3
182 } 208 }
183 }, 209 },
@@ -186,11 +212,11 @@
186 "defaultMessage": "!!!Include beta versions", 212 "defaultMessage": "!!!Include beta versions",
187 "file": "src/containers/settings/EditSettingsScreen.js", 213 "file": "src/containers/settings/EditSettingsScreen.js",
188 "start": { 214 "start": {
189 "line": 84, 215 "line": 92,
190 "column": 8 216 "column": 8
191 }, 217 },
192 "end": { 218 "end": {
193 "line": 87, 219 "line": 95,
194 "column": 3 220 "column": 3
195 } 221 }
196 }, 222 },
@@ -199,11 +225,11 @@
199 "defaultMessage": "!!!Enable Franz Todos", 225 "defaultMessage": "!!!Enable Franz Todos",
200 "file": "src/containers/settings/EditSettingsScreen.js", 226 "file": "src/containers/settings/EditSettingsScreen.js",
201 "start": { 227 "start": {
202 "line": 88, 228 "line": 96,
203 "column": 15 229 "column": 15
204 }, 230 },
205 "end": { 231 "end": {
206 "line": 91, 232 "line": 99,
207 "column": 3 233 "column": 3
208 } 234 }
209 }, 235 },
@@ -212,11 +238,11 @@
212 "defaultMessage": "!!!Keep all workspaces loaded", 238 "defaultMessage": "!!!Keep all workspaces loaded",
213 "file": "src/containers/settings/EditSettingsScreen.js", 239 "file": "src/containers/settings/EditSettingsScreen.js",
214 "start": { 240 "start": {
215 "line": 92, 241 "line": 100,
216 "column": 27 242 "column": 27
217 }, 243 },
218 "end": { 244 "end": {
219 "line": 95, 245 "line": 103,
220 "column": 3 246 "column": 3
221 } 247 }
222 } 248 }
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index 311ed5362..521022edd 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -351,15 +351,28 @@
351 } 351 }
352 }, 352 },
353 { 353 {
354 "id": "menu.view.lockFerdi",
355 "defaultMessage": "!!!Lock Ferdi",
356 "file": "src/lib/Menu.js",
357 "start": {
358 "line": 124,
359 "column": 13
360 },
361 "end": {
362 "line": 127,
363 "column": 3
364 }
365 },
366 {
354 "id": "menu.window.minimize", 367 "id": "menu.window.minimize",
355 "defaultMessage": "!!!Minimize", 368 "defaultMessage": "!!!Minimize",
356 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
357 "start": { 370 "start": {
358 "line": 124, 371 "line": 128,
359 "column": 12 372 "column": 12
360 }, 373 },
361 "end": { 374 "end": {
362 "line": 127, 375 "line": 131,
363 "column": 3 376 "column": 3
364 } 377 }
365 }, 378 },
@@ -368,11 +381,11 @@
368 "defaultMessage": "!!!Close", 381 "defaultMessage": "!!!Close",
369 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
370 "start": { 383 "start": {
371 "line": 128, 384 "line": 132,
372 "column": 9 385 "column": 9
373 }, 386 },
374 "end": { 387 "end": {
375 "line": 131, 388 "line": 135,
376 "column": 3 389 "column": 3
377 } 390 }
378 }, 391 },
@@ -381,11 +394,11 @@
381 "defaultMessage": "!!!Learn More", 394 "defaultMessage": "!!!Learn More",
382 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
383 "start": { 396 "start": {
384 "line": 132, 397 "line": 136,
385 "column": 13 398 "column": 13
386 }, 399 },
387 "end": { 400 "end": {
388 "line": 135, 401 "line": 139,
389 "column": 3 402 "column": 3
390 } 403 }
391 }, 404 },
@@ -394,11 +407,11 @@
394 "defaultMessage": "!!!Changelog", 407 "defaultMessage": "!!!Changelog",
395 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
396 "start": { 409 "start": {
397 "line": 136, 410 "line": 140,
398 "column": 13 411 "column": 13
399 }, 412 },
400 "end": { 413 "end": {
401 "line": 139, 414 "line": 143,
402 "column": 3 415 "column": 3
403 } 416 }
404 }, 417 },
@@ -407,11 +420,11 @@
407 "defaultMessage": "!!!Support", 420 "defaultMessage": "!!!Support",
408 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
409 "start": { 422 "start": {
410 "line": 140, 423 "line": 144,
411 "column": 11 424 "column": 11
412 }, 425 },
413 "end": { 426 "end": {
414 "line": 143, 427 "line": 147,
415 "column": 3 428 "column": 3
416 } 429 }
417 }, 430 },
@@ -420,11 +433,11 @@
420 "defaultMessage": "!!!Copy Debug Information", 433 "defaultMessage": "!!!Copy Debug Information",
421 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
422 "start": { 435 "start": {
423 "line": 144, 436 "line": 148,
424 "column": 13 437 "column": 13
425 }, 438 },
426 "end": { 439 "end": {
427 "line": 147, 440 "line": 151,
428 "column": 3 441 "column": 3
429 } 442 }
430 }, 443 },
@@ -433,11 +446,11 @@
433 "defaultMessage": "!!!Ferdi Debug Information", 446 "defaultMessage": "!!!Ferdi Debug Information",
434 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
435 "start": { 448 "start": {
436 "line": 148, 449 "line": 152,
437 "column": 27 450 "column": 27
438 }, 451 },
439 "end": { 452 "end": {
440 "line": 151, 453 "line": 155,
441 "column": 3 454 "column": 3
442 } 455 }
443 }, 456 },
@@ -446,11 +459,11 @@
446 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 459 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
447 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
448 "start": { 461 "start": {
449 "line": 152, 462 "line": 156,
450 "column": 23 463 "column": 23
451 }, 464 },
452 "end": { 465 "end": {
453 "line": 155, 466 "line": 159,
454 "column": 3 467 "column": 3
455 } 468 }
456 }, 469 },
@@ -459,11 +472,11 @@
459 "defaultMessage": "!!!Terms of Service", 472 "defaultMessage": "!!!Terms of Service",
460 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
461 "start": { 474 "start": {
462 "line": 156, 475 "line": 160,
463 "column": 7 476 "column": 7
464 }, 477 },
465 "end": { 478 "end": {
466 "line": 159, 479 "line": 163,
467 "column": 3 480 "column": 3
468 } 481 }
469 }, 482 },
@@ -472,11 +485,11 @@
472 "defaultMessage": "!!!Privacy Statement", 485 "defaultMessage": "!!!Privacy Statement",
473 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
474 "start": { 487 "start": {
475 "line": 160, 488 "line": 164,
476 "column": 11 489 "column": 11
477 }, 490 },
478 "end": { 491 "end": {
479 "line": 163, 492 "line": 167,
480 "column": 3 493 "column": 3
481 } 494 }
482 }, 495 },
@@ -485,11 +498,11 @@
485 "defaultMessage": "!!!File", 498 "defaultMessage": "!!!File",
486 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
487 "start": { 500 "start": {
488 "line": 164, 501 "line": 168,
489 "column": 8 502 "column": 8
490 }, 503 },
491 "end": { 504 "end": {
492 "line": 167, 505 "line": 171,
493 "column": 3 506 "column": 3
494 } 507 }
495 }, 508 },
@@ -498,11 +511,11 @@
498 "defaultMessage": "!!!View", 511 "defaultMessage": "!!!View",
499 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
500 "start": { 513 "start": {
501 "line": 168, 514 "line": 172,
502 "column": 8 515 "column": 8
503 }, 516 },
504 "end": { 517 "end": {
505 "line": 171, 518 "line": 175,
506 "column": 3 519 "column": 3
507 } 520 }
508 }, 521 },
@@ -511,11 +524,11 @@
511 "defaultMessage": "!!!Services", 524 "defaultMessage": "!!!Services",
512 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
513 "start": { 526 "start": {
514 "line": 172, 527 "line": 176,
515 "column": 12 528 "column": 12
516 }, 529 },
517 "end": { 530 "end": {
518 "line": 175, 531 "line": 179,
519 "column": 3 532 "column": 3
520 } 533 }
521 }, 534 },
@@ -524,11 +537,11 @@
524 "defaultMessage": "!!!Window", 537 "defaultMessage": "!!!Window",
525 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
526 "start": { 539 "start": {
527 "line": 176, 540 "line": 180,
528 "column": 10 541 "column": 10
529 }, 542 },
530 "end": { 543 "end": {
531 "line": 179, 544 "line": 183,
532 "column": 3 545 "column": 3
533 } 546 }
534 }, 547 },
@@ -537,11 +550,11 @@
537 "defaultMessage": "!!!Help", 550 "defaultMessage": "!!!Help",
538 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
539 "start": { 552 "start": {
540 "line": 180, 553 "line": 184,
541 "column": 8 554 "column": 8
542 }, 555 },
543 "end": { 556 "end": {
544 "line": 183, 557 "line": 187,
545 "column": 3 558 "column": 3
546 } 559 }
547 }, 560 },
@@ -550,11 +563,11 @@
550 "defaultMessage": "!!!About Ferdi", 563 "defaultMessage": "!!!About Ferdi",
551 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
552 "start": { 565 "start": {
553 "line": 184, 566 "line": 188,
554 "column": 9 567 "column": 9
555 }, 568 },
556 "end": { 569 "end": {
557 "line": 187, 570 "line": 191,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!What's new?", 576 "defaultMessage": "!!!What's new?",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 188, 579 "line": 192,
567 "column": 16 580 "column": 16
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 191, 583 "line": 195,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!Settings", 589 "defaultMessage": "!!!Settings",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 192, 592 "line": 196,
580 "column": 12 593 "column": 12
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 195, 596 "line": 199,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!Check for updates", 602 "defaultMessage": "!!!Check for updates",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 196, 605 "line": 200,
593 "column": 19 606 "column": 19
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 199, 609 "line": 203,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,11 @@
602 "defaultMessage": "!!!Hide", 615 "defaultMessage": "!!!Hide",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 200, 618 "line": 204,
606 "column": 8 619 "column": 8
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 203, 622 "line": 207,
610 "column": 3 623 "column": 3
611 } 624 }
612 }, 625 },
@@ -615,11 +628,11 @@
615 "defaultMessage": "!!!Hide Others", 628 "defaultMessage": "!!!Hide Others",
616 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
617 "start": { 630 "start": {
618 "line": 204, 631 "line": 208,
619 "column": 14 632 "column": 14
620 }, 633 },
621 "end": { 634 "end": {
622 "line": 207, 635 "line": 211,
623 "column": 3 636 "column": 3
624 } 637 }
625 }, 638 },
@@ -628,11 +641,11 @@
628 "defaultMessage": "!!!Unhide", 641 "defaultMessage": "!!!Unhide",
629 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
630 "start": { 643 "start": {
631 "line": 208, 644 "line": 212,
632 "column": 10 645 "column": 10
633 }, 646 },
634 "end": { 647 "end": {
635 "line": 211, 648 "line": 215,
636 "column": 3 649 "column": 3
637 } 650 }
638 }, 651 },
@@ -641,11 +654,11 @@
641 "defaultMessage": "!!!Auto-hide menu bar", 654 "defaultMessage": "!!!Auto-hide menu bar",
642 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
643 "start": { 656 "start": {
644 "line": 212, 657 "line": 216,
645 "column": 19 658 "column": 19
646 }, 659 },
647 "end": { 660 "end": {
648 "line": 215, 661 "line": 219,
649 "column": 3 662 "column": 3
650 } 663 }
651 }, 664 },
@@ -654,11 +667,11 @@
654 "defaultMessage": "!!!Quit", 667 "defaultMessage": "!!!Quit",
655 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
656 "start": { 669 "start": {
657 "line": 216, 670 "line": 220,
658 "column": 8 671 "column": 8
659 }, 672 },
660 "end": { 673 "end": {
661 "line": 219, 674 "line": 223,
662 "column": 3 675 "column": 3
663 } 676 }
664 }, 677 },
@@ -667,11 +680,11 @@
667 "defaultMessage": "!!!Add New Service...", 680 "defaultMessage": "!!!Add New Service...",
668 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
669 "start": { 682 "start": {
670 "line": 220, 683 "line": 224,
671 "column": 17 684 "column": 17
672 }, 685 },
673 "end": { 686 "end": {
674 "line": 223, 687 "line": 227,
675 "column": 3 688 "column": 3
676 } 689 }
677 }, 690 },
@@ -680,11 +693,11 @@
680 "defaultMessage": "!!!Add New Workspace...", 693 "defaultMessage": "!!!Add New Workspace...",
681 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
682 "start": { 695 "start": {
683 "line": 224, 696 "line": 228,
684 "column": 19 697 "column": 19
685 }, 698 },
686 "end": { 699 "end": {
687 "line": 227, 700 "line": 231,
688 "column": 3 701 "column": 3
689 } 702 }
690 }, 703 },
@@ -693,11 +706,11 @@
693 "defaultMessage": "!!!Open workspace drawer", 706 "defaultMessage": "!!!Open workspace drawer",
694 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
695 "start": { 708 "start": {
696 "line": 228, 709 "line": 232,
697 "column": 23 710 "column": 23
698 }, 711 },
699 "end": { 712 "end": {
700 "line": 231, 713 "line": 235,
701 "column": 3 714 "column": 3
702 } 715 }
703 }, 716 },
@@ -706,11 +719,11 @@
706 "defaultMessage": "!!!Close workspace drawer", 719 "defaultMessage": "!!!Close workspace drawer",
707 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
708 "start": { 721 "start": {
709 "line": 232, 722 "line": 236,
710 "column": 24 723 "column": 24
711 }, 724 },
712 "end": { 725 "end": {
713 "line": 235, 726 "line": 239,
714 "column": 3 727 "column": 3
715 } 728 }
716 }, 729 },
@@ -719,11 +732,11 @@
719 "defaultMessage": "!!!Activate next service...", 732 "defaultMessage": "!!!Activate next service...",
720 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
721 "start": { 734 "start": {
722 "line": 236, 735 "line": 240,
723 "column": 23 736 "column": 23
724 }, 737 },
725 "end": { 738 "end": {
726 "line": 239, 739 "line": 243,
727 "column": 3 740 "column": 3
728 } 741 }
729 }, 742 },
@@ -732,11 +745,11 @@
732 "defaultMessage": "!!!Activate previous service...", 745 "defaultMessage": "!!!Activate previous service...",
733 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
734 "start": { 747 "start": {
735 "line": 240, 748 "line": 244,
736 "column": 27 749 "column": 27
737 }, 750 },
738 "end": { 751 "end": {
739 "line": 243, 752 "line": 247,
740 "column": 3 753 "column": 3
741 } 754 }
742 }, 755 },
@@ -745,11 +758,11 @@
745 "defaultMessage": "!!!Disable notifications & audio", 758 "defaultMessage": "!!!Disable notifications & audio",
746 "file": "src/lib/Menu.js", 759 "file": "src/lib/Menu.js",
747 "start": { 760 "start": {
748 "line": 244, 761 "line": 248,
749 "column": 11 762 "column": 11
750 }, 763 },
751 "end": { 764 "end": {
752 "line": 247, 765 "line": 251,
753 "column": 3 766 "column": 3
754 } 767 }
755 }, 768 },
@@ -758,11 +771,11 @@
758 "defaultMessage": "!!!Enable notifications & audio", 771 "defaultMessage": "!!!Enable notifications & audio",
759 "file": "src/lib/Menu.js", 772 "file": "src/lib/Menu.js",
760 "start": { 773 "start": {
761 "line": 248, 774 "line": 252,
762 "column": 13 775 "column": 13
763 }, 776 },
764 "end": { 777 "end": {
765 "line": 251, 778 "line": 255,
766 "column": 3 779 "column": 3
767 } 780 }
768 }, 781 },
@@ -771,11 +784,11 @@
771 "defaultMessage": "!!!Workspaces", 784 "defaultMessage": "!!!Workspaces",
772 "file": "src/lib/Menu.js", 785 "file": "src/lib/Menu.js",
773 "start": { 786 "start": {
774 "line": 252, 787 "line": 256,
775 "column": 14 788 "column": 14
776 }, 789 },
777 "end": { 790 "end": {
778 "line": 255, 791 "line": 259,
779 "column": 3 792 "column": 3
780 } 793 }
781 }, 794 },
@@ -784,11 +797,11 @@
784 "defaultMessage": "!!!Default", 797 "defaultMessage": "!!!Default",
785 "file": "src/lib/Menu.js", 798 "file": "src/lib/Menu.js",
786 "start": { 799 "start": {
787 "line": 256, 800 "line": 260,
788 "column": 20 801 "column": 20
789 }, 802 },
790 "end": { 803 "end": {
791 "line": 259, 804 "line": 263,
792 "column": 3 805 "column": 3
793 } 806 }
794 }, 807 },
@@ -797,11 +810,11 @@
797 "defaultMessage": "!!!Todos", 810 "defaultMessage": "!!!Todos",
798 "file": "src/lib/Menu.js", 811 "file": "src/lib/Menu.js",
799 "start": { 812 "start": {
800 "line": 260, 813 "line": 264,
801 "column": 9 814 "column": 9
802 }, 815 },
803 "end": { 816 "end": {
804 "line": 263, 817 "line": 267,
805 "column": 3 818 "column": 3
806 } 819 }
807 }, 820 },
@@ -810,11 +823,11 @@
810 "defaultMessage": "!!!Open Todos drawer", 823 "defaultMessage": "!!!Open Todos drawer",
811 "file": "src/lib/Menu.js", 824 "file": "src/lib/Menu.js",
812 "start": { 825 "start": {
813 "line": 264, 826 "line": 268,
814 "column": 19 827 "column": 19
815 }, 828 },
816 "end": { 829 "end": {
817 "line": 267, 830 "line": 271,
818 "column": 3 831 "column": 3
819 } 832 }
820 }, 833 },
@@ -823,11 +836,11 @@
823 "defaultMessage": "!!!Close Todos drawer", 836 "defaultMessage": "!!!Close Todos drawer",
824 "file": "src/lib/Menu.js", 837 "file": "src/lib/Menu.js",
825 "start": { 838 "start": {
826 "line": 268, 839 "line": 272,
827 "column": 20 840 "column": 20
828 }, 841 },
829 "end": { 842 "end": {
830 "line": 271, 843 "line": 275,
831 "column": 3 844 "column": 3
832 } 845 }
833 }, 846 },
@@ -836,11 +849,11 @@
836 "defaultMessage": "!!!Enable Todos", 849 "defaultMessage": "!!!Enable Todos",
837 "file": "src/lib/Menu.js", 850 "file": "src/lib/Menu.js",
838 "start": { 851 "start": {
839 "line": 272, 852 "line": 276,
840 "column": 15 853 "column": 15
841 }, 854 },
842 "end": { 855 "end": {
843 "line": 275, 856 "line": 279,
844 "column": 3 857 "column": 3
845 } 858 }
846 } 859 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index f5d24951c..9d8f1ba81 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -121,6 +121,10 @@ const menuItems = defineMessages({
121 id: 'menu.view.reloadFranz', 121 id: 'menu.view.reloadFranz',
122 defaultMessage: '!!!Reload Ferdi', 122 defaultMessage: '!!!Reload Ferdi',
123 }, 123 },
124 lockFerdi: {
125 id: 'menu.view.lockFerdi',
126 defaultMessage: '!!!Lock Ferdi',
127 },
124 minimize: { 128 minimize: {
125 id: 'menu.window.minimize', 129 id: 'menu.window.minimize',
126 defaultMessage: '!!!Minimize', 130 defaultMessage: '!!!Minimize',
@@ -659,6 +663,7 @@ export default class FranzMenu {
659 663
660 const { intl } = window.ferdi; 664 const { intl } = window.ferdi;
661 const tpl = isMac ? _templateFactory(intl) : _titleBarTemplateFactory(intl); 665 const tpl = isMac ? _templateFactory(intl) : _titleBarTemplateFactory(intl);
666 const { actions } = this;
662 667
663 tpl[1].submenu.push({ 668 tpl[1].submenu.push({
664 type: 'separator', 669 type: 'separator',
@@ -706,6 +711,20 @@ export default class FranzMenu {
706 click: () => { 711 click: () => {
707 window.location.reload(); 712 window.location.reload();
708 }, 713 },
714 }, {
715 type: 'separator',
716 }, {
717 label: intl.formatMessage(menuItems.lockFerdi),
718 accelerator: 'CmdOrCtrl+Shift+L',
719 enabled: this.stores.settings.app.lockingFeatureEnabled,
720 click() {
721 actions.settings.update({
722 type: 'app',
723 data: {
724 locked: true,
725 },
726 });
727 },
709 }); 728 });
710 729
711 tpl.unshift({ 730 tpl.unshift({
diff --git a/src/stores/SettingsStore.js b/src/stores/SettingsStore.js
index 2975499b3..f6a53f147 100644
--- a/src/stores/SettingsStore.js
+++ b/src/stores/SettingsStore.js
@@ -62,6 +62,34 @@ export default class SettingsStore extends Store {
62 this.all.app.autohideMenuBar, 62 this.all.app.autohideMenuBar,
63 ), 63 ),
64 ); 64 );
65
66 reaction(
67 () => this.all.app.locked,
68 () => {
69 const { router } = window.ferdi.stores;
70
71 if (this.all.app.locked && this.all.app.lockingFeatureEnabled) {
72 // App just got locked, redirect to unlock screen
73 router.push('/auth/locked');
74 } else if (router.location.pathname.includes('/auth/locked')) {
75 // App is unlocked but user is still on locked screen
76 // Redirect to homepage
77 router.push('/');
78 }
79 },
80 );
81
82 // Make sure to lock app on launch if locking feature is enabled
83 setTimeout(() => {
84 if (this.all.app.lockingFeatureEnabled) {
85 this.actions.settings.update({
86 type: 'app',
87 data: {
88 locked: true,
89 },
90 });
91 }
92 }, 1000);
65 } 93 }
66 94
67 @computed get app() { 95 @computed get app() {