aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.nvmrc2
-rw-r--r--.travis.yml2
-rw-r--r--CHANGELOG.md2
-rw-r--r--appveyor.yml2
-rw-r--r--build-helpers/default.entitlements.mac.plist14
-rw-r--r--electron-builder.yml14
-rw-r--r--package-lock.json2954
-rw-r--r--package.json14
-rw-r--r--packages/forms/package.json6
-rw-r--r--packages/forms/src/index.ts1
-rw-r--r--packages/forms/src/textarea/index.tsx128
-rw-r--r--packages/forms/src/textarea/styles.ts53
-rw-r--r--packages/ui/package-lock.json95
-rw-r--r--packages/ui/package.json7
-rw-r--r--src/actions/service.js9
-rw-r--r--src/components/auth/Pricing.js29
-rw-r--r--src/components/auth/SetupAssistant.js319
-rw-r--r--src/components/layout/Sidebar.js3
-rw-r--r--src/components/services/content/ServiceView.js73
-rw-r--r--src/components/services/content/ServiceWebview.js5
-rw-r--r--src/components/services/content/Services.js6
-rw-r--r--src/components/services/tabs/TabItem.js87
-rw-r--r--src/components/settings/services/EditServiceForm.js13
-rw-r--r--src/components/settings/settings/EditSettingsForm.js14
-rw-r--r--src/components/ui/FeatureList.js2
-rw-r--r--src/components/ui/Modal/index.js4
-rw-r--r--src/config.js5
-rw-r--r--src/containers/auth/SetupAssistantScreen.js133
-rw-r--r--src/containers/layout/AppLayoutContainer.js2
-rw-r--r--src/containers/settings/EditServiceScreen.js14
-rw-r--r--src/containers/settings/EditSettingsScreen.js5
-rw-r--r--src/electron/Settings.js4
-rw-r--r--src/electron/ipc-api/cld.js20
-rw-r--r--src/electron/ipc-api/dnd.js16
-rw-r--r--src/electron/ipc-api/download.js26
-rw-r--r--src/electron/ipc-api/index.js4
-rw-r--r--src/electron/ipc-api/settings.js4
-rw-r--r--src/features/todos/actions.js9
-rw-r--r--src/features/todos/components/TodosWebview.js31
-rw-r--r--src/features/todos/containers/TodosScreen.js3
-rw-r--r--src/features/todos/index.js2
-rw-r--r--src/features/todos/preload.js7
-rw-r--r--src/features/todos/store.js50
-rw-r--r--src/helpers/userAgent-helpers.js2
-rw-r--r--src/i18n/languages.js116
-rw-r--r--src/i18n/locales/bg.json439
-rw-r--r--src/i18n/locales/defaultMessages.json712
-rw-r--r--src/i18n/locales/en-US.json14
-rw-r--r--src/i18n/locales/et.json439
-rw-r--r--src/i18n/locales/fa.json439
-rw-r--r--src/i18n/locales/fil.json439
-rw-r--r--src/i18n/locales/hi.json439
-rw-r--r--src/i18n/locales/kk.json439
-rw-r--r--src/i18n/locales/ms.json439
-rw-r--r--src/i18n/locales/si.json439
-rw-r--r--src/i18n/locales/sq.json439
-rw-r--r--src/i18n/locales/whitelist_en-US.json3
-rw-r--r--src/i18n/locales/zh-HANS.json439
-rw-r--r--src/i18n/messages/src/components/auth/ServiceAssistant.json93
-rw-r--r--src/i18n/messages/src/components/auth/SetupAssistant.json54
-rw-r--r--src/i18n/messages/src/components/services/content/Services.json20
-rw-r--r--src/i18n/messages/src/components/services/tabs/TabItem.json36
-rw-r--r--src/i18n/messages/src/components/settings/services/EditServiceForm.json118
-rw-r--r--src/i18n/messages/src/containers/settings/EditServiceScreen.json6
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json186
-rw-r--r--src/i18n/messages/src/features/todos/components/TodosWebview.json12
-rw-r--r--src/i18n/messages/src/lib/Menu.json181
-rw-r--r--src/index.js31
-rw-r--r--src/lib/Menu.js12
-rw-r--r--src/models/Recipe.js4
-rw-r--r--src/models/Service.js31
-rw-r--r--src/routes.js2
-rw-r--r--src/stores/AppStore.js136
-rw-r--r--src/stores/RecipesStore.js2
-rw-r--r--src/stores/ServicesStore.js131
-rw-r--r--src/stores/UserStore.js19
-rw-r--r--src/styles/auth.scss2
-rw-r--r--src/styles/layout.scss5
-rw-r--r--src/styles/services.scss4
-rw-r--r--src/webview/contextMenu.js12
-rw-r--r--src/webview/contextMenuBuilder.js48
-rw-r--r--src/webview/recipe.js61
-rw-r--r--src/webview/spellchecker.js73
-rw-r--r--tsconfig.settings.json2
-rw-r--r--uidev/src/app.tsx1
-rw-r--r--uidev/src/stories/textarea.stories.tsx43
86 files changed, 8709 insertions, 2046 deletions
diff --git a/.nvmrc b/.nvmrc
index 73bffb039..493319d27 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
10.17.0 12.16.3
diff --git a/.travis.yml b/.travis.yml
index 80b9dedd1..0d818e995 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,7 +13,7 @@ matrix:
13 - rpm 13 - rpm
14 - os: osx 14 - os: osx
15 if: branch IN (nightly, release) 15 if: branch IN (nightly, release)
16 osx_image: xcode11 16 osx_image: xcode12
17 17
18language: node_js 18language: node_js
19git: 19git:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d36e75ed9..fada8808a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
1# [5.6.0-beta.1](https://github.com/getferdi/ferdi/compare/v5.5.0...v5.6.0-beta.1) (2020-06-14) 1# [5.6.0-beta.2](https://github.com/getferdi/ferdi/compare/v5.5.0...v5.6.0-beta.2) (2020-06-14)
2 2
3### Features 3### Features
4- Make the notifications badge work with LauncherAPI-compliant (#736) 💖 @gabspeck 4- Make the notifications badge work with LauncherAPI-compliant (#736) 💖 @gabspeck
diff --git a/appveyor.yml b/appveyor.yml
index 2f5299dd9..9ca5e17f5 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -9,6 +9,8 @@ cache:
9 - '%APPDATA%\npm-cache' 9 - '%APPDATA%\npm-cache'
10 - node_modules 10 - node_modules
11 11
12image: Visual Studio 2019
13
12install: 14install:
13 - appveyor-retry git submodule update --init --recursive 15 - appveyor-retry git submodule update --init --recursive
14 - ps: Install-Product node 10 16 - ps: Install-Product node 10
diff --git a/build-helpers/default.entitlements.mac.plist b/build-helpers/default.entitlements.mac.plist
new file mode 100644
index 000000000..0d5b36ba1
--- /dev/null
+++ b/build-helpers/default.entitlements.mac.plist
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3<plist version="1.0">
4 <dict>
5 <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
6 <true/>
7 <key>com.apple.security.cs.disable-library-validation</key>
8 <true/>
9 <key>com.apple.security.device.camera</key>
10 <true/>
11 <key>com.apple.security.device.audio-input</key>
12 <true/>
13 </dict>
14</plist>
diff --git a/electron-builder.yml b/electron-builder.yml
index 86349ba6b..7091dfb74 100644
--- a/electron-builder.yml
+++ b/electron-builder.yml
@@ -15,10 +15,8 @@ mac:
15 entitlements: "./build-helpers/entitlements.mas.plist" 15 entitlements: "./build-helpers/entitlements.mas.plist"
16 entitlementsInherit: "./build-helpers/entitlements.mas.inherit.plist" 16 entitlementsInherit: "./build-helpers/entitlements.mas.inherit.plist"
17 extendInfo: 17 extendInfo:
18 NSMicrophoneUsageDescription: "This app requires camera access for video messaging services." 18 NSCameraUsageDescription: "This app requires camera access for video chats"
19 NSCameraUsageDescription: "This app requires microphone access for audio messaging services." 19 NSMicrophoneUsageDescription: "This app requires microphone access for voice chats"
20
21afterSign: ./build-helpers/notarize.js
22 20
23dmg: 21dmg:
24 background: ./build-helpers/images/dmgInstaller.tiff 22 background: ./build-helpers/images/dmgInstaller.tiff
@@ -30,6 +28,8 @@ dmg:
30 { x: 122, y: 240, type: file }, 28 { x: 122, y: 240, type: file },
31 ] 29 ]
32 30
31afterSign: ./build-helpers/notarize.js
32
33win: 33win:
34 icon: ./build-helpers/images/icon.ico 34 icon: ./build-helpers/images/icon.ico
35 target: 35 target:
@@ -43,8 +43,8 @@ linux:
43 icon: ./build-helpers/images/icons 43 icon: ./build-helpers/images/icons
44 category: Network;InstantMessaging; 44 category: Network;InstantMessaging;
45 executableName: ferdi 45 executableName: ferdi
46 synopsis: "Messaging app for WhatsApp, Slack, Telegram, HipChat, Hangouts and many many more." 46 synopsis: "Messaging app for WhatsApp, Slack, Telegram, Gmail, Hangouts and many many more."
47 description: "Ferdi is your messaging app / former Emperor of Austria and combines chat & messaging services into one application. Ferdi currently supports Slack, WhatsApp, WeChat, HipChat, Facebook Messenger, Telegram, Google Hangouts, GroupMe, Skype and many more. You can download Ferdi for free for Mac & Windows." 47 description: "Ferdi is your messaging app / former Emperor of Austria and combines chat & messaging services into one application. Ferdi currently supports Slack, WhatsApp, Gmail, Facebook Messenger, Telegram, Google Hangouts, GroupMe, Skype and many more. You can download Ferdi for free for Mac & Windows."
48 target: 48 target:
49 - target: AppImage 49 - target: AppImage
50 - target: deb 50 - target: deb
@@ -62,4 +62,4 @@ protocols:
62asarUnpack: 62asarUnpack:
63 - ./recipes 63 - ./recipes
64 - ./node_modules/mac-screen-capture-permissions 64 - ./node_modules/mac-screen-capture-permissions
65 - ./assets/images/taskbar 65 - ./assets/images/taskbar \ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 2cf5046b9..532fd96e9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1438,6 +1438,12 @@
1438 "@babel/types": "^7.4.4" 1438 "@babel/types": "^7.4.4"
1439 } 1439 }
1440 }, 1440 },
1441 "@babel/helper-validator-identifier": {
1442 "version": "7.10.4",
1443 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
1444 "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
1445 "dev": true
1446 },
1441 "@babel/helper-wrap-function": { 1447 "@babel/helper-wrap-function": {
1442 "version": "7.7.4", 1448 "version": "7.7.4",
1443 "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", 1449 "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz",
@@ -1991,13 +1997,111 @@
1991 } 1997 }
1992 }, 1998 },
1993 "@babel/plugin-transform-dotall-regex": { 1999 "@babel/plugin-transform-dotall-regex": {
1994 "version": "7.7.4", 2000 "version": "7.12.1",
1995 "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", 2001 "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
1996 "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", 2002 "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
1997 "dev": true, 2003 "dev": true,
1998 "requires": { 2004 "requires": {
1999 "@babel/helper-create-regexp-features-plugin": "^7.7.4", 2005 "@babel/helper-create-regexp-features-plugin": "^7.12.1",
2000 "@babel/helper-plugin-utils": "^7.0.0" 2006 "@babel/helper-plugin-utils": "^7.10.4"
2007 },
2008 "dependencies": {
2009 "@babel/helper-annotate-as-pure": {
2010 "version": "7.10.4",
2011 "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
2012 "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
2013 "dev": true,
2014 "requires": {
2015 "@babel/types": "^7.10.4"
2016 }
2017 },
2018 "@babel/helper-create-regexp-features-plugin": {
2019 "version": "7.12.1",
2020 "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz",
2021 "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==",
2022 "dev": true,
2023 "requires": {
2024 "@babel/helper-annotate-as-pure": "^7.10.4",
2025 "@babel/helper-regex": "^7.10.4",
2026 "regexpu-core": "^4.7.1"
2027 }
2028 },
2029 "@babel/helper-plugin-utils": {
2030 "version": "7.10.4",
2031 "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
2032 "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
2033 "dev": true
2034 },
2035 "@babel/helper-regex": {
2036 "version": "7.10.5",
2037 "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
2038 "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
2039 "dev": true,
2040 "requires": {
2041 "lodash": "^4.17.19"
2042 }
2043 },
2044 "@babel/types": {
2045 "version": "7.12.1",
2046 "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
2047 "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
2048 "dev": true,
2049 "requires": {
2050 "@babel/helper-validator-identifier": "^7.10.4",
2051 "lodash": "^4.17.19",
2052 "to-fast-properties": "^2.0.0"
2053 }
2054 },
2055 "jsesc": {
2056 "version": "0.5.0",
2057 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
2058 "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
2059 "dev": true
2060 },
2061 "lodash": {
2062 "version": "4.17.20",
2063 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
2064 "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
2065 "dev": true
2066 },
2067 "regenerate-unicode-properties": {
2068 "version": "8.2.0",
2069 "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
2070 "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
2071 "dev": true,
2072 "requires": {
2073 "regenerate": "^1.4.0"
2074 }
2075 },
2076 "regexpu-core": {
2077 "version": "4.7.1",
2078 "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
2079 "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
2080 "dev": true,
2081 "requires": {
2082 "regenerate": "^1.4.0",
2083 "regenerate-unicode-properties": "^8.2.0",
2084 "regjsgen": "^0.5.1",
2085 "regjsparser": "^0.6.4",
2086 "unicode-match-property-ecmascript": "^1.0.4",
2087 "unicode-match-property-value-ecmascript": "^1.2.0"
2088 }
2089 },
2090 "regjsparser": {
2091 "version": "0.6.4",
2092 "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
2093 "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
2094 "dev": true,
2095 "requires": {
2096 "jsesc": "~0.5.0"
2097 }
2098 },
2099 "unicode-match-property-value-ecmascript": {
2100 "version": "1.2.0",
2101 "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
2102 "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
2103 "dev": true
2104 }
2001 } 2105 }
2002 }, 2106 },
2003 "@babel/plugin-transform-duplicate-keys": { 2107 "@babel/plugin-transform-duplicate-keys": {
@@ -2566,20 +2670,19 @@
2566 } 2670 }
2567 }, 2671 },
2568 "@electron/get": { 2672 "@electron/get": {
2569 "version": "1.12.3", 2673 "version": "1.12.2",
2570 "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.3.tgz", 2674 "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz",
2571 "integrity": "sha512-NFwSnVZQK7dhOYF1NQCt+HGqgL1aNdj0LUSx75uCqnZJqyiWCVdAMFV4b4/kC8HjUJAnsvdSEmjEt4G2qNQ9+Q==", 2675 "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==",
2572 "dev": true, 2676 "dev": true,
2573 "requires": { 2677 "requires": {
2574 "debug": "^4.1.1", 2678 "debug": "^4.1.1",
2575 "env-paths": "^2.2.0", 2679 "env-paths": "^2.2.0",
2576 "filenamify": "^4.1.0",
2577 "fs-extra": "^8.1.0", 2680 "fs-extra": "^8.1.0",
2578 "global-agent": "^2.0.2", 2681 "global-agent": "^2.0.2",
2579 "global-tunnel-ng": "^2.7.1", 2682 "global-tunnel-ng": "^2.7.1",
2580 "got": "^9.6.0", 2683 "got": "^9.6.0",
2581 "progress": "^2.0.3", 2684 "progress": "^2.0.3",
2582 "semver": "^6.2.0", 2685 "sanitize-filename": "^1.6.2",
2583 "sumchecker": "^3.0.1" 2686 "sumchecker": "^3.0.1"
2584 }, 2687 },
2585 "dependencies": { 2688 "dependencies": {
@@ -2589,17 +2692,6 @@
2589 "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", 2692 "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
2590 "dev": true 2693 "dev": true
2591 }, 2694 },
2592 "filenamify": {
2593 "version": "4.2.0",
2594 "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.2.0.tgz",
2595 "integrity": "sha512-pkgE+4p7N1n7QieOopmn3TqJaefjdWXwEkj2XLZJLKfOgcQKkn11ahvGNgTD8mLggexLiDFQxeTs14xVU22XPA==",
2596 "dev": true,
2597 "requires": {
2598 "filename-reserved-regex": "^2.0.0",
2599 "strip-outer": "^1.0.1",
2600 "trim-repeated": "^1.0.0"
2601 }
2602 },
2603 "fs-extra": { 2695 "fs-extra": {
2604 "version": "8.1.0", 2696 "version": "8.1.0",
2605 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 2697 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
@@ -2610,12 +2702,6 @@
2610 "jsonfile": "^4.0.0", 2702 "jsonfile": "^4.0.0",
2611 "universalify": "^0.1.0" 2703 "universalify": "^0.1.0"
2612 } 2704 }
2613 },
2614 "semver": {
2615 "version": "6.3.0",
2616 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
2617 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
2618 "dev": true
2619 } 2705 }
2620 } 2706 }
2621 }, 2707 },
@@ -3151,6 +3237,19 @@
3151 "yargs": "^14.2.2" 3237 "yargs": "^14.2.2"
3152 }, 3238 },
3153 "dependencies": { 3239 "dependencies": {
3240 "@mdi/js": {
3241 "version": "3.9.97",
3242 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.9.97.tgz",
3243 "integrity": "sha512-JzX6rDlUcNZHaoUg9sAzdg5Js287tvgRbNmMIyKoJK2ZCP9JupeWTYlpbX4oNJ9Zg9v8YH76WuWLALKOospQgw=="
3244 },
3245 "@meetfranz/theme": {
3246 "version": "1.0.14",
3247 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
3248 "integrity": "sha512-iWP+3ifiNum98sHKiNdUJK+R0p4Z7TT8OenA1N2BnSC6CFob+dLhzAK+o5lxcyEcKZKYDwd7JKRZj93wqpBPpg==",
3249 "requires": {
3250 "color": "^3.1.0"
3251 }
3252 },
3154 "ansi-regex": { 3253 "ansi-regex": {
3155 "version": "4.1.0", 3254 "version": "4.1.0",
3156 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 3255 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
@@ -3212,9 +3311,9 @@
3212 } 3311 }
3213 }, 3312 },
3214 "yargs": { 3313 "yargs": {
3215 "version": "14.2.2", 3314 "version": "14.2.3",
3216 "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", 3315 "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
3217 "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", 3316 "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
3218 "dev": true, 3317 "dev": true,
3219 "requires": { 3318 "requires": {
3220 "cliui": "^5.0.0", 3319 "cliui": "^5.0.0",
@@ -3227,13 +3326,13 @@
3227 "string-width": "^3.0.0", 3326 "string-width": "^3.0.0",
3228 "which-module": "^2.0.0", 3327 "which-module": "^2.0.0",
3229 "y18n": "^4.0.0", 3328 "y18n": "^4.0.0",
3230 "yargs-parser": "^15.0.0" 3329 "yargs-parser": "^15.0.1"
3231 } 3330 }
3232 }, 3331 },
3233 "yargs-parser": { 3332 "yargs-parser": {
3234 "version": "15.0.0", 3333 "version": "15.0.1",
3235 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", 3334 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
3236 "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", 3335 "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
3237 "dev": true, 3336 "dev": true,
3238 "requires": { 3337 "requires": {
3239 "camelcase": "^5.0.0", 3338 "camelcase": "^5.0.0",
@@ -3265,6 +3364,21 @@
3265 "minimatch": "^3.0.4", 3364 "minimatch": "^3.0.4",
3266 "npmlog": "^4.1.2", 3365 "npmlog": "^4.1.2",
3267 "slash": "^2.0.0" 3366 "slash": "^2.0.0"
3367 },
3368 "dependencies": {
3369 "@mdi/js": {
3370 "version": "3.9.97",
3371 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.9.97.tgz",
3372 "integrity": "sha512-JzX6rDlUcNZHaoUg9sAzdg5Js287tvgRbNmMIyKoJK2ZCP9JupeWTYlpbX4oNJ9Zg9v8YH76WuWLALKOospQgw=="
3373 },
3374 "@meetfranz/theme": {
3375 "version": "1.0.14",
3376 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
3377 "integrity": "sha512-iWP+3ifiNum98sHKiNdUJK+R0p4Z7TT8OenA1N2BnSC6CFob+dLhzAK+o5lxcyEcKZKYDwd7JKRZj93wqpBPpg==",
3378 "requires": {
3379 "color": "^3.1.0"
3380 }
3381 }
3268 } 3382 }
3269 }, 3383 },
3270 "@lerna/command": { 3384 "@lerna/command": {
@@ -3906,6 +4020,12 @@
3906 "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 4020 "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
3907 "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 4021 "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
3908 "dev": true 4022 "dev": true
4023 },
4024 "type-fest": {
4025 "version": "0.3.1",
4026 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
4027 "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
4028 "dev": true
3909 } 4029 }
3910 } 4030 }
3911 }, 4031 },
@@ -4009,6 +4129,12 @@
4009 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 4129 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
4010 "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 4130 "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
4011 "dev": true 4131 "dev": true
4132 },
4133 "type-fest": {
4134 "version": "0.3.1",
4135 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
4136 "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
4137 "dev": true
4012 } 4138 }
4013 } 4139 }
4014 }, 4140 },
@@ -4299,6 +4425,12 @@
4299 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 4425 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
4300 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 4426 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
4301 "dev": true 4427 "dev": true
4428 },
4429 "type-fest": {
4430 "version": "0.3.1",
4431 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
4432 "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
4433 "dev": true
4302 } 4434 }
4303 } 4435 }
4304 }, 4436 },
@@ -4337,6 +4469,7 @@
4337 "requires": { 4469 "requires": {
4338 "@mdi/js": "^3.3.92", 4470 "@mdi/js": "^3.3.92",
4339 "@mdi/react": "^1.1.0", 4471 "@mdi/react": "^1.1.0",
4472 "@meetfranz/theme": "^1.0.14",
4340 "react-html-attributes": "^1.4.3", 4473 "react-html-attributes": "^1.4.3",
4341 "react-loader": "^2.4.5" 4474 "react-loader": "^2.4.5"
4342 }, 4475 },
@@ -4357,8 +4490,8 @@
4357 "@meetfranz/ui": { 4490 "@meetfranz/ui": {
4358 "version": "file:packages/ui", 4491 "version": "file:packages/ui",
4359 "requires": { 4492 "requires": {
4360 "@mdi/js": "^3.3.92",
4361 "@mdi/react": "^1.1.0", 4493 "@mdi/react": "^1.1.0",
4494 "@meetfranz/theme": "^1.0.14",
4362 "react-loader": "^2.4.5" 4495 "react-loader": "^2.4.5"
4363 }, 4496 },
4364 "dependencies": { 4497 "dependencies": {
@@ -4941,9 +5074,10 @@
4941 "dev": true 5074 "dev": true
4942 }, 5075 },
4943 "@types/node": { 5076 "@types/node": {
4944 "version": "12.7.5", 5077 "version": "12.12.54",
4945 "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", 5078 "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz",
4946 "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==" 5079 "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==",
5080 "dev": true
4947 }, 5081 },
4948 "@types/normalize-package-data": { 5082 "@types/normalize-package-data": {
4949 "version": "2.4.0", 5083 "version": "2.4.0",
@@ -4996,12 +5130,9 @@
4996 } 5130 }
4997 }, 5131 },
4998 "@types/semver": { 5132 "@types/semver": {
4999 "version": "7.1.0", 5133 "version": "7.3.4",
5000 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz", 5134 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz",
5001 "integrity": "sha512-pOKLaubrAEMUItGNpgwl0HMFPrSAFic8oSVIvfu1UwcgGNmNyK9gyhBHKmBnUTwwVvpZfkzUC0GaMgnL6P86uA==", 5135 "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ=="
5002 "requires": {
5003 "@types/node": "*"
5004 }
5005 }, 5136 },
5006 "@types/stack-utils": { 5137 "@types/stack-utils": {
5007 "version": "1.0.1", 5138 "version": "1.0.1",
@@ -5252,9 +5383,9 @@
5252 } 5383 }
5253 }, 5384 },
5254 "abab": { 5385 "abab": {
5255 "version": "2.0.3", 5386 "version": "2.0.5",
5256 "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", 5387 "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
5257 "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", 5388 "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
5258 "dev": true 5389 "dev": true
5259 }, 5390 },
5260 "abbrev": { 5391 "abbrev": {
@@ -5347,11 +5478,18 @@
5347 "dev": true 5478 "dev": true
5348 }, 5479 },
5349 "address-rfc2822": { 5480 "address-rfc2822": {
5350 "version": "2.0.4", 5481 "version": "2.0.5",
5351 "resolved": "https://registry.npmjs.org/address-rfc2822/-/address-rfc2822-2.0.4.tgz", 5482 "resolved": "https://registry.npmjs.org/address-rfc2822/-/address-rfc2822-2.0.5.tgz",
5352 "integrity": "sha1-Lb07jWwt4elXwahUncAS1Au8NDE=", 5483 "integrity": "sha512-SDmgEM2qAXyBZ9v6QMGbBKsvfkClZy8I2ormg/+uopbrP8XzpcoObd1QNe6bnc+KWaHLjGVu7+PghCOC52TqGA==",
5353 "requires": { 5484 "requires": {
5354 "email-addresses": "^3.0.0" 5485 "email-addresses": "^3.1.0"
5486 },
5487 "dependencies": {
5488 "email-addresses": {
5489 "version": "3.1.0",
5490 "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
5491 "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg=="
5492 }
5355 } 5493 }
5356 }, 5494 },
5357 "after": { 5495 "after": {
@@ -5379,14 +5517,21 @@
5379 } 5517 }
5380 }, 5518 },
5381 "ajv": { 5519 "ajv": {
5382 "version": "6.10.2", 5520 "version": "6.12.6",
5383 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 5521 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
5384 "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 5522 "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
5385 "requires": { 5523 "requires": {
5386 "fast-deep-equal": "^2.0.1", 5524 "fast-deep-equal": "^3.1.1",
5387 "fast-json-stable-stringify": "^2.0.0", 5525 "fast-json-stable-stringify": "^2.0.0",
5388 "json-schema-traverse": "^0.4.1", 5526 "json-schema-traverse": "^0.4.1",
5389 "uri-js": "^4.2.2" 5527 "uri-js": "^4.2.2"
5528 },
5529 "dependencies": {
5530 "fast-deep-equal": {
5531 "version": "3.1.3",
5532 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
5533 "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
5534 }
5390 } 5535 }
5391 }, 5536 },
5392 "ajv-errors": { 5537 "ajv-errors": {
@@ -5396,9 +5541,9 @@
5396 "dev": true 5541 "dev": true
5397 }, 5542 },
5398 "ajv-keywords": { 5543 "ajv-keywords": {
5399 "version": "3.4.1", 5544 "version": "3.5.2",
5400 "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", 5545 "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
5401 "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", 5546 "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
5402 "dev": true 5547 "dev": true
5403 }, 5548 },
5404 "all-contributors-cli": { 5549 "all-contributors-cli": {
@@ -5426,19 +5571,18 @@
5426 "dev": true 5571 "dev": true
5427 }, 5572 },
5428 "ansi-styles": { 5573 "ansi-styles": {
5429 "version": "4.2.0", 5574 "version": "4.3.0",
5430 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", 5575 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
5431 "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", 5576 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
5432 "dev": true, 5577 "dev": true,
5433 "requires": { 5578 "requires": {
5434 "@types/color-name": "^1.1.1",
5435 "color-convert": "^2.0.1" 5579 "color-convert": "^2.0.1"
5436 } 5580 }
5437 }, 5581 },
5438 "async": { 5582 "async": {
5439 "version": "3.1.0", 5583 "version": "3.2.0",
5440 "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", 5584 "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
5441 "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==", 5585 "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
5442 "dev": true 5586 "dev": true
5443 }, 5587 },
5444 "chalk": { 5588 "chalk": {
@@ -5522,9 +5666,9 @@
5522 } 5666 }
5523 }, 5667 },
5524 "supports-color": { 5668 "supports-color": {
5525 "version": "7.1.0", 5669 "version": "7.2.0",
5526 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 5670 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
5527 "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 5671 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
5528 "dev": true, 5672 "dev": true,
5529 "requires": { 5673 "requires": {
5530 "has-flag": "^4.0.0" 5674 "has-flag": "^4.0.0"
@@ -5568,9 +5712,9 @@
5568 } 5712 }
5569 }, 5713 },
5570 "yargs": { 5714 "yargs": {
5571 "version": "14.2.2", 5715 "version": "14.2.3",
5572 "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", 5716 "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
5573 "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", 5717 "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
5574 "dev": true, 5718 "dev": true,
5575 "requires": { 5719 "requires": {
5576 "cliui": "^5.0.0", 5720 "cliui": "^5.0.0",
@@ -5583,13 +5727,13 @@
5583 "string-width": "^3.0.0", 5727 "string-width": "^3.0.0",
5584 "which-module": "^2.0.0", 5728 "which-module": "^2.0.0",
5585 "y18n": "^4.0.0", 5729 "y18n": "^4.0.0",
5586 "yargs-parser": "^15.0.0" 5730 "yargs-parser": "^15.0.1"
5587 } 5731 }
5588 }, 5732 },
5589 "yargs-parser": { 5733 "yargs-parser": {
5590 "version": "15.0.0", 5734 "version": "15.0.1",
5591 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", 5735 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
5592 "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", 5736 "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
5593 "dev": true, 5737 "dev": true,
5594 "requires": { 5738 "requires": {
5595 "camelcase": "^5.0.0", 5739 "camelcase": "^5.0.0",
@@ -5904,29 +6048,29 @@
5904 } 6048 }
5905 }, 6049 },
5906 "app-builder-bin": { 6050 "app-builder-bin": {
5907 "version": "3.5.10", 6051 "version": "3.5.9",
5908 "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.10.tgz", 6052 "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.9.tgz",
5909 "integrity": "sha512-Jd+GW68lR0NeetgZDo47PdWBEPdnD+p0jEa7XaxjRC8u6Oo/wgJsfKUkORRgr2NpkD19IFKN50P6JYy04XHFLQ==", 6053 "integrity": "sha512-NSjtqZ3x2kYiDp3Qezsgukx/AUzKPr3Xgf9by4cYt05ILWGAptepeeu0Uv+7MO+41o6ujhLixTou8979JGg2Kg==",
5910 "dev": true 6054 "dev": true
5911 }, 6055 },
5912 "app-builder-lib": { 6056 "app-builder-lib": {
5913 "version": "22.8.1", 6057 "version": "22.7.0",
5914 "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.8.1.tgz", 6058 "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.7.0.tgz",
5915 "integrity": "sha512-D/ac1+vuGIAAwEeTtXl8b+qWl7Gz/IQatFyzYl2ocag/7N8LqUjKzZFJJISQPWt6PFDPDH0oCj8/GMh63aV0yw==", 6059 "integrity": "sha512-blRKwV8h0ztualXS50ciCTo39tbuDGNS+ldcy8+KLvKXuT6OpYnSJ7M6MSfPT+xWatshMHJV1rJx3Tl+k/Sn/g==",
5916 "dev": true, 6060 "dev": true,
5917 "requires": { 6061 "requires": {
5918 "7zip-bin": "~5.0.3", 6062 "7zip-bin": "~5.0.3",
5919 "@develar/schema-utils": "~2.6.5", 6063 "@develar/schema-utils": "~2.6.5",
5920 "async-exit-hook": "^2.0.1", 6064 "async-exit-hook": "^2.0.1",
5921 "bluebird-lst": "^1.0.9", 6065 "bluebird-lst": "^1.0.9",
5922 "builder-util": "22.8.1", 6066 "builder-util": "22.7.0",
5923 "builder-util-runtime": "8.7.2", 6067 "builder-util-runtime": "8.7.1",
5924 "chromium-pickle-js": "^0.2.0", 6068 "chromium-pickle-js": "^0.2.0",
5925 "debug": "^4.2.0", 6069 "debug": "^4.2.0",
5926 "ejs": "^3.1.3", 6070 "ejs": "^3.1.3",
5927 "electron-publish": "22.8.1", 6071 "electron-publish": "22.7.0",
5928 "fs-extra": "^9.0.1", 6072 "fs-extra": "^9.0.0",
5929 "hosted-git-info": "^3.0.5", 6073 "hosted-git-info": "^3.0.4",
5930 "is-ci": "^2.0.0", 6074 "is-ci": "^2.0.0",
5931 "isbinaryfile": "^4.0.6", 6075 "isbinaryfile": "^4.0.6",
5932 "js-yaml": "^3.14.0", 6076 "js-yaml": "^3.14.0",
@@ -5939,16 +6083,59 @@
5939 "temp-file": "^3.3.7" 6083 "temp-file": "^3.3.7"
5940 }, 6084 },
5941 "dependencies": { 6085 "dependencies": {
6086 "@types/fs-extra": {
6087 "version": "9.0.2",
6088 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.2.tgz",
6089 "integrity": "sha512-jp0RI6xfZpi5JL8v7WQwpBEQTq63RqW2kxwTZt+m27LcJqQdPVU1yGnT1ZI4EtCDynQQJtIGyQahkiCGCS7e+A==",
6090 "dev": true,
6091 "requires": {
6092 "@types/node": "*"
6093 }
6094 },
6095 "ansi-styles": {
6096 "version": "4.3.0",
6097 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
6098 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
6099 "dev": true,
6100 "requires": {
6101 "color-convert": "^2.0.1"
6102 }
6103 },
5942 "builder-util-runtime": { 6104 "builder-util-runtime": {
5943 "version": "8.7.2", 6105 "version": "8.7.1",
5944 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz", 6106 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.1.tgz",
5945 "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==", 6107 "integrity": "sha512-uEBH1nAnTvzjcsrh2XI3qOzJ39h0+9kuIuwj+kCc3a07TZNGShfJcai8fFzL3mNgGjEFxoq+XMssR11r+FOFSg==",
5946 "dev": true, 6108 "dev": true,
5947 "requires": { 6109 "requires": {
5948 "debug": "^4.1.1", 6110 "debug": "^4.2.0",
5949 "sax": "^1.2.4" 6111 "sax": "^1.2.4"
5950 } 6112 }
5951 }, 6113 },
6114 "chalk": {
6115 "version": "4.1.0",
6116 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
6117 "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
6118 "dev": true,
6119 "requires": {
6120 "ansi-styles": "^4.1.0",
6121 "supports-color": "^7.1.0"
6122 }
6123 },
6124 "color-convert": {
6125 "version": "2.0.1",
6126 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
6127 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
6128 "dev": true,
6129 "requires": {
6130 "color-name": "~1.1.4"
6131 }
6132 },
6133 "color-name": {
6134 "version": "1.1.4",
6135 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
6136 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
6137 "dev": true
6138 },
5952 "debug": { 6139 "debug": {
5953 "version": "4.2.0", 6140 "version": "4.2.0",
5954 "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", 6141 "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
@@ -5958,6 +6145,22 @@
5958 "ms": "2.1.2" 6145 "ms": "2.1.2"
5959 } 6146 }
5960 }, 6147 },
6148 "electron-publish": {
6149 "version": "22.7.0",
6150 "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.7.0.tgz",
6151 "integrity": "sha512-hmU69xlb6vvAV3QfpHYDlkdZMFdBAgDbptoxbLFrnTq5bOkcL8AaDbvxeoZ4+lvqgs29NwqGpkHo2oN+p/hCfg==",
6152 "dev": true,
6153 "requires": {
6154 "@types/fs-extra": "^9.0.1",
6155 "bluebird-lst": "^1.0.9",
6156 "builder-util": "22.7.0",
6157 "builder-util-runtime": "8.7.1",
6158 "chalk": "^4.0.0",
6159 "fs-extra": "^9.0.0",
6160 "lazy-val": "^1.0.4",
6161 "mime": "^2.4.5"
6162 }
6163 },
5961 "fs-extra": { 6164 "fs-extra": {
5962 "version": "9.0.1", 6165 "version": "9.0.1",
5963 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", 6166 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
@@ -5970,13 +6173,25 @@
5970 "universalify": "^1.0.0" 6173 "universalify": "^1.0.0"
5971 } 6174 }
5972 }, 6175 },
6176 "graceful-fs": {
6177 "version": "4.2.4",
6178 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
6179 "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
6180 "dev": true
6181 },
6182 "has-flag": {
6183 "version": "4.0.0",
6184 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
6185 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
6186 "dev": true
6187 },
5973 "hosted-git-info": { 6188 "hosted-git-info": {
5974 "version": "3.0.5", 6189 "version": "3.0.4",
5975 "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", 6190 "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz",
5976 "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", 6191 "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==",
5977 "dev": true, 6192 "dev": true,
5978 "requires": { 6193 "requires": {
5979 "lru-cache": "^6.0.0" 6194 "lru-cache": "^5.1.1"
5980 } 6195 }
5981 }, 6196 },
5982 "js-yaml": { 6197 "js-yaml": {
@@ -6000,31 +6215,56 @@
6000 } 6215 }
6001 }, 6216 },
6002 "lru-cache": { 6217 "lru-cache": {
6003 "version": "6.0.0", 6218 "version": "5.1.1",
6004 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 6219 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
6005 "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 6220 "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
6006 "dev": true, 6221 "dev": true,
6007 "requires": { 6222 "requires": {
6008 "yallist": "^4.0.0" 6223 "yallist": "^3.0.2"
6009 } 6224 }
6010 }, 6225 },
6226 "mime": {
6227 "version": "2.4.6",
6228 "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
6229 "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
6230 "dev": true
6231 },
6232 "ms": {
6233 "version": "2.1.2",
6234 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
6235 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
6236 "dev": true
6237 },
6238 "pify": {
6239 "version": "4.0.1",
6240 "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
6241 "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
6242 },
6011 "semver": { 6243 "semver": {
6012 "version": "7.3.2", 6244 "version": "7.3.2",
6013 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 6245 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
6014 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 6246 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
6015 "dev": true 6247 "dev": true
6016 }, 6248 },
6249 "supports-color": {
6250 "version": "7.2.0",
6251 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
6252 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
6253 "dev": true,
6254 "requires": {
6255 "has-flag": "^4.0.0"
6256 }
6257 },
6258 "type-fest": {
6259 "version": "0.3.1",
6260 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
6261 "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
6262 },
6017 "universalify": { 6263 "universalify": {
6018 "version": "1.0.0", 6264 "version": "1.0.0",
6019 "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", 6265 "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
6020 "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", 6266 "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
6021 "dev": true 6267 "dev": true
6022 },
6023 "yallist": {
6024 "version": "4.0.0",
6025 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
6026 "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
6027 "dev": true
6028 } 6268 }
6029 } 6269 }
6030 }, 6270 },
@@ -6315,7 +6555,8 @@
6315 "asap": { 6555 "asap": {
6316 "version": "2.0.6", 6556 "version": "2.0.6",
6317 "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 6557 "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
6318 "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 6558 "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
6559 "dev": true
6319 }, 6560 },
6320 "asn1": { 6561 "asn1": {
6321 "version": "0.2.4", 6562 "version": "0.2.4",
@@ -6442,8 +6683,7 @@
6442 "at-least-node": { 6683 "at-least-node": {
6443 "version": "1.0.0", 6684 "version": "1.0.0",
6444 "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 6685 "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
6445 "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 6686 "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
6446 "dev": true
6447 }, 6687 },
6448 "atob": { 6688 "atob": {
6449 "version": "2.1.2", 6689 "version": "2.1.2",
@@ -7343,9 +7583,9 @@
7343 "dev": true 7583 "dev": true
7344 }, 7584 },
7345 "boolean": { 7585 "boolean": {
7346 "version": "3.0.2", 7586 "version": "3.0.1",
7347 "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz", 7587 "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz",
7348 "integrity": "sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==", 7588 "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==",
7349 "dev": true, 7589 "dev": true,
7350 "optional": true 7590 "optional": true
7351 }, 7591 },
@@ -7381,12 +7621,11 @@
7381 "dev": true 7621 "dev": true
7382 }, 7622 },
7383 "ansi-styles": { 7623 "ansi-styles": {
7384 "version": "4.2.1", 7624 "version": "4.3.0",
7385 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 7625 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
7386 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 7626 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
7387 "dev": true, 7627 "dev": true,
7388 "requires": { 7628 "requires": {
7389 "@types/color-name": "^1.1.1",
7390 "color-convert": "^2.0.1" 7629 "color-convert": "^2.0.1"
7391 } 7630 }
7392 }, 7631 },
@@ -7461,12 +7700,6 @@
7461 "requires": { 7700 "requires": {
7462 "has-flag": "^4.0.0" 7701 "has-flag": "^4.0.0"
7463 } 7702 }
7464 },
7465 "type-fest": {
7466 "version": "0.8.1",
7467 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
7468 "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
7469 "dev": true
7470 } 7703 }
7471 } 7704 }
7472 }, 7705 },
@@ -7718,20 +7951,20 @@
7718 "dev": true 7951 "dev": true
7719 }, 7952 },
7720 "builder-util": { 7953 "builder-util": {
7721 "version": "22.8.1", 7954 "version": "22.7.0",
7722 "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.8.1.tgz", 7955 "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.7.0.tgz",
7723 "integrity": "sha512-LZG+E1xszMdut5hL5h7RkJQ7yOsQqdhJYgn1wvOP7MmF3MoUPRNDiRodLpYiWlaqZmgYhcfaipR/Mb8F/RqK8w==", 7956 "integrity": "sha512-UV3MKL0mwjMq2y9JlBf28Cegpj0CrIXcjGkO0TXn+QZ6Yy9rY6lHOuUvpQ19ct2Qh1o+QSwH3Q1nKUf5viJBBg==",
7724 "dev": true, 7957 "dev": true,
7725 "requires": { 7958 "requires": {
7726 "7zip-bin": "~5.0.3", 7959 "7zip-bin": "~5.0.3",
7727 "@types/debug": "^4.1.5", 7960 "@types/debug": "^4.1.5",
7728 "@types/fs-extra": "^9.0.1", 7961 "@types/fs-extra": "^9.0.1",
7729 "app-builder-bin": "3.5.10", 7962 "app-builder-bin": "3.5.9",
7730 "bluebird-lst": "^1.0.9", 7963 "bluebird-lst": "^1.0.9",
7731 "builder-util-runtime": "8.7.2", 7964 "builder-util-runtime": "8.7.1",
7732 "chalk": "^4.1.0", 7965 "chalk": "^4.0.0",
7733 "debug": "^4.2.0", 7966 "debug": "^4.2.0",
7734 "fs-extra": "^9.0.1", 7967 "fs-extra": "^9.0.0",
7735 "is-ci": "^2.0.0", 7968 "is-ci": "^2.0.0",
7736 "js-yaml": "^3.14.0", 7969 "js-yaml": "^3.14.0",
7737 "source-map-support": "^0.5.19", 7970 "source-map-support": "^0.5.19",
@@ -7740,31 +7973,30 @@
7740 }, 7973 },
7741 "dependencies": { 7974 "dependencies": {
7742 "@types/fs-extra": { 7975 "@types/fs-extra": {
7743 "version": "9.0.1", 7976 "version": "9.0.2",
7744 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz", 7977 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.2.tgz",
7745 "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==", 7978 "integrity": "sha512-jp0RI6xfZpi5JL8v7WQwpBEQTq63RqW2kxwTZt+m27LcJqQdPVU1yGnT1ZI4EtCDynQQJtIGyQahkiCGCS7e+A==",
7746 "dev": true, 7979 "dev": true,
7747 "requires": { 7980 "requires": {
7748 "@types/node": "*" 7981 "@types/node": "*"
7749 } 7982 }
7750 }, 7983 },
7751 "ansi-styles": { 7984 "ansi-styles": {
7752 "version": "4.2.1", 7985 "version": "4.3.0",
7753 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 7986 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
7754 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 7987 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
7755 "dev": true, 7988 "dev": true,
7756 "requires": { 7989 "requires": {
7757 "@types/color-name": "^1.1.1",
7758 "color-convert": "^2.0.1" 7990 "color-convert": "^2.0.1"
7759 } 7991 }
7760 }, 7992 },
7761 "builder-util-runtime": { 7993 "builder-util-runtime": {
7762 "version": "8.7.2", 7994 "version": "8.7.1",
7763 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz", 7995 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.1.tgz",
7764 "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==", 7996 "integrity": "sha512-uEBH1nAnTvzjcsrh2XI3qOzJ39h0+9kuIuwj+kCc3a07TZNGShfJcai8fFzL3mNgGjEFxoq+XMssR11r+FOFSg==",
7765 "dev": true, 7997 "dev": true,
7766 "requires": { 7998 "requires": {
7767 "debug": "^4.1.1", 7999 "debug": "^4.2.0",
7768 "sax": "^1.2.4" 8000 "sax": "^1.2.4"
7769 } 8001 }
7770 }, 8002 },
@@ -7868,9 +8100,9 @@
7868 } 8100 }
7869 }, 8101 },
7870 "builder-util-runtime": { 8102 "builder-util-runtime": {
7871 "version": "8.6.2", 8103 "version": "8.7.2",
7872 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.6.2.tgz", 8104 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz",
7873 "integrity": "sha512-9QnIBISfhgQ2BxtRLidVqf/v5HD73vSKZDllpUmGd2L6VORGQk7cZAPmPtw4HQM3gPBelyVJ5yIjMNZ8xjmd1A==", 8105 "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==",
7874 "requires": { 8106 "requires": {
7875 "debug": "^4.1.1", 8107 "debug": "^4.1.1",
7876 "sax": "^1.2.4" 8108 "sax": "^1.2.4"
@@ -7977,9 +8209,9 @@
7977 }, 8209 },
7978 "dependencies": { 8210 "dependencies": {
7979 "get-stream": { 8211 "get-stream": {
7980 "version": "5.1.0", 8212 "version": "5.2.0",
7981 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", 8213 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
7982 "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", 8214 "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
7983 "dev": true, 8215 "dev": true,
7984 "requires": { 8216 "requires": {
7985 "pump": "^3.0.0" 8217 "pump": "^3.0.0"
@@ -7992,13 +8224,22 @@
7992 "dev": true 8224 "dev": true
7993 }, 8225 },
7994 "normalize-url": { 8226 "normalize-url": {
7995 "version": "4.4.1", 8227 "version": "4.5.0",
7996 "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.4.1.tgz", 8228 "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
7997 "integrity": "sha512-rjH3yRt0Ssx19mUwS0hrDUOdG9VI+oRLpLHJ7tXRdjcuQ7v7wo6qPvOZppHRrqfslTKr0L2yBhjj4UXd7c3cQg==", 8229 "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
7998 "dev": true 8230 "dev": true
7999 } 8231 }
8000 } 8232 }
8001 }, 8233 },
8234 "call-bind": {
8235 "version": "1.0.2",
8236 "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
8237 "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
8238 "requires": {
8239 "function-bind": "^1.1.1",
8240 "get-intrinsic": "^1.0.2"
8241 }
8242 },
8002 "call-me-maybe": { 8243 "call-me-maybe": {
8003 "version": "1.0.1", 8244 "version": "1.0.1",
8004 "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", 8245 "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
@@ -8260,14 +8501,29 @@
8260 "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", 8501 "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
8261 "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" 8502 "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
8262 }, 8503 },
8263 "cld3-asm": { 8504 "cld": {
8264 "version": "1.0.1", 8505 "version": "2.7.0",
8265 "resolved": "https://registry.npmjs.org/cld3-asm/-/cld3-asm-1.0.1.tgz", 8506 "resolved": "https://registry.npmjs.org/cld/-/cld-2.7.0.tgz",
8266 "integrity": "sha512-wuAqZd44Rk164TLKSYyLFZGSObhf82udOR+M/CnOkeEShq9+Tpxb/9RAE0m/KUVD1DnR5gMkZFeYExt51PCAbg==", 8507 "integrity": "sha512-rM20jIISRqMYfZAlowCA4DwLLegJXqfCFdVb1vtS+RG7yKHn4FrYdFfUx2WGbmaqOQV/w4MRIszh43FH78/oRA==",
8267 "requires": { 8508 "requires": {
8268 "emscripten-wasm-loader": "^1.0.0", 8509 "glob": "^5.0.10",
8269 "tslib": "^1.9.0", 8510 "node-addon-api": "*",
8270 "utf8": "^3.0.0" 8511 "rimraf": "^2.4.0",
8512 "underscore": "^1.6.0"
8513 },
8514 "dependencies": {
8515 "glob": {
8516 "version": "5.0.15",
8517 "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
8518 "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
8519 "requires": {
8520 "inflight": "^1.0.4",
8521 "inherits": "2",
8522 "minimatch": "2 || 3",
8523 "once": "^1.3.0",
8524 "path-is-absolute": "^1.0.0"
8525 }
8526 }
8271 } 8527 }
8272 }, 8528 },
8273 "clean-css": { 8529 "clean-css": {
@@ -8599,16 +8855,6 @@
8599 "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 8855 "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
8600 "dev": true 8856 "dev": true
8601 }, 8857 },
8602 "compare-func": {
8603 "version": "1.3.2",
8604 "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
8605 "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
8606 "dev": true,
8607 "requires": {
8608 "array-ify": "^1.0.0",
8609 "dot-prop": "^3.0.0"
8610 }
8611 },
8612 "component-bind": { 8858 "component-bind": {
8613 "version": "1.0.0", 8859 "version": "1.0.0",
8614 "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 8860 "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
@@ -8954,56 +9200,383 @@
8954 "dev": true 9200 "dev": true
8955 }, 9201 },
8956 "conventional-changelog": { 9202 "conventional-changelog": {
8957 "version": "3.1.15", 9203 "version": "3.1.23",
8958 "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.15.tgz", 9204 "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.23.tgz",
8959 "integrity": "sha512-CoWM+Z9bYyF00QzNpTnxkCLiuLAeRocJz3C/foFjvhsdltdtkJgMChp7GytQNjm4pT7JFBVJTpqLHTpxNtOzaA==", 9205 "integrity": "sha512-sScUu2NHusjRC1dPc5p8/b3kT78OYr95/Bx7Vl8CPB8tF2mG1xei5iylDTRjONV5hTlzt+Cn/tBWrKdd299b7A==",
8960 "dev": true, 9206 "dev": true,
8961 "requires": { 9207 "requires": {
8962 "conventional-changelog-angular": "^5.0.6", 9208 "conventional-changelog-angular": "^5.0.11",
8963 "conventional-changelog-atom": "^2.0.3", 9209 "conventional-changelog-atom": "^2.0.7",
8964 "conventional-changelog-codemirror": "^2.0.3", 9210 "conventional-changelog-codemirror": "^2.0.7",
8965 "conventional-changelog-conventionalcommits": "^4.2.3", 9211 "conventional-changelog-conventionalcommits": "^4.4.0",
8966 "conventional-changelog-core": "^4.1.1", 9212 "conventional-changelog-core": "^4.2.0",
8967 "conventional-changelog-ember": "^2.0.4", 9213 "conventional-changelog-ember": "^2.0.8",
8968 "conventional-changelog-eslint": "^3.0.4", 9214 "conventional-changelog-eslint": "^3.0.8",
8969 "conventional-changelog-express": "^2.0.1", 9215 "conventional-changelog-express": "^2.0.5",
8970 "conventional-changelog-jquery": "^3.0.6", 9216 "conventional-changelog-jquery": "^3.0.10",
8971 "conventional-changelog-jshint": "^2.0.3", 9217 "conventional-changelog-jshint": "^2.0.8",
8972 "conventional-changelog-preset-loader": "^2.3.0" 9218 "conventional-changelog-preset-loader": "^2.3.4"
8973 }, 9219 },
8974 "dependencies": { 9220 "dependencies": {
8975 "conventional-changelog-angular": { 9221 "camelcase-keys": {
8976 "version": "5.0.6", 9222 "version": "6.2.2",
8977 "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", 9223 "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
8978 "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", 9224 "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
9225 "dev": true,
9226 "requires": {
9227 "camelcase": "^5.3.1",
9228 "map-obj": "^4.0.0",
9229 "quick-lru": "^4.0.1"
9230 }
9231 },
9232 "compare-func": {
9233 "version": "2.0.0",
9234 "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
9235 "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
9236 "dev": true,
9237 "requires": {
9238 "array-ify": "^1.0.0",
9239 "dot-prop": "^5.1.0"
9240 }
9241 },
9242 "conventional-changelog-codemirror": {
9243 "version": "2.0.7",
9244 "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.7.tgz",
9245 "integrity": "sha512-Oralk1kiagn3Gb5cR5BffenWjVu59t/viE6UMD/mQa1hISMPkMYhJIqX+CMeA1zXgVBO+YHQhhokEj99GP5xcg==",
8979 "dev": true, 9246 "dev": true,
8980 "requires": { 9247 "requires": {
8981 "compare-func": "^1.3.1",
8982 "q": "^1.5.1" 9248 "q": "^1.5.1"
8983 } 9249 }
8984 }, 9250 },
8985 "conventional-changelog-preset-loader": { 9251 "conventional-changelog-conventionalcommits": {
8986 "version": "2.3.0", 9252 "version": "4.4.0",
8987 "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz", 9253 "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz",
8988 "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==", 9254 "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==",
9255 "dev": true,
9256 "requires": {
9257 "compare-func": "^2.0.0",
9258 "lodash": "^4.17.15",
9259 "q": "^1.5.1"
9260 }
9261 },
9262 "conventional-changelog-core": {
9263 "version": "4.2.0",
9264 "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.0.tgz",
9265 "integrity": "sha512-8+xMvN6JvdDtPbGBqA7oRNyZD4od1h/SIzrWqHcKZjitbVXrFpozEeyn4iI4af1UwdrabQpiZMaV07fPUTGd4w==",
9266 "dev": true,
9267 "requires": {
9268 "add-stream": "^1.0.0",
9269 "conventional-changelog-writer": "^4.0.17",
9270 "conventional-commits-parser": "^3.1.0",
9271 "dateformat": "^3.0.0",
9272 "get-pkg-repo": "^1.0.0",
9273 "git-raw-commits": "2.0.0",
9274 "git-remote-origin-url": "^2.0.0",
9275 "git-semver-tags": "^4.1.0",
9276 "lodash": "^4.17.15",
9277 "normalize-package-data": "^2.3.5",
9278 "q": "^1.5.1",
9279 "read-pkg": "^3.0.0",
9280 "read-pkg-up": "^3.0.0",
9281 "shelljs": "^0.8.3",
9282 "through2": "^3.0.0"
9283 }
9284 },
9285 "conventional-changelog-ember": {
9286 "version": "2.0.8",
9287 "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.8.tgz",
9288 "integrity": "sha512-JEMEcUAMg4Q9yxD341OgWlESQ4gLqMWMXIWWUqoQU8yvTJlKnrvcui3wk9JvnZQyONwM2g1MKRZuAjKxr8hAXA==",
9289 "dev": true,
9290 "requires": {
9291 "q": "^1.5.1"
9292 }
9293 },
9294 "conventional-changelog-jquery": {
9295 "version": "3.0.10",
9296 "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.10.tgz",
9297 "integrity": "sha512-QCW6wF8QgPkq2ruPaxc83jZxoWQxLkt/pNxIDn/oYjMiVgrtqNdd7lWe3vsl0hw5ENHNf/ejXuzDHk6suKsRpg==",
9298 "dev": true,
9299 "requires": {
9300 "q": "^1.5.1"
9301 }
9302 },
9303 "conventional-changelog-jshint": {
9304 "version": "2.0.8",
9305 "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.8.tgz",
9306 "integrity": "sha512-hB/iI0IiZwnZ+seYI+qEQ4b+EMQSEC8jGIvhO2Vpz1E5p8FgLz75OX8oB1xJWl+s4xBMB6f8zJr0tC/BL7YOjw==",
9307 "dev": true,
9308 "requires": {
9309 "compare-func": "^2.0.0",
9310 "q": "^1.5.1"
9311 }
9312 },
9313 "dot-prop": {
9314 "version": "5.3.0",
9315 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
9316 "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
9317 "dev": true,
9318 "requires": {
9319 "is-obj": "^2.0.0"
9320 }
9321 },
9322 "find-up": {
9323 "version": "4.1.0",
9324 "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
9325 "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
9326 "dev": true,
9327 "requires": {
9328 "locate-path": "^5.0.0",
9329 "path-exists": "^4.0.0"
9330 }
9331 },
9332 "git-semver-tags": {
9333 "version": "4.1.0",
9334 "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.0.tgz",
9335 "integrity": "sha512-TcxAGeo03HdErzKzi4fDD+xEL7gi8r2Y5YSxH6N2XYdVSV5UkBwfrt7Gqo1b+uSHCjy/sa9Y6BBBxxFLxfbhTg==",
9336 "dev": true,
9337 "requires": {
9338 "meow": "^7.0.0",
9339 "semver": "^6.0.0"
9340 }
9341 },
9342 "indent-string": {
9343 "version": "4.0.0",
9344 "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
9345 "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
9346 "dev": true
9347 },
9348 "is-obj": {
9349 "version": "2.0.0",
9350 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
9351 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
9352 "dev": true
9353 },
9354 "kind-of": {
9355 "version": "6.0.3",
9356 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
9357 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
9358 "dev": true
9359 },
9360 "locate-path": {
9361 "version": "5.0.0",
9362 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
9363 "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
9364 "dev": true,
9365 "requires": {
9366 "p-locate": "^4.1.0"
9367 }
9368 },
9369 "map-obj": {
9370 "version": "4.1.0",
9371 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
9372 "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
9373 "dev": true
9374 },
9375 "meow": {
9376 "version": "7.1.1",
9377 "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
9378 "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
9379 "dev": true,
9380 "requires": {
9381 "@types/minimist": "^1.2.0",
9382 "camelcase-keys": "^6.2.2",
9383 "decamelize-keys": "^1.1.0",
9384 "hard-rejection": "^2.1.0",
9385 "minimist-options": "4.1.0",
9386 "normalize-package-data": "^2.5.0",
9387 "read-pkg-up": "^7.0.1",
9388 "redent": "^3.0.0",
9389 "trim-newlines": "^3.0.0",
9390 "type-fest": "^0.13.1",
9391 "yargs-parser": "^18.1.3"
9392 },
9393 "dependencies": {
9394 "read-pkg": {
9395 "version": "5.2.0",
9396 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
9397 "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
9398 "dev": true,
9399 "requires": {
9400 "@types/normalize-package-data": "^2.4.0",
9401 "normalize-package-data": "^2.5.0",
9402 "parse-json": "^5.0.0",
9403 "type-fest": "^0.6.0"
9404 },
9405 "dependencies": {
9406 "type-fest": {
9407 "version": "0.6.0",
9408 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
9409 "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
9410 "dev": true
9411 }
9412 }
9413 },
9414 "read-pkg-up": {
9415 "version": "7.0.1",
9416 "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
9417 "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
9418 "dev": true,
9419 "requires": {
9420 "find-up": "^4.1.0",
9421 "read-pkg": "^5.2.0",
9422 "type-fest": "^0.8.1"
9423 },
9424 "dependencies": {
9425 "type-fest": {
9426 "version": "0.8.1",
9427 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
9428 "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
9429 "dev": true
9430 }
9431 }
9432 }
9433 }
9434 },
9435 "minimist-options": {
9436 "version": "4.1.0",
9437 "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
9438 "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
9439 "dev": true,
9440 "requires": {
9441 "arrify": "^1.0.1",
9442 "is-plain-obj": "^1.1.0",
9443 "kind-of": "^6.0.3"
9444 }
9445 },
9446 "p-locate": {
9447 "version": "4.1.0",
9448 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
9449 "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
9450 "dev": true,
9451 "requires": {
9452 "p-limit": "^2.2.0"
9453 }
9454 },
9455 "parse-json": {
9456 "version": "5.1.0",
9457 "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
9458 "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
9459 "dev": true,
9460 "requires": {
9461 "@babel/code-frame": "^7.0.0",
9462 "error-ex": "^1.3.1",
9463 "json-parse-even-better-errors": "^2.3.0",
9464 "lines-and-columns": "^1.1.6"
9465 }
9466 },
9467 "path-exists": {
9468 "version": "4.0.0",
9469 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
9470 "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
9471 "dev": true
9472 },
9473 "quick-lru": {
9474 "version": "4.0.1",
9475 "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
9476 "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
9477 "dev": true
9478 },
9479 "read-pkg": {
9480 "version": "3.0.0",
9481 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
9482 "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
9483 "dev": true,
9484 "requires": {
9485 "load-json-file": "^4.0.0",
9486 "normalize-package-data": "^2.3.2",
9487 "path-type": "^3.0.0"
9488 }
9489 },
9490 "redent": {
9491 "version": "3.0.0",
9492 "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
9493 "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
9494 "dev": true,
9495 "requires": {
9496 "indent-string": "^4.0.0",
9497 "strip-indent": "^3.0.0"
9498 }
9499 },
9500 "semver": {
9501 "version": "6.3.0",
9502 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
9503 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
8989 "dev": true 9504 "dev": true
9505 },
9506 "strip-indent": {
9507 "version": "3.0.0",
9508 "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
9509 "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
9510 "dev": true,
9511 "requires": {
9512 "min-indent": "^1.0.0"
9513 }
9514 },
9515 "trim-newlines": {
9516 "version": "3.0.0",
9517 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
9518 "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
9519 "dev": true
9520 },
9521 "type-fest": {
9522 "version": "0.13.1",
9523 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
9524 "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
9525 "dev": true
9526 },
9527 "yargs-parser": {
9528 "version": "18.1.3",
9529 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
9530 "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
9531 "dev": true,
9532 "requires": {
9533 "camelcase": "^5.0.0",
9534 "decamelize": "^1.2.0"
9535 }
8990 } 9536 }
8991 } 9537 }
8992 }, 9538 },
8993 "conventional-changelog-angular": { 9539 "conventional-changelog-angular": {
8994 "version": "5.0.3", 9540 "version": "5.0.11",
8995 "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz", 9541 "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz",
8996 "integrity": "sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==", 9542 "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==",
8997 "dev": true, 9543 "dev": true,
8998 "requires": { 9544 "requires": {
8999 "compare-func": "^1.3.1", 9545 "compare-func": "^2.0.0",
9000 "q": "^1.5.1" 9546 "q": "^1.5.1"
9547 },
9548 "dependencies": {
9549 "compare-func": {
9550 "version": "2.0.0",
9551 "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
9552 "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
9553 "dev": true,
9554 "requires": {
9555 "array-ify": "^1.0.0",
9556 "dot-prop": "^5.1.0"
9557 }
9558 },
9559 "dot-prop": {
9560 "version": "5.3.0",
9561 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
9562 "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
9563 "dev": true,
9564 "requires": {
9565 "is-obj": "^2.0.0"
9566 }
9567 },
9568 "is-obj": {
9569 "version": "2.0.0",
9570 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
9571 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
9572 "dev": true
9573 }
9001 } 9574 }
9002 }, 9575 },
9003 "conventional-changelog-atom": { 9576 "conventional-changelog-atom": {
9004 "version": "2.0.3", 9577 "version": "2.0.7",
9005 "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", 9578 "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.7.tgz",
9006 "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", 9579 "integrity": "sha512-7dOREZwzB+tCEMjRTDfen0OHwd7vPUdmU0llTy1eloZgtOP4iSLVzYIQqfmdRZEty+3w5Jz+AbhfTJKoKw1JeQ==",
9007 "dev": true, 9580 "dev": true,
9008 "requires": { 9581 "requires": {
9009 "q": "^1.5.1" 9582 "q": "^1.5.1"
@@ -9056,133 +9629,250 @@
9056 } 9629 }
9057 } 9630 }
9058 }, 9631 },
9059 "conventional-changelog-codemirror": { 9632 "conventional-changelog-eslint": {
9060 "version": "2.0.3", 9633 "version": "3.0.8",
9061 "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", 9634 "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.8.tgz",
9062 "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", 9635 "integrity": "sha512-5rTRltgWG7TpU1PqgKHMA/2ivjhrB+E+S7OCTvj0zM/QGg4vmnVH67Vq/EzvSNYtejhWC+OwzvDrLk3tqPry8A==",
9063 "dev": true, 9636 "dev": true,
9064 "requires": { 9637 "requires": {
9065 "q": "^1.5.1" 9638 "q": "^1.5.1"
9066 } 9639 }
9067 }, 9640 },
9068 "conventional-changelog-conventionalcommits": { 9641 "conventional-changelog-express": {
9069 "version": "4.2.3", 9642 "version": "2.0.5",
9070 "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz", 9643 "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.5.tgz",
9071 "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==", 9644 "integrity": "sha512-pW2hsjKG+xNx/Qjof8wYlAX/P61hT5gQ/2rZ2NsTpG+PgV7Rc8RCfITvC/zN9K8fj0QmV6dWmUefCteD9baEAw==",
9072 "dev": true, 9645 "dev": true,
9073 "requires": { 9646 "requires": {
9074 "compare-func": "^1.3.1",
9075 "lodash": "^4.17.15",
9076 "q": "^1.5.1" 9647 "q": "^1.5.1"
9077 } 9648 }
9078 }, 9649 },
9079 "conventional-changelog-core": { 9650 "conventional-changelog-preset-loader": {
9080 "version": "4.1.1", 9651 "version": "2.3.4",
9081 "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.1.tgz", 9652 "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz",
9082 "integrity": "sha512-fBre5P6U9n914Da6Cj82vIfRU2DhTLGr1eDPXWA7AamxTpd4cd0jgdS7Aieas5Vn5WXOJNFRDNl6PrYLEonImg==", 9653 "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==",
9654 "dev": true
9655 },
9656 "conventional-changelog-writer": {
9657 "version": "4.0.17",
9658 "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz",
9659 "integrity": "sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw==",
9083 "dev": true, 9660 "dev": true,
9084 "requires": { 9661 "requires": {
9085 "conventional-changelog-writer": "^4.0.11", 9662 "compare-func": "^2.0.0",
9086 "conventional-commits-parser": "^3.0.8", 9663 "conventional-commits-filter": "^2.0.6",
9087 "dateformat": "^3.0.0", 9664 "dateformat": "^3.0.0",
9088 "get-pkg-repo": "^1.0.0", 9665 "handlebars": "^4.7.6",
9089 "git-raw-commits": "2.0.0", 9666 "json-stringify-safe": "^5.0.1",
9090 "git-remote-origin-url": "^2.0.0",
9091 "git-semver-tags": "^3.0.1",
9092 "lodash": "^4.17.15", 9667 "lodash": "^4.17.15",
9093 "normalize-package-data": "^2.3.5", 9668 "meow": "^7.0.0",
9094 "q": "^1.5.1", 9669 "semver": "^6.0.0",
9095 "read-pkg": "^3.0.0", 9670 "split": "^1.0.0",
9096 "read-pkg-up": "^3.0.0",
9097 "through2": "^3.0.0" 9671 "through2": "^3.0.0"
9098 }, 9672 },
9099 "dependencies": { 9673 "dependencies": {
9100 "camelcase": { 9674 "camelcase-keys": {
9101 "version": "4.1.0", 9675 "version": "6.2.2",
9102 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 9676 "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
9103 "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 9677 "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
9104 "dev": true 9678 "dev": true,
9679 "requires": {
9680 "camelcase": "^5.3.1",
9681 "map-obj": "^4.0.0",
9682 "quick-lru": "^4.0.1"
9683 }
9105 }, 9684 },
9106 "conventional-changelog-writer": { 9685 "compare-func": {
9107 "version": "4.0.11", 9686 "version": "2.0.0",
9108 "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", 9687 "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
9109 "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", 9688 "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
9110 "dev": true, 9689 "dev": true,
9111 "requires": { 9690 "requires": {
9112 "compare-func": "^1.3.1", 9691 "array-ify": "^1.0.0",
9113 "conventional-commits-filter": "^2.0.2", 9692 "dot-prop": "^5.1.0"
9114 "dateformat": "^3.0.0", 9693 }
9115 "handlebars": "^4.4.0", 9694 },
9116 "json-stringify-safe": "^5.0.1", 9695 "dot-prop": {
9117 "lodash": "^4.17.15", 9696 "version": "5.3.0",
9118 "meow": "^5.0.0", 9697 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
9119 "semver": "^6.0.0", 9698 "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
9120 "split": "^1.0.0", 9699 "dev": true,
9121 "through2": "^3.0.0" 9700 "requires": {
9701 "is-obj": "^2.0.0"
9122 } 9702 }
9123 }, 9703 },
9124 "conventional-commits-parser": { 9704 "find-up": {
9125 "version": "3.0.8", 9705 "version": "4.1.0",
9126 "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", 9706 "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
9127 "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", 9707 "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
9128 "dev": true, 9708 "dev": true,
9129 "requires": { 9709 "requires": {
9130 "JSONStream": "^1.0.4", 9710 "locate-path": "^5.0.0",
9131 "is-text-path": "^1.0.1", 9711 "path-exists": "^4.0.0"
9132 "lodash": "^4.17.15",
9133 "meow": "^5.0.0",
9134 "split2": "^2.0.0",
9135 "through2": "^3.0.0",
9136 "trim-off-newlines": "^1.0.0"
9137 } 9712 }
9138 }, 9713 },
9139 "handlebars": { 9714 "handlebars": {
9140 "version": "4.5.3", 9715 "version": "4.7.6",
9141 "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", 9716 "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
9142 "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", 9717 "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
9143 "dev": true, 9718 "dev": true,
9144 "requires": { 9719 "requires": {
9720 "minimist": "^1.2.5",
9145 "neo-async": "^2.6.0", 9721 "neo-async": "^2.6.0",
9146 "optimist": "^0.6.1",
9147 "source-map": "^0.6.1", 9722 "source-map": "^0.6.1",
9148 "uglify-js": "^3.1.4" 9723 "uglify-js": "^3.1.4",
9724 "wordwrap": "^1.0.0"
9149 } 9725 }
9150 }, 9726 },
9151 "is-text-path": { 9727 "indent-string": {
9152 "version": "1.0.1", 9728 "version": "4.0.0",
9153 "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", 9729 "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
9154 "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", 9730 "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
9731 "dev": true
9732 },
9733 "is-obj": {
9734 "version": "2.0.0",
9735 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
9736 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
9737 "dev": true
9738 },
9739 "kind-of": {
9740 "version": "6.0.3",
9741 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
9742 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
9743 "dev": true
9744 },
9745 "locate-path": {
9746 "version": "5.0.0",
9747 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
9748 "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
9155 "dev": true, 9749 "dev": true,
9156 "requires": { 9750 "requires": {
9157 "text-extensions": "^1.0.0" 9751 "p-locate": "^4.1.0"
9158 } 9752 }
9159 }, 9753 },
9754 "map-obj": {
9755 "version": "4.1.0",
9756 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
9757 "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
9758 "dev": true
9759 },
9160 "meow": { 9760 "meow": {
9161 "version": "5.0.0", 9761 "version": "7.1.1",
9162 "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", 9762 "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
9163 "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", 9763 "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
9164 "dev": true, 9764 "dev": true,
9165 "requires": { 9765 "requires": {
9166 "camelcase-keys": "^4.0.0", 9766 "@types/minimist": "^1.2.0",
9167 "decamelize-keys": "^1.0.0", 9767 "camelcase-keys": "^6.2.2",
9168 "loud-rejection": "^1.0.0", 9768 "decamelize-keys": "^1.1.0",
9169 "minimist-options": "^3.0.1", 9769 "hard-rejection": "^2.1.0",
9170 "normalize-package-data": "^2.3.4", 9770 "minimist-options": "4.1.0",
9171 "read-pkg-up": "^3.0.0", 9771 "normalize-package-data": "^2.5.0",
9172 "redent": "^2.0.0", 9772 "read-pkg-up": "^7.0.1",
9173 "trim-newlines": "^2.0.0", 9773 "redent": "^3.0.0",
9174 "yargs-parser": "^10.0.0" 9774 "trim-newlines": "^3.0.0",
9775 "type-fest": "^0.13.1",
9776 "yargs-parser": "^18.1.3"
9175 } 9777 }
9176 }, 9778 },
9779 "minimist": {
9780 "version": "1.2.5",
9781 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
9782 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
9783 "dev": true
9784 },
9785 "minimist-options": {
9786 "version": "4.1.0",
9787 "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
9788 "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
9789 "dev": true,
9790 "requires": {
9791 "arrify": "^1.0.1",
9792 "is-plain-obj": "^1.1.0",
9793 "kind-of": "^6.0.3"
9794 }
9795 },
9796 "p-locate": {
9797 "version": "4.1.0",
9798 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
9799 "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
9800 "dev": true,
9801 "requires": {
9802 "p-limit": "^2.2.0"
9803 }
9804 },
9805 "parse-json": {
9806 "version": "5.1.0",
9807 "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
9808 "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
9809 "dev": true,
9810 "requires": {
9811 "@babel/code-frame": "^7.0.0",
9812 "error-ex": "^1.3.1",
9813 "json-parse-even-better-errors": "^2.3.0",
9814 "lines-and-columns": "^1.1.6"
9815 }
9816 },
9817 "path-exists": {
9818 "version": "4.0.0",
9819 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
9820 "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
9821 "dev": true
9822 },
9823 "quick-lru": {
9824 "version": "4.0.1",
9825 "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
9826 "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
9827 "dev": true
9828 },
9177 "read-pkg": { 9829 "read-pkg": {
9830 "version": "5.2.0",
9831 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
9832 "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
9833 "dev": true,
9834 "requires": {
9835 "@types/normalize-package-data": "^2.4.0",
9836 "normalize-package-data": "^2.5.0",
9837 "parse-json": "^5.0.0",
9838 "type-fest": "^0.6.0"
9839 },
9840 "dependencies": {
9841 "type-fest": {
9842 "version": "0.6.0",
9843 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
9844 "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
9845 "dev": true
9846 }
9847 }
9848 },
9849 "read-pkg-up": {
9850 "version": "7.0.1",
9851 "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
9852 "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
9853 "dev": true,
9854 "requires": {
9855 "find-up": "^4.1.0",
9856 "read-pkg": "^5.2.0",
9857 "type-fest": "^0.8.1"
9858 },
9859 "dependencies": {
9860 "type-fest": {
9861 "version": "0.8.1",
9862 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
9863 "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
9864 "dev": true
9865 }
9866 }
9867 },
9868 "redent": {
9178 "version": "3.0.0", 9869 "version": "3.0.0",
9179 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 9870 "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
9180 "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 9871 "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
9181 "dev": true, 9872 "dev": true,
9182 "requires": { 9873 "requires": {
9183 "load-json-file": "^4.0.0", 9874 "indent-string": "^4.0.0",
9184 "normalize-package-data": "^2.3.2", 9875 "strip-indent": "^3.0.0"
9185 "path-type": "^3.0.0"
9186 } 9876 }
9187 }, 9877 },
9188 "semver": { 9878 "semver": {
@@ -9191,111 +9881,55 @@
9191 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 9881 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
9192 "dev": true 9882 "dev": true
9193 }, 9883 },
9194 "text-extensions": { 9884 "strip-indent": {
9195 "version": "1.9.0", 9885 "version": "3.0.0",
9196 "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", 9886 "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
9197 "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", 9887 "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
9888 "dev": true,
9889 "requires": {
9890 "min-indent": "^1.0.0"
9891 }
9892 },
9893 "trim-newlines": {
9894 "version": "3.0.0",
9895 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
9896 "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
9897 "dev": true
9898 },
9899 "type-fest": {
9900 "version": "0.13.1",
9901 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
9902 "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
9903 "dev": true
9904 },
9905 "wordwrap": {
9906 "version": "1.0.0",
9907 "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
9908 "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
9198 "dev": true 9909 "dev": true
9199 }, 9910 },
9200 "yargs-parser": { 9911 "yargs-parser": {
9201 "version": "10.1.0", 9912 "version": "18.1.3",
9202 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", 9913 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
9203 "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", 9914 "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
9204 "dev": true, 9915 "dev": true,
9205 "requires": { 9916 "requires": {
9206 "camelcase": "^4.1.0" 9917 "camelcase": "^5.0.0",
9918 "decamelize": "^1.2.0"
9207 } 9919 }
9208 } 9920 }
9209 } 9921 }
9210 }, 9922 },
9211 "conventional-changelog-ember": {
9212 "version": "2.0.4",
9213 "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz",
9214 "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==",
9215 "dev": true,
9216 "requires": {
9217 "q": "^1.5.1"
9218 }
9219 },
9220 "conventional-changelog-eslint": {
9221 "version": "3.0.4",
9222 "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz",
9223 "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==",
9224 "dev": true,
9225 "requires": {
9226 "q": "^1.5.1"
9227 }
9228 },
9229 "conventional-changelog-express": {
9230 "version": "2.0.1",
9231 "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz",
9232 "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==",
9233 "dev": true,
9234 "requires": {
9235 "q": "^1.5.1"
9236 }
9237 },
9238 "conventional-changelog-jquery": {
9239 "version": "3.0.6",
9240 "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz",
9241 "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==",
9242 "dev": true,
9243 "requires": {
9244 "q": "^1.5.1"
9245 }
9246 },
9247 "conventional-changelog-jshint": {
9248 "version": "2.0.3",
9249 "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz",
9250 "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==",
9251 "dev": true,
9252 "requires": {
9253 "compare-func": "^1.3.1",
9254 "q": "^1.5.1"
9255 }
9256 },
9257 "conventional-changelog-preset-loader": {
9258 "version": "2.2.0",
9259 "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.2.0.tgz",
9260 "integrity": "sha512-zXB+5vF7D5Y3Cb/rJfSyCCvFphCVmF8mFqOdncX3BmjZwAtGAPfYrBcT225udilCKvBbHgyzgxqz2GWDB5xShQ==",
9261 "dev": true
9262 },
9263 "conventional-changelog-writer": {
9264 "version": "4.0.7",
9265 "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.7.tgz",
9266 "integrity": "sha512-p/wzs9eYaxhFbrmX/mCJNwJuvvHR+j4Fd0SQa2xyAhYed6KBiZ780LvoqUUvsayP4R1DtC27czalGUhKV2oabw==",
9267 "dev": true,
9268 "requires": {
9269 "compare-func": "^1.3.1",
9270 "conventional-commits-filter": "^2.0.2",
9271 "dateformat": "^3.0.0",
9272 "handlebars": "^4.1.2",
9273 "json-stringify-safe": "^5.0.1",
9274 "lodash": "^4.2.1",
9275 "meow": "^4.0.0",
9276 "semver": "^6.0.0",
9277 "split": "^1.0.0",
9278 "through2": "^3.0.0"
9279 },
9280 "dependencies": {
9281 "semver": {
9282 "version": "6.3.0",
9283 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
9284 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
9285 "dev": true
9286 }
9287 }
9288 },
9289 "conventional-commit-types": { 9923 "conventional-commit-types": {
9290 "version": "2.1.1", 9924 "version": "2.3.0",
9291 "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.1.1.tgz", 9925 "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz",
9292 "integrity": "sha512-0Ts+fEdmjqYDOQ1yZ+LNgdSPO335XZw9qC10M7CxtLP3nIMGmeMhmkM8Taffa4+MXN13bRPlp0CtH+QfOzKTzw==", 9926 "integrity": "sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==",
9293 "dev": true 9927 "dev": true
9294 }, 9928 },
9295 "conventional-commits-filter": { 9929 "conventional-commits-filter": {
9296 "version": "2.0.2", 9930 "version": "2.0.6",
9297 "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", 9931 "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz",
9298 "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", 9932 "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==",
9299 "dev": true, 9933 "dev": true,
9300 "requires": { 9934 "requires": {
9301 "lodash.ismatch": "^4.4.0", 9935 "lodash.ismatch": "^4.4.0",
@@ -9303,18 +9937,226 @@
9303 } 9937 }
9304 }, 9938 },
9305 "conventional-commits-parser": { 9939 "conventional-commits-parser": {
9306 "version": "3.0.3", 9940 "version": "3.1.0",
9307 "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.3.tgz", 9941 "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz",
9308 "integrity": "sha512-KaA/2EeUkO4bKjinNfGUyqPTX/6w9JGshuQRik4r/wJz7rUw3+D3fDG6sZSEqJvKILzKXFQuFkpPLclcsAuZcg==", 9942 "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==",
9309 "dev": true, 9943 "dev": true,
9310 "requires": { 9944 "requires": {
9311 "JSONStream": "^1.0.4", 9945 "JSONStream": "^1.0.4",
9312 "is-text-path": "^2.0.0", 9946 "is-text-path": "^1.0.1",
9313 "lodash": "^4.2.1", 9947 "lodash": "^4.17.15",
9314 "meow": "^4.0.0", 9948 "meow": "^7.0.0",
9315 "split2": "^2.0.0", 9949 "split2": "^2.0.0",
9316 "through2": "^3.0.0", 9950 "through2": "^3.0.0",
9317 "trim-off-newlines": "^1.0.0" 9951 "trim-off-newlines": "^1.0.0"
9952 },
9953 "dependencies": {
9954 "camelcase-keys": {
9955 "version": "6.2.2",
9956 "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
9957 "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
9958 "dev": true,
9959 "requires": {
9960 "camelcase": "^5.3.1",
9961 "map-obj": "^4.0.0",
9962 "quick-lru": "^4.0.1"
9963 }
9964 },
9965 "find-up": {
9966 "version": "4.1.0",
9967 "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
9968 "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
9969 "dev": true,
9970 "requires": {
9971 "locate-path": "^5.0.0",
9972 "path-exists": "^4.0.0"
9973 }
9974 },
9975 "indent-string": {
9976 "version": "4.0.0",
9977 "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
9978 "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
9979 "dev": true
9980 },
9981 "is-text-path": {
9982 "version": "1.0.1",
9983 "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
9984 "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
9985 "dev": true,
9986 "requires": {
9987 "text-extensions": "^1.0.0"
9988 }
9989 },
9990 "kind-of": {
9991 "version": "6.0.3",
9992 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
9993 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
9994 "dev": true
9995 },
9996 "locate-path": {
9997 "version": "5.0.0",
9998 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
9999 "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
10000 "dev": true,
10001 "requires": {
10002 "p-locate": "^4.1.0"
10003 }
10004 },
10005 "map-obj": {
10006 "version": "4.1.0",
10007 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
10008 "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
10009 "dev": true
10010 },
10011 "meow": {
10012 "version": "7.1.1",
10013 "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
10014 "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
10015 "dev": true,
10016 "requires": {
10017 "@types/minimist": "^1.2.0",
10018 "camelcase-keys": "^6.2.2",
10019 "decamelize-keys": "^1.1.0",
10020 "hard-rejection": "^2.1.0",
10021 "minimist-options": "4.1.0",
10022 "normalize-package-data": "^2.5.0",
10023 "read-pkg-up": "^7.0.1",
10024 "redent": "^3.0.0",
10025 "trim-newlines": "^3.0.0",
10026 "type-fest": "^0.13.1",
10027 "yargs-parser": "^18.1.3"
10028 }
10029 },
10030 "minimist-options": {
10031 "version": "4.1.0",
10032 "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
10033 "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
10034 "dev": true,
10035 "requires": {
10036 "arrify": "^1.0.1",
10037 "is-plain-obj": "^1.1.0",
10038 "kind-of": "^6.0.3"
10039 }
10040 },
10041 "p-locate": {
10042 "version": "4.1.0",
10043 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
10044 "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
10045 "dev": true,
10046 "requires": {
10047 "p-limit": "^2.2.0"
10048 }
10049 },
10050 "parse-json": {
10051 "version": "5.1.0",
10052 "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
10053 "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
10054 "dev": true,
10055 "requires": {
10056 "@babel/code-frame": "^7.0.0",
10057 "error-ex": "^1.3.1",
10058 "json-parse-even-better-errors": "^2.3.0",
10059 "lines-and-columns": "^1.1.6"
10060 }
10061 },
10062 "path-exists": {
10063 "version": "4.0.0",
10064 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
10065 "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
10066 "dev": true
10067 },
10068 "quick-lru": {
10069 "version": "4.0.1",
10070 "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
10071 "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
10072 "dev": true
10073 },
10074 "read-pkg": {
10075 "version": "5.2.0",
10076 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
10077 "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
10078 "dev": true,
10079 "requires": {
10080 "@types/normalize-package-data": "^2.4.0",
10081 "normalize-package-data": "^2.5.0",
10082 "parse-json": "^5.0.0",
10083 "type-fest": "^0.6.0"
10084 },
10085 "dependencies": {
10086 "type-fest": {
10087 "version": "0.6.0",
10088 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
10089 "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
10090 "dev": true
10091 }
10092 }
10093 },
10094 "read-pkg-up": {
10095 "version": "7.0.1",
10096 "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
10097 "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
10098 "dev": true,
10099 "requires": {
10100 "find-up": "^4.1.0",
10101 "read-pkg": "^5.2.0",
10102 "type-fest": "^0.8.1"
10103 },
10104 "dependencies": {
10105 "type-fest": {
10106 "version": "0.8.1",
10107 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
10108 "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
10109 "dev": true
10110 }
10111 }
10112 },
10113 "redent": {
10114 "version": "3.0.0",
10115 "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
10116 "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
10117 "dev": true,
10118 "requires": {
10119 "indent-string": "^4.0.0",
10120 "strip-indent": "^3.0.0"
10121 }
10122 },
10123 "strip-indent": {
10124 "version": "3.0.0",
10125 "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
10126 "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
10127 "dev": true,
10128 "requires": {
10129 "min-indent": "^1.0.0"
10130 }
10131 },
10132 "text-extensions": {
10133 "version": "1.9.0",
10134 "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
10135 "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
10136 "dev": true
10137 },
10138 "trim-newlines": {
10139 "version": "3.0.0",
10140 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
10141 "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
10142 "dev": true
10143 },
10144 "type-fest": {
10145 "version": "0.13.1",
10146 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
10147 "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
10148 "dev": true
10149 },
10150 "yargs-parser": {
10151 "version": "18.1.3",
10152 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
10153 "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
10154 "dev": true,
10155 "requires": {
10156 "camelcase": "^5.0.0",
10157 "decamelize": "^1.2.0"
10158 }
10159 }
9318 } 10160 }
9319 }, 10161 },
9320 "conventional-recommended-bump": { 10162 "conventional-recommended-bump": {
@@ -9364,9 +10206,9 @@
9364 } 10206 }
9365 }, 10207 },
9366 "convert-source-map": { 10208 "convert-source-map": {
9367 "version": "1.6.0", 10209 "version": "1.7.0",
9368 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", 10210 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
9369 "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", 10211 "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
9370 "dev": true, 10212 "dev": true,
9371 "requires": { 10213 "requires": {
9372 "safe-buffer": "~5.1.1" 10214 "safe-buffer": "~5.1.1"
@@ -9421,24 +10263,54 @@
9421 } 10263 }
9422 }, 10264 },
9423 "core-js": { 10265 "core-js": {
9424 "version": "2.6.9", 10266 "version": "2.6.11",
9425 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", 10267 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
9426 "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" 10268 "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
9427 }, 10269 },
9428 "core-js-compat": { 10270 "core-js-compat": {
9429 "version": "3.4.4", 10271 "version": "3.6.5",
9430 "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.4.tgz", 10272 "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
9431 "integrity": "sha512-hBbxJ6sOkaFSvwAXjJ/t/1usGIPK5gTbtqV8+T+u1pZBkgQ3lDQgAguN1g01PJ0b3eyQxgRIEgxqGoviE1QtIQ==", 10273 "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
9432 "dev": true, 10274 "dev": true,
9433 "requires": { 10275 "requires": {
9434 "browserslist": "^4.7.3", 10276 "browserslist": "^4.8.5",
9435 "semver": "^6.3.0" 10277 "semver": "7.0.0"
9436 }, 10278 },
9437 "dependencies": { 10279 "dependencies": {
10280 "browserslist": {
10281 "version": "4.14.5",
10282 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz",
10283 "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==",
10284 "dev": true,
10285 "requires": {
10286 "caniuse-lite": "^1.0.30001135",
10287 "electron-to-chromium": "^1.3.571",
10288 "escalade": "^3.1.0",
10289 "node-releases": "^1.1.61"
10290 }
10291 },
10292 "caniuse-lite": {
10293 "version": "1.0.30001148",
10294 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz",
10295 "integrity": "sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==",
10296 "dev": true
10297 },
10298 "electron-to-chromium": {
10299 "version": "1.3.582",
10300 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz",
10301 "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==",
10302 "dev": true
10303 },
10304 "node-releases": {
10305 "version": "1.1.63",
10306 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.63.tgz",
10307 "integrity": "sha512-ukW3iCfQaoxJkSPN+iK7KznTeqDGVJatAEuXsJERYHa9tn/KaT5lBdIyxQjLEVTzSkyjJEuQ17/vaEjrOauDkg==",
10308 "dev": true
10309 },
9438 "semver": { 10310 "semver": {
9439 "version": "6.3.0", 10311 "version": "7.0.0",
9440 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 10312 "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
9441 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 10313 "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
9442 "dev": true 10314 "dev": true
9443 } 10315 }
9444 } 10316 }
@@ -9458,6 +10330,18 @@
9458 "is-directory": "^0.3.1", 10330 "is-directory": "^0.3.1",
9459 "js-yaml": "^3.13.1", 10331 "js-yaml": "^3.13.1",
9460 "parse-json": "^4.0.0" 10332 "parse-json": "^4.0.0"
10333 },
10334 "dependencies": {
10335 "js-yaml": {
10336 "version": "3.14.0",
10337 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
10338 "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
10339 "dev": true,
10340 "requires": {
10341 "argparse": "^1.0.7",
10342 "esprima": "^4.0.0"
10343 }
10344 }
9461 } 10345 }
9462 }, 10346 },
9463 "create-ecdh": { 10347 "create-ecdh": {
@@ -9506,11 +10390,10 @@
9506 } 10390 }
9507 }, 10391 },
9508 "create-react-class": { 10392 "create-react-class": {
9509 "version": "15.6.3", 10393 "version": "15.7.0",
9510 "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", 10394 "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz",
9511 "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", 10395 "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==",
9512 "requires": { 10396 "requires": {
9513 "fbjs": "^0.8.9",
9514 "loose-envify": "^1.3.1", 10397 "loose-envify": "^1.3.1",
9515 "object-assign": "^4.1.1" 10398 "object-assign": "^4.1.1"
9516 } 10399 }
@@ -10266,15 +11149,15 @@
10266 } 11149 }
10267 }, 11150 },
10268 "dmg-builder": { 11151 "dmg-builder": {
10269 "version": "22.8.1", 11152 "version": "22.7.0",
10270 "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.8.1.tgz", 11153 "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.7.0.tgz",
10271 "integrity": "sha512-WeGom1moM00gBII6swljl4DQGrlJuEivoUhOmh8U9p1ALgeJL+EiTHbZFERlj8Ejy62xUUjURV+liOxUKmJFWg==", 11154 "integrity": "sha512-5Ea2YEz6zSNbyGzZD+O9/MzmaXb6oa15cSKWo4JQ1xP4rorOpte7IOj2jcwYjtc+Los2gu1lvT314OC1OZIWgg==",
10272 "dev": true, 11155 "dev": true,
10273 "requires": { 11156 "requires": {
10274 "app-builder-lib": "22.8.1", 11157 "app-builder-lib": "22.7.0",
10275 "builder-util": "22.8.1", 11158 "builder-util": "22.7.0",
10276 "fs-extra": "^9.0.1", 11159 "fs-extra": "^9.0.0",
10277 "iconv-lite": "^0.6.2", 11160 "iconv-lite": "^0.5.1",
10278 "js-yaml": "^3.14.0", 11161 "js-yaml": "^3.14.0",
10279 "sanitize-filename": "^1.6.3" 11162 "sanitize-filename": "^1.6.3"
10280 }, 11163 },
@@ -10292,12 +11175,12 @@
10292 } 11175 }
10293 }, 11176 },
10294 "iconv-lite": { 11177 "iconv-lite": {
10295 "version": "0.6.2", 11178 "version": "0.5.2",
10296 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 11179 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz",
10297 "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 11180 "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==",
10298 "dev": true, 11181 "dev": true,
10299 "requires": { 11182 "requires": {
10300 "safer-buffer": ">= 2.1.2 < 3.0.0" 11183 "safer-buffer": ">= 2.1.2 < 3"
10301 } 11184 }
10302 }, 11185 },
10303 "js-yaml": { 11186 "js-yaml": {
@@ -10443,15 +11326,6 @@
10443 "domelementtype": "1" 11326 "domelementtype": "1"
10444 } 11327 }
10445 }, 11328 },
10446 "dot-prop": {
10447 "version": "3.0.0",
10448 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
10449 "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
10450 "dev": true,
10451 "requires": {
10452 "is-obj": "^1.0.0"
10453 }
10454 },
10455 "dotenv": { 11329 "dotenv": {
10456 "version": "4.0.0", 11330 "version": "4.0.0",
10457 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", 11331 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz",
@@ -10712,9 +11586,9 @@
10712 } 11586 }
10713 }, 11587 },
10714 "electron": { 11588 "electron": {
10715 "version": "9.4.0", 11589 "version": "10.1.3",
10716 "resolved": "https://registry.npmjs.org/electron/-/electron-9.4.0.tgz", 11590 "resolved": "https://registry.npmjs.org/electron/-/electron-10.1.3.tgz",
10717 "integrity": "sha512-hOC4q0jkb+UDYZRy8vrZ1IANnq+jznZnbkD62OEo06nU+hIbp2IrwDRBNuSLmQ3cwZMVir0WSIA1qEVK0PkzGA==", 11591 "integrity": "sha512-CR8LrlG47MdAp317SQ3vGYa2o2cIMdMSMPYH46OVitFLk35dwE9fn3VqvhUIXhCHYcNWIAPzMhkVHpkoFdKWuw==",
10718 "dev": true, 11592 "dev": true,
10719 "requires": { 11593 "requires": {
10720 "@electron/get": "^1.0.1", 11594 "@electron/get": "^1.0.1",
@@ -10723,31 +11597,31 @@
10723 } 11597 }
10724 }, 11598 },
10725 "electron-builder": { 11599 "electron-builder": {
10726 "version": "22.8.1", 11600 "version": "22.7.0",
10727 "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.8.1.tgz", 11601 "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.7.0.tgz",
10728 "integrity": "sha512-Hs7KTMq1rGSvT0fwGKXrjbLiJkK6sAKDQooUSwklOkktUgWi4ATjlP0fVE3l8SmS7zcLoww2yDZonSDqxEFhaQ==", 11602 "integrity": "sha512-t6E3oMutpST64YWbZCg7HodEwJOsnjUF1vnDIHm2MW6CFZPX8tlCK6efqaV66LU0E0Nkp/JH6TE5bCqQ1+VdPQ==",
10729 "dev": true, 11603 "dev": true,
10730 "requires": { 11604 "requires": {
10731 "@types/yargs": "^15.0.5", 11605 "@types/yargs": "^15.0.5",
10732 "app-builder-lib": "22.8.1", 11606 "app-builder-lib": "22.7.0",
10733 "bluebird-lst": "^1.0.9", 11607 "bluebird-lst": "^1.0.9",
10734 "builder-util": "22.8.1", 11608 "builder-util": "22.7.0",
10735 "builder-util-runtime": "8.7.2", 11609 "builder-util-runtime": "8.7.1",
10736 "chalk": "^4.1.0", 11610 "chalk": "^4.0.0",
10737 "dmg-builder": "22.8.1", 11611 "dmg-builder": "22.7.0",
10738 "fs-extra": "^9.0.1", 11612 "fs-extra": "^9.0.0",
10739 "is-ci": "^2.0.0", 11613 "is-ci": "^2.0.0",
10740 "lazy-val": "^1.0.4", 11614 "lazy-val": "^1.0.4",
10741 "read-config-file": "6.0.0", 11615 "read-config-file": "6.0.0",
10742 "sanitize-filename": "^1.6.3", 11616 "sanitize-filename": "^1.6.3",
10743 "update-notifier": "^4.1.0", 11617 "update-notifier": "^4.1.0",
10744 "yargs": "^15.4.1" 11618 "yargs": "^15.3.1"
10745 }, 11619 },
10746 "dependencies": { 11620 "dependencies": {
10747 "@types/yargs": { 11621 "@types/yargs": {
10748 "version": "15.0.7", 11622 "version": "15.0.9",
10749 "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.7.tgz", 11623 "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz",
10750 "integrity": "sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA==", 11624 "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==",
10751 "dev": true, 11625 "dev": true,
10752 "requires": { 11626 "requires": {
10753 "@types/yargs-parser": "*" 11627 "@types/yargs-parser": "*"
@@ -10760,22 +11634,21 @@
10760 "dev": true 11634 "dev": true
10761 }, 11635 },
10762 "ansi-styles": { 11636 "ansi-styles": {
10763 "version": "4.2.1", 11637 "version": "4.3.0",
10764 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 11638 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
10765 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 11639 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
10766 "dev": true, 11640 "dev": true,
10767 "requires": { 11641 "requires": {
10768 "@types/color-name": "^1.1.1",
10769 "color-convert": "^2.0.1" 11642 "color-convert": "^2.0.1"
10770 } 11643 }
10771 }, 11644 },
10772 "builder-util-runtime": { 11645 "builder-util-runtime": {
10773 "version": "8.7.2", 11646 "version": "8.7.1",
10774 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz", 11647 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.1.tgz",
10775 "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==", 11648 "integrity": "sha512-uEBH1nAnTvzjcsrh2XI3qOzJ39h0+9kuIuwj+kCc3a07TZNGShfJcai8fFzL3mNgGjEFxoq+XMssR11r+FOFSg==",
10776 "dev": true, 11649 "dev": true,
10777 "requires": { 11650 "requires": {
10778 "debug": "^4.1.1", 11651 "debug": "^4.2.0",
10779 "sax": "^1.2.4" 11652 "sax": "^1.2.4"
10780 } 11653 }
10781 }, 11654 },
@@ -10815,6 +11688,15 @@
10815 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 11688 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
10816 "dev": true 11689 "dev": true
10817 }, 11690 },
11691 "debug": {
11692 "version": "4.2.0",
11693 "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
11694 "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
11695 "dev": true,
11696 "requires": {
11697 "ms": "2.1.2"
11698 }
11699 },
10818 "emoji-regex": { 11700 "emoji-regex": {
10819 "version": "8.0.0", 11701 "version": "8.0.0",
10820 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 11702 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -11015,25 +11897,42 @@
11015 "integrity": "sha512-Z1qA/1oHNowGtSBIcWk0pcLEqYT/j+13xUw/MYOrBUOL4X7VN0i0KCTf5SqyvMPmW5pSPKbo28wkxMxzZ20YnQ==" 11897 "integrity": "sha512-Z1qA/1oHNowGtSBIcWk0pcLEqYT/j+13xUw/MYOrBUOL4X7VN0i0KCTf5SqyvMPmW5pSPKbo28wkxMxzZ20YnQ=="
11016 }, 11898 },
11017 "electron-notarize": { 11899 "electron-notarize": {
11018 "version": "0.2.1", 11900 "version": "1.0.0",
11019 "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz", 11901 "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.0.0.tgz",
11020 "integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==", 11902 "integrity": "sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og==",
11021 "dev": true, 11903 "dev": true,
11022 "requires": { 11904 "requires": {
11023 "debug": "^4.1.1", 11905 "debug": "^4.1.1",
11024 "fs-extra": "^8.1.0" 11906 "fs-extra": "^9.0.1"
11025 }, 11907 },
11026 "dependencies": { 11908 "dependencies": {
11027 "fs-extra": { 11909 "fs-extra": {
11028 "version": "8.1.0", 11910 "version": "9.0.1",
11029 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 11911 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
11030 "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 11912 "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
11031 "dev": true, 11913 "dev": true,
11032 "requires": { 11914 "requires": {
11915 "at-least-node": "^1.0.0",
11033 "graceful-fs": "^4.2.0", 11916 "graceful-fs": "^4.2.0",
11034 "jsonfile": "^4.0.0", 11917 "jsonfile": "^6.0.1",
11035 "universalify": "^0.1.0" 11918 "universalify": "^1.0.0"
11036 } 11919 }
11920 },
11921 "jsonfile": {
11922 "version": "6.0.1",
11923 "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
11924 "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
11925 "dev": true,
11926 "requires": {
11927 "graceful-fs": "^4.1.6",
11928 "universalify": "^1.0.0"
11929 }
11930 },
11931 "universalify": {
11932 "version": "1.0.0",
11933 "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
11934 "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
11935 "dev": true
11037 } 11936 }
11038 } 11937 }
11039 }, 11938 },
@@ -11066,127 +11965,6 @@
11066 } 11965 }
11067 } 11966 }
11068 }, 11967 },
11069 "electron-publish": {
11070 "version": "22.8.1",
11071 "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.8.1.tgz",
11072 "integrity": "sha512-zqI66vl7j1CJZJ60J+1ez1tQNQeuqVspW44JvYDa5kZbM5wSFDAJFMK9RWHOqRF1Ezd4LDeiBa4aeTOwOt9syA==",
11073 "dev": true,
11074 "requires": {
11075 "@types/fs-extra": "^9.0.1",
11076 "bluebird-lst": "^1.0.9",
11077 "builder-util": "22.8.1",
11078 "builder-util-runtime": "8.7.2",
11079 "chalk": "^4.1.0",
11080 "fs-extra": "^9.0.1",
11081 "lazy-val": "^1.0.4",
11082 "mime": "^2.4.6"
11083 },
11084 "dependencies": {
11085 "@types/fs-extra": {
11086 "version": "9.0.1",
11087 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz",
11088 "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==",
11089 "dev": true,
11090 "requires": {
11091 "@types/node": "*"
11092 }
11093 },
11094 "ansi-styles": {
11095 "version": "4.2.1",
11096 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
11097 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
11098 "dev": true,
11099 "requires": {
11100 "@types/color-name": "^1.1.1",
11101 "color-convert": "^2.0.1"
11102 }
11103 },
11104 "builder-util-runtime": {
11105 "version": "8.7.2",
11106 "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz",
11107 "integrity": "sha512-xBqv+8bg6cfnzAQK1k3OGpfaHg+QkPgIgpEkXNhouZ0WiUkyZCftuRc2LYzQrLucFywpa14Xbc6+hTbpq83yRA==",
11108 "dev": true,
11109 "requires": {
11110 "debug": "^4.1.1",
11111 "sax": "^1.2.4"
11112 }
11113 },
11114 "chalk": {
11115 "version": "4.1.0",
11116 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
11117 "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
11118 "dev": true,
11119 "requires": {
11120 "ansi-styles": "^4.1.0",
11121 "supports-color": "^7.1.0"
11122 }
11123 },
11124 "color-convert": {
11125 "version": "2.0.1",
11126 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
11127 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
11128 "dev": true,
11129 "requires": {
11130 "color-name": "~1.1.4"
11131 }
11132 },
11133 "color-name": {
11134 "version": "1.1.4",
11135 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
11136 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
11137 "dev": true
11138 },
11139 "fs-extra": {
11140 "version": "9.0.1",
11141 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
11142 "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
11143 "dev": true,
11144 "requires": {
11145 "at-least-node": "^1.0.0",
11146 "graceful-fs": "^4.2.0",
11147 "jsonfile": "^6.0.1",
11148 "universalify": "^1.0.0"
11149 }
11150 },
11151 "has-flag": {
11152 "version": "4.0.0",
11153 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
11154 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
11155 "dev": true
11156 },
11157 "jsonfile": {
11158 "version": "6.0.1",
11159 "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
11160 "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
11161 "dev": true,
11162 "requires": {
11163 "graceful-fs": "^4.1.6",
11164 "universalify": "^1.0.0"
11165 }
11166 },
11167 "mime": {
11168 "version": "2.4.6",
11169 "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
11170 "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
11171 "dev": true
11172 },
11173 "supports-color": {
11174 "version": "7.2.0",
11175 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
11176 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
11177 "dev": true,
11178 "requires": {
11179 "has-flag": "^4.0.0"
11180 }
11181 },
11182 "universalify": {
11183 "version": "1.0.0",
11184 "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
11185 "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
11186 "dev": true
11187 }
11188 }
11189 },
11190 "electron-react-titlebar": { 11968 "electron-react-titlebar": {
11191 "version": "0.8.2", 11969 "version": "0.8.2",
11192 "resolved": "https://registry.npmjs.org/electron-react-titlebar/-/electron-react-titlebar-0.8.2.tgz", 11970 "resolved": "https://registry.npmjs.org/electron-react-titlebar/-/electron-react-titlebar-0.8.2.tgz",
@@ -11383,39 +12161,57 @@
11383 "dev": true 12161 "dev": true
11384 }, 12162 },
11385 "electron-updater": { 12163 "electron-updater": {
11386 "version": "4.2.5", 12164 "version": "4.3.5",
11387 "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.2.5.tgz", 12165 "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.3.5.tgz",
11388 "integrity": "sha512-ir8SI3capF5pN4LTQY79bP7oqiBKjgtdDW378xVId5VcGUZ+Toei2j+fgx1mq3y4Qg19z4HqLxEZ9FqMD0T0RA==", 12166 "integrity": "sha512-5jjN7ebvfj1cLI0VZMdCnJk6aC4bP+dy7ryBf21vArR0JzpRVk0OZHA2QBD+H5rm6ZSeDYHOY6+8PrMEqJ4wlQ==",
11389 "requires": { 12167 "requires": {
11390 "@types/semver": "^7.1.0", 12168 "@types/semver": "^7.3.1",
11391 "builder-util-runtime": "8.6.2", 12169 "builder-util-runtime": "8.7.2",
11392 "fs-extra": "^8.1.0", 12170 "fs-extra": "^9.0.1",
11393 "js-yaml": "^3.13.1", 12171 "js-yaml": "^3.14.0",
11394 "lazy-val": "^1.0.4", 12172 "lazy-val": "^1.0.4",
11395 "lodash.isequal": "^4.5.0", 12173 "lodash.isequal": "^4.5.0",
11396 "pako": "^1.0.11", 12174 "semver": "^7.3.2"
11397 "semver": "^7.1.3"
11398 }, 12175 },
11399 "dependencies": { 12176 "dependencies": {
11400 "fs-extra": { 12177 "fs-extra": {
11401 "version": "8.1.0", 12178 "version": "9.0.1",
11402 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 12179 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
11403 "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 12180 "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
11404 "requires": { 12181 "requires": {
12182 "at-least-node": "^1.0.0",
11405 "graceful-fs": "^4.2.0", 12183 "graceful-fs": "^4.2.0",
11406 "jsonfile": "^4.0.0", 12184 "jsonfile": "^6.0.1",
11407 "universalify": "^0.1.0" 12185 "universalify": "^1.0.0"
11408 } 12186 }
11409 }, 12187 },
11410 "pako": { 12188 "js-yaml": {
11411 "version": "1.0.11", 12189 "version": "3.14.0",
11412 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 12190 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
11413 "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 12191 "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
12192 "requires": {
12193 "argparse": "^1.0.7",
12194 "esprima": "^4.0.0"
12195 }
12196 },
12197 "jsonfile": {
12198 "version": "6.0.1",
12199 "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
12200 "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
12201 "requires": {
12202 "graceful-fs": "^4.1.6",
12203 "universalify": "^1.0.0"
12204 }
11414 }, 12205 },
11415 "semver": { 12206 "semver": {
11416 "version": "7.1.3", 12207 "version": "7.3.2",
11417 "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", 12208 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
11418 "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" 12209 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
12210 },
12211 "universalify": {
12212 "version": "1.0.0",
12213 "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
12214 "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug=="
11419 } 12215 }
11420 } 12216 }
11421 }, 12217 },
@@ -11452,11 +12248,6 @@
11452 "minimalistic-crypto-utils": "^1.0.0" 12248 "minimalistic-crypto-utils": "^1.0.0"
11453 } 12249 }
11454 }, 12250 },
11455 "email-addresses": {
11456 "version": "3.0.3",
11457 "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.0.3.tgz",
11458 "integrity": "sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg=="
11459 },
11460 "emoji-regex": { 12251 "emoji-regex": {
11461 "version": "7.0.3", 12252 "version": "7.0.3",
11462 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 12253 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
@@ -11469,15 +12260,6 @@
11469 "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", 12260 "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
11470 "dev": true 12261 "dev": true
11471 }, 12262 },
11472 "emscripten-wasm-loader": {
11473 "version": "1.1.0",
11474 "resolved": "https://registry.npmjs.org/emscripten-wasm-loader/-/emscripten-wasm-loader-1.1.0.tgz",
11475 "integrity": "sha512-kXR3lT/900WjvhpdhaNSuD6WJKpd4ZlMh/ZaRM0rp82uKoGBq7Ud/u0GVIxQD15cqsShCKEHOpd3bZypvft9Lw==",
11476 "requires": {
11477 "getroot": "^1.0.0",
11478 "tslib": "^1.8.0"
11479 }
11480 },
11481 "enabled": { 12263 "enabled": {
11482 "version": "1.0.2", 12264 "version": "1.0.2",
11483 "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", 12265 "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
@@ -11632,14 +12414,56 @@
11632 } 12414 }
11633 }, 12415 },
11634 "enhanced-resolve": { 12416 "enhanced-resolve": {
11635 "version": "4.1.0", 12417 "version": "4.3.0",
11636 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", 12418 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
11637 "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", 12419 "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
11638 "dev": true, 12420 "dev": true,
11639 "requires": { 12421 "requires": {
11640 "graceful-fs": "^4.1.2", 12422 "graceful-fs": "^4.1.2",
11641 "memory-fs": "^0.4.0", 12423 "memory-fs": "^0.5.0",
11642 "tapable": "^1.0.0" 12424 "tapable": "^1.0.0"
12425 },
12426 "dependencies": {
12427 "memory-fs": {
12428 "version": "0.5.0",
12429 "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
12430 "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
12431 "dev": true,
12432 "requires": {
12433 "errno": "^0.1.3",
12434 "readable-stream": "^2.0.1"
12435 }
12436 },
12437 "readable-stream": {
12438 "version": "2.3.7",
12439 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
12440 "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
12441 "dev": true,
12442 "requires": {
12443 "core-util-is": "~1.0.0",
12444 "inherits": "~2.0.3",
12445 "isarray": "~1.0.0",
12446 "process-nextick-args": "~2.0.0",
12447 "safe-buffer": "~5.1.1",
12448 "string_decoder": "~1.1.1",
12449 "util-deprecate": "~1.0.1"
12450 }
12451 },
12452 "safe-buffer": {
12453 "version": "5.1.2",
12454 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
12455 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
12456 "dev": true
12457 },
12458 "string_decoder": {
12459 "version": "1.1.1",
12460 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
12461 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
12462 "dev": true,
12463 "requires": {
12464 "safe-buffer": "~5.1.0"
12465 }
12466 }
11643 } 12467 }
11644 }, 12468 },
11645 "enquirer": { 12469 "enquirer": {
@@ -11750,32 +12574,148 @@
11750 "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" 12574 "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y="
11751 }, 12575 },
11752 "es-abstract": { 12576 "es-abstract": {
11753 "version": "1.14.2", 12577 "version": "1.17.7",
11754 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", 12578 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
11755 "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", 12579 "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
11756 "dev": true, 12580 "dev": true,
11757 "requires": { 12581 "requires": {
11758 "es-to-primitive": "^1.2.0", 12582 "es-to-primitive": "^1.2.1",
11759 "function-bind": "^1.1.1", 12583 "function-bind": "^1.1.1",
11760 "has": "^1.0.3", 12584 "has": "^1.0.3",
11761 "has-symbols": "^1.0.0", 12585 "has-symbols": "^1.0.1",
11762 "is-callable": "^1.1.4", 12586 "is-callable": "^1.2.2",
11763 "is-regex": "^1.0.4", 12587 "is-regex": "^1.1.1",
11764 "object-inspect": "^1.6.0", 12588 "object-inspect": "^1.8.0",
11765 "object-keys": "^1.1.1", 12589 "object-keys": "^1.1.1",
11766 "string.prototype.trimleft": "^2.0.0", 12590 "object.assign": "^4.1.1",
11767 "string.prototype.trimright": "^2.0.0" 12591 "string.prototype.trimend": "^1.0.1",
11768 } 12592 "string.prototype.trimstart": "^1.0.1"
11769 }, 12593 },
11770 "es-to-primitive": { 12594 "dependencies": {
11771 "version": "1.2.0", 12595 "es-abstract": {
11772 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 12596 "version": "1.18.0-next.1",
11773 "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 12597 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
11774 "dev": true, 12598 "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
11775 "requires": { 12599 "requires": {
11776 "is-callable": "^1.1.4", 12600 "es-to-primitive": "^1.2.1",
11777 "is-date-object": "^1.0.1", 12601 "function-bind": "^1.1.1",
11778 "is-symbol": "^1.0.2" 12602 "has": "^1.0.3",
12603 "has-symbols": "^1.0.1",
12604 "is-callable": "^1.2.2",
12605 "is-negative-zero": "^2.0.0",
12606 "is-regex": "^1.1.1",
12607 "object-inspect": "^1.8.0",
12608 "object-keys": "^1.1.1",
12609 "object.assign": "^4.1.1",
12610 "string.prototype.trimend": "^1.0.1",
12611 "string.prototype.trimstart": "^1.0.1"
12612 }
12613 },
12614 "es-to-primitive": {
12615 "version": "1.2.1",
12616 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
12617 "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
12618 "requires": {
12619 "is-callable": "^1.1.4",
12620 "is-date-object": "^1.0.1",
12621 "is-symbol": "^1.0.2"
12622 }
12623 },
12624 "has-symbols": {
12625 "version": "1.0.1",
12626 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
12627 "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
12628 },
12629 "is-callable": {
12630 "version": "1.2.2",
12631 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
12632 "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
12633 },
12634 "is-regex": {
12635 "version": "1.1.1",
12636 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
12637 "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
12638 "requires": {
12639 "has-symbols": "^1.0.1"
12640 }
12641 },
12642 "object-inspect": {
12643 "version": "1.8.0",
12644 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
12645 "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
12646 },
12647 "object.assign": {
12648 "version": "4.1.1",
12649 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
12650 "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
12651 "requires": {
12652 "define-properties": "^1.1.3",
12653 "es-abstract": "^1.18.0-next.0",
12654 "has-symbols": "^1.0.1",
12655 "object-keys": "^1.1.1"
12656 },
12657 "dependencies": {
12658 "es-abstract": {
12659 "version": "1.18.0-next.2",
12660 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz",
12661 "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==",
12662 "requires": {
12663 "call-bind": "^1.0.2",
12664 "es-to-primitive": "^1.2.1",
12665 "function-bind": "^1.1.1",
12666 "get-intrinsic": "^1.0.2",
12667 "has": "^1.0.3",
12668 "has-symbols": "^1.0.1",
12669 "is-callable": "^1.2.2",
12670 "is-negative-zero": "^2.0.1",
12671 "is-regex": "^1.1.1",
12672 "object-inspect": "^1.9.0",
12673 "object-keys": "^1.1.1",
12674 "string.prototype.trimend": "^1.0.3",
12675 "string.prototype.trimstart": "^1.0.3"
12676 }
12677 },
12678 "is-negative-zero": {
12679 "version": "2.0.1",
12680 "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
12681 "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
12682 },
12683 "object-inspect": {
12684 "version": "1.9.0",
12685 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
12686 "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
12687 },
12688 "object.assign": {
12689 "version": "4.1.2",
12690 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
12691 "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
12692 "requires": {
12693 "call-bind": "^1.0.0",
12694 "define-properties": "^1.1.3",
12695 "has-symbols": "^1.0.1",
12696 "object-keys": "^1.1.1"
12697 }
12698 },
12699 "string.prototype.trimend": {
12700 "version": "1.0.3",
12701 "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
12702 "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
12703 "requires": {
12704 "call-bind": "^1.0.0",
12705 "define-properties": "^1.1.3"
12706 }
12707 },
12708 "string.prototype.trimstart": {
12709 "version": "1.0.3",
12710 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
12711 "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
12712 "requires": {
12713 "call-bind": "^1.0.0",
12714 "define-properties": "^1.1.3"
12715 }
12716 }
12717 }
12718 }
11779 } 12719 }
11780 }, 12720 },
11781 "es5-ext": { 12721 "es5-ext": {
@@ -11840,6 +12780,12 @@
11840 "es6-symbol": "^3.1.1" 12780 "es6-symbol": "^3.1.1"
11841 } 12781 }
11842 }, 12782 },
12783 "escalade": {
12784 "version": "3.1.1",
12785 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
12786 "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
12787 "dev": true
12788 },
11843 "escape-goat": { 12789 "escape-goat": {
11844 "version": "2.1.1", 12790 "version": "2.1.1",
11845 "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", 12791 "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
@@ -12859,21 +13805,6 @@
12859 } 13805 }
12860 } 13806 }
12861 }, 13807 },
12862 "ext": {
12863 "version": "1.4.0",
12864 "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
12865 "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
12866 "requires": {
12867 "type": "^2.0.0"
12868 },
12869 "dependencies": {
12870 "type": {
12871 "version": "2.1.0",
12872 "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
12873 "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA=="
12874 }
12875 }
12876 },
12877 "ext-list": { 13808 "ext-list": {
12878 "version": "2.2.2", 13809 "version": "2.2.2",
12879 "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 13810 "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
@@ -13046,11 +13977,6 @@
13046 "time-stamp": "^1.0.0" 13977 "time-stamp": "^1.0.0"
13047 } 13978 }
13048 }, 13979 },
13049 "fast-deep-equal": {
13050 "version": "2.0.1",
13051 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
13052 "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
13053 },
13054 "fast-glob": { 13980 "fast-glob": {
13055 "version": "2.2.7", 13981 "version": "2.2.7",
13056 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", 13982 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
@@ -13107,27 +14033,6 @@
13107 "bser": "^2.0.0" 14033 "bser": "^2.0.0"
13108 } 14034 }
13109 }, 14035 },
13110 "fbjs": {
13111 "version": "0.8.17",
13112 "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
13113 "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
13114 "requires": {
13115 "core-js": "^1.0.0",
13116 "isomorphic-fetch": "^2.1.1",
13117 "loose-envify": "^1.0.0",
13118 "object-assign": "^4.1.0",
13119 "promise": "^7.1.1",
13120 "setimmediate": "^1.0.5",
13121 "ua-parser-js": "^0.7.18"
13122 },
13123 "dependencies": {
13124 "core-js": {
13125 "version": "1.2.7",
13126 "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
13127 "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
13128 }
13129 }
13130 },
13131 "fd-slicer": { 14036 "fd-slicer": {
13132 "version": "1.1.0", 14037 "version": "1.1.0",
13133 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 14038 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
@@ -13197,7 +14102,8 @@
13197 "version": "2.0.0", 14102 "version": "2.0.0",
13198 "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 14103 "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
13199 "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", 14104 "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
13200 "dev": true 14105 "dev": true,
14106 "optional": true
13201 }, 14107 },
13202 "filenamify": { 14108 "filenamify": {
13203 "version": "2.1.0", 14109 "version": "2.1.0",
@@ -14368,6 +15274,23 @@
14368 "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 15274 "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
14369 "dev": true 15275 "dev": true
14370 }, 15276 },
15277 "get-intrinsic": {
15278 "version": "1.1.1",
15279 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
15280 "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
15281 "requires": {
15282 "function-bind": "^1.1.1",
15283 "has": "^1.0.3",
15284 "has-symbols": "^1.0.1"
15285 },
15286 "dependencies": {
15287 "has-symbols": {
15288 "version": "1.0.1",
15289 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
15290 "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
15291 }
15292 }
15293 },
14371 "get-pkg-repo": { 15294 "get-pkg-repo": {
14372 "version": "1.4.0", 15295 "version": "1.4.0",
14373 "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", 15296 "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
@@ -14838,56 +15761,6 @@
14838 } 15761 }
14839 } 15762 }
14840 }, 15763 },
14841 "git-semver-tags": {
14842 "version": "3.0.1",
14843 "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz",
14844 "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==",
14845 "dev": true,
14846 "requires": {
14847 "meow": "^5.0.0",
14848 "semver": "^6.0.0"
14849 },
14850 "dependencies": {
14851 "camelcase": {
14852 "version": "4.1.0",
14853 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
14854 "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
14855 "dev": true
14856 },
14857 "meow": {
14858 "version": "5.0.0",
14859 "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz",
14860 "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==",
14861 "dev": true,
14862 "requires": {
14863 "camelcase-keys": "^4.0.0",
14864 "decamelize-keys": "^1.0.0",
14865 "loud-rejection": "^1.0.0",
14866 "minimist-options": "^3.0.1",
14867 "normalize-package-data": "^2.3.4",
14868 "read-pkg-up": "^3.0.0",
14869 "redent": "^2.0.0",
14870 "trim-newlines": "^2.0.0",
14871 "yargs-parser": "^10.0.0"
14872 }
14873 },
14874 "semver": {
14875 "version": "6.3.0",
14876 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
14877 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
14878 "dev": true
14879 },
14880 "yargs-parser": {
14881 "version": "10.1.0",
14882 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
14883 "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
14884 "dev": true,
14885 "requires": {
14886 "camelcase": "^4.1.0"
14887 }
14888 }
14889 }
14890 },
14891 "git-up": { 15764 "git-up": {
14892 "version": "4.0.1", 15765 "version": "4.0.1",
14893 "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", 15766 "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz",
@@ -15082,36 +15955,16 @@
15082 }, 15955 },
15083 "dependencies": { 15956 "dependencies": {
15084 "core-js": { 15957 "core-js": {
15085 "version": "3.8.3", 15958 "version": "3.6.5",
15086 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", 15959 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
15087 "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", 15960 "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
15088 "dev": true, 15961 "dev": true,
15089 "optional": true 15962 "optional": true
15090 }, 15963 },
15091 "lru-cache": {
15092 "version": "6.0.0",
15093 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
15094 "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
15095 "dev": true,
15096 "optional": true,
15097 "requires": {
15098 "yallist": "^4.0.0"
15099 }
15100 },
15101 "semver": { 15964 "semver": {
15102 "version": "7.3.4", 15965 "version": "7.3.2",
15103 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 15966 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
15104 "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 15967 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
15105 "dev": true,
15106 "optional": true,
15107 "requires": {
15108 "lru-cache": "^6.0.0"
15109 }
15110 },
15111 "yallist": {
15112 "version": "4.0.0",
15113 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
15114 "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
15115 "dev": true, 15968 "dev": true,
15116 "optional": true 15969 "optional": true
15117 } 15970 }
@@ -18443,8 +19296,7 @@
18443 "is-negative-zero": { 19296 "is-negative-zero": {
18444 "version": "2.0.0", 19297 "version": "2.0.0",
18445 "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", 19298 "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
18446 "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", 19299 "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
18447 "dev": true
18448 }, 19300 },
18449 "is-npm": { 19301 "is-npm": {
18450 "version": "4.0.0", 19302 "version": "4.0.0",
@@ -18550,8 +19402,7 @@
18550 "is-promise": { 19402 "is-promise": {
18551 "version": "2.1.0", 19403 "version": "2.1.0",
18552 "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 19404 "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
18553 "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 19405 "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
18554 "dev": true
18555 }, 19406 },
18556 "is-regex": { 19407 "is-regex": {
18557 "version": "1.0.4", 19408 "version": "1.0.4",
@@ -18609,15 +19460,6 @@
18609 "has-symbols": "^1.0.0" 19460 "has-symbols": "^1.0.0"
18610 } 19461 }
18611 }, 19462 },
18612 "is-text-path": {
18613 "version": "2.0.0",
18614 "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
18615 "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
18616 "dev": true,
18617 "requires": {
18618 "text-extensions": "^2.0.0"
18619 }
18620 },
18621 "is-typedarray": { 19463 "is-typedarray": {
18622 "version": "1.0.0", 19464 "version": "1.0.0",
18623 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 19465 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -18681,26 +19523,6 @@
18681 "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 19523 "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
18682 "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 19524 "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
18683 }, 19525 },
18684 "isomorphic-fetch": {
18685 "version": "2.2.1",
18686 "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
18687 "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
18688 "requires": {
18689 "node-fetch": "^1.0.1",
18690 "whatwg-fetch": ">=0.10.0"
18691 },
18692 "dependencies": {
18693 "node-fetch": {
18694 "version": "1.7.3",
18695 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
18696 "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
18697 "requires": {
18698 "encoding": "^0.1.11",
18699 "is-stream": "^1.0.1"
18700 }
18701 }
18702 }
18703 },
18704 "isstream": { 19526 "isstream": {
18705 "version": "0.1.2", 19527 "version": "0.1.2",
18706 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 19528 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -19475,9 +20297,9 @@
19475 } 20297 }
19476 }, 20298 },
19477 "js-base64": { 20299 "js-base64": {
19478 "version": "2.5.2", 20300 "version": "2.6.4",
19479 "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", 20301 "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
19480 "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", 20302 "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
19481 "dev": true 20303 "dev": true
19482 }, 20304 },
19483 "js-levenshtein": { 20305 "js-levenshtein": {
@@ -19492,9 +20314,10 @@
19492 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 20314 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
19493 }, 20315 },
19494 "js-yaml": { 20316 "js-yaml": {
19495 "version": "3.13.1", 20317 "version": "3.12.1",
19496 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 20318 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz",
19497 "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 20319 "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==",
20320 "dev": true,
19498 "requires": { 20321 "requires": {
19499 "argparse": "^1.0.7", 20322 "argparse": "^1.0.7",
19500 "esprima": "^4.0.0" 20323 "esprima": "^4.0.0"
@@ -20847,15 +21670,20 @@
20847 }, 21670 },
20848 "dependencies": { 21671 "dependencies": {
20849 "cross-spawn": { 21672 "cross-spawn": {
20850 "version": "7.0.2", 21673 "version": "7.0.1",
20851 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", 21674 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
20852 "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", 21675 "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
20853 "requires": { 21676 "requires": {
20854 "path-key": "^3.1.0", 21677 "path-key": "^3.1.0",
20855 "shebang-command": "^2.0.0", 21678 "shebang-command": "^2.0.0",
20856 "which": "^2.0.1" 21679 "which": "^2.0.1"
20857 } 21680 }
20858 }, 21681 },
21682 "electron-is-dev": {
21683 "version": "1.1.0",
21684 "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.1.0.tgz",
21685 "integrity": "sha512-Z1qA/1oHNowGtSBIcWk0pcLEqYT/j+13xUw/MYOrBUOL4X7VN0i0KCTf5SqyvMPmW5pSPKbo28wkxMxzZ20YnQ=="
21686 },
20859 "electron-util": { 21687 "electron-util": {
20860 "version": "0.13.1", 21688 "version": "0.13.1",
20861 "resolved": "https://registry.npmjs.org/electron-util/-/electron-util-0.13.1.tgz", 21689 "resolved": "https://registry.npmjs.org/electron-util/-/electron-util-0.13.1.tgz",
@@ -20899,6 +21727,11 @@
20899 "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 21727 "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
20900 "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 21728 "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
20901 }, 21729 },
21730 "mimic-fn": {
21731 "version": "2.1.0",
21732 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
21733 "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
21734 },
20902 "npm-run-path": { 21735 "npm-run-path": {
20903 "version": "3.1.0", 21736 "version": "3.1.0",
20904 "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", 21737 "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
@@ -21208,56 +22041,18 @@
21208 } 22041 }
21209 }, 22042 },
21210 "memoizee": { 22043 "memoizee": {
21211 "version": "0.4.15", 22044 "version": "0.4.14",
21212 "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", 22045 "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
21213 "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", 22046 "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
21214 "requires": { 22047 "requires": {
21215 "d": "^1.0.1", 22048 "d": "1",
21216 "es5-ext": "^0.10.53", 22049 "es5-ext": "^0.10.45",
21217 "es6-weak-map": "^2.0.3", 22050 "es6-weak-map": "^2.0.2",
21218 "event-emitter": "^0.3.5", 22051 "event-emitter": "^0.3.5",
21219 "is-promise": "^2.2.2", 22052 "is-promise": "^2.1",
21220 "lru-queue": "^0.1.0", 22053 "lru-queue": "0.1",
21221 "next-tick": "^1.1.0", 22054 "next-tick": "1",
21222 "timers-ext": "^0.1.7" 22055 "timers-ext": "^0.1.5"
21223 },
21224 "dependencies": {
21225 "es5-ext": {
21226 "version": "0.10.53",
21227 "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
21228 "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
21229 "requires": {
21230 "es6-iterator": "~2.0.3",
21231 "es6-symbol": "~3.1.3",
21232 "next-tick": "~1.0.0"
21233 },
21234 "dependencies": {
21235 "next-tick": {
21236 "version": "1.0.0",
21237 "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
21238 "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
21239 }
21240 }
21241 },
21242 "es6-symbol": {
21243 "version": "3.1.3",
21244 "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
21245 "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
21246 "requires": {
21247 "d": "^1.0.1",
21248 "ext": "^1.1.2"
21249 }
21250 },
21251 "is-promise": {
21252 "version": "2.2.2",
21253 "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
21254 "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
21255 },
21256 "next-tick": {
21257 "version": "1.1.0",
21258 "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
21259 "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
21260 }
21261 } 22056 }
21262 }, 22057 },
21263 "memory-fs": { 22058 "memory-fs": {
@@ -21449,7 +22244,8 @@
21449 "mimic-fn": { 22244 "mimic-fn": {
21450 "version": "2.1.0", 22245 "version": "2.1.0",
21451 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 22246 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
21452 "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 22247 "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
22248 "dev": true
21453 }, 22249 },
21454 "mimic-response": { 22250 "mimic-response": {
21455 "version": "1.0.1", 22251 "version": "1.0.1",
@@ -21968,33 +22764,43 @@
21968 } 22764 }
21969 }, 22765 },
21970 "node-abi": { 22766 "node-abi": {
21971 "version": "2.18.0", 22767 "version": "2.19.1",
21972 "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", 22768 "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz",
21973 "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", 22769 "integrity": "sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==",
21974 "dev": true, 22770 "dev": true,
21975 "requires": { 22771 "requires": {
21976 "semver": "^5.4.1" 22772 "semver": "^5.4.1"
21977 } 22773 }
21978 }, 22774 },
22775 "node-addon-api": {
22776 "version": "3.0.2",
22777 "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz",
22778 "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg=="
22779 },
21979 "node-cookie": { 22780 "node-cookie": {
21980 "version": "2.1.1", 22781 "version": "2.1.2",
21981 "resolved": "https://registry.npmjs.org/node-cookie/-/node-cookie-2.1.1.tgz", 22782 "resolved": "https://registry.npmjs.org/node-cookie/-/node-cookie-2.1.2.tgz",
21982 "integrity": "sha512-NZG0AxjfMT7N421HUvgOu4ilLin2GpzUnHrETT3k8UyytQTnEWBH6KOyAP9LoMEeu+CvUdwMB5w4ZK3pohjswg==", 22783 "integrity": "sha512-8/k8V9/2hCESYMmNVtJiHweKlP1ZqjrzG3bv+cSooiWurHB6N7KqVdX/s7ojbBXTwOJrLKJzC9rlPRvFRYuKRA==",
21983 "requires": { 22784 "requires": {
21984 "cookie": "^0.3.1", 22785 "cookie": "^0.4.0",
21985 "cookie-signature": "^1.1.0", 22786 "cookie-signature": "^1.1.0",
21986 "simple-encryptor": "^1.4.0" 22787 "simple-encryptor": "^3.0.0"
21987 }, 22788 },
21988 "dependencies": { 22789 "dependencies": {
22790 "cookie": {
22791 "version": "0.4.1",
22792 "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
22793 "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
22794 },
21989 "cookie-signature": { 22795 "cookie-signature": {
21990 "version": "1.1.0", 22796 "version": "1.1.0",
21991 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", 22797 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz",
21992 "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==" 22798 "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A=="
21993 }, 22799 },
21994 "simple-encryptor": { 22800 "simple-encryptor": {
21995 "version": "1.4.0", 22801 "version": "3.0.0",
21996 "resolved": "https://registry.npmjs.org/simple-encryptor/-/simple-encryptor-1.4.0.tgz", 22802 "resolved": "https://registry.npmjs.org/simple-encryptor/-/simple-encryptor-3.0.0.tgz",
21997 "integrity": "sha512-g7UhXQ6flzimqzoaDqjGl5hBh4/+tJ4dtAIHaWhO9gtt+GkLRb3F/Xjv//XORFstkNxA+CFVzZJCLhs24NmrSQ==", 22803 "integrity": "sha512-xRgj9pU3Gfkl+6iBYRoXM4BdEwY4bLdL1W0tp7AjGTA7Hytv5iwmB5tvJh6K2iVszvPPYimQjLFV8jRZz3fJ1g==",
21998 "requires": { 22804 "requires": {
21999 "scmp": "2.0.0" 22805 "scmp": "2.0.0"
22000 } 22806 }
@@ -22398,9 +23204,9 @@
22398 } 23204 }
22399 }, 23205 },
22400 "node-sass": { 23206 "node-sass": {
22401 "version": "4.14.0", 23207 "version": "4.14.1",
22402 "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", 23208 "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
22403 "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", 23209 "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
22404 "dev": true, 23210 "dev": true,
22405 "requires": { 23211 "requires": {
22406 "async-foreach": "^0.1.3", 23212 "async-foreach": "^0.1.3",
@@ -22417,7 +23223,7 @@
22417 "node-gyp": "^3.8.0", 23223 "node-gyp": "^3.8.0",
22418 "npmlog": "^4.0.0", 23224 "npmlog": "^4.0.0",
22419 "request": "^2.88.0", 23225 "request": "^2.88.0",
22420 "sass-graph": "^2.2.4", 23226 "sass-graph": "2.2.5",
22421 "stdout-stream": "^1.4.0", 23227 "stdout-stream": "^1.4.0",
22422 "true-case-path": "^1.0.2" 23228 "true-case-path": "^1.0.2"
22423 }, 23229 },
@@ -22505,6 +23311,12 @@
22505 "strip-bom": "^2.0.0" 23311 "strip-bom": "^2.0.0"
22506 } 23312 }
22507 }, 23313 },
23314 "lodash": {
23315 "version": "4.17.20",
23316 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
23317 "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
23318 "dev": true
23319 },
22508 "map-obj": { 23320 "map-obj": {
22509 "version": "1.0.1", 23321 "version": "1.0.1",
22510 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 23322 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
@@ -22535,6 +23347,12 @@
22535 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 23347 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
22536 "dev": true 23348 "dev": true
22537 }, 23349 },
23350 "nan": {
23351 "version": "2.14.1",
23352 "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
23353 "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
23354 "dev": true
23355 },
22538 "node-gyp": { 23356 "node-gyp": {
22539 "version": "3.8.0", 23357 "version": "3.8.0",
22540 "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", 23358 "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
@@ -22899,12 +23717,6 @@
22899 "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", 23717 "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
22900 "dev": true 23718 "dev": true
22901 }, 23719 },
22902 "object-inspect": {
22903 "version": "1.6.0",
22904 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
22905 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
22906 "dev": true
22907 },
22908 "object-is": { 23720 "object-is": {
22909 "version": "1.0.1", 23721 "version": "1.0.1",
22910 "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", 23722 "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
@@ -23542,9 +24354,9 @@
23542 } 24354 }
23543 }, 24355 },
23544 "pako": { 24356 "pako": {
23545 "version": "1.0.10", 24357 "version": "1.0.8",
23546 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 24358 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
23547 "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", 24359 "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==",
23548 "dev": true 24360 "dev": true
23549 }, 24361 },
23550 "parallel-transform": { 24362 "parallel-transform": {
@@ -24081,9 +24893,9 @@
24081 "dev": true 24893 "dev": true
24082 }, 24894 },
24083 "process-nextick-args": { 24895 "process-nextick-args": {
24084 "version": "2.0.1", 24896 "version": "2.0.0",
24085 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 24897 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
24086 "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 24898 "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
24087 }, 24899 },
24088 "progress": { 24900 "progress": {
24089 "version": "2.0.3", 24901 "version": "2.0.3",
@@ -24091,14 +24903,6 @@
24091 "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 24903 "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
24092 "dev": true 24904 "dev": true
24093 }, 24905 },
24094 "promise": {
24095 "version": "7.3.1",
24096 "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
24097 "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
24098 "requires": {
24099 "asap": "~2.0.3"
24100 }
24101 },
24102 "promise-inflight": { 24906 "promise-inflight": {
24103 "version": "1.0.1", 24907 "version": "1.0.1",
24104 "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 24908 "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
@@ -24395,6 +25199,11 @@
24395 "prompt-base": "^4.0.2" 25199 "prompt-base": "^4.0.2"
24396 }, 25200 },
24397 "dependencies": { 25201 "dependencies": {
25202 "ansi-regex": {
25203 "version": "4.1.0",
25204 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
25205 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
25206 },
24398 "debug": { 25207 "debug": {
24399 "version": "2.6.9", 25208 "version": "2.6.9",
24400 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 25209 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -24407,6 +25216,11 @@
24407 "version": "2.0.0", 25216 "version": "2.0.0",
24408 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 25217 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
24409 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 25218 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
25219 },
25220 "react-is": {
25221 "version": "16.8.6",
25222 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
25223 "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="
24410 } 25224 }
24411 } 25225 }
24412 }, 25226 },
@@ -24478,9 +25292,9 @@
24478 }, 25292 },
24479 "dependencies": { 25293 "dependencies": {
24480 "kind-of": { 25294 "kind-of": {
24481 "version": "6.0.2", 25295 "version": "6.0.3",
24482 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 25296 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
24483 "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 25297 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
24484 } 25298 }
24485 } 25299 }
24486 }, 25300 },
@@ -24493,9 +25307,9 @@
24493 }, 25307 },
24494 "dependencies": { 25308 "dependencies": {
24495 "kind-of": { 25309 "kind-of": {
24496 "version": "6.0.2", 25310 "version": "6.0.3",
24497 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 25311 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
24498 "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 25312 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
24499 } 25313 }
24500 } 25314 }
24501 }, 25315 },
@@ -24510,9 +25324,9 @@
24510 }, 25324 },
24511 "dependencies": { 25325 "dependencies": {
24512 "kind-of": { 25326 "kind-of": {
24513 "version": "6.0.2", 25327 "version": "6.0.3",
24514 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 25328 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
24515 "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 25329 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
24516 } 25330 }
24517 } 25331 }
24518 }, 25332 },
@@ -25212,6 +26026,16 @@
25212 "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", 26026 "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
25213 "dev": true 26027 "dev": true
25214 }, 26028 },
26029 "js-yaml": {
26030 "version": "3.14.0",
26031 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
26032 "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
26033 "dev": true,
26034 "requires": {
26035 "argparse": "^1.0.7",
26036 "esprima": "^4.0.0"
26037 }
26038 },
25215 "json5": { 26039 "json5": {
25216 "version": "2.1.3", 26040 "version": "2.1.3",
25217 "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 26041 "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
@@ -25995,9 +26819,9 @@
25995 "dev": true 26819 "dev": true
25996 }, 26820 },
25997 "rimraf": { 26821 "rimraf": {
25998 "version": "2.7.1", 26822 "version": "2.6.3",
25999 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 26823 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
26000 "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 26824 "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
26001 "requires": { 26825 "requires": {
26002 "glob": "^7.1.3" 26826 "glob": "^7.1.3"
26003 } 26827 }
@@ -26150,221 +26974,103 @@
26150 } 26974 }
26151 }, 26975 },
26152 "sass-graph": { 26976 "sass-graph": {
26153 "version": "2.2.4", 26977 "version": "2.2.5",
26154 "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", 26978 "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
26155 "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", 26979 "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
26156 "dev": true, 26980 "dev": true,
26157 "requires": { 26981 "requires": {
26158 "glob": "^7.0.0", 26982 "glob": "^7.0.0",
26159 "lodash": "^4.0.0", 26983 "lodash": "^4.0.0",
26160 "scss-tokenizer": "^0.2.3", 26984 "scss-tokenizer": "^0.2.3",
26161 "yargs": "^7.0.0" 26985 "yargs": "^13.3.2"
26162 }, 26986 },
26163 "dependencies": { 26987 "dependencies": {
26164 "ansi-regex": { 26988 "ansi-regex": {
26165 "version": "2.1.1", 26989 "version": "4.1.0",
26166 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 26990 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
26167 "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 26991 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
26168 "dev": true
26169 },
26170 "camelcase": {
26171 "version": "3.0.0",
26172 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
26173 "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
26174 "dev": true 26992 "dev": true
26175 }, 26993 },
26176 "cliui": { 26994 "cliui": {
26177 "version": "3.2.0", 26995 "version": "5.0.0",
26178 "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 26996 "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
26179 "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 26997 "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
26180 "dev": true,
26181 "requires": {
26182 "string-width": "^1.0.1",
26183 "strip-ansi": "^3.0.1",
26184 "wrap-ansi": "^2.0.0"
26185 }
26186 },
26187 "find-up": {
26188 "version": "1.1.2",
26189 "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
26190 "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
26191 "dev": true, 26998 "dev": true,
26192 "requires": { 26999 "requires": {
26193 "path-exists": "^2.0.0", 27000 "string-width": "^3.1.0",
26194 "pinkie-promise": "^2.0.0" 27001 "strip-ansi": "^5.2.0",
27002 "wrap-ansi": "^5.1.0"
26195 } 27003 }
26196 }, 27004 },
26197 "invert-kv": { 27005 "get-caller-file": {
26198 "version": "1.0.0", 27006 "version": "2.0.5",
26199 "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 27007 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
26200 "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 27008 "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
26201 "dev": true 27009 "dev": true
26202 }, 27010 },
26203 "is-fullwidth-code-point": { 27011 "require-main-filename": {
26204 "version": "1.0.0", 27012 "version": "2.0.0",
26205 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 27013 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
26206 "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 27014 "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
26207 "dev": true,
26208 "requires": {
26209 "number-is-nan": "^1.0.0"
26210 }
26211 },
26212 "lcid": {
26213 "version": "1.0.0",
26214 "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
26215 "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
26216 "dev": true,
26217 "requires": {
26218 "invert-kv": "^1.0.0"
26219 }
26220 },
26221 "load-json-file": {
26222 "version": "1.1.0",
26223 "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
26224 "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
26225 "dev": true,
26226 "requires": {
26227 "graceful-fs": "^4.1.2",
26228 "parse-json": "^2.2.0",
26229 "pify": "^2.0.0",
26230 "pinkie-promise": "^2.0.0",
26231 "strip-bom": "^2.0.0"
26232 }
26233 },
26234 "os-locale": {
26235 "version": "1.4.0",
26236 "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
26237 "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
26238 "dev": true,
26239 "requires": {
26240 "lcid": "^1.0.0"
26241 }
26242 },
26243 "parse-json": {
26244 "version": "2.2.0",
26245 "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
26246 "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
26247 "dev": true,
26248 "requires": {
26249 "error-ex": "^1.2.0"
26250 }
26251 },
26252 "path-exists": {
26253 "version": "2.1.0",
26254 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
26255 "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
26256 "dev": true,
26257 "requires": {
26258 "pinkie-promise": "^2.0.0"
26259 }
26260 },
26261 "path-type": {
26262 "version": "1.1.0",
26263 "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
26264 "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
26265 "dev": true,
26266 "requires": {
26267 "graceful-fs": "^4.1.2",
26268 "pify": "^2.0.0",
26269 "pinkie-promise": "^2.0.0"
26270 }
26271 },
26272 "pify": {
26273 "version": "2.3.0",
26274 "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
26275 "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
26276 "dev": true 27015 "dev": true
26277 }, 27016 },
26278 "read-pkg": {
26279 "version": "1.1.0",
26280 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
26281 "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
26282 "dev": true,
26283 "requires": {
26284 "load-json-file": "^1.0.0",
26285 "normalize-package-data": "^2.3.2",
26286 "path-type": "^1.0.0"
26287 }
26288 },
26289 "read-pkg-up": {
26290 "version": "1.0.1",
26291 "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
26292 "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
26293 "dev": true,
26294 "requires": {
26295 "find-up": "^1.0.0",
26296 "read-pkg": "^1.0.0"
26297 }
26298 },
26299 "string-width": { 27017 "string-width": {
26300 "version": "1.0.2", 27018 "version": "3.1.0",
26301 "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 27019 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
26302 "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 27020 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
26303 "dev": true, 27021 "dev": true,
26304 "requires": { 27022 "requires": {
26305 "code-point-at": "^1.0.0", 27023 "emoji-regex": "^7.0.1",
26306 "is-fullwidth-code-point": "^1.0.0", 27024 "is-fullwidth-code-point": "^2.0.0",
26307 "strip-ansi": "^3.0.0" 27025 "strip-ansi": "^5.1.0"
26308 } 27026 }
26309 }, 27027 },
26310 "strip-ansi": { 27028 "strip-ansi": {
26311 "version": "3.0.1", 27029 "version": "5.2.0",
26312 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 27030 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
26313 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 27031 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
26314 "dev": true, 27032 "dev": true,
26315 "requires": { 27033 "requires": {
26316 "ansi-regex": "^2.0.0" 27034 "ansi-regex": "^4.1.0"
26317 } 27035 }
26318 }, 27036 },
26319 "strip-bom": { 27037 "wrap-ansi": {
26320 "version": "2.0.0", 27038 "version": "5.1.0",
26321 "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 27039 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
26322 "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 27040 "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
26323 "dev": true, 27041 "dev": true,
26324 "requires": { 27042 "requires": {
26325 "is-utf8": "^0.2.0" 27043 "ansi-styles": "^3.2.0",
27044 "string-width": "^3.0.0",
27045 "strip-ansi": "^5.0.0"
26326 } 27046 }
26327 }, 27047 },
26328 "which-module": {
26329 "version": "1.0.0",
26330 "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
26331 "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
26332 "dev": true
26333 },
26334 "y18n": {
26335 "version": "3.2.1",
26336 "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
26337 "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
26338 "dev": true
26339 },
26340 "yargs": { 27048 "yargs": {
26341 "version": "7.1.0", 27049 "version": "13.3.2",
26342 "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", 27050 "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
26343 "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", 27051 "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
26344 "dev": true, 27052 "dev": true,
26345 "requires": { 27053 "requires": {
26346 "camelcase": "^3.0.0", 27054 "cliui": "^5.0.0",
26347 "cliui": "^3.2.0", 27055 "find-up": "^3.0.0",
26348 "decamelize": "^1.1.1", 27056 "get-caller-file": "^2.0.1",
26349 "get-caller-file": "^1.0.1",
26350 "os-locale": "^1.4.0",
26351 "read-pkg-up": "^1.0.1",
26352 "require-directory": "^2.1.1", 27057 "require-directory": "^2.1.1",
26353 "require-main-filename": "^1.0.1", 27058 "require-main-filename": "^2.0.0",
26354 "set-blocking": "^2.0.0", 27059 "set-blocking": "^2.0.0",
26355 "string-width": "^1.0.2", 27060 "string-width": "^3.0.0",
26356 "which-module": "^1.0.0", 27061 "which-module": "^2.0.0",
26357 "y18n": "^3.2.1", 27062 "y18n": "^4.0.0",
26358 "yargs-parser": "^5.0.0" 27063 "yargs-parser": "^13.1.2"
26359 } 27064 }
26360 }, 27065 },
26361 "yargs-parser": { 27066 "yargs-parser": {
26362 "version": "5.0.0", 27067 "version": "13.1.2",
26363 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", 27068 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
26364 "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", 27069 "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
26365 "dev": true, 27070 "dev": true,
26366 "requires": { 27071 "requires": {
26367 "camelcase": "^3.0.0" 27072 "camelcase": "^5.0.0",
27073 "decamelize": "^1.2.0"
26368 } 27074 }
26369 } 27075 }
26370 } 27076 }
@@ -26624,7 +27330,8 @@
26624 "setimmediate": { 27330 "setimmediate": {
26625 "version": "1.0.5", 27331 "version": "1.0.5",
26626 "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 27332 "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
26627 "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 27333 "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
27334 "dev": true
26628 }, 27335 },
26629 "setprototypeof": { 27336 "setprototypeof": {
26630 "version": "1.1.1", 27337 "version": "1.1.1",
@@ -26671,6 +27378,17 @@
26671 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 27378 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
26672 "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 27379 "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
26673 }, 27380 },
27381 "shelljs": {
27382 "version": "0.8.4",
27383 "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
27384 "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
27385 "dev": true,
27386 "requires": {
27387 "glob": "^7.0.0",
27388 "interpret": "^1.0.0",
27389 "rechoir": "^0.6.2"
27390 }
27391 },
26674 "shellwords": { 27392 "shellwords": {
26675 "version": "0.1.1", 27393 "version": "0.1.1",
26676 "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", 27394 "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
@@ -27122,9 +27840,10 @@
27122 } 27840 }
27123 }, 27841 },
27124 "source-map-support": { 27842 "source-map-support": {
27125 "version": "0.5.13", 27843 "version": "0.5.10",
27126 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", 27844 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
27127 "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", 27845 "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
27846 "dev": true,
27128 "requires": { 27847 "requires": {
27129 "buffer-from": "^1.0.0", 27848 "buffer-from": "^1.0.0",
27130 "source-map": "^0.6.0" 27849 "source-map": "^0.6.0"
@@ -27722,26 +28441,6 @@
27722 } 28441 }
27723 } 28442 }
27724 }, 28443 },
27725 "string.prototype.trimleft": {
27726 "version": "2.1.0",
27727 "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
27728 "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
27729 "dev": true,
27730 "requires": {
27731 "define-properties": "^1.1.3",
27732 "function-bind": "^1.1.1"
27733 }
27734 },
27735 "string.prototype.trimright": {
27736 "version": "2.1.0",
27737 "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
27738 "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
27739 "dev": true,
27740 "requires": {
27741 "define-properties": "^1.1.3",
27742 "function-bind": "^1.1.1"
27743 }
27744 },
27745 "string.prototype.trimstart": { 28444 "string.prototype.trimstart": {
27746 "version": "1.0.1", 28445 "version": "1.0.1",
27747 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 28446 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
@@ -27888,6 +28587,7 @@
27888 "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 28587 "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
27889 "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 28588 "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
27890 "dev": true, 28589 "dev": true,
28590 "optional": true,
27891 "requires": { 28591 "requires": {
27892 "escape-string-regexp": "^1.0.2" 28592 "escape-string-regexp": "^1.0.2"
27893 } 28593 }
@@ -27923,6 +28623,23 @@
27923 "dev": true, 28623 "dev": true,
27924 "requires": { 28624 "requires": {
27925 "debug": "^4.1.0" 28625 "debug": "^4.1.0"
28626 },
28627 "dependencies": {
28628 "debug": {
28629 "version": "4.2.0",
28630 "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
28631 "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
28632 "dev": true,
28633 "requires": {
28634 "ms": "2.1.2"
28635 }
28636 },
28637 "ms": {
28638 "version": "2.1.2",
28639 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
28640 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
28641 "dev": true
28642 }
27926 } 28643 }
27927 }, 28644 },
27928 "supports-color": { 28645 "supports-color": {
@@ -28026,6 +28743,17 @@
28026 } 28743 }
28027 } 28744 }
28028 }, 28745 },
28746 "js-yaml": {
28747 "version": "3.14.0",
28748 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
28749 "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
28750 "dev": true,
28751 "optional": true,
28752 "requires": {
28753 "argparse": "^1.0.7",
28754 "esprima": "^4.0.0"
28755 }
28756 },
28029 "mdn-data": { 28757 "mdn-data": {
28030 "version": "2.0.4", 28758 "version": "2.0.4",
28031 "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", 28759 "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -28329,6 +29057,17 @@
28329 "commander": "^2.20.0", 29057 "commander": "^2.20.0",
28330 "source-map": "~0.6.1", 29058 "source-map": "~0.6.1",
28331 "source-map-support": "~0.5.12" 29059 "source-map-support": "~0.5.12"
29060 },
29061 "dependencies": {
29062 "source-map-support": {
29063 "version": "0.5.19",
29064 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
29065 "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
29066 "requires": {
29067 "buffer-from": "^1.0.0",
29068 "source-map": "^0.6.0"
29069 }
29070 }
28332 } 29071 }
28333 }, 29072 },
28334 "terser-webpack-plugin": { 29073 "terser-webpack-plugin": {
@@ -28468,12 +29207,6 @@
28468 } 29207 }
28469 } 29208 }
28470 }, 29209 },
28471 "text-extensions": {
28472 "version": "2.0.0",
28473 "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.0.0.tgz",
28474 "integrity": "sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ==",
28475 "dev": true
28476 },
28477 "text-hex": { 29210 "text-hex": {
28478 "version": "1.0.0", 29211 "version": "1.0.0",
28479 "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 29212 "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
@@ -28832,6 +29565,7 @@
28832 "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 29565 "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
28833 "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 29566 "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
28834 "dev": true, 29567 "dev": true,
29568 "optional": true,
28835 "requires": { 29569 "requires": {
28836 "escape-string-regexp": "^1.0.2" 29570 "escape-string-regexp": "^1.0.2"
28837 } 29571 }
@@ -28909,6 +29643,16 @@
28909 "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 29643 "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
28910 "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", 29644 "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
28911 "dev": true 29645 "dev": true
29646 },
29647 "js-yaml": {
29648 "version": "3.14.0",
29649 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
29650 "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
29651 "dev": true,
29652 "requires": {
29653 "argparse": "^1.0.7",
29654 "esprima": "^4.0.0"
29655 }
28912 } 29656 }
28913 } 29657 }
28914 }, 29658 },
@@ -29064,9 +29808,9 @@
29064 } 29808 }
29065 }, 29809 },
29066 "type-fest": { 29810 "type-fest": {
29067 "version": "0.3.1", 29811 "version": "0.8.1",
29068 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", 29812 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
29069 "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", 29813 "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
29070 "dev": true 29814 "dev": true
29071 }, 29815 },
29072 "type-is": { 29816 "type-is": {
@@ -29119,11 +29863,6 @@
29119 "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", 29863 "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==",
29120 "dev": true 29864 "dev": true
29121 }, 29865 },
29122 "ua-parser-js": {
29123 "version": "0.7.20",
29124 "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz",
29125 "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
29126 },
29127 "uglify-js": { 29866 "uglify-js": {
29128 "version": "3.6.0", 29867 "version": "3.6.0",
29129 "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", 29868 "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
@@ -29188,6 +29927,11 @@
29188 "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 29927 "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
29189 "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" 29928 "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
29190 }, 29929 },
29930 "underscore": {
29931 "version": "1.11.0",
29932 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz",
29933 "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw=="
29934 },
29191 "undertaker": { 29935 "undertaker": {
29192 "version": "1.2.1", 29936 "version": "1.2.1",
29193 "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", 29937 "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
@@ -29407,12 +30151,11 @@
29407 }, 30151 },
29408 "dependencies": { 30152 "dependencies": {
29409 "ansi-styles": { 30153 "ansi-styles": {
29410 "version": "4.2.1", 30154 "version": "4.3.0",
29411 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 30155 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
29412 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 30156 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
29413 "dev": true, 30157 "dev": true,
29414 "requires": { 30158 "requires": {
29415 "@types/color-name": "^1.1.1",
29416 "color-convert": "^2.0.1" 30159 "color-convert": "^2.0.1"
29417 } 30160 }
29418 }, 30161 },
@@ -29557,11 +30300,6 @@
29557 "tmp": "0.0.x" 30300 "tmp": "0.0.x"
29558 } 30301 }
29559 }, 30302 },
29560 "utf8": {
29561 "version": "3.0.0",
29562 "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
29563 "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
29564 },
29565 "utf8-byte-length": { 30303 "utf8-byte-length": {
29566 "version": "1.0.4", 30304 "version": "1.0.4",
29567 "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", 30305 "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
@@ -29993,6 +30731,17 @@
29993 "wrap-ansi": "^5.1.0" 30731 "wrap-ansi": "^5.1.0"
29994 } 30732 }
29995 }, 30733 },
30734 "enhanced-resolve": {
30735 "version": "4.1.0",
30736 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
30737 "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
30738 "dev": true,
30739 "requires": {
30740 "graceful-fs": "^4.1.2",
30741 "memory-fs": "^0.4.0",
30742 "tapable": "^1.0.0"
30743 }
30744 },
29996 "get-caller-file": { 30745 "get-caller-file": {
29997 "version": "2.0.5", 30746 "version": "2.0.5",
29998 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 30747 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -30357,11 +31106,6 @@
30357 "iconv-lite": "0.4.24" 31106 "iconv-lite": "0.4.24"
30358 } 31107 }
30359 }, 31108 },
30360 "whatwg-fetch": {
30361 "version": "3.0.0",
30362 "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
30363 "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
30364 },
30365 "whatwg-mimetype": { 31109 "whatwg-mimetype": {
30366 "version": "2.3.0", 31110 "version": "2.3.0",
30367 "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", 31111 "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
diff --git a/package.json b/package.json
index d6a01c01e..13352c46f 100644
--- a/package.json
+++ b/package.json
@@ -66,7 +66,7 @@
66 "auto-launch": "5.0.5", 66 "auto-launch": "5.0.5",
67 "btoa": "1.2.1", 67 "btoa": "1.2.1",
68 "classnames": "2.2.6", 68 "classnames": "2.2.6",
69 "cld3-asm": "1.0.1", 69 "cld": "2.7.0",
70 "css": "2.2.4", 70 "css": "2.2.4",
71 "darkreader": "4.7.15", 71 "darkreader": "4.7.15",
72 "dbus-next": "0.8.2", 72 "dbus-next": "0.8.2",
@@ -79,7 +79,7 @@
79 "electron-process-manager": "git+https://git@github.com/dizer/electron-process-manager.git", 79 "electron-process-manager": "git+https://git@github.com/dizer/electron-process-manager.git",
80 "electron-process-reporter": "git+https://git@github.com/dizer/electron-process-reporter.git", 80 "electron-process-reporter": "git+https://git@github.com/dizer/electron-process-reporter.git",
81 "electron-react-titlebar": "0.8.2", 81 "electron-react-titlebar": "0.8.2",
82 "electron-updater": "4.2.5", 82 "electron-updater": "4.3.5",
83 "electron-util": "0.14.0", 83 "electron-util": "0.14.0",
84 "electron-window-state": "5.0.3", 84 "electron-window-state": "5.0.3",
85 "fs-extra": "7.0.1", 85 "fs-extra": "7.0.1",
@@ -149,6 +149,7 @@
149 "@types/fs-extra": "7.0.0", 149 "@types/fs-extra": "7.0.0",
150 "@types/jss": "^9.5.7", 150 "@types/jss": "^9.5.7",
151 "@types/lodash": "4.14.149", 151 "@types/lodash": "4.14.149",
152 "@types/node": "12.12.54",
152 "@types/react": "16.9.13", 153 "@types/react": "16.9.13",
153 "@types/react-dom": "16.9.4", 154 "@types/react-dom": "16.9.4",
154 "@types/react-jss": "^8.6.0", 155 "@types/react-jss": "^8.6.0",
@@ -161,9 +162,9 @@
161 "cross-env": "^5.0.5", 162 "cross-env": "^5.0.5",
162 "cz-conventional-changelog": "2.1.0", 163 "cz-conventional-changelog": "2.1.0",
163 "dotenv": "^4.0.0", 164 "dotenv": "^4.0.0",
164 "electron": "9.4.0", 165 "electron": "10.1.3",
165 "electron-builder": "22.8.1", 166 "electron-builder": "22.7.0",
166 "electron-notarize": "0.2.1", 167 "electron-notarize": "1.0.0",
167 "electron-rebuild": "1.11.0", 168 "electron-rebuild": "1.11.0",
168 "eslint": "5.10.0", 169 "eslint": "5.10.0",
169 "eslint-config-airbnb": "17.1.0", 170 "eslint-config-airbnb": "17.1.0",
@@ -188,7 +189,8 @@
188 "lerna": "3.19.0", 189 "lerna": "3.19.0",
189 "mobx-react-devtools": "6.1.1", 190 "mobx-react-devtools": "6.1.1",
190 "mocha": "5.2.0", 191 "mocha": "5.2.0",
191 "node-sass": "4.14.0", 192 "node-abi": "2.19.1",
193 "node-sass": "4.14.1",
192 "prettier": "1.19.1", 194 "prettier": "1.19.1",
193 "react-intl-translations-manager": "5.0.3", 195 "react-intl-translations-manager": "5.0.3",
194 "terser-webpack-plugin": "1.2.1", 196 "terser-webpack-plugin": "1.2.1",
diff --git a/packages/forms/package.json b/packages/forms/package.json
index 18b6d2244..f61b787ac 100644
--- a/packages/forms/package.json
+++ b/packages/forms/package.json
@@ -1,7 +1,7 @@
1{ 1{
2 "name": "@meetfranz/forms", 2 "name": "@meetfranz/forms",
3 "version": "1.1.0", 3 "version": "1.2.1",
4 "description": "React form components for Ferdi", 4 "description": "React form components for Franz",
5 "main": "lib/index.js", 5 "main": "lib/index.js",
6 "scripts": { 6 "scripts": {
7 "dev": "tsc -w", 7 "dev": "tsc -w",
@@ -35,5 +35,5 @@
35 "react-dom": "16.7.0", 35 "react-dom": "16.7.0",
36 "react-jss": "^8.6.1" 36 "react-jss": "^8.6.1"
37 }, 37 },
38 "gitHead": "e1e46986d902adc4c19ee009016290f9733a7d61" 38 "gitHead": "00db2bddccb8bb8ad7d29b8d032876c798b8bbf3"
39} 39}
diff --git a/packages/forms/src/index.ts b/packages/forms/src/index.ts
index ea47fe25e..45a9ed8e3 100644
--- a/packages/forms/src/index.ts
+++ b/packages/forms/src/index.ts
@@ -1,4 +1,5 @@
1export { Input } from './input'; 1export { Input } from './input';
2export { Textarea } from './textarea';
2export { Toggle } from './toggle'; 3export { Toggle } from './toggle';
3export { Button } from './button'; 4export { Button } from './button';
4export { Select } from './select'; 5export { Select } from './select';
diff --git a/packages/forms/src/textarea/index.tsx b/packages/forms/src/textarea/index.tsx
new file mode 100644
index 000000000..cd691a507
--- /dev/null
+++ b/packages/forms/src/textarea/index.tsx
@@ -0,0 +1,128 @@
1import { mdiEye, mdiEyeOff } from '@mdi/js';
2import Icon from '@mdi/react';
3import classnames from 'classnames';
4import React, { Component, createRef } from 'react';
5import injectSheet from 'react-jss';
6
7import { IFormField, IWithStyle } from '../typings/generic';
8
9import { Error } from '../error';
10import { Label } from '../label';
11import { Wrapper } from '../wrapper';
12
13import styles from './styles';
14
15interface IData {
16 [index: string]: string;
17}
18
19interface IProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>, IFormField, IWithStyle {
20 focus?: boolean;
21 data: IData;
22 textareaClassName?: string;
23}
24
25class TextareaComponent extends Component<IProps> {
26 static defaultProps = {
27 focus: false,
28 onChange: () => {},
29 onBlur: () => {},
30 onFocus: () => {},
31 showLabel: true,
32 disabled: false,
33 rows: 5,
34 };
35
36 private textareaRef = createRef<HTMLTextAreaElement>();
37
38 componentDidMount() {
39 const { data } = this.props;
40
41 if (this.textareaRef && this.textareaRef.current && data) {
42 Object.keys(data).map(key => this.textareaRef.current!.dataset[key] = data[key]);
43 }
44 }
45
46 onChange(e: React.ChangeEvent<HTMLTextAreaElement>) {
47 const {
48 onChange,
49 } = this.props;
50
51 if (onChange) {
52 onChange(e);
53 }
54 }
55
56 render() {
57 const {
58 classes,
59 className,
60 disabled,
61 error,
62 focus,
63 id,
64 textareaClassName,
65 label,
66 showLabel,
67 value,
68 name,
69 placeholder,
70 spellCheck,
71 onBlur,
72 onFocus,
73 minLength,
74 maxLength,
75 required,
76 rows,
77 noMargin,
78 } = this.props;
79
80 return (
81 <Wrapper
82 className={className}
83 identifier="franz-textarea"
84 noMargin={noMargin}
85 >
86 <Label
87 title={label}
88 showLabel={showLabel}
89 htmlFor={id}
90 className={classes.label}
91 isRequired={required}
92 >
93 <div
94 className={classnames({
95 [`${textareaClassName}`]: textareaClassName,
96 [`${classes.wrapper}`]: true,
97 [`${classes.disabled}`]: disabled,
98 [`${classes.hasError}`]: error,
99 })}>
100 <textarea
101 autoFocus={focus}
102 id={id}
103 name={name}
104 placeholder={placeholder}
105 spellCheck={spellCheck}
106 className={classes.textarea}
107 ref={this.textareaRef}
108 onChange={this.onChange.bind(this)}
109 onFocus={onFocus}
110 onBlur={onBlur}
111 disabled={disabled}
112 minLength={minLength}
113 maxLength={maxLength}
114 rows={rows}
115 >
116 {value}
117 </textarea>
118 </div>
119 </Label>
120 {error && (
121 <Error message={error} />
122 )}
123 </Wrapper>
124 );
125 }
126}
127
128export const Textarea = injectSheet(styles)(TextareaComponent);
diff --git a/packages/forms/src/textarea/styles.ts b/packages/forms/src/textarea/styles.ts
new file mode 100644
index 000000000..c1cbd76a5
--- /dev/null
+++ b/packages/forms/src/textarea/styles.ts
@@ -0,0 +1,53 @@
1import { Theme } from '@meetfranz/theme';
2import CSS from 'csstype';
3
4export default (theme: Theme) => ({
5 label: {
6 '& > div': {
7 marginTop: 5,
8 },
9 },
10 disabled: {
11 opacity: theme.inputDisabledOpacity,
12 },
13 formModifier: {
14 background: 'none',
15 border: 0,
16 borderLeft: theme.inputBorder,
17 padding: '4px 20px 0',
18 outline: 'none',
19
20 '&:active': {
21 opacity: 0.5,
22 },
23
24 '& svg': {
25 fill: theme.inputModifierColor,
26 },
27 },
28 textarea: {
29 background: 'none',
30 border: 0,
31 fontSize: theme.uiFontSize,
32 outline: 'none',
33 padding: 8,
34 width: '100%',
35 color: theme.inputColor,
36
37 '&::placeholder': {
38 color: theme.inputPlaceholderColor,
39 },
40 },
41 wrapper: {
42 background: theme.inputBackground,
43 border: theme.inputBorder,
44 borderRadius: theme.borderRadiusSmall,
45 boxSizing: 'border-box' as CSS.BoxSizingProperty,
46 display: 'flex',
47 order: 1,
48 width: '100%',
49 },
50 hasError: {
51 borderColor: theme.brandDanger,
52 },
53});
diff --git a/packages/ui/package-lock.json b/packages/ui/package-lock.json
index 8fa68a29b..64020c004 100644
--- a/packages/ui/package-lock.json
+++ b/packages/ui/package-lock.json
@@ -1,63 +1,20 @@
1{ 1{
2 "name": "@meetfranz/ui", 2 "name": "@meetfranz/ui",
3 "version": "0.0.0", 3 "version": "1.0.0",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
7 "@mdi/js": {
8 "version": "3.3.92",
9 "resolved": "https://registry.npmjs.org/@mdi/js/-/js-3.3.92.tgz",
10 "integrity": "sha512-l+12IwTycHlijWMiRWBAssm0RSgkQiwMthIy/EcBAdSqtnsHnFjHq+aI2MBZ8/AYX0QBxNUv4+EN0SXZgNkWDg=="
11 },
12 "@mdi/react": { 7 "@mdi/react": {
13 "version": "1.1.0", 8 "version": "1.1.0",
14 "resolved": "https://registry.npmjs.org/@mdi/react/-/react-1.1.0.tgz", 9 "resolved": "https://registry.npmjs.org/@mdi/react/-/react-1.1.0.tgz",
15 "integrity": "sha512-c0+avMYEZ6i7Pg1ULLFs+p7k8bDPiie9rrgGYs8VWQhw2tUUYz7r0lIPVzD3bzMghWfyhfkArj88K5Of0WTMNw==" 10 "integrity": "sha512-c0+avMYEZ6i7Pg1ULLFs+p7k8bDPiie9rrgGYs8VWQhw2tUUYz7r0lIPVzD3bzMghWfyhfkArj88K5Of0WTMNw=="
16 }, 11 },
17 "@meetfranz/theme": { 12 "@meetfranz/theme": {
18 "version": "file:../theme", 13 "version": "1.0.14",
14 "resolved": "https://registry.npmjs.org/@meetfranz/theme/-/theme-1.0.14.tgz",
15 "integrity": "sha512-iWP+3ifiNum98sHKiNdUJK+R0p4Z7TT8OenA1N2BnSC6CFob+dLhzAK+o5lxcyEcKZKYDwd7JKRZj93wqpBPpg==",
19 "requires": { 16 "requires": {
20 "color": "^3.1.0" 17 "color": "^3.1.0"
21 },
22 "dependencies": {
23 "color": {
24 "version": "3.1.0",
25 "bundled": true,
26 "requires": {
27 "color-convert": "^1.9.1",
28 "color-string": "^1.5.2"
29 }
30 },
31 "color-convert": {
32 "version": "1.9.3",
33 "bundled": true,
34 "requires": {
35 "color-name": "1.1.3"
36 }
37 },
38 "color-name": {
39 "version": "1.1.3",
40 "bundled": true
41 },
42 "color-string": {
43 "version": "1.5.3",
44 "bundled": true,
45 "requires": {
46 "color-name": "^1.0.0",
47 "simple-swizzle": "^0.2.2"
48 }
49 },
50 "is-arrayish": {
51 "version": "0.3.2",
52 "bundled": true
53 },
54 "simple-swizzle": {
55 "version": "0.2.2",
56 "bundled": true,
57 "requires": {
58 "is-arrayish": "^0.3.1"
59 }
60 }
61 } 18 }
62 }, 19 },
63 "asap": { 20 "asap": {
@@ -65,6 +22,37 @@
65 "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 22 "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
66 "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 23 "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
67 }, 24 },
25 "color": {
26 "version": "3.1.2",
27 "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
28 "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
29 "requires": {
30 "color-convert": "^1.9.1",
31 "color-string": "^1.5.2"
32 }
33 },
34 "color-convert": {
35 "version": "1.9.3",
36 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
37 "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
38 "requires": {
39 "color-name": "1.1.3"
40 }
41 },
42 "color-name": {
43 "version": "1.1.3",
44 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
45 "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
46 },
47 "color-string": {
48 "version": "1.5.3",
49 "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
50 "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
51 "requires": {
52 "color-name": "^1.0.0",
53 "simple-swizzle": "^0.2.2"
54 }
55 },
68 "core-js": { 56 "core-js": {
69 "version": "1.2.7", 57 "version": "1.2.7",
70 "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 58 "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
@@ -110,6 +98,11 @@
110 "safer-buffer": ">= 2.1.2 < 3" 98 "safer-buffer": ">= 2.1.2 < 3"
111 } 99 }
112 }, 100 },
101 "is-arrayish": {
102 "version": "0.3.2",
103 "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
104 "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
105 },
113 "is-stream": { 106 "is-stream": {
114 "version": "1.1.0", 107 "version": "1.1.0",
115 "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 108 "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -188,6 +181,14 @@
188 "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 181 "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
189 "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 182 "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
190 }, 183 },
184 "simple-swizzle": {
185 "version": "0.2.2",
186 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
187 "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
188 "requires": {
189 "is-arrayish": "^0.3.1"
190 }
191 },
191 "spin.js": { 192 "spin.js": {
192 "version": "2.3.2", 193 "version": "2.3.2",
193 "resolved": "https://registry.npmjs.org/spin.js/-/spin.js-2.3.2.tgz", 194 "resolved": "https://registry.npmjs.org/spin.js/-/spin.js-2.3.2.tgz",
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 214437093..fefe06f4c 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,7 +1,7 @@
1{ 1{
2 "name": "@meetfranz/ui", 2 "name": "@meetfranz/ui",
3 "version": "1.0.0", 3 "version": "1.1.0",
4 "description": "React UI components for Ferdi", 4 "description": "React UI components for Franz",
5 "main": "lib/index.js", 5 "main": "lib/index.js",
6 "scripts": { 6 "scripts": {
7 "dev": "tsc -w", 7 "dev": "tsc -w",
@@ -23,7 +23,6 @@
23 "author": "Stefan Malzner <stefan@adlk.io>", 23 "author": "Stefan Malzner <stefan@adlk.io>",
24 "license": "Apache-2.0", 24 "license": "Apache-2.0",
25 "dependencies": { 25 "dependencies": {
26 "@mdi/js": "^3.3.92",
27 "@mdi/react": "^1.1.0", 26 "@mdi/react": "^1.1.0",
28 "@meetfranz/theme": "^1.0.14", 27 "@meetfranz/theme": "^1.0.14",
29 "react-loader": "^2.4.5" 28 "react-loader": "^2.4.5"
@@ -34,5 +33,5 @@
34 "react-dom": "16.7.0", 33 "react-dom": "16.7.0",
35 "react-jss": "^8.6.1" 34 "react-jss": "^8.6.1"
36 }, 35 },
37 "gitHead": "e1e46986d902adc4c19ee009016290f9733a7d61" 36 "gitHead": "254da30f801169fac376bda1439b46cabbb491ad"
38} 37}
diff --git a/src/actions/service.js b/src/actions/service.js
index f0c42e8aa..578fdeca8 100644
--- a/src/actions/service.js
+++ b/src/actions/service.js
@@ -95,9 +95,14 @@ export default {
95 serviceId: PropTypes.string.isRequired, 95 serviceId: PropTypes.string.isRequired,
96 }, 96 },
97 openDevToolsForActiveService: {}, 97 openDevToolsForActiveService: {},
98 setHibernation: { 98 hibernate: {
99 serviceId: PropTypes.string.isRequired, 99 serviceId: PropTypes.string.isRequired,
100 hibernating: PropTypes.bool.isRequired, 100 },
101 awake: {
102 serviceId: PropTypes.string.isRequired,
103 },
104 resetLastPollTimer: {
105 serviceId: PropTypes.string,
101 }, 106 },
102 shareSettingsWithServiceProcess: {}, 107 shareSettingsWithServiceProcess: {},
103}; 108};
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
index 593cb9c4b..4f5a76c8a 100644
--- a/src/components/auth/Pricing.js
+++ b/src/components/auth/Pricing.js
@@ -67,6 +67,15 @@ const messages = defineMessages({
67}); 67});
68 68
69const styles = theme => ({ 69const styles = theme => ({
70 root: {
71 width: '500px !important',
72 textAlign: 'center',
73 padding: 20,
74 zIndex: 100,
75
76 '& h1': {
77 },
78 },
70 container: { 79 container: {
71 position: 'relative', 80 position: 'relative',
72 marginLeft: -150, 81 marginLeft: -150,
@@ -86,8 +95,8 @@ const styles = theme => ({
86 featureContainer: { 95 featureContainer: {
87 width: 300, 96 width: 300,
88 position: 'absolute', 97 position: 'absolute',
89 left: 'calc(100% / 2 + 225px)', 98 left: 'calc(100% / 2 + 250px)',
90 top: 155, 99 marginTop: 20,
91 background: theme.signup.pricing.feature.background, 100 background: theme.signup.pricing.feature.background,
92 height: 'auto', 101 height: 'auto',
93 padding: 20, 102 padding: 20,
@@ -174,8 +183,8 @@ export default @injectSheet(styles) @observer class Signup extends Component {
174 const [intPart, fractionPart] = (price).toString().split('.'); 183 const [intPart, fractionPart] = (price).toString().split('.');
175 184
176 return ( 185 return (
177 <div className={classnames('auth__scroll-container', classes.container)}> 186 <>
178 <div className={classnames('auth__container', 'auth__container--signup', classes.content)}> 187 <div className={classnames('auth__container', classes.root, classes.container)}>
179 <form className="franz-form auth__form"> 188 <form className="franz-form auth__form">
180 {isLoadingRequiredData ? <Loader /> : ( 189 {isLoadingRequiredData ? <Loader /> : (
181 <img 190 <img
@@ -212,7 +221,7 @@ export default @injectSheet(styles) @observer class Signup extends Component {
212 <p className={classnames(classes.price, classes.trialPrice)}> 221 <p className={classnames(classes.price, classes.trialPrice)}>
213 <span className={classes.figure}> 222 <span className={classes.figure}>
214 {currency} 223 {currency}
215 0 224 0
216 </span> 225 </span>
217 <sup>00</sup> 226 <sup>00</sup>
218 </p> 227 </p>
@@ -234,7 +243,7 @@ export default @injectSheet(styles) @observer class Signup extends Component {
234 </ul> 243 </ul>
235 </div> 244 </div>
236 {trialActivationError && ( 245 {trialActivationError && (
237 <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p> 246 <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p>
238 )} 247 )}
239 <Button 248 <Button
240 label={intl.formatMessage(!canSkipTrial ? messages.ctaStart : messages.ctaAccept)} 249 label={intl.formatMessage(!canSkipTrial ? messages.ctaStart : messages.ctaAccept)}
@@ -244,9 +253,9 @@ export default @injectSheet(styles) @observer class Signup extends Component {
244 disabled={isLoadingRequiredData || isActivatingTrial} 253 disabled={isLoadingRequiredData || isActivatingTrial}
245 /> 254 />
246 {canSkipTrial && ( 255 {canSkipTrial && (
247 <p className={classes.skipLink}> 256 <p className={classes.skipLink}>
248 <a href="#/">{intl.formatMessage(messages.ctaSkip)}</a> 257 <a href="#/">{intl.formatMessage(messages.ctaSkip)}</a>
249 </p> 258 </p>
250 )} 259 )}
251 </form> 260 </form>
252 </div> 261 </div>
@@ -256,7 +265,7 @@ export default @injectSheet(styles) @observer class Signup extends Component {
256 </H2> 265 </H2>
257 <FeatureList /> 266 <FeatureList />
258 </div> 267 </div>
259 </div> 268 </>
260 ); 269 );
261 } 270 }
262} 271}
diff --git a/src/components/auth/SetupAssistant.js b/src/components/auth/SetupAssistant.js
new file mode 100644
index 000000000..e03cf9101
--- /dev/null
+++ b/src/components/auth/SetupAssistant.js
@@ -0,0 +1,319 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7
8import { Input, Button } from '@meetfranz/forms';
9import { Badge } from '@meetfranz/ui';
10import Modal from '../ui/Modal';
11import Infobox from '../ui/Infobox';
12import Appear from '../ui/effects/Appear';
13
14import { CDN_URL } from '../../config';
15
16const SLACK_ID = 'slack';
17
18const messages = defineMessages({
19 headline: {
20 id: 'setupAssistant.headline',
21 defaultMessage: '!!!Let\'s get started',
22 },
23 subHeadline: {
24 id: 'setupAssistant.subheadline',
25 defaultMessage: '!!!Choose from our most used services and get back on top of your messaging now.',
26 },
27 submitButtonLabel: {
28 id: 'setupAssistant.submit.label',
29 defaultMessage: '!!!Let\'s go',
30 },
31 inviteSuccessInfo: {
32 id: 'invite.successInfo',
33 defaultMessage: '!!!Invitations sent successfully',
34 },
35});
36
37const styles = theme => ({
38 root: {
39 width: '500px !important',
40 textAlign: 'center',
41 padding: 20,
42
43 '& h1': {
44 },
45 },
46 servicesGrid: {
47 display: 'flex',
48 flexWrap: 'wrap',
49 justifyContent: 'space-between',
50 },
51 serviceContainer: {
52 background: theme.colorBackground,
53 position: 'relative',
54 width: '32%',
55 display: 'flex',
56 alignItems: 'center',
57 flexDirection: 'column',
58 justifyContent: 'center',
59 padding: 20,
60 borderRadius: theme.borderRadius,
61 marginBottom: 10,
62 opacity: 0.5,
63 transition: 'all 0.25s',
64 border: [3, 'solid', 'transparent'],
65
66 '& h2': {
67 margin: [10, 0, 0],
68 color: theme.colorText,
69 },
70
71 '&:hover': {
72 border: [3, 'solid', theme.brandPrimary],
73 '& $serviceIcon': {
74 },
75 },
76
77 },
78 selected: {
79 border: [3, 'solid', theme.brandPrimary],
80 background: `${theme.brandPrimary}47`,
81 opacity: 1,
82 },
83 serviceIcon: {
84 width: 50,
85 transition: 'all 0.25s',
86 },
87
88 slackModalContent: {
89 textAlign: 'center',
90
91 '& img': {
92 width: 50,
93 marginBottom: 20,
94 },
95 },
96 modalActionContainer: {
97 display: 'flex',
98 flexDirection: 'column',
99 justifyContent: 'center',
100 alignItems: 'center',
101 },
102 ctaCancel: {
103 background: 'none !important',
104 },
105 slackBadge: {
106 position: 'absolute',
107 bottom: 4,
108 height: 'auto',
109 padding: '0px 4px',
110 borderRadius: theme.borderRadiusSmall,
111 margin: 0,
112 display: 'flex',
113 overflow: 'hidden',
114 },
115 clearSlackWorkspace: {
116 background: theme.inputPrefixColor,
117 marginLeft: 5,
118 height: '100%',
119 color: theme.colorText,
120 display: 'inline-flex',
121 justifyContent: 'center',
122 alignItems: 'center',
123 marginRight: -4,
124 padding: [0, 5],
125 },
126});
127
128@injectSheet(styles) @observer
129class SetupAssistant extends Component {
130 static propTypes = {
131 classes: PropTypes.object.isRequired,
132 onSubmit: PropTypes.func.isRequired,
133 isInviteSuccessful: PropTypes.bool,
134 services: PropTypes.object.isRequired,
135 isSettingUpServices: PropTypes.bool.isRequired,
136 };
137
138 static defaultProps = {
139 isInviteSuccessful: false,
140 };
141
142 static contextTypes = {
143 intl: intlShape,
144 };
145
146 state = {
147 services: [{
148 id: 'whatsapp',
149 }, {
150 id: 'messenger',
151 }, {
152 id: 'gmail',
153 }],
154 isSlackModalOpen: false,
155 slackWorkspace: '',
156 };
157
158 slackWorkspaceHandler() {
159 const { slackWorkspace = '', services } = this.state;
160
161 const sanitizedWorkspace = slackWorkspace.trim().replace(/^https?:\/\//, '');
162
163 if (sanitizedWorkspace) {
164 const index = services.findIndex(s => s.id === SLACK_ID);
165
166 if (index === -1) {
167 const newServices = services;
168 newServices.push({ id: SLACK_ID, team: sanitizedWorkspace });
169 this.setState({ services: newServices });
170 }
171 }
172
173 this.setState({
174 isSlackModalOpen: false,
175 slackWorkspace: sanitizedWorkspace,
176 });
177 }
178
179 render() {
180 const { intl } = this.context;
181 const {
182 classes, isInviteSuccessful, onSubmit, services, isSettingUpServices,
183 } = this.props;
184 const { isSlackModalOpen, slackWorkspace, services: addedServices } = this.state;
185
186 return (
187 <div className={`auth__container ${classes.root}`}>
188 {this.state.showSuccessInfo && isInviteSuccessful && (
189 <Appear>
190 <Infobox
191 type="success"
192 icon="checkbox-marked-circle-outline"
193 dismissable
194 >
195 {intl.formatMessage(messages.inviteSuccessInfo)}
196 </Infobox>
197 </Appear>
198 )}
199
200 <img
201 src="./assets/images/logo.svg"
202 className="auth__logo"
203 alt=""
204 />
205 <h1>
206 {intl.formatMessage(messages.headline)}
207 </h1>
208 <h2>
209 {intl.formatMessage(messages.subHeadline)}
210 </h2>
211 <div className={classnames('grid', classes.servicesGrid)}>
212 {Object.keys(services).map((id) => {
213 const service = services[id];
214 return (
215 <button
216 className={classnames({
217 [classes.serviceContainer]: true,
218 [classes.selected]: this.state.services.findIndex(s => s.id === id) !== -1,
219 })}
220 key={id}
221 onClick={() => {
222 const index = this.state.services.findIndex(s => s.id === id);
223 if (index === -1) {
224 if (id === SLACK_ID) {
225 this.setState({ isSlackModalOpen: true });
226 } else {
227 addedServices.push({ id });
228 }
229 } else {
230 addedServices.splice(index, 1);
231 if (id === SLACK_ID) {
232 this.setState({
233 slackWorkspace: '',
234 });
235 }
236 }
237
238 this.setState({ services: addedServices });
239 }}
240 type="button"
241 >
242 <img
243 src={`${CDN_URL}/recipes/dist/${id}/src/icon.svg`}
244 className={classes.serviceIcon}
245 alt=""
246 />
247 <h2>
248 {service.name}
249 </h2>
250 {id === SLACK_ID && slackWorkspace && (
251 <Badge type="secondary" className={classes.slackBadge}>
252 {slackWorkspace}
253 <button
254 type="button"
255 className={classes.clearSlackWorkspace}
256 onClick={() => {
257 this.setState({
258 slackWorkspace: '',
259 });
260 }}
261 >
262 x
263 </button>
264 </Badge>
265 )}
266 </button>
267 );
268 })}
269 </div>
270 <Modal
271 isOpen={isSlackModalOpen}
272 // isBlocking={false}
273 close={() => this.setState({ isSlackModalOpen: false })}
274 >
275 <div className={classes.slackModalContent}>
276 <img src={`${CDN_URL}/recipes/dist/slack/src/icon.svg`} alt="" />
277 <h1>Create your first Slack workspace</h1>
278 <form onSubmit={(e) => {
279 e.preventDefault();
280 this.slackWorkspaceHandler();
281 }}
282 >
283 <Input
284 suffix=".slack.com"
285 placeholder="workspace-url"
286 onChange={e => this.setState({ slackWorkspace: e.target.value })}
287 value={slackWorkspace}
288 />
289 <div className={classes.modalActionContainer}>
290 <Button
291 type="submit"
292 label="Save"
293 />
294 <Button
295 type="link"
296 buttonType="secondary"
297 label="Cancel"
298 className={classes.ctaCancel}
299 onClick={() => this.setState({ slackWorkspace: '' })}
300 />
301 </div>
302 </form>
303 </div>
304 </Modal>
305 <Button
306 type="button"
307 className="auth__button"
308 // disabled={!atLeastOneEmailAddress}
309 label={intl.formatMessage(messages.submitButtonLabel)}
310 onClick={() => onSubmit(this.state.services)}
311 busy={isSettingUpServices}
312 disabled={isSettingUpServices || addedServices.length === 0}
313 />
314 </div>
315 );
316 }
317}
318
319export default SetupAssistant;
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index 90bbe86e9..a47e74db0 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -60,6 +60,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
60 isAppMuted: PropTypes.bool.isRequired, 60 isAppMuted: PropTypes.bool.isRequired,
61 isWorkspaceDrawerOpen: PropTypes.bool.isRequired, 61 isWorkspaceDrawerOpen: PropTypes.bool.isRequired,
62 toggleWorkspaceDrawer: PropTypes.func.isRequired, 62 toggleWorkspaceDrawer: PropTypes.func.isRequired,
63 isTodosServiceActive: PropTypes.bool.isRequired,
63 }; 64 };
64 65
65 static contextTypes = { 66 static contextTypes = {
@@ -96,6 +97,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
96 toggleWorkspaceDrawer, 97 toggleWorkspaceDrawer,
97 stores, 98 stores,
98 actions, 99 actions,
100 isTodosServiceActive,
99 } = this.props; 101 } = this.props;
100 const { intl } = this.context; 102 const { intl } = this.context;
101 const todosToggleMessage = ( 103 const todosToggleMessage = (
@@ -140,6 +142,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
140 todoActions.toggleTodosPanel(); 142 todoActions.toggleTodosPanel();
141 this.updateToolTip(); 143 this.updateToolTip();
142 }} 144 }}
145 disblaed={isTodosServiceActive}
143 className={`sidebar__button sidebar__button--todos ${todosStore.isTodosPanelVisible ? 'is-active' : ''}`} 146 className={`sidebar__button sidebar__button--todos ${todosStore.isTodosPanelVisible ? 'is-active' : ''}`}
144 data-tip={`${intl.formatMessage(todosToggleMessage)} (${ctrlKey}+T)`} 147 data-tip={`${intl.formatMessage(todosToggleMessage)} (${ctrlKey}+T)`}
145 > 148 >
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index d91016c71..444d5fea4 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -1,6 +1,6 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component, Fragment } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { autorun, reaction } from 'mobx'; 3import { autorun } from 'mobx';
4import { observer, inject } from 'mobx-react'; 4import { observer, inject } from 'mobx-react';
5import classnames from 'classnames'; 5import classnames from 'classnames';
6 6
@@ -27,11 +27,7 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
27 stores: PropTypes.shape({ 27 stores: PropTypes.shape({
28 settings: PropTypes.instanceOf(SettingsStore).isRequired, 28 settings: PropTypes.instanceOf(SettingsStore).isRequired,
29 }).isRequired, 29 }).isRequired,
30 actions: PropTypes.shape({ 30 isSpellcheckerEnabled: PropTypes.bool.isRequired,
31 service: PropTypes.shape({
32 setHibernation: PropTypes.func.isRequired,
33 }).isRequired,
34 }).isRequired,
35 }; 31 };
36 32
37 static defaultProps = { 33 static defaultProps = {
@@ -50,12 +46,6 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
50 46
51 forceRepaintTimeout = null; 47 forceRepaintTimeout = null;
52 48
53 constructor(props) {
54 super(props);
55
56 this.startHibernationTimer = this.startHibernationTimer.bind(this);
57 }
58
59 componentDidMount() { 49 componentDidMount() {
60 this.autorunDisposer = autorun(() => { 50 this.autorunDisposer = autorun(() => {
61 if (this.props.service.isActive) { 51 if (this.props.service.isActive) {
@@ -65,32 +55,6 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
65 }, 100); 55 }, 100);
66 } 56 }
67 }); 57 });
68
69 reaction(
70 () => this.props.service.isActive,
71 () => {
72 if (!this.props.service.isActive && this.props.stores.settings.all.app.hibernate) {
73 // Service is inactive - start hibernation countdown
74 this.startHibernationTimer();
75 } else {
76 if (this.hibernationTimer) {
77 // Service is active but we have an active hibernation timer: Clear timeout
78 clearTimeout(this.hibernationTimer);
79 }
80
81 // Service is active, wake up service from hibernation
82 this.props.actions.service.setHibernation({
83 serviceId: this.props.service.id,
84 hibernating: false,
85 });
86 }
87 },
88 );
89
90 // Start hibernation counter if we are in background
91 if (!this.props.service.isActive && this.props.stores.settings.all.app.hibernate) {
92 this.startHibernationTimer();
93 }
94 } 58 }
95 59
96 componentWillUnmount() { 60 componentWillUnmount() {
@@ -110,19 +74,6 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
110 }); 74 });
111 }; 75 };
112 76
113 startHibernationTimer() {
114 const timerDuration = (Number(this.props.stores.settings.all.app.hibernationStrategy) || 300) * 1000;
115
116 const hibernationTimer = setTimeout(() => {
117 this.props.actions.service.setHibernation({
118 serviceId: this.props.service.id,
119 hibernating: true,
120 });
121 }, timerDuration);
122
123 this.hibernationTimer = hibernationTimer;
124 }
125
126 render() { 77 render() {
127 const { 78 const {
128 detachService, 79 detachService,
@@ -132,6 +83,7 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
132 edit, 83 edit,
133 enable, 84 enable,
134 stores, 85 stores,
86 isSpellcheckerEnabled,
135 } = this.props; 87 } = this.props;
136 88
137 const { 89 const {
@@ -193,22 +145,19 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
193 </Fragment> 145 </Fragment>
194 ) : ( 146 ) : (
195 <> 147 <>
196 {(!service.isHibernating || service.disableHibernation) ? ( 148 {(!service.isHibernating || service.isHibernationEnabled) ? (
197 <> 149 <>
198 {showNavBar && ( 150 {showNavBar && (
199 <WebControlsScreen service={service} /> 151 <WebControlsScreen service={service} />
200 )} 152 )}
201 <ServiceWebview 153 {!service.isHibernating && (
202 service={service} 154 <ServiceWebview
203 setWebviewReference={setWebviewReference} 155 service={service}
204 detachService={detachService} 156 setWebviewReference={setWebviewReference}
205 /> 157 detachService={detachService}
206 {/* {service.lostRecipeConnection && ( 158 isSpellcheckerEnabled={isSpellcheckerEnabled}
207 <ConnectionLostBanner
208 name={service.name}
209 reload={reload}
210 /> 159 />
211 )} */} 160 )}
212 </> 161 </>
213 ) : ( 162 ) : (
214 <div> 163 <div>
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index 2e3354279..4edbde5e2 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -15,6 +15,7 @@ class ServiceWebview extends Component {
15 service: PropTypes.instanceOf(ServiceModel).isRequired, 15 service: PropTypes.instanceOf(ServiceModel).isRequired,
16 setWebviewReference: PropTypes.func.isRequired, 16 setWebviewReference: PropTypes.func.isRequired,
17 detachService: PropTypes.func.isRequired, 17 detachService: PropTypes.func.isRequired,
18 isSpellcheckerEnabled: PropTypes.bool.isRequired,
18 }; 19 };
19 20
20 @observable webview = null; 21 @observable webview = null;
@@ -55,6 +56,7 @@ class ServiceWebview extends Component {
55 const { 56 const {
56 service, 57 service,
57 setWebviewReference, 58 setWebviewReference,
59 isSpellcheckerEnabled,
58 } = this.props; 60 } = this.props;
59 61
60 const preloadScript = path.join(__dirname, '../../../', 'webview', 'recipe.js'); 62 const preloadScript = path.join(__dirname, '../../../', 'webview', 'recipe.js');
@@ -70,7 +72,7 @@ class ServiceWebview extends Component {
70 autosize 72 autosize
71 src={service.url} 73 src={service.url}
72 preload={preloadScript} 74 preload={preloadScript}
73 partition={`persist:service-${service.id}`} 75 partition={service.partition}
74 onDidAttach={() => { 76 onDidAttach={() => {
75 setWebviewReference({ 77 setWebviewReference({
76 serviceId: service.id, 78 serviceId: service.id,
@@ -81,6 +83,7 @@ class ServiceWebview extends Component {
81 useragent={service.userAgent} 83 useragent={service.userAgent}
82 disablewebsecurity={service.recipe.disablewebsecurity ? true : undefined} 84 disablewebsecurity={service.recipe.disablewebsecurity ? true : undefined}
83 allowpopups 85 allowpopups
86 webpreferences={`spellcheck=${isSpellcheckerEnabled ? 1 : 0}`}
84 /> 87 />
85 ); 88 );
86 } 89 }
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index da2ee0b9e..f679eeed0 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -10,6 +10,7 @@ import injectSheet from 'react-jss';
10import ServiceView from './ServiceView'; 10import ServiceView from './ServiceView';
11import Appear from '../../ui/effects/Appear'; 11import Appear from '../../ui/effects/Appear';
12import serverlessLogin from '../../../helpers/serverless-helpers'; 12import serverlessLogin from '../../../helpers/serverless-helpers';
13import { TODOS_RECIPE_ID } from '../../../features/todos';
13 14
14const messages = defineMessages({ 15const messages = defineMessages({
15 welcome: { 16 welcome: {
@@ -58,6 +59,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
58 hasActivatedTrial: PropTypes.bool.isRequired, 59 hasActivatedTrial: PropTypes.bool.isRequired,
59 classes: PropTypes.object.isRequired, 60 classes: PropTypes.object.isRequired,
60 actions: PropTypes.object.isRequired, 61 actions: PropTypes.object.isRequired,
62 isSpellcheckerEnabled: PropTypes.bool.isRequired,
61 }; 63 };
62 64
63 static defaultProps = { 65 static defaultProps = {
@@ -111,6 +113,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
111 userHasCompletedSignup, 113 userHasCompletedSignup,
112 hasActivatedTrial, 114 hasActivatedTrial,
113 classes, 115 classes,
116 isSpellcheckerEnabled,
114 } = this.props; 117 } = this.props;
115 118
116 const { 119 const {
@@ -168,7 +171,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
168 </div> 171 </div>
169 </Appear> 172 </Appear>
170 )} 173 )}
171 {services.map(service => ( 174 {services.filter(service => service.recipe.id !== TODOS_RECIPE_ID).map(service => (
172 <ServiceView 175 <ServiceView
173 key={service.id} 176 key={service.id}
174 service={service} 177 service={service}
@@ -186,6 +189,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
186 redirect: false, 189 redirect: false,
187 })} 190 })}
188 upgrade={() => openSettings({ path: 'user' })} 191 upgrade={() => openSettings({ path: 'user' })}
192 isSpellcheckerEnabled={isSpellcheckerEnabled}
189 /> 193 />
190 ))} 194 ))}
191 </div> 195 </div>
diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js
index efa5fa60c..479f151a6 100644
--- a/src/components/services/tabs/TabItem.js
+++ b/src/components/services/tabs/TabItem.js
@@ -5,9 +5,14 @@ import PropTypes from 'prop-types';
5import { observer } from 'mobx-react'; 5import { observer } from 'mobx-react';
6import classnames from 'classnames'; 6import classnames from 'classnames';
7import { SortableElement } from 'react-sortable-hoc'; 7import { SortableElement } from 'react-sortable-hoc';
8import injectSheet from 'react-jss';
9import ms from 'ms';
8 10
11import { observable, autorun } from 'mobx';
9import ServiceModel from '../../../models/Service'; 12import ServiceModel from '../../../models/Service';
10import { ctrlKey } from '../../../environment'; 13import { ctrlKey, cmdKey } from '../../../environment';
14
15const IS_SERVICE_DEBUGGING_ENABLED = (localStorage.getItem('debug') || '').includes('Franz:Service');
11 16
12const { Menu } = remote; 17const { Menu } = remote;
13 18
@@ -50,9 +55,38 @@ const messages = defineMessages({
50 }, 55 },
51}); 56});
52 57
53@observer 58const styles = {
54class TabItem extends Component { 59 pollIndicator: {
60 position: 'absolute',
61 bottom: 2,
62 width: 10,
63 height: 10,
64 borderRadius: 5,
65 background: 'gray',
66 transition: 'background 0.5s',
67 },
68 pollIndicatorPoll: {
69 left: 2,
70 },
71 pollIndicatorAnswer: {
72 left: 14,
73 },
74 polled: {
75 background: 'yellow !important',
76 transition: 'background 0.1s',
77 },
78 pollAnswered: {
79 background: 'green !important',
80 transition: 'background 0.1s',
81 },
82 stale: {
83 background: 'red !important',
84 },
85};
86
87@injectSheet(styles) @observer class TabItem extends Component {
55 static propTypes = { 88 static propTypes = {
89 classes: PropTypes.object.isRequired,
56 service: PropTypes.instanceOf(ServiceModel).isRequired, 90 service: PropTypes.instanceOf(ServiceModel).isRequired,
57 clickHandler: PropTypes.func.isRequired, 91 clickHandler: PropTypes.func.isRequired,
58 shortcutIndex: PropTypes.number.isRequired, 92 shortcutIndex: PropTypes.number.isRequired,
@@ -71,8 +105,33 @@ class TabItem extends Component {
71 intl: intlShape, 105 intl: intlShape,
72 }; 106 };
73 107
108 @observable isPolled = false;
109
110 @observable isPollAnswered = false;
111
112 componentDidMount() {
113 const { service } = this.props;
114
115 if (IS_SERVICE_DEBUGGING_ENABLED) {
116 autorun(() => {
117 if (Date.now() - service.lastPoll < ms('0.2s')) {
118 this.isPolled = true;
119
120 setTimeout(() => { this.isPolled = false; }, ms('1s'));
121 }
122
123 if (Date.now() - service.lastPollAnswer < ms('0.2s')) {
124 this.isPollAnswered = true;
125
126 setTimeout(() => { this.isPollAnswered = false; }, ms('1s'));
127 }
128 });
129 }
130 }
131
74 render() { 132 render() {
75 const { 133 const {
134 classes,
76 service, 135 service,
77 clickHandler, 136 clickHandler,
78 shortcutIndex, 137 shortcutIndex,
@@ -97,6 +156,7 @@ class TabItem extends Component {
97 }, { 156 }, {
98 label: intl.formatMessage(messages.reload), 157 label: intl.formatMessage(messages.reload),
99 click: reload, 158 click: reload,
159 accelerator: `${cmdKey}+R`,
100 }, { 160 }, {
101 label: intl.formatMessage(messages.edit), 161 label: intl.formatMessage(messages.edit),
102 click: () => openSettings({ 162 click: () => openSettings({
@@ -141,7 +201,7 @@ class TabItem extends Component {
141 201
142 </span> 202 </span>
143 )} 203 )}
144 {service.isHibernating && !service.disableHibernation && ( 204 {service.isHibernating && !service.isHibernationEnabled && (
145 <span className="tab-item__message-count hibernating"> 205 <span className="tab-item__message-count hibernating">
146 206
147 </span> 207 </span>
@@ -153,6 +213,7 @@ class TabItem extends Component {
153 return ( 213 return (
154 <li 214 <li
155 className={classnames({ 215 className={classnames({
216 [classes.stale]: IS_SERVICE_DEBUGGING_ENABLED && service.lostRecipeConnection,
156 'tab-item': true, 217 'tab-item': true,
157 'is-active': service.isActive, 218 'is-active': service.isActive,
158 'has-custom-icon': service.hasCustomIcon, 219 'has-custom-icon': service.hasCustomIcon,
@@ -168,6 +229,24 @@ class TabItem extends Component {
168 alt="" 229 alt=""
169 /> 230 />
170 {notificationBadge} 231 {notificationBadge}
232 {IS_SERVICE_DEBUGGING_ENABLED && (
233 <>
234 <div
235 className={classnames({
236 [classes.pollIndicator]: true,
237 [classes.pollIndicatorPoll]: true,
238 [classes.polled]: this.isPolled,
239 })}
240 />
241 <div
242 className={classnames({
243 [classes.pollIndicator]: true,
244 [classes.pollIndicatorAnswer]: true,
245 [classes.pollAnswered]: this.isPollAnswered,
246 })}
247 />
248 </>
249 )}
171 </li> 250 </li>
172 ); 251 );
173 } 252 }
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index f1e70ce59..80f60b3e1 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -20,7 +20,6 @@ import Select from '../../ui/Select';
20import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; 20import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
21import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox'; 21import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
22import { serviceLimitStore } from '../../../features/serviceLimit'; 22import { serviceLimitStore } from '../../../features/serviceLimit';
23
24import { isMac } from '../../../environment'; 23import { isMac } from '../../../environment';
25 24
26const messages = defineMessages({ 25const messages = defineMessages({
@@ -96,9 +95,9 @@ const messages = defineMessages({
96 id: 'settings.service.form.isMutedInfo', 95 id: 'settings.service.form.isMutedInfo',
97 defaultMessage: '!!!When disabled, all notification sounds and audio playback are muted', 96 defaultMessage: '!!!When disabled, all notification sounds and audio playback are muted',
98 }, 97 },
99 disableHibernationInfo: { 98 isHibernationEnabledInfo: {
100 id: 'settings.service.form.disableHibernationInfo', 99 id: 'settings.service.form.isHibernatedEnabledInfo',
101 defaultMessage: '!!!You currently have hibernation enabled but you can disable hibernation for individual services using this option.', 100 defaultMessage: '!!!When enabled, a service will be shut down after a period of time to save system resources.',
102 }, 101 },
103 headlineNotifications: { 102 headlineNotifications: {
104 id: 'settings.service.form.headlineNotifications', 103 id: 'settings.service.form.headlineNotifications',
@@ -375,9 +374,9 @@ export default @observer class EditServiceForm extends Component {
375 <Toggle field={form.$('isEnabled')} /> 374 <Toggle field={form.$('isEnabled')} />
376 {isHibernationFeatureActive && ( 375 {isHibernationFeatureActive && (
377 <> 376 <>
378 <Toggle field={form.$('disableHibernation')} /> 377 <Toggle field={form.$('isHibernationEnabled')} />
379 <p className="settings__help"> 378 <p className="settings__help">
380 {intl.formatMessage(messages.disableHibernationInfo)} 379 {intl.formatMessage(messages.isHibernationEnabledInfo)}
381 </p> 380 </p>
382 </> 381 </>
383 )} 382 )}
@@ -409,7 +408,7 @@ export default @observer class EditServiceForm extends Component {
409 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 408 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }}
410 > 409 >
411 <div className="settings__settings-group"> 410 <div className="settings__settings-group">
412 <Select field={form.$('spellcheckerLanguage')} multiple /> 411 <Select field={form.$('spellcheckerLanguage')} />
413 </div> 412 </div>
414 </PremiumFeatureContainer> 413 </PremiumFeatureContainer>
415 )} 414 )}
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index cd772214f..f20c38bc9 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -173,6 +173,8 @@ export default @observer class EditSettingsForm extends Component {
173 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired, 173 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired,
174 isNightlyEnabled: PropTypes.bool.isRequired, 174 isNightlyEnabled: PropTypes.bool.isRequired,
175 openProcessManager: PropTypes.func.isRequired, 175 openProcessManager: PropTypes.func.isRequired,
176 hasAddedTodosAsService: PropTypes.bool.isRequired,
177 isOnline: PropTypes.bool.isRequired,
176 }; 178 };
177 179
178 static contextTypes = { 180 static contextTypes = {
@@ -227,6 +229,8 @@ export default @observer class EditSettingsForm extends Component {
227 openProcessManager, 229 openProcessManager,
228 isTodosActivated, 230 isTodosActivated,
229 isNightlyEnabled, 231 isNightlyEnabled,
232 hasAddedTodosAsService,
233 isOnline,
230 } = this.props; 234 } = this.props;
231 const { intl } = this.context; 235 const { intl } = this.context;
232 236
@@ -346,7 +350,7 @@ export default @observer class EditSettingsForm extends Component {
346 350
347 <Hr /> 351 <Hr />
348 352
349 {isTodosEnabled && ( 353 {isTodosEnabled && !hasAddedTodosAsService && (
350 <> 354 <>
351 <Toggle field={form.$('enableTodos')} /> 355 <Toggle field={form.$('enableTodos')} />
352 {isTodosActivated && ( 356 {isTodosActivated && (
@@ -535,10 +539,10 @@ export default @observer class EditSettingsForm extends Component {
535 <Toggle 539 <Toggle
536 field={form.$('enableSpellchecking')} 540 field={form.$('enableSpellchecking')}
537 /> 541 />
538 {form.$('enableSpellchecking').value && !isMac && ( 542 {!isMac && form.$('enableSpellchecking').value && (
539 <Select field={form.$('spellcheckerLanguage')} multiple /> 543 <Select field={form.$('spellcheckerLanguage')} />
540 )} 544 )}
541 {form.$('enableSpellchecking').value && isMac && ( 545 {isMac && form.$('enableSpellchecking').value && (
542 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p> 546 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p>
543 )} 547 )}
544 </Fragment> 548 </Fragment>
@@ -625,7 +629,7 @@ export default @observer class EditSettingsForm extends Component {
625 buttonType="secondary" 629 buttonType="secondary"
626 label={intl.formatMessage(updateButtonLabelMessage)} 630 label={intl.formatMessage(updateButtonLabelMessage)}
627 onClick={checkForUpdates} 631 onClick={checkForUpdates}
628 disabled={!automaticUpdates || isCheckingForUpdates || isUpdateAvailable} 632 disabled={!automaticUpdates || isCheckingForUpdates || isUpdateAvailable || !isOnline}
629 loaded={!isCheckingForUpdates || !isUpdateAvailable} 633 loaded={!isCheckingForUpdates || !isUpdateAvailable}
630 /> 634 />
631 )} 635 )}
diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js
index dbc2a9078..72c799819 100644
--- a/src/components/ui/FeatureList.js
+++ b/src/components/ui/FeatureList.js
@@ -76,7 +76,7 @@ export class FeatureList extends Component {
76 static propTypes = { 76 static propTypes = {
77 className: PropTypes.string, 77 className: PropTypes.string,
78 featureClassName: PropTypes.string, 78 featureClassName: PropTypes.string,
79 plan: PropTypes.oneOf(Object.values(PLANS)), 79 plan: PropTypes.oneOf(Object.keys(PLANS)),
80 }; 80 };
81 81
82 static defaultProps = { 82 static defaultProps = {
diff --git a/src/components/ui/Modal/index.js b/src/components/ui/Modal/index.js
index 0af521452..a9fa0cd1b 100644
--- a/src/components/ui/Modal/index.js
+++ b/src/components/ui/Modal/index.js
@@ -41,8 +41,6 @@ export default @injectCSS(styles) class Modal extends Component {
41 showClose, 41 showClose,
42 } = this.props; 42 } = this.props;
43 43
44 const appRoot = document.getElementById('root');
45
46 return ( 44 return (
47 <ReactModal 45 <ReactModal
48 isOpen={isOpen} 46 isOpen={isOpen}
@@ -55,7 +53,7 @@ export default @injectCSS(styles) class Modal extends Component {
55 portal={portal} 53 portal={portal}
56 onRequestClose={close} 54 onRequestClose={close}
57 shouldCloseOnOverlayClick={shouldCloseOnOverlayClick} 55 shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
58 appElement={appRoot} 56 appElement={document.getElementById('root')}
59 > 57 >
60 {showClose && close && ( 58 {showClose && close && (
61 <button 59 <button
diff --git a/src/config.js b/src/config.js
index eb6f08be9..03d201425 100644
--- a/src/config.js
+++ b/src/config.js
@@ -31,6 +31,8 @@ export const LOCAL_TODOS_FRONTEND_URL = 'http://localhost:4000';
31export const PRODUCTION_TODOS_FRONTEND_URL = 'https://app.franztodos.com'; 31export const PRODUCTION_TODOS_FRONTEND_URL = 'https://app.franztodos.com';
32export const DEVELOPMENT_TODOS_FRONTEND_URL = 'https://development--franz-todos.netlify.com'; 32export const DEVELOPMENT_TODOS_FRONTEND_URL = 'https://development--franz-todos.netlify.com';
33 33
34export const CDN_URL = 'https://cdn.franzinfra.com';
35
34export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12'; 36export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12';
35 37
36export const KEEP_WS_LOADED_USID = '0a0aa000-0a0a-49a0-a000-a0a0a0a0a0a0'; 38export const KEEP_WS_LOADED_USID = '0a0aa000-0a0a-49a0-a000-a0a0a0a0a0a0';
@@ -100,7 +102,7 @@ export const DEFAULT_APP_SETTINGS = {
100 showMessageBadgeWhenMuted: true, 102 showMessageBadgeWhenMuted: true,
101 showDragArea: false, 103 showDragArea: false,
102 enableSpellchecking: true, 104 enableSpellchecking: true,
103 spellcheckerLanguage: '["en-US"]', 105 spellcheckerLanguage: 'en-us',
104 darkMode: process.platform === 'darwin' ? nativeTheme.shouldUseDarkColors : false, // We can't use refs from `./environment` at this time 106 darkMode: process.platform === 'darwin' ? nativeTheme.shouldUseDarkColors : false, // We can't use refs from `./environment` at this time
105 locale: '', 107 locale: '',
106 fallbackLocale: 'en-US', 108 fallbackLocale: 'en-US',
@@ -193,6 +195,7 @@ export const ALLOWED_PROTOCOLS = [
193 'https:', 195 'https:',
194 'http:', 196 'http:',
195 'ftp:', 197 'ftp:',
198 'franz:',
196]; 199];
197 200
198export const PLANS = { 201export const PLANS = {
diff --git a/src/containers/auth/SetupAssistantScreen.js b/src/containers/auth/SetupAssistantScreen.js
new file mode 100644
index 000000000..960ed7e33
--- /dev/null
+++ b/src/containers/auth/SetupAssistantScreen.js
@@ -0,0 +1,133 @@
1/* eslint-disable no-await-in-loop */
2import React, { Component } from 'react';
3import PropTypes from 'prop-types';
4import { inject, observer } from 'mobx-react';
5
6import { sleep } from '../../helpers/async-helpers';
7import SetupAssistant from '../../components/auth/SetupAssistant';
8import ServicesStore from '../../stores/ServicesStore';
9import RecipesStore from '../../stores/RecipesStore';
10import { TODOS_RECIPE_ID } from '../../features/todos';
11import UserStore from '../../stores/UserStore';
12
13export default @inject('stores', 'actions') @observer class SetupAssistantScreen extends Component {
14 services = {
15 whatsapp: {
16 name: 'WhatsApp',
17 hasTeamId: false,
18 },
19 messenger: {
20 name: 'Messenger',
21 hasTeamId: false,
22 },
23 gmail: {
24 name: 'Gmail',
25 hasTeamId: false,
26 },
27 skype: {
28 name: 'Skype',
29 hasTeamId: false,
30 },
31 telegram: {
32 name: 'Telegram',
33 hasTeamId: false,
34 },
35 instagram: {
36 name: 'Instagram',
37 hasTeamId: false,
38 },
39 slack: {
40 name: 'Slack',
41 hasTeamId: true,
42 },
43 hangouts: {
44 name: 'Hangouts',
45 hasTeamId: false,
46 },
47 linkedin: {
48 name: 'LinkedIn',
49 hasTeamId: false,
50 },
51 }
52
53 state = {
54 isSettingUpServices: false,
55 }
56
57 async setupServices(serviceConfig) {
58 const { stores: { services, router, user } } = this.props;
59 console.log(serviceConfig);
60
61 this.setState({
62 isSettingUpServices: true,
63 });
64
65 // The store requests are not build for paralell requests so we need to finish one request after another
66 for (const config of serviceConfig) {
67 const serviceData = {
68 name: this.services[config.id].name,
69 };
70
71 if (config.team) {
72 serviceData.team = config.team;
73 }
74
75 await services._createService({
76 recipeId: config.id,
77 serviceData,
78 redirect: false,
79 skipCleanup: true,
80 });
81
82 await sleep(100);
83 }
84
85 // Add Franz ToDos
86 await services._createService({
87 recipeId: TODOS_RECIPE_ID,
88 serviceData: {
89 name: 'Franz ToDos',
90 },
91 redirect: false,
92 skipCleanup: true,
93 });
94
95 this.setState({
96 isSettingUpServices: false,
97 });
98
99 await sleep(100);
100
101 router.push(user.pricingRoute);
102 }
103
104 render() {
105 return (
106 <SetupAssistant
107 onSubmit={config => this.setupServices(config)}
108 services={this.services}
109 embed={false}
110 isSettingUpServices={this.state.isSettingUpServices}
111 />
112 );
113 }
114}
115
116SetupAssistantScreen.wrappedComponent.propTypes = {
117 stores: PropTypes.shape({
118 services: PropTypes.instanceOf(ServicesStore),
119 recipes: PropTypes.instanceOf(RecipesStore),
120 user: PropTypes.instanceOf(UserStore),
121 }).isRequired,
122 actions: PropTypes.shape({
123 user: PropTypes.shape({
124 invite: PropTypes.func.isRequired,
125 }).isRequired,
126 service: PropTypes.shape({
127 createService: PropTypes.func.isRequired,
128 }).isRequired,
129 recipe: PropTypes.shape({
130 install: PropTypes.func.isRequired,
131 }).isRequired,
132 }).isRequired,
133};
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index a4312d9de..d7e413bb9 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -116,6 +116,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
116 isWorkspaceDrawerOpen={workspaceStore.isWorkspaceDrawerOpen} 116 isWorkspaceDrawerOpen={workspaceStore.isWorkspaceDrawerOpen}
117 showMessageBadgeWhenMutedSetting={settings.all.app.showMessageBadgeWhenMuted} 117 showMessageBadgeWhenMutedSetting={settings.all.app.showMessageBadgeWhenMuted}
118 showMessageBadgesEvenWhenMuted={ui.showMessageBadgesEvenWhenMuted} 118 showMessageBadgesEvenWhenMuted={ui.showMessageBadgesEvenWhenMuted}
119 isTodosServiceActive={services.isTodosServiceActive || false}
119 /> 120 />
120 ); 121 );
121 122
@@ -131,6 +132,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
131 update={updateService} 132 update={updateService}
132 userHasCompletedSignup={user.hasCompletedSignup} 133 userHasCompletedSignup={user.hasCompletedSignup}
133 hasActivatedTrial={user.hasActivatedTrial} 134 hasActivatedTrial={user.hasActivatedTrial}
135 isSpellcheckerEnabled={settings.app.enableSpellchecking}
134 /> 136 />
135 ); 137 );
136 138
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js
index 6aeecaa6d..d92d3bc07 100644
--- a/src/containers/settings/EditServiceScreen.js
+++ b/src/containers/settings/EditServiceScreen.js
@@ -33,9 +33,9 @@ const messages = defineMessages({
33 id: 'settings.service.form.enableService', 33 id: 'settings.service.form.enableService',
34 defaultMessage: '!!!Enable service', 34 defaultMessage: '!!!Enable service',
35 }, 35 },
36 disableHibernation: { 36 enableHibernation: {
37 id: 'settings.service.form.disableHibernation', 37 id: 'settings.service.form.enableHibernation',
38 defaultMessage: '!!!Disable hibernation', 38 defaultMessage: '!!!Enable hibernation',
39 }, 39 },
40 enableNotification: { 40 enableNotification: {
41 id: 'settings.service.form.enableNotification', 41 id: 'settings.service.form.enableNotification',
@@ -167,10 +167,10 @@ export default @inject('stores', 'actions') @observer class EditServiceScreen ex
167 value: service.isEnabled, 167 value: service.isEnabled,
168 default: true, 168 default: true,
169 }, 169 },
170 disableHibernation: { 170 isHibernationEnabled: {
171 label: intl.formatMessage(messages.disableHibernation), 171 label: intl.formatMessage(messages.enableHibernation),
172 value: action !== 'edit' ? false : service.disableHibernation, 172 value: action !== 'edit' ? recipe.autoHibernate : service.isHibernationEnabled,
173 default: false, 173 default: true,
174 }, 174 },
175 isNotificationEnabled: { 175 isNotificationEnabled: {
176 label: intl.formatMessage(messages.enableNotification), 176 label: intl.formatMessage(messages.enableNotification),
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 097f0ed8b..148bb2c53 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -25,6 +25,7 @@ import globalMessages from '../../i18n/globalMessages';
25import { DEFAULT_IS_FEATURE_ENABLED_BY_USER } from '../../features/todos'; 25import { DEFAULT_IS_FEATURE_ENABLED_BY_USER } from '../../features/todos';
26import WorkspacesStore from '../../features/workspaces/store'; 26import WorkspacesStore from '../../features/workspaces/store';
27import { DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED } from '../../features/workspaces'; 27import { DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED } from '../../features/workspaces';
28import ServicesStore from '../../stores/ServicesStore';
28 29
29const messages = defineMessages({ 30const messages = defineMessages({
30 autoLaunchOnStart: { 31 autoLaunchOnStart: {
@@ -587,6 +588,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
587 app, 588 app,
588 todos, 589 todos,
589 workspaces, 590 workspaces,
591 services,
590 } = this.props.stores; 592 } = this.props.stores;
591 const { 593 const {
592 updateStatus, 594 updateStatus,
@@ -628,6 +630,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
628 isUsingCustomTodoService={this.props.stores.todos.isUsingCustomTodoService} 630 isUsingCustomTodoService={this.props.stores.todos.isUsingCustomTodoService}
629 isNightlyEnabled={this.props.stores.settings.app.nightly} 631 isNightlyEnabled={this.props.stores.settings.app.nightly}
630 openProcessManager={() => this.openProcessManager()} 632 openProcessManager={() => this.openProcessManager()}
633 hasAddedTodosAsService={services.isTodosServiceAdded}
634 isOnline={app.isOnline}
631 /> 635 />
632 </ErrorBoundary> 636 </ErrorBoundary>
633 ); 637 );
@@ -639,6 +643,7 @@ EditSettingsScreen.wrappedComponent.propTypes = {
639 app: PropTypes.instanceOf(AppStore).isRequired, 643 app: PropTypes.instanceOf(AppStore).isRequired,
640 user: PropTypes.instanceOf(UserStore).isRequired, 644 user: PropTypes.instanceOf(UserStore).isRequired,
641 settings: PropTypes.instanceOf(SettingsStore).isRequired, 645 settings: PropTypes.instanceOf(SettingsStore).isRequired,
646 services: PropTypes.instanceOf(ServicesStore).isRequired,
642 todos: PropTypes.instanceOf(TodosStore).isRequired, 647 todos: PropTypes.instanceOf(TodosStore).isRequired,
643 workspaces: PropTypes.instanceOf(WorkspacesStore).isRequired, 648 workspaces: PropTypes.instanceOf(WorkspacesStore).isRequired,
644 }).isRequired, 649 }).isRequired,
diff --git a/src/electron/Settings.js b/src/electron/Settings.js
index d4f0d25bf..743d48632 100644
--- a/src/electron/Settings.js
+++ b/src/electron/Settings.js
@@ -33,6 +33,10 @@ export default class Settings {
33 return this.store; 33 return this.store;
34 } 34 }
35 35
36 get allSerialized() {
37 return toJS(this.store);
38 }
39
36 get(key) { 40 get(key) {
37 return this.store[key]; 41 return this.store[key];
38 } 42 }
diff --git a/src/electron/ipc-api/cld.js b/src/electron/ipc-api/cld.js
new file mode 100644
index 000000000..23f18aa94
--- /dev/null
+++ b/src/electron/ipc-api/cld.js
@@ -0,0 +1,20 @@
1import { ipcMain } from 'electron';
2import cld from 'cld';
3
4const debug = require('debug')('Franz:ipcApi:cld');
5
6export default async () => {
7 ipcMain.handle('detect-language', async (event, { sample }) => {
8 try {
9 const result = await cld.detect(sample);
10 debug('Checking language', 'probability', result.languages);
11 if (result.reliable) {
12 debug('Language detected reliably, setting spellchecker language to', result.languages[0].code);
13
14 return result.languages[0].code;
15 }
16 } catch (e) {
17 console.error(e);
18 }
19 });
20};
diff --git a/src/electron/ipc-api/dnd.js b/src/electron/ipc-api/dnd.js
new file mode 100644
index 000000000..4589aa222
--- /dev/null
+++ b/src/electron/ipc-api/dnd.js
@@ -0,0 +1,16 @@
1import { ipcMain } from 'electron';
2import { getDoNotDisturb } from '@meetfranz/electron-notification-state';
3
4const debug = require('debug')('Franz:ipcApi:dnd');
5
6export default async () => {
7 ipcMain.handle('get-dnd', async () => {
8 try {
9 const isDND = getDoNotDisturb();
10 debug('Fetching DND state, set to', isDND);
11 return isDND;
12 } catch (e) {
13 console.error(e);
14 }
15 });
16};
diff --git a/src/electron/ipc-api/download.js b/src/electron/ipc-api/download.js
index 36eca3c9f..16de66229 100644
--- a/src/electron/ipc-api/download.js
+++ b/src/electron/ipc-api/download.js
@@ -17,9 +17,15 @@ function decodeBase64Image(dataString) {
17 17
18export default (params) => { 18export default (params) => {
19 ipcMain.on('download-file', async (event, { url, content, fileOptions = {} }) => { 19 ipcMain.on('download-file', async (event, { url, content, fileOptions = {} }) => {
20 // We're passing a fake browserWindow to `electron-dl` in order to access the
21 // webContents of the webview that has initiated the download
22 const fakeWindow = {
23 webContents: event.sender.webContents,
24 };
25
20 try { 26 try {
21 if (!content) { 27 if (!content) {
22 const dl = await download(params.mainWindow, url, { 28 const dl = await download(fakeWindow, url, {
23 saveAs: true, 29 saveAs: true,
24 }); 30 });
25 debug('File saved to', dl.savePath); 31 debug('File saved to', dl.savePath);
@@ -27,14 +33,20 @@ export default (params) => {
27 const extension = mime.extension(fileOptions.mime); 33 const extension = mime.extension(fileOptions.mime);
28 const filename = `${fileOptions.name}.${extension}`; 34 const filename = `${fileOptions.name}.${extension}`;
29 35
30 dialog.showSaveDialog(params.mainWindow, { 36 try {
31 defaultPath: filename, 37 const saveDialog = await dialog.showSaveDialog(params.mainWindow, {
32 }, (name) => { 38 defaultPath: filename,
39 });
40
41 if (saveDialog.canceled) return;
42
33 const binaryImage = decodeBase64Image(content); 43 const binaryImage = decodeBase64Image(content);
34 fs.writeFileSync(name, binaryImage, 'binary'); 44 fs.writeFileSync(saveDialog.filePath, binaryImage, 'binary');
35 45
36 debug('File blob saved to', name); 46 debug('File blob saved to', saveDialog.filePath);
37 }); 47 } catch (err) {
48 console.log(err);
49 }
38 } 50 }
39 } catch (e) { 51 } catch (e) {
40 console.error(e); 52 console.error(e);
diff --git a/src/electron/ipc-api/index.js b/src/electron/ipc-api/index.js
index dcdef6b32..6181e5628 100644
--- a/src/electron/ipc-api/index.js
+++ b/src/electron/ipc-api/index.js
@@ -4,6 +4,8 @@ import appIndicator from './appIndicator';
4import download from './download'; 4import download from './download';
5import processManager from './processManager'; 5import processManager from './processManager';
6import localServer from './localServer'; 6import localServer from './localServer';
7import cld from './cld';
8import dnd from './dnd';
7 9
8export default (params) => { 10export default (params) => {
9 settings(params); 11 settings(params);
@@ -12,4 +14,6 @@ export default (params) => {
12 download(params); 14 download(params);
13 processManager(params); 15 processManager(params);
14 localServer(params); 16 localServer(params);
17 cld(params);
18 dnd();
15}; 19};
diff --git a/src/electron/ipc-api/settings.js b/src/electron/ipc-api/settings.js
index 6d48c54e3..15182739c 100644
--- a/src/electron/ipc-api/settings.js
+++ b/src/electron/ipc-api/settings.js
@@ -2,11 +2,9 @@ import { ipcMain } from 'electron';
2 2
3export default (params) => { 3export default (params) => {
4 ipcMain.on('getAppSettings', (event, type) => { 4 ipcMain.on('getAppSettings', (event, type) => {
5 const cleanData = JSON.parse(JSON.stringify(params.settings[type].all));
6
7 params.mainWindow.webContents.send('appSettings', { 5 params.mainWindow.webContents.send('appSettings', {
8 type, 6 type,
9 data: cleanData, 7 data: params.settings[type].allSerialized,
10 }); 8 });
11 }); 9 });
12 10
diff --git a/src/features/todos/actions.js b/src/features/todos/actions.js
index 1ccc9a592..cc17e919b 100644
--- a/src/features/todos/actions.js
+++ b/src/features/todos/actions.js
@@ -15,9 +15,14 @@ export const todoActions = createActionsFromDefinitions({
15 data: PropTypes.object, 15 data: PropTypes.object,
16 }, 16 },
17 handleClientMessage: { 17 handleClientMessage: {
18 action: PropTypes.string.isRequired, 18 channel: PropTypes.string.isRequired,
19 data: PropTypes.object, 19 message: PropTypes.shape({
20 action: PropTypes.string.isRequired,
21 data: PropTypes.object,
22 }),
20 }, 23 },
24 openDevTools: {},
25 reload: {},
21}, PropTypes.checkPropTypes); 26}, PropTypes.checkPropTypes);
22 27
23export default todoActions; 28export default todoActions;
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index c612702b0..90575ebac 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -5,12 +5,14 @@ import injectSheet from 'react-jss';
5import Webview from 'react-electron-web-view'; 5import Webview from 'react-electron-web-view';
6import { Icon } from '@meetfranz/ui'; 6import { Icon } from '@meetfranz/ui';
7import { defineMessages, intlShape } from 'react-intl'; 7import { defineMessages, intlShape } from 'react-intl';
8import classnames from 'classnames';
8 9
9import { mdiCheckAll } from '@mdi/js'; 10import { mdiCheckAll } from '@mdi/js';
10import SettingsStore from '../../../stores/SettingsStore'; 11import SettingsStore from '../../../stores/SettingsStore';
11 12
12import Appear from '../../../components/ui/effects/Appear'; 13import Appear from '../../../components/ui/effects/Appear';
13import UpgradeButton from '../../../components/ui/UpgradeButton'; 14import UpgradeButton from '../../../components/ui/UpgradeButton';
15import { TODOS_PARTITION_ID } from '..';
14 16
15import userAgent from '../../../helpers/userAgent-helpers'; 17import userAgent from '../../../helpers/userAgent-helpers';
16 18
@@ -49,7 +51,7 @@ const styles = theme => ({
49 borderLeft: [1, 'solid', theme.todos.todosLayer.borderLeftColor], 51 borderLeft: [1, 'solid', theme.todos.todosLayer.borderLeftColor],
50 zIndex: 300, 52 zIndex: 300,
51 53
52 transform: ({ isVisible, width }) => `translateX(${isVisible ? 0 : width}px)`, 54 transform: ({ isVisible, width, isTodosServiceActive }) => `translateX(${isVisible || isTodosServiceActive ? 0 : width}px)`,
53 55
54 '& webview': { 56 '& webview': {
55 height: '100%', 57 height: '100%',
@@ -91,12 +93,19 @@ const styles = theme => ({
91 premiumCTA: { 93 premiumCTA: {
92 marginTop: 40, 94 marginTop: 40,
93 }, 95 },
96 isTodosServiceActive: {
97 width: 'calc(100% - 368px)',
98 position: 'absolute',
99 right: 0,
100 zIndex: 0,
101 },
94}); 102});
95 103
96@injectSheet(styles) @inject('stores') @observer 104@injectSheet(styles) @inject('stores') @observer
97class TodosWebview extends Component { 105class TodosWebview extends Component {
98 static propTypes = { 106 static propTypes = {
99 classes: PropTypes.object.isRequired, 107 classes: PropTypes.object.isRequired,
108 isTodosServiceActive: PropTypes.bool.isRequired,
100 isVisible: PropTypes.bool.isRequired, 109 isVisible: PropTypes.bool.isRequired,
101 handleClientMessage: PropTypes.func.isRequired, 110 handleClientMessage: PropTypes.func.isRequired,
102 setTodosWebview: PropTypes.func.isRequired, 111 setTodosWebview: PropTypes.func.isRequired,
@@ -194,12 +203,16 @@ class TodosWebview extends Component {
194 startListeningToIpcMessages() { 203 startListeningToIpcMessages() {
195 const { handleClientMessage } = this.props; 204 const { handleClientMessage } = this.props;
196 if (!this.webview) return; 205 if (!this.webview) return;
197 this.webview.addEventListener('ipc-message', e => handleClientMessage(e.args[0])); 206 this.webview.addEventListener('ipc-message', (e) => {
207 // console.log(e);
208 handleClientMessage({ channel: e.channel, message: e.args[0] });
209 });
198 } 210 }
199 211
200 render() { 212 render() {
201 const { 213 const {
202 classes, 214 classes,
215 isTodosServiceActive,
203 isVisible, 216 isVisible,
204 isTodosIncludedInCurrentPlan, 217 isTodosIncludedInCurrentPlan,
205 stores, 218 stores,
@@ -222,13 +235,21 @@ class TodosWebview extends Component {
222 isTodoUrlValid = validURL(todoUrl); 235 isTodoUrlValid = validURL(todoUrl);
223 } 236 }
224 237
238 let displayedWidth = isVisible ? width : 0;
239 if (isTodosServiceActive) {
240 displayedWidth = null;
241 }
225 242
226 return ( 243 return (
227 <div 244 <div
228 className={classes.root} 245 className={classnames({
229 style={{ width: isVisible ? width : 0 }} 246 [classes.root]: true,
247 [classes.isTodosServiceActive]: isTodosServiceActive,
248 })}
249 style={{ width: displayedWidth }}
230 onMouseUp={() => this.stopResize()} 250 onMouseUp={() => this.stopResize()}
231 ref={(node) => { this.node = node; }} 251 ref={(node) => { this.node = node; }}
252 id="todos-panel"
232 > 253 >
233 <div 254 <div
234 className={classes.resizeHandler} 255 className={classes.resizeHandler}
@@ -251,7 +272,7 @@ class TodosWebview extends Component {
251 setTodosWebview(this.webview); 272 setTodosWebview(this.webview);
252 this.startListeningToIpcMessages(); 273 this.startListeningToIpcMessages();
253 }} 274 }}
254 partition="persist:todos" 275 partition={TODOS_PARTITION_ID}
255 preload="./features/todos/preload.js" 276 preload="./features/todos/preload.js"
256 ref={(webview) => { this.webview = webview ? webview.view : null; }} 277 ref={(webview) => { this.webview = webview ? webview.view : null; }}
257 src={todoUrl} 278 src={todoUrl}
diff --git a/src/features/todos/containers/TodosScreen.js b/src/features/todos/containers/TodosScreen.js
index bc05a587d..884925be6 100644
--- a/src/features/todos/containers/TodosScreen.js
+++ b/src/features/todos/containers/TodosScreen.js
@@ -7,6 +7,7 @@ import TodosWebview from '../components/TodosWebview';
7import ErrorBoundary from '../../../components/util/ErrorBoundary'; 7import ErrorBoundary from '../../../components/util/ErrorBoundary';
8import { TODOS_MIN_WIDTH, todosStore } from '..'; 8import { TODOS_MIN_WIDTH, todosStore } from '..';
9import { todoActions } from '../actions'; 9import { todoActions } from '../actions';
10import ServicesStore from '../../../stores/ServicesStore';
10 11
11@inject('stores', 'actions') @observer 12@inject('stores', 'actions') @observer
12class TodosScreen extends Component { 13class TodosScreen extends Component {
@@ -18,6 +19,7 @@ class TodosScreen extends Component {
18 return ( 19 return (
19 <ErrorBoundary> 20 <ErrorBoundary>
20 <TodosWebview 21 <TodosWebview
22 isTodosServiceActive={this.props.stores.services.isTodosServiceActive || false}
21 isVisible={todosStore.isTodosPanelVisible} 23 isVisible={todosStore.isTodosPanelVisible}
22 togglePanel={todoActions.toggleTodosPanel} 24 togglePanel={todoActions.toggleTodosPanel}
23 handleClientMessage={todoActions.handleClientMessage} 25 handleClientMessage={todoActions.handleClientMessage}
@@ -37,5 +39,6 @@ export default TodosScreen;
37TodosScreen.wrappedComponent.propTypes = { 39TodosScreen.wrappedComponent.propTypes = {
38 stores: PropTypes.shape({ 40 stores: PropTypes.shape({
39 features: PropTypes.instanceOf(FeaturesStore).isRequired, 41 features: PropTypes.instanceOf(FeaturesStore).isRequired,
42 services: PropTypes.instanceOf(ServicesStore).isRequired,
40 }).isRequired, 43 }).isRequired,
41}; 44};
diff --git a/src/features/todos/index.js b/src/features/todos/index.js
index 9f355e9ba..8ff06f190 100644
--- a/src/features/todos/index.js
+++ b/src/features/todos/index.js
@@ -9,6 +9,8 @@ export const DEFAULT_TODOS_WIDTH = 300;
9export const TODOS_MIN_WIDTH = 200; 9export const TODOS_MIN_WIDTH = 200;
10export const DEFAULT_TODOS_VISIBLE = true; 10export const DEFAULT_TODOS_VISIBLE = true;
11export const DEFAULT_IS_FEATURE_ENABLED_BY_USER = true; 11export const DEFAULT_IS_FEATURE_ENABLED_BY_USER = true;
12export const TODOS_RECIPE_ID = 'franz-todos';
13export const TODOS_PARTITION_ID = 'persist:todos"';
12 14
13export const TODOS_ROUTES = { 15export const TODOS_ROUTES = {
14 TARGET: '/todos', 16 TARGET: '/todos',
diff --git a/src/features/todos/preload.js b/src/features/todos/preload.js
index d834cf547..9bd76a704 100644
--- a/src/features/todos/preload.js
+++ b/src/features/todos/preload.js
@@ -5,7 +5,12 @@ const debug = require('debug')('Ferdi:feature:todos:preload');
5 5
6debug('Preloading Todos Webview'); 6debug('Preloading Todos Webview');
7 7
8let hostMessageListener = () => {}; 8let hostMessageListener = ({ action }) => {
9 switch (action) {
10 case 'todos:initialize-as-service': ipcRenderer.sendToHost('hello'); break;
11 default:
12 }
13};
9 14
10window.ferdi = { 15window.ferdi = {
11 onInitialize(ipcHostMessageListener) { 16 onInitialize(ipcHostMessageListener) {
diff --git a/src/features/todos/store.js b/src/features/todos/store.js
index a05203a04..c1d6a9049 100644
--- a/src/features/todos/store.js
+++ b/src/features/todos/store.js
@@ -23,7 +23,9 @@ export default class TodoStore extends FeatureStore {
23 23
24 @observable isFeatureActive = false; 24 @observable isFeatureActive = false;
25 25
26 webview = null; 26 @observable webview = null;
27
28 isInitialized = false;
27 29
28 @computed get width() { 30 @computed get width() {
29 const width = this.settings.width || DEFAULT_TODOS_WIDTH; 31 const width = this.settings.width || DEFAULT_TODOS_WIDTH;
@@ -65,6 +67,8 @@ export default class TodoStore extends FeatureStore {
65 [todoActions.handleHostMessage, this._handleHostMessage], 67 [todoActions.handleHostMessage, this._handleHostMessage],
66 [todoActions.handleClientMessage, this._handleClientMessage], 68 [todoActions.handleClientMessage, this._handleClientMessage],
67 [todoActions.toggleTodosFeatureVisibility, this._toggleTodosFeatureVisibility], 69 [todoActions.toggleTodosFeatureVisibility, this._toggleTodosFeatureVisibility],
70 [todoActions.openDevTools, this._openDevTools],
71 [todoActions.reload, this._reload],
68 ])); 72 ]));
69 73
70 // REACTIONS 74 // REACTIONS
@@ -129,16 +133,28 @@ export default class TodoStore extends FeatureStore {
129 } 133 }
130 }; 134 };
131 135
132 @action _handleClientMessage = (message) => { 136 @action _handleClientMessage = ({ channel, message = {} }) => {
133 debug('_handleClientMessage', message); 137 debug('_handleClientMessage', channel, message);
134 switch (message.action) { 138 switch (message.action) {
135 case 'todos:initialized': this._onTodosClientInitialized(); break; 139 case 'todos:initialized': this._onTodosClientInitialized(); break;
136 case 'todos:goToService': this._goToService(message.data); break; 140 case 'todos:goToService': this._goToService(message.data); break;
137 default: 141 default:
138 debug('Unknown client message reiceived', message); 142 debug('Other message received', channel, message);
143 console.log('this.stores.services.isTodosServiceAdded', this.stores.services.isTodosServiceAdded);
144 if (this.stores.services.isTodosServiceAdded) {
145 this.actions.service.handleIPCMessage({
146 serviceId: this.stores.services.isTodosServiceAdded.id,
147 channel,
148 args: message,
149 });
150 }
139 } 151 }
140 }; 152 };
141 153
154 _handleNewWindowEvent = ({ url }) => {
155 this.actions.app.openExternalUrl({ url });
156 }
157
142 @action _toggleTodosFeatureVisibility = () => { 158 @action _toggleTodosFeatureVisibility = () => {
143 debug('_toggleTodosFeatureVisibility'); 159 debug('_toggleTodosFeatureVisibility');
144 160
@@ -147,14 +163,28 @@ export default class TodoStore extends FeatureStore {
147 }); 163 });
148 }; 164 };
149 165
166 _openDevTools = () => {
167 debug('_openDevTools');
168
169 const webview = document.querySelector('#todos-panel webview');
170 if (webview) webview.openDevTools();
171 }
172
173 _reload = () => {
174 debug('_reload');
175
176 const webview = document.querySelector('#todos-panel webview');
177 if (webview) webview.reload();
178 }
179
150 // Todos client message handlers 180 // Todos client message handlers
151 181
152 _onTodosClientInitialized = () => { 182 _onTodosClientInitialized = async () => {
153 const { authToken } = this.stores.user; 183 const { authToken } = this.stores.user;
154 const { isDarkThemeActive } = this.stores.ui; 184 const { isDarkThemeActive } = this.stores.ui;
155 const { locale } = this.stores.app; 185 const { locale } = this.stores.app;
156 if (!this.webview) return; 186 if (!this.webview) return;
157 this.webview.send(IPC.TODOS_HOST_CHANNEL, { 187 await this.webview.send(IPC.TODOS_HOST_CHANNEL, {
158 action: 'todos:configure', 188 action: 'todos:configure',
159 data: { 189 data: {
160 authToken, 190 authToken,
@@ -163,9 +193,11 @@ export default class TodoStore extends FeatureStore {
163 }, 193 },
164 }); 194 });
165 195
166 this.webview.addEventListener('new-window', ({ url }) => { 196 if (!this.isInitialized) {
167 this.actions.app.openExternalUrl({ url }); 197 this.webview.addEventListener('new-window', this._handleNewWindowEvent);
168 }); 198
199 this.isInitialized = true;
200 }
169 }; 201 };
170 202
171 _goToService = ({ url, serviceId }) => { 203 _goToService = ({ url, serviceId }) => {
diff --git a/src/helpers/userAgent-helpers.js b/src/helpers/userAgent-helpers.js
index 4929d9578..be6162464 100644
--- a/src/helpers/userAgent-helpers.js
+++ b/src/helpers/userAgent-helpers.js
@@ -19,7 +19,7 @@ function windows() {
19} 19}
20 20
21function linux() { 21function linux() {
22 return 'X11; Linux x86_64'; 22 return 'X11; Ubuntu; Linux x86_64';
23} 23}
24 24
25export default function userAgent(removeChromeVersion = false, addFerdiVersion = false) { 25export default function userAgent(removeChromeVersion = false, addFerdiVersion = false) {
diff --git a/src/i18n/languages.js b/src/i18n/languages.js
index 868ef1389..e7713b42b 100644
--- a/src/i18n/languages.js
+++ b/src/i18n/languages.js
@@ -28,45 +28,95 @@ export const APP_LOCALES = {
28 es: 'Español', 28 es: 'Español',
29 no: 'Norsk (Norwegian)', 29 no: 'Norsk (Norwegian)',
30 be: 'белар (Belarusian)', 30 be: 'белар (Belarusian)',
31 et: 'Eestlane',
31}; 32};
32 33
33// Hunspell compatible keys 34// Hunspell compatible keys
34export const SPELLCHECKER_LOCALES = { 35export const SPELLCHECKER_LOCALES = {
35 'bg-bg': 'български език', 36 // 'bg-BG': 'български език',
36 'ca-es': 'Català', 37 // 'ca-es': 'Català',
37 'cs-cz': 'Čeština', 38 // 'cs-cz': 'Čeština',
38 'da-dk': 'Dansk', 39 // 'da-dk': 'Dansk',
39 'de-de': 'Deutsch', 40 // 'de-de': 'Deutsch',
40 'el-gr': 'ελληνικά (Greek)', 41 // 'el-gr': 'ελληνικά (Greek)',
41 'en-gb': 'English (GB)', 42 // 'en-gb': 'English (GB)',
42 'en-us': 'English (US)', 43 // 'en-us': 'English (US)',
43 'es-es': 'Español', 44 // 'es-es': 'Español',
44 'et-ee': 'Estonian', 45 // 'et-ee': 'Estonian',
45 'fa-ir': 'فارسی (Persian)', 46 // 'fa-ir': 'فارسی (Persian)',
46 'fo-fo': 'Faroese', 47 // 'fo-fo': 'Faroese',
47 'fr-fr': 'Français', 48 // 'fr-fr': 'Français',
48 'he-il': 'עברית (Hebrew)', 49 // 'he-il': 'עברית (Hebrew)',
49 'hr-hr': 'Hrvatski jezik', 50 // 'hr-hr': 'Hrvatski jezik',
50 'hu-hu': 'Magyar', 51 // 'hu-hu': 'Magyar',
51 'it-it': 'Italiano', 52 // 'it-it': 'Italiano',
53 // ko: 'Korean',
54 // 'lt-lt': 'Lietuvių kalba',
55 // 'lv-lv': 'Latviešu valoda',
56 // 'nb-no': 'Norsk bokmål',
57 // 'nl-nl': 'Nederlands',
58 // 'pl-pl': 'Język polski',
59 // 'pt-br': 'Português (Brazil)',
60 // 'pt-pt': 'Português',
61 // 'ro-ro': 'Limba română',
62 // 'ru-ru': 'Русский (Russian)',
63 // 'sk-sk': 'Slovenčina',
64 // 'sl-si': 'Slovenski jezik',
65 // sr: 'Српски језик (Serbian)',
66 // 'sv-se': 'Svenska',
67 // 'ta-in': 'தமிழ் (Tamil)',
68 // 'tg-tg': 'Тоҷикӣ (Tajik)',
69 // tr: 'Türkçe',
70 // 'uk-ua': 'Українська (Ukrainian)',
71 // vi: 'Tiếng Việt',
72
73 af: 'Afrikaans',
74 bg: 'български език',
75 ca: 'Català',
76 cs: 'Čeština',
77 cy: 'Welsh',
78 da: 'Dansk',
79 de: 'Deutsch',
80 el: 'ελληνικά (Greek)',
81 'en-AU': 'English (Australia)',
82 'en-CA': 'English (Canada)',
83 'en-GB': 'English (Great Britain)',
84 'en-US': 'English (United States)',
85 es: 'Español',
86 'es-AR': 'Español (Argentina)',
87 'es-ES': 'Español (España)',
88 'es-MX': 'Español (Mexico)',
89 'es-US': 'Español (Estados Unidos)',
90 et: 'Eesti',
91 fa: 'فارسی (Persian)',
92 fo: 'Føroyskt',
93 fr: 'Français',
94 he: 'עברית (Hebrew)',
95 hi: 'नहीं। (Hindi)',
96 hr: 'Hrvatski jezik',
97 hu: 'Magyar',
98 hy: 'հայերեն (Armenian)',
99 id: 'bahasa Indonesia',
100 it: 'Italiano',
52 ko: 'Korean', 101 ko: 'Korean',
53 'lt-lt': 'Lietuvių kalba', 102 lt: 'Lietuvis',
54 'lv-lv': 'Latviešu valoda', 103 lv: 'Latviešu valoda',
55 'nb-no': 'Norsk bokmål', 104 nb: 'Norsk bokmål',
56 'nl-nl': 'Nederlands', 105 nl: 'Nederlands',
57 'pl-pl': 'Język polski', 106 pl: 'Język polski',
58 'pt-br': 'Português (Brazil)', 107 'pt-BR': 'Português (Brasil)',
59 'pt-pt': 'Português', 108 'pt-PT': 'Português (Portugal)',
60 'ro-ro': 'Limba română', 109 ro: 'Limba română',
61 'ru-ru': 'Русский (Russian)', 110 ru: 'Русский (Russian)',
62 'sk-sk': 'Slovenčina', 111 sh: 'Srpsko hrvatski',
63 'sl-si': 'Slovenski jezik', 112 sk: 'Slovenčina',
64 sr: 'Српски језик (Serbian)', 113 sl: 'Slovenščina',
65 'sv-se': 'Svenska', 114 sq: 'Shqip',
66 'ta-in': 'தமிழ் (Tamil)', 115 sv: 'Svenska',
67 'tg-tg': 'Тоҷикӣ (Tajik)', 116 ta: 'தமிழ் (Tamil)',
117 tg: 'Тоҷикӣ (Tajik)',
68 tr: 'Türkçe', 118 tr: 'Türkçe',
69 'uk-ua': 'Українська (Ukrainian)', 119 uk: 'Українська (Ukrainian)',
70 vi: 'Tiếng Việt', 120 vi: 'Tiếng Việt',
71}; 121};
72 122
diff --git a/src/i18n/locales/bg.json b/src/i18n/locales/bg.json
new file mode 100644
index 000000000..64a1f93c5
--- /dev/null
+++ b/src/i18n/locales/bg.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Презареди",
3 "app.errorHandler.headline" : "Нещо се обърка",
4 "connectionLostBanner.cta" : "Презареди услугата",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "Send as email",
33 "feature.shareFranz.action.facebook" : "Share on Facebook",
34 "feature.shareFranz.action.twitter" : "Share on Twitter",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "Няма връзка с онлайн услугите на Франц",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "Не сте свързани към интернет",
52 "global.spellchecker.useDefault" : "Use System Default ({default})",
53 "global.spellchecking.autodetect" : "Detect language automatically",
54 "global.spellchecking.autodetect.short" : "Automatic",
55 "global.spellchecking.language" : "Spell checking language",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "Вмъкнете вашите услуги на Франц 4",
58 "import.notSupportedHeadline" : "Тези услуги не се подържат все още във Франц 5. ",
59 "import.skip.label" : "Искам да прибавя ръчно услуги",
60 "import.submit.label" : "Внасяне на услуги",
61 "infobar.buttonChangelog" : "Кое е новото?",
62 "infobar.buttonInstallUpdate" : "Рестартиране и инсталиране на обновлението",
63 "infobar.buttonReloadServices" : "Презареждане на услугите",
64 "infobar.requiredRequestsFailed" : "Неуспешно зареждане на услугите и информацията на потребителя. ",
65 "infobar.servicesUpdated" : "Вашите услуги са обновени.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "Има нова версия на Франц",
68 "invite.email.label" : "Адрес на е-поща:",
69 "invite.headline.friends" : "Поканете 3 ваши приятели или колеги",
70 "invite.name.label" : "Име",
71 "invite.skip.label" : "Искам да направя това по-късно",
72 "invite.submit.label" : "Изпращане на поканите",
73 "invite.successInfo" : "Поканите бяха изпратени успшно",
74 "login.email.label" : "Адрес на е-поща",
75 "login.headline" : "Вход",
76 "login.invalidCredentials" : "Неправилна е-поща или парола. ",
77 "login.link.password" : "Пренастройване на паролата",
78 "login.link.signup" : "Създаване на безплатен профил",
79 "login.password.label" : "Парола",
80 "login.serverLogout" : "Вашата сесия изтече, моля влезте отново",
81 "login.submit.label" : "Вход",
82 "login.tokenExpired" : "Вашата сесия изтече, моля влезте отново",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "За Franz",
86 "menu.app.announcement" : "What's new?",
87 "menu.app.checkForUpdates" : "Проверка за обновления",
88 "menu.app.hide" : "Скрий",
89 "menu.app.hideOthers" : "Скрий другите",
90 "menu.app.quit" : "Изход",
91 "menu.app.settings" : "Настройки",
92 "menu.app.unhide" : "Покажи",
93 "menu.edit" : "Редактиране",
94 "menu.edit.copy" : "Копирай",
95 "menu.edit.cut" : "Отрежи",
96 "menu.edit.delete" : "Изтриване",
97 "menu.edit.emojiSymbols" : "Емотикони и символи",
98 "menu.edit.paste" : "Постави",
99 "menu.edit.pasteAndMatchStyle" : "Направи Отново",
100 "menu.edit.redo" : "Направи отново",
101 "menu.edit.selectAll" : "Избери всичко",
102 "menu.edit.speech" : "Реч",
103 "menu.edit.startDictation" : "Започни диктовка",
104 "menu.edit.startSpeaking" : "Започни да говориш",
105 "menu.edit.stopSpeaking" : "Спри да говориш",
106 "menu.edit.undo" : "Отмяна",
107 "menu.file" : "Документ",
108 "menu.help" : "Помощ",
109 "menu.help.changelog" : "Списък с промените",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "Научете повече",
114 "menu.help.privacy" : "Декларация за поверителност",
115 "menu.help.support" : "Поддръжка",
116 "menu.help.tos" : "Условия на ползване",
117 "menu.services" : "Услуги",
118 "menu.services.activatePreviousService" : "Activate previous service",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "Activate next service",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "Изглед",
125 "menu.view.enterFullScreen" : "Отвории на цял екран",
126 "menu.view.exitFullScreen" : "Излез от цял екран",
127 "menu.view.reloadFranz" : "Презареди Franz",
128 "menu.view.reloadService" : "Презареди услугата",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "Оригинален размер",
131 "menu.view.toggleDevTools" : "Превключи инструментите за разработка",
132 "menu.view.toggleFullScreen" : "Превключване на пълният екран",
133 "menu.view.toggleServiceDevTools" : "Превключване инструментите за разработка",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "Приближаване",
136 "menu.view.zoomOut" : "Отдалечаване",
137 "menu.window" : "Прозорец",
138 "menu.window.close" : "Затвори",
139 "menu.window.minimize" : "Минимизирай",
140 "menu.workspaces" : "Workspaces",
141 "menu.workspaces.addNewWorkspace" : "Add New Workspace...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
143 "menu.workspaces.defaultWorkspace" : "Всички услуги",
144 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
145 "password.email.label" : "Адрес на е-поща",
146 "password.headline" : "Пренастройване на паролата",
147 "password.link.login" : "Влизте в профила си",
148 "password.link.signup" : "Създаване на безплатен профил",
149 "password.noUser" : "Абонат с такава е-поща не бе намерен",
150 "password.submit.label" : "Изпращане",
151 "password.successInfo" : "Моля отбележете вашата е-поща",
152 "premiumFeature.button.upgradeAccount" : "Upgrade account",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "Презареждане {име}",
191 "service.crashHandler.autoReload" : "Опитва се да възтанови автоматично {name} след {seconds} секунди",
192 "service.crashHandler.headline" : "О не!",
193 "service.crashHandler.text" : "{name} създаде грешка.",
194 "service.disabledHandler.action" : "Активирай {name}",
195 "service.disabledHandler.headline" : "{name} е изключен",
196 "service.errorHandler.action" : "Презареждане {име}",
197 "service.errorHandler.editAction" : "Редактира {име}",
198 "service.errorHandler.headline" : "О не!",
199 "service.errorHandler.message" : "Грешка",
200 "service.errorHandler.text" : "{name} has failed to load.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "Loading",
207 "services.getStarted" : "Започване",
208 "services.welcome" : "Добре дошли във Франц",
209 "settings.account.account.editButton" : "Редактиране на профила",
210 "settings.account.accountType.basic" : "Профил за начинаещи",
211 "settings.account.accountType.premium" : "Профил за напреднали подръжници",
212 "settings.account.buttonSave" : "Обновление на профила",
213 "settings.account.deleteAccount" : "Изтриване на профила",
214 "settings.account.deleteEmailSent" : "Имате получено е-писмо с линк за потвърждаване на изтриването. Профилът и данните ви не могат дъдат възтановени. ",
215 "settings.account.deleteInfo" : "Ако профилът ви във Франц вече не ви е необходим, можете да го изтриете заедно с всичките данни към него тук. ",
216 "settings.account.headline" : "Профил",
217 "settings.account.headlineAccount" : "Информация на профила",
218 "settings.account.headlineDangerZone" : "Опасна зона",
219 "settings.account.headlineInvoices" : "Фактури",
220 "settings.account.headlinePassword" : "Смяна на парола",
221 "settings.account.headlineProfile" : "Обновление на профила",
222 "settings.account.headlineSubscription" : "Вашият абонамент",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "Изтегляне",
226 "settings.account.manageSubscription.label" : "Управление на абонамена",
227 "settings.account.successInfo" : "Промените бяха запазени",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "Опитайте отново",
232 "settings.account.tryReloadUserInfoRequest" : "Опитайте отново",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "Не може да зареди информацията на абоната",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "Изчистване на буфера",
237 "settings.app.buttonInstallUpdate" : "Рестартирай и инсталирай обновлението",
238 "settings.app.buttonSearchForUpdate" : "Проверка за обновления",
239 "settings.app.cacheInfo" : "Буферът на Франц в момента използва {size} от вашия диск.",
240 "settings.app.currentVersion" : "Текуща версия:",
241 "settings.app.form.autoLaunchInBackground" : "Отворено на заден план",
242 "settings.app.form.autoLaunchOnStart" : "Отваряне на Франц при включване",
243 "settings.app.form.beta" : "Включване на бета версии",
244 "settings.app.form.darkMode" : "Join the Dark Side",
245 "settings.app.form.enableGPUAcceleration" : "Включи графичният ускорител",
246 "settings.app.form.enableSpellchecking" : "Включване на проверката на правописа",
247 "settings.app.form.enableSystemTray" : "Показване на мениджъра в системния панел",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "Език",
251 "settings.app.form.minimizeToSystemTray" : "Минимизиране на Франц в системния панел",
252 "settings.app.form.runInBackground" : "Дръж Франж влючен в задния план когато прозореца е затворен",
253 "settings.app.form.showDisabledServices" : "Покажи панели на изключени услуги",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Покажи непрочетени съобщения когато известията са изключени",
255 "settings.app.headline" : "Настройки",
256 "settings.app.headlineAdvanced" : "Допълнителни",
257 "settings.app.headlineAppearance" : "Изглед",
258 "settings.app.headlineGeneral" : "Общи",
259 "settings.app.headlineLanguage" : "Език",
260 "settings.app.headlineUpdates" : "Обновления",
261 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.",
262 "settings.app.restartRequired" : "Промените изискват резстартиране",
263 "settings.app.subheadlineCache" : "Буферна памет",
264 "settings.app.translationHelp" : "Помогнете ни да преведем Франц на вашия език.",
265 "settings.app.updateStatusAvailable" : "Налично обновление, изтеглпне...",
266 "settings.app.updateStatusSearching" : "Търсене на обновление",
267 "settings.app.updateStatusUpToDate" : "Използвате най-новата версия на Франц",
268 "settings.invite.headline" : "Поканете приятели",
269 "settings.navigation.account" : "Регистрация",
270 "settings.navigation.availableServices" : "Налични услуги",
271 "settings.navigation.inviteFriends" : "Поканете приятели",
272 "settings.navigation.logout" : "Изход",
273 "settings.navigation.settings" : "Настройки",
274 "settings.navigation.team" : "Manage Team",
275 "settings.navigation.yourServices" : "Вашите услуги",
276 "settings.navigation.yourWorkspaces" : "Your workspaces",
277 "settings.recipes.all" : "Всички услуги",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "Налични услуги",
286 "settings.recipes.missingService" : "Липсващи услуги?",
287 "settings.recipes.mostPopular" : "Най-разпространените",
288 "settings.recipes.nothingFound" : "За съжаление няма услуги съвпадащи с вашето търсене.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Услугата беше прибавена успешно",
290 "settings.searchService" : "Търсене на услуга",
291 "settings.service.error.goBack" : "Обратно към услугите",
292 "settings.service.error.headline" : "Грешка",
293 "settings.service.error.message" : "Услугата не може да бъде заредена.",
294 "settings.service.form.addServiceHeadline" : "Прибави {name}",
295 "settings.service.form.availableServices" : "Налични услуги",
296 "settings.service.form.customUrl" : "Клиентски сървър",
297 "settings.service.form.customUrlPremiumInfo" : "За да добавите услуги, разположени на ваш сървър, трябва да имате Franz Premium Supporter профил",
298 "settings.service.form.customUrlUpgradeAccount" : "Надградете вашия профил",
299 "settings.service.form.customUrlValidationError" : "Не може да се валидира стандартния {name} сървър",
300 "settings.service.form.deleteButton" : "Изтрий услугата",
301 "settings.service.form.editServiceHeadline" : "Редактира {име}",
302 "settings.service.form.enableAudio" : "Включване на звука",
303 "settings.service.form.enableBadge" : "Покажи списък с непрочетените съобщения",
304 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "Включване на известяванията",
307 "settings.service.form.enableService" : "Разрешаване на услугата",
308 "settings.service.form.headlineBadges" : "Списък на непрочетените съобщения",
309 "settings.service.form.headlineGeneral" : "Общи",
310 "settings.service.form.headlineNotifications" : "Известия",
311 "settings.service.form.icon" : "Стандартна икона",
312 "settings.service.form.iconDelete" : "Изтрий",
313 "settings.service.form.iconUpload" : "Премести тук изображението или натисни тук",
314 "settings.service.form.indirectMessageInfo" : "Ще бъдете известени за всички нови съобщения в даден канале не само @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "Покажи известие със списък на всички нови съобщения",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "Когато са дезактивирани, всички звукови известия и възпроизвеждане на аудио са заглушени",
318 "settings.service.form.name" : "Име",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
320 "settings.service.form.proxy.host" : "Proxy Host\/IP",
321 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
322 "settings.service.form.proxy.isEnabled" : "Use Proxy",
323 "settings.service.form.proxy.password" : "Password (optional)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.",
326 "settings.service.form.proxy.user" : "User (optional)",
327 "settings.service.form.saveButton" : "Запази услугата",
328 "settings.service.form.tabHosted" : "Собствен",
329 "settings.service.form.tabOnPremise" : "Хостван самостоятелно",
330 "settings.service.form.team" : "Екип",
331 "settings.service.form.useHostedService" : "Използвай хостинг {name} услугата",
332 "settings.service.form.yourServices" : "Вашите услуги",
333 "settings.services.deletedInfo" : "Услугата е изтрита",
334 "settings.services.discoverServices" : "Намери услуги",
335 "settings.services.headline" : "Вашите услуги",
336 "settings.services.noServicesAdded" : "Не сте добавили услуги все още",
337 "settings.services.servicesRequestFailed" : "Could not load your services",
338 "settings.services.tooltip.isDisabled" : "Услугата е дезактивирана",
339 "settings.services.tooltip.isMuted" : "Всички звуци са заглушени",
340 "settings.services.tooltip.notificationsDisabled" : "Известията са дезактивирани",
341 "settings.services.updatedInfo" : "Промените ви са запазени",
342 "settings.team.contentHeadline" : "Franz for Teams",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "Екип",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
347 "settings.team.upgradeAction" : "Upgrade your Account",
348 "settings.user.form.accountType.company" : "Фирма",
349 "settings.user.form.accountType.individual" : "Индивидуално",
350 "settings.user.form.accountType.label" : "Вид регистрация",
351 "settings.user.form.accountType.non-profit" : "нестопански",
352 "settings.user.form.currentPassword" : "Текуща парола",
353 "settings.user.form.email" : "Електронна поща",
354 "settings.user.form.firstname" : "Собствено име",
355 "settings.user.form.lastname" : "Фамилно име",
356 "settings.user.form.newPassword" : "Нова парола",
357 "settings.workspace.add.form.name" : "Име",
358 "settings.workspace.add.form.submitButton" : "Create workspace",
359 "settings.workspace.form.buttonDelete" : "Delete workspace",
360 "settings.workspace.form.buttonSave" : "Save workspace",
361 "settings.workspace.form.name" : "Име",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
363 "settings.workspace.form.yourWorkspaces" : "Your workspaces",
364 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
365 "settings.workspaces.headline" : "Your workspaces",
366 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
367 "settings.workspaces.tryReloadWorkspaces" : "Опитайте отново",
368 "settings.workspaces.updatedInfo" : "Your changes have been saved",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "Добавяне на услуга",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer",
378 "sidebar.muteApp" : "Дезактивирай известията и звуците",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
381 "sidebar.settings" : "Настройки",
382 "sidebar.unmuteApp" : "Активирай известията и звуците",
383 "signup.email.label" : "Адрес на ел. поща:",
384 "signup.emailDuplicate" : "Вече съществува потребител с този имейл адрес",
385 "signup.firstname.label" : "Име",
386 "signup.headline" : "Регистриране",
387 "signup.lastname.label" : "Фамилно име",
388 "signup.legal.info" : "Със регистрирането за профил във програмата Franz вие приемате",
389 "signup.legal.privacy" : "Декларация за поверителност",
390 "signup.legal.terms" : "Общи условия",
391 "signup.link.login" : "Вече сте регистриран, впишете се?",
392 "signup.password.label" : "Парола",
393 "signup.submit.label" : "Създаване на акаунт",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "Отказ",
406 "subscriptionPopup.buttonDone" : "Готово",
407 "tabs.item.deleteService" : "Изтрий услугата",
408 "tabs.item.disableAudio" : "Изключване на звука",
409 "tabs.item.disableNotifications" : "Изключване на известията",
410 "tabs.item.disableService" : "Спиране на услугата",
411 "tabs.item.edit" : "Редакция",
412 "tabs.item.enableAudio" : "Включване на звука",
413 "tabs.item.enableNotification" : "Включване на известяванията",
414 "tabs.item.enableService" : "Разрешаване на услугата",
415 "tabs.item.reload" : "Презареди",
416 "validation.email" : "{field} не е валидно поле",
417 "validation.minLength" : "Полето {field} трябва да бъде дълго, поне {length} знака",
418 "validation.oneRequired" : "At least one is required",
419 "validation.required" : "{field} е задължително",
420 "validation.url" : "{field} не е валиден адрес",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "Презареди",
426 "welcome.loginButton" : "Впишете се в акаунта си",
427 "welcome.signupButton" : "Създай безплатен акаунт",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "Всички услуги",
430 "workspaceDrawer.headline" : "Workspaces",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 4db3e5fd4..f6841dd0c 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -835,6 +835,159 @@
835 { 835 {
836 "descriptors": [ 836 "descriptors": [
837 { 837 {
838 "defaultMessage": "!!!Invite Friends",
839 "end": {
840 "column": 3,
841 "line": 19
842 },
843 "file": "src/components/auth/ServiceAssistant.js",
844 "id": "settings.invite.headline",
845 "start": {
846 "column": 20,
847 "line": 16
848 }
849 },
850 {
851 "defaultMessage": "!!!Invite 3 of your friends or colleagues",
852 "end": {
853 "column": 3,
854 "line": 23
855 },
856 "file": "src/components/auth/ServiceAssistant.js",
857 "id": "invite.headline.friends",
858 "start": {
859 "column": 12,
860 "line": 20
861 }
862 },
863 {
864 "defaultMessage": "!!!Name",
865 "end": {
866 "column": 3,
867 "line": 27
868 },
869 "file": "src/components/auth/ServiceAssistant.js",
870 "id": "invite.name.label",
871 "start": {
872 "column": 13,
873 "line": 24
874 }
875 },
876 {
877 "defaultMessage": "!!!Email address",
878 "end": {
879 "column": 3,
880 "line": 31
881 },
882 "file": "src/components/auth/ServiceAssistant.js",
883 "id": "invite.email.label",
884 "start": {
885 "column": 14,
886 "line": 28
887 }
888 },
889 {
890 "defaultMessage": "!!!Send invites",
891 "end": {
892 "column": 3,
893 "line": 35
894 },
895 "file": "src/components/auth/ServiceAssistant.js",
896 "id": "invite.submit.label",
897 "start": {
898 "column": 21,
899 "line": 32
900 }
901 },
902 {
903 "defaultMessage": "!!!I want to do this later",
904 "end": {
905 "column": 3,
906 "line": 39
907 },
908 "file": "src/components/auth/ServiceAssistant.js",
909 "id": "invite.skip.label",
910 "start": {
911 "column": 19,
912 "line": 36
913 }
914 },
915 {
916 "defaultMessage": "!!!Invitations sent successfully",
917 "end": {
918 "column": 3,
919 "line": 43
920 },
921 "file": "src/components/auth/ServiceAssistant.js",
922 "id": "invite.successInfo",
923 "start": {
924 "column": 21,
925 "line": 40
926 }
927 }
928 ],
929 "path": "src/components/auth/ServiceAssistant.json"
930 },
931 {
932 "descriptors": [
933 {
934 "defaultMessage": "!!!Let's get started",
935 "end": {
936 "column": 3,
937 "line": 22
938 },
939 "file": "src/components/auth/SetupAssistant.js",
940 "id": "setupAssistant.headline",
941 "start": {
942 "column": 12,
943 "line": 19
944 }
945 },
946 {
947 "defaultMessage": "!!!Choose from our most used services and get back on top of your messaging now.",
948 "end": {
949 "column": 3,
950 "line": 26
951 },
952 "file": "src/components/auth/SetupAssistant.js",
953 "id": "setupAssistant.subheadline",
954 "start": {
955 "column": 15,
956 "line": 23
957 }
958 },
959 {
960 "defaultMessage": "!!!Let's go",
961 "end": {
962 "column": 3,
963 "line": 30
964 },
965 "file": "src/components/auth/SetupAssistant.js",
966 "id": "setupAssistant.submit.label",
967 "start": {
968 "column": 21,
969 "line": 27
970 }
971 },
972 {
973 "defaultMessage": "!!!Invitations sent successfully",
974 "end": {
975 "column": 3,
976 "line": 34
977 },
978 "file": "src/components/auth/SetupAssistant.js",
979 "id": "invite.successInfo",
980 "start": {
981 "column": 21,
982 "line": 31
983 }
984 }
985 ],
986 "path": "src/components/auth/SetupAssistant.json"
987 },
988 {
989 "descriptors": [
990 {
838 "defaultMessage": "!!!Sign up", 991 "defaultMessage": "!!!Sign up",
839 "end": { 992 "end": {
840 "column": 3, 993 "column": 3,
@@ -1590,65 +1743,65 @@
1590 "defaultMessage": "!!!Welcome to Ferdi", 1743 "defaultMessage": "!!!Welcome to Ferdi",
1591 "end": { 1744 "end": {
1592 "column": 3, 1745 "column": 3,
1593 "line": 18 1746 "line": 19
1594 }, 1747 },
1595 "file": "src/components/services/content/Services.js", 1748 "file": "src/components/services/content/Services.js",
1596 "id": "services.welcome", 1749 "id": "services.welcome",
1597 "start": { 1750 "start": {
1598 "column": 11, 1751 "column": 11,
1599 "line": 15 1752 "line": 16
1600 } 1753 }
1601 }, 1754 },
1602 { 1755 {
1603 "defaultMessage": "!!!Get started", 1756 "defaultMessage": "!!!Get started",
1604 "end": { 1757 "end": {
1605 "column": 3, 1758 "column": 3,
1606 "line": 22 1759 "line": 23
1607 }, 1760 },
1608 "file": "src/components/services/content/Services.js", 1761 "file": "src/components/services/content/Services.js",
1609 "id": "services.getStarted", 1762 "id": "services.getStarted",
1610 "start": { 1763 "start": {
1611 "column": 14, 1764 "column": 14,
1612 "line": 19 1765 "line": 20
1613 } 1766 }
1614 }, 1767 },
1615 { 1768 {
1616 "defaultMessage": "!!!Please login to use Ferdi.", 1769 "defaultMessage": "!!!Please login to use Ferdi.",
1617 "end": { 1770 "end": {
1618 "column": 3, 1771 "column": 3,
1619 "line": 26 1772 "line": 27
1620 }, 1773 },
1621 "file": "src/components/services/content/Services.js", 1774 "file": "src/components/services/content/Services.js",
1622 "id": "services.login", 1775 "id": "services.login",
1623 "start": { 1776 "start": {
1624 "column": 9, 1777 "column": 9,
1625 "line": 23 1778 "line": 24
1626 } 1779 }
1627 }, 1780 },
1628 { 1781 {
1629 "defaultMessage": "!!!Use Ferdi without an Account", 1782 "defaultMessage": "!!!Use Ferdi without an Account",
1630 "end": { 1783 "end": {
1631 "column": 3, 1784 "column": 3,
1632 "line": 30 1785 "line": 31
1633 }, 1786 },
1634 "file": "src/components/services/content/Services.js", 1787 "file": "src/components/services/content/Services.js",
1635 "id": "services.serverless", 1788 "id": "services.serverless",
1636 "start": { 1789 "start": {
1637 "column": 14, 1790 "column": 14,
1638 "line": 27 1791 "line": 28
1639 } 1792 }
1640 }, 1793 },
1641 { 1794 {
1642 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 1795 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.",
1643 "end": { 1796 "end": {
1644 "column": 3, 1797 "column": 3,
1645 "line": 34 1798 "line": 35
1646 }, 1799 },
1647 "file": "src/components/services/content/Services.js", 1800 "file": "src/components/services/content/Services.js",
1648 "id": "services.serverInfo", 1801 "id": "services.serverInfo",
1649 "start": { 1802 "start": {
1650 "column": 14, 1803 "column": 14,
1651 "line": 31 1804 "line": 32
1652 } 1805 }
1653 } 1806 }
1654 ], 1807 ],
@@ -1787,117 +1940,117 @@
1787 "defaultMessage": "!!!Reload", 1940 "defaultMessage": "!!!Reload",
1788 "end": { 1941 "end": {
1789 "column": 3, 1942 "column": 3,
1790 "line": 18 1943 "line": 23
1791 }, 1944 },
1792 "file": "src/components/services/tabs/TabItem.js", 1945 "file": "src/components/services/tabs/TabItem.js",
1793 "id": "tabs.item.reload", 1946 "id": "tabs.item.reload",
1794 "start": { 1947 "start": {
1795 "column": 10, 1948 "column": 10,
1796 "line": 15 1949 "line": 20
1797 } 1950 }
1798 }, 1951 },
1799 { 1952 {
1800 "defaultMessage": "!!!Edit", 1953 "defaultMessage": "!!!Edit",
1801 "end": { 1954 "end": {
1802 "column": 3, 1955 "column": 3,
1803 "line": 22 1956 "line": 27
1804 }, 1957 },
1805 "file": "src/components/services/tabs/TabItem.js", 1958 "file": "src/components/services/tabs/TabItem.js",
1806 "id": "tabs.item.edit", 1959 "id": "tabs.item.edit",
1807 "start": { 1960 "start": {
1808 "column": 8, 1961 "column": 8,
1809 "line": 19 1962 "line": 24
1810 } 1963 }
1811 }, 1964 },
1812 { 1965 {
1813 "defaultMessage": "!!!Disable notifications", 1966 "defaultMessage": "!!!Disable notifications",
1814 "end": { 1967 "end": {
1815 "column": 3, 1968 "column": 3,
1816 "line": 26 1969 "line": 31
1817 }, 1970 },
1818 "file": "src/components/services/tabs/TabItem.js", 1971 "file": "src/components/services/tabs/TabItem.js",
1819 "id": "tabs.item.disableNotifications", 1972 "id": "tabs.item.disableNotifications",
1820 "start": { 1973 "start": {
1821 "column": 24, 1974 "column": 24,
1822 "line": 23 1975 "line": 28
1823 } 1976 }
1824 }, 1977 },
1825 { 1978 {
1826 "defaultMessage": "!!!Enable notifications", 1979 "defaultMessage": "!!!Enable notifications",
1827 "end": { 1980 "end": {
1828 "column": 3, 1981 "column": 3,
1829 "line": 30 1982 "line": 35
1830 }, 1983 },
1831 "file": "src/components/services/tabs/TabItem.js", 1984 "file": "src/components/services/tabs/TabItem.js",
1832 "id": "tabs.item.enableNotification", 1985 "id": "tabs.item.enableNotification",
1833 "start": { 1986 "start": {
1834 "column": 23, 1987 "column": 23,
1835 "line": 27 1988 "line": 32
1836 } 1989 }
1837 }, 1990 },
1838 { 1991 {
1839 "defaultMessage": "!!!Disable audio", 1992 "defaultMessage": "!!!Disable audio",
1840 "end": { 1993 "end": {
1841 "column": 3, 1994 "column": 3,
1842 "line": 34 1995 "line": 39
1843 }, 1996 },
1844 "file": "src/components/services/tabs/TabItem.js", 1997 "file": "src/components/services/tabs/TabItem.js",
1845 "id": "tabs.item.disableAudio", 1998 "id": "tabs.item.disableAudio",
1846 "start": { 1999 "start": {
1847 "column": 16, 2000 "column": 16,
1848 "line": 31 2001 "line": 36
1849 } 2002 }
1850 }, 2003 },
1851 { 2004 {
1852 "defaultMessage": "!!!Enable audio", 2005 "defaultMessage": "!!!Enable audio",
1853 "end": { 2006 "end": {
1854 "column": 3, 2007 "column": 3,
1855 "line": 38 2008 "line": 43
1856 }, 2009 },
1857 "file": "src/components/services/tabs/TabItem.js", 2010 "file": "src/components/services/tabs/TabItem.js",
1858 "id": "tabs.item.enableAudio", 2011 "id": "tabs.item.enableAudio",
1859 "start": { 2012 "start": {
1860 "column": 15, 2013 "column": 15,
1861 "line": 35 2014 "line": 40
1862 } 2015 }
1863 }, 2016 },
1864 { 2017 {
1865 "defaultMessage": "!!!Disable Service", 2018 "defaultMessage": "!!!Disable Service",
1866 "end": { 2019 "end": {
1867 "column": 3, 2020 "column": 3,
1868 "line": 42 2021 "line": 47
1869 }, 2022 },
1870 "file": "src/components/services/tabs/TabItem.js", 2023 "file": "src/components/services/tabs/TabItem.js",
1871 "id": "tabs.item.disableService", 2024 "id": "tabs.item.disableService",
1872 "start": { 2025 "start": {
1873 "column": 18, 2026 "column": 18,
1874 "line": 39 2027 "line": 44
1875 } 2028 }
1876 }, 2029 },
1877 { 2030 {
1878 "defaultMessage": "!!!Enable Service", 2031 "defaultMessage": "!!!Enable Service",
1879 "end": { 2032 "end": {
1880 "column": 3, 2033 "column": 3,
1881 "line": 46 2034 "line": 51
1882 }, 2035 },
1883 "file": "src/components/services/tabs/TabItem.js", 2036 "file": "src/components/services/tabs/TabItem.js",
1884 "id": "tabs.item.enableService", 2037 "id": "tabs.item.enableService",
1885 "start": { 2038 "start": {
1886 "column": 17, 2039 "column": 17,
1887 "line": 43 2040 "line": 48
1888 } 2041 }
1889 }, 2042 },
1890 { 2043 {
1891 "defaultMessage": "!!!Delete Service", 2044 "defaultMessage": "!!!Delete Service",
1892 "end": { 2045 "end": {
1893 "column": 3, 2046 "column": 3,
1894 "line": 50 2047 "line": 55
1895 }, 2048 },
1896 "file": "src/components/services/tabs/TabItem.js", 2049 "file": "src/components/services/tabs/TabItem.js",
1897 "id": "tabs.item.deleteService", 2050 "id": "tabs.item.deleteService",
1898 "start": { 2051 "start": {
1899 "column": 17, 2052 "column": 17,
1900 "line": 47 2053 "line": 52
1901 } 2054 }
1902 } 2055 }
1903 ], 2056 ],
@@ -2483,364 +2636,364 @@
2483 "defaultMessage": "!!!Save service", 2636 "defaultMessage": "!!!Save service",
2484 "end": { 2637 "end": {
2485 "column": 3, 2638 "column": 3,
2486 "line": 30 2639 "line": 29
2487 }, 2640 },
2488 "file": "src/components/settings/services/EditServiceForm.js", 2641 "file": "src/components/settings/services/EditServiceForm.js",
2489 "id": "settings.service.form.saveButton", 2642 "id": "settings.service.form.saveButton",
2490 "start": { 2643 "start": {
2491 "column": 15, 2644 "column": 15,
2492 "line": 27 2645 "line": 26
2493 } 2646 }
2494 }, 2647 },
2495 { 2648 {
2496 "defaultMessage": "!!!Delete Service", 2649 "defaultMessage": "!!!Delete Service",
2497 "end": { 2650 "end": {
2498 "column": 3, 2651 "column": 3,
2499 "line": 34 2652 "line": 33
2500 }, 2653 },
2501 "file": "src/components/settings/services/EditServiceForm.js", 2654 "file": "src/components/settings/services/EditServiceForm.js",
2502 "id": "settings.service.form.deleteButton", 2655 "id": "settings.service.form.deleteButton",
2503 "start": { 2656 "start": {
2504 "column": 17, 2657 "column": 17,
2505 "line": 31 2658 "line": 30
2506 } 2659 }
2507 }, 2660 },
2508 { 2661 {
2509 "defaultMessage": "!!!Open darkmode.css", 2662 "defaultMessage": "!!!Open darkmode.css",
2510 "end": { 2663 "end": {
2511 "column": 3, 2664 "column": 3,
2512 "line": 38 2665 "line": 37
2513 }, 2666 },
2514 "file": "src/components/settings/services/EditServiceForm.js", 2667 "file": "src/components/settings/services/EditServiceForm.js",
2515 "id": "settings.service.form.openDarkmodeCss", 2668 "id": "settings.service.form.openDarkmodeCss",
2516 "start": { 2669 "start": {
2517 "column": 19, 2670 "column": 19,
2518 "line": 35 2671 "line": 34
2519 } 2672 }
2520 }, 2673 },
2521 { 2674 {
2522 "defaultMessage": "!!!Open user.css", 2675 "defaultMessage": "!!!Open user.css",
2523 "end": { 2676 "end": {
2524 "column": 3, 2677 "column": 3,
2525 "line": 42 2678 "line": 41
2526 }, 2679 },
2527 "file": "src/components/settings/services/EditServiceForm.js", 2680 "file": "src/components/settings/services/EditServiceForm.js",
2528 "id": "settings.service.form.openUserCss", 2681 "id": "settings.service.form.openUserCss",
2529 "start": { 2682 "start": {
2530 "column": 15, 2683 "column": 15,
2531 "line": 39 2684 "line": 38
2532 } 2685 }
2533 }, 2686 },
2534 { 2687 {
2535 "defaultMessage": "!!!Open user.js", 2688 "defaultMessage": "!!!Open user.js",
2536 "end": { 2689 "end": {
2537 "column": 3, 2690 "column": 3,
2538 "line": 46 2691 "line": 45
2539 }, 2692 },
2540 "file": "src/components/settings/services/EditServiceForm.js", 2693 "file": "src/components/settings/services/EditServiceForm.js",
2541 "id": "settings.service.form.openUserJs", 2694 "id": "settings.service.form.openUserJs",
2542 "start": { 2695 "start": {
2543 "column": 14, 2696 "column": 14,
2544 "line": 43 2697 "line": 42
2545 } 2698 }
2546 }, 2699 },
2547 { 2700 {
2548 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 2701 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
2549 "end": { 2702 "end": {
2550 "column": 3, 2703 "column": 3,
2551 "line": 50 2704 "line": 49
2552 }, 2705 },
2553 "file": "src/components/settings/services/EditServiceForm.js", 2706 "file": "src/components/settings/services/EditServiceForm.js",
2554 "id": "settings.service.form.recipeFileInfo", 2707 "id": "settings.service.form.recipeFileInfo",
2555 "start": { 2708 "start": {
2556 "column": 18, 2709 "column": 18,
2557 "line": 47 2710 "line": 46
2558 } 2711 }
2559 }, 2712 },
2560 { 2713 {
2561 "defaultMessage": "!!!Available services", 2714 "defaultMessage": "!!!Available services",
2562 "end": { 2715 "end": {
2563 "column": 3, 2716 "column": 3,
2564 "line": 54 2717 "line": 53
2565 }, 2718 },
2566 "file": "src/components/settings/services/EditServiceForm.js", 2719 "file": "src/components/settings/services/EditServiceForm.js",
2567 "id": "settings.service.form.availableServices", 2720 "id": "settings.service.form.availableServices",
2568 "start": { 2721 "start": {
2569 "column": 21, 2722 "column": 21,
2570 "line": 51 2723 "line": 50
2571 } 2724 }
2572 }, 2725 },
2573 { 2726 {
2574 "defaultMessage": "!!!Your services", 2727 "defaultMessage": "!!!Your services",
2575 "end": { 2728 "end": {
2576 "column": 3, 2729 "column": 3,
2577 "line": 58 2730 "line": 57
2578 }, 2731 },
2579 "file": "src/components/settings/services/EditServiceForm.js", 2732 "file": "src/components/settings/services/EditServiceForm.js",
2580 "id": "settings.service.form.yourServices", 2733 "id": "settings.service.form.yourServices",
2581 "start": { 2734 "start": {
2582 "column": 16, 2735 "column": 16,
2583 "line": 55 2736 "line": 54
2584 } 2737 }
2585 }, 2738 },
2586 { 2739 {
2587 "defaultMessage": "!!!Add {name}", 2740 "defaultMessage": "!!!Add {name}",
2588 "end": { 2741 "end": {
2589 "column": 3, 2742 "column": 3,
2590 "line": 62 2743 "line": 61
2591 }, 2744 },
2592 "file": "src/components/settings/services/EditServiceForm.js", 2745 "file": "src/components/settings/services/EditServiceForm.js",
2593 "id": "settings.service.form.addServiceHeadline", 2746 "id": "settings.service.form.addServiceHeadline",
2594 "start": { 2747 "start": {
2595 "column": 22, 2748 "column": 22,
2596 "line": 59 2749 "line": 58
2597 } 2750 }
2598 }, 2751 },
2599 { 2752 {
2600 "defaultMessage": "!!!Edit {name}", 2753 "defaultMessage": "!!!Edit {name}",
2601 "end": { 2754 "end": {
2602 "column": 3, 2755 "column": 3,
2603 "line": 66 2756 "line": 65
2604 }, 2757 },
2605 "file": "src/components/settings/services/EditServiceForm.js", 2758 "file": "src/components/settings/services/EditServiceForm.js",
2606 "id": "settings.service.form.editServiceHeadline", 2759 "id": "settings.service.form.editServiceHeadline",
2607 "start": { 2760 "start": {
2608 "column": 23, 2761 "column": 23,
2609 "line": 63 2762 "line": 62
2610 } 2763 }
2611 }, 2764 },
2612 { 2765 {
2613 "defaultMessage": "!!!Hosted", 2766 "defaultMessage": "!!!Hosted",
2614 "end": { 2767 "end": {
2615 "column": 3, 2768 "column": 3,
2616 "line": 70 2769 "line": 69
2617 }, 2770 },
2618 "file": "src/components/settings/services/EditServiceForm.js", 2771 "file": "src/components/settings/services/EditServiceForm.js",
2619 "id": "settings.service.form.tabHosted", 2772 "id": "settings.service.form.tabHosted",
2620 "start": { 2773 "start": {
2621 "column": 13, 2774 "column": 13,
2622 "line": 67 2775 "line": 66
2623 } 2776 }
2624 }, 2777 },
2625 { 2778 {
2626 "defaultMessage": "!!!Self hosted ⭐️", 2779 "defaultMessage": "!!!Self hosted ⭐️",
2627 "end": { 2780 "end": {
2628 "column": 3, 2781 "column": 3,
2629 "line": 74 2782 "line": 73
2630 }, 2783 },
2631 "file": "src/components/settings/services/EditServiceForm.js", 2784 "file": "src/components/settings/services/EditServiceForm.js",
2632 "id": "settings.service.form.tabOnPremise", 2785 "id": "settings.service.form.tabOnPremise",
2633 "start": { 2786 "start": {
2634 "column": 16, 2787 "column": 16,
2635 "line": 71 2788 "line": 70
2636 } 2789 }
2637 }, 2790 },
2638 { 2791 {
2639 "defaultMessage": "!!!Use the hosted {name} service.", 2792 "defaultMessage": "!!!Use the hosted {name} service.",
2640 "end": { 2793 "end": {
2641 "column": 3, 2794 "column": 3,
2642 "line": 78 2795 "line": 77
2643 }, 2796 },
2644 "file": "src/components/settings/services/EditServiceForm.js", 2797 "file": "src/components/settings/services/EditServiceForm.js",
2645 "id": "settings.service.form.useHostedService", 2798 "id": "settings.service.form.useHostedService",
2646 "start": { 2799 "start": {
2647 "column": 20, 2800 "column": 20,
2648 "line": 75 2801 "line": 74
2649 } 2802 }
2650 }, 2803 },
2651 { 2804 {
2652 "defaultMessage": "!!!Could not validate custom {name} server.", 2805 "defaultMessage": "!!!Could not validate custom {name} server.",
2653 "end": { 2806 "end": {
2654 "column": 3, 2807 "column": 3,
2655 "line": 82 2808 "line": 81
2656 }, 2809 },
2657 "file": "src/components/settings/services/EditServiceForm.js", 2810 "file": "src/components/settings/services/EditServiceForm.js",
2658 "id": "settings.service.form.customUrlValidationError", 2811 "id": "settings.service.form.customUrlValidationError",
2659 "start": { 2812 "start": {
2660 "column": 28, 2813 "column": 28,
2661 "line": 79 2814 "line": 78
2662 } 2815 }
2663 }, 2816 },
2664 { 2817 {
2665 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.", 2818 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
2666 "end": { 2819 "end": {
2667 "column": 3, 2820 "column": 3,
2668 "line": 86 2821 "line": 85
2669 }, 2822 },
2670 "file": "src/components/settings/services/EditServiceForm.js", 2823 "file": "src/components/settings/services/EditServiceForm.js",
2671 "id": "settings.service.form.customUrlPremiumInfo", 2824 "id": "settings.service.form.customUrlPremiumInfo",
2672 "start": { 2825 "start": {
2673 "column": 24, 2826 "column": 24,
2674 "line": 83 2827 "line": 82
2675 } 2828 }
2676 }, 2829 },
2677 { 2830 {
2678 "defaultMessage": "!!!Upgrade your account", 2831 "defaultMessage": "!!!Upgrade your account",
2679 "end": { 2832 "end": {
2680 "column": 3, 2833 "column": 3,
2681 "line": 90 2834 "line": 89
2682 }, 2835 },
2683 "file": "src/components/settings/services/EditServiceForm.js", 2836 "file": "src/components/settings/services/EditServiceForm.js",
2684 "id": "settings.service.form.customUrlUpgradeAccount", 2837 "id": "settings.service.form.customUrlUpgradeAccount",
2685 "start": { 2838 "start": {
2686 "column": 27, 2839 "column": 27,
2687 "line": 87 2840 "line": 86
2688 } 2841 }
2689 }, 2842 },
2690 { 2843 {
2691 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 2844 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
2692 "end": { 2845 "end": {
2693 "column": 3, 2846 "column": 3,
2694 "line": 94 2847 "line": 93
2695 }, 2848 },
2696 "file": "src/components/settings/services/EditServiceForm.js", 2849 "file": "src/components/settings/services/EditServiceForm.js",
2697 "id": "settings.service.form.indirectMessageInfo", 2850 "id": "settings.service.form.indirectMessageInfo",
2698 "start": { 2851 "start": {
2699 "column": 23, 2852 "column": 23,
2700 "line": 91 2853 "line": 90
2701 } 2854 }
2702 }, 2855 },
2703 { 2856 {
2704 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 2857 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
2705 "end": { 2858 "end": {
2706 "column": 3, 2859 "column": 3,
2707 "line": 98 2860 "line": 97
2708 }, 2861 },
2709 "file": "src/components/settings/services/EditServiceForm.js", 2862 "file": "src/components/settings/services/EditServiceForm.js",
2710 "id": "settings.service.form.isMutedInfo", 2863 "id": "settings.service.form.isMutedInfo",
2711 "start": { 2864 "start": {
2712 "column": 15, 2865 "column": 15,
2713 "line": 95 2866 "line": 94
2714 } 2867 }
2715 }, 2868 },
2716 { 2869 {
2717 "defaultMessage": "!!!You currently have hibernation enabled but you can disable hibernation for individual services using this option.", 2870 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.",
2718 "end": { 2871 "end": {
2719 "column": 3, 2872 "column": 3,
2720 "line": 102 2873 "line": 101
2721 }, 2874 },
2722 "file": "src/components/settings/services/EditServiceForm.js", 2875 "file": "src/components/settings/services/EditServiceForm.js",
2723 "id": "settings.service.form.disableHibernationInfo", 2876 "id": "settings.service.form.isHibernatedEnabledInfo",
2724 "start": { 2877 "start": {
2725 "column": 26, 2878 "column": 28,
2726 "line": 99 2879 "line": 98
2727 } 2880 }
2728 }, 2881 },
2729 { 2882 {
2730 "defaultMessage": "!!!Notifications", 2883 "defaultMessage": "!!!Notifications",
2731 "end": { 2884 "end": {
2732 "column": 3, 2885 "column": 3,
2733 "line": 106 2886 "line": 105
2734 }, 2887 },
2735 "file": "src/components/settings/services/EditServiceForm.js", 2888 "file": "src/components/settings/services/EditServiceForm.js",
2736 "id": "settings.service.form.headlineNotifications", 2889 "id": "settings.service.form.headlineNotifications",
2737 "start": { 2890 "start": {
2738 "column": 25, 2891 "column": 25,
2739 "line": 103 2892 "line": 102
2740 } 2893 }
2741 }, 2894 },
2742 { 2895 {
2743 "defaultMessage": "!!!Unread message badges", 2896 "defaultMessage": "!!!Unread message badges",
2744 "end": { 2897 "end": {
2745 "column": 3, 2898 "column": 3,
2746 "line": 110 2899 "line": 109
2747 }, 2900 },
2748 "file": "src/components/settings/services/EditServiceForm.js", 2901 "file": "src/components/settings/services/EditServiceForm.js",
2749 "id": "settings.service.form.headlineBadges", 2902 "id": "settings.service.form.headlineBadges",
2750 "start": { 2903 "start": {
2751 "column": 18, 2904 "column": 18,
2752 "line": 107 2905 "line": 106
2753 } 2906 }
2754 }, 2907 },
2755 { 2908 {
2756 "defaultMessage": "!!!General", 2909 "defaultMessage": "!!!General",
2757 "end": { 2910 "end": {
2758 "column": 3, 2911 "column": 3,
2759 "line": 114 2912 "line": 113
2760 }, 2913 },
2761 "file": "src/components/settings/services/EditServiceForm.js", 2914 "file": "src/components/settings/services/EditServiceForm.js",
2762 "id": "settings.service.form.headlineGeneral", 2915 "id": "settings.service.form.headlineGeneral",
2763 "start": { 2916 "start": {
2764 "column": 19, 2917 "column": 19,
2765 "line": 111 2918 "line": 110
2766 } 2919 }
2767 }, 2920 },
2768 { 2921 {
2769 "defaultMessage": "!!!Dark Reader Settings", 2922 "defaultMessage": "!!!Dark Reader Settings",
2770 "end": { 2923 "end": {
2771 "column": 3, 2924 "column": 3,
2772 "line": 118 2925 "line": 117
2773 }, 2926 },
2774 "file": "src/components/settings/services/EditServiceForm.js", 2927 "file": "src/components/settings/services/EditServiceForm.js",
2775 "id": "settings.service.form.headlineDarkReaderSettings", 2928 "id": "settings.service.form.headlineDarkReaderSettings",
2776 "start": { 2929 "start": {
2777 "column": 30, 2930 "column": 30,
2778 "line": 115 2931 "line": 114
2779 } 2932 }
2780 }, 2933 },
2781 { 2934 {
2782 "defaultMessage": "!!!Delete", 2935 "defaultMessage": "!!!Delete",
2783 "end": { 2936 "end": {
2784 "column": 3, 2937 "column": 3,
2785 "line": 122 2938 "line": 121
2786 }, 2939 },
2787 "file": "src/components/settings/services/EditServiceForm.js", 2940 "file": "src/components/settings/services/EditServiceForm.js",
2788 "id": "settings.service.form.iconDelete", 2941 "id": "settings.service.form.iconDelete",
2789 "start": { 2942 "start": {
2790 "column": 14, 2943 "column": 14,
2791 "line": 119 2944 "line": 118
2792 } 2945 }
2793 }, 2946 },
2794 { 2947 {
2795 "defaultMessage": "!!!Drop your image, or click here", 2948 "defaultMessage": "!!!Drop your image, or click here",
2796 "end": { 2949 "end": {
2797 "column": 3, 2950 "column": 3,
2798 "line": 126 2951 "line": 125
2799 }, 2952 },
2800 "file": "src/components/settings/services/EditServiceForm.js", 2953 "file": "src/components/settings/services/EditServiceForm.js",
2801 "id": "settings.service.form.iconUpload", 2954 "id": "settings.service.form.iconUpload",
2802 "start": { 2955 "start": {
2803 "column": 14, 2956 "column": 14,
2804 "line": 123 2957 "line": 122
2805 } 2958 }
2806 }, 2959 },
2807 { 2960 {
2808 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 2961 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
2809 "end": { 2962 "end": {
2810 "column": 3, 2963 "column": 3,
2811 "line": 130 2964 "line": 129
2812 }, 2965 },
2813 "file": "src/components/settings/services/EditServiceForm.js", 2966 "file": "src/components/settings/services/EditServiceForm.js",
2814 "id": "settings.service.form.proxy.headline", 2967 "id": "settings.service.form.proxy.headline",
2815 "start": { 2968 "start": {
2816 "column": 17, 2969 "column": 17,
2817 "line": 127 2970 "line": 126
2818 } 2971 }
2819 }, 2972 },
2820 { 2973 {
2821 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 2974 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
2822 "end": { 2975 "end": {
2823 "column": 3, 2976 "column": 3,
2824 "line": 134 2977 "line": 133
2825 }, 2978 },
2826 "file": "src/components/settings/services/EditServiceForm.js", 2979 "file": "src/components/settings/services/EditServiceForm.js",
2827 "id": "settings.service.form.proxy.restartInfo", 2980 "id": "settings.service.form.proxy.restartInfo",
2828 "start": { 2981 "start": {
2829 "column": 20, 2982 "column": 20,
2830 "line": 131 2983 "line": 130
2831 } 2984 }
2832 }, 2985 },
2833 { 2986 {
2834 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 2987 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
2835 "end": { 2988 "end": {
2836 "column": 3, 2989 "column": 3,
2837 "line": 138 2990 "line": 137
2838 }, 2991 },
2839 "file": "src/components/settings/services/EditServiceForm.js", 2992 "file": "src/components/settings/services/EditServiceForm.js",
2840 "id": "settings.service.form.proxy.info", 2993 "id": "settings.service.form.proxy.info",
2841 "start": { 2994 "start": {
2842 "column": 13, 2995 "column": 13,
2843 "line": 135 2996 "line": 134
2844 } 2997 }
2845 } 2998 }
2846 ], 2999 ],
@@ -4494,15 +4647,15 @@
4494 } 4647 }
4495 }, 4648 },
4496 { 4649 {
4497 "defaultMessage": "!!!Disable hibernation", 4650 "defaultMessage": "!!!Enable hibernation",
4498 "end": { 4651 "end": {
4499 "column": 3, 4652 "column": 3,
4500 "line": 39 4653 "line": 39
4501 }, 4654 },
4502 "file": "src/containers/settings/EditServiceScreen.js", 4655 "file": "src/containers/settings/EditServiceScreen.js",
4503 "id": "settings.service.form.disableHibernation", 4656 "id": "settings.service.form.enableHibernation",
4504 "start": { 4657 "start": {
4505 "column": 22, 4658 "column": 21,
4506 "line": 36 4659 "line": 36
4507 } 4660 }
4508 }, 4661 },
@@ -4723,520 +4876,546 @@
4723 "defaultMessage": "!!!Launch Ferdi on start", 4876 "defaultMessage": "!!!Launch Ferdi on start",
4724 "end": { 4877 "end": {
4725 "column": 3, 4878 "column": 3,
4726 "line": 33 4879 "line": 34
4727 }, 4880 },
4728 "file": "src/containers/settings/EditSettingsScreen.js", 4881 "file": "src/containers/settings/EditSettingsScreen.js",
4729 "id": "settings.app.form.autoLaunchOnStart", 4882 "id": "settings.app.form.autoLaunchOnStart",
4730 "start": { 4883 "start": {
4731 "column": 21, 4884 "column": 21,
4732 "line": 30 4885 "line": 31
4733 } 4886 }
4734 }, 4887 },
4735 { 4888 {
4736 "defaultMessage": "!!!Open in background", 4889 "defaultMessage": "!!!Open in background",
4737 "end": { 4890 "end": {
4738 "column": 3, 4891 "column": 3,
4739 "line": 37 4892 "line": 38
4740 }, 4893 },
4741 "file": "src/containers/settings/EditSettingsScreen.js", 4894 "file": "src/containers/settings/EditSettingsScreen.js",
4742 "id": "settings.app.form.autoLaunchInBackground", 4895 "id": "settings.app.form.autoLaunchInBackground",
4743 "start": { 4896 "start": {
4744 "column": 26, 4897 "column": 26,
4745 "line": 34 4898 "line": 35
4746 } 4899 }
4747 }, 4900 },
4748 { 4901 {
4749 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 4902 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
4750 "end": { 4903 "end": {
4751 "column": 3, 4904 "column": 3,
4752 "line": 41 4905 "line": 42
4753 }, 4906 },
4754 "file": "src/containers/settings/EditSettingsScreen.js", 4907 "file": "src/containers/settings/EditSettingsScreen.js",
4755 "id": "settings.app.form.runInBackground", 4908 "id": "settings.app.form.runInBackground",
4756 "start": { 4909 "start": {
4757 "column": 19, 4910 "column": 19,
4758 "line": 38 4911 "line": 39
4759 } 4912 }
4760 }, 4913 },
4761 { 4914 {
4762 "defaultMessage": "!!!Start minimized", 4915 "defaultMessage": "!!!Start minimized",
4763 "end": { 4916 "end": {
4764 "column": 3, 4917 "column": 3,
4765 "line": 45 4918 "line": 46
4766 }, 4919 },
4767 "file": "src/containers/settings/EditSettingsScreen.js", 4920 "file": "src/containers/settings/EditSettingsScreen.js",
4768 "id": "settings.app.form.startMinimized", 4921 "id": "settings.app.form.startMinimized",
4769 "start": { 4922 "start": {
4770 "column": 18, 4923 "column": 18,
4771 "line": 42 4924 "line": 43
4772 } 4925 }
4773 }, 4926 },
4774 { 4927 {
4775 "defaultMessage": "!!!Always show Ferdi in system tray", 4928 "defaultMessage": "!!!Always show Ferdi in system tray",
4776 "end": { 4929 "end": {
4777 "column": 3, 4930 "column": 3,
4778 "line": 49 4931 "line": 50
4779 }, 4932 },
4780 "file": "src/containers/settings/EditSettingsScreen.js", 4933 "file": "src/containers/settings/EditSettingsScreen.js",
4781 "id": "settings.app.form.enableSystemTray", 4934 "id": "settings.app.form.enableSystemTray",
4782 "start": { 4935 "start": {
4783 "column": 20, 4936 "column": 20,
4784 "line": 46 4937 "line": 47
4785 } 4938 }
4786 }, 4939 },
4787 { 4940 {
4788 "defaultMessage": "!!!Reload Ferdi after system resume", 4941 "defaultMessage": "!!!Reload Ferdi after system resume",
4789 "end": { 4942 "end": {
4790 "column": 3, 4943 "column": 3,
4791 "line": 53 4944 "line": 54
4792 }, 4945 },
4793 "file": "src/containers/settings/EditSettingsScreen.js", 4946 "file": "src/containers/settings/EditSettingsScreen.js",
4794 "id": "settings.app.form.reloadAfterResume", 4947 "id": "settings.app.form.reloadAfterResume",
4795 "start": { 4948 "start": {
4796 "column": 21, 4949 "column": 21,
4797 "line": 50 4950 "line": 51
4798 } 4951 }
4799 }, 4952 },
4800 { 4953 {
4801 "defaultMessage": "!!!Minimize Ferdi to system tray", 4954 "defaultMessage": "!!!Minimize Ferdi to system tray",
4802 "end": { 4955 "end": {
4803 "column": 3, 4956 "column": 3,
4804 "line": 57 4957 "line": 58
4805 }, 4958 },
4806 "file": "src/containers/settings/EditSettingsScreen.js", 4959 "file": "src/containers/settings/EditSettingsScreen.js",
4807 "id": "settings.app.form.minimizeToSystemTray", 4960 "id": "settings.app.form.minimizeToSystemTray",
4808 "start": { 4961 "start": {
4809 "column": 24, 4962 "column": 24,
4810 "line": 54 4963 "line": 55
4964 }
4965 },
4966 {
4967 "defaultMessage": "!!!Close Ferdi to system tray",
4968 "end": {
4969 "column": 3,
4970 "line": 62
4971 },
4972 "file": "src/containers/settings/EditSettingsScreen.js",
4973 "id": "settings.app.form.closeToSystemTray",
4974 "start": {
4975 "column": 21,
4976 "line": 59
4811 } 4977 }
4812 }, 4978 },
4813 { 4979 {
4814 "defaultMessage": "!!!Don't show message content in notifications", 4980 "defaultMessage": "!!!Don't show message content in notifications",
4815 "end": { 4981 "end": {
4816 "column": 3, 4982 "column": 3,
4817 "line": 61 4983 "line": 66
4818 }, 4984 },
4819 "file": "src/containers/settings/EditSettingsScreen.js", 4985 "file": "src/containers/settings/EditSettingsScreen.js",
4820 "id": "settings.app.form.privateNotifications", 4986 "id": "settings.app.form.privateNotifications",
4821 "start": { 4987 "start": {
4822 "column": 24, 4988 "column": 24,
4823 "line": 58 4989 "line": 63
4990 }
4991 },
4992 {
4993 "defaultMessage": "!!!Notify TaskBar/Dock on new message",
4994 "end": {
4995 "column": 3,
4996 "line": 70
4997 },
4998 "file": "src/containers/settings/EditSettingsScreen.js",
4999 "id": "settings.app.form.notifyTaskBarOnMessage",
5000 "start": {
5001 "column": 26,
5002 "line": 67
4824 } 5003 }
4825 }, 5004 },
4826 { 5005 {
4827 "defaultMessage": "!!!Navigation bar behaviour", 5006 "defaultMessage": "!!!Navigation bar behaviour",
4828 "end": { 5007 "end": {
4829 "column": 3, 5008 "column": 3,
4830 "line": 65 5009 "line": 74
4831 }, 5010 },
4832 "file": "src/containers/settings/EditSettingsScreen.js", 5011 "file": "src/containers/settings/EditSettingsScreen.js",
4833 "id": "settings.app.form.navigationBarBehaviour", 5012 "id": "settings.app.form.navigationBarBehaviour",
4834 "start": { 5013 "start": {
4835 "column": 26, 5014 "column": 26,
4836 "line": 62 5015 "line": 71
4837 } 5016 }
4838 }, 5017 },
4839 { 5018 {
4840 "defaultMessage": "!!!Send telemetry data", 5019 "defaultMessage": "!!!Send telemetry data",
4841 "end": { 5020 "end": {
4842 "column": 3, 5021 "column": 3,
4843 "line": 69 5022 "line": 78
4844 }, 5023 },
4845 "file": "src/containers/settings/EditSettingsScreen.js", 5024 "file": "src/containers/settings/EditSettingsScreen.js",
4846 "id": "settings.app.form.sentry", 5025 "id": "settings.app.form.sentry",
4847 "start": { 5026 "start": {
4848 "column": 10, 5027 "column": 10,
4849 "line": 66 5028 "line": 75
4850 } 5029 }
4851 }, 5030 },
4852 { 5031 {
4853 "defaultMessage": "!!!Enable service hibernation", 5032 "defaultMessage": "!!!Enable service hibernation",
4854 "end": { 5033 "end": {
4855 "column": 3, 5034 "column": 3,
4856 "line": 73 5035 "line": 82
4857 }, 5036 },
4858 "file": "src/containers/settings/EditSettingsScreen.js", 5037 "file": "src/containers/settings/EditSettingsScreen.js",
4859 "id": "settings.app.form.hibernate", 5038 "id": "settings.app.form.hibernate",
4860 "start": { 5039 "start": {
4861 "column": 13, 5040 "column": 13,
4862 "line": 70 5041 "line": 79
4863 } 5042 }
4864 }, 5043 },
4865 { 5044 {
4866 "defaultMessage": "!!!Keep services in hibernation on startup", 5045 "defaultMessage": "!!!Keep services in hibernation on startup",
4867 "end": { 5046 "end": {
4868 "column": 3, 5047 "column": 3,
4869 "line": 77 5048 "line": 86
4870 }, 5049 },
4871 "file": "src/containers/settings/EditSettingsScreen.js", 5050 "file": "src/containers/settings/EditSettingsScreen.js",
4872 "id": "settings.app.form.hibernateOnStartup", 5051 "id": "settings.app.form.hibernateOnStartup",
4873 "start": { 5052 "start": {
4874 "column": 22, 5053 "column": 22,
4875 "line": 74 5054 "line": 83
4876 } 5055 }
4877 }, 5056 },
4878 { 5057 {
4879 "defaultMessage": "!!!Hibernation strategy", 5058 "defaultMessage": "!!!Hibernation strategy",
4880 "end": { 5059 "end": {
4881 "column": 3, 5060 "column": 3,
4882 "line": 81 5061 "line": 90
4883 }, 5062 },
4884 "file": "src/containers/settings/EditSettingsScreen.js", 5063 "file": "src/containers/settings/EditSettingsScreen.js",
4885 "id": "settings.app.form.hibernationStrategy", 5064 "id": "settings.app.form.hibernationStrategy",
4886 "start": { 5065 "start": {
4887 "column": 23, 5066 "column": 23,
4888 "line": 78 5067 "line": 87
4889 } 5068 }
4890 }, 5069 },
4891 { 5070 {
4892 "defaultMessage": "!!!Todo Server", 5071 "defaultMessage": "!!!Todo Server",
4893 "end": { 5072 "end": {
4894 "column": 3, 5073 "column": 3,
4895 "line": 85 5074 "line": 94
4896 }, 5075 },
4897 "file": "src/containers/settings/EditSettingsScreen.js", 5076 "file": "src/containers/settings/EditSettingsScreen.js",
4898 "id": "settings.app.form.predefinedTodoServer", 5077 "id": "settings.app.form.predefinedTodoServer",
4899 "start": { 5078 "start": {
4900 "column": 24, 5079 "column": 24,
4901 "line": 82 5080 "line": 91
4902 } 5081 }
4903 }, 5082 },
4904 { 5083 {
4905 "defaultMessage": "!!!Custom TodoServer", 5084 "defaultMessage": "!!!Custom TodoServer",
4906 "end": { 5085 "end": {
4907 "column": 3, 5086 "column": 3,
4908 "line": 89 5087 "line": 98
4909 }, 5088 },
4910 "file": "src/containers/settings/EditSettingsScreen.js", 5089 "file": "src/containers/settings/EditSettingsScreen.js",
4911 "id": "settings.app.form.customTodoServer", 5090 "id": "settings.app.form.customTodoServer",
4912 "start": { 5091 "start": {
4913 "column": 20, 5092 "column": 20,
4914 "line": 86 5093 "line": 95
4915 } 5094 }
4916 }, 5095 },
4917 { 5096 {
4918 "defaultMessage": "!!!Enable Password Lock", 5097 "defaultMessage": "!!!Enable Password Lock",
4919 "end": { 5098 "end": {
4920 "column": 3, 5099 "column": 3,
4921 "line": 93 5100 "line": 102
4922 }, 5101 },
4923 "file": "src/containers/settings/EditSettingsScreen.js", 5102 "file": "src/containers/settings/EditSettingsScreen.js",
4924 "id": "settings.app.form.enableLock", 5103 "id": "settings.app.form.enableLock",
4925 "start": { 5104 "start": {
4926 "column": 14, 5105 "column": 14,
4927 "line": 90 5106 "line": 99
4928 } 5107 }
4929 }, 5108 },
4930 { 5109 {
4931 "defaultMessage": "!!!Password", 5110 "defaultMessage": "!!!Password",
4932 "end": { 5111 "end": {
4933 "column": 3, 5112 "column": 3,
4934 "line": 97 5113 "line": 106
4935 }, 5114 },
4936 "file": "src/containers/settings/EditSettingsScreen.js", 5115 "file": "src/containers/settings/EditSettingsScreen.js",
4937 "id": "settings.app.form.lockPassword", 5116 "id": "settings.app.form.lockPassword",
4938 "start": { 5117 "start": {
4939 "column": 16, 5118 "column": 16,
4940 "line": 94 5119 "line": 103
4941 } 5120 }
4942 }, 5121 },
4943 { 5122 {
4944 "defaultMessage": "!!!Allow using Touch ID to unlock", 5123 "defaultMessage": "!!!Allow using Touch ID to unlock",
4945 "end": { 5124 "end": {
4946 "column": 3, 5125 "column": 3,
4947 "line": 101 5126 "line": 110
4948 }, 5127 },
4949 "file": "src/containers/settings/EditSettingsScreen.js", 5128 "file": "src/containers/settings/EditSettingsScreen.js",
4950 "id": "settings.app.form.useTouchIdToUnlock", 5129 "id": "settings.app.form.useTouchIdToUnlock",
4951 "start": { 5130 "start": {
4952 "column": 22, 5131 "column": 22,
4953 "line": 98 5132 "line": 107
4954 } 5133 }
4955 }, 5134 },
4956 { 5135 {
4957 "defaultMessage": "!!!Lock after inactivity", 5136 "defaultMessage": "!!!Lock after inactivity",
4958 "end": { 5137 "end": {
4959 "column": 3, 5138 "column": 3,
4960 "line": 105 5139 "line": 114
4961 }, 5140 },
4962 "file": "src/containers/settings/EditSettingsScreen.js", 5141 "file": "src/containers/settings/EditSettingsScreen.js",
4963 "id": "settings.app.form.inactivityLock", 5142 "id": "settings.app.form.inactivityLock",
4964 "start": { 5143 "start": {
4965 "column": 18, 5144 "column": 18,
4966 "line": 102 5145 "line": 111
4967 } 5146 }
4968 }, 5147 },
4969 { 5148 {
4970 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 5149 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
4971 "end": { 5150 "end": {
4972 "column": 3, 5151 "column": 3,
4973 "line": 109 5152 "line": 118
4974 }, 5153 },
4975 "file": "src/containers/settings/EditSettingsScreen.js", 5154 "file": "src/containers/settings/EditSettingsScreen.js",
4976 "id": "settings.app.form.scheduledDNDEnabled", 5155 "id": "settings.app.form.scheduledDNDEnabled",
4977 "start": { 5156 "start": {
4978 "column": 23, 5157 "column": 23,
4979 "line": 106 5158 "line": 115
4980 } 5159 }
4981 }, 5160 },
4982 { 5161 {
4983 "defaultMessage": "!!!From", 5162 "defaultMessage": "!!!From",
4984 "end": { 5163 "end": {
4985 "column": 3, 5164 "column": 3,
4986 "line": 113 5165 "line": 122
4987 }, 5166 },
4988 "file": "src/containers/settings/EditSettingsScreen.js", 5167 "file": "src/containers/settings/EditSettingsScreen.js",
4989 "id": "settings.app.form.scheduledDNDStart", 5168 "id": "settings.app.form.scheduledDNDStart",
4990 "start": { 5169 "start": {
4991 "column": 21, 5170 "column": 21,
4992 "line": 110 5171 "line": 119
4993 } 5172 }
4994 }, 5173 },
4995 { 5174 {
4996 "defaultMessage": "!!!To", 5175 "defaultMessage": "!!!To",
4997 "end": { 5176 "end": {
4998 "column": 3, 5177 "column": 3,
4999 "line": 117 5178 "line": 126
5000 }, 5179 },
5001 "file": "src/containers/settings/EditSettingsScreen.js", 5180 "file": "src/containers/settings/EditSettingsScreen.js",
5002 "id": "settings.app.form.scheduledDNDEnd", 5181 "id": "settings.app.form.scheduledDNDEnd",
5003 "start": { 5182 "start": {
5004 "column": 19, 5183 "column": 19,
5005 "line": 114 5184 "line": 123
5006 } 5185 }
5007 }, 5186 },
5008 { 5187 {
5009 "defaultMessage": "!!!Language", 5188 "defaultMessage": "!!!Language",
5010 "end": { 5189 "end": {
5011 "column": 3, 5190 "column": 3,
5012 "line": 121 5191 "line": 130
5013 }, 5192 },
5014 "file": "src/containers/settings/EditSettingsScreen.js", 5193 "file": "src/containers/settings/EditSettingsScreen.js",
5015 "id": "settings.app.form.language", 5194 "id": "settings.app.form.language",
5016 "start": { 5195 "start": {
5017 "column": 12, 5196 "column": 12,
5018 "line": 118 5197 "line": 127
5019 } 5198 }
5020 }, 5199 },
5021 { 5200 {
5022 "defaultMessage": "!!!Dark Mode", 5201 "defaultMessage": "!!!Dark Mode",
5023 "end": { 5202 "end": {
5024 "column": 3, 5203 "column": 3,
5025 "line": 125 5204 "line": 134
5026 }, 5205 },
5027 "file": "src/containers/settings/EditSettingsScreen.js", 5206 "file": "src/containers/settings/EditSettingsScreen.js",
5028 "id": "settings.app.form.darkMode", 5207 "id": "settings.app.form.darkMode",
5029 "start": { 5208 "start": {
5030 "column": 12, 5209 "column": 12,
5031 "line": 122 5210 "line": 131
5032 } 5211 }
5033 }, 5212 },
5034 { 5213 {
5035 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 5214 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
5036 "end": { 5215 "end": {
5037 "column": 3, 5216 "column": 3,
5038 "line": 129 5217 "line": 138
5039 }, 5218 },
5040 "file": "src/containers/settings/EditSettingsScreen.js", 5219 "file": "src/containers/settings/EditSettingsScreen.js",
5041 "id": "settings.app.form.adaptableDarkMode", 5220 "id": "settings.app.form.adaptableDarkMode",
5042 "start": { 5221 "start": {
5043 "column": 21, 5222 "column": 21,
5044 "line": 126 5223 "line": 135
5045 } 5224 }
5046 }, 5225 },
5047 { 5226 {
5048 "defaultMessage": "!!!Enable universal Dark Mode", 5227 "defaultMessage": "!!!Enable universal Dark Mode",
5049 "end": { 5228 "end": {
5050 "column": 3, 5229 "column": 3,
5051 "line": 133 5230 "line": 142
5052 }, 5231 },
5053 "file": "src/containers/settings/EditSettingsScreen.js", 5232 "file": "src/containers/settings/EditSettingsScreen.js",
5054 "id": "settings.app.form.universalDarkMode", 5233 "id": "settings.app.form.universalDarkMode",
5055 "start": { 5234 "start": {
5056 "column": 21, 5235 "column": 21,
5057 "line": 130 5236 "line": 139
5058 } 5237 }
5059 }, 5238 },
5060 { 5239 {
5061 "defaultMessage": "!!!Sidebar width", 5240 "defaultMessage": "!!!Sidebar width",
5062 "end": { 5241 "end": {
5063 "column": 3, 5242 "column": 3,
5064 "line": 137 5243 "line": 146
5065 }, 5244 },
5066 "file": "src/containers/settings/EditSettingsScreen.js", 5245 "file": "src/containers/settings/EditSettingsScreen.js",
5067 "id": "settings.app.form.serviceRibbonWidth", 5246 "id": "settings.app.form.serviceRibbonWidth",
5068 "start": { 5247 "start": {
5069 "column": 22, 5248 "column": 22,
5070 "line": 134 5249 "line": 143
5071 } 5250 }
5072 }, 5251 },
5073 { 5252 {
5074 "defaultMessage": "!!!Service icon size", 5253 "defaultMessage": "!!!Service icon size",
5075 "end": { 5254 "end": {
5076 "column": 3, 5255 "column": 3,
5077 "line": 141 5256 "line": 150
5078 }, 5257 },
5079 "file": "src/containers/settings/EditSettingsScreen.js", 5258 "file": "src/containers/settings/EditSettingsScreen.js",
5080 "id": "settings.app.form.iconSize", 5259 "id": "settings.app.form.iconSize",
5081 "start": { 5260 "start": {
5082 "column": 12, 5261 "column": 12,
5083 "line": 138 5262 "line": 147
5084 } 5263 }
5085 }, 5264 },
5086 { 5265 {
5087 "defaultMessage": "!!!Use vertical style", 5266 "defaultMessage": "!!!Use vertical style",
5088 "end": { 5267 "end": {
5089 "column": 3, 5268 "column": 3,
5090 "line": 145 5269 "line": 154
5091 }, 5270 },
5092 "file": "src/containers/settings/EditSettingsScreen.js", 5271 "file": "src/containers/settings/EditSettingsScreen.js",
5093 "id": "settings.app.form.useVerticalStyle", 5272 "id": "settings.app.form.useVerticalStyle",
5094 "start": { 5273 "start": {
5095 "column": 20, 5274 "column": 20,
5096 "line": 142 5275 "line": 151
5097 } 5276 }
5098 }, 5277 },
5099 { 5278 {
5100 "defaultMessage": "!!!Always show workspace drawer", 5279 "defaultMessage": "!!!Always show workspace drawer",
5101 "end": { 5280 "end": {
5102 "column": 3, 5281 "column": 3,
5103 "line": 149 5282 "line": 158
5104 }, 5283 },
5105 "file": "src/containers/settings/EditSettingsScreen.js", 5284 "file": "src/containers/settings/EditSettingsScreen.js",
5106 "id": "settings.app.form.alwaysShowWorkspaces", 5285 "id": "settings.app.form.alwaysShowWorkspaces",
5107 "start": { 5286 "start": {
5108 "column": 24, 5287 "column": 24,
5109 "line": 146 5288 "line": 155
5110 } 5289 }
5111 }, 5290 },
5112 { 5291 {
5113 "defaultMessage": "!!!Accent color", 5292 "defaultMessage": "!!!Accent color",
5114 "end": { 5293 "end": {
5115 "column": 3, 5294 "column": 3,
5116 "line": 153 5295 "line": 162
5117 }, 5296 },
5118 "file": "src/containers/settings/EditSettingsScreen.js", 5297 "file": "src/containers/settings/EditSettingsScreen.js",
5119 "id": "settings.app.form.accentColor", 5298 "id": "settings.app.form.accentColor",
5120 "start": { 5299 "start": {
5121 "column": 15, 5300 "column": 15,
5122 "line": 150 5301 "line": 159
5123 } 5302 }
5124 }, 5303 },
5125 { 5304 {
5126 "defaultMessage": "!!!Display disabled services tabs", 5305 "defaultMessage": "!!!Display disabled services tabs",
5127 "end": { 5306 "end": {
5128 "column": 3, 5307 "column": 3,
5129 "line": 157 5308 "line": 166
5130 }, 5309 },
5131 "file": "src/containers/settings/EditSettingsScreen.js", 5310 "file": "src/containers/settings/EditSettingsScreen.js",
5132 "id": "settings.app.form.showDisabledServices", 5311 "id": "settings.app.form.showDisabledServices",
5133 "start": { 5312 "start": {
5134 "column": 24, 5313 "column": 24,
5135 "line": 154 5314 "line": 163
5136 } 5315 }
5137 }, 5316 },
5138 { 5317 {
5139 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 5318 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
5140 "end": { 5319 "end": {
5141 "column": 3, 5320 "column": 3,
5142 "line": 161 5321 "line": 170
5143 }, 5322 },
5144 "file": "src/containers/settings/EditSettingsScreen.js", 5323 "file": "src/containers/settings/EditSettingsScreen.js",
5145 "id": "settings.app.form.showMessagesBadgesWhenMuted", 5324 "id": "settings.app.form.showMessagesBadgesWhenMuted",
5146 "start": { 5325 "start": {
5147 "column": 29, 5326 "column": 29,
5148 "line": 158 5327 "line": 167
5149 } 5328 }
5150 }, 5329 },
5151 { 5330 {
5152 "defaultMessage": "!!!Show draggable area on window", 5331 "defaultMessage": "!!!Show draggable area on window",
5153 "end": { 5332 "end": {
5154 "column": 3, 5333 "column": 3,
5155 "line": 165 5334 "line": 174
5156 }, 5335 },
5157 "file": "src/containers/settings/EditSettingsScreen.js", 5336 "file": "src/containers/settings/EditSettingsScreen.js",
5158 "id": "settings.app.form.showDragArea", 5337 "id": "settings.app.form.showDragArea",
5159 "start": { 5338 "start": {
5160 "column": 16, 5339 "column": 16,
5161 "line": 162 5340 "line": 171
5162 } 5341 }
5163 }, 5342 },
5164 { 5343 {
5165 "defaultMessage": "!!!Enable spell checking", 5344 "defaultMessage": "!!!Enable spell checking",
5166 "end": { 5345 "end": {
5167 "column": 3, 5346 "column": 3,
5168 "line": 169 5347 "line": 178
5169 }, 5348 },
5170 "file": "src/containers/settings/EditSettingsScreen.js", 5349 "file": "src/containers/settings/EditSettingsScreen.js",
5171 "id": "settings.app.form.enableSpellchecking", 5350 "id": "settings.app.form.enableSpellchecking",
5172 "start": { 5351 "start": {
5173 "column": 23, 5352 "column": 23,
5174 "line": 166 5353 "line": 175
5175 } 5354 }
5176 }, 5355 },
5177 { 5356 {
5178 "defaultMessage": "!!!Enable GPU Acceleration", 5357 "defaultMessage": "!!!Enable GPU Acceleration",
5179 "end": { 5358 "end": {
5180 "column": 3, 5359 "column": 3,
5181 "line": 173 5360 "line": 182
5182 }, 5361 },
5183 "file": "src/containers/settings/EditSettingsScreen.js", 5362 "file": "src/containers/settings/EditSettingsScreen.js",
5184 "id": "settings.app.form.enableGPUAcceleration", 5363 "id": "settings.app.form.enableGPUAcceleration",
5185 "start": { 5364 "start": {
5186 "column": 25, 5365 "column": 25,
5187 "line": 170 5366 "line": 179
5188 } 5367 }
5189 }, 5368 },
5190 { 5369 {
5191 "defaultMessage": "!!!Include beta versions", 5370 "defaultMessage": "!!!Include beta versions",
5192 "end": { 5371 "end": {
5193 "column": 3, 5372 "column": 3,
5194 "line": 177 5373 "line": 186
5195 }, 5374 },
5196 "file": "src/containers/settings/EditSettingsScreen.js", 5375 "file": "src/containers/settings/EditSettingsScreen.js",
5197 "id": "settings.app.form.beta", 5376 "id": "settings.app.form.beta",
5198 "start": { 5377 "start": {
5199 "column": 8, 5378 "column": 8,
5200 "line": 174 5379 "line": 183
5201 } 5380 }
5202 }, 5381 },
5203 { 5382 {
5204 "defaultMessage": "!!!Enable updates", 5383 "defaultMessage": "!!!Enable updates",
5205 "end": { 5384 "end": {
5206 "column": 3, 5385 "column": 3,
5207 "line": 181 5386 "line": 190
5208 }, 5387 },
5209 "file": "src/containers/settings/EditSettingsScreen.js", 5388 "file": "src/containers/settings/EditSettingsScreen.js",
5210 "id": "settings.app.form.automaticUpdates", 5389 "id": "settings.app.form.automaticUpdates",
5211 "start": { 5390 "start": {
5212 "column": 20, 5391 "column": 20,
5213 "line": 178 5392 "line": 187
5214 } 5393 }
5215 }, 5394 },
5216 { 5395 {
5217 "defaultMessage": "!!!Enable Franz Todos", 5396 "defaultMessage": "!!!Enable Franz Todos",
5218 "end": { 5397 "end": {
5219 "column": 3, 5398 "column": 3,
5220 "line": 185 5399 "line": 194
5221 }, 5400 },
5222 "file": "src/containers/settings/EditSettingsScreen.js", 5401 "file": "src/containers/settings/EditSettingsScreen.js",
5223 "id": "settings.app.form.enableTodos", 5402 "id": "settings.app.form.enableTodos",
5224 "start": { 5403 "start": {
5225 "column": 15, 5404 "column": 15,
5226 "line": 182 5405 "line": 191
5227 } 5406 }
5228 }, 5407 },
5229 { 5408 {
5230 "defaultMessage": "!!!Keep all workspaces loaded", 5409 "defaultMessage": "!!!Keep all workspaces loaded",
5231 "end": { 5410 "end": {
5232 "column": 3, 5411 "column": 3,
5233 "line": 189 5412 "line": 198
5234 }, 5413 },
5235 "file": "src/containers/settings/EditSettingsScreen.js", 5414 "file": "src/containers/settings/EditSettingsScreen.js",
5236 "id": "settings.app.form.keepAllWorkspacesLoaded", 5415 "id": "settings.app.form.keepAllWorkspacesLoaded",
5237 "start": { 5416 "start": {
5238 "column": 27, 5417 "column": 27,
5239 "line": 186 5418 "line": 195
5240 } 5419 }
5241 } 5420 }
5242 ], 5421 ],
@@ -6181,39 +6360,39 @@
6181 "defaultMessage": "!!!Franz Todos are available to premium users now!", 6360 "defaultMessage": "!!!Franz Todos are available to premium users now!",
6182 "end": { 6361 "end": {
6183 "column": 3, 6362 "column": 3,
6184 "line": 34 6363 "line": 36
6185 }, 6364 },
6186 "file": "src/features/todos/components/TodosWebview.js", 6365 "file": "src/features/todos/components/TodosWebview.js",
6187 "id": "feature.todos.premium.info", 6366 "id": "feature.todos.premium.info",
6188 "start": { 6367 "start": {
6189 "column": 15, 6368 "column": 15,
6190 "line": 31 6369 "line": 33
6191 } 6370 }
6192 }, 6371 },
6193 { 6372 {
6194 "defaultMessage": "!!!Upgrade Account", 6373 "defaultMessage": "!!!Upgrade Account",
6195 "end": { 6374 "end": {
6196 "column": 3, 6375 "column": 3,
6197 "line": 38 6376 "line": 40
6198 }, 6377 },
6199 "file": "src/features/todos/components/TodosWebview.js", 6378 "file": "src/features/todos/components/TodosWebview.js",
6200 "id": "feature.todos.premium.upgrade", 6379 "id": "feature.todos.premium.upgrade",
6201 "start": { 6380 "start": {
6202 "column": 14, 6381 "column": 14,
6203 "line": 35 6382 "line": 37
6204 } 6383 }
6205 }, 6384 },
6206 { 6385 {
6207 "defaultMessage": "!!!Everyone else will have to wait a little longer.", 6386 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
6208 "end": { 6387 "end": {
6209 "column": 3, 6388 "column": 3,
6210 "line": 42 6389 "line": 44
6211 }, 6390 },
6212 "file": "src/features/todos/components/TodosWebview.js", 6391 "file": "src/features/todos/components/TodosWebview.js",
6213 "id": "feature.todos.premium.rollout", 6392 "id": "feature.todos.premium.rollout",
6214 "start": { 6393 "start": {
6215 "column": 15, 6394 "column": 15,
6216 "line": 39 6395 "line": 41
6217 } 6396 }
6218 } 6397 }
6219 ], 6398 ],
@@ -7522,549 +7701,562 @@
7522 } 7701 }
7523 }, 7702 },
7524 { 7703 {
7525 "defaultMessage": "!!!Minimize", 7704 "defaultMessage": "!!!Reload ToDos",
7526 "end": { 7705 "end": {
7527 "column": 3, 7706 "column": 3,
7528 "line": 145 7707 "line": 145
7529 }, 7708 },
7530 "file": "src/lib/Menu.js", 7709 "file": "src/lib/Menu.js",
7710 "id": "menu.view.reloadTodos",
7711 "start": {
7712 "column": 15,
7713 "line": 142
7714 }
7715 },
7716 {
7717 "defaultMessage": "!!!Minimize",
7718 "end": {
7719 "column": 3,
7720 "line": 149
7721 },
7722 "file": "src/lib/Menu.js",
7531 "id": "menu.window.minimize", 7723 "id": "menu.window.minimize",
7532 "start": { 7724 "start": {
7533 "column": 12, 7725 "column": 12,
7534 "line": 142 7726 "line": 146
7535 } 7727 }
7536 }, 7728 },
7537 { 7729 {
7538 "defaultMessage": "!!!Close", 7730 "defaultMessage": "!!!Close",
7539 "end": { 7731 "end": {
7540 "column": 3, 7732 "column": 3,
7541 "line": 149 7733 "line": 153
7542 }, 7734 },
7543 "file": "src/lib/Menu.js", 7735 "file": "src/lib/Menu.js",
7544 "id": "menu.window.close", 7736 "id": "menu.window.close",
7545 "start": { 7737 "start": {
7546 "column": 9, 7738 "column": 9,
7547 "line": 146 7739 "line": 150
7548 } 7740 }
7549 }, 7741 },
7550 { 7742 {
7551 "defaultMessage": "!!!Learn More", 7743 "defaultMessage": "!!!Learn More",
7552 "end": { 7744 "end": {
7553 "column": 3, 7745 "column": 3,
7554 "line": 153 7746 "line": 157
7555 }, 7747 },
7556 "file": "src/lib/Menu.js", 7748 "file": "src/lib/Menu.js",
7557 "id": "menu.help.learnMore", 7749 "id": "menu.help.learnMore",
7558 "start": { 7750 "start": {
7559 "column": 13, 7751 "column": 13,
7560 "line": 150 7752 "line": 154
7561 } 7753 }
7562 }, 7754 },
7563 { 7755 {
7564 "defaultMessage": "!!!Changelog", 7756 "defaultMessage": "!!!Changelog",
7565 "end": { 7757 "end": {
7566 "column": 3, 7758 "column": 3,
7567 "line": 157 7759 "line": 161
7568 }, 7760 },
7569 "file": "src/lib/Menu.js", 7761 "file": "src/lib/Menu.js",
7570 "id": "menu.help.changelog", 7762 "id": "menu.help.changelog",
7571 "start": { 7763 "start": {
7572 "column": 13, 7764 "column": 13,
7573 "line": 154 7765 "line": 158
7574 } 7766 }
7575 }, 7767 },
7576 { 7768 {
7577 "defaultMessage": "!!!Support", 7769 "defaultMessage": "!!!Support",
7578 "end": { 7770 "end": {
7579 "column": 3, 7771 "column": 3,
7580 "line": 161 7772 "line": 165
7581 }, 7773 },
7582 "file": "src/lib/Menu.js", 7774 "file": "src/lib/Menu.js",
7583 "id": "menu.help.support", 7775 "id": "menu.help.support",
7584 "start": { 7776 "start": {
7585 "column": 11, 7777 "column": 11,
7586 "line": 158 7778 "line": 162
7587 } 7779 }
7588 }, 7780 },
7589 { 7781 {
7590 "defaultMessage": "!!!Copy Debug Information", 7782 "defaultMessage": "!!!Copy Debug Information",
7591 "end": { 7783 "end": {
7592 "column": 3, 7784 "column": 3,
7593 "line": 165 7785 "line": 169
7594 }, 7786 },
7595 "file": "src/lib/Menu.js", 7787 "file": "src/lib/Menu.js",
7596 "id": "menu.help.debugInfo", 7788 "id": "menu.help.debugInfo",
7597 "start": { 7789 "start": {
7598 "column": 13, 7790 "column": 13,
7599 "line": 162 7791 "line": 166
7600 } 7792 }
7601 }, 7793 },
7602 { 7794 {
7603 "defaultMessage": "!!!Publish Debug Information", 7795 "defaultMessage": "!!!Publish Debug Information",
7604 "end": { 7796 "end": {
7605 "column": 3, 7797 "column": 3,
7606 "line": 169 7798 "line": 173
7607 }, 7799 },
7608 "file": "src/lib/Menu.js", 7800 "file": "src/lib/Menu.js",
7609 "id": "menu.help.publishDebugInfo", 7801 "id": "menu.help.publishDebugInfo",
7610 "start": { 7802 "start": {
7611 "column": 20, 7803 "column": 20,
7612 "line": 166 7804 "line": 170
7613 } 7805 }
7614 }, 7806 },
7615 { 7807 {
7616 "defaultMessage": "!!!Ferdi Debug Information", 7808 "defaultMessage": "!!!Ferdi Debug Information",
7617 "end": { 7809 "end": {
7618 "column": 3, 7810 "column": 3,
7619 "line": 173 7811 "line": 177
7620 }, 7812 },
7621 "file": "src/lib/Menu.js", 7813 "file": "src/lib/Menu.js",
7622 "id": "menu.help.debugInfoCopiedHeadline", 7814 "id": "menu.help.debugInfoCopiedHeadline",
7623 "start": { 7815 "start": {
7624 "column": 27, 7816 "column": 27,
7625 "line": 170 7817 "line": 174
7626 } 7818 }
7627 }, 7819 },
7628 { 7820 {
7629 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 7821 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
7630 "end": { 7822 "end": {
7631 "column": 3, 7823 "column": 3,
7632 "line": 177 7824 "line": 181
7633 }, 7825 },
7634 "file": "src/lib/Menu.js", 7826 "file": "src/lib/Menu.js",
7635 "id": "menu.help.debugInfoCopiedBody", 7827 "id": "menu.help.debugInfoCopiedBody",
7636 "start": { 7828 "start": {
7637 "column": 23, 7829 "column": 23,
7638 "line": 174 7830 "line": 178
7639 } 7831 }
7640 }, 7832 },
7641 { 7833 {
7642 "defaultMessage": "!!!Unlock with Touch ID", 7834 "defaultMessage": "!!!Unlock with Touch ID",
7643 "end": { 7835 "end": {
7644 "column": 3, 7836 "column": 3,
7645 "line": 181 7837 "line": 185
7646 }, 7838 },
7647 "file": "src/lib/Menu.js", 7839 "file": "src/lib/Menu.js",
7648 "id": "locked.touchId", 7840 "id": "locked.touchId",
7649 "start": { 7841 "start": {
7650 "column": 11, 7842 "column": 11,
7651 "line": 178 7843 "line": 182
7652 } 7844 }
7653 }, 7845 },
7654 { 7846 {
7655 "defaultMessage": "!!!unlock via Touch ID", 7847 "defaultMessage": "!!!unlock via Touch ID",
7656 "end": { 7848 "end": {
7657 "column": 3, 7849 "column": 3,
7658 "line": 185 7850 "line": 189
7659 }, 7851 },
7660 "file": "src/lib/Menu.js", 7852 "file": "src/lib/Menu.js",
7661 "id": "locked.touchIdPrompt", 7853 "id": "locked.touchIdPrompt",
7662 "start": { 7854 "start": {
7663 "column": 17, 7855 "column": 17,
7664 "line": 182 7856 "line": 186
7665 } 7857 }
7666 }, 7858 },
7667 { 7859 {
7668 "defaultMessage": "!!!Terms of Service", 7860 "defaultMessage": "!!!Terms of Service",
7669 "end": { 7861 "end": {
7670 "column": 3, 7862 "column": 3,
7671 "line": 189 7863 "line": 193
7672 }, 7864 },
7673 "file": "src/lib/Menu.js", 7865 "file": "src/lib/Menu.js",
7674 "id": "menu.help.tos", 7866 "id": "menu.help.tos",
7675 "start": { 7867 "start": {
7676 "column": 7, 7868 "column": 7,
7677 "line": 186 7869 "line": 190
7678 } 7870 }
7679 }, 7871 },
7680 { 7872 {
7681 "defaultMessage": "!!!Privacy Statement", 7873 "defaultMessage": "!!!Privacy Statement",
7682 "end": { 7874 "end": {
7683 "column": 3, 7875 "column": 3,
7684 "line": 193 7876 "line": 197
7685 }, 7877 },
7686 "file": "src/lib/Menu.js", 7878 "file": "src/lib/Menu.js",
7687 "id": "menu.help.privacy", 7879 "id": "menu.help.privacy",
7688 "start": { 7880 "start": {
7689 "column": 11, 7881 "column": 11,
7690 "line": 190 7882 "line": 194
7691 } 7883 }
7692 }, 7884 },
7693 { 7885 {
7694 "defaultMessage": "!!!File", 7886 "defaultMessage": "!!!File",
7695 "end": { 7887 "end": {
7696 "column": 3, 7888 "column": 3,
7697 "line": 197 7889 "line": 201
7698 }, 7890 },
7699 "file": "src/lib/Menu.js", 7891 "file": "src/lib/Menu.js",
7700 "id": "menu.file", 7892 "id": "menu.file",
7701 "start": { 7893 "start": {
7702 "column": 8, 7894 "column": 8,
7703 "line": 194 7895 "line": 198
7704 } 7896 }
7705 }, 7897 },
7706 { 7898 {
7707 "defaultMessage": "!!!View", 7899 "defaultMessage": "!!!View",
7708 "end": { 7900 "end": {
7709 "column": 3, 7901 "column": 3,
7710 "line": 201 7902 "line": 205
7711 }, 7903 },
7712 "file": "src/lib/Menu.js", 7904 "file": "src/lib/Menu.js",
7713 "id": "menu.view", 7905 "id": "menu.view",
7714 "start": { 7906 "start": {
7715 "column": 8, 7907 "column": 8,
7716 "line": 198 7908 "line": 202
7717 } 7909 }
7718 }, 7910 },
7719 { 7911 {
7720 "defaultMessage": "!!!Services", 7912 "defaultMessage": "!!!Services",
7721 "end": { 7913 "end": {
7722 "column": 3, 7914 "column": 3,
7723 "line": 205 7915 "line": 209
7724 }, 7916 },
7725 "file": "src/lib/Menu.js", 7917 "file": "src/lib/Menu.js",
7726 "id": "menu.services", 7918 "id": "menu.services",
7727 "start": { 7919 "start": {
7728 "column": 12, 7920 "column": 12,
7729 "line": 202 7921 "line": 206
7730 } 7922 }
7731 }, 7923 },
7732 { 7924 {
7733 "defaultMessage": "!!!Window", 7925 "defaultMessage": "!!!Window",
7734 "end": { 7926 "end": {
7735 "column": 3, 7927 "column": 3,
7736 "line": 209 7928 "line": 213
7737 }, 7929 },
7738 "file": "src/lib/Menu.js", 7930 "file": "src/lib/Menu.js",
7739 "id": "menu.window", 7931 "id": "menu.window",
7740 "start": { 7932 "start": {
7741 "column": 10, 7933 "column": 10,
7742 "line": 206 7934 "line": 210
7743 } 7935 }
7744 }, 7936 },
7745 { 7937 {
7746 "defaultMessage": "!!!Help", 7938 "defaultMessage": "!!!Help",
7747 "end": { 7939 "end": {
7748 "column": 3, 7940 "column": 3,
7749 "line": 213 7941 "line": 217
7750 }, 7942 },
7751 "file": "src/lib/Menu.js", 7943 "file": "src/lib/Menu.js",
7752 "id": "menu.help", 7944 "id": "menu.help",
7753 "start": { 7945 "start": {
7754 "column": 8, 7946 "column": 8,
7755 "line": 210 7947 "line": 214
7756 } 7948 }
7757 }, 7949 },
7758 { 7950 {
7759 "defaultMessage": "!!!About Ferdi", 7951 "defaultMessage": "!!!About Ferdi",
7760 "end": { 7952 "end": {
7761 "column": 3, 7953 "column": 3,
7762 "line": 217 7954 "line": 221
7763 }, 7955 },
7764 "file": "src/lib/Menu.js", 7956 "file": "src/lib/Menu.js",
7765 "id": "menu.app.about", 7957 "id": "menu.app.about",
7766 "start": { 7958 "start": {
7767 "column": 9, 7959 "column": 9,
7768 "line": 214 7960 "line": 218
7769 } 7961 }
7770 }, 7962 },
7771 { 7963 {
7772 "defaultMessage": "!!!What's new?", 7964 "defaultMessage": "!!!What's new?",
7773 "end": { 7965 "end": {
7774 "column": 3, 7966 "column": 3,
7775 "line": 221 7967 "line": 225
7776 }, 7968 },
7777 "file": "src/lib/Menu.js", 7969 "file": "src/lib/Menu.js",
7778 "id": "menu.app.announcement", 7970 "id": "menu.app.announcement",
7779 "start": { 7971 "start": {
7780 "column": 16, 7972 "column": 16,
7781 "line": 218 7973 "line": 222
7782 } 7974 }
7783 }, 7975 },
7784 { 7976 {
7785 "defaultMessage": "!!!Settings", 7977 "defaultMessage": "!!!Settings",
7786 "end": { 7978 "end": {
7787 "column": 3, 7979 "column": 3,
7788 "line": 225 7980 "line": 229
7789 }, 7981 },
7790 "file": "src/lib/Menu.js", 7982 "file": "src/lib/Menu.js",
7791 "id": "menu.app.settings", 7983 "id": "menu.app.settings",
7792 "start": { 7984 "start": {
7793 "column": 12, 7985 "column": 12,
7794 "line": 222 7986 "line": 226
7795 } 7987 }
7796 }, 7988 },
7797 { 7989 {
7798 "defaultMessage": "!!!Check for updates", 7990 "defaultMessage": "!!!Check for updates",
7799 "end": { 7991 "end": {
7800 "column": 3, 7992 "column": 3,
7801 "line": 229 7993 "line": 233
7802 }, 7994 },
7803 "file": "src/lib/Menu.js", 7995 "file": "src/lib/Menu.js",
7804 "id": "menu.app.checkForUpdates", 7996 "id": "menu.app.checkForUpdates",
7805 "start": { 7997 "start": {
7806 "column": 19, 7998 "column": 19,
7807 "line": 226 7999 "line": 230
7808 } 8000 }
7809 }, 8001 },
7810 { 8002 {
7811 "defaultMessage": "!!!Hide", 8003 "defaultMessage": "!!!Hide",
7812 "end": { 8004 "end": {
7813 "column": 3, 8005 "column": 3,
7814 "line": 233 8006 "line": 237
7815 }, 8007 },
7816 "file": "src/lib/Menu.js", 8008 "file": "src/lib/Menu.js",
7817 "id": "menu.app.hide", 8009 "id": "menu.app.hide",
7818 "start": { 8010 "start": {
7819 "column": 8, 8011 "column": 8,
7820 "line": 230 8012 "line": 234
7821 } 8013 }
7822 }, 8014 },
7823 { 8015 {
7824 "defaultMessage": "!!!Hide Others", 8016 "defaultMessage": "!!!Hide Others",
7825 "end": { 8017 "end": {
7826 "column": 3, 8018 "column": 3,
7827 "line": 237 8019 "line": 241
7828 }, 8020 },
7829 "file": "src/lib/Menu.js", 8021 "file": "src/lib/Menu.js",
7830 "id": "menu.app.hideOthers", 8022 "id": "menu.app.hideOthers",
7831 "start": { 8023 "start": {
7832 "column": 14, 8024 "column": 14,
7833 "line": 234 8025 "line": 238
7834 } 8026 }
7835 }, 8027 },
7836 { 8028 {
7837 "defaultMessage": "!!!Unhide", 8029 "defaultMessage": "!!!Unhide",
7838 "end": { 8030 "end": {
7839 "column": 3, 8031 "column": 3,
7840 "line": 241 8032 "line": 245
7841 }, 8033 },
7842 "file": "src/lib/Menu.js", 8034 "file": "src/lib/Menu.js",
7843 "id": "menu.app.unhide", 8035 "id": "menu.app.unhide",
7844 "start": { 8036 "start": {
7845 "column": 10, 8037 "column": 10,
7846 "line": 238 8038 "line": 242
7847 } 8039 }
7848 }, 8040 },
7849 { 8041 {
7850 "defaultMessage": "!!!Auto-hide menu bar", 8042 "defaultMessage": "!!!Auto-hide menu bar",
7851 "end": { 8043 "end": {
7852 "column": 3, 8044 "column": 3,
7853 "line": 245 8045 "line": 249
7854 }, 8046 },
7855 "file": "src/lib/Menu.js", 8047 "file": "src/lib/Menu.js",
7856 "id": "menu.app.autohideMenuBar", 8048 "id": "menu.app.autohideMenuBar",
7857 "start": { 8049 "start": {
7858 "column": 19, 8050 "column": 19,
7859 "line": 242 8051 "line": 246
7860 } 8052 }
7861 }, 8053 },
7862 { 8054 {
7863 "defaultMessage": "!!!Quit", 8055 "defaultMessage": "!!!Quit",
7864 "end": { 8056 "end": {
7865 "column": 3, 8057 "column": 3,
7866 "line": 249 8058 "line": 253
7867 }, 8059 },
7868 "file": "src/lib/Menu.js", 8060 "file": "src/lib/Menu.js",
7869 "id": "menu.app.quit", 8061 "id": "menu.app.quit",
7870 "start": { 8062 "start": {
7871 "column": 8, 8063 "column": 8,
7872 "line": 246 8064 "line": 250
7873 } 8065 }
7874 }, 8066 },
7875 { 8067 {
7876 "defaultMessage": "!!!Add New Service...", 8068 "defaultMessage": "!!!Add New Service...",
7877 "end": { 8069 "end": {
7878 "column": 3, 8070 "column": 3,
7879 "line": 253 8071 "line": 257
7880 }, 8072 },
7881 "file": "src/lib/Menu.js", 8073 "file": "src/lib/Menu.js",
7882 "id": "menu.services.addNewService", 8074 "id": "menu.services.addNewService",
7883 "start": { 8075 "start": {
7884 "column": 17, 8076 "column": 17,
7885 "line": 250 8077 "line": 254
7886 } 8078 }
7887 }, 8079 },
7888 { 8080 {
7889 "defaultMessage": "!!!Add New Workspace...", 8081 "defaultMessage": "!!!Add New Workspace...",
7890 "end": { 8082 "end": {
7891 "column": 3, 8083 "column": 3,
7892 "line": 257 8084 "line": 261
7893 }, 8085 },
7894 "file": "src/lib/Menu.js", 8086 "file": "src/lib/Menu.js",
7895 "id": "menu.workspaces.addNewWorkspace", 8087 "id": "menu.workspaces.addNewWorkspace",
7896 "start": { 8088 "start": {
7897 "column": 19, 8089 "column": 19,
7898 "line": 254 8090 "line": 258
7899 } 8091 }
7900 }, 8092 },
7901 { 8093 {
7902 "defaultMessage": "!!!Open workspace drawer", 8094 "defaultMessage": "!!!Open workspace drawer",
7903 "end": { 8095 "end": {
7904 "column": 3, 8096 "column": 3,
7905 "line": 261 8097 "line": 265
7906 }, 8098 },
7907 "file": "src/lib/Menu.js", 8099 "file": "src/lib/Menu.js",
7908 "id": "menu.workspaces.openWorkspaceDrawer", 8100 "id": "menu.workspaces.openWorkspaceDrawer",
7909 "start": { 8101 "start": {
7910 "column": 23, 8102 "column": 23,
7911 "line": 258 8103 "line": 262
7912 } 8104 }
7913 }, 8105 },
7914 { 8106 {
7915 "defaultMessage": "!!!Close workspace drawer", 8107 "defaultMessage": "!!!Close workspace drawer",
7916 "end": { 8108 "end": {
7917 "column": 3, 8109 "column": 3,
7918 "line": 265 8110 "line": 269
7919 }, 8111 },
7920 "file": "src/lib/Menu.js", 8112 "file": "src/lib/Menu.js",
7921 "id": "menu.workspaces.closeWorkspaceDrawer", 8113 "id": "menu.workspaces.closeWorkspaceDrawer",
7922 "start": { 8114 "start": {
7923 "column": 24, 8115 "column": 24,
7924 "line": 262 8116 "line": 266
7925 } 8117 }
7926 }, 8118 },
7927 { 8119 {
7928 "defaultMessage": "!!!Activate next service...", 8120 "defaultMessage": "!!!Activate next service...",
7929 "end": { 8121 "end": {
7930 "column": 3, 8122 "column": 3,
7931 "line": 269 8123 "line": 273
7932 }, 8124 },
7933 "file": "src/lib/Menu.js", 8125 "file": "src/lib/Menu.js",
7934 "id": "menu.services.setNextServiceActive", 8126 "id": "menu.services.setNextServiceActive",
7935 "start": { 8127 "start": {
7936 "column": 23, 8128 "column": 23,
7937 "line": 266 8129 "line": 270
7938 } 8130 }
7939 }, 8131 },
7940 { 8132 {
7941 "defaultMessage": "!!!Activate previous service...", 8133 "defaultMessage": "!!!Activate previous service...",
7942 "end": { 8134 "end": {
7943 "column": 3, 8135 "column": 3,
7944 "line": 273 8136 "line": 277
7945 }, 8137 },
7946 "file": "src/lib/Menu.js", 8138 "file": "src/lib/Menu.js",
7947 "id": "menu.services.activatePreviousService", 8139 "id": "menu.services.activatePreviousService",
7948 "start": { 8140 "start": {
7949 "column": 27, 8141 "column": 27,
7950 "line": 270 8142 "line": 274
7951 } 8143 }
7952 }, 8144 },
7953 { 8145 {
7954 "defaultMessage": "!!!Disable notifications & audio", 8146 "defaultMessage": "!!!Disable notifications & audio",
7955 "end": { 8147 "end": {
7956 "column": 3, 8148 "column": 3,
7957 "line": 277 8149 "line": 281
7958 }, 8150 },
7959 "file": "src/lib/Menu.js", 8151 "file": "src/lib/Menu.js",
7960 "id": "sidebar.muteApp", 8152 "id": "sidebar.muteApp",
7961 "start": { 8153 "start": {
7962 "column": 11, 8154 "column": 11,
7963 "line": 274 8155 "line": 278
7964 } 8156 }
7965 }, 8157 },
7966 { 8158 {
7967 "defaultMessage": "!!!Enable notifications & audio", 8159 "defaultMessage": "!!!Enable notifications & audio",
7968 "end": { 8160 "end": {
7969 "column": 3, 8161 "column": 3,
7970 "line": 281 8162 "line": 285
7971 }, 8163 },
7972 "file": "src/lib/Menu.js", 8164 "file": "src/lib/Menu.js",
7973 "id": "sidebar.unmuteApp", 8165 "id": "sidebar.unmuteApp",
7974 "start": { 8166 "start": {
7975 "column": 13, 8167 "column": 13,
7976 "line": 278 8168 "line": 282
7977 } 8169 }
7978 }, 8170 },
7979 { 8171 {
7980 "defaultMessage": "!!!Workspaces", 8172 "defaultMessage": "!!!Workspaces",
7981 "end": { 8173 "end": {
7982 "column": 3, 8174 "column": 3,
7983 "line": 285 8175 "line": 289
7984 }, 8176 },
7985 "file": "src/lib/Menu.js", 8177 "file": "src/lib/Menu.js",
7986 "id": "menu.workspaces", 8178 "id": "menu.workspaces",
7987 "start": { 8179 "start": {
7988 "column": 14, 8180 "column": 14,
7989 "line": 282 8181 "line": 286
7990 } 8182 }
7991 }, 8183 },
7992 { 8184 {
7993 "defaultMessage": "!!!Default", 8185 "defaultMessage": "!!!Default",
7994 "end": { 8186 "end": {
7995 "column": 3, 8187 "column": 3,
7996 "line": 289 8188 "line": 293
7997 }, 8189 },
7998 "file": "src/lib/Menu.js", 8190 "file": "src/lib/Menu.js",
7999 "id": "menu.workspaces.defaultWorkspace", 8191 "id": "menu.workspaces.defaultWorkspace",
8000 "start": { 8192 "start": {
8001 "column": 20, 8193 "column": 20,
8002 "line": 286 8194 "line": 290
8003 } 8195 }
8004 }, 8196 },
8005 { 8197 {
8006 "defaultMessage": "!!!Todos", 8198 "defaultMessage": "!!!Todos",
8007 "end": { 8199 "end": {
8008 "column": 3, 8200 "column": 3,
8009 "line": 293 8201 "line": 297
8010 }, 8202 },
8011 "file": "src/lib/Menu.js", 8203 "file": "src/lib/Menu.js",
8012 "id": "menu.todos", 8204 "id": "menu.todos",
8013 "start": { 8205 "start": {
8014 "column": 9, 8206 "column": 9,
8015 "line": 290 8207 "line": 294
8016 } 8208 }
8017 }, 8209 },
8018 { 8210 {
8019 "defaultMessage": "!!!Open Todos drawer", 8211 "defaultMessage": "!!!Open Todos drawer",
8020 "end": { 8212 "end": {
8021 "column": 3, 8213 "column": 3,
8022 "line": 297 8214 "line": 301
8023 }, 8215 },
8024 "file": "src/lib/Menu.js", 8216 "file": "src/lib/Menu.js",
8025 "id": "menu.Todoss.openTodosDrawer", 8217 "id": "menu.Todoss.openTodosDrawer",
8026 "start": { 8218 "start": {
8027 "column": 19, 8219 "column": 19,
8028 "line": 294 8220 "line": 298
8029 } 8221 }
8030 }, 8222 },
8031 { 8223 {
8032 "defaultMessage": "!!!Close Todos drawer", 8224 "defaultMessage": "!!!Close Todos drawer",
8033 "end": { 8225 "end": {
8034 "column": 3, 8226 "column": 3,
8035 "line": 301 8227 "line": 305
8036 }, 8228 },
8037 "file": "src/lib/Menu.js", 8229 "file": "src/lib/Menu.js",
8038 "id": "menu.Todoss.closeTodosDrawer", 8230 "id": "menu.Todoss.closeTodosDrawer",
8039 "start": { 8231 "start": {
8040 "column": 20, 8232 "column": 20,
8041 "line": 298 8233 "line": 302
8042 } 8234 }
8043 }, 8235 },
8044 { 8236 {
8045 "defaultMessage": "!!!Enable Todos", 8237 "defaultMessage": "!!!Enable Todos",
8046 "end": { 8238 "end": {
8047 "column": 3, 8239 "column": 3,
8048 "line": 305 8240 "line": 309
8049 }, 8241 },
8050 "file": "src/lib/Menu.js", 8242 "file": "src/lib/Menu.js",
8051 "id": "menu.todos.enableTodos", 8243 "id": "menu.todos.enableTodos",
8052 "start": { 8244 "start": {
8053 "column": 15, 8245 "column": 15,
8054 "line": 302 8246 "line": 306
8055 } 8247 }
8056 }, 8248 },
8057 { 8249 {
8058 "defaultMessage": "!!!Home", 8250 "defaultMessage": "!!!Home",
8059 "end": { 8251 "end": {
8060 "column": 3, 8252 "column": 3,
8061 "line": 309 8253 "line": 313
8062 }, 8254 },
8063 "file": "src/lib/Menu.js", 8255 "file": "src/lib/Menu.js",
8064 "id": "menu.services.goHome", 8256 "id": "menu.services.goHome",
8065 "start": { 8257 "start": {
8066 "column": 17, 8258 "column": 17,
8067 "line": 306 8259 "line": 310
8068 } 8260 }
8069 } 8261 }
8070 ], 8262 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 9e1d8f86e..a2ed91b79 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -152,7 +152,7 @@
152 "menu.help.tos": "Terms of Service", 152 "menu.help.tos": "Terms of Service",
153 "menu.services": "Services", 153 "menu.services": "Services",
154 "menu.services.activatePreviousService": "Activate previous service", 154 "menu.services.activatePreviousService": "Activate previous service",
155 "menu.services.addNewService": "Add New Service...", 155 "menu.services.addNewService": "Add New Service",
156 "menu.services.goHome": "Home", 156 "menu.services.goHome": "Home",
157 "menu.services.setNextServiceActive": "Activate next service", 157 "menu.services.setNextServiceActive": "Activate next service",
158 "menu.todos": "Todos", 158 "menu.todos": "Todos",
@@ -166,6 +166,7 @@
166 "menu.view.openQuickSwitch": "Open Quick Switch", 166 "menu.view.openQuickSwitch": "Open Quick Switch",
167 "menu.view.reloadFranz": "Reload Ferdi", 167 "menu.view.reloadFranz": "Reload Ferdi",
168 "menu.view.reloadService": "Reload Service", 168 "menu.view.reloadService": "Reload Service",
169 "menu.view.reloadTodos": "Reload ToDos",
169 "menu.view.resetZoom": "Actual Size", 170 "menu.view.resetZoom": "Actual Size",
170 "menu.view.toggleDarkMode": "Toggle Dark Mode", 171 "menu.view.toggleDarkMode": "Toggle Dark Mode",
171 "menu.view.toggleDevTools": "Toggle Developer Tools", 172 "menu.view.toggleDevTools": "Toggle Developer Tools",
@@ -292,6 +293,7 @@
292 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 293 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
293 "settings.app.form.automaticUpdates": "Enable updates", 294 "settings.app.form.automaticUpdates": "Enable updates",
294 "settings.app.form.beta": "Include beta versions", 295 "settings.app.form.beta": "Include beta versions",
296 "settings.app.form.closeToSystemTray": "Close Ferdi to system tray",
295 "settings.app.form.customTodoServer": "Custom Todo Server", 297 "settings.app.form.customTodoServer": "Custom Todo Server",
296 "settings.app.form.darkMode": "Enable dark mode", 298 "settings.app.form.darkMode": "Enable dark mode",
297 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration", 299 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration",
@@ -308,11 +310,10 @@
308 "settings.app.form.language": "Language", 310 "settings.app.form.language": "Language",
309 "settings.app.form.lockPassword": "Password", 311 "settings.app.form.lockPassword": "Password",
310 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray", 312 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray",
311 "settings.app.form.closeToSystemTray": "Close Ferdi to system tray",
312 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour", 313 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour",
314 "settings.app.form.notifyTaskBarOnMessage": "Notify TaskBar/Dock on new message",
313 "settings.app.form.predefinedTodoServer": "Todo Server", 315 "settings.app.form.predefinedTodoServer": "Todo Server",
314 "settings.app.form.privateNotifications": "Don't show message content in notifications", 316 "settings.app.form.privateNotifications": "Don't show message content in notifications",
315 "settings.app.form.notifyTaskBarOnMessage": "Notify TaskBar/Dock on new message",
316 "settings.app.form.reloadAfterResume": "Reload Ferdi after system resume", 317 "settings.app.form.reloadAfterResume": "Reload Ferdi after system resume",
317 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window", 318 "settings.app.form.runInBackground": "Keep Ferdi in background when closing the window",
318 "settings.app.form.scheduledDNDEnabled": "Enable scheduled Do-not-Disturb", 319 "settings.app.form.scheduledDNDEnabled": "Enable scheduled Do-not-Disturb",
@@ -387,12 +388,11 @@
387 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 388 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
388 "settings.service.form.darkReaderSepia": "Dark Reader Sepia", 389 "settings.service.form.darkReaderSepia": "Dark Reader Sepia",
389 "settings.service.form.deleteButton": "Delete service", 390 "settings.service.form.deleteButton": "Delete service",
390 "settings.service.form.disableHibernation": "Disable hibernation",
391 "settings.service.form.disableHibernationInfo": "You currently have hibernation enabled but you can disable hibernation for individual services using this option.",
392 "settings.service.form.editServiceHeadline": "Edit {name}", 391 "settings.service.form.editServiceHeadline": "Edit {name}",
393 "settings.service.form.enableAudio": "Enable audio", 392 "settings.service.form.enableAudio": "Enable audio",
394 "settings.service.form.enableBadge": "Show unread message badges", 393 "settings.service.form.enableBadge": "Show unread message badges",
395 "settings.service.form.enableDarkMode": "Enable Dark Mode", 394 "settings.service.form.enableDarkMode": "Enable Dark Mode",
395 "settings.service.form.enableHibernation": "Enable hibernation",
396 "settings.service.form.enableNotification": "Enable notifications", 396 "settings.service.form.enableNotification": "Enable notifications",
397 "settings.service.form.enableService": "Enable service", 397 "settings.service.form.enableService": "Enable service",
398 "settings.service.form.headlineBadges": "Unread message badges", 398 "settings.service.form.headlineBadges": "Unread message badges",
@@ -404,6 +404,7 @@
404 "settings.service.form.iconUpload": "Drop your image, or click here", 404 "settings.service.form.iconUpload": "Drop your image, or click here",
405 "settings.service.form.indirectMessageInfo": "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 405 "settings.service.form.indirectMessageInfo": "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
406 "settings.service.form.indirectMessages": "Show message badge for all new messages", 406 "settings.service.form.indirectMessages": "Show message badge for all new messages",
407 "settings.service.form.isHibernatedEnabledInfo": "When enabled, a service will be shut down after a period of time to save system resources.",
407 "settings.service.form.isMutedInfo": "When disabled, all notification sounds and audio playback are muted", 408 "settings.service.form.isMutedInfo": "When disabled, all notification sounds and audio playback are muted",
408 "settings.service.form.name": "Name", 409 "settings.service.form.name": "Name",
409 "settings.service.form.openDarkmodeCss": "Open darkmode.css", 410 "settings.service.form.openDarkmodeCss": "Open darkmode.css",
@@ -482,6 +483,9 @@
482 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces", 483 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces",
483 "settings.workspaces.workspaceFeatureInfo": "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.", 484 "settings.workspaces.workspaceFeatureInfo": "Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
484 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", 485 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces",
486 "setupAssistant.headline": "Let's get started",
487 "setupAssistant.subheadline": "Choose from our most used services and get back on top of your messaging now.",
488 "setupAssistant.submit.label": "Let's go",
485 "sidebar.addNewService": "Add new service", 489 "sidebar.addNewService": "Add new service",
486 "sidebar.closeTodosDrawer": "Close Ferdi Todos", 490 "sidebar.closeTodosDrawer": "Close Ferdi Todos",
487 "sidebar.closeWorkspaceDrawer": "Close workspace drawer", 491 "sidebar.closeWorkspaceDrawer": "Close workspace drawer",
diff --git a/src/i18n/locales/et.json b/src/i18n/locales/et.json
new file mode 100644
index 000000000..e80bb9ff3
--- /dev/null
+++ b/src/i18n/locales/et.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Laadi uuesti",
3 "app.errorHandler.headline" : "Ups! Midagi läks nihu.",
4 "connectionLostBanner.cta" : "Laadi teenus uuesti",
5 "connectionLostBanner.informationLink" : "Mis juhtus?",
6 "connectionLostBanner.message" : "Oh ei! Franz kaotas ühenduse {name} teenusega.",
7 "feature.announcements.changelog.headline" : "Franz {versiooni} uuendused",
8 "feature.delayApp.headline" : "Uuendage oma Franz'i tellimust, et ootamine vahele jätta",
9 "feature.delayApp.text" : "Franz jätkab {seconds} sekundi pärast.",
10 "feature.delayApp.trial.action" : "Jah, ma tahan Franz Professionali tasuta 14-päevast proovitellimust",
11 "feature.delayApp.trial.actionShort" : "Aktiveerige tasuta Franz Professionali proovitellimus",
12 "feature.delayApp.trial.headline" : "Hankige tasuta Franz Professionali 14-päevane proovitellimus ja saate ootamise vahele jätta",
13 "feature.delayApp.upgrade.action" : "Uuendage Franz'it",
14 "feature.delayApp.upgrade.actionShort" : "Uuendage oma kontot",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Minge tagasi tasuta tellimusele",
16 "feature.planSelection.cta.stayOnFree" : "Jää tasuta tellimuse juurde",
17 "feature.planSelection.cta.trial" : "Alustage minu tasuta 14-päevast proovitellimust",
18 "feature.planSelection.cta.upgradePersonal" : "Valige Personal tellimus",
19 "feature.planSelection.cta.upgradePro" : "Valige Professional tellimus",
20 "feature.planSelection.free.text" : "Põhifunktsionaalsus",
21 "feature.planSelection.fullFeatureList" : "Kõigi tellimuste täielik võrdlus",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Minge tagasi tasuta tellimusele",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Valige Personal tellimus",
24 "feature.planSelection.fullscreen.dialog.message" : "Olete hakanud meie tasuta tellimusele tagasi minema. Olete ikka kindel? Selle asemel klõpsake siin, et saada rohkem teenuseid ja funktsioone vaid {currency} {price} eest kuus.",
25 "feature.planSelection.fullscreen.dialog.title" : "Minge tagasi oma Franz'i tellimusele",
26 "feature.planSelection.fullscreen.subheadline" : "On aeg teha valik. Franz töötab kõige paremini meie Personal ja Professional tellimustega. Vaadake palun ja valige endale sobiv.",
27 "feature.planSelection.fullscreen.welcome" : "{name}, kas olete valmis valima?",
28 "feature.planSelection.personal.text" : "Rohkem teenuseid, ilma ootamiseta - ideaalne isiklikuks kasutamiseks.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "Kõik hinnad põhinevad aastamaksel",
30 "feature.planSelection.pro.text" : "Piiramatu teenus ja täiustatud funktsioonid teile ja teie meeskonnale.",
31 "feature.serviceLimit.limitReached" : "Olete lisanud {amount} teenust, saadaolevast {limit} teenusest, mis on lubatud tellimuses. Teenuste lisamiseks täiendage oma kontot.",
32 "feature.shareFranz.action.email" : "Saadke e-kirjana",
33 "feature.shareFranz.action.facebook" : "Jagage Facebookis",
34 "feature.shareFranz.action.twitter" : "Jagage Twitteris",
35 "feature.shareFranz.headline" : "Franz on koostöös parem!",
36 "feature.shareFranz.shareText.email" : "Olen lisanud Franz'i {count} teenust! Hankige tasuta rakendus WhatsApp'ile, Messenger'ile, Slack'ile, Skype'ile ja muule veebiaadressilt www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "Olen lisanud Franz'i {count} teenust! Hankige tasuta rakendus WhatsApp'ile, Messenger'ile, Slack'ile, Skype'ile ja muule veebiaadressilt www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Rääkige oma sõpradele ja kolleegidele, kui vinge Franz on, ja aidake meil seda sõna levitada.",
39 "feature.todos.premium.info" : "Franz'i ülesanded on nüüd saadaval tasulise tellimusega kasutajatele!",
40 "feature.todos.premium.rollout" : "Kõigil teistel tuleb veidi kauem oodata.",
41 "feature.todos.premium.upgrade" : "Uuendage oma kontot",
42 "feature.trialStatusBar.cta" : "Uuendage nüüd",
43 "feature.trialStatusBar.expired" : "Teie tasuta Franzi {plan} proovitellimus on lõppenud, uuendage oma kontot.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Minge tagasi tasuta tellimusele",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Valige Personal tellimus",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "Olete hakanud meie tasuta tellimusele tagasi minema. Olete ikka kindel? Selle asemel klõpsake siin, et saada rohkem teenuseid ja funktsioone vaid {currency} {price} eest kuus.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Minge tagasi oma Franz'i tellimusele",
48 "feature.trialStatusBar.restTime" : "Teie tasuta Franz'i {plan} proovtellimus lõpeb {time} pärast.",
49 "global.api.unhealthy" : "Ups! Franz'i võrguteenustega ei saa ühendust luua",
50 "global.franzProRequired" : "Vajalik Franz Professional tellimus",
51 "global.notConnectedToTheInternet" : "Teil pole Interneti-ühendust.",
52 "global.spellchecker.useDefault" : "Kasuta süsteemi vaikeväärtust ({default})",
53 "global.spellchecking.autodetect" : "Tuvastage keel automaatselt",
54 "global.spellchecking.autodetect.short" : "Automaatne",
55 "global.spellchecking.language" : "Õigekirja kontrollimise keel",
56 "global.upgradeButton.upgradeToPro" : "Täiendage Franz Professional tellimusele",
57 "import.headline" : "Importige oma Franz 4 teenused",
58 "import.notSupportedHeadline" : "Teenused, mida Franz 5 veel ei toeta",
59 "import.skip.label" : "Soovin teenuseid käsitsi lisada",
60 "import.submit.label" : "Teenuste importimine",
61 "infobar.buttonChangelog" : "Mis on uut?",
62 "infobar.buttonInstallUpdate" : "Taaskäivita ja paigalda värskendus",
63 "infobar.buttonReloadServices" : "Laadi teenused uuesti",
64 "infobar.requiredRequestsFailed" : "Teenuseid ja kasutajainfot ei õnnestunud laadida",
65 "infobar.servicesUpdated" : "Teie teenuseid on uuendatud.",
66 "infobar.trialActivated" : "Teie proovitellimus oli edukalt aktiveeritud. Head sõnumineerimist!",
67 "infobar.updateAvailable" : "Franz'i jaoks on saadaval uus värskendus.",
68 "invite.email.label" : "E-posti aadress",
69 "invite.headline.friends" : "Kutsu oma 3 sõpra või kolleegi liituma",
70 "invite.name.label" : "Nimi",
71 "invite.skip.label" : "Ma soovin seda teha hiljem",
72 "invite.submit.label" : "Saada kutseid",
73 "invite.successInfo" : "Kutsed on edukalt saadetud",
74 "login.email.label" : "E-posti aadress",
75 "login.headline" : "Logi sisse",
76 "login.invalidCredentials" : "E-posti aadress või salasõna ei sobi",
77 "login.link.password" : "Lähtesta salasõna",
78 "login.link.signup" : "Looge tasuta konto",
79 "login.password.label" : "Salasõna",
80 "login.serverLogout" : "Teie seanss on aegunud, logige uuesti sisse.",
81 "login.submit.label" : "Logi sisse",
82 "login.tokenExpired" : "Teie seanss on aegunud, logige uuesti sisse.",
83 "menu.Todoss.closeTodosDrawer" : "Sulge ülesannete sahtel",
84 "menu.Todoss.openTodosDrawer" : "Ava ülesannete sahtel",
85 "menu.app.about" : "Franz rakendusest",
86 "menu.app.announcement" : "Mis on uut?",
87 "menu.app.checkForUpdates" : "Kontrolli kas värskendused on saadaval",
88 "menu.app.hide" : "Peida",
89 "menu.app.hideOthers" : "Peida teised",
90 "menu.app.quit" : "Sulge",
91 "menu.app.settings" : "Sätted",
92 "menu.app.unhide" : "Näita",
93 "menu.edit" : "Muuda",
94 "menu.edit.copy" : "Kopeeri",
95 "menu.edit.cut" : "Lõika",
96 "menu.edit.delete" : "Kustuta",
97 "menu.edit.emojiSymbols" : "Emotikonid ja sümbolid",
98 "menu.edit.paste" : "Kleebi",
99 "menu.edit.pasteAndMatchStyle" : "Kleebi ja sobita stiil",
100 "menu.edit.redo" : "Tee uuesti",
101 "menu.edit.selectAll" : "Vali kõik",
102 "menu.edit.speech" : "Kõne",
103 "menu.edit.startDictation" : "Alusta dikteerimist",
104 "menu.edit.startSpeaking" : "Alusta ettelugemist",
105 "menu.edit.stopSpeaking" : "Lõpeta ettelugemine",
106 "menu.edit.undo" : "Võta tagasi",
107 "menu.file" : "Fail",
108 "menu.help" : "Abiinfo",
109 "menu.help.changelog" : "Muutuste logi",
110 "menu.help.debugInfo" : "Kopeeri silumisteave",
111 "menu.help.debugInfoCopiedBody" : "Teie silumisteave on kopeeritud arvuti lõikelauale.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz'i silumisteave",
113 "menu.help.learnMore" : "Lisateave",
114 "menu.help.privacy" : "Privaatsusavaldus",
115 "menu.help.support" : "Kasutajatugi",
116 "menu.help.tos" : "Kasutustingimused",
117 "menu.services" : "Teenused",
118 "menu.services.activatePreviousService" : "Aktiveeri eelmine teenus",
119 "menu.services.addNewService" : "Lisa uus teenus",
120 "menu.services.goHome" : "Pealeht",
121 "menu.services.setNextServiceActive" : "Aktiveeri järgmine teenus",
122 "menu.todos" : "Ülesanded",
123 "menu.todos.enableTodos" : "Luba ülesanded",
124 "menu.view" : "Vaade",
125 "menu.view.enterFullScreen" : "Kuva täisekraanil",
126 "menu.view.exitFullScreen" : "Välju täisekraanilt",
127 "menu.view.reloadFranz" : "Laadi Franz uuesti",
128 "menu.view.reloadService" : "Laadi teenus uuesti",
129 "menu.view.reloadTodos" : "Laadi ülesanded uuesti",
130 "menu.view.resetZoom" : "Tegelik suurus",
131 "menu.view.toggleDevTools" : "Kuva arendaja tööriistad",
132 "menu.view.toggleFullScreen" : "Kuva täisekraanil",
133 "menu.view.toggleServiceDevTools" : "Kuva teenuse arendaja tööriistad",
134 "menu.view.toggleTodosDevTools" : "Kuva ülesannete arendaja tööriistad",
135 "menu.view.zoomIn" : "Suurenda",
136 "menu.view.zoomOut" : "Vähenda",
137 "menu.window" : "Aken",
138 "menu.window.close" : "Sulge",
139 "menu.window.minimize" : "Minimeeri",
140 "menu.workspaces" : "Tööruumid",
141 "menu.workspaces.addNewWorkspace" : "Lisa uus tööruum...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Sulge tööruumide sahtel",
143 "menu.workspaces.defaultWorkspace" : "Kõik teenused",
144 "menu.workspaces.openWorkspaceDrawer" : "Ava tööruumide sahtel",
145 "password.email.label" : "E-posti aadress",
146 "password.headline" : "Lähtesta salasõna",
147 "password.link.login" : "Logige sisse oma kontole",
148 "password.link.signup" : "Loo tasuta konto",
149 "password.noUser" : "Ühtegi selle e-posti aadressiga kasutajat ei leitud",
150 "password.submit.label" : "Saada",
151 "password.successInfo" : "Palun kontrollige oma e-posti aadressi",
152 "premiumFeature.button.upgradeAccount" : "Konto täiendamine",
153 "pricing.features.accountSync" : "Konto sünkroonimine",
154 "pricing.features.adFree" : "Igavesti reklaamivaba",
155 "pricing.features.appDelays" : "Ootavaid ekraane pole",
156 "pricing.features.appDelaysEnabled" : "Aeg-ajalt ootavad ekraanid",
157 "pricing.features.customWebsites" : "Lisa kohandatud veebisaidid",
158 "pricing.features.desktopNotifications" : "Töölaua teated",
159 "pricing.features.onPremise" : "Kohalikud ja muud majutatud teenused",
160 "pricing.features.recipes" : "Valige enam kui 70 teenuse hulgast",
161 "pricing.features.serviceProxies" : "Teenuse puhverserverid",
162 "pricing.features.spellchecker" : "Õigekirjakontrolli tugi",
163 "pricing.features.teamManagement" : "Meeskonna haldamine",
164 "pricing.features.thirdPartyServices" : "Paigalda 3'nda osapoole teenused",
165 "pricing.features.unlimitedServices" : "Lisa piiramatud teenused",
166 "pricing.features.upToSixServices" : "Lisa kuni 6 teenust",
167 "pricing.features.upToThreeServices" : "Lisa kuni 3 teenust",
168 "pricing.features.workspaces" : "Tööruumid",
169 "pricing.plan.free" : "Tasuta",
170 "pricing.plan.legacy" : "Täiendatud",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal kuumakse põhine",
173 "pricing.plan.personal-yearly" : "Personal aastamakse põhine",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional kuumakse põhine",
176 "pricing.plan.pro-yearly" : "Professional aastamakse põhine",
177 "pricing.trial.cta.accept" : "Alusta minu 14-päevast Franz'i proovitellimust",
178 "pricing.trial.cta.skip" : "Edasi Franz'ini",
179 "pricing.trial.cta.start" : "Alusta Franz'i kasutamist",
180 "pricing.trial.error" : "Vabandust, me ei saanud teie proovitellimust aktiveerida!",
181 "pricing.trial.features.headline" : "Franz Professional sisaldab:",
182 "pricing.trial.headline.pro" : "Hei {name}, tere tulemast Franz'i",
183 "pricing.trial.intro.happyMessaging" : "Head sõnumineerimist.",
184 "pricing.trial.intro.specialTreat" : "Meil on teile spetsiaalne maiuspala.",
185 "pricing.trial.intro.tryPro" : "Nautige täielikku Franz Professional'i kogemust 14 päeva jooksul täiesti tasuta.",
186 "pricing.trial.terms.automaticTrialEnd" : "Teie tasuta proovitellimus lõpeb automaatselt 14 päeva pärast",
187 "pricing.trial.terms.headline" : "Stringe pole lisatud",
188 "pricing.trial.terms.noCreditCard" : "Krediitkaarti pole vaja",
189 "pricing.trial.terms.trialWorth" : "Tasuta proovitellimus (tavaliselt {currency}{price} kuus)",
190 "service.crashHandler.action" : "Laadi {name} uuesti",
191 "service.crashHandler.autoReload" : "Püütakse {name} automaatselt taastada {seconds} sekundi jooksul",
192 "service.crashHandler.headline" : "Oh ei!",
193 "service.crashHandler.text" : "{name} on põhjustanud vea.",
194 "service.disabledHandler.action" : "Luba {name}",
195 "service.disabledHandler.headline" : "{name} on keelatud",
196 "service.errorHandler.action" : "Laadi {name} uuesti",
197 "service.errorHandler.editAction" : "Muuda {name}",
198 "service.errorHandler.headline" : "Oh ei!",
199 "service.errorHandler.message" : "Tõrge",
200 "service.errorHandler.text" : "{name} laadimine nurjus.",
201 "service.restrictedHandler.action" : "Uuendage oma kontot",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional tellimus on nõutav",
203 "service.restrictedHandler.customUrl.text" : "Kohandatud URL-ide ja ise hostitud teenuste kasutamiseks minge üle Franz Professional'i tellimusele.",
204 "service.restrictedHandler.serviceLimit.headline" : "Olete jõudnud oma maksimaalselt lubatud teenusete arvuni.",
205 "service.restrictedHandler.serviceLimit.text" : "Palun täiendage oma kontot, et kasutada rohkem, kui {count} teenust.",
206 "service.webviewLoader.loading" : "Laadimine",
207 "services.getStarted" : "Alusta",
208 "services.welcome" : "Tere tulemast Franz'i",
209 "settings.account.account.editButton" : "Konto muutmine",
210 "settings.account.accountType.basic" : "Tavakasutaja konto",
211 "settings.account.accountType.premium" : "Edasijõudnud kasutaja konto",
212 "settings.account.buttonSave" : "Uuenda profiili",
213 "settings.account.deleteAccount" : "Kustuta konto",
214 "settings.account.deleteEmailSent" : "Teile saadeti konto kustutamise kinnitamiseks e-kiri koos lingiga. Teie kontot ja andmeid ei saa taastada!",
215 "settings.account.deleteInfo" : "Kui te ei vaja enam oma Franzi kontot, saate siin oma konto ja kõik sellega seotud andmed kustutada.",
216 "settings.account.headline" : "Konto",
217 "settings.account.headlineAccount" : "Konto teave",
218 "settings.account.headlineDangerZone" : "Ohutsoon",
219 "settings.account.headlineInvoices" : "Arved",
220 "settings.account.headlinePassword" : "Muuda salasõna",
221 "settings.account.headlineProfile" : "Profiili uuendamine",
222 "settings.account.headlineSubscription" : "Teie tellimus",
223 "settings.account.headlineTrialUpgrade" : "Hankige tasuta 14-päevane Franz'i proovitellimus",
224 "settings.account.headlineUpgradeAccount" : "Täiendage oma kontot ja saate täieliku Franz'i kasutuskogemuse",
225 "settings.account.invoiceDownload" : "Laadi alla",
226 "settings.account.manageSubscription.label" : "Halda oma tellimust",
227 "settings.account.successInfo" : "Teie muudatused on salvestatud",
228 "settings.account.trial" : "Tasuta proovitellimus",
229 "settings.account.trialEndsIn" : "Teie tasuta prooviperiood lõpeb {duration} pärast.",
230 "settings.account.trialUpdateBillingInfo" : "Palun uuendage oma arveldusteavet, et jätkata teenuse {license} kasutamist ka pärast prooviperioodi.",
231 "settings.account.tryReloadServices" : "Proovi uuesti",
232 "settings.account.tryReloadUserInfoRequest" : "Proovi uuesti",
233 "settings.account.upgradeToPro.label" : "Täiendage Franz Professional tellimusele",
234 "settings.account.userInfoRequestFailed" : "Kasutaja teabe laadimine nurjus",
235 "settings.account.yourLicense" : "Teie Franz'i litsents",
236 "settings.app.buttonClearAllCache" : "Tühjenda vahemälu",
237 "settings.app.buttonInstallUpdate" : "Taaskäivita ja paigalda värskendus",
238 "settings.app.buttonSearchForUpdate" : "Värskenduste saadavuse kontrollimine",
239 "settings.app.cacheInfo" : "Franz'i vahemälu kasutab praegu {size} kettaruumi.",
240 "settings.app.currentVersion" : "Käesolev versioon:",
241 "settings.app.form.autoLaunchInBackground" : "Ava taustal",
242 "settings.app.form.autoLaunchOnStart" : "Käivita Franz arvuti käivitumisel",
243 "settings.app.form.beta" : "Kaasaarvatud beetaversioonid",
244 "settings.app.form.darkMode" : "Liitu Pimedaga (tume teema)",
245 "settings.app.form.enableGPUAcceleration" : "Luba videoprotsessori (GPU) kiirendus",
246 "settings.app.form.enableSpellchecking" : "Luba õigekirjakontroll",
247 "settings.app.form.enableSystemTray" : "Kuva Franz süsteemisalves",
248 "settings.app.form.enableTodos" : "Luba Franz ülesanded (Todos)",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Hoia kõik tööruumid laadituna",
250 "settings.app.form.language" : "Keel",
251 "settings.app.form.minimizeToSystemTray" : "Minimeeri Franz süsteemisalve",
252 "settings.app.form.runInBackground" : "Hoia akna sulgemisel Franz taustal töös",
253 "settings.app.form.showDisabledServices" : "Kuva keelatud teenuste vahelehed",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Kuva lugemata sõnumimärk, kui teated on keelatud",
255 "settings.app.headline" : "Sätted",
256 "settings.app.headlineAdvanced" : "Täpsemalt",
257 "settings.app.headlineAppearance" : "Välimus",
258 "settings.app.headlineGeneral" : "Üldine",
259 "settings.app.headlineLanguage" : "Keel",
260 "settings.app.headlineUpdates" : "Värskendused",
261 "settings.app.languageDisclaimer" : "Ametlikud tõlked on inglise ja saksa keeles. Kõik muud keeled on kogukonnapõhised tõlked.",
262 "settings.app.restartRequired" : "Muudatused vajavad Franz'i taaskäivitamist",
263 "settings.app.subheadlineCache" : "Vahemälu",
264 "settings.app.translationHelp" : "Aidake meil Franz'i teie keelde tõlkida.",
265 "settings.app.updateStatusAvailable" : "Värskendus on saadaval, toimub allalaadimine...",
266 "settings.app.updateStatusSearching" : "Otsib värskendusi",
267 "settings.app.updateStatusUpToDate" : "Kasutate Franz'i uusimat versiooni",
268 "settings.invite.headline" : "Kutsu sõpru",
269 "settings.navigation.account" : "Konto",
270 "settings.navigation.availableServices" : "Saadaolevad teenused",
271 "settings.navigation.inviteFriends" : "Kutsu sõpru",
272 "settings.navigation.logout" : "Logi välja",
273 "settings.navigation.settings" : "Sätted",
274 "settings.navigation.team" : "Halda meeskonda",
275 "settings.navigation.yourServices" : "Teie teenused",
276 "settings.navigation.yourWorkspaces" : "Teie tööruumid",
277 "settings.recipes.all" : "Kõik teenused",
278 "settings.recipes.custom" : "Kohandatud teenused",
279 "settings.recipes.customService.headline.communityRecipes" : "Kogukonna 3'nda osapoole retseptid",
280 "settings.recipes.customService.headline.customRecipes" : "Kohandatud 3'nda osapoole retseptid",
281 "settings.recipes.customService.headline.devRecipes" : "Teie arendusteenuse retseptid",
282 "settings.recipes.customService.intro" : "Kohandatud teenuse lisamiseks kopeerige teenuse retsept kausta:",
283 "settings.recipes.customService.openDevDocs" : "Arendaja dokumentatsioon",
284 "settings.recipes.customService.openFolder" : "Ava kaust",
285 "settings.recipes.headline" : "Saadaolevad teenused",
286 "settings.recipes.missingService" : "Teenus puudub?",
287 "settings.recipes.mostPopular" : "Populaarseimad teenused",
288 "settings.recipes.nothingFound" : "Vabandust, kuid ükski teenus ei vastanud teie otsinguterminile.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Teenus lisati edukalt",
290 "settings.searchService" : "Otsi teenust",
291 "settings.service.error.goBack" : "Tagasi teenuste juurde",
292 "settings.service.error.headline" : "Tõrge",
293 "settings.service.error.message" : "Teenuse retsepti ei saanud laadida.",
294 "settings.service.form.addServiceHeadline" : "Lisa {name}",
295 "settings.service.form.availableServices" : "Saadaolevad teenused",
296 "settings.service.form.customUrl" : "Kohandatud server",
297 "settings.service.form.customUrlPremiumInfo" : "Isemajutatavate teenuste lisamiseks vajate Franz Premium'i tellimust.",
298 "settings.service.form.customUrlUpgradeAccount" : "Uuendage oma kontot",
299 "settings.service.form.customUrlValidationError" : "Kohandatud {name} serverit ei saanud kinnitada.",
300 "settings.service.form.deleteButton" : "Kustuta teenus",
301 "settings.service.form.editServiceHeadline" : "Muuda {name}",
302 "settings.service.form.enableAudio" : "Luba heli",
303 "settings.service.form.enableBadge" : "Kuva lugemata sõnumimärgid",
304 "settings.service.form.enableDarkMode" : "Luba tume režiim",
305 "settings.service.form.enableHibernation" : "Luba talveunerežiim",
306 "settings.service.form.enableNotification" : "Luba teated",
307 "settings.service.form.enableService" : "Luba teenus",
308 "settings.service.form.headlineBadges" : "Lugemata sõnumimärgid",
309 "settings.service.form.headlineGeneral" : "Üldine",
310 "settings.service.form.headlineNotifications" : "Teated",
311 "settings.service.form.icon" : "Kohandatud pisipilt",
312 "settings.service.form.iconDelete" : "Kustuta",
313 "settings.service.form.iconUpload" : "Lohistage oma pilt siia või klõpsake siin",
314 "settings.service.form.indirectMessageInfo" : "Teid teavitatakse kõigist kanali uutest sõnumitest, mitte ainult @kasutajanimi, @kanal, @siin, ...",
315 "settings.service.form.indirectMessages" : "Kuva kõigi uute sõnumite puhul sõnumimärk",
316 "settings.service.form.isHibernatedEnabledInfo" : "Kui see säte on lubatud, suletakse antud teenus ressursside säästmiseks teatud aja möödudes.",
317 "settings.service.form.isMutedInfo" : "Kui see säte on keelatud, vaigistatakse kõik teadete helid ja heli taasesitus",
318 "settings.service.form.name" : "Nimi",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS puhverserveri sätted",
320 "settings.service.form.proxy.host" : "Puhverserveri host\/IP",
321 "settings.service.form.proxy.info" : "Puhverserveri sätteid ei sünkroonita Franz'i serveritega.",
322 "settings.service.form.proxy.isEnabled" : "Kasuta puhverserverit",
323 "settings.service.form.proxy.password" : "Salasõna (mittekohustuslik)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Pärast puhverserveri sätete muutmist palun taaskäivitage Franz.",
326 "settings.service.form.proxy.user" : "Kasutajanimi (mittekohustuslik)",
327 "settings.service.form.saveButton" : "Salvesta teenus",
328 "settings.service.form.tabHosted" : "Isemajutatud server",
329 "settings.service.form.tabOnPremise" : "Isemajutatud teenus ⭐️",
330 "settings.service.form.team" : "Meeskond",
331 "settings.service.form.useHostedService" : "Kasuta välise majutaja {name} teenust.",
332 "settings.service.form.yourServices" : "Teie teenused",
333 "settings.services.deletedInfo" : "Teenus on edukalt kustutatud",
334 "settings.services.discoverServices" : "Avasta teenuseid",
335 "settings.services.headline" : "Teie teenused",
336 "settings.services.noServicesAdded" : "Te pole veel ühtegi teenust lisanud.",
337 "settings.services.servicesRequestFailed" : "Teie teenuseid ei õnnestunud laadida",
338 "settings.services.tooltip.isDisabled" : "Teenus on keelatud",
339 "settings.services.tooltip.isMuted" : "Kõik helid on vaigistatud",
340 "settings.services.tooltip.notificationsDisabled" : "Kõik teated on keelatud",
341 "settings.services.updatedInfo" : "Teie muudatused on salvestatud",
342 "settings.team.contentHeadline" : "Franz meeskondadele",
343 "settings.team.copy" : "Franz meeskondadele funktsioon annab teile võimaluse kutsuda kaastöötajaid oma meeskonda, saates neile e-posti teel kutsed ja hallates nende tellimusi oma konto sätetes. Ärge raisake aega tellimuste seadistamisele iga meeskonnaliikme jaoks eraldi, unustage mitu arvet ja erinevaid arveldustsükleid - üks meeskond haldab neid kõiki!",
344 "settings.team.headline" : "Meeskond",
345 "settings.team.intro" : "Kas teie ja teie meeskond kasutavad Franz'i? Nüüd saate hallata täiustatud konto tellimusi nii paljudele kolleegidele, sõpradele kui ka pereliikmetele, kui soovite teha kõike ühe konto kaudu.",
346 "settings.team.manageAction" : "Hallake oma meeskonda veebilehel 'meetfranz.com'",
347 "settings.team.upgradeAction" : "Uuendage oma kontot",
348 "settings.user.form.accountType.company" : "Ettevõte",
349 "settings.user.form.accountType.individual" : "Üksikisik",
350 "settings.user.form.accountType.label" : "Konto tüüp",
351 "settings.user.form.accountType.non-profit" : "Mittetulundusühing",
352 "settings.user.form.currentPassword" : "Praegune salasõna",
353 "settings.user.form.email" : "E-posti aadress",
354 "settings.user.form.firstname" : "Eesnimi",
355 "settings.user.form.lastname" : "Perekonnanimi",
356 "settings.user.form.newPassword" : "Uus salasõna",
357 "settings.workspace.add.form.name" : "Nimi",
358 "settings.workspace.add.form.submitButton" : "Loo uus tööruum",
359 "settings.workspace.form.buttonDelete" : "Kustuta tööruum",
360 "settings.workspace.form.buttonSave" : "Salvesta tööruum",
361 "settings.workspace.form.name" : "Nimi",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Teenused selles tööruumis",
363 "settings.workspace.form.yourWorkspaces" : "Teie tööruumid",
364 "settings.workspaces.deletedInfo" : "Tööruum on edukalt kustutatud",
365 "settings.workspaces.headline" : "Teie tööruumid",
366 "settings.workspaces.noWorkspacesAdded" : "Te pole veel ühtegi tööruumi lisanud.",
367 "settings.workspaces.tryReloadWorkspaces" : "Proovige uuesti",
368 "settings.workspaces.updatedInfo" : "Teie muudatused on salvestatud",
369 "settings.workspaces.workspaceFeatureHeadline" : "Vähem on rohkem: Franz'i tööruumide tutvustus",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz'i tööruumid võimaldavad teil keskenduda sellele, mis on hetkel oluline. Seadistage erinevaid teenusekomplekte ja saate neid igal ajal hõlpsasti vahetada. Teie otsustate, milliseid teenuseid millal ja kus, et saaksime aidata teil oma mängu tipus püsida - või siis lihtsalt töölt välja lülitada, kui soovite.",
371 "settings.workspaces.workspacesRequestFailed" : "Teie tööruume ei saanud laadida",
372 "setupAssistant.headline" : "Alustame",
373 "setupAssistant.subheadline" : "Valige meie kõige sagedamini kasutatavate teenuste hulgast ja saate kohe oma sõnumite üle valitseda.",
374 "setupAssistant.submit.label" : "Lähme",
375 "sidebar.addNewService" : "Lisa uus teenus",
376 "sidebar.closeTodosDrawer" : "Sulge Franz ülesanded",
377 "sidebar.closeWorkspaceDrawer" : "Sulge tööruumide sahtel",
378 "sidebar.muteApp" : "Keela teated ja heli",
379 "sidebar.openTodosDrawer" : "Ava Franz ülesanded",
380 "sidebar.openWorkspaceDrawer" : "Ava tööruumide sahtel",
381 "sidebar.settings" : "Sätted",
382 "sidebar.unmuteApp" : "Luba teated ja heli",
383 "signup.email.label" : "E-posti aadress",
384 "signup.emailDuplicate" : "Selle e-posti aadressiga kasutaja on juba olemas",
385 "signup.firstname.label" : "Eesnimi",
386 "signup.headline" : "Registreeri",
387 "signup.lastname.label" : "Perekonnanimi",
388 "signup.legal.info" : "Franzi konto loomisega nõustute",
389 "signup.legal.privacy" : "Privaatsusavaldus",
390 "signup.legal.terms" : "Kasutustingimused",
391 "signup.link.login" : "Kas teil on juba konto, logi sisse?",
392 "signup.password.label" : "Salasõna",
393 "signup.submit.label" : "Loo konto",
394 "subscription.bestValue" : "Parim hind",
395 "subscription.cta.activateTrial" : "Jah, alusta tasuta Franz Professional'i proovitellimust",
396 "subscription.cta.allOptions" : "Vaata kõiki võimalusi",
397 "subscription.cta.choosePlan" : "Valige oma tellimus",
398 "subscription.includedProFeatures" : "Franz'i Professional tellimus sisaldab:",
399 "subscription.interval.per" : "{interval} kohta",
400 "subscription.interval.perMonth" : "kuus",
401 "subscription.interval.perMonthPerUser" : "kuus kasutaja kohta",
402 "subscription.planItem.upgradeAccount" : "Uuendage oma kontot",
403 "subscription.teaser.includedFeatures" : "Tasuliste Franz'i tellimuste hulka kuuluvad:",
404 "subscription.teaser.intro" : "Franz 5 sisaldab laia valikut uusi funktsioone, et teie igapäevast suhtlemist veelgi paremaks muuta - patareid kaasaarvatud. Tutvuge meie uute tellimusvariantidega ja saate teada, milline neist sobib teile kõige paremini!",
405 "subscriptionPopup.buttonCancel" : "Loobu",
406 "subscriptionPopup.buttonDone" : "Valmis",
407 "tabs.item.deleteService" : "Kustuta teenus",
408 "tabs.item.disableAudio" : "Keela heli",
409 "tabs.item.disableNotifications" : "Keela teated",
410 "tabs.item.disableService" : "Keela teenus",
411 "tabs.item.edit" : "Muuda",
412 "tabs.item.enableAudio" : "Luba heli",
413 "tabs.item.enableNotification" : "Luba teated",
414 "tabs.item.enableService" : "Luba teenus",
415 "tabs.item.reload" : "Laadi uuesti",
416 "validation.email" : "{field} ei sobi",
417 "validation.minLength" : "{field} peaks olema vähemalt {length} tähemärki pikk",
418 "validation.oneRequired" : "Vaja on vähemalt ühte",
419 "validation.required" : "{väli} on kohustuslik",
420 "validation.url" : "{field} ei ole kehtiv URL",
421 "webControls.back" : "Tagasi",
422 "webControls.forward" : "Edasi",
423 "webControls.goHome" : "Pealeht",
424 "webControls.openInBrowser" : "Ava brauseris",
425 "webControls.reload" : "Laadi uuesti",
426 "welcome.loginButton" : "Logige sisse oma kontole",
427 "welcome.signupButton" : "Loo tasuta konto",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Lisa uus tööruum",
429 "workspaceDrawer.allServices" : "Kõik teenused",
430 "workspaceDrawer.headline" : "Tööruumid",
431 "workspaceDrawer.item.contextMenuEdit" : "muutmine",
432 "workspaceDrawer.item.noServicesAddedYet" : "Ühtegi teenust pole veel lisatud",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Loo oma esimene tööruum",
434 "workspaceDrawer.proFeatureBadge" : "Täiustatud funktsioon",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Aktiveerige täiustatud konto uuesti",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p> Franz'i tööruumid võimaldavad teil keskenduda sellele, mis on hetkel oluline. Seadistage erinevaid teenusekomplekte ja saate neid igal ajal hõlpsasti vahetada. <\/p> <p> Teie otsustate milliseid teenuseid millal ja kus vajate, et saaksime aidata teil oma mängu tipus püsida - või hõlpsalt töölt välja lülitada. millal soovite. <\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Muuda tööruumide sätteid",
438 "workspaces.switchingIndicator.switchingTo" : "Lülitumine"
439}
diff --git a/src/i18n/locales/fa.json b/src/i18n/locales/fa.json
new file mode 100644
index 000000000..11c95c126
--- /dev/null
+++ b/src/i18n/locales/fa.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "بارگذاری مجدد",
3 "app.errorHandler.headline" : "اشتباهی رخ داده",
4 "connectionLostBanner.cta" : "بارگذاری مجدد سرور",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "تغییرات فرَنز {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "فرَنز بعد از {seconds} ثانیه ادامه میده.",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "ارتقای حساب",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "ارسال به صورت ایمیل",
33 "feature.shareFranz.action.facebook" : "اشتراک‌گذاری در فیس بوک",
34 "feature.shareFranz.action.twitter" : "اشتراک‌گذاری در توییتر",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "من {count} تا سرویس تو فرَنز اضافه کردم! برنامه رایگان برای واتسآپ، اسکایپ، مسنجر، اسلک رو از سایت www.meetfranz.com دانلود کن.",
37 "feature.shareFranz.shareText.twitter" : "من {count} تا سرویس تو فرَنز اضافه کردم! برنامه رایگان برای واتسآپ، اسکایپ، مسنجر، اسلک رو از سایت www.meetfranz.com دانلود کن \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "به دوستات بگو فرَنز چقدر باحاله و بهمون کمک کن گسترش پیدا کنیم.",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "به سرویس های آنلاین فرَنز متصل نشدی",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "اینترنت وصل نیست",
52 "global.spellchecker.useDefault" : "استفاده از پیشفرض سیستم ({default})",
53 "global.spellchecking.autodetect" : "تشخیص خودکار زبان",
54 "global.spellchecking.autodetect.short" : "خودکار",
55 "global.spellchecking.language" : "زبان غلط یاب املایی",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "جانشانی سرویس های فرانز 4",
58 "import.notSupportedHeadline" : "این سرویس ها در Franz ۵ پشتیبانی نمیشوند.",
59 "import.skip.label" : "میخواهم سرویس ها را به صورت دستی اضافه کنم.",
60 "import.submit.label" : "جانشانی سرویس ها",
61 "infobar.buttonChangelog" : "چه خبر ؟",
62 "infobar.buttonInstallUpdate" : "باز کردن مجدد و نصب به روز رسانی",
63 "infobar.buttonReloadServices" : "بارگذاری مجدد سرویس ها",
64 "infobar.requiredRequestsFailed" : "بارگذاری سرویس ها و اطلاعات کاربر ممکن نیست",
65 "infobar.servicesUpdated" : "سرویس های شما به روز رسانی شدند.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "یک به روز رسانی جدید برای Franz آماده است.",
68 "invite.email.label" : "نشانی ایمیل",
69 "invite.headline.friends" : "دعوت ۳ نفر از دوستان یا همکارانتان.",
70 "invite.name.label" : "نام ",
71 "invite.skip.label" : "بعدا انجام میدم ",
72 "invite.submit.label" : "فرستادن دعوت نامه ها ",
73 "invite.successInfo" : "دعوتنامه ها با موفقیت ارسال شدند .",
74 "login.email.label" : "نشانی ایمیل",
75 "login.headline" : "ورود ",
76 "login.invalidCredentials" : "ایمیل یا رمز عبور معتبر نیست ",
77 "login.link.password" : "تنظیم مجدد رمز عبور ",
78 "login.link.signup" : "ساختن یک حساب رایگان ",
79 "login.password.label" : "رمز عبور ",
80 "login.serverLogout" : "این ارتباط منقضی شده است، لطفا دوباره وارد شوید.",
81 "login.submit.label" : "ورود ",
82 "login.tokenExpired" : "ارتباط شما منقضی شده، لطفا دوباره وارد شوید.",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "درباره فرانز",
86 "menu.app.announcement" : "چه خبر؟",
87 "menu.app.checkForUpdates" : "بررسی وجود نسخه جدید ",
88 "menu.app.hide" : "مخفی‌کردن ",
89 "menu.app.hideOthers" : "مخفی کردن بقیه ",
90 "menu.app.quit" : "خروج ",
91 "menu.app.settings" : "تنظیمات ",
92 "menu.app.unhide" : "آشکارسازی",
93 "menu.edit" : "ویرایش ",
94 "menu.edit.copy" : "کپی",
95 "menu.edit.cut" : "برش ",
96 "menu.edit.delete" : "حذف ",
97 "menu.edit.emojiSymbols" : "شکلک و نماد ها",
98 "menu.edit.paste" : "چسباندن ",
99 "menu.edit.pasteAndMatchStyle" : "بچسبان و با استایل هماهنگ کن.",
100 "menu.edit.redo" : "انجام دوباره ",
101 "menu.edit.selectAll" : "انتخاب همه ",
102 "menu.edit.speech" : "سخنرانی",
103 "menu.edit.startDictation" : "شروع به دیکته کردن",
104 "menu.edit.startSpeaking" : "شروع به حرف زدن",
105 "menu.edit.stopSpeaking" : "متوقف سازی حرف زدن",
106 "menu.edit.undo" : "برگشت",
107 "menu.file" : "فایل",
108 "menu.help" : "راهنما",
109 "menu.help.changelog" : "تغییرات",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "بیشتر بدانید ",
114 "menu.help.privacy" : "قوانین شخصی سازی",
115 "menu.help.support" : "پشتیبانی",
116 "menu.help.tos" : "شرایط ارائهٔ خدمات ",
117 "menu.services" : "سرویس‌ها ",
118 "menu.services.activatePreviousService" : "فعالسازی سرویس قبلی",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "فعالسازی سرویس بعدی",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "نمایش",
125 "menu.view.enterFullScreen" : "نمای تمام صفحه",
126 "menu.view.exitFullScreen" : "خروج از تمام‌صفحه ",
127 "menu.view.reloadFranz" : "بارگذاری مجدد فرَنز",
128 "menu.view.reloadService" : "بارگذاری مجدد سرور",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "اندازه واقعی‌ ",
131 "menu.view.toggleDevTools" : "ابزارهای گسترش دهنده",
132 "menu.view.toggleFullScreen" : "تغییر وضعیت تمام صفحه",
133 "menu.view.toggleServiceDevTools" : "تغییر سرویس ابزارهای توسعه",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "بزرگنمایی",
136 "menu.view.zoomOut" : "کوچک‌نمایی",
137 "menu.window" : "پنجره ",
138 "menu.window.close" : "بستن ",
139 "menu.window.minimize" : "به زیر بردن",
140 "menu.workspaces" : "فضای کاری",
141 "menu.workspaces.addNewWorkspace" : "افزودن فضای کاری جدید...",
142 "menu.workspaces.closeWorkspaceDrawer" : "بستن کشوی فضای کاری",
143 "menu.workspaces.defaultWorkspace" : "تمامی سرویس ها",
144 "menu.workspaces.openWorkspaceDrawer" : "بازکردن کشوی فضای کاری",
145 "password.email.label" : "نشانی ایمیل",
146 "password.headline" : "تنظیم مجدد رمز عبور ",
147 "password.link.login" : "وارد شدن به اکانت خود",
148 "password.link.signup" : "ساخت یک حساب کاربری",
149 "password.noUser" : "هیچ کاربری با این نشانی ایمیل یافت نشد ",
150 "password.submit.label" : "ارسال ",
151 "password.successInfo" : "لطفا ایمیل خود را چک کنید",
152 "premiumFeature.button.upgradeAccount" : "ارتقای حساب",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "بارگذاری مجدد {name}",
191 "service.crashHandler.autoReload" : "در حال بازیابی{نام} در{ثانیه} ثانیه به طور خودکار",
192 "service.crashHandler.headline" : "وای نه! ",
193 "service.crashHandler.text" : "{نام} با مشکل مواجه شد",
194 "service.disabledHandler.action" : "{نام} فعال کن",
195 "service.disabledHandler.headline" : "{نام} غیرفعال است",
196 "service.errorHandler.action" : "بارگذاری مجدد {name}",
197 "service.errorHandler.editAction" : "ویرایش {نام}",
198 "service.errorHandler.headline" : "وای نه! ",
199 "service.errorHandler.message" : "خطا ",
200 "service.errorHandler.text" : "{name} بارگذاری نشد.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "در حال بارگذاری",
207 "services.getStarted" : "شروع ",
208 "services.welcome" : "به فرانز خوش آمدید",
209 "settings.account.account.editButton" : "ویرایش حساب کاربری",
210 "settings.account.accountType.basic" : "اکانت ساده",
211 "settings.account.accountType.premium" : "پشتیبانی پیشرفته اکانت",
212 "settings.account.buttonSave" : "بروز رسانی پروفایل",
213 "settings.account.deleteAccount" : "حذف حساب",
214 "settings.account.deleteEmailSent" : "شما یک ایمیل حاوی لینک غیر فعال سازی اکانت خود را دریافت کرده اید. اکانت شما به هیچ وجه بازیابی نخواهد شد !",
215 "settings.account.deleteInfo" : "چنانچه دیگر به به اکانت فرانز خود نیاز ندارید ، میتوانید اکانت خود و تمامی اطلاعات خود در اینجا را حذف کنید.",
216 "settings.account.headline" : "حساب ",
217 "settings.account.headlineAccount" : "اطلاعات حساب ",
218 "settings.account.headlineDangerZone" : "منطقه خطرناک",
219 "settings.account.headlineInvoices" : "فاکتورها",
220 "settings.account.headlinePassword" : "تغییر کلمه عبور",
221 "settings.account.headlineProfile" : "بروزرسانی پروفایل",
222 "settings.account.headlineSubscription" : "اشتراک شما",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "دانلود",
226 "settings.account.manageSubscription.label" : "اشتراک خود را مدیریت کنید",
227 "settings.account.successInfo" : "تغییرات شما ذخیره شد!",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "تلاش مجدد ",
232 "settings.account.tryReloadUserInfoRequest" : "تلاش مجدد ",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "نمی‌توان اطلاعات کاربر را بارگذاری کرد.",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "پاک کردن حافظه پنهان",
237 "settings.app.buttonInstallUpdate" : "باز کردن مجدد و نصب به روز رسانی ",
238 "settings.app.buttonSearchForUpdate" : "بررسی بروزرسانی",
239 "settings.app.cacheInfo" : "حافظه ی پنهانی فرانز هم اکنون {سایز} از فضای شما استفاده میکند .",
240 "settings.app.currentVersion" : "نسخهٔ فعلی",
241 "settings.app.form.autoLaunchInBackground" : "باز کردن در پس زمینه",
242 "settings.app.form.autoLaunchOnStart" : "باز شدن فرانز در استارت ",
243 "settings.app.form.beta" : "شامل نسخه های بتا ",
244 "settings.app.form.darkMode" : "فعالسازی حالت شب",
245 "settings.app.form.enableGPUAcceleration" : "فعال سازی شتاب GPU",
246 "settings.app.form.enableSpellchecking" : "فعال‌سازی غلط‌یابی املایی",
247 "settings.app.form.enableSystemTray" : "فرانز را در system tray نشان بده",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "زبان",
251 "settings.app.form.minimizeToSystemTray" : "فرانز را در system tray بخوابان",
252 "settings.app.form.runInBackground" : "فرانز را در پشت زمینه نگه دار زمانی که پنجره آن بسته میشود",
253 "settings.app.form.showDisabledServices" : "سرویس های غیرفعال را نشان بده ",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "نماد پیام خوانده نشده را زمانی که نوتیفیکیشن ها غیرفعالند نشان بده",
255 "settings.app.headline" : "تنظیمات ",
256 "settings.app.headlineAdvanced" : "پیشرفته ",
257 "settings.app.headlineAppearance" : "ظاهر ",
258 "settings.app.headlineGeneral" : "عمومی ",
259 "settings.app.headlineLanguage" : "زبان ",
260 "settings.app.headlineUpdates" : "به‌روزرسانی‌ها ",
261 "settings.app.languageDisclaimer" : "ترجمه های رسمی به زبان انگلیسی و آلمانی هستند. ترجمه های بقیه زبانها مردم پایه هستند.",
262 "settings.app.restartRequired" : "تغییر ملزومات ریستارت",
263 "settings.app.subheadlineCache" : "حافظه‌ی نهان",
264 "settings.app.translationHelp" : "به ما کمک کنید فرانز را به زبان شما ترجمه کنیم.",
265 "settings.app.updateStatusAvailable" : "بروزرسانی موجود است ، در حال دانلود...",
266 "settings.app.updateStatusSearching" : "در حال جستجو برای بروزرسانی",
267 "settings.app.updateStatusUpToDate" : "شما از آخرین نسخه فرانز استفاده میکنید",
268 "settings.invite.headline" : "دعوت دوستان",
269 "settings.navigation.account" : "حساب ",
270 "settings.navigation.availableServices" : "سرویس های موجود",
271 "settings.navigation.inviteFriends" : "دعوت دوستان",
272 "settings.navigation.logout" : "خروج از سیستم ",
273 "settings.navigation.settings" : "تنظیمات ",
274 "settings.navigation.team" : "مدیریت گروه",
275 "settings.navigation.yourServices" : "سرویس های شما",
276 "settings.navigation.yourWorkspaces" : "فضای کاری شما",
277 "settings.recipes.all" : "همه سرویس ها",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "سرویس های موجود",
286 "settings.recipes.missingService" : "سرویسی را نیاز دارید ؟",
287 "settings.recipes.mostPopular" : "مشهورترین ها",
288 "settings.recipes.nothingFound" : "متاسفیم ، اما هیچ سرویسی با آنچه که جستجو کردید مطابقت نداشت .",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "سرویس با موفقیت اضافه شد",
290 "settings.searchService" : "جستجوی سرویس ها",
291 "settings.service.error.goBack" : "بازگشت به سرویس ها",
292 "settings.service.error.headline" : "خطا ",
293 "settings.service.error.message" : "دستورالعمل سرویس بارگذاری نشد.",
294 "settings.service.form.addServiceHeadline" : "اضافه کردن {نام}",
295 "settings.service.form.availableServices" : "سرویس های موجود",
296 "settings.service.form.customUrl" : "سرور سفارشی",
297 "settings.service.form.customUrlPremiumInfo" : "برای اضافه کردن سرویس هایی که خود دارید ، نیاز به پشتیبانی پیشرفته فرانز را دارید",
298 "settings.service.form.customUrlUpgradeAccount" : "اکانت خود را ارتقا دهید",
299 "settings.service.form.customUrlValidationError" : "نتوانستیم سرور {نام} را تایید اعتبار کنیم",
300 "settings.service.form.deleteButton" : "حذف سرویس",
301 "settings.service.form.editServiceHeadline" : "ویرایش {name}",
302 "settings.service.form.enableAudio" : "فعال‌سازی صدا",
303 "settings.service.form.enableBadge" : "نماد پیام خوانده نشده را نشان بده ",
304 "settings.service.form.enableDarkMode" : "فعالسازی حالت شب",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "فعال سازی اعلان‌ها",
307 "settings.service.form.enableService" : "فعال سازی سرویس ها",
308 "settings.service.form.headlineBadges" : "نماد پیام های خوانده نشده ",
309 "settings.service.form.headlineGeneral" : "عمومی",
310 "settings.service.form.headlineNotifications" : "اعلان‌ها",
311 "settings.service.form.icon" : "آیکون پیشفرض",
312 "settings.service.form.iconDelete" : "حذف",
313 "settings.service.form.iconUpload" : "عکس خود را به اینجا بکشید و یا اینجا را کیلیک کنید",
314 "settings.service.form.indirectMessageInfo" : "شما از تمامی پیام های جدید در کانال ها با خبر خواهید شد نه تنها در @usernam , @channel , @here , ...",
315 "settings.service.form.indirectMessages" : "نماد پیام را برای تمامی پیام های جدید نشان بده",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "زمان غیرفعالی ، تمامی اعلان ها ،صداها و صداهای پشت زمینه را ببند.",
318 "settings.service.form.name" : "نام",
319 "settings.service.form.proxy.headline" : "تنظیمات پروکسی HTTP\/HTTPS",
320 "settings.service.form.proxy.host" : "آی پی پروکسی",
321 "settings.service.form.proxy.info" : "تنظیمات پروکسی در سرورهای فرَنز ذخیره نخواهد شد.",
322 "settings.service.form.proxy.isEnabled" : "استفاده از پروکسی",
323 "settings.service.form.proxy.password" : "رمزعبور (اختیاری)",
324 "settings.service.form.proxy.port" : "درگاه",
325 "settings.service.form.proxy.restartInfo" : "لطفا پس از تغییر تنظیمات پروکسی، فرَنز رو ریستارت کن.",
326 "settings.service.form.proxy.user" : "کاربر (اختیاری)",
327 "settings.service.form.saveButton" : "ذخیره سرویس",
328 "settings.service.form.tabHosted" : "میزبان شده",
329 "settings.service.form.tabOnPremise" : "خود میزبانی",
330 "settings.service.form.team" : "گروه",
331 "settings.service.form.useHostedService" : "از هاست سرویس {نام} استفاده شود.",
332 "settings.service.form.yourServices" : "سرویس های شما",
333 "settings.services.deletedInfo" : "سرویس حذف شده است",
334 "settings.services.discoverServices" : "آشکار سازی سرویس ها ",
335 "settings.services.headline" : "سرویس های شما",
336 "settings.services.noServicesAdded" : "شما هیچ سرویسی هنوز اضافه نکرده اید ",
337 "settings.services.servicesRequestFailed" : "سرویس های شما بارگیری نشدن",
338 "settings.services.tooltip.isDisabled" : "سرویس غیرفعال است",
339 "settings.services.tooltip.isMuted" : "تمامی صدا ها قطع هستند .",
340 "settings.services.tooltip.notificationsDisabled" : "اعلان ها غیرفعالند.",
341 "settings.services.updatedInfo" : "تغییرات شما ذخیره شد .",
342 "settings.team.contentHeadline" : "فرَنز برای گروه ها",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "گروه",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "گروهتو تو meetfranz.com مدیریت کن",
347 "settings.team.upgradeAction" : "حسابت رو ارتقا بده",
348 "settings.user.form.accountType.company" : "شرکت",
349 "settings.user.form.accountType.individual" : "شخص",
350 "settings.user.form.accountType.label" : "نوع حساب",
351 "settings.user.form.accountType.non-profit" : "شرکت خصوصی",
352 "settings.user.form.currentPassword" : "گذرواژهٔ فعلی",
353 "settings.user.form.email" : "ایمیل",
354 "settings.user.form.firstname" : "نام",
355 "settings.user.form.lastname" : "نام خانوادگی",
356 "settings.user.form.newPassword" : "گذرواژهٔ جدید",
357 "settings.workspace.add.form.name" : "نام",
358 "settings.workspace.add.form.submitButton" : "ایجاد فضای کاری",
359 "settings.workspace.form.buttonDelete" : "حذف فضای کاری",
360 "settings.workspace.form.buttonSave" : "ذخیره فضای کاری",
361 "settings.workspace.form.name" : "نام",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "سرویس های این فضای کاری",
363 "settings.workspace.form.yourWorkspaces" : "فضاهای کاری شما",
364 "settings.workspaces.deletedInfo" : "فضای کاری حذف شد",
365 "settings.workspaces.headline" : "فضاهای کاری شما",
366 "settings.workspaces.noWorkspacesAdded" : "هنوز فضای کاری اضافه نکردی.",
367 "settings.workspaces.tryReloadWorkspaces" : "تلاش مجدد ",
368 "settings.workspaces.updatedInfo" : "تغییرات ذخیره شدن",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "فضاهای کاری بارگذاری نشدند",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "اضافه کردن سرویس جدید",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "بستن کشوی فضای کاری",
378 "sidebar.muteApp" : "غیرفعال کردن اعلان ها و صدا",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "بازکردن کشوی فضای کاری",
381 "sidebar.settings" : "تنظیمات",
382 "sidebar.unmuteApp" : "فعال سازی اعلان ها و صدا",
383 "signup.email.label" : "نشانی ایمیل",
384 "signup.emailDuplicate" : "یک کاربر با این ایمیل هم اکنون موجود است.",
385 "signup.firstname.label" : "نام",
386 "signup.headline" : "ثبت نام",
387 "signup.lastname.label" : "نام خانوادگی",
388 "signup.legal.info" : "با ایجاد حساب فرانز شما قبول کرده اید که ",
389 "signup.legal.privacy" : "قوانین خصوصی سازی",
390 "signup.legal.terms" : "شرایط ارائهٔ خدمات",
391 "signup.link.login" : "صاحب اکانت هستید ؟ وارد شوید",
392 "signup.password.label" : "رمز عبور",
393 "signup.submit.label" : "ایجاد حساب جدید",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "انصراف",
406 "subscriptionPopup.buttonDone" : "انجام شد",
407 "tabs.item.deleteService" : "حذف سرویس",
408 "tabs.item.disableAudio" : "غیرفعال کردن صدا",
409 "tabs.item.disableNotifications" : "غیر فعال کردن اعلان ها",
410 "tabs.item.disableService" : "غیر فعال کردن سرویس",
411 "tabs.item.edit" : "ویرایش",
412 "tabs.item.enableAudio" : "فعال‌سازی صدا",
413 "tabs.item.enableNotification" : "فعال سازی اعلان‌ها",
414 "tabs.item.enableService" : "فعال سازی سرویس",
415 "tabs.item.reload" : "بارگذاری مجدد",
416 "validation.email" : "{فیلد} معتبر نیست",
417 "validation.minLength" : "{فیلد} باید حداقل{طول} کاراکتر داشته باشد",
418 "validation.oneRequired" : "حداقل یکی الزامی هست",
419 "validation.required" : "{فیلد} نیاز است ",
420 "validation.url" : "{فیلد} URL معتبر نیست",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "بارگذاری مجدد",
426 "welcome.loginButton" : "وارد شدن به اکانت خود",
427 "welcome.signupButton" : "ساخت یک حساب کاربری",
428 "workspaceDrawer.addNewWorkspaceLabel" : "افزودن فضای کاری جدید",
429 "workspaceDrawer.allServices" : "همه سرویس ها",
430 "workspaceDrawer.headline" : "فضاهای کاری",
431 "workspaceDrawer.item.contextMenuEdit" : "ویرایش",
432 "workspaceDrawer.item.noServicesAddedYet" : "هنوز هیچ سرویسی اضافه نشده",
433 "workspaceDrawer.premiumCtaButtonLabel" : "اولین فضای کاریتو درست کن",
434 "workspaceDrawer.proFeatureBadge" : "امکانات ویژه",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "فعالسازی مجدد حساب ویژه",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "ویرایش تنظیمات فضاهای کاری",
438 "workspaces.switchingIndicator.switchingTo" : "سویچ به"
439}
diff --git a/src/i18n/locales/fil.json b/src/i18n/locales/fil.json
new file mode 100644
index 000000000..c6347a635
--- /dev/null
+++ b/src/i18n/locales/fil.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Reload",
3 "app.errorHandler.headline" : "Something went wrong",
4 "connectionLostBanner.cta" : "Reload Service",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "Send as email",
33 "feature.shareFranz.action.facebook" : "Share on Facebook",
34 "feature.shareFranz.action.twitter" : "Share on Twitter",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "Hindi maka connect sa 'Franz online services'",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "Hindi ka naka connect sa internet.",
52 "global.spellchecker.useDefault" : "Use System Default ({default})",
53 "global.spellchecking.autodetect" : "Detect language automatically",
54 "global.spellchecking.autodetect.short" : "Automatic",
55 "global.spellchecking.language" : "Spell checking language",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "Ilagay ang iyonhg Franz 4 services",
58 "import.notSupportedHeadline" : "Ang mga services ay hindi pa supported ni Franz 5",
59 "import.skip.label" : "Gusto kong magdagdag",
60 "import.submit.label" : "Magdagdag ng serbisyo",
61 "infobar.buttonChangelog" : "Ano ang bago?",
62 "infobar.buttonInstallUpdate" : "Mag restart at i-install ang update",
63 "infobar.buttonReloadServices" : "I-load muli ang mga serbisyo",
64 "infobar.requiredRequestsFailed" : "Hindi mai-load ang mga serbisyo at ang impormasyon tungkol sa user.",
65 "infobar.servicesUpdated" : "Na-update na ang iyong mga serbisyo.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "May bagong update.",
68 "invite.email.label" : "Email Address",
69 "invite.headline.friends" : "Invite 3 of your friends or colleagues",
70 "invite.name.label" : "Name",
71 "invite.skip.label" : "I want to do this later",
72 "invite.submit.label" : "Send invites",
73 "invite.successInfo" : "Invitations sent successfully",
74 "login.email.label" : "Email Address",
75 "login.headline" : "Sign in",
76 "login.invalidCredentials" : "Email or password not valid",
77 "login.link.password" : "Reset password",
78 "login.link.signup" : "Create a free account",
79 "login.password.label" : "Password",
80 "login.serverLogout" : "Your session expired, please login again.",
81 "login.submit.label" : "Sign in",
82 "login.tokenExpired" : "Your session expired, please login again.",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "About Franz",
86 "menu.app.announcement" : "What's new?",
87 "menu.app.checkForUpdates" : "Check for updates",
88 "menu.app.hide" : "Hide",
89 "menu.app.hideOthers" : "Hide Others",
90 "menu.app.quit" : "Quit",
91 "menu.app.settings" : "Settings",
92 "menu.app.unhide" : "Unhide",
93 "menu.edit" : "Edit",
94 "menu.edit.copy" : "Copy",
95 "menu.edit.cut" : "Cut",
96 "menu.edit.delete" : "Delete",
97 "menu.edit.emojiSymbols" : "Emoji & Symbols",
98 "menu.edit.paste" : "Paste",
99 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
100 "menu.edit.redo" : "Redo",
101 "menu.edit.selectAll" : "Select All",
102 "menu.edit.speech" : "Speech",
103 "menu.edit.startDictation" : "Start Dictation",
104 "menu.edit.startSpeaking" : "Start Speaking",
105 "menu.edit.stopSpeaking" : "Stop Speaking",
106 "menu.edit.undo" : "Undo",
107 "menu.file" : "File",
108 "menu.help" : "Help",
109 "menu.help.changelog" : "Changelog",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "Learn More",
114 "menu.help.privacy" : "Privacy Statement",
115 "menu.help.support" : "Support",
116 "menu.help.tos" : "Terms of Service",
117 "menu.services" : "Services",
118 "menu.services.activatePreviousService" : "Activate previous service",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "Activate next service",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "View",
125 "menu.view.enterFullScreen" : "Enter Full Screen",
126 "menu.view.exitFullScreen" : "Exit Full Screen",
127 "menu.view.reloadFranz" : "Reload Franz",
128 "menu.view.reloadService" : "Reload Service",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "Actual Size",
131 "menu.view.toggleDevTools" : "Toggle Developer Tools",
132 "menu.view.toggleFullScreen" : "Toggle Full Screen",
133 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "Zoom In",
136 "menu.view.zoomOut" : "Zoom Out",
137 "menu.window" : "Window",
138 "menu.window.close" : "Close",
139 "menu.window.minimize" : "Minimize",
140 "menu.workspaces" : "Workspaces",
141 "menu.workspaces.addNewWorkspace" : "Add New Workspace...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
143 "menu.workspaces.defaultWorkspace" : "All services",
144 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
145 "password.email.label" : "Email Address",
146 "password.headline" : "Reset password",
147 "password.link.login" : "Sign in to your account",
148 "password.link.signup" : "Create a free account",
149 "password.noUser" : "No user with that email address was found",
150 "password.submit.label" : "Submit",
151 "password.successInfo" : "Please check your email",
152 "premiumFeature.button.upgradeAccount" : "Upgrade account",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "Reload {name}",
191 "service.crashHandler.autoReload" : "Trying to automatically restore {name} in {seconds} seconds",
192 "service.crashHandler.headline" : "Oh no!",
193 "service.crashHandler.text" : "{name} has caused an error.",
194 "service.disabledHandler.action" : "Enable {name}",
195 "service.disabledHandler.headline" : "{name} is disabled",
196 "service.errorHandler.action" : "Reload {name}",
197 "service.errorHandler.editAction" : "Edit {name}",
198 "service.errorHandler.headline" : "Oh no!",
199 "service.errorHandler.message" : "Error",
200 "service.errorHandler.text" : "{name} has failed to load.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "Loading",
207 "services.getStarted" : "Get started",
208 "services.welcome" : "Welcome to Franz",
209 "settings.account.account.editButton" : "Edit account",
210 "settings.account.accountType.basic" : "Basic Account",
211 "settings.account.accountType.premium" : "Premium Supporter Account",
212 "settings.account.buttonSave" : "Update profile",
213 "settings.account.deleteAccount" : "Delete account",
214 "settings.account.deleteEmailSent" : "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
215 "settings.account.deleteInfo" : "If you don't need your Franz account any longer, you can delete your account and all related data here.",
216 "settings.account.headline" : "Account",
217 "settings.account.headlineAccount" : "Account information",
218 "settings.account.headlineDangerZone" : "Danger Zone",
219 "settings.account.headlineInvoices" : "Invoices",
220 "settings.account.headlinePassword" : "Change password",
221 "settings.account.headlineProfile" : "Update profile",
222 "settings.account.headlineSubscription" : "Your subscription",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "Download",
226 "settings.account.manageSubscription.label" : "Manage your subscription",
227 "settings.account.successInfo" : "Your changes have been saved",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "Try again",
232 "settings.account.tryReloadUserInfoRequest" : "Try again",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "Could not load user information",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "Clear cache",
237 "settings.app.buttonInstallUpdate" : "Mag restart at i-install ang update",
238 "settings.app.buttonSearchForUpdate" : "Check for updates",
239 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.",
240 "settings.app.currentVersion" : "Current version:",
241 "settings.app.form.autoLaunchInBackground" : "Open in background",
242 "settings.app.form.autoLaunchOnStart" : "Launch Franz on start",
243 "settings.app.form.beta" : "Include beta versions",
244 "settings.app.form.darkMode" : "Join the Dark Side",
245 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
246 "settings.app.form.enableSpellchecking" : "Enable spell checking",
247 "settings.app.form.enableSystemTray" : "Show Franz in system tray",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "Language",
251 "settings.app.form.minimizeToSystemTray" : "Minimize Franz to system tray",
252 "settings.app.form.runInBackground" : "Keep Franz in background when closing the window",
253 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
255 "settings.app.headline" : "Settings",
256 "settings.app.headlineAdvanced" : "Advanced",
257 "settings.app.headlineAppearance" : "Appearance",
258 "settings.app.headlineGeneral" : "General",
259 "settings.app.headlineLanguage" : "Language",
260 "settings.app.headlineUpdates" : "Updates",
261 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.",
262 "settings.app.restartRequired" : "Changes require restart",
263 "settings.app.subheadlineCache" : "Cache",
264 "settings.app.translationHelp" : "Help us to translate Franz into your language.",
265 "settings.app.updateStatusAvailable" : "Update available, downloading...",
266 "settings.app.updateStatusSearching" : "Is searching for update",
267 "settings.app.updateStatusUpToDate" : "You are using the latest version of Franz",
268 "settings.invite.headline" : "Invite Friends",
269 "settings.navigation.account" : "Account",
270 "settings.navigation.availableServices" : "Available services",
271 "settings.navigation.inviteFriends" : "Invite Friends",
272 "settings.navigation.logout" : "Logout",
273 "settings.navigation.settings" : "Settings",
274 "settings.navigation.team" : "Manage Team",
275 "settings.navigation.yourServices" : "Your services",
276 "settings.navigation.yourWorkspaces" : "Your workspaces",
277 "settings.recipes.all" : "All services",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "Available services",
286 "settings.recipes.missingService" : "Missing a service?",
287 "settings.recipes.mostPopular" : "Most popular",
288 "settings.recipes.nothingFound" : "Sorry, but no service matched your search term.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Service successfully added",
290 "settings.searchService" : "Search service",
291 "settings.service.error.goBack" : "Back to services",
292 "settings.service.error.headline" : "Error",
293 "settings.service.error.message" : "Could not load service recipe.",
294 "settings.service.form.addServiceHeadline" : "Add {name}",
295 "settings.service.form.availableServices" : "Available services",
296 "settings.service.form.customUrl" : "Custom server",
297 "settings.service.form.customUrlPremiumInfo" : "To add self hosted services, you need a Franz Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount" : "Upgrade your account",
299 "settings.service.form.customUrlValidationError" : "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton" : "Delete service",
301 "settings.service.form.editServiceHeadline" : "Edit {name}",
302 "settings.service.form.enableAudio" : "Enable audio",
303 "settings.service.form.enableBadge" : "Show unread message badges",
304 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "Enable notifications",
307 "settings.service.form.enableService" : "Enable service",
308 "settings.service.form.headlineBadges" : "Unread message badges",
309 "settings.service.form.headlineGeneral" : "General",
310 "settings.service.form.headlineNotifications" : "Notifications",
311 "settings.service.form.icon" : "Custom icon",
312 "settings.service.form.iconDelete" : "Delete",
313 "settings.service.form.iconUpload" : "Drop your image, or click here",
314 "settings.service.form.indirectMessageInfo" : "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "Show message badge for all new messages",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
318 "settings.service.form.name" : "Name",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
320 "settings.service.form.proxy.host" : "Proxy Host\/IP",
321 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
322 "settings.service.form.proxy.isEnabled" : "Use Proxy",
323 "settings.service.form.proxy.password" : "Password (optional)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.",
326 "settings.service.form.proxy.user" : "User (optional)",
327 "settings.service.form.saveButton" : "Save service",
328 "settings.service.form.tabHosted" : "Hosted",
329 "settings.service.form.tabOnPremise" : "Self hosted ⭐️",
330 "settings.service.form.team" : "Team",
331 "settings.service.form.useHostedService" : "Use the hosted {name} service.",
332 "settings.service.form.yourServices" : "Your services",
333 "settings.services.deletedInfo" : "Service has been deleted",
334 "settings.services.discoverServices" : "Discover services",
335 "settings.services.headline" : "Your services",
336 "settings.services.noServicesAdded" : "You haven't added any services yet.",
337 "settings.services.servicesRequestFailed" : "Could not load your services",
338 "settings.services.tooltip.isDisabled" : "Service is disabled",
339 "settings.services.tooltip.isMuted" : "All sounds are muted",
340 "settings.services.tooltip.notificationsDisabled" : "Notifications are disabled",
341 "settings.services.updatedInfo" : "Your changes have been saved",
342 "settings.team.contentHeadline" : "Franz for Teams",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "Team",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
347 "settings.team.upgradeAction" : "Upgrade your Account",
348 "settings.user.form.accountType.company" : "Company",
349 "settings.user.form.accountType.individual" : "Individual",
350 "settings.user.form.accountType.label" : "Account type",
351 "settings.user.form.accountType.non-profit" : "Non-Profit",
352 "settings.user.form.currentPassword" : "Current password",
353 "settings.user.form.email" : "Email",
354 "settings.user.form.firstname" : "First Name",
355 "settings.user.form.lastname" : "Last Name",
356 "settings.user.form.newPassword" : "New password",
357 "settings.workspace.add.form.name" : "Name",
358 "settings.workspace.add.form.submitButton" : "Create workspace",
359 "settings.workspace.form.buttonDelete" : "Delete workspace",
360 "settings.workspace.form.buttonSave" : "Save workspace",
361 "settings.workspace.form.name" : "Name",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
363 "settings.workspace.form.yourWorkspaces" : "Your workspaces",
364 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
365 "settings.workspaces.headline" : "Your workspaces",
366 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
367 "settings.workspaces.tryReloadWorkspaces" : "Try again",
368 "settings.workspaces.updatedInfo" : "Your changes have been saved",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "Add new service",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer",
378 "sidebar.muteApp" : "Disable notifications & audio",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
381 "sidebar.settings" : "Settings",
382 "sidebar.unmuteApp" : "Enable notifications & audio",
383 "signup.email.label" : "Email Address",
384 "signup.emailDuplicate" : "A user with that email address already exists",
385 "signup.firstname.label" : "First Name",
386 "signup.headline" : "Sign up",
387 "signup.lastname.label" : "Last Name",
388 "signup.legal.info" : "By creating a Franz account you accept the",
389 "signup.legal.privacy" : "Privacy Statement",
390 "signup.legal.terms" : "Terms of service",
391 "signup.link.login" : "Already have an account, sign in?",
392 "signup.password.label" : "Password",
393 "signup.submit.label" : "Create account",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "Cancel",
406 "subscriptionPopup.buttonDone" : "Done",
407 "tabs.item.deleteService" : "Delete service",
408 "tabs.item.disableAudio" : "Disable audio",
409 "tabs.item.disableNotifications" : "Disable notifications",
410 "tabs.item.disableService" : "Disable service",
411 "tabs.item.edit" : "Edit",
412 "tabs.item.enableAudio" : "Enable audio",
413 "tabs.item.enableNotification" : "Enable notifications",
414 "tabs.item.enableService" : "Enable service",
415 "tabs.item.reload" : "Reload",
416 "validation.email" : "{field} is not valid",
417 "validation.minLength" : "{field} should be at least {length} characters long",
418 "validation.oneRequired" : "At least one is required",
419 "validation.required" : "{field} is required",
420 "validation.url" : "{field} is not a valid URL",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "Reload",
426 "welcome.loginButton" : "Login to your account",
427 "welcome.signupButton" : "Create a free account",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "All services",
430 "workspaceDrawer.headline" : "Workspaces",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json
new file mode 100644
index 000000000..5954daa86
--- /dev/null
+++ b/src/i18n/locales/hi.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "पुन: लोड करें",
3 "app.errorHandler.headline" : "कुछ तो गड़बड़ है, दया",
4 "connectionLostBanner.cta" : "सेवा पुनः लोड करें",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "फ्रांज़ के संस्करण {version} में बदलाव:",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "फ्रांज़ {seconds} सेकंड में जारी रहेगा।",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "खाते का उन्नयन करें",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "ईमेल के रूप में भेजें",
33 "feature.shareFranz.action.facebook" : "फेसबुक पर सांझा करें",
34 "feature.shareFranz.action.twitter" : "ट्विटर पर सांझा करें",
35 "feature.shareFranz.headline" : "फ्रांज़ एक साथ बेहतर है!",
36 "feature.shareFranz.shareText.email" : "मैंने फ्रांज में {count} सेवाएं जोड़ी हैं! व्हाट्सएप, मैसेंजर, स्लैक, स्काइप के लिए मुफ्त ऐप www.meetfranz.com पर प्राप्त करें",
37 "feature.shareFranz.shareText.twitter" : "मैंने फ्रांज में {count} सेवाएं जोड़ी हैं! व्हाट्सएप, मैसेंजर, स्लैक, स्काइप के लिए मुफ्त ऐप www.meetfranz.com पर प्राप्त करें \/ cc @FranzMessenger",
38 "feature.shareFranz.text" : "अपने दोस्तों और सहकर्मियों को बताएं की फ्रांज़ कितना बढ़िया है और हमें इस बात को फैलाने में मदद करें।",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "फ्रांज़ ऑनलाइन सेवाओं से कनेक्ट नहीं किया जा सका",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "आप इंटरनेट से नहीं जुड़े हैं।",
52 "global.spellchecker.useDefault" : "सिस्टम डिफ़ॉल्ट ({default}) का उपयोग करें",
53 "global.spellchecking.autodetect" : "स्वचालित रूप से भाषा का पता लगाएं",
54 "global.spellchecking.autodetect.short" : "स्वचालित",
55 "global.spellchecking.language" : "वर्तनी जाँच भाषा",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "अपनी फ्रांज़ 4 की सेवाओं का आयात करें",
58 "import.notSupportedHeadline" : "सेवाएं अभी तक फ्रांज़ 5 में समर्थित नहीं हैं",
59 "import.skip.label" : "मैं स्वयं सेवाएं जोड़ना चाहता हूं",
60 "import.submit.label" : "सेवाएं आयात करें",
61 "infobar.buttonChangelog" : "क्या-क्या नया है?",
62 "infobar.buttonInstallUpdate" : "पुनरारंभ करें, और अद्यतन स्थापित करें",
63 "infobar.buttonReloadServices" : "सेवाओं को फिर से लोड करें",
64 "infobar.requiredRequestsFailed" : "सेवाएं और उपयोगकर्ताओं की जानकारी लोड नहीं हो सकी",
65 "infobar.servicesUpdated" : "आपकी सेवाएं अपडेट कर दी गई हैं।",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "फ्रांज़ के लिए एक नया अपडेट उपलब्ध है।",
68 "invite.email.label" : "ईमेल पता",
69 "invite.headline.friends" : "अपने दोस्तों या सहयोगियों में से 3 को आमंत्रित करें",
70 "invite.name.label" : "नाम",
71 "invite.skip.label" : "मैं इसे बाद में करना चाहता हूं",
72 "invite.submit.label" : "आमंत्रण भेजें",
73 "invite.successInfo" : "निमंत्रण सफलतापूर्वक भेजे गए",
74 "login.email.label" : "ईमेल पता",
75 "login.headline" : "लॉग इन करें",
76 "login.invalidCredentials" : "ईमेल या पासवर्ड मान्य नहीं है",
77 "login.link.password" : "पासवर्ड रीसेट",
78 "login.link.signup" : "एक नि: शुल्क खाता बनाए",
79 "login.password.label" : "पासवर्ड",
80 "login.serverLogout" : "आपका सत्र समाप्त हो गया है, कृपया फिर से लॉगिन करें।",
81 "login.submit.label" : "लॉग इन करें",
82 "login.tokenExpired" : "आपका सत्र समाप्त हो गया है, कृपया फिर से लॉगिन करें।",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "फ्रांज के बारे में",
86 "menu.app.announcement" : "नया क्या है?",
87 "menu.app.checkForUpdates" : "अद्यतन के लिए जाँचें...",
88 "menu.app.hide" : "छिपाएं ",
89 "menu.app.hideOthers" : "दूसरों को छिपाओ",
90 "menu.app.quit" : "छोड़ो",
91 "menu.app.settings" : "सेटिंग्स",
92 "menu.app.unhide" : "सामने लाएँ",
93 "menu.edit" : "संपादित करें",
94 "menu.edit.copy" : "प्रतिलिपि",
95 "menu.edit.cut" : "काटो",
96 "menu.edit.delete" : "मिटाओ",
97 "menu.edit.emojiSymbols" : "इमोजी और प्रतीक",
98 "menu.edit.paste" : "चिपकाएं",
99 "menu.edit.pasteAndMatchStyle" : "पेस्ट और मैच स्टाइल",
100 "menu.edit.redo" : "फिर से करना",
101 "menu.edit.selectAll" : "सभी का चयन करे",
102 "menu.edit.speech" : "भाषण",
103 "menu.edit.startDictation" : "श्रुतलेख शुरू करें",
104 "menu.edit.startSpeaking" : "बोलना शुरू करें",
105 "menu.edit.stopSpeaking" : "बोलना बंद करें",
106 "menu.edit.undo" : "पूर्ववत् करें",
107 "menu.file" : "फ़ाइल",
108 "menu.help" : "मदद",
109 "menu.help.changelog" : "चेंजलॉग",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "अधिक जानें",
114 "menu.help.privacy" : "प्राइवेसी स्टेटमेंट",
115 "menu.help.support" : "सहयोग",
116 "menu.help.tos" : "सेवा की शर्तें",
117 "menu.services" : "सेवाएं",
118 "menu.services.activatePreviousService" : "पिछली सेवा को सक्रिय करें",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "अगली सेवा सक्रिय करें",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "दृश्य",
125 "menu.view.enterFullScreen" : "पूर्ण स्क्रीन में प्रवेश",
126 "menu.view.exitFullScreen" : "पूर्ण स्क्रीन से निकलें",
127 "menu.view.reloadFranz" : "फ्रांज़ को पुनः लोड",
128 "menu.view.reloadService" : "सेवा पुनः लोड करें",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "वास्तविक आकार",
131 "menu.view.toggleDevTools" : "डेवलपर टूल टॉगल करें",
132 "menu.view.toggleFullScreen" : "फुलस्क्रीन टॉगल करें",
133 "menu.view.toggleServiceDevTools" : "सेवा डेवलपर उपकरण टॉगल करें",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "बड़ा करें",
136 "menu.view.zoomOut" : "छोटा करें",
137 "menu.window" : "खिड़की",
138 "menu.window.close" : "बंद करें",
139 "menu.window.minimize" : "न्यूनतम करें",
140 "menu.workspaces" : "कार्यस्थान",
141 "menu.workspaces.addNewWorkspace" : "नया कार्यक्षेत्र जोड़ें ...",
142 "menu.workspaces.closeWorkspaceDrawer" : "कार्यक्षेत्र दराज को बंद करें",
143 "menu.workspaces.defaultWorkspace" : "सभी सेवाएं",
144 "menu.workspaces.openWorkspaceDrawer" : "कार्यक्षेत्र दराज खोलें",
145 "password.email.label" : "ईमेल पता",
146 "password.headline" : "पासवर्ड रीसेट",
147 "password.link.login" : "अपने अकाउंट में लॉग इन करें",
148 "password.link.signup" : "एक नि: शुल्क खाता बनाए",
149 "password.noUser" : "उस ईमेल पते वाला कोई उपयोगकर्ता नहीं मिला",
150 "password.submit.label" : "जमा करें",
151 "password.successInfo" : "कृपया अपनी ईमेल देखें",
152 "premiumFeature.button.upgradeAccount" : "खाते का उन्नयन करें",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "कार्यस्थान",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "{name} को पुनः लोड करें ",
191 "service.crashHandler.autoReload" : "{name} को {seconds} सेकंड में स्वचालित रूप से पुनर्स्थापित करने की कोशिश जारी है",
192 "service.crashHandler.headline" : "अरे नहीं!",
193 "service.crashHandler.text" : "{name} में त्रुटि हुई है।",
194 "service.disabledHandler.action" : "{name} सक्षम करें",
195 "service.disabledHandler.headline" : "{name} अक्षम है",
196 "service.errorHandler.action" : "{name} को पुनः लोड करें",
197 "service.errorHandler.editAction" : "{name} को संपादित करें",
198 "service.errorHandler.headline" : "अरे नहीं!",
199 "service.errorHandler.message" : "त्रुटि",
200 "service.errorHandler.text" : "{name} लोड करने में विफलता हुई ",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "लोड हो रहा है",
207 "services.getStarted" : "आरंभ करें",
208 "services.welcome" : "फ्रांज़ में आपका स्वागत है",
209 "settings.account.account.editButton" : "खाता संपादित करें",
210 "settings.account.accountType.basic" : "मूल खाता",
211 "settings.account.accountType.premium" : "प्रीमियम समर्थक खाता",
212 "settings.account.buttonSave" : "प्रोफ़ाइल अपडेट करें",
213 "settings.account.deleteAccount" : "खाता मिटाएं",
214 "settings.account.deleteEmailSent" : "आपको अपने खाते को हटाने की पुष्टि करने के लिए एक लिंक प्राप्त हुआ है। आपके खाते और डेटा को पुनर्स्थापित नहीं किया जा सकता है!",
215 "settings.account.deleteInfo" : "यदि आपको अपने फ्रांज़ खाते की आवश्यकता नहीं है, तो आप यहां अपना खाता और संबंधित डेटा हटा सकते हैं।",
216 "settings.account.headline" : "खाता",
217 "settings.account.headlineAccount" : "खाते की जानकारी",
218 "settings.account.headlineDangerZone" : "खतरे का क्षेत्र",
219 "settings.account.headlineInvoices" : "चालान",
220 "settings.account.headlinePassword" : "पासवर्ड बदलें",
221 "settings.account.headlineProfile" : "प्रोफ़ाइल अपडेट करें",
222 "settings.account.headlineSubscription" : "आपकी सदस्यता",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "डाउनलोड",
226 "settings.account.manageSubscription.label" : "अपनी सदस्यता प्रबंधित करें",
227 "settings.account.successInfo" : "आपके परिवर्तनों को सहेजा गया है",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "फिर कोशिश करें",
232 "settings.account.tryReloadUserInfoRequest" : "फिर कोशिश करें",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "उपयोगकर्ता की जानकारी लोड नहीं हो सकी",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "कैश को साफ़ करें",
237 "settings.app.buttonInstallUpdate" : "पुनरारंभ करें, और अद्यतन स्थापित करें",
238 "settings.app.buttonSearchForUpdate" : "अद्यतन के लिए खोजें",
239 "settings.app.cacheInfo" : "फ्रांज़ कैश वर्तमान में आपके डिस्क का {size} उपयोग कर रहा है।",
240 "settings.app.currentVersion" : "वर्तमान संस्करण:",
241 "settings.app.form.autoLaunchInBackground" : "पृष्ठभूमि में खोलें",
242 "settings.app.form.autoLaunchOnStart" : "कंप्यूटर शुरू होते ही क्या फ्रांज़ भी लॉन्च होना चाहिए?",
243 "settings.app.form.beta" : "बीटा संस्करण शामिल करें",
244 "settings.app.form.darkMode" : "डार्क मोड सक्षम करें",
245 "settings.app.form.enableGPUAcceleration" : "GPU त्वरण सक्षम करें",
246 "settings.app.form.enableSpellchecking" : "शब्द विन्यास सक्रिय करो",
247 "settings.app.form.enableSystemTray" : "फ्रांज़ को सिस्टम ट्रे में दिखाएं",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "भाषा",
251 "settings.app.form.minimizeToSystemTray" : "फ्रांज़ को सिस्टम ट्रे में न्यूनतम करें",
252 "settings.app.form.runInBackground" : "खिड़की बंद करते समय फ्रांज को पृष्ठभूमि में रखें",
253 "settings.app.form.showDisabledServices" : "अक्षम सेवाओं टैब प्रदर्शित करें",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "जब सूचनाएं अक्षम हों तो अपठित संदेश बैज दिखाएं",
255 "settings.app.headline" : "सेटिंग्स",
256 "settings.app.headlineAdvanced" : "विकसित",
257 "settings.app.headlineAppearance" : "रूप",
258 "settings.app.headlineGeneral" : "सामान्य",
259 "settings.app.headlineLanguage" : "भाषा",
260 "settings.app.headlineUpdates" : "अद्यतन",
261 "settings.app.languageDisclaimer" : "आधिकारिक अनुवाद अंग्रेजी और जर्मन में हैं। अन्य सभी भाषाएँ समुदाय आधारित अनुवाद हैं।",
262 "settings.app.restartRequired" : "परिवर्तनों को पुनरारंभ की आवश्यकता है",
263 "settings.app.subheadlineCache" : "कैश",
264 "settings.app.translationHelp" : "आपकी भाषा में फ्रांज़ का अनुवाद करने में हमारी मदद करें।",
265 "settings.app.updateStatusAvailable" : "अद्यतन उपलब्ध है, डाउनलोड हो रहा है ...",
266 "settings.app.updateStatusSearching" : "अद्यतन की खोज जारी है",
267 "settings.app.updateStatusUpToDate" : "आप फ्रांज़ के नवीनतम संस्करण का उपयोग कर रहे हैं",
268 "settings.invite.headline" : "मित्रों को आमंत्रित करें",
269 "settings.navigation.account" : "खाता",
270 "settings.navigation.availableServices" : "उपलब्ध सेवाएं",
271 "settings.navigation.inviteFriends" : "मित्रों को आमंत्रित करें",
272 "settings.navigation.logout" : "लॉग आउट",
273 "settings.navigation.settings" : "सेटिंग्स",
274 "settings.navigation.team" : "टीम का प्रबंधन करें",
275 "settings.navigation.yourServices" : "आपकी सेवाएं",
276 "settings.navigation.yourWorkspaces" : "आपके कार्यक्षेत्र",
277 "settings.recipes.all" : "सभी सेवाएं",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "उपलब्ध सेवाएं",
286 "settings.recipes.missingService" : "क्या कोई सेवा गुम है?",
287 "settings.recipes.mostPopular" : "सबसे लोकप्रिय",
288 "settings.recipes.nothingFound" : "क्षमा करें, लेकिन आपके खोज शब्द से किसी भी सेवा का मिलान नहीं हुआ।",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "सेवा सफलतापूर्वक जोड़ी गई",
290 "settings.searchService" : "खोज सेवा",
291 "settings.service.error.goBack" : "सेवाओं पर वापस",
292 "settings.service.error.headline" : "त्रुटि",
293 "settings.service.error.message" : "सेवा की रेसिपी लोड नहीं हो पायी।",
294 "settings.service.form.addServiceHeadline" : "{name} जोड़ें",
295 "settings.service.form.availableServices" : "उपलब्ध सेवाएं",
296 "settings.service.form.customUrl" : "कस्टम सर्वर",
297 "settings.service.form.customUrlPremiumInfo" : "स्वयं की होस्ट की गई सेवाओं को जोड़ने के लिए, आपको फ्रांज प्रीमियम सपोर्टर अकाउंट की आवश्यकता है।",
298 "settings.service.form.customUrlUpgradeAccount" : "अपने खाते को अपग्रेड करें",
299 "settings.service.form.customUrlValidationError" : "कस्टम {name} सर्वर का मान्यकरण नहीं किया जा सका।",
300 "settings.service.form.deleteButton" : "सेवा हटाएँ",
301 "settings.service.form.editServiceHeadline" : "{name} संपादित करें",
302 "settings.service.form.enableAudio" : "ऑडियो सक्षम करें",
303 "settings.service.form.enableBadge" : "अपठित संदेश बैज दिखाएं",
304 "settings.service.form.enableDarkMode" : "डार्क मोड सक्षम करें",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "सूचनाएँ सक्षम करें",
307 "settings.service.form.enableService" : "सेवा सक्षम करें",
308 "settings.service.form.headlineBadges" : "अपठित संदेश बैज",
309 "settings.service.form.headlineGeneral" : "सामान्य",
310 "settings.service.form.headlineNotifications" : "सूचनाएँ",
311 "settings.service.form.icon" : "कस्टम आइकॉन",
312 "settings.service.form.iconDelete" : "मिटाएँ",
313 "settings.service.form.iconUpload" : "अपना फ़ोटो छोड़ें, या यहाँ क्लिक करें",
314 "settings.service.form.indirectMessageInfo" : "आपको एक चैनल में सभी नए संदेशों के बारे में सूचित किया जाएगा, न केवल @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "सभी नए संदेशों के लिए संदेश बैज दिखाएं",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "अक्षम होने पर, सभी सूचना ध्वनियाँ और ऑडियो प्लेबैक मौन रहेंगे ",
318 "settings.service.form.name" : "नाम",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS प्रॉक्सी सेटिंग्स",
320 "settings.service.form.proxy.host" : "प्रॉक्सी होस्ट \/ आईपी",
321 "settings.service.form.proxy.info" : "प्रॉक्सी सेटिंग्स फ्रांज़ सर्वर के साथ सिंक नहीं होंगी।",
322 "settings.service.form.proxy.isEnabled" : "प्रॉक्सी का प्रयोग करें",
323 "settings.service.form.proxy.password" : "पासवर्ड (वैकल्पिक)",
324 "settings.service.form.proxy.port" : "पोर्ट",
325 "settings.service.form.proxy.restartInfo" : "प्रॉक्सी सेटिंग बदलने के बाद फ्रांज़ को पुनः आरंभ करें।",
326 "settings.service.form.proxy.user" : "उपयोगकर्ता (वैकल्पिक)",
327 "settings.service.form.saveButton" : "इस सेवा को सहेजें",
328 "settings.service.form.tabHosted" : "होस्ट किया गया",
329 "settings.service.form.tabOnPremise" : "स्वयं द्वारा होस्ट किया हुआ",
330 "settings.service.form.team" : "टीम",
331 "settings.service.form.useHostedService" : "होस्ट किये हुए {name} सेवा का उपयोग करें।",
332 "settings.service.form.yourServices" : "आपकी सेवाएं",
333 "settings.services.deletedInfo" : "सेवा को हटा दिया गया है",
334 "settings.services.discoverServices" : "सेवाओं की खोज करें",
335 "settings.services.headline" : "आपकी सेवाएं",
336 "settings.services.noServicesAdded" : "आपने अभी तक कोई सेवाएं नहीं जोड़ी है।",
337 "settings.services.servicesRequestFailed" : "आपकी सेवाएं लोड नहीं हो सकीं",
338 "settings.services.tooltip.isDisabled" : "सेवा अक्षम है",
339 "settings.services.tooltip.isMuted" : "सभी ध्वनियाँ मौन हैं",
340 "settings.services.tooltip.notificationsDisabled" : "सूचनाएं अक्षम हैं",
341 "settings.services.updatedInfo" : "आपके परिवर्तनों को सहेजा गया है",
342 "settings.team.contentHeadline" : "टीमों के लिए फ्रांज़",
343 "settings.team.copy" : "Franz for Teams आपको ईमेल आमंत्रण भेजकर और अपने खाते की प्राथमिकताओं में उनकी सदस्यता को प्रबंधित करके अपनी टीम में सह-कार्यकर्ताओं को आमंत्रित करने का विकल्प देता है। हर टीम के सदस्य के लिए अलग-अलग सदस्यताएँ सेट करने में समय बर्बाद न करें, कई चालान और विभिन्न बिलिंग चक्रों के बारे में भूल जाएं - एक टीम सभी के लिए !",
344 "settings.team.headline" : "टीम",
345 "settings.team.intro" : "आप और आपकी टीम फ्रांज़ का उपयोग करते हैं? अब आप सभी सहयोगियों, दोस्तों या परिवार के सदस्यों के लिए प्रीमियम सदस्यता का प्रबंधन कर सकते हैं, जैसा कि आप चाहते हैं, सभी एक खाते के भीतर से।",
346 "settings.team.manageAction" : "अपनी टीम को meetfranz.com पर प्रबंधित करें",
347 "settings.team.upgradeAction" : "अपने खाते को अपग्रेड करें",
348 "settings.user.form.accountType.company" : "कंपनी",
349 "settings.user.form.accountType.individual" : "व्यक्तिगत खाता",
350 "settings.user.form.accountType.label" : "खाते का प्रकार",
351 "settings.user.form.accountType.non-profit" : "गैर लाभ",
352 "settings.user.form.currentPassword" : "मौजूदा पासवर्ड",
353 "settings.user.form.email" : "ईमेल",
354 "settings.user.form.firstname" : "पहला नाम",
355 "settings.user.form.lastname" : "उपनाम",
356 "settings.user.form.newPassword" : "नया पासवर्ड",
357 "settings.workspace.add.form.name" : "नाम",
358 "settings.workspace.add.form.submitButton" : "कार्यक्षेत्र बनाएँ",
359 "settings.workspace.form.buttonDelete" : "कार्यक्षेत्र हटाएं",
360 "settings.workspace.form.buttonSave" : "कार्यक्षेत्र सहेजें",
361 "settings.workspace.form.name" : "नाम",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "इस कार्यक्षेत्र में सेवाएँ",
363 "settings.workspace.form.yourWorkspaces" : "आपके कार्यक्षेत्र",
364 "settings.workspaces.deletedInfo" : "कार्यक्षेत्र हटा दिया गया है",
365 "settings.workspaces.headline" : "आपके कार्यक्षेत्र",
366 "settings.workspaces.noWorkspacesAdded" : "आपने अभी तक कोई कार्यस्थान नहीं जोड़ा है।",
367 "settings.workspaces.tryReloadWorkspaces" : "फिर कोशिश करें",
368 "settings.workspaces.updatedInfo" : "आपके परिवर्तनों को सहेजा गया है",
369 "settings.workspaces.workspaceFeatureHeadline" : "कम अधिक है: फ्रांज़ कार्यस्थानों का परिचय",
370 "settings.workspaces.workspaceFeatureInfo" : "फ्रांज वर्कस्पेस आपको इस बात पर ध्यान केंद्रित करने देता है कि अभी क्या महत्वपूर्ण है। सेवाओं के विभिन्न समूहों को तैयार करें और किसी भी समय उनके बीच आसानी से स्विच करें। आप यह तय करते हैं कि आपको कब और कहाँ किन सेवाओं की ज़रूरत है, इसलिए हम आपको अपने खेल में शीर्ष पर बने रहने में मदद कर सकते हैं - या जब भी आप चाहें, आसानी से काम बंद कर सकते हैं।",
371 "settings.workspaces.workspacesRequestFailed" : "आपके कार्यस्थानों को लोड नहीं किया जा सका",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "नई सेवा जोड़ें",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "कार्यक्षेत्र दराज बंद करें",
378 "sidebar.muteApp" : "सूचनाएं और ऑडियो अक्षम करें",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "कार्यक्षेत्र दराज खोलें",
381 "sidebar.settings" : "सेटिंग्स",
382 "sidebar.unmuteApp" : "सूचनाएं और ऑडियो सक्षम करें",
383 "signup.email.label" : "ईमेल पता",
384 "signup.emailDuplicate" : "उस ईमेल पते वाला उपयोगकर्ता पहले से मौजूद है",
385 "signup.firstname.label" : "पहला नाम",
386 "signup.headline" : "साइन अप करें",
387 "signup.lastname.label" : "उपनाम",
388 "signup.legal.info" : "फ्रांज़ में खाता बनाकर आप इसे स्वीकार करते हैं",
389 "signup.legal.privacy" : "प्राइवेसी स्टेटमेंट",
390 "signup.legal.terms" : "सेवा की शर्तें",
391 "signup.link.login" : "पहले से ही एक खाता है? लॉग इन करें।",
392 "signup.password.label" : "पासवर्ड",
393 "signup.submit.label" : "खता खोलें",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "रद्द करें",
406 "subscriptionPopup.buttonDone" : "संपन्न",
407 "tabs.item.deleteService" : "सेवा हटाएँ",
408 "tabs.item.disableAudio" : "ऑडियो अक्षम करें",
409 "tabs.item.disableNotifications" : "ऑडियो अक्षम करें",
410 "tabs.item.disableService" : "सेवा अक्षम करें",
411 "tabs.item.edit" : "संपादित करें",
412 "tabs.item.enableAudio" : "ऑडियो सक्षम करें",
413 "tabs.item.enableNotification" : "सूचनाएँ सक्षम करें ",
414 "tabs.item.enableService" : "सेवा सक्षम करें",
415 "tabs.item.reload" : "पुन: लोड करें",
416 "validation.email" : "{field} मान्य नहीं है",
417 "validation.minLength" : "{field} कम से कम {length} अक्षर लंबे होने चाहिए",
418 "validation.oneRequired" : "कम से कम एक की आवश्यकता है",
419 "validation.required" : "{field} की आवश्यकता है",
420 "validation.url" : "{field} एक मान्य URL नहीं है",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "पुन: लोड करें",
426 "welcome.loginButton" : "अपने खाते में प्रवेश करें",
427 "welcome.signupButton" : "एक नि: शुल्क खाता बनाए",
428 "workspaceDrawer.addNewWorkspaceLabel" : "नया कार्यक्षेत्र जोड़ें",
429 "workspaceDrawer.allServices" : "सभी सेवाएं",
430 "workspaceDrawer.headline" : "कार्यस्थान",
431 "workspaceDrawer.item.contextMenuEdit" : "संपादन करें",
432 "workspaceDrawer.item.noServicesAddedYet" : "अभी तक कोई सेवा नहीं जोड़ी गई है",
433 "workspaceDrawer.premiumCtaButtonLabel" : "अपना पहला कार्यक्षेत्र बनाएँ",
434 "workspaceDrawer.proFeatureBadge" : "प्रीमियम सुविधा",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "प्रीमियम खाता पुनः सक्रिय करें",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>फ्रांज वर्कस्पेस आपको इस बात पर ध्यान केंद्रित करने देता है कि अभी क्या महत्वपूर्ण है। सेवाओं के विभिन्न समूहों को तैयार करें और किसी भी समय उनके बीच आसानी से स्विच करें।<\/p><p>आप यह तय करते हैं कि आपको कब और कहाँ किन सेवाओं की ज़रूरत है, इसलिए हम आपको अपने खेल में शीर्ष पर बने रहने में मदद कर सकते हैं - या जब भी आप चाहें, आसानी से काम बंद कर सकते हैं।<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "कार्यस्थान सेटिंग्स संपादित करें",
438 "workspaces.switchingIndicator.switchingTo" : "इसमें स्विच हो रहा है-"
439}
diff --git a/src/i18n/locales/kk.json b/src/i18n/locales/kk.json
new file mode 100644
index 000000000..078973fe8
--- /dev/null
+++ b/src/i18n/locales/kk.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Reload",
3 "app.errorHandler.headline" : "Something went wrong",
4 "connectionLostBanner.cta" : "Reload Service",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "Send as email",
33 "feature.shareFranz.action.facebook" : "Share on Facebook",
34 "feature.shareFranz.action.twitter" : "Share on Twitter",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "Can't connect to Franz online services",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "You are not connected to the internet.",
52 "global.spellchecker.useDefault" : "Use System Default ({default})",
53 "global.spellchecking.autodetect" : "Detect language automatically",
54 "global.spellchecking.autodetect.short" : "Automatic",
55 "global.spellchecking.language" : "Spell checking language",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "Import your Franz 4 services",
58 "import.notSupportedHeadline" : "Services not yet supported in Franz 5",
59 "import.skip.label" : "I want to add services manually",
60 "import.submit.label" : "Import services",
61 "infobar.buttonChangelog" : "What is new?",
62 "infobar.buttonInstallUpdate" : "Restart & install update",
63 "infobar.buttonReloadServices" : "Reload services",
64 "infobar.requiredRequestsFailed" : "Could not load services and user information",
65 "infobar.servicesUpdated" : "Your services have been updated.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "A new update for Franz is available.",
68 "invite.email.label" : "Email address",
69 "invite.headline.friends" : "Invite 3 of your friends or colleagues",
70 "invite.name.label" : "Name",
71 "invite.skip.label" : "I want to do this later",
72 "invite.submit.label" : "Send invites",
73 "invite.successInfo" : "Invitations sent successfully",
74 "login.email.label" : "Email address",
75 "login.headline" : "Sign in",
76 "login.invalidCredentials" : "Email or password not valid",
77 "login.link.password" : "Reset password",
78 "login.link.signup" : "Create a free account",
79 "login.password.label" : "Password",
80 "login.serverLogout" : "Your session expired, please login again.",
81 "login.submit.label" : "Sign in",
82 "login.tokenExpired" : "Your session expired, please login again.",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "About Franz",
86 "menu.app.announcement" : "What's new?",
87 "menu.app.checkForUpdates" : "Check for updates",
88 "menu.app.hide" : "Hide",
89 "menu.app.hideOthers" : "Hide Others",
90 "menu.app.quit" : "Quit",
91 "menu.app.settings" : "Settings",
92 "menu.app.unhide" : "Unhide",
93 "menu.edit" : "Edit",
94 "menu.edit.copy" : "Copy",
95 "menu.edit.cut" : "Cut",
96 "menu.edit.delete" : "Delete",
97 "menu.edit.emojiSymbols" : "Emoji & Symbols",
98 "menu.edit.paste" : "Paste",
99 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
100 "menu.edit.redo" : "Redo",
101 "menu.edit.selectAll" : "Select All",
102 "menu.edit.speech" : "Speech",
103 "menu.edit.startDictation" : "Start Dictation",
104 "menu.edit.startSpeaking" : "Start Speaking",
105 "menu.edit.stopSpeaking" : "Stop Speaking",
106 "menu.edit.undo" : "Undo",
107 "menu.file" : "File",
108 "menu.help" : "Help",
109 "menu.help.changelog" : "Changelog",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "Learn More",
114 "menu.help.privacy" : "Privacy Statement",
115 "menu.help.support" : "Support",
116 "menu.help.tos" : "Terms of Service",
117 "menu.services" : "Services",
118 "menu.services.activatePreviousService" : "Activate previous service",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "Activate next service",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "View",
125 "menu.view.enterFullScreen" : "Enter Full Screen",
126 "menu.view.exitFullScreen" : "Exit Full Screen",
127 "menu.view.reloadFranz" : "Reload Franz",
128 "menu.view.reloadService" : "Reload Service",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "Actual Size",
131 "menu.view.toggleDevTools" : "Toggle Developer Tools",
132 "menu.view.toggleFullScreen" : "Toggle Full Screen",
133 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "Zoom In",
136 "menu.view.zoomOut" : "Zoom Out",
137 "menu.window" : "Window",
138 "menu.window.close" : "Close",
139 "menu.window.minimize" : "Minimize",
140 "menu.workspaces" : "Workspaces",
141 "menu.workspaces.addNewWorkspace" : "Add New Workspace...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
143 "menu.workspaces.defaultWorkspace" : "All services",
144 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
145 "password.email.label" : "Email address",
146 "password.headline" : "Reset password",
147 "password.link.login" : "Sign in to your account",
148 "password.link.signup" : "Create a free account",
149 "password.noUser" : "No user with that email address was found",
150 "password.submit.label" : "Submit",
151 "password.successInfo" : "Please check your email",
152 "premiumFeature.button.upgradeAccount" : "Upgrade account",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "Reload {name}",
191 "service.crashHandler.autoReload" : "Trying to automatically restore {name} in {seconds} seconds",
192 "service.crashHandler.headline" : "Oh no!",
193 "service.crashHandler.text" : "{name} has caused an error.",
194 "service.disabledHandler.action" : "Enable {name}",
195 "service.disabledHandler.headline" : "{name} is disabled",
196 "service.errorHandler.action" : "Reload {name}",
197 "service.errorHandler.editAction" : "Edit {name}",
198 "service.errorHandler.headline" : "Oh no!",
199 "service.errorHandler.message" : "Error",
200 "service.errorHandler.text" : "{name} has failed to load.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "Loading",
207 "services.getStarted" : "Get started",
208 "services.welcome" : "Welcome to Franz",
209 "settings.account.account.editButton" : "Edit account",
210 "settings.account.accountType.basic" : "Basic Account",
211 "settings.account.accountType.premium" : "Premium Supporter Account",
212 "settings.account.buttonSave" : "Update profile",
213 "settings.account.deleteAccount" : "Delete account",
214 "settings.account.deleteEmailSent" : "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
215 "settings.account.deleteInfo" : "If you don't need your Franz account any longer, you can delete your account and all related data here.",
216 "settings.account.headline" : "Account",
217 "settings.account.headlineAccount" : "Account information",
218 "settings.account.headlineDangerZone" : "Danger Zone",
219 "settings.account.headlineInvoices" : "Invoices",
220 "settings.account.headlinePassword" : "Change password",
221 "settings.account.headlineProfile" : "Update profile",
222 "settings.account.headlineSubscription" : "Your subscription",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "Download",
226 "settings.account.manageSubscription.label" : "Manage your subscription",
227 "settings.account.successInfo" : "Your changes have been saved",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "Try again",
232 "settings.account.tryReloadUserInfoRequest" : "Try again",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "Could not load user information",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "Clear cache",
237 "settings.app.buttonInstallUpdate" : "Restart & install update",
238 "settings.app.buttonSearchForUpdate" : "Check for updates",
239 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.",
240 "settings.app.currentVersion" : "Current version:",
241 "settings.app.form.autoLaunchInBackground" : "Open in background",
242 "settings.app.form.autoLaunchOnStart" : "Launch Franz on start",
243 "settings.app.form.beta" : "Include beta versions",
244 "settings.app.form.darkMode" : "Join the Dark Side",
245 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
246 "settings.app.form.enableSpellchecking" : "Enable spell checking",
247 "settings.app.form.enableSystemTray" : "Show Franz in system tray",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "Language",
251 "settings.app.form.minimizeToSystemTray" : "Minimize Franz to system tray",
252 "settings.app.form.runInBackground" : "Keep Franz in background when closing the window",
253 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
255 "settings.app.headline" : "Settings",
256 "settings.app.headlineAdvanced" : "Advanced",
257 "settings.app.headlineAppearance" : "Appearance",
258 "settings.app.headlineGeneral" : "General",
259 "settings.app.headlineLanguage" : "Language",
260 "settings.app.headlineUpdates" : "Updates",
261 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.",
262 "settings.app.restartRequired" : "Changes require restart",
263 "settings.app.subheadlineCache" : "Cache",
264 "settings.app.translationHelp" : "Help us to translate Franz into your language.",
265 "settings.app.updateStatusAvailable" : "Update available, downloading...",
266 "settings.app.updateStatusSearching" : "Is searching for update",
267 "settings.app.updateStatusUpToDate" : "You are using the latest version of Franz",
268 "settings.invite.headline" : "Invite Friends",
269 "settings.navigation.account" : "Account",
270 "settings.navigation.availableServices" : "Available services",
271 "settings.navigation.inviteFriends" : "Invite Friends",
272 "settings.navigation.logout" : "Logout",
273 "settings.navigation.settings" : "Settings",
274 "settings.navigation.team" : "Manage Team",
275 "settings.navigation.yourServices" : "Your services",
276 "settings.navigation.yourWorkspaces" : "Your workspaces",
277 "settings.recipes.all" : "All services",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "Available services",
286 "settings.recipes.missingService" : "Missing a service?",
287 "settings.recipes.mostPopular" : "Most popular",
288 "settings.recipes.nothingFound" : "Sorry, but no service matched your search term.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Service successfully added",
290 "settings.searchService" : "Search service",
291 "settings.service.error.goBack" : "Back to services",
292 "settings.service.error.headline" : "Error",
293 "settings.service.error.message" : "Could not load service recipe.",
294 "settings.service.form.addServiceHeadline" : "Add {name}",
295 "settings.service.form.availableServices" : "Available services",
296 "settings.service.form.customUrl" : "Custom server",
297 "settings.service.form.customUrlPremiumInfo" : "To add self hosted services, you need a Franz Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount" : "Upgrade your account",
299 "settings.service.form.customUrlValidationError" : "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton" : "Delete service",
301 "settings.service.form.editServiceHeadline" : "Edit {name}",
302 "settings.service.form.enableAudio" : "Enable audio",
303 "settings.service.form.enableBadge" : "Show unread message badges",
304 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "Enable notifications",
307 "settings.service.form.enableService" : "Enable service",
308 "settings.service.form.headlineBadges" : "Unread message badges",
309 "settings.service.form.headlineGeneral" : "General",
310 "settings.service.form.headlineNotifications" : "Notifications",
311 "settings.service.form.icon" : "Custom icon",
312 "settings.service.form.iconDelete" : "Delete",
313 "settings.service.form.iconUpload" : "Drop your image, or click here",
314 "settings.service.form.indirectMessageInfo" : "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "Show message badge for all new messages",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
318 "settings.service.form.name" : "Name",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
320 "settings.service.form.proxy.host" : "Proxy Host\/IP",
321 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
322 "settings.service.form.proxy.isEnabled" : "Use Proxy",
323 "settings.service.form.proxy.password" : "Password (optional)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.",
326 "settings.service.form.proxy.user" : "User (optional)",
327 "settings.service.form.saveButton" : "Save service",
328 "settings.service.form.tabHosted" : "Hosted",
329 "settings.service.form.tabOnPremise" : "Self hosted ⭐️",
330 "settings.service.form.team" : "Team",
331 "settings.service.form.useHostedService" : "Use the hosted {name} service.",
332 "settings.service.form.yourServices" : "Your services",
333 "settings.services.deletedInfo" : "Service has been deleted",
334 "settings.services.discoverServices" : "Discover services",
335 "settings.services.headline" : "Your services",
336 "settings.services.noServicesAdded" : "You haven't added any services yet.",
337 "settings.services.servicesRequestFailed" : "Could not load your services",
338 "settings.services.tooltip.isDisabled" : "Service is disabled",
339 "settings.services.tooltip.isMuted" : "All sounds are muted",
340 "settings.services.tooltip.notificationsDisabled" : "Notifications are disabled",
341 "settings.services.updatedInfo" : "Your changes have been saved",
342 "settings.team.contentHeadline" : "Franz for Teams",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "Team",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
347 "settings.team.upgradeAction" : "Upgrade your Account",
348 "settings.user.form.accountType.company" : "Company",
349 "settings.user.form.accountType.individual" : "Individual",
350 "settings.user.form.accountType.label" : "Account type",
351 "settings.user.form.accountType.non-profit" : "Non-Profit",
352 "settings.user.form.currentPassword" : "Current password",
353 "settings.user.form.email" : "Email",
354 "settings.user.form.firstname" : "First Name",
355 "settings.user.form.lastname" : "Last Name",
356 "settings.user.form.newPassword" : "New password",
357 "settings.workspace.add.form.name" : "Name",
358 "settings.workspace.add.form.submitButton" : "Create workspace",
359 "settings.workspace.form.buttonDelete" : "Delete workspace",
360 "settings.workspace.form.buttonSave" : "Save workspace",
361 "settings.workspace.form.name" : "Name",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
363 "settings.workspace.form.yourWorkspaces" : "Your workspaces",
364 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
365 "settings.workspaces.headline" : "Your workspaces",
366 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
367 "settings.workspaces.tryReloadWorkspaces" : "Try again",
368 "settings.workspaces.updatedInfo" : "Your changes have been saved",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "Add new service",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer",
378 "sidebar.muteApp" : "Disable notifications & audio",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
381 "sidebar.settings" : "Settings",
382 "sidebar.unmuteApp" : "Enable notifications & audio",
383 "signup.email.label" : "Email address",
384 "signup.emailDuplicate" : "A user with that email address already exists",
385 "signup.firstname.label" : "First Name",
386 "signup.headline" : "Sign up",
387 "signup.lastname.label" : "Last Name",
388 "signup.legal.info" : "By creating a Franz account you accept the",
389 "signup.legal.privacy" : "Privacy Statement",
390 "signup.legal.terms" : "Terms of service",
391 "signup.link.login" : "Already have an account, sign in?",
392 "signup.password.label" : "Password",
393 "signup.submit.label" : "Create account",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "Cancel",
406 "subscriptionPopup.buttonDone" : "Done",
407 "tabs.item.deleteService" : "Delete service",
408 "tabs.item.disableAudio" : "Disable audio",
409 "tabs.item.disableNotifications" : "Disable notifications",
410 "tabs.item.disableService" : "Disable service",
411 "tabs.item.edit" : "Edit",
412 "tabs.item.enableAudio" : "Enable audio",
413 "tabs.item.enableNotification" : "Enable notifications",
414 "tabs.item.enableService" : "Enable service",
415 "tabs.item.reload" : "Reload",
416 "validation.email" : "{field} is not valid",
417 "validation.minLength" : "{field} should be at least {length} characters long",
418 "validation.oneRequired" : "At least one is required",
419 "validation.required" : "{field} is required",
420 "validation.url" : "{field} is not a valid URL",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "Reload",
426 "welcome.loginButton" : "Login to your account",
427 "welcome.signupButton" : "Create a free account",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "All services",
430 "workspaceDrawer.headline" : "Workspaces",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/locales/ms.json b/src/i18n/locales/ms.json
new file mode 100644
index 000000000..d185878b6
--- /dev/null
+++ b/src/i18n/locales/ms.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Refresh",
3 "app.errorHandler.headline" : "Ada sedikit masalah",
4 "connectionLostBanner.cta" : "Ulangmuat Perkhidmatan",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "Franz akan beroperasi semula dalam {seconds} saat",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "Naik taraf akaun",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "Hantar sebagai emel",
33 "feature.shareFranz.action.facebook" : "Kongsi ke Facebook",
34 "feature.shareFranz.action.twitter" : "Kongsi ke Twitter",
35 "feature.shareFranz.headline" : "Franz lebih elok digunakan bersama-sama rakan",
36 "feature.shareFranz.shareText.email" : "Saya telah menambah {count] servis ke Franz! Dapatkan aplikasi percuma WhatsApp, Messenger, Slack, Skype dan lain-lain dari www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Beritahu rakan anda betapa hebatnya Franz dan bantu kami menyebarkan maklumat ini",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "Tidak dapat bersambung ke perkhidmatan dalam talian Franz",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "Anda tidak disambungkan ke internet.",
52 "global.spellchecker.useDefault" : "Gunakan System Default ({default})",
53 "global.spellchecking.autodetect" : "Kesan bahasa secara automatik",
54 "global.spellchecking.autodetect.short" : "Automatik",
55 "global.spellchecking.language" : "Bahasa untuk semakan ejaan",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "Import perkhidmatan Franz 4 anda",
58 "import.notSupportedHeadline" : "Perkhidmatan belum disokong dalam Franz 5",
59 "import.skip.label" : "Saya mahu menambah perkhidmatan secara manual",
60 "import.submit.label" : "Import perkhidmatan",
61 "infobar.buttonChangelog" : "Apa yang baru?",
62 "infobar.buttonInstallUpdate" : "Mulakan semula & pasang kemas kini?",
63 "infobar.buttonReloadServices" : "Mula semula perkhidmatan",
64 "infobar.requiredRequestsFailed" : "Tidak dapat memuatkan perkhidmatan dan maklumat pengguna",
65 "infobar.servicesUpdated" : "Perkhidmatan anda telah dikemas kini.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "Kemas kini baru untuk Franz boleh didapati.",
68 "invite.email.label" : "Alamat emel",
69 "invite.headline.friends" : "Jemput 3 rakan atau rakan sekerja anda",
70 "invite.name.label" : "Nama",
71 "invite.skip.label" : "Saya akan lakukannya sebentar lagi",
72 "invite.submit.label" : "Hantar jemputan",
73 "invite.successInfo" : "Jemputan telah berjaya dihantar",
74 "login.email.label" : "Alamat e-mel",
75 "login.headline" : "Daftar Masuk",
76 "login.invalidCredentials" : "E-mel atau kata laluan tidak sah",
77 "login.link.password" : "Set Semula Kata Laluan",
78 "login.link.signup" : "Buka akaun baru percuma",
79 "login.password.label" : "Kata laluan",
80 "login.serverLogout" : "Sesi anda tamat tempoh, sila log masuk sekali lagi.",
81 "login.submit.label" : "Daftar Masuk",
82 "login.tokenExpired" : "Sesi anda tamat tempoh, sila masuk sekali lagi.",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "Tentang Franz",
86 "menu.app.announcement" : "What's new?",
87 "menu.app.checkForUpdates" : "Semak untuk kemaskini",
88 "menu.app.hide" : "Sorokkan",
89 "menu.app.hideOthers" : "Sorokkan yang lain-lain",
90 "menu.app.quit" : "Keluar",
91 "menu.app.settings" : "Tetapan",
92 "menu.app.unhide" : "Nyahsorok",
93 "menu.edit" : "Ubahsuai",
94 "menu.edit.copy" : "Salin",
95 "menu.edit.cut" : "Sunting",
96 "menu.edit.delete" : "Hapus",
97 "menu.edit.emojiSymbols" : "Emoji & Simbol",
98 "menu.edit.paste" : "Tampal",
99 "menu.edit.pasteAndMatchStyle" : "Tampal Dan Padan Gaya",
100 "menu.edit.redo" : "Ulangbuat",
101 "menu.edit.selectAll" : "Pilih Semua",
102 "menu.edit.speech" : "Pertuturan",
103 "menu.edit.startDictation" : "Mula Dikte",
104 "menu.edit.startSpeaking" : "Mula Bercakap",
105 "menu.edit.stopSpeaking" : "Henti Bercakap",
106 "menu.edit.undo" : "Nyahcara",
107 "menu.file" : "Fail",
108 "menu.help" : "Bantuan",
109 "menu.help.changelog" : "Log perubahan:",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "Ketahui Lebih Lanjut",
114 "menu.help.privacy" : "Pernyataan Privasi",
115 "menu.help.support" : "Sokongan",
116 "menu.help.tos" : "Terma dan Syarat Perkhidmatan",
117 "menu.services" : "Perkhidmatan",
118 "menu.services.activatePreviousService" : "Activate previous service",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "Activate next service",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "Paparan",
125 "menu.view.enterFullScreen" : "Masuk Skrin Penuh",
126 "menu.view.exitFullScreen" : "Keluar Skrin Penuh",
127 "menu.view.reloadFranz" : "Ulangmuat Franz",
128 "menu.view.reloadService" : "Ulangmuat Perkhidmatan",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "Saiz Sebenar",
131 "menu.view.toggleDevTools" : "Tukar Peralatan Pemaju",
132 "menu.view.toggleFullScreen" : "Tukar Skrin Penuh",
133 "menu.view.toggleServiceDevTools" : "Ubah Service Developer Tools",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "Zoom masuk",
136 "menu.view.zoomOut" : "Zoom keluar",
137 "menu.window" : "Tetingkap",
138 "menu.window.close" : "Tutup",
139 "menu.window.minimize" : "Kecilkan",
140 "menu.workspaces" : "Workspaces",
141 "menu.workspaces.addNewWorkspace" : "Add New Workspace...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
143 "menu.workspaces.defaultWorkspace" : "All services",
144 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
145 "password.email.label" : "Alamat e-mel",
146 "password.headline" : "Set Semula Kata Laluan",
147 "password.link.login" : "Log masuk akaun kamu",
148 "password.link.signup" : "Buka akaun baru percuma",
149 "password.noUser" : "Tiada pengguna dengan alamat e-mel tersebut dijumpai",
150 "password.submit.label" : "Hantar",
151 "password.successInfo" : "Sila semak e-mel anda",
152 "premiumFeature.button.upgradeAccount" : "Naik taraf akaun",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "Ulangmuat {nama}",
191 "service.crashHandler.autoReload" : "Sedang cuba pulihkan secara automatik {nama} dalam {saat} saat",
192 "service.crashHandler.headline" : "Alamak!",
193 "service.crashHandler.text" : "{nama} telah menyebabkan satu ralat.",
194 "service.disabledHandler.action" : "Bolehkan {nama}",
195 "service.disabledHandler.headline" : "{nama} dinyahdayakan",
196 "service.errorHandler.action" : "Ulangmuat {nama}",
197 "service.errorHandler.editAction" : "Edit {name}",
198 "service.errorHandler.headline" : "Alamak!",
199 "service.errorHandler.message" : "Error",
200 "service.errorHandler.text" : "{name} has failed to load.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "Loading",
207 "services.getStarted" : "Bermula",
208 "services.welcome" : "Selamat Datang ke Franz",
209 "settings.account.account.editButton" : "Edit account",
210 "settings.account.accountType.basic" : "Akaun Asas",
211 "settings.account.accountType.premium" : "Sokongan Akaun Premium",
212 "settings.account.buttonSave" : "Kemaskini profil",
213 "settings.account.deleteAccount" : "Hapuskan akaun",
214 "settings.account.deleteEmailSent" : "Anda telah menerima email yang mengandungi link pengesahan untuk memadamkan akaun. Akaun dan semua data anda tidak boleh lagi dikembalikan semula!",
215 "settings.account.deleteInfo" : "Jika anda tidak perlukan lagi akaun Franz, anda boleh hapuskan akaun dan data berkaitan di sini.",
216 "settings.account.headline" : "Akaun",
217 "settings.account.headlineAccount" : "Maklumat Akaun",
218 "settings.account.headlineDangerZone" : "Zon Bahaya",
219 "settings.account.headlineInvoices" : "Invois",
220 "settings.account.headlinePassword" : "Tukar katalaluan",
221 "settings.account.headlineProfile" : "Kemaskini maklumat peribadi",
222 "settings.account.headlineSubscription" : "Langganan anda",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "Muat Turun",
226 "settings.account.manageSubscription.label" : "Urus langganan anda",
227 "settings.account.successInfo" : "Kemaskini telah disimpan",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "Cuba lagi",
232 "settings.account.tryReloadUserInfoRequest" : "Cuba lagi",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "Maklumat pengguna tidak dapat dipapar",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "Padamkan Cache",
237 "settings.app.buttonInstallUpdate" : "Mulakan semula & pasang kemas kini",
238 "settings.app.buttonSearchForUpdate" : "Semak untuk kemaskini",
239 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.",
240 "settings.app.currentVersion" : "Current version:",
241 "settings.app.form.autoLaunchInBackground" : "Open in background",
242 "settings.app.form.autoLaunchOnStart" : "Launch Franz on start",
243 "settings.app.form.beta" : "Termasuk versi beta",
244 "settings.app.form.darkMode" : "Join the Dark Side",
245 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
246 "settings.app.form.enableSpellchecking" : "Hidupkan semakan ejaan",
247 "settings.app.form.enableSystemTray" : "Papar Franz dalam dulang sistem",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "Language",
251 "settings.app.form.minimizeToSystemTray" : "Minimize Franz to system tray",
252 "settings.app.form.runInBackground" : "Keep Franz in background when closing the window",
253 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
255 "settings.app.headline" : "Tetapan",
256 "settings.app.headlineAdvanced" : "Advanced",
257 "settings.app.headlineAppearance" : "Appearance",
258 "settings.app.headlineGeneral" : "General",
259 "settings.app.headlineLanguage" : "Language",
260 "settings.app.headlineUpdates" : "Updates",
261 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.",
262 "settings.app.restartRequired" : "Changes require restart",
263 "settings.app.subheadlineCache" : "Cache",
264 "settings.app.translationHelp" : "Help us to translate Franz into your language.",
265 "settings.app.updateStatusAvailable" : "Update available, downloading...",
266 "settings.app.updateStatusSearching" : "Is searching for update",
267 "settings.app.updateStatusUpToDate" : "You are using the latest version of Franz",
268 "settings.invite.headline" : "Invite Friends",
269 "settings.navigation.account" : "Akaun",
270 "settings.navigation.availableServices" : "Available services",
271 "settings.navigation.inviteFriends" : "Invite Friends",
272 "settings.navigation.logout" : "Logout",
273 "settings.navigation.settings" : "Tetapan",
274 "settings.navigation.team" : "Manage Team",
275 "settings.navigation.yourServices" : "Your services",
276 "settings.navigation.yourWorkspaces" : "Your workspaces",
277 "settings.recipes.all" : "All services",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "Available services",
286 "settings.recipes.missingService" : "Missing a service?",
287 "settings.recipes.mostPopular" : "Most popular",
288 "settings.recipes.nothingFound" : "Sorry, but no service matched your search term.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Service successfully added",
290 "settings.searchService" : "Search service",
291 "settings.service.error.goBack" : "Back to services",
292 "settings.service.error.headline" : "Error",
293 "settings.service.error.message" : "Could not load service recipe.",
294 "settings.service.form.addServiceHeadline" : "Add {name}",
295 "settings.service.form.availableServices" : "Available services",
296 "settings.service.form.customUrl" : "Custom server",
297 "settings.service.form.customUrlPremiumInfo" : "To add self hosted services, you need a Franz Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount" : "Upgrade your account",
299 "settings.service.form.customUrlValidationError" : "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton" : "Delete service",
301 "settings.service.form.editServiceHeadline" : "Edit {name}",
302 "settings.service.form.enableAudio" : "Enable audio",
303 "settings.service.form.enableBadge" : "Show unread message badges",
304 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "Enable notifications",
307 "settings.service.form.enableService" : "Enable service",
308 "settings.service.form.headlineBadges" : "Unread message badges",
309 "settings.service.form.headlineGeneral" : "General",
310 "settings.service.form.headlineNotifications" : "Notifications",
311 "settings.service.form.icon" : "Custom icon",
312 "settings.service.form.iconDelete" : "Hapus",
313 "settings.service.form.iconUpload" : "Drop your image, or click here",
314 "settings.service.form.indirectMessageInfo" : "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "Show message badge for all new messages",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
318 "settings.service.form.name" : "Nama",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
320 "settings.service.form.proxy.host" : "Proxy Host\/IP",
321 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
322 "settings.service.form.proxy.isEnabled" : "Use Proxy",
323 "settings.service.form.proxy.password" : "Password (optional)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.",
326 "settings.service.form.proxy.user" : "User (optional)",
327 "settings.service.form.saveButton" : "Save service",
328 "settings.service.form.tabHosted" : "Hosted",
329 "settings.service.form.tabOnPremise" : "Self hosted ⭐️",
330 "settings.service.form.team" : "Team",
331 "settings.service.form.useHostedService" : "Use the hosted {name} service.",
332 "settings.service.form.yourServices" : "Your services",
333 "settings.services.deletedInfo" : "Service has been deleted",
334 "settings.services.discoverServices" : "Discover services",
335 "settings.services.headline" : "Your services",
336 "settings.services.noServicesAdded" : "You haven't added any services yet.",
337 "settings.services.servicesRequestFailed" : "Could not load your services",
338 "settings.services.tooltip.isDisabled" : "Service is disabled",
339 "settings.services.tooltip.isMuted" : "All sounds are muted",
340 "settings.services.tooltip.notificationsDisabled" : "Notifications are disabled",
341 "settings.services.updatedInfo" : "Kemaskini telah disimpan",
342 "settings.team.contentHeadline" : "Franz for Teams",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "Team",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
347 "settings.team.upgradeAction" : "Upgrade your Account",
348 "settings.user.form.accountType.company" : "Company",
349 "settings.user.form.accountType.individual" : "Individual",
350 "settings.user.form.accountType.label" : "Account type",
351 "settings.user.form.accountType.non-profit" : "Non-Profit",
352 "settings.user.form.currentPassword" : "Current password",
353 "settings.user.form.email" : "Email",
354 "settings.user.form.firstname" : "First Name",
355 "settings.user.form.lastname" : "Last Name",
356 "settings.user.form.newPassword" : "New password",
357 "settings.workspace.add.form.name" : "Nama",
358 "settings.workspace.add.form.submitButton" : "Create workspace",
359 "settings.workspace.form.buttonDelete" : "Delete workspace",
360 "settings.workspace.form.buttonSave" : "Save workspace",
361 "settings.workspace.form.name" : "Nama",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
363 "settings.workspace.form.yourWorkspaces" : "Your workspaces",
364 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
365 "settings.workspaces.headline" : "Your workspaces",
366 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
367 "settings.workspaces.tryReloadWorkspaces" : "Cuba lagi",
368 "settings.workspaces.updatedInfo" : "Kemaskini telah disimpan",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "Add new service",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer",
378 "sidebar.muteApp" : "Disable notifications & audio",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
381 "sidebar.settings" : "Tetapan",
382 "sidebar.unmuteApp" : "Enable notifications & audio",
383 "signup.email.label" : "Email address",
384 "signup.emailDuplicate" : "A user with that email address already exists",
385 "signup.firstname.label" : "First Name",
386 "signup.headline" : "Sign up",
387 "signup.lastname.label" : "Last Name",
388 "signup.legal.info" : "By creating a Franz account you accept the",
389 "signup.legal.privacy" : "Pernyataan Privasi",
390 "signup.legal.terms" : "Terms of service",
391 "signup.link.login" : "Already have an account, sign in?",
392 "signup.password.label" : "Kata laluan",
393 "signup.submit.label" : "Create account",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "Cancel",
406 "subscriptionPopup.buttonDone" : "Done",
407 "tabs.item.deleteService" : "Delete service",
408 "tabs.item.disableAudio" : "Disable audio",
409 "tabs.item.disableNotifications" : "Disable notifications",
410 "tabs.item.disableService" : "Disable service",
411 "tabs.item.edit" : "Ubahsuai",
412 "tabs.item.enableAudio" : "Enable audio",
413 "tabs.item.enableNotification" : "Enable notifications",
414 "tabs.item.enableService" : "Enable service",
415 "tabs.item.reload" : "Refresh",
416 "validation.email" : "{field} is not valid",
417 "validation.minLength" : "{field} should be at least {length} characters long",
418 "validation.oneRequired" : "At least one is required",
419 "validation.required" : "{field} is required",
420 "validation.url" : "{field} is not a valid URL",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "Refresh",
426 "welcome.loginButton" : "Login to your account",
427 "welcome.signupButton" : "Buka akaun baru percuma",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "All services",
430 "workspaceDrawer.headline" : "Workspaces",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/locales/si.json b/src/i18n/locales/si.json
new file mode 100644
index 000000000..3c26f4f22
--- /dev/null
+++ b/src/i18n/locales/si.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Reload",
3 "app.errorHandler.headline" : "Something went wrong",
4 "connectionLostBanner.cta" : "Reload Service",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "Send as email",
33 "feature.shareFranz.action.facebook" : "Share on Facebook",
34 "feature.shareFranz.action.twitter" : "Share on Twitter",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "ෆ්රාන්ස් මාර්ගගත සේවාවන් වෙත සම්බන්ධ වීමට නොහැක.",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "ඔබ අන්තර්ජාලයට සම්බන්ධ වී නැත.",
52 "global.spellchecker.useDefault" : "Use System Default ({default})",
53 "global.spellchecking.autodetect" : "Detect language automatically",
54 "global.spellchecking.autodetect.short" : "Automatic",
55 "global.spellchecking.language" : "Spell checking language",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "ඔබගේ ෆ්රාන්ස් සේවාවන් නැවත ඇතුලත් කරගන්න.",
58 "import.notSupportedHeadline" : "සේවාවන් සඳහා ෆ්රාන්ස් 5 හි තවමත් පහසුකම් සලසා නැත.",
59 "import.skip.label" : "සේවාවන් මවිසින් ඇතුලත් කල යුතුය. ",
60 "import.submit.label" : "සේවාවන් ස්වයං ඇතුලත් කරගැනීම ",
61 "infobar.buttonChangelog" : "අලුත් දෑ",
62 "infobar.buttonInstallUpdate" : "නැවත අරඹා යාවත්කාල කරන්න.",
63 "infobar.buttonReloadServices" : "සේවාවන් නැවත ඇරඹීම",
64 "infobar.requiredRequestsFailed" : "සේවාවන් සහ පරිශීලක තොරතුරු ලබාගත නොහැක.",
65 "infobar.servicesUpdated" : "ඔබගේ සේවාවන් යාවත්කාල කර ඇත.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "ෆ්රාන්ස් හි නව සංස්කරණයක් දැන් ලබා ගත හැක.",
68 "invite.email.label" : "විද්‍යුත් තැපැල් ලිපිනය ",
69 "invite.headline.friends" : "මිතුරන් 3කට ආරාධනා කරන්න.",
70 "invite.name.label" : "නම",
71 "invite.skip.label" : "මා මෙය පසුව කරන්නම්",
72 "invite.submit.label" : "ඇරයුම් යවන්න ",
73 "invite.successInfo" : "Invitations sent successfully",
74 "login.email.label" : "විද්‍යුත් තැපැල් ලිපිනය",
75 "login.headline" : "ඇතුළු වන්න",
76 "login.invalidCredentials" : "විද්‍යුත් තැපැල් ලිපිනය හෝ මුර පදය වැරදියි",
77 "login.link.password" : "මුර පදය අලුත් කරන්න",
78 "login.link.signup" : "නොමිළ ගිණුමක් සකසන්න",
79 "login.password.label" : "මුරපදය",
80 "login.serverLogout" : "ඔබේ ඇතුළු වීම් කාලය අවසන්, නැවත ඇතුල් වන්න.",
81 "login.submit.label" : "ඇතුල් වන්න",
82 "login.tokenExpired" : "ඔබේ ඇතුළු වීම් කාලය අවසන්, නැවත ඇතුල් වන්න.",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "About Franz",
86 "menu.app.announcement" : "What's new?",
87 "menu.app.checkForUpdates" : "Check for updates",
88 "menu.app.hide" : "Hide",
89 "menu.app.hideOthers" : "Hide Others",
90 "menu.app.quit" : "Quit",
91 "menu.app.settings" : "Settings",
92 "menu.app.unhide" : "Unhide",
93 "menu.edit" : "Edit",
94 "menu.edit.copy" : "Copy",
95 "menu.edit.cut" : "Cut",
96 "menu.edit.delete" : "Delete",
97 "menu.edit.emojiSymbols" : "Emoji & Symbols",
98 "menu.edit.paste" : "Paste",
99 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
100 "menu.edit.redo" : "Redo",
101 "menu.edit.selectAll" : "Select All",
102 "menu.edit.speech" : "Speech",
103 "menu.edit.startDictation" : "Start Dictation",
104 "menu.edit.startSpeaking" : "Start Speaking",
105 "menu.edit.stopSpeaking" : "Stop Speaking",
106 "menu.edit.undo" : "Undo",
107 "menu.file" : "File",
108 "menu.help" : "Help",
109 "menu.help.changelog" : "Changelog",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "Learn More",
114 "menu.help.privacy" : "Privacy Statement",
115 "menu.help.support" : "Support",
116 "menu.help.tos" : "Terms of Service",
117 "menu.services" : "Services",
118 "menu.services.activatePreviousService" : "Activate previous service",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "Activate next service",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "View",
125 "menu.view.enterFullScreen" : "Enter Full Screen",
126 "menu.view.exitFullScreen" : "Exit Full Screen",
127 "menu.view.reloadFranz" : "Reload Franz",
128 "menu.view.reloadService" : "Reload Service",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "Actual Size",
131 "menu.view.toggleDevTools" : "Toggle Developer Tools",
132 "menu.view.toggleFullScreen" : "Toggle Full Screen",
133 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "Zoom In",
136 "menu.view.zoomOut" : "Zoom Out",
137 "menu.window" : "Window",
138 "menu.window.close" : "Close",
139 "menu.window.minimize" : "Minimize",
140 "menu.workspaces" : "Workspaces",
141 "menu.workspaces.addNewWorkspace" : "Add New Workspace...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
143 "menu.workspaces.defaultWorkspace" : "All services",
144 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
145 "password.email.label" : "විද්‍යුත් තැපැල් ලිපිනය",
146 "password.headline" : "මුරපදය නැවත සකසන්න ",
147 "password.link.login" : "ඔබේ ගිණුමට ඇතුල් වන්න ",
148 "password.link.signup" : "නව නොමිල ගිණුමක් අරඹන්න ",
149 "password.noUser" : "එම විද්‍යුත් තැපැල් ලිපිනය යටතේ කිසිදු පරිශීලකයෙක් නොමැත ",
150 "password.submit.label" : "යවන්න",
151 "password.successInfo" : "කරුණාකර ඔබේ විද්‍යුත් තැපෑල පිරික්සන්න",
152 "premiumFeature.button.upgradeAccount" : "Upgrade account",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "{name} නැවත ලබාගන්න",
191 "service.crashHandler.autoReload" : "{name} ස්වයංක්‍රීය ප්‍රතිෂ්ඨාපනය තවත් තත්පර {seconds}කින් ",
192 "service.crashHandler.headline" : "අපොයි!",
193 "service.crashHandler.text" : "{name} හි දෝෂයකි. ",
194 "service.disabledHandler.action" : "{name} සක්‍රීය කරන්න",
195 "service.disabledHandler.headline" : "{name} අක්‍රීයයි.",
196 "service.errorHandler.action" : "{name} නැවත ලබාගන්න",
197 "service.errorHandler.editAction" : "Edit {name}",
198 "service.errorHandler.headline" : "අපොයි!",
199 "service.errorHandler.message" : "Error",
200 "service.errorHandler.text" : "{name} has failed to load.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "Loading",
207 "services.getStarted" : "ආරම්භ කරන්න",
208 "services.welcome" : "ෆ්‍රාන්ස් වෙත සාදරයෙන් පිළිගනිමු",
209 "settings.account.account.editButton" : "ගිණුම සකසන්න",
210 "settings.account.accountType.basic" : "මුලික ගිණුම ",
211 "settings.account.accountType.premium" : "විශේෂ ආධාරකාර ගිණුම ",
212 "settings.account.buttonSave" : "පැතිකඩ යාවත්කාල කිරීම ",
213 "settings.account.deleteAccount" : "ගිණුම මකා දමන්න ",
214 "settings.account.deleteEmailSent" : "ගිණුම මකා දැමීම තහවුරු කිරීම සඳහා විද්‍යුත් තැපැල් පණිවුඩයක් ඔබ වෙත යවා ඇත. මකා දැමීමෙන් පසුව ඔබගේ ගිණුම සහ අනෙකුත් දත්ත නැවත ලබාගත නොහැකි බව කරුණාවෙන් සලකන්න.",
215 "settings.account.deleteInfo" : "ඔබට ෆ්‍රාන්ස් ගිණුම තවදුරටත් අනවශ්‍ය නම්, ගිණුම සහ ඒ සම්බන්ධ සියලු තොරතුරු මෙහිදී මකා දැමිය හැක.",
216 "settings.account.headline" : "ගිණුම ",
217 "settings.account.headlineAccount" : "ගිණුමේ තොරතුරු",
218 "settings.account.headlineDangerZone" : "භයානක කලාපය ",
219 "settings.account.headlineInvoices" : "ලදුපත් ",
220 "settings.account.headlinePassword" : "මුරපදය වෙනස් කරන්න",
221 "settings.account.headlineProfile" : "පැතිකඩ යාවත්කාල කරන්න ",
222 "settings.account.headlineSubscription" : "ඔබගේ දායකත්වය ",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "Download",
226 "settings.account.manageSubscription.label" : "Manage your subscription",
227 "settings.account.successInfo" : "Your changes have been saved",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "Try again",
232 "settings.account.tryReloadUserInfoRequest" : "Try again",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "Could not load user information",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "Clear cache",
237 "settings.app.buttonInstallUpdate" : "නැවත අරඹා යාවත්කාල කරන්න.",
238 "settings.app.buttonSearchForUpdate" : "Check for updates",
239 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.",
240 "settings.app.currentVersion" : "Current version:",
241 "settings.app.form.autoLaunchInBackground" : "Open in background",
242 "settings.app.form.autoLaunchOnStart" : "Launch Franz on start",
243 "settings.app.form.beta" : "Include beta versions",
244 "settings.app.form.darkMode" : "Join the Dark Side",
245 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
246 "settings.app.form.enableSpellchecking" : "Enable spell checking",
247 "settings.app.form.enableSystemTray" : "Show Franz in system tray",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "Language",
251 "settings.app.form.minimizeToSystemTray" : "Minimize Franz to system tray",
252 "settings.app.form.runInBackground" : "Keep Franz in background when closing the window",
253 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
255 "settings.app.headline" : "Settings",
256 "settings.app.headlineAdvanced" : "Advanced",
257 "settings.app.headlineAppearance" : "Appearance",
258 "settings.app.headlineGeneral" : "General",
259 "settings.app.headlineLanguage" : "Language",
260 "settings.app.headlineUpdates" : "Updates",
261 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.",
262 "settings.app.restartRequired" : "Changes require restart",
263 "settings.app.subheadlineCache" : "Cache",
264 "settings.app.translationHelp" : "Help us to translate Franz into your language.",
265 "settings.app.updateStatusAvailable" : "Update available, downloading...",
266 "settings.app.updateStatusSearching" : "Is searching for update",
267 "settings.app.updateStatusUpToDate" : "You are using the latest version of Franz",
268 "settings.invite.headline" : "Invite Friends",
269 "settings.navigation.account" : "ගිණුම ",
270 "settings.navigation.availableServices" : "Available services",
271 "settings.navigation.inviteFriends" : "Invite Friends",
272 "settings.navigation.logout" : "Logout",
273 "settings.navigation.settings" : "Settings",
274 "settings.navigation.team" : "Manage Team",
275 "settings.navigation.yourServices" : "Your services",
276 "settings.navigation.yourWorkspaces" : "Your workspaces",
277 "settings.recipes.all" : "All services",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "Available services",
286 "settings.recipes.missingService" : "Missing a service?",
287 "settings.recipes.mostPopular" : "Most popular",
288 "settings.recipes.nothingFound" : "Sorry, but no service matched your search term.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Service successfully added",
290 "settings.searchService" : "Search service",
291 "settings.service.error.goBack" : "Back to services",
292 "settings.service.error.headline" : "Error",
293 "settings.service.error.message" : "Could not load service recipe.",
294 "settings.service.form.addServiceHeadline" : "Add {name}",
295 "settings.service.form.availableServices" : "Available services",
296 "settings.service.form.customUrl" : "Custom server",
297 "settings.service.form.customUrlPremiumInfo" : "To add self hosted services, you need a Franz Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount" : "Upgrade your account",
299 "settings.service.form.customUrlValidationError" : "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton" : "Delete service",
301 "settings.service.form.editServiceHeadline" : "Edit {name}",
302 "settings.service.form.enableAudio" : "Enable audio",
303 "settings.service.form.enableBadge" : "Show unread message badges",
304 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "Enable notifications",
307 "settings.service.form.enableService" : "Enable service",
308 "settings.service.form.headlineBadges" : "Unread message badges",
309 "settings.service.form.headlineGeneral" : "General",
310 "settings.service.form.headlineNotifications" : "Notifications",
311 "settings.service.form.icon" : "Custom icon",
312 "settings.service.form.iconDelete" : "Delete",
313 "settings.service.form.iconUpload" : "Drop your image, or click here",
314 "settings.service.form.indirectMessageInfo" : "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "Show message badge for all new messages",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
318 "settings.service.form.name" : "නම",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
320 "settings.service.form.proxy.host" : "Proxy Host\/IP",
321 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
322 "settings.service.form.proxy.isEnabled" : "Use Proxy",
323 "settings.service.form.proxy.password" : "Password (optional)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.",
326 "settings.service.form.proxy.user" : "User (optional)",
327 "settings.service.form.saveButton" : "Save service",
328 "settings.service.form.tabHosted" : "Hosted",
329 "settings.service.form.tabOnPremise" : "Self hosted ⭐️",
330 "settings.service.form.team" : "Team",
331 "settings.service.form.useHostedService" : "Use the hosted {name} service.",
332 "settings.service.form.yourServices" : "Your services",
333 "settings.services.deletedInfo" : "Service has been deleted",
334 "settings.services.discoverServices" : "Discover services",
335 "settings.services.headline" : "Your services",
336 "settings.services.noServicesAdded" : "You haven't added any services yet.",
337 "settings.services.servicesRequestFailed" : "Could not load your services",
338 "settings.services.tooltip.isDisabled" : "Service is disabled",
339 "settings.services.tooltip.isMuted" : "All sounds are muted",
340 "settings.services.tooltip.notificationsDisabled" : "Notifications are disabled",
341 "settings.services.updatedInfo" : "Your changes have been saved",
342 "settings.team.contentHeadline" : "Franz for Teams",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "Team",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
347 "settings.team.upgradeAction" : "Upgrade your Account",
348 "settings.user.form.accountType.company" : "Company",
349 "settings.user.form.accountType.individual" : "Individual",
350 "settings.user.form.accountType.label" : "Account type",
351 "settings.user.form.accountType.non-profit" : "Non-Profit",
352 "settings.user.form.currentPassword" : "Current password",
353 "settings.user.form.email" : "Email",
354 "settings.user.form.firstname" : "First Name",
355 "settings.user.form.lastname" : "Last Name",
356 "settings.user.form.newPassword" : "New password",
357 "settings.workspace.add.form.name" : "නම",
358 "settings.workspace.add.form.submitButton" : "Create workspace",
359 "settings.workspace.form.buttonDelete" : "Delete workspace",
360 "settings.workspace.form.buttonSave" : "Save workspace",
361 "settings.workspace.form.name" : "නම",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
363 "settings.workspace.form.yourWorkspaces" : "Your workspaces",
364 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
365 "settings.workspaces.headline" : "Your workspaces",
366 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
367 "settings.workspaces.tryReloadWorkspaces" : "Try again",
368 "settings.workspaces.updatedInfo" : "Your changes have been saved",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "Add new service",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer",
378 "sidebar.muteApp" : "Disable notifications & audio",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
381 "sidebar.settings" : "Settings",
382 "sidebar.unmuteApp" : "Enable notifications & audio",
383 "signup.email.label" : "Email address",
384 "signup.emailDuplicate" : "A user with that email address already exists",
385 "signup.firstname.label" : "First Name",
386 "signup.headline" : "Sign up",
387 "signup.lastname.label" : "Last Name",
388 "signup.legal.info" : "By creating a Franz account you accept the",
389 "signup.legal.privacy" : "Privacy Statement",
390 "signup.legal.terms" : "Terms of service",
391 "signup.link.login" : "Already have an account, sign in?",
392 "signup.password.label" : "මුරපදය",
393 "signup.submit.label" : "Create account",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "Cancel",
406 "subscriptionPopup.buttonDone" : "Done",
407 "tabs.item.deleteService" : "Delete service",
408 "tabs.item.disableAudio" : "Disable audio",
409 "tabs.item.disableNotifications" : "Disable notifications",
410 "tabs.item.disableService" : "Disable service",
411 "tabs.item.edit" : "Edit",
412 "tabs.item.enableAudio" : "Enable audio",
413 "tabs.item.enableNotification" : "Enable notifications",
414 "tabs.item.enableService" : "Enable service",
415 "tabs.item.reload" : "Reload",
416 "validation.email" : "{field} is not valid",
417 "validation.minLength" : "{field} should be at least {length} characters long",
418 "validation.oneRequired" : "At least one is required",
419 "validation.required" : "{field} is required",
420 "validation.url" : "{field} is not a valid URL",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "Reload",
426 "welcome.loginButton" : "Login to your account",
427 "welcome.signupButton" : "Create a free account",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "All services",
430 "workspaceDrawer.headline" : "Workspaces",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/locales/sq.json b/src/i18n/locales/sq.json
new file mode 100644
index 000000000..078973fe8
--- /dev/null
+++ b/src/i18n/locales/sq.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "Reload",
3 "app.errorHandler.headline" : "Something went wrong",
4 "connectionLostBanner.cta" : "Reload Service",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "Changes in Franz {version}",
8 "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait",
9 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional",
11 "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial",
12 "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action" : "Upgrade Franz",
14 "feature.delayApp.upgrade.actionShort" : "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree" : "Stay on Free",
17 "feature.planSelection.cta.trial" : "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal" : "Choose Personal",
19 "feature.planSelection.cta.upgradePro" : "Choose Professional",
20 "feature.planSelection.free.text" : "Basic functionality",
21 "feature.planSelection.fullFeatureList" : "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal",
24 "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
25 "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan",
26 "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment",
30 "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.",
31 "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
32 "feature.shareFranz.action.email" : "Send as email",
33 "feature.shareFranz.action.facebook" : "Share on Facebook",
34 "feature.shareFranz.action.twitter" : "Share on Twitter",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
37 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @FranzMessenger",
38 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
39 "feature.todos.premium.info" : "Franz Todos are available to premium users now!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "Upgrade Account",
42 "feature.trialStatusBar.cta" : "Upgrade now",
43 "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan",
48 "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.",
49 "global.api.unhealthy" : "Can't connect to Franz online services",
50 "global.franzProRequired" : "Franz Professional Required",
51 "global.notConnectedToTheInternet" : "You are not connected to the internet.",
52 "global.spellchecker.useDefault" : "Use System Default ({default})",
53 "global.spellchecking.autodetect" : "Detect language automatically",
54 "global.spellchecking.autodetect.short" : "Automatic",
55 "global.spellchecking.language" : "Spell checking language",
56 "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional",
57 "import.headline" : "Import your Franz 4 services",
58 "import.notSupportedHeadline" : "Services not yet supported in Franz 5",
59 "import.skip.label" : "I want to add services manually",
60 "import.submit.label" : "Import services",
61 "infobar.buttonChangelog" : "What is new?",
62 "infobar.buttonInstallUpdate" : "Restart & install update",
63 "infobar.buttonReloadServices" : "Reload services",
64 "infobar.requiredRequestsFailed" : "Could not load services and user information",
65 "infobar.servicesUpdated" : "Your services have been updated.",
66 "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable" : "A new update for Franz is available.",
68 "invite.email.label" : "Email address",
69 "invite.headline.friends" : "Invite 3 of your friends or colleagues",
70 "invite.name.label" : "Name",
71 "invite.skip.label" : "I want to do this later",
72 "invite.submit.label" : "Send invites",
73 "invite.successInfo" : "Invitations sent successfully",
74 "login.email.label" : "Email address",
75 "login.headline" : "Sign in",
76 "login.invalidCredentials" : "Email or password not valid",
77 "login.link.password" : "Reset password",
78 "login.link.signup" : "Create a free account",
79 "login.password.label" : "Password",
80 "login.serverLogout" : "Your session expired, please login again.",
81 "login.submit.label" : "Sign in",
82 "login.tokenExpired" : "Your session expired, please login again.",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "About Franz",
86 "menu.app.announcement" : "What's new?",
87 "menu.app.checkForUpdates" : "Check for updates",
88 "menu.app.hide" : "Hide",
89 "menu.app.hideOthers" : "Hide Others",
90 "menu.app.quit" : "Quit",
91 "menu.app.settings" : "Settings",
92 "menu.app.unhide" : "Unhide",
93 "menu.edit" : "Edit",
94 "menu.edit.copy" : "Copy",
95 "menu.edit.cut" : "Cut",
96 "menu.edit.delete" : "Delete",
97 "menu.edit.emojiSymbols" : "Emoji & Symbols",
98 "menu.edit.paste" : "Paste",
99 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
100 "menu.edit.redo" : "Redo",
101 "menu.edit.selectAll" : "Select All",
102 "menu.edit.speech" : "Speech",
103 "menu.edit.startDictation" : "Start Dictation",
104 "menu.edit.startSpeaking" : "Start Speaking",
105 "menu.edit.stopSpeaking" : "Stop Speaking",
106 "menu.edit.undo" : "Undo",
107 "menu.file" : "File",
108 "menu.help" : "Help",
109 "menu.help.changelog" : "Changelog",
110 "menu.help.debugInfo" : "Copy Debug Information",
111 "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.",
112 "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information",
113 "menu.help.learnMore" : "Learn More",
114 "menu.help.privacy" : "Privacy Statement",
115 "menu.help.support" : "Support",
116 "menu.help.tos" : "Terms of Service",
117 "menu.services" : "Services",
118 "menu.services.activatePreviousService" : "Activate previous service",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "Home",
121 "menu.services.setNextServiceActive" : "Activate next service",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "View",
125 "menu.view.enterFullScreen" : "Enter Full Screen",
126 "menu.view.exitFullScreen" : "Exit Full Screen",
127 "menu.view.reloadFranz" : "Reload Franz",
128 "menu.view.reloadService" : "Reload Service",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "Actual Size",
131 "menu.view.toggleDevTools" : "Toggle Developer Tools",
132 "menu.view.toggleFullScreen" : "Toggle Full Screen",
133 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "Zoom In",
136 "menu.view.zoomOut" : "Zoom Out",
137 "menu.window" : "Window",
138 "menu.window.close" : "Close",
139 "menu.window.minimize" : "Minimize",
140 "menu.workspaces" : "Workspaces",
141 "menu.workspaces.addNewWorkspace" : "Add New Workspace...",
142 "menu.workspaces.closeWorkspaceDrawer" : "Close workspace drawer",
143 "menu.workspaces.defaultWorkspace" : "All services",
144 "menu.workspaces.openWorkspaceDrawer" : "Open workspace drawer",
145 "password.email.label" : "Email address",
146 "password.headline" : "Reset password",
147 "password.link.login" : "Sign in to your account",
148 "password.link.signup" : "Create a free account",
149 "password.noUser" : "No user with that email address was found",
150 "password.submit.label" : "Submit",
151 "password.successInfo" : "Please check your email",
152 "premiumFeature.button.upgradeAccount" : "Upgrade account",
153 "pricing.features.accountSync" : "Account Synchronisation",
154 "pricing.features.adFree" : "Forever ad-free",
155 "pricing.features.appDelays" : "No Waiting Screens",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "Add Custom Websites",
158 "pricing.features.desktopNotifications" : "Desktop Notifications",
159 "pricing.features.onPremise" : "On-premise & other Hosted Services",
160 "pricing.features.recipes" : "Choose from more than 70 Services",
161 "pricing.features.serviceProxies" : "Service Proxies",
162 "pricing.features.spellchecker" : "Spellchecker support",
163 "pricing.features.teamManagement" : "Team Management",
164 "pricing.features.thirdPartyServices" : "Install 3rd party services",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "Workspaces",
169 "pricing.plan.free" : "Free",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "Reload {name}",
191 "service.crashHandler.autoReload" : "Trying to automatically restore {name} in {seconds} seconds",
192 "service.crashHandler.headline" : "Oh no!",
193 "service.crashHandler.text" : "{name} has caused an error.",
194 "service.disabledHandler.action" : "Enable {name}",
195 "service.disabledHandler.headline" : "{name} is disabled",
196 "service.errorHandler.action" : "Reload {name}",
197 "service.errorHandler.editAction" : "Edit {name}",
198 "service.errorHandler.headline" : "Oh no!",
199 "service.errorHandler.message" : "Error",
200 "service.errorHandler.text" : "{name} has failed to load.",
201 "service.restrictedHandler.action" : "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "Loading",
207 "services.getStarted" : "Get started",
208 "services.welcome" : "Welcome to Franz",
209 "settings.account.account.editButton" : "Edit account",
210 "settings.account.accountType.basic" : "Basic Account",
211 "settings.account.accountType.premium" : "Premium Supporter Account",
212 "settings.account.buttonSave" : "Update profile",
213 "settings.account.deleteAccount" : "Delete account",
214 "settings.account.deleteEmailSent" : "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
215 "settings.account.deleteInfo" : "If you don't need your Franz account any longer, you can delete your account and all related data here.",
216 "settings.account.headline" : "Account",
217 "settings.account.headlineAccount" : "Account information",
218 "settings.account.headlineDangerZone" : "Danger Zone",
219 "settings.account.headlineInvoices" : "Invoices",
220 "settings.account.headlinePassword" : "Change password",
221 "settings.account.headlineProfile" : "Update profile",
222 "settings.account.headlineSubscription" : "Your subscription",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "Download",
226 "settings.account.manageSubscription.label" : "Manage your subscription",
227 "settings.account.successInfo" : "Your changes have been saved",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "Try again",
232 "settings.account.tryReloadUserInfoRequest" : "Try again",
233 "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional",
234 "settings.account.userInfoRequestFailed" : "Could not load user information",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "Clear cache",
237 "settings.app.buttonInstallUpdate" : "Restart & install update",
238 "settings.app.buttonSearchForUpdate" : "Check for updates",
239 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.",
240 "settings.app.currentVersion" : "Current version:",
241 "settings.app.form.autoLaunchInBackground" : "Open in background",
242 "settings.app.form.autoLaunchOnStart" : "Launch Franz on start",
243 "settings.app.form.beta" : "Include beta versions",
244 "settings.app.form.darkMode" : "Join the Dark Side",
245 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
246 "settings.app.form.enableSpellchecking" : "Enable spell checking",
247 "settings.app.form.enableSystemTray" : "Show Franz in system tray",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "Language",
251 "settings.app.form.minimizeToSystemTray" : "Minimize Franz to system tray",
252 "settings.app.form.runInBackground" : "Keep Franz in background when closing the window",
253 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
255 "settings.app.headline" : "Settings",
256 "settings.app.headlineAdvanced" : "Advanced",
257 "settings.app.headlineAppearance" : "Appearance",
258 "settings.app.headlineGeneral" : "General",
259 "settings.app.headlineLanguage" : "Language",
260 "settings.app.headlineUpdates" : "Updates",
261 "settings.app.languageDisclaimer" : "Official translations are English & German. All other languages are community based translations.",
262 "settings.app.restartRequired" : "Changes require restart",
263 "settings.app.subheadlineCache" : "Cache",
264 "settings.app.translationHelp" : "Help us to translate Franz into your language.",
265 "settings.app.updateStatusAvailable" : "Update available, downloading...",
266 "settings.app.updateStatusSearching" : "Is searching for update",
267 "settings.app.updateStatusUpToDate" : "You are using the latest version of Franz",
268 "settings.invite.headline" : "Invite Friends",
269 "settings.navigation.account" : "Account",
270 "settings.navigation.availableServices" : "Available services",
271 "settings.navigation.inviteFriends" : "Invite Friends",
272 "settings.navigation.logout" : "Logout",
273 "settings.navigation.settings" : "Settings",
274 "settings.navigation.team" : "Manage Team",
275 "settings.navigation.yourServices" : "Your services",
276 "settings.navigation.yourWorkspaces" : "Your workspaces",
277 "settings.recipes.all" : "All services",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "Available services",
286 "settings.recipes.missingService" : "Missing a service?",
287 "settings.recipes.mostPopular" : "Most popular",
288 "settings.recipes.nothingFound" : "Sorry, but no service matched your search term.",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "Service successfully added",
290 "settings.searchService" : "Search service",
291 "settings.service.error.goBack" : "Back to services",
292 "settings.service.error.headline" : "Error",
293 "settings.service.error.message" : "Could not load service recipe.",
294 "settings.service.form.addServiceHeadline" : "Add {name}",
295 "settings.service.form.availableServices" : "Available services",
296 "settings.service.form.customUrl" : "Custom server",
297 "settings.service.form.customUrlPremiumInfo" : "To add self hosted services, you need a Franz Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount" : "Upgrade your account",
299 "settings.service.form.customUrlValidationError" : "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton" : "Delete service",
301 "settings.service.form.editServiceHeadline" : "Edit {name}",
302 "settings.service.form.enableAudio" : "Enable audio",
303 "settings.service.form.enableBadge" : "Show unread message badges",
304 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "Enable notifications",
307 "settings.service.form.enableService" : "Enable service",
308 "settings.service.form.headlineBadges" : "Unread message badges",
309 "settings.service.form.headlineGeneral" : "General",
310 "settings.service.form.headlineNotifications" : "Notifications",
311 "settings.service.form.icon" : "Custom icon",
312 "settings.service.form.iconDelete" : "Delete",
313 "settings.service.form.iconUpload" : "Drop your image, or click here",
314 "settings.service.form.indirectMessageInfo" : "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
315 "settings.service.form.indirectMessages" : "Show message badge for all new messages",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
318 "settings.service.form.name" : "Name",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings",
320 "settings.service.form.proxy.host" : "Proxy Host\/IP",
321 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
322 "settings.service.form.proxy.isEnabled" : "Use Proxy",
323 "settings.service.form.proxy.password" : "Password (optional)",
324 "settings.service.form.proxy.port" : "Port",
325 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.",
326 "settings.service.form.proxy.user" : "User (optional)",
327 "settings.service.form.saveButton" : "Save service",
328 "settings.service.form.tabHosted" : "Hosted",
329 "settings.service.form.tabOnPremise" : "Self hosted ⭐️",
330 "settings.service.form.team" : "Team",
331 "settings.service.form.useHostedService" : "Use the hosted {name} service.",
332 "settings.service.form.yourServices" : "Your services",
333 "settings.services.deletedInfo" : "Service has been deleted",
334 "settings.services.discoverServices" : "Discover services",
335 "settings.services.headline" : "Your services",
336 "settings.services.noServicesAdded" : "You haven't added any services yet.",
337 "settings.services.servicesRequestFailed" : "Could not load your services",
338 "settings.services.tooltip.isDisabled" : "Service is disabled",
339 "settings.services.tooltip.isMuted" : "All sounds are muted",
340 "settings.services.tooltip.notificationsDisabled" : "Notifications are disabled",
341 "settings.services.updatedInfo" : "Your changes have been saved",
342 "settings.team.contentHeadline" : "Franz for Teams",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "Team",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "Manage your Team on meetfranz.com",
347 "settings.team.upgradeAction" : "Upgrade your Account",
348 "settings.user.form.accountType.company" : "Company",
349 "settings.user.form.accountType.individual" : "Individual",
350 "settings.user.form.accountType.label" : "Account type",
351 "settings.user.form.accountType.non-profit" : "Non-Profit",
352 "settings.user.form.currentPassword" : "Current password",
353 "settings.user.form.email" : "Email",
354 "settings.user.form.firstname" : "First Name",
355 "settings.user.form.lastname" : "Last Name",
356 "settings.user.form.newPassword" : "New password",
357 "settings.workspace.add.form.name" : "Name",
358 "settings.workspace.add.form.submitButton" : "Create workspace",
359 "settings.workspace.form.buttonDelete" : "Delete workspace",
360 "settings.workspace.form.buttonSave" : "Save workspace",
361 "settings.workspace.form.name" : "Name",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "Services in this Workspace",
363 "settings.workspace.form.yourWorkspaces" : "Your workspaces",
364 "settings.workspaces.deletedInfo" : "Workspace has been deleted",
365 "settings.workspaces.headline" : "Your workspaces",
366 "settings.workspaces.noWorkspacesAdded" : "You haven't added any workspaces yet.",
367 "settings.workspaces.tryReloadWorkspaces" : "Try again",
368 "settings.workspaces.updatedInfo" : "Your changes have been saved",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "Could not load your workspaces",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "Add new service",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "Close workspace drawer",
378 "sidebar.muteApp" : "Disable notifications & audio",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "Open workspace drawer",
381 "sidebar.settings" : "Settings",
382 "sidebar.unmuteApp" : "Enable notifications & audio",
383 "signup.email.label" : "Email address",
384 "signup.emailDuplicate" : "A user with that email address already exists",
385 "signup.firstname.label" : "First Name",
386 "signup.headline" : "Sign up",
387 "signup.lastname.label" : "Last Name",
388 "signup.legal.info" : "By creating a Franz account you accept the",
389 "signup.legal.privacy" : "Privacy Statement",
390 "signup.legal.terms" : "Terms of service",
391 "signup.link.login" : "Already have an account, sign in?",
392 "signup.password.label" : "Password",
393 "signup.submit.label" : "Create account",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "Upgrade Account",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "Cancel",
406 "subscriptionPopup.buttonDone" : "Done",
407 "tabs.item.deleteService" : "Delete service",
408 "tabs.item.disableAudio" : "Disable audio",
409 "tabs.item.disableNotifications" : "Disable notifications",
410 "tabs.item.disableService" : "Disable service",
411 "tabs.item.edit" : "Edit",
412 "tabs.item.enableAudio" : "Enable audio",
413 "tabs.item.enableNotification" : "Enable notifications",
414 "tabs.item.enableService" : "Enable service",
415 "tabs.item.reload" : "Reload",
416 "validation.email" : "{field} is not valid",
417 "validation.minLength" : "{field} should be at least {length} characters long",
418 "validation.oneRequired" : "At least one is required",
419 "validation.required" : "{field} is required",
420 "validation.url" : "{field} is not a valid URL",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "Home",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "Reload",
426 "welcome.loginButton" : "Login to your account",
427 "welcome.signupButton" : "Create a free account",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "All services",
430 "workspaceDrawer.headline" : "Workspaces",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/locales/whitelist_en-US.json b/src/i18n/locales/whitelist_en-US.json
index fe51488c7..32960f8ce 100644
--- a/src/i18n/locales/whitelist_en-US.json
+++ b/src/i18n/locales/whitelist_en-US.json
@@ -1 +1,2 @@
1[] 1[
2] \ No newline at end of file
diff --git a/src/i18n/locales/zh-HANS.json b/src/i18n/locales/zh-HANS.json
new file mode 100644
index 000000000..5783b301c
--- /dev/null
+++ b/src/i18n/locales/zh-HANS.json
@@ -0,0 +1,439 @@
1{
2 "app.errorHandler.action" : "重新加载",
3 "app.errorHandler.headline" : "出现问题了",
4 "connectionLostBanner.cta" : "重启服务",
5 "connectionLostBanner.informationLink" : "What happened?",
6 "connectionLostBanner.message" : "Oh no! Franz lost the connection to {name}.",
7 "feature.announcements.changelog.headline" : "在{version}版本中的更改",
8 "feature.delayApp.headline" : "升级您的Franz订阅计划以跳过等待",
9 "feature.delayApp.text" : "Franz会在 {seconds} 秒后继续。",
10 "feature.delayApp.trial.action" : "是的,我想开始14天的Franz 专业版免费试用",
11 "feature.delayApp.trial.actionShort" : "激活免费的Franz 专业版试用",
12 "feature.delayApp.trial.headline" : "免费获得Franz 专业版 14天试用版,无需等待",
13 "feature.delayApp.upgrade.action" : "更新Franz",
14 "feature.delayApp.upgrade.actionShort" : "升级账户",
15 "feature.planSelection.cta.ctaDowngradeFree" : "降级到Free订阅计划",
16 "feature.planSelection.cta.stayOnFree" : "保持Free订阅计划",
17 "feature.planSelection.cta.trial" : "开始我的14天免费试用",
18 "feature.planSelection.cta.upgradePersonal" : "选择Personal订阅计划",
19 "feature.planSelection.cta.upgradePro" : "选择Professional订阅计划",
20 "feature.planSelection.free.text" : "基本功能",
21 "feature.planSelection.fullFeatureList" : "完整的对比所有订阅计划",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade" : "降级到Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade" : "选择Personal订阅计划",
24 "feature.planSelection.fullscreen.dialog.message" : "您将降级到我们的免费帐户。您确定吗?单击此处每月只需{currency} {price}即可获得更多服务和功能。",
25 "feature.planSelection.fullscreen.dialog.title" : "降级您的Franz订阅计划",
26 "feature.planSelection.fullscreen.subheadline" : "是时候做出选择了。 Franz在我们的Personal和Professional订阅计划上表现最佳。请看看并为做出您的最佳选择。",
27 "feature.planSelection.fullscreen.welcome" : "你已经准备好了吗, {name}?",
28 "feature.planSelection.personal.text" : "更多的服务,无需等待 - 个人使用的理想选择。",
29 "feature.planSelection.pricesBasedOnAnnualPayment" : "所有价格均基于年度付款",
30 "feature.planSelection.pro.text" : "为您和您的团队提供无限的服务和专业功能。",
31 "feature.serviceLimit.limitReached" : "您已在计划中包含的{limit}个服务中添加了{amount}个。请升级您的帐户以添加更多服务。",
32 "feature.shareFranz.action.email" : "使用电子邮件发送",
33 "feature.shareFranz.action.facebook" : "在Facebook上分享",
34 "feature.shareFranz.action.twitter" : "在Twitter上分享",
35 "feature.shareFranz.headline" : "Franz is better together!",
36 "feature.shareFranz.shareText.email" : "我们在Franz里添加了 {count} 服务!请前往 www.meetfranz.com 获得支持WhatsApp,Messenger,Slack,Skype的免费应用程序. ",
37 "feature.shareFranz.shareText.twitter" : "我已经为Franz添加了{count}个服务!在www.meetfranz.com\/cc @FranzMessenger上获得适用于WhatsApp,Messenger,Slack,Skype和co的免费应用程序",
38 "feature.shareFranz.text" : "告诉你的朋友和同事Franz有多棒并且帮助我们传播Franz。",
39 "feature.todos.premium.info" : "Franz Todos现在对高级用户可用!",
40 "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade" : "升级帐户",
42 "feature.trialStatusBar.cta" : "立即升级",
43 "feature.trialStatusBar.expired" : "您的Franz免费订阅计划{plan}已过期,请升级您的帐户。",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "降级free订阅计划",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "选择Personal订阅计划",
46 "feature.trialStatusBar.fullscreen.dialog.message" : "您将降级到我们的免费帐户。您确定吗?单击此处每月只需{currency} {price}即可获得更多服务和功能。",
47 "feature.trialStatusBar.fullscreen.dialog.title" : "降级您的Franz订阅计划",
48 "feature.trialStatusBar.restTime" : "您的 Franz 免费 {plan} 试用期在 {时间} 结束。",
49 "global.api.unhealthy" : "无法连接Franz在线服务",
50 "global.franzProRequired" : "需要 Franz 专业版。",
51 "global.notConnectedToTheInternet" : "没有网络服务",
52 "global.spellchecker.useDefault" : "使用系统默认设置({default})",
53 "global.spellchecking.autodetect" : "自动检测语言",
54 "global.spellchecking.autodetect.short" : "自动",
55 "global.spellchecking.language" : "语言拼写检查",
56 "global.upgradeButton.upgradeToPro" : "升级到 Franz 专业版。",
57 "import.headline" : "导入自定义Franz 4服务",
58 "import.notSupportedHeadline" : "Franz 5 目前不支持此项服务",
59 "import.skip.label" : "手动添加服务",
60 "import.submit.label" : "导入服务",
61 "infobar.buttonChangelog" : "新功能",
62 "infobar.buttonInstallUpdate" : "重启并安装更新",
63 "infobar.buttonReloadServices" : "重新加载服务",
64 "infobar.requiredRequestsFailed" : "无法加载服务列表和用户信息",
65 "infobar.servicesUpdated" : "服务已更新",
66 "infobar.trialActivated" : "您的试用已成功激活。祝您愉快!",
67 "infobar.updateAvailable" : "Franz更新可用.",
68 "invite.email.label" : "电子邮件地址",
69 "invite.headline.friends" : "邀请3个好友或同事",
70 "invite.name.label" : "名字",
71 "invite.skip.label" : "稍后再进行此项操作",
72 "invite.submit.label" : "发送邀请",
73 "invite.successInfo" : "邀请发送成功",
74 "login.email.label" : "Email 地址",
75 "login.headline" : "登陆",
76 "login.invalidCredentials" : "Email或密码无效",
77 "login.link.password" : "重置密码",
78 "login.link.signup" : "创建账户",
79 "login.password.label" : "密码:",
80 "login.serverLogout" : "您的登陆已过期,请重新登录。",
81 "login.submit.label" : "登陆",
82 "login.tokenExpired" : "登录已过期,请重新登录",
83 "menu.Todoss.closeTodosDrawer" : "Close Todos drawer",
84 "menu.Todoss.openTodosDrawer" : "Open Todos drawer",
85 "menu.app.about" : "关于 Franz",
86 "menu.app.announcement" : "新变化",
87 "menu.app.checkForUpdates" : "检查更新",
88 "menu.app.hide" : "隐藏",
89 "menu.app.hideOthers" : "隐藏其它",
90 "menu.app.quit" : "退出",
91 "menu.app.settings" : "设置",
92 "menu.app.unhide" : "显示",
93 "menu.edit" : "编辑",
94 "menu.edit.copy" : "复制",
95 "menu.edit.cut" : "剪切",
96 "menu.edit.delete" : "删除",
97 "menu.edit.emojiSymbols" : "表情与符号",
98 "menu.edit.paste" : "粘贴",
99 "menu.edit.pasteAndMatchStyle" : "粘贴并适应格式",
100 "menu.edit.redo" : "重做",
101 "menu.edit.selectAll" : "全选",
102 "menu.edit.speech" : "演讲",
103 "menu.edit.startDictation" : "开始听写",
104 "menu.edit.startSpeaking" : "开始说话",
105 "menu.edit.stopSpeaking" : "停止说话",
106 "menu.edit.undo" : "撤销",
107 "menu.file" : "文件",
108 "menu.help" : "帮助",
109 "menu.help.changelog" : "更新日志",
110 "menu.help.debugInfo" : "复制调试信息",
111 "menu.help.debugInfoCopiedBody" : "您的调试信息已复制到剪贴板。",
112 "menu.help.debugInfoCopiedHeadline" : "Franz 调试信息",
113 "menu.help.learnMore" : "了解更多",
114 "menu.help.privacy" : "隐私条款",
115 "menu.help.support" : "支持",
116 "menu.help.tos" : "服务条款",
117 "menu.services" : "服务",
118 "menu.services.activatePreviousService" : "激活以前的服务",
119 "menu.services.addNewService" : "Add New Service",
120 "menu.services.goHome" : "主页",
121 "menu.services.setNextServiceActive" : "激活下一个服务",
122 "menu.todos" : "Todos",
123 "menu.todos.enableTodos" : "Enable Todos",
124 "menu.view" : "视图",
125 "menu.view.enterFullScreen" : "全屏",
126 "menu.view.exitFullScreen" : "退出全屏",
127 "menu.view.reloadFranz" : "重启Franz",
128 "menu.view.reloadService" : "重启服务",
129 "menu.view.reloadTodos" : "Reload ToDos",
130 "menu.view.resetZoom" : "实际尺寸",
131 "menu.view.toggleDevTools" : "打开开发者工具",
132 "menu.view.toggleFullScreen" : "切换全屏",
133 "menu.view.toggleServiceDevTools" : "切换服务开发工具",
134 "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools",
135 "menu.view.zoomIn" : "放大",
136 "menu.view.zoomOut" : "缩小",
137 "menu.window" : "窗口",
138 "menu.window.close" : "关闭",
139 "menu.window.minimize" : "最小化",
140 "menu.workspaces" : "工作组",
141 "menu.workspaces.addNewWorkspace" : "增加一个工作组",
142 "menu.workspaces.closeWorkspaceDrawer" : "关闭工作区列表",
143 "menu.workspaces.defaultWorkspace" : "所有服务",
144 "menu.workspaces.openWorkspaceDrawer" : "打开工作组列表",
145 "password.email.label" : "Email地址",
146 "password.headline" : "重置密码",
147 "password.link.login" : "登录到您的帐户",
148 "password.link.signup" : "创建一个免费账户",
149 "password.noUser" : "该邮箱尚未注册",
150 "password.submit.label" : "提交",
151 "password.successInfo" : "请检查您的 email 邮箱",
152 "premiumFeature.button.upgradeAccount" : "升级账户",
153 "pricing.features.accountSync" : "帐户同步",
154 "pricing.features.adFree" : "永远无广告",
155 "pricing.features.appDelays" : "没有等待画面",
156 "pricing.features.appDelaysEnabled" : "Occasional Waiting Screens",
157 "pricing.features.customWebsites" : "添加自定义网站",
158 "pricing.features.desktopNotifications" : "桌面通知",
159 "pricing.features.onPremise" : "本地和其他托管服务",
160 "pricing.features.recipes" : "从70多种服务中选择",
161 "pricing.features.serviceProxies" : "代理服务",
162 "pricing.features.spellchecker" : "拼写检查器支持",
163 "pricing.features.teamManagement" : "团队管理",
164 "pricing.features.thirdPartyServices" : "安装第三方服务",
165 "pricing.features.unlimitedServices" : "Add unlimited services",
166 "pricing.features.upToSixServices" : "Add up to 6 services",
167 "pricing.features.upToThreeServices" : "Add up to 3 services",
168 "pricing.features.workspaces" : "工作组",
169 "pricing.plan.free" : "免费",
170 "pricing.plan.legacy" : "Premium",
171 "pricing.plan.personal" : "Personal",
172 "pricing.plan.personal-monthly" : "Personal Monthly",
173 "pricing.plan.personal-yearly" : "Personal Yearly",
174 "pricing.plan.pro" : "Professional",
175 "pricing.plan.pro-monthly" : "Professional Monthly",
176 "pricing.plan.pro-yearly" : "Professional Yearly",
177 "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ",
178 "pricing.trial.cta.skip" : "Continue to Franz",
179 "pricing.trial.cta.start" : "Start using Franz",
180 "pricing.trial.error" : "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline" : "Franz Professional includes:",
182 "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz",
183 "pricing.trial.intro.happyMessaging" : "Happy messaging,",
184 "pricing.trial.intro.specialTreat" : "We have a special treat for you.",
185 "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline" : "No strings attached",
188 "pricing.trial.terms.noCreditCard" : "No credit card required",
189 "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action" : "重新载入",
191 "service.crashHandler.autoReload" : "在{seconds}秒内尝试自动恢复{name}",
192 "service.crashHandler.headline" : "啊,糟糕!",
193 "service.crashHandler.text" : "项目{name}引起了一个错误。",
194 "service.disabledHandler.action" : "启用{name}",
195 "service.disabledHandler.headline" : "项目{name}已停用",
196 "service.errorHandler.action" : "重新载入 {name}",
197 "service.errorHandler.editAction" : "编辑{name}",
198 "service.errorHandler.headline" : "啊,糟糕!",
199 "service.errorHandler.message" : "错误",
200 "service.errorHandler.text" : "{name} 没有办法加载",
201 "service.restrictedHandler.action" : "升级帐户",
202 "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required",
203 "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading" : "正在加载,请稍后",
207 "services.getStarted" : "开始",
208 "services.welcome" : "欢迎使用 Franz",
209 "settings.account.account.editButton" : "编辑账户",
210 "settings.account.accountType.basic" : "基本账户",
211 "settings.account.accountType.premium" : "高级支持者账户",
212 "settings.account.buttonSave" : "上传文件",
213 "settings.account.deleteAccount" : "删除账号",
214 "settings.account.deleteEmailSent" : "您将收到一封邮件,在这封邮件中包含有确认删除您的账号的链接。请注意,您的账号和数据无法被恢复!",
215 "settings.account.deleteInfo" : "如果您不再需要Franz账户,您可以在这里删除您的账户及其相关联的数据。",
216 "settings.account.headline" : "账户",
217 "settings.account.headlineAccount" : "账户信息",
218 "settings.account.headlineDangerZone" : "注意!",
219 "settings.account.headlineInvoices" : "发票",
220 "settings.account.headlinePassword" : "修改密码",
221 "settings.account.headlineProfile" : "更新个人资料",
222 "settings.account.headlineSubscription" : "您的订阅",
223 "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial",
224 "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience",
225 "settings.account.invoiceDownload" : "下载",
226 "settings.account.manageSubscription.label" : "管理您的订阅",
227 "settings.account.successInfo" : "已保存您的设置",
228 "settings.account.trial" : "Free Trial",
229 "settings.account.trialEndsIn" : "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices" : "重试",
232 "settings.account.tryReloadUserInfoRequest" : "重试",
233 "settings.account.upgradeToPro.label" : "升级到 Franz 专业版。",
234 "settings.account.userInfoRequestFailed" : "无法加载用户信息",
235 "settings.account.yourLicense" : "Your Franz License",
236 "settings.app.buttonClearAllCache" : "清除缓存",
237 "settings.app.buttonInstallUpdate" : "重启并安装更新",
238 "settings.app.buttonSearchForUpdate" : "检查更新",
239 "settings.app.cacheInfo" : "Franz 的缓存占用磁盘:{size} .",
240 "settings.app.currentVersion" : "当前版本:",
241 "settings.app.form.autoLaunchInBackground" : "在后台打开",
242 "settings.app.form.autoLaunchOnStart" : "开机启动Franz",
243 "settings.app.form.beta" : "包含测试版本",
244 "settings.app.form.darkMode" : "加入黑色主题",
245 "settings.app.form.enableGPUAcceleration" : "启用 GPU 加速",
246 "settings.app.form.enableSpellchecking" : "启用拼写检查",
247 "settings.app.form.enableSystemTray" : "在系统托盘中显示 Franz",
248 "settings.app.form.enableTodos" : "Enable Franz Todos",
249 "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded",
250 "settings.app.form.language" : "语言",
251 "settings.app.form.minimizeToSystemTray" : "最小化 Franz 到系统托盘",
252 "settings.app.form.runInBackground" : "关闭窗口时保持 Franz 在后台运行",
253 "settings.app.form.showDisabledServices" : "显示已禁用的服务标签页",
254 "settings.app.form.showMessagesBadgesWhenMuted" : "在通知被禁用时显示未读消息提示。",
255 "settings.app.headline" : "设置",
256 "settings.app.headlineAdvanced" : "高级",
257 "settings.app.headlineAppearance" : "外观",
258 "settings.app.headlineGeneral" : "通用",
259 "settings.app.headlineLanguage" : "语言",
260 "settings.app.headlineUpdates" : "更新",
261 "settings.app.languageDisclaimer" : "英语和德语为官方翻译。其他语言都是来自社区的翻译",
262 "settings.app.restartRequired" : "重启后生效",
263 "settings.app.subheadlineCache" : "缓存",
264 "settings.app.translationHelp" : "帮助我们将Franz翻译至您的语言。",
265 "settings.app.updateStatusAvailable" : "更新可用,下载中……",
266 "settings.app.updateStatusSearching" : "正在查找更新",
267 "settings.app.updateStatusUpToDate" : "您使用的Franz是最新版本",
268 "settings.invite.headline" : "邀请朋友",
269 "settings.navigation.account" : "账户",
270 "settings.navigation.availableServices" : "可用的服务",
271 "settings.navigation.inviteFriends" : "邀请朋友",
272 "settings.navigation.logout" : "退出账户",
273 "settings.navigation.settings" : "设置",
274 "settings.navigation.team" : "管理团队",
275 "settings.navigation.yourServices" : "您的服务",
276 "settings.navigation.yourWorkspaces" : "你的工作组",
277 "settings.recipes.all" : "所有服务",
278 "settings.recipes.custom" : "Custom Services",
279 "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes",
280 "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes",
281 "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes",
282 "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:",
283 "settings.recipes.customService.openDevDocs" : "Developer Documentation",
284 "settings.recipes.customService.openFolder" : "Open folder",
285 "settings.recipes.headline" : "可用的服务",
286 "settings.recipes.missingService" : "服务丢失?",
287 "settings.recipes.mostPopular" : "最受欢迎的",
288 "settings.recipes.nothingFound" : "抱歉,没有找到相关服务",
289 "settings.recipes.servicesSuccessfulAddedInfo" : "服务添加成功",
290 "settings.searchService" : "搜索服务",
291 "settings.service.error.goBack" : "返回服务",
292 "settings.service.error.headline" : "错误",
293 "settings.service.error.message" : "无法加载服务配置。",
294 "settings.service.form.addServiceHeadline" : "添加 {name}",
295 "settings.service.form.availableServices" : "可用的服务",
296 "settings.service.form.customUrl" : "自定义服务器",
297 "settings.service.form.customUrlPremiumInfo" : "如要添加自设服务,您需要一个Franz高级支持者账户。",
298 "settings.service.form.customUrlUpgradeAccount" : "升级您的账户",
299 "settings.service.form.customUrlValidationError" : "无法验证自定义{name}服务器。",
300 "settings.service.form.deleteButton" : "删除服务",
301 "settings.service.form.editServiceHeadline" : "编辑{name}",
302 "settings.service.form.enableAudio" : "启用声音",
303 "settings.service.form.enableBadge" : "启用未读消息通知",
304 "settings.service.form.enableDarkMode" : "使用黑色模式",
305 "settings.service.form.enableHibernation" : "Enable hibernation",
306 "settings.service.form.enableNotification" : "启用通知",
307 "settings.service.form.enableService" : "启用服务",
308 "settings.service.form.headlineBadges" : "未读消息通知",
309 "settings.service.form.headlineGeneral" : "常规",
310 "settings.service.form.headlineNotifications" : "未读消息通知",
311 "settings.service.form.icon" : "自定义图标",
312 "settings.service.form.iconDelete" : "删除",
313 "settings.service.form.iconUpload" : "点击或把图片拖放到这里",
314 "settings.service.form.indirectMessageInfo" : "频道内的所有新消息都会通知到您,包括@用户名、@频道等等...",
315 "settings.service.form.indirectMessages" : "显示所有新消息的标志",
316 "settings.service.form.isHibernatedEnabledInfo" : "When enabled, a service will be shut down after a period of time to save system resources.",
317 "settings.service.form.isMutedInfo" : "禁用后所有的通知和软件声音都会消失",
318 "settings.service.form.name" : "名字",
319 "settings.service.form.proxy.headline" : "HTTP\/HTTPS 端口设定",
320 "settings.service.form.proxy.host" : "端口主机\/IP",
321 "settings.service.form.proxy.info" : "代理服务器的设置将不会与 Franz 的服务器同步。",
322 "settings.service.form.proxy.isEnabled" : "使用代理",
323 "settings.service.form.proxy.password" : "密码(可选)",
324 "settings.service.form.proxy.port" : "端口",
325 "settings.service.form.proxy.restartInfo" : "请在设定端口后重启Franz。",
326 "settings.service.form.proxy.user" : "用户(可选)",
327 "settings.service.form.saveButton" : "保存服务",
328 "settings.service.form.tabHosted" : "托管",
329 "settings.service.form.tabOnPremise" : "自托管",
330 "settings.service.form.team" : "团队",
331 "settings.service.form.useHostedService" : "使用主服务",
332 "settings.service.form.yourServices" : "您的服务",
333 "settings.services.deletedInfo" : "已删除服务",
334 "settings.services.discoverServices" : "发现服务",
335 "settings.services.headline" : "您的服务",
336 "settings.services.noServicesAdded" : "您还没添加任何服务",
337 "settings.services.servicesRequestFailed" : "无法加载你的服务",
338 "settings.services.tooltip.isDisabled" : "已禁止服务",
339 "settings.services.tooltip.isMuted" : "已全部静音",
340 "settings.services.tooltip.notificationsDisabled" : "已禁用通知",
341 "settings.services.updatedInfo" : "已保存您的设置",
342 "settings.team.contentHeadline" : "适用于团队的Franz",
343 "settings.team.copy" : "Franz for Teams gives you the option to invite co-workers to your team by sending them email invitations and manage their subscriptions in your account’s preferences. Don’t waste time setting up subscriptions for every team member individually, forget about multiple invoices and different billing cycles - one team to rule them all!",
344 "settings.team.headline" : "团队",
345 "settings.team.intro" : "You and your team use Franz? You can now manage Premium subscriptions for as many colleagues, friends or family members as you want, all from within one account.",
346 "settings.team.manageAction" : "在meetfranz.com管理你的团队",
347 "settings.team.upgradeAction" : "注册账号",
348 "settings.user.form.accountType.company" : "公司",
349 "settings.user.form.accountType.individual" : "个人",
350 "settings.user.form.accountType.label" : "账户类型",
351 "settings.user.form.accountType.non-profit" : "非盈利",
352 "settings.user.form.currentPassword" : "当前密码",
353 "settings.user.form.email" : "电子邮件",
354 "settings.user.form.firstname" : "名字",
355 "settings.user.form.lastname" : "姓氏",
356 "settings.user.form.newPassword" : "新的密码",
357 "settings.workspace.add.form.name" : "姓名",
358 "settings.workspace.add.form.submitButton" : "创建工作组",
359 "settings.workspace.form.buttonDelete" : "删除工作组",
360 "settings.workspace.form.buttonSave" : "保存工作组",
361 "settings.workspace.form.name" : "名字",
362 "settings.workspace.form.servicesInWorkspaceHeadline" : "这个工作组里的服务",
363 "settings.workspace.form.yourWorkspaces" : "你的工作组",
364 "settings.workspaces.deletedInfo" : "此工作组已被删除",
365 "settings.workspaces.headline" : "你的工作组",
366 "settings.workspaces.noWorkspacesAdded" : "你尚未添加任何工作组。",
367 "settings.workspaces.tryReloadWorkspaces" : "重试",
368 "settings.workspaces.updatedInfo" : "已保存您的设置",
369 "settings.workspaces.workspaceFeatureHeadline" : "Less is More: Introducing Franz Workspaces",
370 "settings.workspaces.workspaceFeatureInfo" : "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
371 "settings.workspaces.workspacesRequestFailed" : "不能加载你的工作组",
372 "setupAssistant.headline" : "Let's get started",
373 "setupAssistant.subheadline" : "Choose from our most used services and get back on top of your messaging now.",
374 "setupAssistant.submit.label" : "Let's go",
375 "sidebar.addNewService" : "添加新服务",
376 "sidebar.closeTodosDrawer" : "Close Franz Todos",
377 "sidebar.closeWorkspaceDrawer" : "关闭工作区列表",
378 "sidebar.muteApp" : "关闭通知和声音提醒",
379 "sidebar.openTodosDrawer" : "Open Franz Todos",
380 "sidebar.openWorkspaceDrawer" : "打开工作组列表",
381 "sidebar.settings" : "设置",
382 "sidebar.unmuteApp" : "开启通知和声音提醒",
383 "signup.email.label" : "电子邮件",
384 "signup.emailDuplicate" : "此邮箱已被注册",
385 "signup.firstname.label" : "名字",
386 "signup.headline" : "注册",
387 "signup.lastname.label" : "姓氏",
388 "signup.legal.info" : "新建 Franz 账户时您将同意",
389 "signup.legal.privacy" : "隐私条款",
390 "signup.legal.terms" : "服务条款",
391 "signup.link.login" : "已有账户?登陆",
392 "signup.password.label" : "密码:",
393 "signup.submit.label" : "创建账户",
394 "subscription.bestValue" : "Best value",
395 "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial",
396 "subscription.cta.allOptions" : "See all options",
397 "subscription.cta.choosePlan" : "Choose your plan",
398 "subscription.includedProFeatures" : "The Franz Professional Plan includes:",
399 "subscription.interval.per" : "per {interval}",
400 "subscription.interval.perMonth" : "per month",
401 "subscription.interval.perMonthPerUser" : "per month & user",
402 "subscription.planItem.upgradeAccount" : "升级帐户",
403 "subscription.teaser.includedFeatures" : "Paid Franz Plans include:",
404 "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
405 "subscriptionPopup.buttonCancel" : "取消",
406 "subscriptionPopup.buttonDone" : "完成",
407 "tabs.item.deleteService" : "删除服务",
408 "tabs.item.disableAudio" : "禁止声音",
409 "tabs.item.disableNotifications" : "停止通知",
410 "tabs.item.disableService" : "停用服务",
411 "tabs.item.edit" : "编辑",
412 "tabs.item.enableAudio" : "启用声音",
413 "tabs.item.enableNotification" : "启用通知",
414 "tabs.item.enableService" : "启用服务",
415 "tabs.item.reload" : "重新加载",
416 "validation.email" : "无效的{field}",
417 "validation.minLength" : "{field}至少 {length} 个字符",
418 "validation.oneRequired" : "至少需要一个",
419 "validation.required" : "{field}必填",
420 "validation.url" : "无效的URL:{field} ",
421 "webControls.back" : "Back",
422 "webControls.forward" : "Forward",
423 "webControls.goHome" : "主页",
424 "webControls.openInBrowser" : "Open in Browser",
425 "webControls.reload" : "重新加载",
426 "welcome.loginButton" : "登陆您的账户",
427 "welcome.signupButton" : "创建免费账户",
428 "workspaceDrawer.addNewWorkspaceLabel" : "Add new workspace",
429 "workspaceDrawer.allServices" : "所有服务",
430 "workspaceDrawer.headline" : "工作组",
431 "workspaceDrawer.item.contextMenuEdit" : "edit",
432 "workspaceDrawer.item.noServicesAddedYet" : "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel" : "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge" : "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel" : "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo" : "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.<\/p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.<\/p>",
437 "workspaceDrawer.workspacesSettingsTooltip" : "Edit workspaces settings",
438 "workspaces.switchingIndicator.switchingTo" : "Switching to"
439}
diff --git a/src/i18n/messages/src/components/auth/ServiceAssistant.json b/src/i18n/messages/src/components/auth/ServiceAssistant.json
new file mode 100644
index 000000000..9170fc183
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/ServiceAssistant.json
@@ -0,0 +1,93 @@
1[
2 {
3 "id": "settings.invite.headline",
4 "defaultMessage": "!!!Invite Friends",
5 "file": "src/components/auth/ServiceAssistant.js",
6 "start": {
7 "line": 16,
8 "column": 20
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "invite.headline.friends",
17 "defaultMessage": "!!!Invite 3 of your friends or colleagues",
18 "file": "src/components/auth/ServiceAssistant.js",
19 "start": {
20 "line": 20,
21 "column": 12
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "invite.name.label",
30 "defaultMessage": "!!!Name",
31 "file": "src/components/auth/ServiceAssistant.js",
32 "start": {
33 "line": 24,
34 "column": 13
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "invite.email.label",
43 "defaultMessage": "!!!Email address",
44 "file": "src/components/auth/ServiceAssistant.js",
45 "start": {
46 "line": 28,
47 "column": 14
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "invite.submit.label",
56 "defaultMessage": "!!!Send invites",
57 "file": "src/components/auth/ServiceAssistant.js",
58 "start": {
59 "line": 32,
60 "column": 21
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 },
67 {
68 "id": "invite.skip.label",
69 "defaultMessage": "!!!I want to do this later",
70 "file": "src/components/auth/ServiceAssistant.js",
71 "start": {
72 "line": 36,
73 "column": 19
74 },
75 "end": {
76 "line": 39,
77 "column": 3
78 }
79 },
80 {
81 "id": "invite.successInfo",
82 "defaultMessage": "!!!Invitations sent successfully",
83 "file": "src/components/auth/ServiceAssistant.js",
84 "start": {
85 "line": 40,
86 "column": 21
87 },
88 "end": {
89 "line": 43,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/SetupAssistant.json b/src/i18n/messages/src/components/auth/SetupAssistant.json
new file mode 100644
index 000000000..03593cfbc
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/SetupAssistant.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "setupAssistant.headline",
4 "defaultMessage": "!!!Let's get started",
5 "file": "src/components/auth/SetupAssistant.js",
6 "start": {
7 "line": 19,
8 "column": 12
9 },
10 "end": {
11 "line": 22,
12 "column": 3
13 }
14 },
15 {
16 "id": "setupAssistant.subheadline",
17 "defaultMessage": "!!!Choose from our most used services and get back on top of your messaging now.",
18 "file": "src/components/auth/SetupAssistant.js",
19 "start": {
20 "line": 23,
21 "column": 15
22 },
23 "end": {
24 "line": 26,
25 "column": 3
26 }
27 },
28 {
29 "id": "setupAssistant.submit.label",
30 "defaultMessage": "!!!Let's go",
31 "file": "src/components/auth/SetupAssistant.js",
32 "start": {
33 "line": 27,
34 "column": 21
35 },
36 "end": {
37 "line": 30,
38 "column": 3
39 }
40 },
41 {
42 "id": "invite.successInfo",
43 "defaultMessage": "!!!Invitations sent successfully",
44 "file": "src/components/auth/SetupAssistant.js",
45 "start": {
46 "line": 31,
47 "column": 21
48 },
49 "end": {
50 "line": 34,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/services/content/Services.json b/src/i18n/messages/src/components/services/content/Services.json
index 6a5eb052e..3c40b11ab 100644
--- a/src/i18n/messages/src/components/services/content/Services.json
+++ b/src/i18n/messages/src/components/services/content/Services.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Welcome to Ferdi", 4 "defaultMessage": "!!!Welcome to Ferdi",
5 "file": "src/components/services/content/Services.js", 5 "file": "src/components/services/content/Services.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 16,
8 "column": 11 8 "column": 11
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 19,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Get started", 17 "defaultMessage": "!!!Get started",
18 "file": "src/components/services/content/Services.js", 18 "file": "src/components/services/content/Services.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 20,
21 "column": 14 21 "column": 14
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 23,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Please login to use Ferdi.", 30 "defaultMessage": "!!!Please login to use Ferdi.",
31 "file": "src/components/services/content/Services.js", 31 "file": "src/components/services/content/Services.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 24,
34 "column": 9 34 "column": 9
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 27,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Use Ferdi without an Account", 43 "defaultMessage": "!!!Use Ferdi without an Account",
44 "file": "src/components/services/content/Services.js", 44 "file": "src/components/services/content/Services.js",
45 "start": { 45 "start": {
46 "line": 27, 46 "line": 28,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 30, 50 "line": 31,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 56 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.",
57 "file": "src/components/services/content/Services.js", 57 "file": "src/components/services/content/Services.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 32,
60 "column": 14 60 "column": 14
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 34, 63 "line": 35,
64 "column": 3 64 "column": 3
65 } 65 }
66 } 66 }
diff --git a/src/i18n/messages/src/components/services/tabs/TabItem.json b/src/i18n/messages/src/components/services/tabs/TabItem.json
index 08a07845c..495d35c8b 100644
--- a/src/i18n/messages/src/components/services/tabs/TabItem.json
+++ b/src/i18n/messages/src/components/services/tabs/TabItem.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Reload", 4 "defaultMessage": "!!!Reload",
5 "file": "src/components/services/tabs/TabItem.js", 5 "file": "src/components/services/tabs/TabItem.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 20,
8 "column": 10 8 "column": 10
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 23,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Edit", 17 "defaultMessage": "!!!Edit",
18 "file": "src/components/services/tabs/TabItem.js", 18 "file": "src/components/services/tabs/TabItem.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 24,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 27,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Disable notifications", 30 "defaultMessage": "!!!Disable notifications",
31 "file": "src/components/services/tabs/TabItem.js", 31 "file": "src/components/services/tabs/TabItem.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 28,
34 "column": 24 34 "column": 24
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 31,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Enable notifications", 43 "defaultMessage": "!!!Enable notifications",
44 "file": "src/components/services/tabs/TabItem.js", 44 "file": "src/components/services/tabs/TabItem.js",
45 "start": { 45 "start": {
46 "line": 27, 46 "line": 32,
47 "column": 23 47 "column": 23
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 30, 50 "line": 35,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Disable audio", 56 "defaultMessage": "!!!Disable audio",
57 "file": "src/components/services/tabs/TabItem.js", 57 "file": "src/components/services/tabs/TabItem.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 36,
60 "column": 16 60 "column": 16
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 34, 63 "line": 39,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Enable audio", 69 "defaultMessage": "!!!Enable audio",
70 "file": "src/components/services/tabs/TabItem.js", 70 "file": "src/components/services/tabs/TabItem.js",
71 "start": { 71 "start": {
72 "line": 35, 72 "line": 40,
73 "column": 15 73 "column": 15
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 38, 76 "line": 43,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Disable Service", 82 "defaultMessage": "!!!Disable Service",
83 "file": "src/components/services/tabs/TabItem.js", 83 "file": "src/components/services/tabs/TabItem.js",
84 "start": { 84 "start": {
85 "line": 39, 85 "line": 44,
86 "column": 18 86 "column": 18
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 42, 89 "line": 47,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Enable Service", 95 "defaultMessage": "!!!Enable Service",
96 "file": "src/components/services/tabs/TabItem.js", 96 "file": "src/components/services/tabs/TabItem.js",
97 "start": { 97 "start": {
98 "line": 43, 98 "line": 48,
99 "column": 17 99 "column": 17
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 46, 102 "line": 51,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Delete Service", 108 "defaultMessage": "!!!Delete Service",
109 "file": "src/components/services/tabs/TabItem.js", 109 "file": "src/components/services/tabs/TabItem.js",
110 "start": { 110 "start": {
111 "line": 47, 111 "line": 52,
112 "column": 17 112 "column": 17
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 50, 115 "line": 55,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
index 4ee427e46..182678823 100644
--- a/src/i18n/messages/src/components/settings/services/EditServiceForm.json
+++ b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Save service", 4 "defaultMessage": "!!!Save service",
5 "file": "src/components/settings/services/EditServiceForm.js", 5 "file": "src/components/settings/services/EditServiceForm.js",
6 "start": { 6 "start": {
7 "line": 27, 7 "line": 26,
8 "column": 15 8 "column": 15
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 30, 11 "line": 29,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Delete Service", 17 "defaultMessage": "!!!Delete Service",
18 "file": "src/components/settings/services/EditServiceForm.js", 18 "file": "src/components/settings/services/EditServiceForm.js",
19 "start": { 19 "start": {
20 "line": 31, 20 "line": 30,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 34, 24 "line": 33,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Open darkmode.css", 30 "defaultMessage": "!!!Open darkmode.css",
31 "file": "src/components/settings/services/EditServiceForm.js", 31 "file": "src/components/settings/services/EditServiceForm.js",
32 "start": { 32 "start": {
33 "line": 35, 33 "line": 34,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 38, 37 "line": 37,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Open user.css", 43 "defaultMessage": "!!!Open user.css",
44 "file": "src/components/settings/services/EditServiceForm.js", 44 "file": "src/components/settings/services/EditServiceForm.js",
45 "start": { 45 "start": {
46 "line": 39, 46 "line": 38,
47 "column": 15 47 "column": 15
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 42, 50 "line": 41,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Open user.js", 56 "defaultMessage": "!!!Open user.js",
57 "file": "src/components/settings/services/EditServiceForm.js", 57 "file": "src/components/settings/services/EditServiceForm.js",
58 "start": { 58 "start": {
59 "line": 43, 59 "line": 42,
60 "column": 14 60 "column": 14
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 46, 63 "line": 45,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 69 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
70 "file": "src/components/settings/services/EditServiceForm.js", 70 "file": "src/components/settings/services/EditServiceForm.js",
71 "start": { 71 "start": {
72 "line": 47, 72 "line": 46,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 50, 76 "line": 49,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Available services", 82 "defaultMessage": "!!!Available services",
83 "file": "src/components/settings/services/EditServiceForm.js", 83 "file": "src/components/settings/services/EditServiceForm.js",
84 "start": { 84 "start": {
85 "line": 51, 85 "line": 50,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 54, 89 "line": 53,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Your services", 95 "defaultMessage": "!!!Your services",
96 "file": "src/components/settings/services/EditServiceForm.js", 96 "file": "src/components/settings/services/EditServiceForm.js",
97 "start": { 97 "start": {
98 "line": 55, 98 "line": 54,
99 "column": 16 99 "column": 16
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 58, 102 "line": 57,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Add {name}", 108 "defaultMessage": "!!!Add {name}",
109 "file": "src/components/settings/services/EditServiceForm.js", 109 "file": "src/components/settings/services/EditServiceForm.js",
110 "start": { 110 "start": {
111 "line": 59, 111 "line": 58,
112 "column": 22 112 "column": 22
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 62, 115 "line": 61,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Edit {name}", 121 "defaultMessage": "!!!Edit {name}",
122 "file": "src/components/settings/services/EditServiceForm.js", 122 "file": "src/components/settings/services/EditServiceForm.js",
123 "start": { 123 "start": {
124 "line": 63, 124 "line": 62,
125 "column": 23 125 "column": 23
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 66, 128 "line": 65,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Hosted", 134 "defaultMessage": "!!!Hosted",
135 "file": "src/components/settings/services/EditServiceForm.js", 135 "file": "src/components/settings/services/EditServiceForm.js",
136 "start": { 136 "start": {
137 "line": 67, 137 "line": 66,
138 "column": 13 138 "column": 13
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 70, 141 "line": 69,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Self hosted ⭐️", 147 "defaultMessage": "!!!Self hosted ⭐️",
148 "file": "src/components/settings/services/EditServiceForm.js", 148 "file": "src/components/settings/services/EditServiceForm.js",
149 "start": { 149 "start": {
150 "line": 71, 150 "line": 70,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 74, 154 "line": 73,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Use the hosted {name} service.", 160 "defaultMessage": "!!!Use the hosted {name} service.",
161 "file": "src/components/settings/services/EditServiceForm.js", 161 "file": "src/components/settings/services/EditServiceForm.js",
162 "start": { 162 "start": {
163 "line": 75, 163 "line": 74,
164 "column": 20 164 "column": 20
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 78, 167 "line": 77,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Could not validate custom {name} server.", 173 "defaultMessage": "!!!Could not validate custom {name} server.",
174 "file": "src/components/settings/services/EditServiceForm.js", 174 "file": "src/components/settings/services/EditServiceForm.js",
175 "start": { 175 "start": {
176 "line": 79, 176 "line": 78,
177 "column": 28 177 "column": 28
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 82, 180 "line": 81,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.", 186 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
187 "file": "src/components/settings/services/EditServiceForm.js", 187 "file": "src/components/settings/services/EditServiceForm.js",
188 "start": { 188 "start": {
189 "line": 83, 189 "line": 82,
190 "column": 24 190 "column": 24
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 86, 193 "line": 85,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Upgrade your account", 199 "defaultMessage": "!!!Upgrade your account",
200 "file": "src/components/settings/services/EditServiceForm.js", 200 "file": "src/components/settings/services/EditServiceForm.js",
201 "start": { 201 "start": {
202 "line": 87, 202 "line": 86,
203 "column": 27 203 "column": 27
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 90, 206 "line": 89,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 212 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
213 "file": "src/components/settings/services/EditServiceForm.js", 213 "file": "src/components/settings/services/EditServiceForm.js",
214 "start": { 214 "start": {
215 "line": 91, 215 "line": 90,
216 "column": 23 216 "column": 23
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 94, 219 "line": 93,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,24 +225,24 @@
225 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 225 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
226 "file": "src/components/settings/services/EditServiceForm.js", 226 "file": "src/components/settings/services/EditServiceForm.js",
227 "start": { 227 "start": {
228 "line": 95, 228 "line": 94,
229 "column": 15 229 "column": 15
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 98, 232 "line": 97,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
236 { 236 {
237 "id": "settings.service.form.disableHibernationInfo", 237 "id": "settings.service.form.isHibernatedEnabledInfo",
238 "defaultMessage": "!!!You currently have hibernation enabled but you can disable hibernation for individual services using this option.", 238 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.",
239 "file": "src/components/settings/services/EditServiceForm.js", 239 "file": "src/components/settings/services/EditServiceForm.js",
240 "start": { 240 "start": {
241 "line": 99, 241 "line": 98,
242 "column": 26 242 "column": 28
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 102, 245 "line": 101,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Notifications", 251 "defaultMessage": "!!!Notifications",
252 "file": "src/components/settings/services/EditServiceForm.js", 252 "file": "src/components/settings/services/EditServiceForm.js",
253 "start": { 253 "start": {
254 "line": 103, 254 "line": 102,
255 "column": 25 255 "column": 25
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 106, 258 "line": 105,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Unread message badges", 264 "defaultMessage": "!!!Unread message badges",
265 "file": "src/components/settings/services/EditServiceForm.js", 265 "file": "src/components/settings/services/EditServiceForm.js",
266 "start": { 266 "start": {
267 "line": 107, 267 "line": 106,
268 "column": 18 268 "column": 18
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 110, 271 "line": 109,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!General", 277 "defaultMessage": "!!!General",
278 "file": "src/components/settings/services/EditServiceForm.js", 278 "file": "src/components/settings/services/EditServiceForm.js",
279 "start": { 279 "start": {
280 "line": 111, 280 "line": 110,
281 "column": 19 281 "column": 19
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 114, 284 "line": 113,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Dark Reader Settings", 290 "defaultMessage": "!!!Dark Reader Settings",
291 "file": "src/components/settings/services/EditServiceForm.js", 291 "file": "src/components/settings/services/EditServiceForm.js",
292 "start": { 292 "start": {
293 "line": 115, 293 "line": 114,
294 "column": 30 294 "column": 30
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 118, 297 "line": 117,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Delete", 303 "defaultMessage": "!!!Delete",
304 "file": "src/components/settings/services/EditServiceForm.js", 304 "file": "src/components/settings/services/EditServiceForm.js",
305 "start": { 305 "start": {
306 "line": 119, 306 "line": 118,
307 "column": 14 307 "column": 14
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 122, 310 "line": 121,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Drop your image, or click here", 316 "defaultMessage": "!!!Drop your image, or click here",
317 "file": "src/components/settings/services/EditServiceForm.js", 317 "file": "src/components/settings/services/EditServiceForm.js",
318 "start": { 318 "start": {
319 "line": 123, 319 "line": 122,
320 "column": 14 320 "column": 14
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 126, 323 "line": 125,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 329 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
330 "file": "src/components/settings/services/EditServiceForm.js", 330 "file": "src/components/settings/services/EditServiceForm.js",
331 "start": { 331 "start": {
332 "line": 127, 332 "line": 126,
333 "column": 17 333 "column": 17
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 130, 336 "line": 129,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 342 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
343 "file": "src/components/settings/services/EditServiceForm.js", 343 "file": "src/components/settings/services/EditServiceForm.js",
344 "start": { 344 "start": {
345 "line": 131, 345 "line": 130,
346 "column": 20 346 "column": 20
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 134, 349 "line": 133,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 355 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
356 "file": "src/components/settings/services/EditServiceForm.js", 356 "file": "src/components/settings/services/EditServiceForm.js",
357 "start": { 357 "start": {
358 "line": 135, 358 "line": 134,
359 "column": 13 359 "column": 13
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 138, 362 "line": 137,
363 "column": 3 363 "column": 3
364 } 364 }
365 } 365 }
diff --git a/src/i18n/messages/src/containers/settings/EditServiceScreen.json b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
index 5c83085f2..6744a9ff3 100644
--- a/src/i18n/messages/src/containers/settings/EditServiceScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
@@ -26,12 +26,12 @@
26 } 26 }
27 }, 27 },
28 { 28 {
29 "id": "settings.service.form.disableHibernation", 29 "id": "settings.service.form.enableHibernation",
30 "defaultMessage": "!!!Disable hibernation", 30 "defaultMessage": "!!!Enable hibernation",
31 "file": "src/containers/settings/EditServiceScreen.js", 31 "file": "src/containers/settings/EditServiceScreen.js",
32 "start": { 32 "start": {
33 "line": 36, 33 "line": 36,
34 "column": 22 34 "column": 21
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 39, 37 "line": 39,
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index 7165bd46c..420bf29af 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Launch Ferdi on start", 4 "defaultMessage": "!!!Launch Ferdi on start",
5 "file": "src/containers/settings/EditSettingsScreen.js", 5 "file": "src/containers/settings/EditSettingsScreen.js",
6 "start": { 6 "start": {
7 "line": 30, 7 "line": 31,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 33, 11 "line": 34,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Open in background", 17 "defaultMessage": "!!!Open in background",
18 "file": "src/containers/settings/EditSettingsScreen.js", 18 "file": "src/containers/settings/EditSettingsScreen.js",
19 "start": { 19 "start": {
20 "line": 34, 20 "line": 35,
21 "column": 26 21 "column": 26
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 37, 24 "line": 38,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 30 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
31 "file": "src/containers/settings/EditSettingsScreen.js", 31 "file": "src/containers/settings/EditSettingsScreen.js",
32 "start": { 32 "start": {
33 "line": 38, 33 "line": 39,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 41, 37 "line": 42,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Start minimized", 43 "defaultMessage": "!!!Start minimized",
44 "file": "src/containers/settings/EditSettingsScreen.js", 44 "file": "src/containers/settings/EditSettingsScreen.js",
45 "start": { 45 "start": {
46 "line": 42, 46 "line": 43,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 45, 50 "line": 46,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Always show Ferdi in system tray", 56 "defaultMessage": "!!!Always show Ferdi in system tray",
57 "file": "src/containers/settings/EditSettingsScreen.js", 57 "file": "src/containers/settings/EditSettingsScreen.js",
58 "start": { 58 "start": {
59 "line": 46, 59 "line": 47,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 49, 63 "line": 50,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Reload Ferdi after system resume", 69 "defaultMessage": "!!!Reload Ferdi after system resume",
70 "file": "src/containers/settings/EditSettingsScreen.js", 70 "file": "src/containers/settings/EditSettingsScreen.js",
71 "start": { 71 "start": {
72 "line": 50, 72 "line": 51,
73 "column": 21 73 "column": 21
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 53, 76 "line": 54,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,24 @@
82 "defaultMessage": "!!!Minimize Ferdi to system tray", 82 "defaultMessage": "!!!Minimize Ferdi to system tray",
83 "file": "src/containers/settings/EditSettingsScreen.js", 83 "file": "src/containers/settings/EditSettingsScreen.js",
84 "start": { 84 "start": {
85 "line": 54, 85 "line": 55,
86 "column": 24 86 "column": 24
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 57, 89 "line": 58,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.app.form.closeToSystemTray",
95 "defaultMessage": "!!!Close Ferdi to system tray",
96 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": {
98 "line": 59,
99 "column": 21
100 },
101 "end": {
102 "line": 62,
90 "column": 3 103 "column": 3
91 } 104 }
92 }, 105 },
@@ -95,11 +108,24 @@
95 "defaultMessage": "!!!Don't show message content in notifications", 108 "defaultMessage": "!!!Don't show message content in notifications",
96 "file": "src/containers/settings/EditSettingsScreen.js", 109 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": { 110 "start": {
98 "line": 58, 111 "line": 63,
99 "column": 24 112 "column": 24
100 }, 113 },
101 "end": { 114 "end": {
102 "line": 61, 115 "line": 66,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.app.form.notifyTaskBarOnMessage",
121 "defaultMessage": "!!!Notify TaskBar/Dock on new message",
122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": {
124 "line": 67,
125 "column": 26
126 },
127 "end": {
128 "line": 70,
103 "column": 3 129 "column": 3
104 } 130 }
105 }, 131 },
@@ -108,11 +134,11 @@
108 "defaultMessage": "!!!Navigation bar behaviour", 134 "defaultMessage": "!!!Navigation bar behaviour",
109 "file": "src/containers/settings/EditSettingsScreen.js", 135 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": { 136 "start": {
111 "line": 62, 137 "line": 71,
112 "column": 26 138 "column": 26
113 }, 139 },
114 "end": { 140 "end": {
115 "line": 65, 141 "line": 74,
116 "column": 3 142 "column": 3
117 } 143 }
118 }, 144 },
@@ -121,11 +147,11 @@
121 "defaultMessage": "!!!Send telemetry data", 147 "defaultMessage": "!!!Send telemetry data",
122 "file": "src/containers/settings/EditSettingsScreen.js", 148 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": { 149 "start": {
124 "line": 66, 150 "line": 75,
125 "column": 10 151 "column": 10
126 }, 152 },
127 "end": { 153 "end": {
128 "line": 69, 154 "line": 78,
129 "column": 3 155 "column": 3
130 } 156 }
131 }, 157 },
@@ -134,11 +160,11 @@
134 "defaultMessage": "!!!Enable service hibernation", 160 "defaultMessage": "!!!Enable service hibernation",
135 "file": "src/containers/settings/EditSettingsScreen.js", 161 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": { 162 "start": {
137 "line": 70, 163 "line": 79,
138 "column": 13 164 "column": 13
139 }, 165 },
140 "end": { 166 "end": {
141 "line": 73, 167 "line": 82,
142 "column": 3 168 "column": 3
143 } 169 }
144 }, 170 },
@@ -147,11 +173,11 @@
147 "defaultMessage": "!!!Keep services in hibernation on startup", 173 "defaultMessage": "!!!Keep services in hibernation on startup",
148 "file": "src/containers/settings/EditSettingsScreen.js", 174 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": { 175 "start": {
150 "line": 74, 176 "line": 83,
151 "column": 22 177 "column": 22
152 }, 178 },
153 "end": { 179 "end": {
154 "line": 77, 180 "line": 86,
155 "column": 3 181 "column": 3
156 } 182 }
157 }, 183 },
@@ -160,11 +186,11 @@
160 "defaultMessage": "!!!Hibernation strategy", 186 "defaultMessage": "!!!Hibernation strategy",
161 "file": "src/containers/settings/EditSettingsScreen.js", 187 "file": "src/containers/settings/EditSettingsScreen.js",
162 "start": { 188 "start": {
163 "line": 78, 189 "line": 87,
164 "column": 23 190 "column": 23
165 }, 191 },
166 "end": { 192 "end": {
167 "line": 81, 193 "line": 90,
168 "column": 3 194 "column": 3
169 } 195 }
170 }, 196 },
@@ -173,11 +199,11 @@
173 "defaultMessage": "!!!Todo Server", 199 "defaultMessage": "!!!Todo Server",
174 "file": "src/containers/settings/EditSettingsScreen.js", 200 "file": "src/containers/settings/EditSettingsScreen.js",
175 "start": { 201 "start": {
176 "line": 82, 202 "line": 91,
177 "column": 24 203 "column": 24
178 }, 204 },
179 "end": { 205 "end": {
180 "line": 85, 206 "line": 94,
181 "column": 3 207 "column": 3
182 } 208 }
183 }, 209 },
@@ -186,11 +212,11 @@
186 "defaultMessage": "!!!Custom TodoServer", 212 "defaultMessage": "!!!Custom TodoServer",
187 "file": "src/containers/settings/EditSettingsScreen.js", 213 "file": "src/containers/settings/EditSettingsScreen.js",
188 "start": { 214 "start": {
189 "line": 86, 215 "line": 95,
190 "column": 20 216 "column": 20
191 }, 217 },
192 "end": { 218 "end": {
193 "line": 89, 219 "line": 98,
194 "column": 3 220 "column": 3
195 } 221 }
196 }, 222 },
@@ -199,11 +225,11 @@
199 "defaultMessage": "!!!Enable Password Lock", 225 "defaultMessage": "!!!Enable Password Lock",
200 "file": "src/containers/settings/EditSettingsScreen.js", 226 "file": "src/containers/settings/EditSettingsScreen.js",
201 "start": { 227 "start": {
202 "line": 90, 228 "line": 99,
203 "column": 14 229 "column": 14
204 }, 230 },
205 "end": { 231 "end": {
206 "line": 93, 232 "line": 102,
207 "column": 3 233 "column": 3
208 } 234 }
209 }, 235 },
@@ -212,11 +238,11 @@
212 "defaultMessage": "!!!Password", 238 "defaultMessage": "!!!Password",
213 "file": "src/containers/settings/EditSettingsScreen.js", 239 "file": "src/containers/settings/EditSettingsScreen.js",
214 "start": { 240 "start": {
215 "line": 94, 241 "line": 103,
216 "column": 16 242 "column": 16
217 }, 243 },
218 "end": { 244 "end": {
219 "line": 97, 245 "line": 106,
220 "column": 3 246 "column": 3
221 } 247 }
222 }, 248 },
@@ -225,11 +251,11 @@
225 "defaultMessage": "!!!Allow using Touch ID to unlock", 251 "defaultMessage": "!!!Allow using Touch ID to unlock",
226 "file": "src/containers/settings/EditSettingsScreen.js", 252 "file": "src/containers/settings/EditSettingsScreen.js",
227 "start": { 253 "start": {
228 "line": 98, 254 "line": 107,
229 "column": 22 255 "column": 22
230 }, 256 },
231 "end": { 257 "end": {
232 "line": 101, 258 "line": 110,
233 "column": 3 259 "column": 3
234 } 260 }
235 }, 261 },
@@ -238,11 +264,11 @@
238 "defaultMessage": "!!!Lock after inactivity", 264 "defaultMessage": "!!!Lock after inactivity",
239 "file": "src/containers/settings/EditSettingsScreen.js", 265 "file": "src/containers/settings/EditSettingsScreen.js",
240 "start": { 266 "start": {
241 "line": 102, 267 "line": 111,
242 "column": 18 268 "column": 18
243 }, 269 },
244 "end": { 270 "end": {
245 "line": 105, 271 "line": 114,
246 "column": 3 272 "column": 3
247 } 273 }
248 }, 274 },
@@ -251,11 +277,11 @@
251 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 277 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
252 "file": "src/containers/settings/EditSettingsScreen.js", 278 "file": "src/containers/settings/EditSettingsScreen.js",
253 "start": { 279 "start": {
254 "line": 106, 280 "line": 115,
255 "column": 23 281 "column": 23
256 }, 282 },
257 "end": { 283 "end": {
258 "line": 109, 284 "line": 118,
259 "column": 3 285 "column": 3
260 } 286 }
261 }, 287 },
@@ -264,11 +290,11 @@
264 "defaultMessage": "!!!From", 290 "defaultMessage": "!!!From",
265 "file": "src/containers/settings/EditSettingsScreen.js", 291 "file": "src/containers/settings/EditSettingsScreen.js",
266 "start": { 292 "start": {
267 "line": 110, 293 "line": 119,
268 "column": 21 294 "column": 21
269 }, 295 },
270 "end": { 296 "end": {
271 "line": 113, 297 "line": 122,
272 "column": 3 298 "column": 3
273 } 299 }
274 }, 300 },
@@ -277,11 +303,11 @@
277 "defaultMessage": "!!!To", 303 "defaultMessage": "!!!To",
278 "file": "src/containers/settings/EditSettingsScreen.js", 304 "file": "src/containers/settings/EditSettingsScreen.js",
279 "start": { 305 "start": {
280 "line": 114, 306 "line": 123,
281 "column": 19 307 "column": 19
282 }, 308 },
283 "end": { 309 "end": {
284 "line": 117, 310 "line": 126,
285 "column": 3 311 "column": 3
286 } 312 }
287 }, 313 },
@@ -290,11 +316,11 @@
290 "defaultMessage": "!!!Language", 316 "defaultMessage": "!!!Language",
291 "file": "src/containers/settings/EditSettingsScreen.js", 317 "file": "src/containers/settings/EditSettingsScreen.js",
292 "start": { 318 "start": {
293 "line": 118, 319 "line": 127,
294 "column": 12 320 "column": 12
295 }, 321 },
296 "end": { 322 "end": {
297 "line": 121, 323 "line": 130,
298 "column": 3 324 "column": 3
299 } 325 }
300 }, 326 },
@@ -303,11 +329,11 @@
303 "defaultMessage": "!!!Dark Mode", 329 "defaultMessage": "!!!Dark Mode",
304 "file": "src/containers/settings/EditSettingsScreen.js", 330 "file": "src/containers/settings/EditSettingsScreen.js",
305 "start": { 331 "start": {
306 "line": 122, 332 "line": 131,
307 "column": 12 333 "column": 12
308 }, 334 },
309 "end": { 335 "end": {
310 "line": 125, 336 "line": 134,
311 "column": 3 337 "column": 3
312 } 338 }
313 }, 339 },
@@ -316,11 +342,11 @@
316 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 342 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
317 "file": "src/containers/settings/EditSettingsScreen.js", 343 "file": "src/containers/settings/EditSettingsScreen.js",
318 "start": { 344 "start": {
319 "line": 126, 345 "line": 135,
320 "column": 21 346 "column": 21
321 }, 347 },
322 "end": { 348 "end": {
323 "line": 129, 349 "line": 138,
324 "column": 3 350 "column": 3
325 } 351 }
326 }, 352 },
@@ -329,11 +355,11 @@
329 "defaultMessage": "!!!Enable universal Dark Mode", 355 "defaultMessage": "!!!Enable universal Dark Mode",
330 "file": "src/containers/settings/EditSettingsScreen.js", 356 "file": "src/containers/settings/EditSettingsScreen.js",
331 "start": { 357 "start": {
332 "line": 130, 358 "line": 139,
333 "column": 21 359 "column": 21
334 }, 360 },
335 "end": { 361 "end": {
336 "line": 133, 362 "line": 142,
337 "column": 3 363 "column": 3
338 } 364 }
339 }, 365 },
@@ -342,11 +368,11 @@
342 "defaultMessage": "!!!Sidebar width", 368 "defaultMessage": "!!!Sidebar width",
343 "file": "src/containers/settings/EditSettingsScreen.js", 369 "file": "src/containers/settings/EditSettingsScreen.js",
344 "start": { 370 "start": {
345 "line": 134, 371 "line": 143,
346 "column": 22 372 "column": 22
347 }, 373 },
348 "end": { 374 "end": {
349 "line": 137, 375 "line": 146,
350 "column": 3 376 "column": 3
351 } 377 }
352 }, 378 },
@@ -355,11 +381,11 @@
355 "defaultMessage": "!!!Service icon size", 381 "defaultMessage": "!!!Service icon size",
356 "file": "src/containers/settings/EditSettingsScreen.js", 382 "file": "src/containers/settings/EditSettingsScreen.js",
357 "start": { 383 "start": {
358 "line": 138, 384 "line": 147,
359 "column": 12 385 "column": 12
360 }, 386 },
361 "end": { 387 "end": {
362 "line": 141, 388 "line": 150,
363 "column": 3 389 "column": 3
364 } 390 }
365 }, 391 },
@@ -368,11 +394,11 @@
368 "defaultMessage": "!!!Use vertical style", 394 "defaultMessage": "!!!Use vertical style",
369 "file": "src/containers/settings/EditSettingsScreen.js", 395 "file": "src/containers/settings/EditSettingsScreen.js",
370 "start": { 396 "start": {
371 "line": 142, 397 "line": 151,
372 "column": 20 398 "column": 20
373 }, 399 },
374 "end": { 400 "end": {
375 "line": 145, 401 "line": 154,
376 "column": 3 402 "column": 3
377 } 403 }
378 }, 404 },
@@ -381,11 +407,11 @@
381 "defaultMessage": "!!!Always show workspace drawer", 407 "defaultMessage": "!!!Always show workspace drawer",
382 "file": "src/containers/settings/EditSettingsScreen.js", 408 "file": "src/containers/settings/EditSettingsScreen.js",
383 "start": { 409 "start": {
384 "line": 146, 410 "line": 155,
385 "column": 24 411 "column": 24
386 }, 412 },
387 "end": { 413 "end": {
388 "line": 149, 414 "line": 158,
389 "column": 3 415 "column": 3
390 } 416 }
391 }, 417 },
@@ -394,11 +420,11 @@
394 "defaultMessage": "!!!Accent color", 420 "defaultMessage": "!!!Accent color",
395 "file": "src/containers/settings/EditSettingsScreen.js", 421 "file": "src/containers/settings/EditSettingsScreen.js",
396 "start": { 422 "start": {
397 "line": 150, 423 "line": 159,
398 "column": 15 424 "column": 15
399 }, 425 },
400 "end": { 426 "end": {
401 "line": 153, 427 "line": 162,
402 "column": 3 428 "column": 3
403 } 429 }
404 }, 430 },
@@ -407,11 +433,11 @@
407 "defaultMessage": "!!!Display disabled services tabs", 433 "defaultMessage": "!!!Display disabled services tabs",
408 "file": "src/containers/settings/EditSettingsScreen.js", 434 "file": "src/containers/settings/EditSettingsScreen.js",
409 "start": { 435 "start": {
410 "line": 154, 436 "line": 163,
411 "column": 24 437 "column": 24
412 }, 438 },
413 "end": { 439 "end": {
414 "line": 157, 440 "line": 166,
415 "column": 3 441 "column": 3
416 } 442 }
417 }, 443 },
@@ -420,11 +446,11 @@
420 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 446 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
421 "file": "src/containers/settings/EditSettingsScreen.js", 447 "file": "src/containers/settings/EditSettingsScreen.js",
422 "start": { 448 "start": {
423 "line": 158, 449 "line": 167,
424 "column": 29 450 "column": 29
425 }, 451 },
426 "end": { 452 "end": {
427 "line": 161, 453 "line": 170,
428 "column": 3 454 "column": 3
429 } 455 }
430 }, 456 },
@@ -433,11 +459,11 @@
433 "defaultMessage": "!!!Show draggable area on window", 459 "defaultMessage": "!!!Show draggable area on window",
434 "file": "src/containers/settings/EditSettingsScreen.js", 460 "file": "src/containers/settings/EditSettingsScreen.js",
435 "start": { 461 "start": {
436 "line": 162, 462 "line": 171,
437 "column": 16 463 "column": 16
438 }, 464 },
439 "end": { 465 "end": {
440 "line": 165, 466 "line": 174,
441 "column": 3 467 "column": 3
442 } 468 }
443 }, 469 },
@@ -446,11 +472,11 @@
446 "defaultMessage": "!!!Enable spell checking", 472 "defaultMessage": "!!!Enable spell checking",
447 "file": "src/containers/settings/EditSettingsScreen.js", 473 "file": "src/containers/settings/EditSettingsScreen.js",
448 "start": { 474 "start": {
449 "line": 166, 475 "line": 175,
450 "column": 23 476 "column": 23
451 }, 477 },
452 "end": { 478 "end": {
453 "line": 169, 479 "line": 178,
454 "column": 3 480 "column": 3
455 } 481 }
456 }, 482 },
@@ -459,11 +485,11 @@
459 "defaultMessage": "!!!Enable GPU Acceleration", 485 "defaultMessage": "!!!Enable GPU Acceleration",
460 "file": "src/containers/settings/EditSettingsScreen.js", 486 "file": "src/containers/settings/EditSettingsScreen.js",
461 "start": { 487 "start": {
462 "line": 170, 488 "line": 179,
463 "column": 25 489 "column": 25
464 }, 490 },
465 "end": { 491 "end": {
466 "line": 173, 492 "line": 182,
467 "column": 3 493 "column": 3
468 } 494 }
469 }, 495 },
@@ -472,11 +498,11 @@
472 "defaultMessage": "!!!Include beta versions", 498 "defaultMessage": "!!!Include beta versions",
473 "file": "src/containers/settings/EditSettingsScreen.js", 499 "file": "src/containers/settings/EditSettingsScreen.js",
474 "start": { 500 "start": {
475 "line": 174, 501 "line": 183,
476 "column": 8 502 "column": 8
477 }, 503 },
478 "end": { 504 "end": {
479 "line": 177, 505 "line": 186,
480 "column": 3 506 "column": 3
481 } 507 }
482 }, 508 },
@@ -485,11 +511,11 @@
485 "defaultMessage": "!!!Enable updates", 511 "defaultMessage": "!!!Enable updates",
486 "file": "src/containers/settings/EditSettingsScreen.js", 512 "file": "src/containers/settings/EditSettingsScreen.js",
487 "start": { 513 "start": {
488 "line": 178, 514 "line": 187,
489 "column": 20 515 "column": 20
490 }, 516 },
491 "end": { 517 "end": {
492 "line": 181, 518 "line": 190,
493 "column": 3 519 "column": 3
494 } 520 }
495 }, 521 },
@@ -498,11 +524,11 @@
498 "defaultMessage": "!!!Enable Franz Todos", 524 "defaultMessage": "!!!Enable Franz Todos",
499 "file": "src/containers/settings/EditSettingsScreen.js", 525 "file": "src/containers/settings/EditSettingsScreen.js",
500 "start": { 526 "start": {
501 "line": 182, 527 "line": 191,
502 "column": 15 528 "column": 15
503 }, 529 },
504 "end": { 530 "end": {
505 "line": 185, 531 "line": 194,
506 "column": 3 532 "column": 3
507 } 533 }
508 }, 534 },
@@ -511,11 +537,11 @@
511 "defaultMessage": "!!!Keep all workspaces loaded", 537 "defaultMessage": "!!!Keep all workspaces loaded",
512 "file": "src/containers/settings/EditSettingsScreen.js", 538 "file": "src/containers/settings/EditSettingsScreen.js",
513 "start": { 539 "start": {
514 "line": 186, 540 "line": 195,
515 "column": 27 541 "column": 27
516 }, 542 },
517 "end": { 543 "end": {
518 "line": 189, 544 "line": 198,
519 "column": 3 545 "column": 3
520 } 546 }
521 } 547 }
diff --git a/src/i18n/messages/src/features/todos/components/TodosWebview.json b/src/i18n/messages/src/features/todos/components/TodosWebview.json
index ff6e037fc..0652b0a33 100644
--- a/src/i18n/messages/src/features/todos/components/TodosWebview.json
+++ b/src/i18n/messages/src/features/todos/components/TodosWebview.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Franz Todos are available to premium users now!", 4 "defaultMessage": "!!!Franz Todos are available to premium users now!",
5 "file": "src/features/todos/components/TodosWebview.js", 5 "file": "src/features/todos/components/TodosWebview.js",
6 "start": { 6 "start": {
7 "line": 31, 7 "line": 33,
8 "column": 15 8 "column": 15
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 34, 11 "line": 36,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Upgrade Account", 17 "defaultMessage": "!!!Upgrade Account",
18 "file": "src/features/todos/components/TodosWebview.js", 18 "file": "src/features/todos/components/TodosWebview.js",
19 "start": { 19 "start": {
20 "line": 35, 20 "line": 37,
21 "column": 14 21 "column": 14
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 38, 24 "line": 40,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Everyone else will have to wait a little longer.", 30 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
31 "file": "src/features/todos/components/TodosWebview.js", 31 "file": "src/features/todos/components/TodosWebview.js",
32 "start": { 32 "start": {
33 "line": 39, 33 "line": 41,
34 "column": 15 34 "column": 15
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 42, 37 "line": 44,
38 "column": 3 38 "column": 3
39 } 39 }
40 } 40 }
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index 08028032d..d9a4e9ad9 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -403,15 +403,28 @@
403 } 403 }
404 }, 404 },
405 { 405 {
406 "id": "menu.view.reloadTodos",
407 "defaultMessage": "!!!Reload ToDos",
408 "file": "src/lib/Menu.js",
409 "start": {
410 "line": 142,
411 "column": 15
412 },
413 "end": {
414 "line": 145,
415 "column": 3
416 }
417 },
418 {
406 "id": "menu.window.minimize", 419 "id": "menu.window.minimize",
407 "defaultMessage": "!!!Minimize", 420 "defaultMessage": "!!!Minimize",
408 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
409 "start": { 422 "start": {
410 "line": 142, 423 "line": 146,
411 "column": 12 424 "column": 12
412 }, 425 },
413 "end": { 426 "end": {
414 "line": 145, 427 "line": 149,
415 "column": 3 428 "column": 3
416 } 429 }
417 }, 430 },
@@ -420,11 +433,11 @@
420 "defaultMessage": "!!!Close", 433 "defaultMessage": "!!!Close",
421 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
422 "start": { 435 "start": {
423 "line": 146, 436 "line": 150,
424 "column": 9 437 "column": 9
425 }, 438 },
426 "end": { 439 "end": {
427 "line": 149, 440 "line": 153,
428 "column": 3 441 "column": 3
429 } 442 }
430 }, 443 },
@@ -433,11 +446,11 @@
433 "defaultMessage": "!!!Learn More", 446 "defaultMessage": "!!!Learn More",
434 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
435 "start": { 448 "start": {
436 "line": 150, 449 "line": 154,
437 "column": 13 450 "column": 13
438 }, 451 },
439 "end": { 452 "end": {
440 "line": 153, 453 "line": 157,
441 "column": 3 454 "column": 3
442 } 455 }
443 }, 456 },
@@ -446,11 +459,11 @@
446 "defaultMessage": "!!!Changelog", 459 "defaultMessage": "!!!Changelog",
447 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
448 "start": { 461 "start": {
449 "line": 154, 462 "line": 158,
450 "column": 13 463 "column": 13
451 }, 464 },
452 "end": { 465 "end": {
453 "line": 157, 466 "line": 161,
454 "column": 3 467 "column": 3
455 } 468 }
456 }, 469 },
@@ -459,11 +472,11 @@
459 "defaultMessage": "!!!Support", 472 "defaultMessage": "!!!Support",
460 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
461 "start": { 474 "start": {
462 "line": 158, 475 "line": 162,
463 "column": 11 476 "column": 11
464 }, 477 },
465 "end": { 478 "end": {
466 "line": 161, 479 "line": 165,
467 "column": 3 480 "column": 3
468 } 481 }
469 }, 482 },
@@ -472,11 +485,11 @@
472 "defaultMessage": "!!!Copy Debug Information", 485 "defaultMessage": "!!!Copy Debug Information",
473 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
474 "start": { 487 "start": {
475 "line": 162, 488 "line": 166,
476 "column": 13 489 "column": 13
477 }, 490 },
478 "end": { 491 "end": {
479 "line": 165, 492 "line": 169,
480 "column": 3 493 "column": 3
481 } 494 }
482 }, 495 },
@@ -485,11 +498,11 @@
485 "defaultMessage": "!!!Publish Debug Information", 498 "defaultMessage": "!!!Publish Debug Information",
486 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
487 "start": { 500 "start": {
488 "line": 166, 501 "line": 170,
489 "column": 20 502 "column": 20
490 }, 503 },
491 "end": { 504 "end": {
492 "line": 169, 505 "line": 173,
493 "column": 3 506 "column": 3
494 } 507 }
495 }, 508 },
@@ -498,11 +511,11 @@
498 "defaultMessage": "!!!Ferdi Debug Information", 511 "defaultMessage": "!!!Ferdi Debug Information",
499 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
500 "start": { 513 "start": {
501 "line": 170, 514 "line": 174,
502 "column": 27 515 "column": 27
503 }, 516 },
504 "end": { 517 "end": {
505 "line": 173, 518 "line": 177,
506 "column": 3 519 "column": 3
507 } 520 }
508 }, 521 },
@@ -511,11 +524,11 @@
511 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 524 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
512 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
513 "start": { 526 "start": {
514 "line": 174, 527 "line": 178,
515 "column": 23 528 "column": 23
516 }, 529 },
517 "end": { 530 "end": {
518 "line": 177, 531 "line": 181,
519 "column": 3 532 "column": 3
520 } 533 }
521 }, 534 },
@@ -524,11 +537,11 @@
524 "defaultMessage": "!!!Unlock with Touch ID", 537 "defaultMessage": "!!!Unlock with Touch ID",
525 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
526 "start": { 539 "start": {
527 "line": 178, 540 "line": 182,
528 "column": 11 541 "column": 11
529 }, 542 },
530 "end": { 543 "end": {
531 "line": 181, 544 "line": 185,
532 "column": 3 545 "column": 3
533 } 546 }
534 }, 547 },
@@ -537,11 +550,11 @@
537 "defaultMessage": "!!!unlock via Touch ID", 550 "defaultMessage": "!!!unlock via Touch ID",
538 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
539 "start": { 552 "start": {
540 "line": 182, 553 "line": 186,
541 "column": 17 554 "column": 17
542 }, 555 },
543 "end": { 556 "end": {
544 "line": 185, 557 "line": 189,
545 "column": 3 558 "column": 3
546 } 559 }
547 }, 560 },
@@ -550,11 +563,11 @@
550 "defaultMessage": "!!!Terms of Service", 563 "defaultMessage": "!!!Terms of Service",
551 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
552 "start": { 565 "start": {
553 "line": 186, 566 "line": 190,
554 "column": 7 567 "column": 7
555 }, 568 },
556 "end": { 569 "end": {
557 "line": 189, 570 "line": 193,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!Privacy Statement", 576 "defaultMessage": "!!!Privacy Statement",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 190, 579 "line": 194,
567 "column": 11 580 "column": 11
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 193, 583 "line": 197,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!File", 589 "defaultMessage": "!!!File",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 194, 592 "line": 198,
580 "column": 8 593 "column": 8
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 197, 596 "line": 201,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!View", 602 "defaultMessage": "!!!View",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 198, 605 "line": 202,
593 "column": 8 606 "column": 8
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 201, 609 "line": 205,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,11 @@
602 "defaultMessage": "!!!Services", 615 "defaultMessage": "!!!Services",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 202, 618 "line": 206,
606 "column": 12 619 "column": 12
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 205, 622 "line": 209,
610 "column": 3 623 "column": 3
611 } 624 }
612 }, 625 },
@@ -615,11 +628,11 @@
615 "defaultMessage": "!!!Window", 628 "defaultMessage": "!!!Window",
616 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
617 "start": { 630 "start": {
618 "line": 206, 631 "line": 210,
619 "column": 10 632 "column": 10
620 }, 633 },
621 "end": { 634 "end": {
622 "line": 209, 635 "line": 213,
623 "column": 3 636 "column": 3
624 } 637 }
625 }, 638 },
@@ -628,11 +641,11 @@
628 "defaultMessage": "!!!Help", 641 "defaultMessage": "!!!Help",
629 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
630 "start": { 643 "start": {
631 "line": 210, 644 "line": 214,
632 "column": 8 645 "column": 8
633 }, 646 },
634 "end": { 647 "end": {
635 "line": 213, 648 "line": 217,
636 "column": 3 649 "column": 3
637 } 650 }
638 }, 651 },
@@ -641,11 +654,11 @@
641 "defaultMessage": "!!!About Ferdi", 654 "defaultMessage": "!!!About Ferdi",
642 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
643 "start": { 656 "start": {
644 "line": 214, 657 "line": 218,
645 "column": 9 658 "column": 9
646 }, 659 },
647 "end": { 660 "end": {
648 "line": 217, 661 "line": 221,
649 "column": 3 662 "column": 3
650 } 663 }
651 }, 664 },
@@ -654,11 +667,11 @@
654 "defaultMessage": "!!!What's new?", 667 "defaultMessage": "!!!What's new?",
655 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
656 "start": { 669 "start": {
657 "line": 218, 670 "line": 222,
658 "column": 16 671 "column": 16
659 }, 672 },
660 "end": { 673 "end": {
661 "line": 221, 674 "line": 225,
662 "column": 3 675 "column": 3
663 } 676 }
664 }, 677 },
@@ -667,11 +680,11 @@
667 "defaultMessage": "!!!Settings", 680 "defaultMessage": "!!!Settings",
668 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
669 "start": { 682 "start": {
670 "line": 222, 683 "line": 226,
671 "column": 12 684 "column": 12
672 }, 685 },
673 "end": { 686 "end": {
674 "line": 225, 687 "line": 229,
675 "column": 3 688 "column": 3
676 } 689 }
677 }, 690 },
@@ -680,11 +693,11 @@
680 "defaultMessage": "!!!Check for updates", 693 "defaultMessage": "!!!Check for updates",
681 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
682 "start": { 695 "start": {
683 "line": 226, 696 "line": 230,
684 "column": 19 697 "column": 19
685 }, 698 },
686 "end": { 699 "end": {
687 "line": 229, 700 "line": 233,
688 "column": 3 701 "column": 3
689 } 702 }
690 }, 703 },
@@ -693,11 +706,11 @@
693 "defaultMessage": "!!!Hide", 706 "defaultMessage": "!!!Hide",
694 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
695 "start": { 708 "start": {
696 "line": 230, 709 "line": 234,
697 "column": 8 710 "column": 8
698 }, 711 },
699 "end": { 712 "end": {
700 "line": 233, 713 "line": 237,
701 "column": 3 714 "column": 3
702 } 715 }
703 }, 716 },
@@ -706,11 +719,11 @@
706 "defaultMessage": "!!!Hide Others", 719 "defaultMessage": "!!!Hide Others",
707 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
708 "start": { 721 "start": {
709 "line": 234, 722 "line": 238,
710 "column": 14 723 "column": 14
711 }, 724 },
712 "end": { 725 "end": {
713 "line": 237, 726 "line": 241,
714 "column": 3 727 "column": 3
715 } 728 }
716 }, 729 },
@@ -719,11 +732,11 @@
719 "defaultMessage": "!!!Unhide", 732 "defaultMessage": "!!!Unhide",
720 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
721 "start": { 734 "start": {
722 "line": 238, 735 "line": 242,
723 "column": 10 736 "column": 10
724 }, 737 },
725 "end": { 738 "end": {
726 "line": 241, 739 "line": 245,
727 "column": 3 740 "column": 3
728 } 741 }
729 }, 742 },
@@ -732,11 +745,11 @@
732 "defaultMessage": "!!!Auto-hide menu bar", 745 "defaultMessage": "!!!Auto-hide menu bar",
733 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
734 "start": { 747 "start": {
735 "line": 242, 748 "line": 246,
736 "column": 19 749 "column": 19
737 }, 750 },
738 "end": { 751 "end": {
739 "line": 245, 752 "line": 249,
740 "column": 3 753 "column": 3
741 } 754 }
742 }, 755 },
@@ -745,11 +758,11 @@
745 "defaultMessage": "!!!Quit", 758 "defaultMessage": "!!!Quit",
746 "file": "src/lib/Menu.js", 759 "file": "src/lib/Menu.js",
747 "start": { 760 "start": {
748 "line": 246, 761 "line": 250,
749 "column": 8 762 "column": 8
750 }, 763 },
751 "end": { 764 "end": {
752 "line": 249, 765 "line": 253,
753 "column": 3 766 "column": 3
754 } 767 }
755 }, 768 },
@@ -758,11 +771,11 @@
758 "defaultMessage": "!!!Add New Service...", 771 "defaultMessage": "!!!Add New Service...",
759 "file": "src/lib/Menu.js", 772 "file": "src/lib/Menu.js",
760 "start": { 773 "start": {
761 "line": 250, 774 "line": 254,
762 "column": 17 775 "column": 17
763 }, 776 },
764 "end": { 777 "end": {
765 "line": 253, 778 "line": 257,
766 "column": 3 779 "column": 3
767 } 780 }
768 }, 781 },
@@ -771,11 +784,11 @@
771 "defaultMessage": "!!!Add New Workspace...", 784 "defaultMessage": "!!!Add New Workspace...",
772 "file": "src/lib/Menu.js", 785 "file": "src/lib/Menu.js",
773 "start": { 786 "start": {
774 "line": 254, 787 "line": 258,
775 "column": 19 788 "column": 19
776 }, 789 },
777 "end": { 790 "end": {
778 "line": 257, 791 "line": 261,
779 "column": 3 792 "column": 3
780 } 793 }
781 }, 794 },
@@ -784,11 +797,11 @@
784 "defaultMessage": "!!!Open workspace drawer", 797 "defaultMessage": "!!!Open workspace drawer",
785 "file": "src/lib/Menu.js", 798 "file": "src/lib/Menu.js",
786 "start": { 799 "start": {
787 "line": 258, 800 "line": 262,
788 "column": 23 801 "column": 23
789 }, 802 },
790 "end": { 803 "end": {
791 "line": 261, 804 "line": 265,
792 "column": 3 805 "column": 3
793 } 806 }
794 }, 807 },
@@ -797,11 +810,11 @@
797 "defaultMessage": "!!!Close workspace drawer", 810 "defaultMessage": "!!!Close workspace drawer",
798 "file": "src/lib/Menu.js", 811 "file": "src/lib/Menu.js",
799 "start": { 812 "start": {
800 "line": 262, 813 "line": 266,
801 "column": 24 814 "column": 24
802 }, 815 },
803 "end": { 816 "end": {
804 "line": 265, 817 "line": 269,
805 "column": 3 818 "column": 3
806 } 819 }
807 }, 820 },
@@ -810,11 +823,11 @@
810 "defaultMessage": "!!!Activate next service...", 823 "defaultMessage": "!!!Activate next service...",
811 "file": "src/lib/Menu.js", 824 "file": "src/lib/Menu.js",
812 "start": { 825 "start": {
813 "line": 266, 826 "line": 270,
814 "column": 23 827 "column": 23
815 }, 828 },
816 "end": { 829 "end": {
817 "line": 269, 830 "line": 273,
818 "column": 3 831 "column": 3
819 } 832 }
820 }, 833 },
@@ -823,11 +836,11 @@
823 "defaultMessage": "!!!Activate previous service...", 836 "defaultMessage": "!!!Activate previous service...",
824 "file": "src/lib/Menu.js", 837 "file": "src/lib/Menu.js",
825 "start": { 838 "start": {
826 "line": 270, 839 "line": 274,
827 "column": 27 840 "column": 27
828 }, 841 },
829 "end": { 842 "end": {
830 "line": 273, 843 "line": 277,
831 "column": 3 844 "column": 3
832 } 845 }
833 }, 846 },
@@ -836,11 +849,11 @@
836 "defaultMessage": "!!!Disable notifications & audio", 849 "defaultMessage": "!!!Disable notifications & audio",
837 "file": "src/lib/Menu.js", 850 "file": "src/lib/Menu.js",
838 "start": { 851 "start": {
839 "line": 274, 852 "line": 278,
840 "column": 11 853 "column": 11
841 }, 854 },
842 "end": { 855 "end": {
843 "line": 277, 856 "line": 281,
844 "column": 3 857 "column": 3
845 } 858 }
846 }, 859 },
@@ -849,11 +862,11 @@
849 "defaultMessage": "!!!Enable notifications & audio", 862 "defaultMessage": "!!!Enable notifications & audio",
850 "file": "src/lib/Menu.js", 863 "file": "src/lib/Menu.js",
851 "start": { 864 "start": {
852 "line": 278, 865 "line": 282,
853 "column": 13 866 "column": 13
854 }, 867 },
855 "end": { 868 "end": {
856 "line": 281, 869 "line": 285,
857 "column": 3 870 "column": 3
858 } 871 }
859 }, 872 },
@@ -862,11 +875,11 @@
862 "defaultMessage": "!!!Workspaces", 875 "defaultMessage": "!!!Workspaces",
863 "file": "src/lib/Menu.js", 876 "file": "src/lib/Menu.js",
864 "start": { 877 "start": {
865 "line": 282, 878 "line": 286,
866 "column": 14 879 "column": 14
867 }, 880 },
868 "end": { 881 "end": {
869 "line": 285, 882 "line": 289,
870 "column": 3 883 "column": 3
871 } 884 }
872 }, 885 },
@@ -875,11 +888,11 @@
875 "defaultMessage": "!!!Default", 888 "defaultMessage": "!!!Default",
876 "file": "src/lib/Menu.js", 889 "file": "src/lib/Menu.js",
877 "start": { 890 "start": {
878 "line": 286, 891 "line": 290,
879 "column": 20 892 "column": 20
880 }, 893 },
881 "end": { 894 "end": {
882 "line": 289, 895 "line": 293,
883 "column": 3 896 "column": 3
884 } 897 }
885 }, 898 },
@@ -888,11 +901,11 @@
888 "defaultMessage": "!!!Todos", 901 "defaultMessage": "!!!Todos",
889 "file": "src/lib/Menu.js", 902 "file": "src/lib/Menu.js",
890 "start": { 903 "start": {
891 "line": 290, 904 "line": 294,
892 "column": 9 905 "column": 9
893 }, 906 },
894 "end": { 907 "end": {
895 "line": 293, 908 "line": 297,
896 "column": 3 909 "column": 3
897 } 910 }
898 }, 911 },
@@ -901,11 +914,11 @@
901 "defaultMessage": "!!!Open Todos drawer", 914 "defaultMessage": "!!!Open Todos drawer",
902 "file": "src/lib/Menu.js", 915 "file": "src/lib/Menu.js",
903 "start": { 916 "start": {
904 "line": 294, 917 "line": 298,
905 "column": 19 918 "column": 19
906 }, 919 },
907 "end": { 920 "end": {
908 "line": 297, 921 "line": 301,
909 "column": 3 922 "column": 3
910 } 923 }
911 }, 924 },
@@ -914,11 +927,11 @@
914 "defaultMessage": "!!!Close Todos drawer", 927 "defaultMessage": "!!!Close Todos drawer",
915 "file": "src/lib/Menu.js", 928 "file": "src/lib/Menu.js",
916 "start": { 929 "start": {
917 "line": 298, 930 "line": 302,
918 "column": 20 931 "column": 20
919 }, 932 },
920 "end": { 933 "end": {
921 "line": 301, 934 "line": 305,
922 "column": 3 935 "column": 3
923 } 936 }
924 }, 937 },
@@ -927,11 +940,11 @@
927 "defaultMessage": "!!!Enable Todos", 940 "defaultMessage": "!!!Enable Todos",
928 "file": "src/lib/Menu.js", 941 "file": "src/lib/Menu.js",
929 "start": { 942 "start": {
930 "line": 302, 943 "line": 306,
931 "column": 15 944 "column": 15
932 }, 945 },
933 "end": { 946 "end": {
934 "line": 305, 947 "line": 309,
935 "column": 3 948 "column": 3
936 } 949 }
937 }, 950 },
@@ -940,11 +953,11 @@
940 "defaultMessage": "!!!Home", 953 "defaultMessage": "!!!Home",
941 "file": "src/lib/Menu.js", 954 "file": "src/lib/Menu.js",
942 "start": { 955 "start": {
943 "line": 306, 956 "line": 310,
944 "column": 17 957 "column": 17
945 }, 958 },
946 "end": { 959 "end": {
947 "line": 309, 960 "line": 313,
948 "column": 3 961 "column": 3
949 } 962 }
950 } 963 }
diff --git a/src/index.js b/src/index.js
index 28bbe19c1..b297d66d8 100644
--- a/src/index.js
+++ b/src/index.js
@@ -9,6 +9,7 @@ import isDevMode from 'electron-is-dev';
9import fs from 'fs-extra'; 9import fs from 'fs-extra';
10import path from 'path'; 10import path from 'path';
11import windowStateKeeper from 'electron-window-state'; 11import windowStateKeeper from 'electron-window-state';
12import { enforceMacOSAppLocation } from 'electron-util';
12 13
13// Set app directory before loading user modules 14// Set app directory before loading user modules
14if (process.env.FERDI_APPDATA_DIR != null) { 15if (process.env.FERDI_APPDATA_DIR != null) {
@@ -39,7 +40,7 @@ import DBus from './lib/DBus';
39import Settings from './electron/Settings'; 40import Settings from './electron/Settings';
40import handleDeepLink from './electron/deepLinking'; 41import handleDeepLink from './electron/deepLinking';
41import { isPositionValid } from './electron/windowUtils'; 42import { isPositionValid } from './electron/windowUtils';
42// import askFormacOSPermissions from './electron/macOSPermissions'; 43import askFormacOSPermissions from './electron/macOSPermissions';
43import { appId } from './package.json'; // eslint-disable-line import/no-unresolved 44import { appId } from './package.json'; // eslint-disable-line import/no-unresolved
44import './electron/exception'; 45import './electron/exception';
45 46
@@ -60,6 +61,9 @@ if (isWindows) {
60 app.allowRendererProcessReuse = false; 61 app.allowRendererProcessReuse = false;
61} 62}
62 63
64// Globally set useragent to fix user agent override in service workers
65debug('Set userAgent to ', userAgent());
66app.userAgentFallback = userAgent();
63 67
64// Globally set useragent to fix user agent override in service workers 68// Globally set useragent to fix user agent override in service workers
65debug('Set userAgent to ', userAgent()); 69debug('Set userAgent to ', userAgent());
@@ -212,10 +216,11 @@ const createWindow = () => {
212 mainWindow.webContents.on('did-finish-load', () => { 216 mainWindow.webContents.on('did-finish-load', () => {
213 const fns = onDidLoadFns; 217 const fns = onDidLoadFns;
214 onDidLoadFns = null; 218 onDidLoadFns = null;
215 if (fns) { 219
216 for (const fn of fns) { // eslint-disable-line no-unused-vars 220 if (!fns) return;
217 fn(mainWindow); 221
218 } 222 for (const fn of fns) {
223 fn(mainWindow);
219 } 224 }
220 }); 225 });
221 226
@@ -322,10 +327,9 @@ const createWindow = () => {
322 } 327 }
323 }); 328 });
324 329
325 // Asking for permissions like this currently crashes Ferdi 330 if (isMac) {
326 // if (isMac) { 331 askFormacOSPermissions();
327 // askFormacOSPermissions(); 332 }
328 // }
329 333
330 mainWindow.on('show', () => { 334 mainWindow.on('show', () => {
331 debug('Skip taskbar: true'); 335 debug('Skip taskbar: true');
@@ -372,6 +376,9 @@ app.commandLine.appendSwitch('disable-features', 'HardwareMediaKeyHandling,Media
372// initialization and is ready to create browser windows. 376// initialization and is ready to create browser windows.
373// Some APIs can only be used after this event occurs. 377// Some APIs can only be used after this event occurs.
374app.on('ready', () => { 378app.on('ready', () => {
379 // force app to live in /Applications
380 enforceMacOSAppLocation();
381
375 // Register App URL 382 // Register App URL
376 app.setAsDefaultProtocolClient('ferdi'); 383 app.setAsDefaultProtocolClient('ferdi');
377 384
@@ -482,6 +489,12 @@ app.on('activate', () => {
482 } 489 }
483}); 490});
484 491
492app.on('web-contents-created', (createdEvent, contents) => {
493 contents.on('new-window', (event, url, frameNme, disposition) => {
494 if (disposition === 'foreground-tab') event.preventDefault();
495 });
496});
497
485app.on('will-finish-launching', () => { 498app.on('will-finish-launching', () => {
486 // Protocol handler for macOS 499 // Protocol handler for macOS
487 app.on('open-url', (event, url) => { 500 app.on('open-url', (event, url) => {
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index dde4f694a..d0dc28da6 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -139,6 +139,10 @@ const menuItems = defineMessages({
139 id: 'menu.view.lockFerdi', 139 id: 'menu.view.lockFerdi',
140 defaultMessage: '!!!Lock Ferdi', 140 defaultMessage: '!!!Lock Ferdi',
141 }, 141 },
142 reloadTodos: {
143 id: 'menu.view.reloadTodos',
144 defaultMessage: '!!!Reload ToDos',
145 },
142 minimize: { 146 minimize: {
143 id: 'menu.window.minimize', 147 id: 'menu.window.minimize',
144 defaultMessage: '!!!Minimize', 148 defaultMessage: '!!!Minimize',
@@ -856,6 +860,8 @@ export default class FranzMenu {
856 accelerator: `${cmdKey}+Shift+Alt+I`, 860 accelerator: `${cmdKey}+Shift+Alt+I`,
857 click: () => { 861 click: () => {
858 this.actions.service.openDevToolsForActiveService(); 862 this.actions.service.openDevToolsForActiveService();
863 const webview = document.querySelector('#todos-panel webview');
864 if (webview) this.actions.todos.openDevTools();
859 }, 865 },
860 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0, 866 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0,
861 }); 867 });
@@ -894,6 +900,12 @@ export default class FranzMenu {
894 window.location.reload(); 900 window.location.reload();
895 }, 901 },
896 }, { 902 }, {
903 label: intl.formatMessage(menuItems.reloadTodos),
904 accelerator: `${cmdKey}+Shift+Alt+R`,
905 click: () => {
906 this.actions.todos.reload();
907 },
908 }, {
897 type: 'separator', 909 type: 'separator',
898 }, { 910 }, {
899 label: intl.formatMessage(menuItems.lockFerdi), 911 label: intl.formatMessage(menuItems.lockFerdi),
diff --git a/src/models/Recipe.js b/src/models/Recipe.js
index dcb998a19..a20eeb087 100644
--- a/src/models/Recipe.js
+++ b/src/models/Recipe.js
@@ -40,6 +40,8 @@ export default class Recipe {
40 40
41 autoHibernate = false; 41 autoHibernate = false;
42 42
43 partition = '';
44
43 constructor(data) { 45 constructor(data) {
44 if (!data) { 46 if (!data) {
45 throw Error('Recipe config not valid'); 47 throw Error('Recipe config not valid');
@@ -82,6 +84,8 @@ export default class Recipe {
82 84
83 this.autoHibernate = data.config.autoHibernate || this.autoHibernate; 85 this.autoHibernate = data.config.autoHibernate || this.autoHibernate;
84 86
87 this.partition = data.config.partition || this.partition;
88
85 this.message = data.config.message || this.message; 89 this.message = data.config.message || this.message;
86 } 90 }
87 91
diff --git a/src/models/Service.js b/src/models/Service.js
index 4b5e8592d..ef1276619 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -4,8 +4,9 @@ import normalizeUrl from 'normalize-url';
4import path from 'path'; 4import path from 'path';
5 5
6import userAgent from '../helpers/userAgent-helpers'; 6import userAgent from '../helpers/userAgent-helpers';
7import { TODOS_RECIPE_ID, todosStore } from '../features/todos';
7 8
8const debug = require('debug')('Ferdi:Service'); 9const debug = require('debug')('Franz:Service');
9 10
10export const RESTRICTION_TYPES = { 11export const RESTRICTION_TYPES = {
11 SERVICE_LIMIT: 0, 12 SERVICE_LIMIT: 0,
@@ -17,7 +18,7 @@ export default class Service {
17 18
18 recipe = ''; 19 recipe = '';
19 20
20 webview = null; 21 _webview = null;
21 22
22 timer = null; 23 timer = null;
23 24
@@ -77,13 +78,15 @@ export default class Service {
77 78
78 @observable restrictionType = null; 79 @observable restrictionType = null;
79 80
80 @observable disableHibernation = false; 81 @observable isHibernationEnabled = false;
82
83 @observable isHibernating = false;
81 84
82 @observable lastUsed = Date.now(); // timestamp 85 @observable lastUsed = Date.now(); // timestamp
83 86
84 @observable lastPoll = null; 87 @observable lastPoll = Date.now();
85 88
86 @observable lastPollAnswer = null; 89 @observable lastPollAnswer = Date.now();
87 90
88 @observable lostRecipeConnection = false; 91 @observable lostRecipeConnection = false;
89 92
@@ -136,7 +139,7 @@ export default class Service {
136 139
137 this.spellcheckerLanguage = data.spellcheckerLanguage !== undefined ? data.spellcheckerLanguage : this.spellcheckerLanguage; 140 this.spellcheckerLanguage = data.spellcheckerLanguage !== undefined ? data.spellcheckerLanguage : this.spellcheckerLanguage;
138 141
139 this.disableHibernation = data.disableHibernation !== undefined ? data.disableHibernation : this.disableHibernation; 142 this.isHibernationEnabled = data.isHibernationEnabled !== undefined ? data.isHibernationEnabled : this.isHibernationEnabled;
140 143
141 this.recipe = recipe; 144 this.recipe = recipe;
142 145
@@ -177,6 +180,18 @@ export default class Service {
177 }; 180 };
178 } 181 }
179 182
183 get webview() {
184 if (this.recipe.id === TODOS_RECIPE_ID) {
185 return todosStore.webview;
186 }
187
188 return this._webview;
189 }
190
191 set webview(webview) {
192 this._webview = webview;
193 }
194
180 @computed get url() { 195 @computed get url() {
181 if (this.recipe.hasCustomUrl && this.customUrl) { 196 if (this.recipe.hasCustomUrl && this.customUrl) {
182 let url; 197 let url;
@@ -225,6 +240,10 @@ export default class Service {
225 return ua; 240 return ua;
226 } 241 }
227 242
243 @computed get partition() {
244 return this.recipe.partition || `persist:service-${this.id}`;
245 }
246
228 247
229 initializeWebViewEvents({ handleIPCMessage, openWindow, stores }) { 248 initializeWebViewEvents({ handleIPCMessage, openWindow, stores }) {
230 const webContents = remote.webContents.fromId(this.webview.getWebContentsId()); 249 const webContents = remote.webContents.fromId(this.webview.getWebContentsId());
diff --git a/src/routes.js b/src/routes.js
index 9986cdde5..046e60cbb 100644
--- a/src/routes.js
+++ b/src/routes.js
@@ -24,6 +24,7 @@ import ChangeServerScreen from './containers/auth/ChangeServerScreen';
24import SignupScreen from './containers/auth/SignupScreen'; 24import SignupScreen from './containers/auth/SignupScreen';
25import ImportScreen from './containers/auth/ImportScreen'; 25import ImportScreen from './containers/auth/ImportScreen';
26import PricingScreen from './containers/auth/PricingScreen'; 26import PricingScreen from './containers/auth/PricingScreen';
27import SetupAssistentScreen from './containers/auth/SetupAssistantScreen';
27import InviteScreen from './containers/auth/InviteScreen'; 28import InviteScreen from './containers/auth/InviteScreen';
28import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; 29import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
29import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; 30import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
@@ -80,6 +81,7 @@ export default @inject('stores', 'actions') @observer class Routes extends Compo
80 <Route path="/auth/signup/form" component={SignupScreen} /> 81 <Route path="/auth/signup/form" component={SignupScreen} />
81 <Route path="/auth/signup/pricing" component={PricingScreen} /> 82 <Route path="/auth/signup/pricing" component={PricingScreen} />
82 <Route path="/auth/signup/import" component={ImportScreen} /> 83 <Route path="/auth/signup/import" component={ImportScreen} />
84 <Route path="/auth/signup/setup" component={SetupAssistentScreen} />
83 <Route path="/auth/signup/invite" component={InviteScreen} /> 85 <Route path="/auth/signup/invite" component={InviteScreen} />
84 </Route> 86 </Route>
85 <Route path="/auth/password" component={PasswordScreen} /> 87 <Route path="/auth/password" component={PasswordScreen} />
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 153fdb2c8..869cfa9d6 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -3,7 +3,6 @@ import {
3 action, computed, observable, 3 action, computed, observable,
4} from 'mobx'; 4} from 'mobx';
5import moment from 'moment'; 5import moment from 'moment';
6import { getDoNotDisturb } from '@meetfranz/electron-notification-state';
7import AutoLaunch from 'auto-launch'; 6import AutoLaunch from 'auto-launch';
8import prettyBytes from 'pretty-bytes'; 7import prettyBytes from 'pretty-bytes';
9import ms from 'ms'; 8import ms from 'ms';
@@ -27,7 +26,10 @@ import { sleep } from '../helpers/async-helpers';
27const debug = require('debug')('Ferdi:AppStore'); 26const debug = require('debug')('Ferdi:AppStore');
28 27
29const { 28const {
30 app, nativeTheme, screen, powerMonitor, 29 app,
30 screen,
31 powerMonitor,
32 nativeTheme,
31} = remote; 33} = remote;
32 34
33const mainWindow = remote.getCurrentWindow(); 35const mainWindow = remote.getCurrentWindow();
@@ -63,7 +65,7 @@ export default class AppStore extends Store {
63 65
64 @observable authRequestFailed = false; 66 @observable authRequestFailed = false;
65 67
66 @observable timeSuspensionStart; 68 @observable timeSuspensionStart = moment();
67 69
68 @observable timeOfflineStart; 70 @observable timeOfflineStart;
69 71
@@ -118,11 +120,19 @@ export default class AppStore extends Store {
118 window.addEventListener('focus', this.actions.service.focusActiveService); 120 window.addEventListener('focus', this.actions.service.focusActiveService);
119 121
120 // Online/Offline handling 122 // Online/Offline handling
121 window.addEventListener('online', () => { this.isOnline = true; }); 123 window.addEventListener('online', () => {
122 window.addEventListener('offline', () => { this.isOnline = false; }); 124 this.isOnline = true;
125 });
126 window.addEventListener('offline', () => {
127 this.isOnline = false;
128 });
123 129
124 mainWindow.on('enter-full-screen', () => { this.isFullScreen = true; }); 130 mainWindow.on('enter-full-screen', () => {
125 mainWindow.on('leave-full-screen', () => { this.isFullScreen = false; }); 131 this.isFullScreen = true;
132 });
133 mainWindow.on('leave-full-screen', () => {
134 this.isFullScreen = false;
135 });
126 136
127 137
128 this.isOnline = navigator.onLine; 138 this.isOnline = navigator.onLine;
@@ -137,10 +147,16 @@ export default class AppStore extends Store {
137 setInterval(() => this._systemDND(), ms('5s')); 147 setInterval(() => this._systemDND(), ms('5s'));
138 148
139 this.fetchDataInterval = setInterval(() => { 149 this.fetchDataInterval = setInterval(() => {
140 this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); 150 this.stores.user.getUserInfoRequest.invalidate({
141 this.stores.features.featuresRequest.invalidate({ immediately: true }); 151 immediately: true,
142 this.stores.news.latestNewsRequest.invalidate({ immediately: true }); 152 });
143 }, ms('10m')); 153 this.stores.features.featuresRequest.invalidate({
154 immediately: true,
155 });
156 this.stores.news.latestNewsRequest.invalidate({
157 immediately: true,
158 });
159 }, ms('60m'));
144 160
145 // Check for updates once every 4 hours 161 // Check for updates once every 4 hours
146 setInterval(() => this._checkForUpdates(), CHECK_INTERVAL); 162 setInterval(() => this._checkForUpdates(), CHECK_INTERVAL);
@@ -174,7 +190,9 @@ export default class AppStore extends Store {
174 // Handle deep linking (franz://) 190 // Handle deep linking (franz://)
175 ipcRenderer.on('navigateFromDeepLink', (event, data) => { 191 ipcRenderer.on('navigateFromDeepLink', (event, data) => {
176 debug('Navigate from deep link', data); 192 debug('Navigate from deep link', data);
177 let { url } = data; 193 let {
194 url,
195 } = data;
178 if (!url) return; 196 if (!url) return;
179 197
180 url = url.replace(/\/$/, ''); 198 url = url.replace(/\/$/, '');
@@ -207,13 +225,17 @@ export default class AppStore extends Store {
207 }); 225 });
208 226
209 powerMonitor.on('resume', () => { 227 powerMonitor.on('resume', () => {
210 debug('System resumed, last suspended on', this.timeSuspensionStart.toString()); 228 debug('System resumed, last suspended on', this.timeSuspensionStart);
229 this.actions.service.resetLastPollTimer();
211 230
212 if (this.timeSuspensionStart.add(10, 'm').isBefore(moment()) && this.stores.settings.app.get('reloadAfterResume')) { 231 if (this.timeSuspensionStart.add(10, 'm').isBefore(moment()) && this.stores.settings.app.get('reloadAfterResume')) {
213 debug('Reloading services, user info and features'); 232 debug('Reloading services, user info and features');
214 233
215 setTimeout(() => { 234 setInterval(() => {
216 window.location.reload(); 235 debug('Reload app interval is starting');
236 if (this.isOnline) {
237 window.location.reload();
238 }
217 }, ms('2s')); 239 }, ms('2s'));
218 } 240 }
219 }); 241 });
@@ -251,8 +273,14 @@ export default class AppStore extends Store {
251 ferdi: { 273 ferdi: {
252 version: app.getVersion(), 274 version: app.getVersion(),
253 electron: process.versions.electron, 275 electron: process.versions.electron,
254 installedRecipes: this.stores.recipes.all.map(recipe => ({ id: recipe.id, version: recipe.version })), 276 installedRecipes: this.stores.recipes.all.map(recipe => ({
255 devRecipes: this.stores.recipePreviews.dev.map(recipe => ({ id: recipe.id, version: recipe.version })), 277 id: recipe.id,
278 version: recipe.version,
279 })),
280 devRecipes: this.stores.recipePreviews.dev.map(recipe => ({
281 id: recipe.id,
282 version: recipe.version,
283 })),
256 services: this.stores.services.all.map(service => ({ 284 services: this.stores.services.all.map(service => ({
257 id: service.id, 285 id: service.id,
258 recipe: service.recipe.id, 286 recipe: service.recipe.id,
@@ -264,7 +292,10 @@ export default class AppStore extends Store {
264 isDarkModeEnabled: service.isDarkModeEnabled, 292 isDarkModeEnabled: service.isDarkModeEnabled,
265 })), 293 })),
266 messages: this.stores.globalError.messages, 294 messages: this.stores.globalError.messages,
267 workspaces: this.stores.workspaces.workspaces.map(workspace => ({ id: workspace.id, services: workspace.services })), 295 workspaces: this.stores.workspaces.workspaces.map(workspace => ({
296 id: workspace.id,
297 services: workspace.services,
298 })),
268 windowSettings: readJsonSync(path.join(app.getPath('userData'), 'window-state.json')), 299 windowSettings: readJsonSync(path.join(app.getPath('userData'), 'window-state.json')),
269 settings, 300 settings,
270 features: this.stores.features.features, 301 features: this.stores.features.features,
@@ -275,7 +306,10 @@ export default class AppStore extends Store {
275 306
276 // Actions 307 // Actions
277 @action _notify({ 308 @action _notify({
278 title, options, notificationId, serviceId = null, 309 title,
310 options,
311 notificationId,
312 serviceId = null,
279 }) { 313 }) {
280 if (this.stores.settings.all.app.isAppMuted) return; 314 if (this.stores.settings.all.app.isAppMuted) return;
281 315
@@ -288,15 +322,17 @@ export default class AppStore extends Store {
288 322
289 debug('New notification', title, options); 323 debug('New notification', title, options);
290 324
291 notification.onclick = (e) => { 325 notification.onclick = () => {
292 if (serviceId) { 326 if (serviceId) {
293 this.actions.service.sendIPCMessage({ 327 this.actions.service.sendIPCMessage({
294 channel: `notification-onclick:${notificationId}`, 328 channel: `notification-onclick:${notificationId}`,
295 args: e, 329 args: {},
296 serviceId, 330 serviceId,
297 }); 331 });
298 332
299 this.actions.service.setActive({ serviceId }); 333 this.actions.service.setActive({
334 serviceId,
335 });
300 mainWindow.show(); 336 mainWindow.show();
301 if (app.mainWindow.isMinimized()) { 337 if (app.mainWindow.isMinimized()) {
302 mainWindow.restore(); 338 mainWindow.restore();
@@ -308,7 +344,10 @@ export default class AppStore extends Store {
308 }; 344 };
309 } 345 }
310 346
311 @action _setBadge({ unreadDirectMessageCount, unreadIndirectMessageCount }) { 347 @action _setBadge({
348 unreadDirectMessageCount,
349 unreadIndirectMessageCount,
350 }) {
312 let indicator = unreadDirectMessageCount; 351 let indicator = unreadDirectMessageCount;
313 352
314 if (indicator === 0 && unreadIndirectMessageCount !== 0) { 353 if (indicator === 0 && unreadIndirectMessageCount !== 0) {
@@ -319,10 +358,14 @@ export default class AppStore extends Store {
319 indicator = parseInt(indicator, 10); 358 indicator = parseInt(indicator, 10);
320 } 359 }
321 360
322 ipcRenderer.send('updateAppIndicator', { indicator }); 361 ipcRenderer.send('updateAppIndicator', {
362 indicator,
363 });
323 } 364 }
324 365
325 @action _launchOnStartup({ enable }) { 366 @action _launchOnStartup({
367 enable,
368 }) {
326 this.autoLaunchOnStart = enable; 369 this.autoLaunchOnStart = enable;
327 370
328 try { 371 try {
@@ -338,7 +381,9 @@ export default class AppStore extends Store {
338 } 381 }
339 } 382 }
340 383
341 @action _openExternalUrl({ url }) { 384 @action _openExternalUrl({
385 url,
386 }) {
342 const parsedUrl = new URL(url); 387 const parsedUrl = new URL(url);
343 debug('open external url', parsedUrl); 388 debug('open external url', parsedUrl);
344 389
@@ -348,14 +393,20 @@ export default class AppStore extends Store {
348 } 393 }
349 394
350 @action _checkForUpdates() { 395 @action _checkForUpdates() {
351 this.updateStatus = this.updateStatusTypes.CHECKING; 396 if (this.isOnline) {
352 ipcRenderer.send('autoUpdate', { action: 'check' }); 397 this.updateStatus = this.updateStatusTypes.CHECKING;
398 ipcRenderer.send('autoUpdate', {
399 action: 'check',
400 });
353 401
354 this.actions.recipe.update(); 402 this.actions.recipe.update();
403 }
355 } 404 }
356 405
357 @action _installUpdate() { 406 @action _installUpdate() {
358 ipcRenderer.send('autoUpdate', { action: 'install' }); 407 ipcRenderer.send('autoUpdate', {
408 action: 'install',
409 });
359 } 410 }
360 411
361 @action _resetUpdateStatus() { 412 @action _resetUpdateStatus() {
@@ -366,7 +417,10 @@ export default class AppStore extends Store {
366 this.healthCheckRequest.execute(); 417 this.healthCheckRequest.execute();
367 } 418 }
368 419
369 @action _muteApp({ isMuted, overrideSystemMute = true }) { 420 @action _muteApp({
421 isMuted,
422 overrideSystemMute = true,
423 }) {
370 this.isSystemMuteOverridden = overrideSystemMute; 424 this.isSystemMuteOverridden = overrideSystemMute;
371 this.actions.settings.update({ 425 this.actions.settings.update({
372 type: 'app', 426 type: 'app',
@@ -377,7 +431,9 @@ export default class AppStore extends Store {
377 } 431 }
378 432
379 @action _toggleMuteApp() { 433 @action _toggleMuteApp() {
380 this._muteApp({ isMuted: !this.stores.settings.all.app.isAppMuted }); 434 this._muteApp({
435 isMuted: !this.stores.settings.all.app.isAppMuted,
436 });
381 } 437 }
382 438
383 @action async _clearAllCache() { 439 @action async _clearAllCache() {
@@ -391,7 +447,9 @@ export default class AppStore extends Store {
391 } catch (ex) { 447 } catch (ex) {
392 console.log('Error while deleting service partition directory - ', ex); 448 console.log('Error while deleting service partition directory - ', ex);
393 } 449 }
394 await Promise.all(this.stores.services.all.map(s => this.actions.service.clearCache({ serviceId: s.id }))); 450 await Promise.all(this.stores.services.all.map(s => this.actions.service.clearCache({
451 serviceId: s.id,
452 })));
395 453
396 await clearAppCache._promise; 454 await clearAppCache._promise;
397 455
@@ -446,7 +504,10 @@ export default class AppStore extends Store {
446 const { showMessageBadgesEvenWhenMuted } = this.stores.ui; 504 const { showMessageBadgesEvenWhenMuted } = this.stores.ui;
447 505
448 if (!showMessageBadgesEvenWhenMuted) { 506 if (!showMessageBadgesEvenWhenMuted) {
449 this.actions.app.setBadge({ unreadDirectMessageCount: 0, unreadIndirectMessageCount: 0 }); 507 this.actions.app.setBadge({
508 unreadDirectMessageCount: 0,
509 unreadIndirectMessageCount: 0,
510 });
450 } 511 }
451 } 512 }
452 513
@@ -491,8 +552,11 @@ export default class AppStore extends Store {
491 return autoLauncher.isEnabled() || false; 552 return autoLauncher.isEnabled() || false;
492 } 553 }
493 554
494 _systemDND() { 555 async _systemDND() {
495 const dnd = getDoNotDisturb(); 556 debug('Checking if Do Not Disturb Mode is on');
557 const dnd = await ipcRenderer.invoke('get-dnd');
558 debug('Do not disturb mode is', dnd);
559 // ipcRenderer.on('autoUpdate', (event, data) => {
496 if (dnd !== this.stores.settings.all.app.isAppMuted && !this.isSystemMuteOverridden) { 560 if (dnd !== this.stores.settings.all.app.isAppMuted && !this.isSystemMuteOverridden) {
497 this.actions.app.muteApp({ 561 this.actions.app.muteApp({
498 isMuted: dnd, 562 isMuted: dnd,
diff --git a/src/stores/RecipesStore.js b/src/stores/RecipesStore.js
index cf5d0a074..965aa3a0a 100644
--- a/src/stores/RecipesStore.js
+++ b/src/stores/RecipesStore.js
@@ -66,7 +66,7 @@ export default class RecipesStore extends Store {
66 } 66 }
67 67
68 // Actions 68 // Actions
69 @action async _install({ recipeId }) { 69 async _install({ recipeId }) {
70 const recipe = await this.installRecipeRequest.execute(recipeId)._promise; 70 const recipe = await this.installRecipeRequest.execute(recipeId)._promise;
71 await this.allRecipesRequest.invalidate({ immediately: true })._promise; 71 await this.allRecipesRequest.invalidate({ immediately: true })._promise;
72 72
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 448260638..21ed0a234 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -20,6 +20,8 @@ import { workspaceStore } from '../features/workspaces';
20import { serviceLimitStore } from '../features/serviceLimit'; 20import { serviceLimitStore } from '../features/serviceLimit';
21import { RESTRICTION_TYPES } from '../models/Service'; 21import { RESTRICTION_TYPES } from '../models/Service';
22import { KEEP_WS_LOADED_USID } from '../config'; 22import { KEEP_WS_LOADED_USID } from '../config';
23import { TODOS_RECIPE_ID } from '../features/todos';
24import { SPELLCHECKER_LOCALES } from '../i18n/languages';
23 25
24const debug = require('debug')('Ferdi:ServiceStore'); 26const debug = require('debug')('Ferdi:ServiceStore');
25 27
@@ -82,7 +84,9 @@ export default class ServicesStore extends Store {
82 this.actions.service.toggleAudio.listen(this._toggleAudio.bind(this)); 84 this.actions.service.toggleAudio.listen(this._toggleAudio.bind(this));
83 this.actions.service.openDevTools.listen(this._openDevTools.bind(this)); 85 this.actions.service.openDevTools.listen(this._openDevTools.bind(this));
84 this.actions.service.openDevToolsForActiveService.listen(this._openDevToolsForActiveService.bind(this)); 86 this.actions.service.openDevToolsForActiveService.listen(this._openDevToolsForActiveService.bind(this));
85 this.actions.service.setHibernation.listen(this._setHibernation.bind(this)); 87 this.actions.service.hibernate.listen(this._hibernate.bind(this));
88 this.actions.service.awake.listen(this._awake.bind(this));
89 this.actions.service.resetLastPollTimer.listen(this._resetLastPollTimer.bind(this));
86 this.actions.service.shareSettingsWithServiceProcess.listen(this._shareSettingsWithServiceProcess.bind(this)); 90 this.actions.service.shareSettingsWithServiceProcess.listen(this._shareSettingsWithServiceProcess.bind(this));
87 91
88 this.registerReactions([ 92 this.registerReactions([
@@ -93,6 +97,7 @@ export default class ServicesStore extends Store {
93 this._logoutReaction.bind(this), 97 this._logoutReaction.bind(this),
94 this._handleMuteSettings.bind(this), 98 this._handleMuteSettings.bind(this),
95 this._restrictServiceAccess.bind(this), 99 this._restrictServiceAccess.bind(this),
100 this._checkForActiveService.bind(this),
96 ]); 101 ]);
97 102
98 // Just bind this 103 // Just bind this
@@ -155,16 +160,24 @@ export default class ServicesStore extends Store {
155 */ 160 */
156 _serviceMaintenance() { 161 _serviceMaintenance() {
157 this.all.forEach((service) => { 162 this.all.forEach((service) => {
158 if (service.lastPoll && (service.lastPoll) - service.lastPollAnswer > ms('30s')) { 163 // Defines which services should be hibernated.
159 // If service did not reply for more than 30s try to reload. 164 if (!service.isActive && (Date.now() - service.lastUsed > ms('5m'))) {
165 // If service is stale for 5 min, hibernate it.
166 this._hibernate({ serviceId: service.id });
167 }
168
169 if (service.lastPoll && (service.lastPoll - service.lastPollAnswer > ms('1m'))) {
170 // If service did not reply for more than 1m try to reload.
160 if (!service.isActive) { 171 if (!service.isActive) {
161 if (this.stores.app.isOnline && service.lostRecipeReloadAttempt < 3) { 172 if (this.stores.app.isOnline && service.lostRecipeReloadAttempt < 3) {
162 service.webview.reload(); 173 debug(`Reloading service: ${service.name} (${service.id}). Attempt: ${service.lostRecipeReloadAttempt}`);
174 // service.webview.reload();
163 service.lostRecipeReloadAttempt += 1; 175 service.lostRecipeReloadAttempt += 1;
164 176
165 service.lostRecipeConnection = false; 177 service.lostRecipeConnection = false;
166 } 178 }
167 } else { 179 } else {
180 debug(`Service lost connection: ${service.name} (${service.id}).`);
168 service.lostRecipeConnection = true; 181 service.lostRecipeConnection = true;
169 } 182 }
170 } else { 183 } else {
@@ -256,6 +269,14 @@ export default class ServicesStore extends Store {
256 return null; 269 return null;
257 } 270 }
258 271
272 @computed get isTodosServiceAdded() {
273 return this.allDisplayed.find(service => service.recipe.id === TODOS_RECIPE_ID && service.isEnabled) || null;
274 }
275
276 @computed get isTodosServiceActive() {
277 return this.active && this.active.recipe.id === TODOS_RECIPE_ID;
278 }
279
259 one(id) { 280 one(id) {
260 return this.all.find(service => service.id === id); 281 return this.all.find(service => service.id === id);
261 } 282 }
@@ -265,10 +286,34 @@ export default class ServicesStore extends Store {
265 } 286 }
266 287
267 // Actions 288 // Actions
268 @action async _createService({ recipeId, serviceData, redirect = true }) { 289 async _createService({
290 recipeId, serviceData, redirect = true, skipCleanup = false,
291 }) {
269 if (serviceLimitStore.userHasReachedServiceLimit) return; 292 if (serviceLimitStore.userHasReachedServiceLimit) return;
270 293
271 const data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData); 294 if (!this.stores.recipes.isInstalled(recipeId)) {
295 debug(`Recipe "${recipeId}" is not installed, installing recipe`);
296 await this.stores.recipes._install({ recipeId });
297 debug(`Recipe "${recipeId}" installed`);
298 }
299
300 // set default values for serviceData
301 Object.assign({
302 isEnabled: true,
303 isHibernationEnabled: false,
304 isNotificationEnabled: true,
305 isBadgeEnabled: true,
306 isMuted: false,
307 customIcon: false,
308 isDarkModeEnabled: false,
309 spellcheckerLanguage: SPELLCHECKER_LOCALES[this.stores.settings.app.spellcheckerLanguage],
310 }, serviceData);
311
312 let data = serviceData;
313
314 if (!skipCleanup) {
315 data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData);
316 }
272 317
273 const response = await this.createServiceRequest.execute(recipeId, data)._promise; 318 const response = await this.createServiceRequest.execute(recipeId, data)._promise;
274 319
@@ -427,8 +472,13 @@ export default class ServicesStore extends Store {
427 this.all[index].isActive = false; 472 this.all[index].isActive = false;
428 }); 473 });
429 service.isActive = true; 474 service.isActive = true;
475 this._awake({ serviceId: service.id });
430 service.lastUsed = Date.now(); 476 service.lastUsed = Date.now();
431 477
478 if (this.active.recipe.id === TODOS_RECIPE_ID && !this.stores.todos.settings.isFeatureEnabledByUser) {
479 this.actions.todos.toggleTodosFeatureVisibility();
480 }
481
432 // Update list of last used services 482 // Update list of last used services
433 this.lastUsedServices = this.lastUsedServices.filter(id => id !== serviceId); 483 this.lastUsedServices = this.lastUsedServices.filter(id => id !== serviceId);
434 this.lastUsedServices.unshift(serviceId); 484 this.lastUsedServices.unshift(serviceId);
@@ -617,10 +667,10 @@ export default class ServicesStore extends Store {
617 @action _sendIPCMessage({ serviceId, channel, args }) { 667 @action _sendIPCMessage({ serviceId, channel, args }) {
618 const service = this.one(serviceId); 668 const service = this.one(serviceId);
619 669
620 if (service.webview) { 670 // Make sure the args are clean, otherwise ElectronJS can't transmit them
621 // Make sure the args are clean, otherwise ElectronJS can't transmit them 671 const cleanArgs = JSON.parse(JSON.stringify(args));
622 const cleanArgs = JSON.parse(JSON.stringify(args));
623 672
673 if (service.webview) {
624 service.webview.send(channel, cleanArgs); 674 service.webview.send(channel, cleanArgs);
625 } 675 }
626 } 676 }
@@ -659,8 +709,11 @@ export default class ServicesStore extends Store {
659 service.resetMessageCount(); 709 service.resetMessageCount();
660 service.lostRecipeConnection = false; 710 service.lostRecipeConnection = false;
661 711
662 // service.webview.loadURL(service.url); 712 if (service.recipe.id === TODOS_RECIPE_ID) {
663 service.webview.reload(); 713 return this.actions.todos.reload();
714 }
715
716 return service.webview.loadURL(service.url);
664 } 717 }
665 718
666 @action _reloadActive() { 719 @action _reloadActive() {
@@ -743,23 +796,57 @@ export default class ServicesStore extends Store {
743 796
744 @action _openDevTools({ serviceId }) { 797 @action _openDevTools({ serviceId }) {
745 const service = this.one(serviceId); 798 const service = this.one(serviceId);
746 799 if (service.recipe.id === TODOS_RECIPE_ID) {
747 service.webview.openDevTools(); 800 this.actions.todos.openDevTools();
801 } else {
802 service.webview.openDevTools();
803 }
748 } 804 }
749 805
750 @action _openDevToolsForActiveService() { 806 @action _openDevToolsForActiveService() {
751 const service = this.active; 807 const service = this.active;
752 808
753 if (service) { 809 if (service) {
754 service.webview.openDevTools(); 810 this._openDevTools({ serviceId: service.id });
755 } else { 811 } else {
756 debug('No service is active'); 812 debug('No service is active');
757 } 813 }
758 } 814 }
759 815
760 @action _setHibernation({ serviceId, hibernating }) { 816 @action _hibernate({ serviceId }) {
817 const service = this.one(serviceId);
818 if (service.isActive || !service.isHibernationEnabled) {
819 debug('Skipping service hibernation');
820 return;
821 }
822
823 debug(`Hibernate ${service.name}`);
824
825 service.isHibernating = true;
826 }
827
828 @action _awake({ serviceId }) {
761 const service = this.one(serviceId); 829 const service = this.one(serviceId);
762 service.isHibernating = hibernating; 830 service.isHibernating = false;
831 service.liveFrom = Date.now();
832 }
833
834 @action _resetLastPollTimer({ serviceId = null }) {
835 debug(`Reset last poll timer for ${serviceId ? `service: "${serviceId}"` : 'all services'}`);
836
837 const resetTimer = (service) => {
838 service.lastPollAnswer = Date.now();
839 service.lastPoll = Date.now();
840 };
841
842 if (!serviceId) {
843 this.allDisplayed.forEach(service => resetTimer(service));
844 } else {
845 const service = this.one(serviceId);
846 if (service) {
847 resetTimer(service);
848 }
849 }
763 } 850 }
764 851
765 // Reactions 852 // Reactions
@@ -893,6 +980,18 @@ export default class ServicesStore extends Store {
893 }); 980 });
894 } 981 }
895 982
983 _checkForActiveService() {
984 if (!this.stores.router.location || this.stores.router.location.pathname.includes('auth/signup')) {
985 return;
986 }
987
988 if (this.allDisplayed.findIndex(service => service.isActive) === -1 && this.allDisplayed.length !== 0) {
989 debug('No active service found, setting active service to index 0');
990
991 this._setActive({ serviceId: this.allDisplayed[0].id });
992 }
993 }
994
896 // Helper 995 // Helper
897 _initializeServiceRecipeInWebview(serviceId) { 996 _initializeServiceRecipeInWebview(serviceId) {
898 const service = this.one(serviceId); 997 const service = this.one(serviceId);
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index c1ed2944a..7b4d39524 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -3,6 +3,7 @@ import moment from 'moment';
3import jwt from 'jsonwebtoken'; 3import jwt from 'jsonwebtoken';
4import localStorage from 'mobx-localstorage'; 4import localStorage from 'mobx-localstorage';
5import ms from 'ms'; 5import ms from 'ms';
6import { remote } from 'electron';
6 7
7import { isDevMode } from '../environment'; 8import { isDevMode } from '../environment';
8import Store from './lib/Store'; 9import Store from './lib/Store';
@@ -11,6 +12,9 @@ import CachedRequest from './lib/CachedRequest';
11import { sleep } from '../helpers/async-helpers'; 12import { sleep } from '../helpers/async-helpers';
12import { getPlan } from '../helpers/plan-helpers'; 13import { getPlan } from '../helpers/plan-helpers';
13import { PLANS } from '../config'; 14import { PLANS } from '../config';
15import { TODOS_PARTITION_ID } from '../features/todos';
16
17const { session } = remote;
14 18
15const debug = require('debug')('Ferdi:UserStore'); 19const debug = require('debug')('Ferdi:UserStore');
16 20
@@ -28,6 +32,8 @@ export default class UserStore extends Store {
28 32
29 PRICING_ROUTE = `${this.BASE_ROUTE}/signup/pricing`; 33 PRICING_ROUTE = `${this.BASE_ROUTE}/signup/pricing`;
30 34
35 SETUP_ROUTE = `${this.BASE_ROUTE}/signup/setup`;
36
31 IMPORT_ROUTE = `${this.BASE_ROUTE}/signup/import`; 37 IMPORT_ROUTE = `${this.BASE_ROUTE}/signup/import`;
32 38
33 INVITE_ROUTE = `${this.BASE_ROUTE}/signup/invite`; 39 INVITE_ROUTE = `${this.BASE_ROUTE}/signup/invite`;
@@ -127,6 +133,10 @@ export default class UserStore extends Store {
127 return this.PRICING_ROUTE; 133 return this.PRICING_ROUTE;
128 } 134 }
129 135
136 get setupRoute() {
137 return this.SETUP_ROUTE;
138 }
139
130 get inviteRoute() { 140 get inviteRoute() {
131 return this.INVITE_ROUTE; 141 return this.INVITE_ROUTE;
132 } 142 }
@@ -227,7 +237,7 @@ export default class UserStore extends Store {
227 237
228 this._setUserData(authToken); 238 this._setUserData(authToken);
229 239
230 this.stores.router.push('/'); 240 this.stores.router.push(this.SETUP_ROUTE);
231 } 241 }
232 242
233 @action async _retrievePassword({ email }) { 243 @action async _retrievePassword({ email }) {
@@ -285,6 +295,13 @@ export default class UserStore extends Store {
285 295
286 this.getUserInfoRequest.invalidate().reset(); 296 this.getUserInfoRequest.invalidate().reset();
287 this.authToken = null; 297 this.authToken = null;
298
299 this.stores.services.allServicesRequest.invalidate().reset();
300
301 if (this.stores.todos.isTodosEnabled) {
302 const sess = session.fromPartition(TODOS_PARTITION_ID);
303 sess.clearStorageData();
304 }
288 } 305 }
289 306
290 @action async _importLegacyServices({ services }) { 307 @action async _importLegacyServices({ services }) {
diff --git a/src/styles/auth.scss b/src/styles/auth.scss
index 3efecf324..aee255196 100644
--- a/src/styles/auth.scss
+++ b/src/styles/auth.scss
@@ -130,7 +130,7 @@
130 img { width: 65px; } 130 img { width: 65px; }
131 } 131 }
132 132
133 .auth__letter { margin-bottom: 30px; } 133 .auth__letter { margin-bottom: 30px; text-align: left; }
134 .scroll-container { z-index: 10; } 134 .scroll-container { z-index: 10; }
135 .info-bar { position: absolute; } 135 .info-bar { position: absolute; }
136 136
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index b1e163421..ecc305193 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -39,6 +39,11 @@ html { overflow: hidden; }
39 color: $theme-brand-primary; 39 color: $theme-brand-primary;
40 } 40 }
41 41
42 &:disabled {
43 opacity: 0.25;
44 filter: grayscale(1);
45 }
46
42 .update-available { 47 .update-available {
43 align-items: center; 48 align-items: center;
44 background: $theme-brand-danger; 49 background: $theme-brand-danger;
diff --git a/src/styles/services.scss b/src/styles/services.scss
index ef1097791..8b8c27e10 100644
--- a/src/styles/services.scss
+++ b/src/styles/services.scss
@@ -7,7 +7,7 @@
7 7
8 .services__webview, 8 .services__webview,
9 .services__info-layer { 9 .services__info-layer {
10 webview { background: $dark-theme-gray-darkest; } 10 // webview { background: $dark-theme-gray-darkest; }
11 } 11 }
12 12
13 .services__no-service, 13 .services__no-service,
@@ -48,6 +48,8 @@
48 } 48 }
49 49
50 &--force-repaint webview { z-index: 5; } 50 &--force-repaint webview { z-index: 5; }
51
52 &.is-loading webview { background: #FFF }
51 } 53 }
52 54
53 .services__no-service, 55 .services__no-service,
diff --git a/src/webview/contextMenu.js b/src/webview/contextMenu.js
index d04f90830..679bf5aaa 100644
--- a/src/webview/contextMenu.js
+++ b/src/webview/contextMenu.js
@@ -3,12 +3,18 @@ import ContextMenuBuilder from './contextMenuBuilder';
3 3
4const webContents = remote.getCurrentWebContents(); 4const webContents = remote.getCurrentWebContents();
5 5
6export default async function setupContextMenu() { 6export default async function setupContextMenu(isSpellcheckEnabled, getDefaultSpellcheckerLanguage, getSpellcheckerLanguage) {
7 const contextMenuBuilder = new ContextMenuBuilder( 7 const contextMenuBuilder = new ContextMenuBuilder(
8 webContents, 8 webContents,
9 ); 9 );
10 10
11 webContents.on('context-menu', (event, params) => { 11 webContents.on('context-menu', (e, props) => {
12 contextMenuBuilder.showPopupMenu(params); 12 // TODO?: e.preventDefault();
13 contextMenuBuilder.showPopupMenu(
14 props,
15 isSpellcheckEnabled(),
16 getDefaultSpellcheckerLanguage(),
17 getSpellcheckerLanguage(),
18 );
13 }); 19 });
14} 20}
diff --git a/src/webview/contextMenuBuilder.js b/src/webview/contextMenuBuilder.js
index 8adc3b432..d99dd6739 100644
--- a/src/webview/contextMenuBuilder.js
+++ b/src/webview/contextMenuBuilder.js
@@ -21,19 +21,19 @@ function matchesWord(string) {
21} 21}
22 22
23const contextMenuStringTable = { 23const contextMenuStringTable = {
24 copyMail: () => 'Copy Email Address',
25 copyLinkUrl: () => 'Copy Link',
26 openLinkUrl: () => 'Open Link',
27 copyImageUrl: () => 'Copy Image URL',
28 copyImage: () => 'Copy Image',
29 addToDictionary: () => 'Add to Dictionary',
30 lookUpDefinition: ({ word }) => `Look Up "${word}"`, 24 lookUpDefinition: ({ word }) => `Look Up "${word}"`,
31 searchGoogle: () => 'Search with Google',
32 cut: () => 'Cut', 25 cut: () => 'Cut',
33 copy: () => 'Copy', 26 copy: () => 'Copy',
34 paste: () => 'Paste', 27 paste: () => 'Paste',
35 inspectElement: () => 'Inspect Element', 28 searchGoogle: () => 'Search with Google',
29 openLinkUrl: () => 'Open Link',
30 copyLinkUrl: () => 'Copy Link',
31 copyImageUrl: () => 'Copy Image Address',
32 copyImage: () => 'Copy Image',
33 addToDictionary: () => 'Add to Dictionary',
36 goToHomePage: () => 'Go to Home Page', 34 goToHomePage: () => 'Go to Home Page',
35 copyMail: () => 'Copy Email Address',
36 inspectElement: () => 'Inspect Element',
37}; 37};
38 38
39/** 39/**
@@ -225,13 +225,13 @@ module.exports = class ContextMenuBuilder {
225 * if so, adds suggested spellings as individual menu items. 225 * if so, adds suggested spellings as individual menu items.
226 */ 226 */
227 addSpellingItems(menu, menuInfo) { 227 addSpellingItems(menu, menuInfo) {
228 const target = this.getWebContents(); 228 const webContents = this.getWebContents();
229 // Add each spelling suggestion 229 // Add each spelling suggestion
230 for (const suggestion of menuInfo.dictionarySuggestions) { 230 for (const suggestion of menuInfo.dictionarySuggestions) {
231 menu.append(new MenuItem({ 231 menu.append(new MenuItem({
232 label: suggestion, 232 label: suggestion,
233 // eslint-disable-next-line no-loop-func 233 // eslint-disable-next-line no-loop-func
234 click: () => target.replaceMisspelling(suggestion), 234 click: () => webContents.replaceMisspelling(suggestion),
235 })); 235 }));
236 } 236 }
237 237
@@ -240,7 +240,7 @@ module.exports = class ContextMenuBuilder {
240 menu.append( 240 menu.append(
241 new MenuItem({ 241 new MenuItem({
242 label: 'Add to dictionary', 242 label: 'Add to dictionary',
243 click: () => target.session.addWordToSpellCheckerDictionary(menuInfo.misspelledWord), 243 click: () => webContents.session.addWordToSpellCheckerDictionary(menuInfo.misspelledWord),
244 }), 244 }),
245 ); 245 );
246 } 246 }
@@ -262,11 +262,11 @@ module.exports = class ContextMenuBuilder {
262 } 262 }
263 263
264 if (process.platform === 'darwin') { 264 if (process.platform === 'darwin') {
265 const target = this.getWebContents(); 265 const webContents = this.getWebContents();
266 266
267 const lookUpDefinition = new MenuItem({ 267 const lookUpDefinition = new MenuItem({
268 label: this.stringTable.lookUpDefinition({ word: menuInfo.selectionText.trim() }), 268 label: this.stringTable.lookUpDefinition({ word: menuInfo.selectionText.trim() }),
269 click: () => target.showDefinitionForSelection(), 269 click: () => webContents.showDefinitionForSelection(),
270 }); 270 });
271 271
272 menu.append(lookUpDefinition); 272 menu.append(lookUpDefinition);
@@ -316,12 +316,12 @@ module.exports = class ContextMenuBuilder {
316 * Adds the Cut menu item 316 * Adds the Cut menu item
317 */ 317 */
318 addCut(menu, menuInfo) { 318 addCut(menu, menuInfo) {
319 const target = this.getWebContents(); 319 const webContents = this.getWebContents();
320 menu.append(new MenuItem({ 320 menu.append(new MenuItem({
321 label: this.stringTable.cut(), 321 label: this.stringTable.cut(),
322 accelerator: 'CommandOrControl+X', 322 accelerator: 'CommandOrControl+X',
323 enabled: menuInfo.editFlags.canCut, 323 enabled: menuInfo.editFlags.canCut,
324 click: () => target.cut(), 324 click: () => webContents.cut(),
325 })); 325 }));
326 326
327 return menu; 327 return menu;
@@ -331,12 +331,12 @@ module.exports = class ContextMenuBuilder {
331 * Adds the Copy menu item. 331 * Adds the Copy menu item.
332 */ 332 */
333 addCopy(menu, menuInfo) { 333 addCopy(menu, menuInfo) {
334 const target = this.getWebContents(); 334 const webContents = this.getWebContents();
335 menu.append(new MenuItem({ 335 menu.append(new MenuItem({
336 label: this.stringTable.copy(), 336 label: this.stringTable.copy(),
337 accelerator: 'CommandOrControl+C', 337 accelerator: 'CommandOrControl+C',
338 enabled: menuInfo.editFlags.canCopy, 338 enabled: menuInfo.editFlags.canCopy,
339 click: () => target.copy(), 339 click: () => webContents.copy(),
340 })); 340 }));
341 341
342 return menu; 342 return menu;
@@ -346,12 +346,12 @@ module.exports = class ContextMenuBuilder {
346 * Adds the Paste menu item. 346 * Adds the Paste menu item.
347 */ 347 */
348 addPaste(menu, menuInfo) { 348 addPaste(menu, menuInfo) {
349 const target = this.getWebContents(); 349 const webContents = this.getWebContents();
350 menu.append(new MenuItem({ 350 menu.append(new MenuItem({
351 label: this.stringTable.paste(), 351 label: this.stringTable.paste(),
352 accelerator: 'CommandOrControl+V', 352 accelerator: 'CommandOrControl+V',
353 enabled: menuInfo.editFlags.canPaste, 353 enabled: menuInfo.editFlags.canPaste,
354 click: () => target.paste(), 354 click: () => webContents.paste(),
355 })); 355 }));
356 356
357 return menu; 357 return menu;
@@ -363,12 +363,12 @@ module.exports = class ContextMenuBuilder {
363 && !menuInfo.linkText 363 && !menuInfo.linkText
364 && !menuInfo.hasImageContents 364 && !menuInfo.hasImageContents
365 ) { 365 ) {
366 const target = this.getWebContents(); 366 const webContents = this.getWebContents();
367 menu.append( 367 menu.append(
368 new MenuItem({ 368 new MenuItem({
369 label: 'Paste as plain text', 369 label: 'Paste as plain text',
370 accelerator: 'CommandOrControl+Shift+V', 370 accelerator: 'CommandOrControl+Shift+V',
371 click: () => target.pasteAndMatchStyle(), 371 click: () => webContents.pasteAndMatchStyle(),
372 }), 372 }),
373 ); 373 );
374 } 374 }
@@ -386,13 +386,13 @@ module.exports = class ContextMenuBuilder {
386 * Adds the "Inspect Element" menu item. 386 * Adds the "Inspect Element" menu item.
387 */ 387 */
388 addInspectElement(menu, menuInfo, needsSeparator = true) { 388 addInspectElement(menu, menuInfo, needsSeparator = true) {
389 const target = this.getWebContents(); 389 const webContents = this.getWebContents();
390 if (!this.debugMode) return menu; 390 if (!this.debugMode) return menu;
391 if (needsSeparator) this.addSeparator(menu); 391 if (needsSeparator) this.addSeparator(menu);
392 392
393 const inspect = new MenuItem({ 393 const inspect = new MenuItem({
394 label: this.stringTable.inspectElement(), 394 label: this.stringTable.inspectElement(),
395 click: () => target.inspectElement(menuInfo.x, menuInfo.y), 395 click: () => webContents.inspectElement(menuInfo.x, menuInfo.y),
396 }); 396 });
397 397
398 menu.append(inspect); 398 menu.append(inspect);
@@ -436,7 +436,7 @@ module.exports = class ContextMenuBuilder {
436 accelerator: 'CommandOrControl+Home', 436 accelerator: 'CommandOrControl+Home',
437 enabled: true, 437 enabled: true,
438 click: () => { 438 click: () => {
439 // target.loadURL(baseURL.origin); 439 // webContents.loadURL(baseURL.origin);
440 window.location.href = baseURL.origin; 440 window.location.href = baseURL.origin;
441 }, 441 },
442 })); 442 }));
diff --git a/src/webview/recipe.js b/src/webview/recipe.js
index 675f8e311..d29f3edbd 100644
--- a/src/webview/recipe.js
+++ b/src/webview/recipe.js
@@ -3,7 +3,6 @@ import { ipcRenderer, remote, desktopCapturer } from 'electron';
3import path from 'path'; 3import path from 'path';
4import { autorun, computed, observable } from 'mobx'; 4import { autorun, computed, observable } from 'mobx';
5import fs from 'fs-extra'; 5import fs from 'fs-extra';
6import { loadModule } from 'cld3-asm';
7import { debounce } from 'lodash'; 6import { debounce } from 'lodash';
8import { FindInPage } from 'electron-find'; 7import { FindInPage } from 'electron-find';
9 8
@@ -23,8 +22,9 @@ import customDarkModeCss from './darkmode/custom';
23import RecipeWebview from './lib/RecipeWebview'; 22import RecipeWebview from './lib/RecipeWebview';
24import Userscript from './lib/Userscript'; 23import Userscript from './lib/Userscript';
25 24
26import spellchecker, { switchDict, disable as disableSpellchecker, getSpellcheckerLocaleByFuzzyIdentifier } from './spellchecker'; 25import { switchDict, getSpellcheckerLocaleByFuzzyIdentifier } from './spellchecker';
27import { injectDarkModeStyle, isDarkModeStyleInjected, removeDarkModeStyle } from './darkmode'; 26import { injectDarkModeStyle, isDarkModeStyleInjected, removeDarkModeStyle } from './darkmode';
27import contextMenu from './contextMenu';
28import './notifications'; 28import './notifications';
29 29
30import { DEFAULT_APP_SETTINGS } from '../config'; 30import { DEFAULT_APP_SETTINGS } from '../config';
@@ -156,7 +156,14 @@ class RecipeController {
156 156
157 debug('Send "hello" to host'); 157 debug('Send "hello" to host');
158 setTimeout(() => ipcRenderer.sendToHost('hello'), 100); 158 setTimeout(() => ipcRenderer.sendToHost('hello'), 100);
159 await spellchecker(); 159
160 this.spellcheckingProvider = null;
161 contextMenu(
162 () => this.settings.app.enableSpellchecking,
163 () => this.settings.app.spellcheckerLanguage,
164 () => this.spellcheckerLanguage,
165 );
166
160 autorun(() => this.update()); 167 autorun(() => this.update());
161 168
162 document.addEventListener('DOMContentLoaded', () => { 169 document.addEventListener('DOMContentLoaded', () => {
@@ -240,22 +247,15 @@ class RecipeController {
240 247
241 if (this.settings.app.enableSpellchecking) { 248 if (this.settings.app.enableSpellchecking) {
242 debug('Setting spellchecker language to', this.spellcheckerLanguage); 249 debug('Setting spellchecker language to', this.spellcheckerLanguage);
243 const { spellcheckerLanguage } = this; 250 let { spellcheckerLanguage } = this;
244 if (spellcheckerLanguage.includes('automatic')) { 251 if (spellcheckerLanguage.includes('automatic')) {
245 this.automaticLanguageDetection(); 252 this.automaticLanguageDetection();
246 debug('Found `automatic` locale, falling back to user locale until detected', this.settings.app.locale); 253 debug('Found `automatic` locale, falling back to user locale until detected', this.settings.app.locale);
247 spellcheckerLanguage.push(this.settings.app.locale); 254 spellcheckerLanguage = this.settings.app.locale;
248 } else if (this.cldIdentifier) {
249 this.cldIdentifier.destroy();
250 } 255 }
251 switchDict(spellcheckerLanguage); 256 switchDict(spellcheckerLanguage);
252 } else { 257 } else {
253 debug('Disable spellchecker'); 258 debug('Disable spellchecker');
254 disableSpellchecker();
255
256 if (this.cldIdentifier) {
257 this.cldIdentifier.destroy();
258 }
259 } 259 }
260 260
261 if (!this.recipe) { 261 if (!this.recipe) {
@@ -366,10 +366,7 @@ class RecipeController {
366 } 366 }
367 367
368 async automaticLanguageDetection() { 368 async automaticLanguageDetection() {
369 const cldFactory = await loadModule(); 369 window.addEventListener('keyup', debounce(async (e) => {
370 this.cldIdentifier = cldFactory.create(0, 1000);
371
372 window.addEventListener('keyup', debounce((e) => {
373 const element = e.target; 370 const element = e.target;
374 371
375 if (!element) return; 372 if (!element) return;
@@ -382,22 +379,15 @@ class RecipeController {
382 } 379 }
383 380
384 // Force a minimum length to get better detection results 381 // Force a minimum length to get better detection results
385 if (value.length < 30) return; 382 if (value.length < 25) return;
386 383
387 debug('Detecting language for', value); 384 debug('Detecting language for', value);
388 const findResult = this.cldIdentifier.findLanguage(value); 385 const locale = await ipcRenderer.invoke('detect-language', { sample: value });
389 386
390 debug('Language detection result', findResult); 387 const spellcheckerLocale = getSpellcheckerLocaleByFuzzyIdentifier(locale);
391 388 debug('Language detected reliably, setting spellchecker language to', spellcheckerLocale);
392 if (findResult.is_reliable) { 389 if (spellcheckerLocale) {
393 const spellcheckerLocale = getSpellcheckerLocaleByFuzzyIdentifier(findResult.language); 390 switchDict(spellcheckerLocale);
394 debug('Language detected reliably, setting spellchecker language to', spellcheckerLocale);
395 if (spellcheckerLocale) {
396 switchDict([
397 ...this.spellcheckerLanguage,
398 spellcheckerLocale,
399 ]);
400 }
401 } 391 }
402 }, 225)); 392 }, 225));
403 } 393 }
@@ -411,7 +401,8 @@ new RecipeController();
411const originalWindowOpen = window.open; 401const originalWindowOpen = window.open;
412 402
413window.open = (url, frameName, features) => { 403window.open = (url, frameName, features) => {
414 if (!url && !frameName && !features) { 404 debug('window.open', url, frameName, features);
405 if (!url) {
415 // The service hasn't yet supplied a URL (as used in Skype). 406 // The service hasn't yet supplied a URL (as used in Skype).
416 // Return a new dummy window object and wait for the service to change the properties 407 // Return a new dummy window object and wait for the service to change the properties
417 const newWindow = { 408 const newWindow = {
@@ -423,8 +414,12 @@ window.open = (url, frameName, features) => {
423 const checkInterval = setInterval(() => { 414 const checkInterval = setInterval(() => {
424 // Has the service changed the URL yet? 415 // Has the service changed the URL yet?
425 if (newWindow.location.href !== '') { 416 if (newWindow.location.href !== '') {
426 // Open the new URL 417 if (features) {
427 ipcRenderer.sendToHost('new-window', newWindow.location.href); 418 originalWindowOpen(newWindow.location.href, frameName, features);
419 } else {
420 // Open the new URL
421 ipcRenderer.sendToHost('new-window', newWindow.location.href);
422 }
428 clearInterval(checkInterval); 423 clearInterval(checkInterval);
429 } 424 }
430 }, 0); 425 }, 0);
diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js
index 287c9cf11..e7ef102e9 100644
--- a/src/webview/spellchecker.js
+++ b/src/webview/spellchecker.js
@@ -1,64 +1,41 @@
1import { webFrame } from 'electron'; 1import {
2 remote,
3} from 'electron';
2import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 4import { SPELLCHECKER_LOCALES } from '../i18n/languages';
3import setupContextMenu from './contextMenu'; 5import { isMac } from '../environment';
4 6
5const debug = require('debug')('Franz:spellchecker'); 7const debug = require('debug')('Franz:spellchecker');
6 8
7let _isEnabled = false; 9const webContents = remote.getCurrentWebContents();
10const [defaultLocale] = webContents.session.getSpellCheckerLanguages();
11debug('Spellchecker default locale is', defaultLocale);
8 12
9export async function switchDict(locales) { 13export function getSpellcheckerLocaleByFuzzyIdentifier(identifier) {
10 const { platform } = process; 14 const locales = Object.keys(SPELLCHECKER_LOCALES).filter(key => key.toLocaleLowerCase() === identifier.toLowerCase() || key.split('-')[0] === identifier.toLowerCase());
11 if (platform === 'darwin') {
12 // MacOS uses the build-in languages which cannot be changed
13 return;
14 }
15
16 try {
17 debug('Trying to load dictionary', locales);
18
19 webFrame.session.setSpellCheckerLanguages([...locales, 'en-US']);
20
21 debug('Switched dictionary to', locales);
22
23 _isEnabled = true;
24 } catch (err) {
25 console.error(err);
26 }
27}
28
29export default async function initialize(languages = ['en-us']) {
30 try {
31 debug('Init spellchecker');
32
33 switchDict([
34 navigator.language,
35 ...languages,
36 ]);
37 setupContextMenu();
38 15
39 return true; 16 if (locales.length >= 1) {
40 } catch (err) { 17 return locales[0];
41 console.error(err);
42 return false;
43 } 18 }
44}
45 19
46export function isEnabled() { 20 return null;
47 return _isEnabled;
48} 21}
49 22
50export function disable() { 23export function switchDict(locale) {
51 if (isEnabled()) { 24 if (isMac) {
52 // TODO: How to disable build-in spellchecker? 25 debug('Ignoring dictionary changes on macOS');
26 return;
53 } 27 }
54}
55 28
56export function getSpellcheckerLocaleByFuzzyIdentifier(identifier) { 29 debug('Setting spellchecker locale to', locale);
57 const locales = Object.keys(SPELLCHECKER_LOCALES).filter(key => key === identifier.toLowerCase() || key.split('-')[0] === identifier.toLowerCase());
58 30
59 if (locales.length >= 1) { 31 const locales = [];
60 return locales[0]; 32 const foundLocale = getSpellcheckerLocaleByFuzzyIdentifier(locale);
33
34 if (foundLocale) {
35 locales.push(foundLocale);
61 } 36 }
62 37
63 return null; 38 locales.push(defaultLocale, 'de');
39
40 webContents.session.setSpellCheckerLanguages(locales);
64} 41}
diff --git a/tsconfig.settings.json b/tsconfig.settings.json
index 19d0906d9..ccd0927ab 100644
--- a/tsconfig.settings.json
+++ b/tsconfig.settings.json
@@ -1,7 +1,7 @@
1{ 1{
2 "compilerOptions": { 2 "compilerOptions": {
3 "baseUrl": ".", 3 "baseUrl": ".",
4 "target": "es5", 4 "target": "esnext",
5 "module": "commonjs", 5 "module": "commonjs",
6 "lib": [ 6 "lib": [
7 "es2015", 7 "es2015",
diff --git a/uidev/src/app.tsx b/uidev/src/app.tsx
index cef22e7a7..593019c35 100644
--- a/uidev/src/app.tsx
+++ b/uidev/src/app.tsx
@@ -15,6 +15,7 @@ import './stories/infobox.stories';
15import './stories/input.stories'; 15import './stories/input.stories';
16import './stories/loader.stories'; 16import './stories/loader.stories';
17import './stories/select.stories'; 17import './stories/select.stories';
18import './stories/textarea.stories';
18import './stories/toggle.stories'; 19import './stories/toggle.stories';
19 20
20import { store } from './stores'; 21import { store } from './stores';
diff --git a/uidev/src/stories/textarea.stories.tsx b/uidev/src/stories/textarea.stories.tsx
new file mode 100644
index 000000000..c2dd74e24
--- /dev/null
+++ b/uidev/src/stories/textarea.stories.tsx
@@ -0,0 +1,43 @@
1import React from 'react';
2import uuid from 'uuid/v4';
3
4import { Textarea } from '@meetfranz/forms';
5import { storiesOf } from '../stores/stories';
6
7const defaultProps = () => {
8 const id = uuid();
9 return {
10 label: 'Label',
11 id: `test-${id}`,
12 name: `test-${id}`,
13 rows: 5,
14 onChange: (e: React.ChangeEvent<HTMLInputElement>) => console.log('changed event', e),
15 };
16};
17
18storiesOf('Textarea')
19 .add('Basic', () => (
20 <Textarea
21 {...defaultProps()}
22 // placeholder="Placeholder text"
23 />
24 ))
25 .add('10 rows', () => (
26 <Textarea
27 {...defaultProps()}
28 rows={10}
29 />
30 ))
31 .add('With error', () => (
32 <Textarea
33 {...defaultProps()}
34 error="This is a generic error message."
35 />
36 ))
37 .add('Disabled', () => (
38 <Textarea
39 {...defaultProps()}
40 rows={2}
41 disabled
42 />
43 ));