Compare commits
50 commits
t3chguy/de
...
develop
Author | SHA1 | Date | |
---|---|---|---|
|
7073fb2faf | ||
|
6e8f0f6f6d | ||
|
627377229c | ||
|
3153f8862a | ||
|
6efd8a4642 | ||
|
3080c97007 | ||
|
380ab17932 | ||
|
1424314f12 | ||
|
446a4c87b6 | ||
|
d5f4b1bc86 | ||
|
bc45415513 | ||
|
4b8ed0f16f | ||
|
26ac7462fd | ||
|
25d05f8ab2 | ||
|
676547e54c | ||
|
03a6b59eb5 | ||
|
c9aa0ceb00 | ||
|
59e526e318 | ||
|
31345ddd36 | ||
|
88ddf05930 | ||
|
5a1b38cd74 | ||
|
dd17436eb0 | ||
|
334d268555 | ||
|
d6e3be31d8 | ||
|
af144e28d8 | ||
|
98568bd2ad | ||
|
95f3d3c2b7 | ||
|
6af3afa6fb | ||
|
a177fef95b | ||
|
dc72285f6f | ||
|
054484bc42 | ||
|
8568578095 | ||
|
260eec2fb7 | ||
|
939ddbbee3 | ||
|
4ec06daf3e | ||
|
d43767dfa8 | ||
|
971d6736a3 | ||
|
9f9e56c008 | ||
|
e4d2edb624 | ||
|
75e7fd5e87 | ||
|
2f88b3d1fd | ||
|
cffdaa6281 | ||
|
916b883de1 | ||
|
45410dc883 | ||
|
0b21ba0a27 | ||
|
085294d7b5 | ||
|
f22d719d38 | ||
|
df53ba6d3a | ||
|
d3f0af6fd1 | ||
|
9f27685a54 |
8
.github/workflows/dockerhub.yaml
vendored
|
@ -37,15 +37,15 @@ jobs:
|
|||
run: ${{ matrix.prepare }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v3
|
||||
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v3
|
||||
uses: docker/setup-buildx-action@aa33708b10e362ff993539393ff100fa93ed6a27 # v3
|
||||
with:
|
||||
install: true
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3
|
||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
@ -65,7 +65,7 @@ jobs:
|
|||
|
||||
- name: Build and push
|
||||
id: build-and-push
|
||||
uses: docker/build-push-action@1a162644f9a7e87d8f4b053101d1d9a712edc18c # v6
|
||||
uses: docker/build-push-action@5176d81f87c23d6fc96624dfdbcd9f3830bbe445 # v6
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
|
|
4
.github/workflows/triage-labelled.yml
vendored
|
@ -60,7 +60,7 @@ jobs:
|
|||
contains(github.event.issue.labels.*.name, 'X-Needs-Info')
|
||||
steps:
|
||||
- id: add_to_project
|
||||
uses: actions/add-to-project@v1.0.1
|
||||
uses: actions/add-to-project@v1.0.2
|
||||
with:
|
||||
project-url: ${{ env.PROJECT_URL }}
|
||||
github-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
@ -83,7 +83,7 @@ jobs:
|
|||
contains(github.event.issue.labels.*.name, 'Z-Flaky-Test')
|
||||
steps:
|
||||
- id: add_to_project
|
||||
uses: actions/add-to-project@v1.0.1
|
||||
uses: actions/add-to-project@v1.0.2
|
||||
with:
|
||||
project-url: ${{ env.PROJECT_URL }}
|
||||
github-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
|
4
.husky/pre-commit
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx lint-staged --concurrent false
|
7
.lintstagedrc
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"*": "prettier --write",
|
||||
"src/**/*.(ts|tsx)": ["eslint --fix"],
|
||||
"scripts/**/*.(ts|tsx)": ["eslint --fix"],
|
||||
"module_system/**/*.(ts|tsx)": ["eslint --fix --config .eslintrc-module_system.js module_system"],
|
||||
"*.pcss": ["stylelint --fix"]
|
||||
}
|
18
README.md
|
@ -17,20 +17,30 @@ React SDK](https://github.com/matrix-org/matrix-react-sdk).
|
|||
Element has several tiers of support for different environments:
|
||||
|
||||
- Supported
|
||||
- Definition: Issues **actively triaged**, regressions **block** the release
|
||||
- Definition:
|
||||
- Issues **actively triaged**, regressions **block** the release
|
||||
- Last 2 major versions of Chrome, Firefox, and Edge on desktop OSes
|
||||
- Last 2 versions of Safari
|
||||
- Latest release of official Element Desktop app on desktop OSes
|
||||
- Desktop OSes means macOS, Windows, and Linux versions for desktop devices
|
||||
that are actively supported by the OS vendor and receive security updates
|
||||
- Experimental
|
||||
- Definition: Issues **accepted**, regressions **do not block** the release
|
||||
- Element as an installed PWA via current stable version of Chrome
|
||||
- Best effort
|
||||
- Definition:
|
||||
- Issues **accepted**, regressions **do not block** the release
|
||||
- The wider Element Products(including Element Call and the Enterprise Server Suite) do still not officially support these browsers.
|
||||
- The element web project and its contributors should keep the client functioning and gracefully degrade where other sibling features (E.g. Element Call) may not function.
|
||||
- Last major release of Firefox ESR and Chrome/Edge Extended Stable
|
||||
- Community Supported
|
||||
- Definition:
|
||||
- Issues **accepted**, regressions **do not block** the release
|
||||
- Community contributions are welcome to support these issues
|
||||
- Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS
|
||||
- Not supported
|
||||
- Definition: Issues only affecting unsupported environments are **closed**
|
||||
- Everything else
|
||||
|
||||
The period of support for these tiers should last until the releases specified above, plus 1 app release cycle(2 weeks). In the case of Firefox ESR this is extended further to allow it land in Debian Stable.
|
||||
|
||||
For accessing Element on an Android or iOS device, we currently recommend the
|
||||
native apps [element-android](https://github.com/element-hq/element-android)
|
||||
and [element-ios](https://github.com/element-hq/element-ios).
|
||||
|
|
|
@ -10,15 +10,15 @@ module.exports = {
|
|||
"last 2 Safari versions",
|
||||
"last 2 Edge versions",
|
||||
],
|
||||
include: ["@babel/plugin-transform-class-properties"],
|
||||
},
|
||||
],
|
||||
"@babel/preset-typescript",
|
||||
["@babel/preset-typescript", { allowDeclareFields: true }],
|
||||
"@babel/preset-react",
|
||||
],
|
||||
plugins: [
|
||||
"@babel/plugin-proposal-export-default-from",
|
||||
"@babel/plugin-transform-numeric-separator",
|
||||
"@babel/plugin-transform-class-properties",
|
||||
"@babel/plugin-transform-object-rest-spread",
|
||||
"@babel/plugin-transform-optional-chaining",
|
||||
"@babel/plugin-transform-nullish-coalescing-operator",
|
||||
|
|
|
@ -167,6 +167,10 @@ Starting with `desktop_builds`, the following subproperties are available:
|
|||
1. `available`: Required. When `true`, the desktop app can be downloaded from somewhere.
|
||||
2. `logo`: Required. A URL to a logo (SVG), intended to be shown at 24x24 pixels.
|
||||
3. `url`: Required. The download URL for the app. This is used as a hyperlink.
|
||||
4. `url_macos`: Optional. Direct link to download macOS desktop app.
|
||||
5. `url_win32`: Optional. Direct link to download Windows 32-bit desktop app.
|
||||
6. `url_win64`: Optional. Direct link to download Windows 64-bit desktop app.
|
||||
7. `url_linux`: Optional. Direct link to download Linux desktop app.
|
||||
|
||||
When `desktop_builds` is not specified at all, the app will assume desktop downloads are available from https://element.io
|
||||
|
||||
|
|
25
package.json
|
@ -68,10 +68,17 @@
|
|||
},
|
||||
"resolutions": {
|
||||
"@types/react-dom": "17.0.25",
|
||||
"@types/react": "17.0.80"
|
||||
"@types/react": "17.0.80",
|
||||
"@vector-im/compound-design-tokens": "1.7.0",
|
||||
"@vector-im/compound-web": "5.5.0",
|
||||
"@floating-ui/react": "0.26.11",
|
||||
"@radix-ui/react-id": "1.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@formatjs/intl-segmenter": "^11.5.7",
|
||||
"@matrix-org/react-sdk-module-api": "^2.3.0",
|
||||
"@vector-im/compound-design-tokens": "^1.6.1",
|
||||
"@vector-im/compound-web": "^5.5.0",
|
||||
"jsrsasign": "^11.0.0",
|
||||
"katex": "^0.16.0",
|
||||
"lodash": "^4.17.21",
|
||||
|
@ -102,7 +109,7 @@
|
|||
"@babel/preset-typescript": "^7.12.7",
|
||||
"@babel/register": "^7.12.10",
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@casualbot/jest-sonar-reporter": "2.2.7",
|
||||
"@casualbot/jest-sonar-reporter": "2.3.1",
|
||||
"@principalstudio/html-webpack-inject-preload": "^1.2.7",
|
||||
"@sentry/webpack-plugin": "^2.7.1",
|
||||
"@svgr/webpack": "^8.0.0",
|
||||
|
@ -162,29 +169,31 @@
|
|||
"fetch-mock-jest": "^1.5.1",
|
||||
"file-loader": "^6.0.0",
|
||||
"html-webpack-plugin": "^5.5.3",
|
||||
"husky": "^8.0.3",
|
||||
"jest": "^29.0.0",
|
||||
"jest-canvas-mock": "2.5.2",
|
||||
"jest-environment-jsdom": "^29.0.0",
|
||||
"jest-mock": "^29.0.0",
|
||||
"jest-raw-loader": "^1.0.1",
|
||||
"lint-staged": "^15.1.0",
|
||||
"matrix-mock-request": "^2.5.0",
|
||||
"matrix-web-i18n": "^3.2.1",
|
||||
"mini-css-extract-plugin": "2.8.0",
|
||||
"mini-css-extract-plugin": "2.9.0",
|
||||
"minimist": "^1.2.6",
|
||||
"mkdirp": "^3.0.0",
|
||||
"modernizr": "^3.12.0",
|
||||
"node-fetch": "^2.6.7",
|
||||
"postcss": "8.4.33",
|
||||
"postcss": "8.4.38",
|
||||
"postcss-easings": "^4.0.0",
|
||||
"postcss-hexrgba": "2.1.0",
|
||||
"postcss-import": "16.0.0",
|
||||
"postcss-loader": "8.1.0",
|
||||
"postcss-import": "16.1.0",
|
||||
"postcss-loader": "8.1.1",
|
||||
"postcss-mixins": "^10.0.0",
|
||||
"postcss-nested": "^6.0.0",
|
||||
"postcss-preset-env": "^9.5.14",
|
||||
"postcss-scss": "^4.0.4",
|
||||
"postcss-simple-vars": "^7.0.1",
|
||||
"prettier": "3.3.2",
|
||||
"prettier": "3.3.3",
|
||||
"process": "^0.11.10",
|
||||
"raw-loader": "^4.0.2",
|
||||
"rimraf": "^6.0.0",
|
||||
|
@ -197,7 +206,7 @@
|
|||
"terser-webpack-plugin": "^5.3.9",
|
||||
"ts-node": "^10.9.1",
|
||||
"ts-prune": "^0.10.3",
|
||||
"typescript": "5.5.3",
|
||||
"typescript": "5.5.4",
|
||||
"util": "^0.12.5",
|
||||
"webpack": "^5.89.0",
|
||||
"webpack-bundle-analyzer": "^4.8.0",
|
||||
|
|
|
@ -14,94 +14,61 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
/* import font-size variables manually,
|
||||
ideally this file would get loaded by the theme which has all variables in context */
|
||||
@import "../../../node_modules/matrix-react-sdk/res/css/_font-sizes.pcss";
|
||||
|
||||
.mx_ErrorView {
|
||||
background: #c5e0f7;
|
||||
background: -moz-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
|
||||
background: -webkit-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
|
||||
background: linear-gradient(to bottom, #c5e0f7 0%, #ffffff 100%);
|
||||
/* stylelint-disable-next-line function-no-unknown */
|
||||
filter: progid:dximagetransform.microsoft.gradient(startColorstr='#c5e0f7', endColorstr='#ffffff', GradientType=0);
|
||||
--width: 520px;
|
||||
--cpd-separator-inset: calc(50% - (var(--width) / 2));
|
||||
--cpd-separator-spacing: var(--cpd-space-8x);
|
||||
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
|
||||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
color: #000;
|
||||
text-align: center;
|
||||
color: var(--cpd-color-text-primary);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
padding: 0 20px;
|
||||
box-sizing: border-box;
|
||||
overflow: auto;
|
||||
padding: var(--cpd-space-20x);
|
||||
|
||||
background-color: var(--cpd-color-theme-bg);
|
||||
background-image: url("../../themes/element/img/compound/fade-arc-light.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
|
||||
.mx_ErrorView_logo {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.mx_ErrorView_container {
|
||||
max-width: 680px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.mx_Button {
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
font-size: $font-18px;
|
||||
margin-left: 4px;
|
||||
margin-right: 4px;
|
||||
min-width: 80px;
|
||||
background-color: #03b381;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
padding: 12px 22px;
|
||||
word-break: break-word;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.mx_Center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.mx_HomePage_header {
|
||||
color: #2e2f32;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
font-size: $font-16px;
|
||||
h1 {
|
||||
font-size: $font-32px;
|
||||
}
|
||||
h2 {
|
||||
font-size: $font-24px;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.mx_HomePage_col {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.mx_HomePage_row {
|
||||
flex: 1 1 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.mx_HomePage_logo {
|
||||
margin: auto 20px auto 0;
|
||||
max-width: var(--width);
|
||||
margin: 0 auto var(--cpd-space-8x);
|
||||
}
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
font-weight: 600;
|
||||
margin-bottom: 32px;
|
||||
color: var(--cpd-color-text-primary);
|
||||
}
|
||||
|
||||
.mx_Spacer {
|
||||
margin-top: 24px;
|
||||
h2 {
|
||||
margin: var(--cpd-space-8x) 0;
|
||||
/* Workaround for heading sm being broken in Compound design tokens */
|
||||
font-size: var(--cpd-font-size-heading-sm);
|
||||
line-height: var(--cpd-font-line-height-tight);
|
||||
font-weight: var(--cpd-font-weight-semibold);
|
||||
}
|
||||
|
||||
.mx_FooterLink {
|
||||
color: #368bd6;
|
||||
text-decoration: none;
|
||||
p {
|
||||
color: var(--cpd-color-text-secondary);
|
||||
}
|
||||
|
||||
.mx_Flex {
|
||||
margin: 0 auto;
|
||||
max-width: max-content;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
.mx_ErrorView_buttons {
|
||||
margin-top: var(--cpd-space-6x);
|
||||
}
|
||||
}
|
||||
|
|
3
res/themes/element/img/compound/apple.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.4157 2C13.4922 2.92763 13.1763 3.84642 12.535 4.56125C11.9129 5.27979 10.9701 5.69366 9.97726 5.68417C9.91411 4.78324 10.2392 3.89596 10.881 3.21774C11.531 2.53034 12.436 2.09555 13.4157 2ZM16.5554 7.45058C15.4132 8.10257 14.7104 9.25238 14.6932 10.4972C14.6948 11.9055 15.6031 13.1765 17 13.7251C16.7313 14.5354 16.3264 15.3013 15.8001 15.9942C15.0934 16.9759 14.3523 17.935 13.1762 17.9527C12.6168 17.9647 12.2392 17.8153 11.8458 17.6597C11.4354 17.4974 11.0077 17.3282 10.3385 17.3282C9.62875 17.3282 9.18194 17.5028 8.75102 17.6712C8.37862 17.8167 8.01808 17.9576 7.50997 17.9772C6.38987 18.0157 5.53384 16.9294 4.80138 15.9569C3.33741 13.971 2.19745 10.3601 3.72573 7.90322C4.44339 6.70576 5.78524 5.94589 7.26033 5.90164C7.89561 5.8895 8.5052 6.11686 9.03964 6.31619C9.44837 6.46863 9.81314 6.60468 10.1118 6.60468C10.3744 6.60468 10.729 6.474 11.1423 6.32171C11.7932 6.08181 12.5898 5.78827 13.4015 5.86738C14.6627 5.90402 15.8316 6.49076 16.5554 7.45058Z" fill="#1B1D22"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
BIN
res/themes/element/img/compound/fade-arc-light.png
Normal file
After Width: | Height: | Size: 6 KiB |
15
res/themes/element/img/compound/linux.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_4244_203)">
|
||||
<path d="M11.0054 17.2033C10.7192 17.3348 10.4074 17.405 10.0911 17.4096C9.62287 17.4048 9.1673 17.2609 8.78524 16.9971C8.65787 17.3144 8.45841 17.5995 8.20182 17.831C7.94524 18.0626 7.63819 18.2344 7.30371 18.3337C7.34816 18.3337 7.39049 18.3337 7.43494 18.3337H12.4213C12.1196 18.2476 11.8387 18.103 11.5954 17.9088C11.3522 17.7147 11.1515 17.4747 11.0054 17.2033Z" fill="black"/>
|
||||
<path d="M5.59233 13.8942C5.61193 13.8889 5.63053 13.8805 5.64735 13.8694C5.6791 13.5971 5.71508 13.3352 5.7553 13.0856C5.74691 12.9449 5.77002 12.8041 5.82302 12.6731C6.11298 11.0868 6.51722 9.97294 7.07596 9.29637C7.09365 9.27503 7.1193 9.26142 7.14728 9.25851C7.17526 9.25561 7.20328 9.26367 7.22518 9.2809C7.24707 9.29813 7.26104 9.32313 7.26401 9.35041C7.26699 9.37768 7.25873 9.40498 7.24105 9.42631C7.18391 9.49645 7.12676 9.57277 7.07173 9.65322C6.64844 10.272 6.31404 11.2126 6.07277 12.477H6.09816C6.14375 12.4702 6.19014 12.4702 6.23573 12.477C6.40082 12.5121 6.65902 12.6462 7.05692 13.036C7.10771 10.7691 8.44108 8.94158 10.0919 8.94158C11.548 8.94158 12.765 10.371 13.0549 12.2729C13.1926 12.0053 13.4153 11.7882 13.6899 11.654C13.7577 11.6293 13.8293 11.6161 13.9016 11.6149C13.7518 10.9261 13.485 10.2666 13.1121 9.66353C13.0571 9.58308 13.002 9.50676 12.9449 9.43663C12.9357 9.42642 12.9287 9.41445 12.9244 9.40149C12.9201 9.38852 12.9186 9.37484 12.92 9.36128C12.9214 9.34774 12.9256 9.33461 12.9325 9.32273C12.9393 9.31085 12.9486 9.30047 12.9597 9.29224C12.9703 9.28351 12.9826 9.27695 12.9959 9.27294C13.0091 9.26893 13.0232 9.26756 13.0369 9.26891C13.0507 9.27025 13.0641 9.2743 13.0763 9.28078C13.0885 9.28727 13.0992 9.29608 13.1079 9.30668C13.5312 9.82648 13.8825 10.6041 14.145 11.6582C14.7101 11.8644 14.7248 12.7927 14.7375 13.5476C14.7375 13.9065 14.7375 14.2779 14.8243 14.3727C14.9111 14.4676 15.0952 14.447 15.3535 14.3397C15.3831 14.0118 15.3978 13.7209 15.4063 13.4755C15.4063 13.0856 15.4063 12.836 15.4063 12.836V12.574C15.4063 10.5113 12.6846 6.94487 12.6846 6.94487L12.3692 4.26334C12.3692 1.80251 10.0919 1.8252 10.0919 1.8252C10.0919 1.8252 7.80615 1.80251 7.80615 4.25302L7.50138 6.94487C7.50138 6.94487 4.77961 10.5092 4.77961 12.574V12.8319C4.77961 12.8319 4.76902 13.0814 4.77961 13.4713C4.77961 13.5311 4.77961 13.5951 4.77961 13.6611C5.1246 13.7889 5.47804 13.923 5.59233 13.8942ZM10.0813 5.21837C10.7163 5.27613 11.7279 5.42465 11.7745 5.72993C11.8084 5.96507 11.4168 6.41475 11.3385 6.50138C11.1755 6.68084 10.6083 7.26872 10.0962 7.26872C9.58397 7.26872 9.01676 6.68084 8.85591 6.50138C8.7776 6.41475 8.38606 5.96507 8.4178 5.72993C8.4559 5.41846 9.47815 5.27613 10.0813 5.21837Z" fill="black"/>
|
||||
<path d="M10.0925 7.0621C10.3698 7.0621 10.7952 6.78776 11.174 6.3649C11.464 6.04518 11.5698 5.81003 11.5613 5.7564C11.5084 5.6512 10.8164 5.49237 10.0798 5.42224C9.36657 5.49237 8.67449 5.6512 8.62158 5.76052C8.69778 5.98983 8.83166 6.19689 9.01101 6.36284C9.39197 6.78776 9.81526 7.0621 10.0925 7.0621Z" fill="black"/>
|
||||
<path d="M10.6623 15.9489C10.4189 13.7769 10.6432 13.3273 10.8337 13.1788C10.8804 13.1432 10.9358 13.1201 10.9945 13.1117C11.0531 13.1035 11.113 13.1102 11.1681 13.1313C11.3598 13.2237 11.5271 13.3577 11.657 13.5232C11.8962 13.7769 12.0634 13.9358 12.2179 13.8491C12.328 13.7852 12.4846 13.4366 12.6412 13.1169C12.7216 12.9456 12.8042 12.7621 12.8952 12.5868C12.6835 10.6457 11.5195 9.14819 10.0993 9.14819C8.53949 9.14819 7.27173 10.9531 7.27173 13.1705C7.27173 13.1973 7.27173 13.2241 7.27173 13.2509C7.52995 13.5149 7.83895 13.8698 8.21567 14.3338C8.36367 14.5155 8.4994 14.7064 8.62204 14.9052C8.79699 15.1841 8.909 15.4961 8.9506 15.8205C8.9922 16.1449 8.96245 16.4741 8.86331 16.7864C9.21862 17.0463 9.64882 17.1907 10.093 17.199C10.3777 17.1979 10.659 17.1382 10.9184 17.0236C10.862 16.9 10.8173 16.7716 10.7851 16.64C10.7302 16.4122 10.6892 16.1815 10.6623 15.9489Z" fill="black"/>
|
||||
<path d="M8.04303 14.459C7.74673 14.0918 7.49487 13.8009 7.279 13.5658L7.17105 13.4503L7.061 13.3348C6.5721 12.8397 6.31389 12.7037 6.17843 12.681C6.15951 12.678 6.14023 12.678 6.12129 12.681C6.10076 12.6833 6.08122 12.6909 6.06454 12.7028C6.04786 12.7147 6.03461 12.7307 6.02605 12.7489C6.02565 12.7538 6.02565 12.7586 6.02605 12.7634C5.98416 12.8712 5.96753 12.9869 5.97738 13.1017C5.97738 13.1595 5.97738 13.2173 5.97738 13.2749C5.97738 13.3327 5.97738 13.341 5.97738 13.374C6.00594 13.5827 5.96198 13.7947 5.8525 13.9763C5.83155 13.9994 5.80732 14.0196 5.78055 14.0362L5.7361 14.0629C5.70773 14.0774 5.67795 14.0892 5.6472 14.098H5.62393C5.44826 14.1289 5.16254 14.0279 4.80063 13.8917L4.6948 13.8505C4.24188 13.6752 3.71276 13.473 3.32545 13.473C3.23797 13.4644 3.14967 13.4777 3.06893 13.5116C2.98819 13.5455 2.91767 13.599 2.86406 13.6669C2.58046 14.0794 3.2154 14.7271 3.72758 15.2511C4.04294 15.5749 4.29056 15.8286 4.31808 16.0184C4.36675 16.3691 3.99002 16.5031 3.65774 16.6228C3.48628 16.6669 3.32623 16.7457 3.18788 16.8538C3.13709 16.9116 3.1392 16.9508 3.14979 16.9797C3.19635 17.1384 3.57308 17.4871 5.56466 18.0502C5.78512 18.1124 6.00914 18.1621 6.23558 18.1987C6.64453 18.2591 7.06268 18.2065 7.44245 18.0468C7.82223 17.8871 8.14838 17.6267 8.38379 17.2952C8.47591 17.159 8.55187 17.0129 8.61025 16.86L8.65257 16.7589C8.65257 16.7239 8.67163 16.6847 8.68221 16.6496C8.75827 16.3728 8.77591 16.0838 8.73407 15.8002C8.69223 15.5165 8.59179 15.2441 8.43881 14.9994C8.31764 14.812 8.18549 14.6316 8.04303 14.459Z" fill="black"/>
|
||||
<path d="M16.0589 14.3171C15.8816 14.3336 15.71 14.3863 15.5552 14.4717L15.3245 14.5687C15.0704 14.6635 14.8164 14.7089 14.6513 14.4903C14.6122 14.4329 14.5856 14.3683 14.573 14.3006C14.5437 14.1377 14.5282 13.9728 14.5265 13.8075C14.5265 13.723 14.5265 13.6342 14.5265 13.5393C14.5265 12.9391 14.5054 12.2171 14.2154 11.9346C14.1785 11.8974 14.1346 11.8673 14.0863 11.8459C14.0596 11.8345 14.0321 11.8255 14.0037 11.8191H13.972C13.9001 11.8109 13.8272 11.8208 13.7603 11.8479C13.5106 11.947 13.2926 12.2605 13.1022 12.6277L13.0112 12.8071C12.9772 12.8772 12.9455 12.9453 12.9138 13.0133C12.882 13.0814 12.8545 13.1392 12.827 13.2011C12.6408 13.6136 12.4947 13.9292 12.3254 14.0262C12.0122 14.2056 11.7391 13.9168 11.5 13.6611C11.3921 13.5236 11.2558 13.4098 11.1 13.3269C11.0796 13.3194 11.0582 13.3152 11.0365 13.3145C11.0108 13.3139 10.9859 13.3228 10.9666 13.3393C10.8354 13.4424 10.647 13.9148 10.8735 15.926C10.8978 16.148 10.936 16.3684 10.9878 16.586C11.0166 16.7008 11.0548 16.8133 11.1021 16.9222C11.1169 16.9532 11.1317 16.9841 11.1486 17.015C11.1656 17.0459 11.1762 17.0769 11.1931 17.1079C11.3664 17.4217 11.6184 17.6878 11.9256 17.8813C12.2328 18.0746 12.5853 18.1891 12.9501 18.214C13.3149 18.239 13.6804 18.1735 14.0122 18.0237C14.3441 17.8739 14.6317 17.6448 14.8482 17.3574C14.9843 17.1771 15.1093 16.989 15.2228 16.7943C16.2387 15.0307 16.2578 14.5254 16.1795 14.3809C16.1676 14.3603 16.15 14.3434 16.1286 14.332C16.1073 14.3208 16.0831 14.3155 16.0589 14.3171Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_4244_203">
|
||||
<rect width="14.4446" height="16.5081" fill="white" transform="translate(2.63892 1.8252)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 7 KiB |
6
res/themes/element/img/compound/microsoft.svg
Normal file
|
@ -0,0 +1,6 @@
|
|||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="10.4908" y="2" width="7.50926" height="7.50926" fill="#1B1D22"/>
|
||||
<rect x="2" y="10.4904" width="7.50926" height="7.50926" fill="#1B1D22"/>
|
||||
<rect x="2" y="2" width="7.50926" height="7.50926" fill="#1B1D22"/>
|
||||
<rect x="10.4908" y="10.4904" width="7.50926" height="7.50926" fill="#1B1D22"/>
|
||||
</svg>
|
After Width: | Height: | Size: 399 B |
BIN
res/themes/element/img/logos/element-app-logo.png
Normal file
After Width: | Height: | Size: 132 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 434 B After Width: | Height: | Size: 770 B |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 629 B After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 732 B After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 803 B After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 837 B After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 974 B After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 940 B After Width: | Height: | Size: 1.9 KiB |
|
@ -1,5 +1,5 @@
|
|||
sonar.projectKey=element-web
|
||||
sonar.organization=new_vector_ltd_organization
|
||||
sonar.organization=element-hq
|
||||
|
||||
# Encoding of the source code. Default is default system encoding
|
||||
#sonar.sourceEncoding=UTF-8
|
||||
|
|
|
@ -1,149 +0,0 @@
|
|||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import React, { ReactNode } from "react";
|
||||
import SdkConfig from "matrix-react-sdk/src/SdkConfig";
|
||||
|
||||
import { _t } from "../../languageHandler";
|
||||
|
||||
// directly import the style here as this layer does not support rethemedex at this time so no matrix-react-sdk
|
||||
// PostCSS variables will be accessible.
|
||||
import "../../../res/css/structures/ErrorView.pcss";
|
||||
|
||||
interface IProps {
|
||||
onAccept(): void;
|
||||
}
|
||||
|
||||
const CompatibilityView: React.FC<IProps> = ({ onAccept }) => {
|
||||
const brand = SdkConfig.get("brand");
|
||||
const mobileBuilds = SdkConfig.get("mobile_builds");
|
||||
|
||||
let ios: JSX.Element | undefined;
|
||||
const iosCustomUrl = mobileBuilds?.ios;
|
||||
if (iosCustomUrl !== null) {
|
||||
// could be undefined or a string
|
||||
ios = (
|
||||
<>
|
||||
<p>
|
||||
<strong>iOS</strong> (iPhone or iPad)
|
||||
</p>
|
||||
<a href={iosCustomUrl} target="_blank" rel="noreferrer noopener" className="mx_ClearDecoration">
|
||||
<img height="48" src="themes/element/img/download/apple.svg" alt="Apple App Store" />
|
||||
</a>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
let android = [
|
||||
<p className="mx_Spacer" key="header">
|
||||
<strong>Android</strong>
|
||||
</p>,
|
||||
];
|
||||
const andCustomUrl = mobileBuilds?.android;
|
||||
const fdroidCustomUrl = mobileBuilds?.fdroid;
|
||||
if (andCustomUrl !== null) {
|
||||
// undefined or string
|
||||
android.push(
|
||||
<a
|
||||
href={andCustomUrl}
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
className="mx_ClearDecoration"
|
||||
key="android"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/google.svg" alt="Google Play Store" />
|
||||
</a>,
|
||||
);
|
||||
}
|
||||
if (fdroidCustomUrl !== null) {
|
||||
// undefined or string
|
||||
android.push(
|
||||
<a
|
||||
href={fdroidCustomUrl}
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
className="mx_ClearDecoration"
|
||||
key="fdroid"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/fdroid.svg" alt="F-Droid" />
|
||||
</a>,
|
||||
);
|
||||
}
|
||||
if (android.length === 1) {
|
||||
// just a header, meaning no links
|
||||
android = [];
|
||||
}
|
||||
|
||||
let mobileHeader: ReactNode = <h2 id="step2_heading">{_t("use_brand_on_mobile", { brand })}</h2>;
|
||||
if (!android.length && !ios) {
|
||||
mobileHeader = null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mx_ErrorView">
|
||||
<div className="mx_ErrorView_container">
|
||||
<div className="mx_HomePage_header">
|
||||
<span className="mx_HomePage_logo">
|
||||
<img height="42" src="themes/element/img/logos/element-logo.svg" alt="Element" />
|
||||
</span>
|
||||
<h1>{_t("incompatible_browser|title")}</h1>
|
||||
</div>
|
||||
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step1_heading">{_t("incompatible_browser|summary", { brand })}</h2>
|
||||
<p>{_t("incompatible_browser|features", { brand })}</p>
|
||||
<p>
|
||||
{_t(
|
||||
"incompatible_browser|browser_links",
|
||||
{},
|
||||
{
|
||||
chromeLink: (sub) => <a href="https://www.google.com/chrome">{sub}</a>,
|
||||
firefoxLink: (sub) => <a href="https://firefox.com">{sub}</a>,
|
||||
safariLink: (sub) => <a href="https://apple.com/safari">{sub}</a>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
<p>{_t("incompatible_browser|feature_warning")}</p>
|
||||
<button onClick={onAccept}>{_t("incompatible_browser|continue_warning")}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
{mobileHeader}
|
||||
{ios}
|
||||
{android}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mx_HomePage_row mx_Center mx_Spacer">
|
||||
<p className="mx_Spacer">
|
||||
<a href="https://element.io" target="_blank" className="mx_FooterLink">
|
||||
{_t("go_to_element_io")}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default CompatibilityView;
|
|
@ -14,9 +14,16 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
import * as React from "react";
|
||||
import React, { ReactNode } from "react";
|
||||
import { Text, Heading, Button, Separator } from "@vector-im/compound-web";
|
||||
import SdkConfig from "matrix-react-sdk/src/SdkConfig";
|
||||
import { Flex } from "matrix-react-sdk/src/components/utils/Flex";
|
||||
import PopOutIcon from "@vector-im/compound-design-tokens/assets/web/icons/pop-out";
|
||||
|
||||
import { _t } from "../../languageHandler";
|
||||
import { Icon as AppleIcon } from "../../../res/themes/element/img/compound/apple.svg";
|
||||
import { Icon as MicrosoftIcon } from "../../../res/themes/element/img/compound/microsoft.svg";
|
||||
import { Icon as LinuxIcon } from "../../../res/themes/element/img/compound/linux.svg";
|
||||
|
||||
// directly import the style here as this layer does not support rethemedex at this time so no matrix-react-sdk
|
||||
// PostCSS variables will be accessible.
|
||||
|
@ -26,36 +33,184 @@ interface IProps {
|
|||
// both of these should already be internationalised
|
||||
title: string;
|
||||
messages?: string[];
|
||||
footer?: ReactNode;
|
||||
}
|
||||
|
||||
const ErrorView: React.FC<IProps> = ({ title, messages }) => {
|
||||
export const ErrorView: React.FC<IProps> = ({ title, messages, footer, children }) => {
|
||||
return (
|
||||
<div className="mx_ErrorView">
|
||||
<div className="mx_ErrorView cpd-theme-light">
|
||||
<img
|
||||
className="mx_ErrorView_logo"
|
||||
height="160"
|
||||
src="themes/element/img/logos/element-app-logo.png"
|
||||
alt="Element"
|
||||
/>
|
||||
<div className="mx_ErrorView_container">
|
||||
<div className="mx_HomePage_header">
|
||||
<span className="mx_HomePage_logo">
|
||||
<img height="42" src="themes/element/img/logos/element-logo.svg" alt="Element" />
|
||||
</span>
|
||||
<h1>{_t("failed_to_start")}</h1>
|
||||
</div>
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step1_heading">{title}</h2>
|
||||
{messages && messages.map((msg) => <p key={msg}>{msg}</p>)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mx_HomePage_row mx_Center mx_Spacer">
|
||||
<p className="mx_Spacer">
|
||||
<a href="https://element.io" target="_blank" className="mx_FooterLink">
|
||||
{_t("go_to_element_io")}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<Heading size="md" weight="semibold">
|
||||
{title}
|
||||
</Heading>
|
||||
{messages?.map((message) => (
|
||||
<Text key={message} size="lg">
|
||||
{message}
|
||||
</Text>
|
||||
))}
|
||||
{children}
|
||||
</div>
|
||||
{footer}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ErrorView;
|
||||
const MobileAppLinks: React.FC<{
|
||||
appleAppStoreUrl?: string;
|
||||
googlePlayUrl?: string;
|
||||
fdroidUrl?: string;
|
||||
}> = ({ appleAppStoreUrl, googlePlayUrl, fdroidUrl }) => (
|
||||
<Flex gap="var(--cpd-space-6x)">
|
||||
{appleAppStoreUrl && (
|
||||
<a href={appleAppStoreUrl} target="_blank" rel="noreferrer noopener">
|
||||
<img height="64" src="themes/element/img/download/apple.svg" alt="Apple App Store" />
|
||||
</a>
|
||||
)}
|
||||
{googlePlayUrl && (
|
||||
<a href={googlePlayUrl} target="_blank" rel="noreferrer noopener" key="android">
|
||||
<img height="64" src="themes/element/img/download/google.svg" alt="Google Play Store" />
|
||||
</a>
|
||||
)}
|
||||
{fdroidUrl && (
|
||||
<a href={fdroidUrl} target="_blank" rel="noreferrer noopener" key="fdroid">
|
||||
<img height="64" src="themes/element/img/download/fdroid.svg" alt="F-Droid" />
|
||||
</a>
|
||||
)}
|
||||
</Flex>
|
||||
);
|
||||
|
||||
const DesktopAppLinks: React.FC<{
|
||||
macOsUrl?: string;
|
||||
win64Url?: string;
|
||||
win32Url?: string;
|
||||
linuxUrl?: string;
|
||||
}> = ({ macOsUrl, win64Url, win32Url, linuxUrl }) => {
|
||||
return (
|
||||
<Flex gap="var(--cpd-space-4x)">
|
||||
{macOsUrl && (
|
||||
<Button as="a" href={macOsUrl} kind="secondary" Icon={AppleIcon}>
|
||||
{_t("incompatible_browser|macos")}
|
||||
</Button>
|
||||
)}
|
||||
{win64Url && (
|
||||
<Button as="a" href={win64Url} kind="secondary" Icon={MicrosoftIcon}>
|
||||
{_t("incompatible_browser|windows", { bits: "64" })}
|
||||
</Button>
|
||||
)}
|
||||
{win32Url && (
|
||||
<Button as="a" href={win32Url} kind="secondary" Icon={MicrosoftIcon}>
|
||||
{_t("incompatible_browser|windows", { bits: "32" })}
|
||||
</Button>
|
||||
)}
|
||||
{linuxUrl && (
|
||||
<Button as="a" href={linuxUrl} kind="secondary" Icon={LinuxIcon}>
|
||||
{_t("incompatible_browser|linux")}
|
||||
</Button>
|
||||
)}
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
const linkFactory =
|
||||
(link: string) =>
|
||||
(text: string): JSX.Element => (
|
||||
<a href={link} target="_blank" rel="noreferrer noopener">
|
||||
{text}
|
||||
</a>
|
||||
);
|
||||
|
||||
export const UnsupportedBrowserView: React.FC<{
|
||||
onAccept?(): void;
|
||||
}> = ({ onAccept }) => {
|
||||
const config = SdkConfig.get();
|
||||
const brand = config.brand ?? "Element";
|
||||
|
||||
const hasDesktopBuilds =
|
||||
config.desktop_builds?.available &&
|
||||
(config.desktop_builds?.url_macos ||
|
||||
config.desktop_builds?.url_win64 ||
|
||||
config.desktop_builds?.url_win32 ||
|
||||
config.desktop_builds?.url_linux);
|
||||
const hasMobileBuilds = Boolean(
|
||||
config.mobile_builds?.ios || config.mobile_builds?.android || config.mobile_builds?.fdroid,
|
||||
);
|
||||
|
||||
return (
|
||||
<ErrorView
|
||||
title={_t("incompatible_browser|title", { brand })}
|
||||
messages={[
|
||||
_t("incompatible_browser|description", {
|
||||
brand,
|
||||
detail: onAccept
|
||||
? _t("incompatible_browser|detail_can_continue")
|
||||
: _t("incompatible_browser|detail_no_continue"),
|
||||
}),
|
||||
]}
|
||||
footer={
|
||||
<>
|
||||
{/* We render the apps in the footer as they are wider than the 520px container */}
|
||||
{(hasDesktopBuilds || hasMobileBuilds) && <Separator />}
|
||||
|
||||
{hasDesktopBuilds && (
|
||||
<>
|
||||
<Heading as="h2" size="sm" weight="semibold">
|
||||
{_t("incompatible_browser|use_desktop_heading", { brand })}
|
||||
</Heading>
|
||||
<DesktopAppLinks
|
||||
macOsUrl={config.desktop_builds?.url_macos}
|
||||
win64Url={config.desktop_builds?.url_win64}
|
||||
win32Url={config.desktop_builds?.url_win32}
|
||||
linuxUrl={config.desktop_builds?.url_linux}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
|
||||
{hasMobileBuilds && (
|
||||
<>
|
||||
<Heading as="h2" size="sm" weight="semibold">
|
||||
{hasDesktopBuilds
|
||||
? _t("incompatible_browser|use_mobile_heading_after_desktop")
|
||||
: _t("incompatible_browser|use_mobile_heading", { brand })}
|
||||
</Heading>
|
||||
<MobileAppLinks
|
||||
appleAppStoreUrl={config.mobile_builds?.ios ?? undefined}
|
||||
googlePlayUrl={config.mobile_builds?.android ?? undefined}
|
||||
fdroidUrl={config.mobile_builds?.fdroid ?? undefined}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
}
|
||||
>
|
||||
<Text size="lg">
|
||||
{_t(
|
||||
"incompatible_browser|supported_browsers",
|
||||
{},
|
||||
{
|
||||
Chrome: linkFactory("https://google.com/chrome"),
|
||||
Firefox: linkFactory("https://firefox.com"),
|
||||
Edge: linkFactory("https://microsoft.com/edge"),
|
||||
Safari: linkFactory("https://apple.com/safari"),
|
||||
},
|
||||
)}
|
||||
</Text>
|
||||
|
||||
<Flex gap="var(--cpd-space-4x)" className="mx_ErrorView_buttons">
|
||||
<Button Icon={PopOutIcon} kind="secondary" size="sm">
|
||||
{_t("incompatible_browser|learn_more")}
|
||||
</Button>
|
||||
{onAccept && (
|
||||
<Button kind="primary" size="sm" onClick={onAccept}>
|
||||
{_t("incompatible_browser|continue")}
|
||||
</Button>
|
||||
)}
|
||||
</Flex>
|
||||
</ErrorView>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -101,7 +101,7 @@ export default class Favicon {
|
|||
h: number;
|
||||
} {
|
||||
const opt = {
|
||||
n: typeof n === "number" ? Math.abs(n as number | 0) : n,
|
||||
n: typeof n === "number" ? Math.abs(n | 0) : n,
|
||||
len: ("" + n).length,
|
||||
// badge positioning constants as percentages
|
||||
x: 0.4,
|
||||
|
@ -178,7 +178,7 @@ export default class Favicon {
|
|||
this.context.fillStyle = params.textColor;
|
||||
|
||||
if (typeof opt.n === "number" && opt.n > 999) {
|
||||
const count = (opt.n > 9999 ? 9 : Math.floor((opt.n as number) / 1000)) + "k+";
|
||||
const count = (opt.n > 9999 ? 9 : Math.floor(opt.n / 1000)) + "k+";
|
||||
this.context.fillText(count, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.2));
|
||||
} else {
|
||||
this.context.fillText("" + opt.n, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.15));
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Neplatný JSON",
|
||||
"misconfigured": "Váš Element je nesprávně nastaven"
|
||||
},
|
||||
"failed_to_start": "Nepovedlo se nastartovat",
|
||||
"go_to_element_io": "Přejít na element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Pro nejlepší zážitek si prosím nainstalujte prohlížeč <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, nebo <safariLink>Safari</safariLink>.",
|
||||
"continue_warning": "Rozumím a přesto chci pokračovat",
|
||||
"feature_warning": "Můžete pokračovat v užívání vašeho současného prohlížeče, ale některé (nebo dokonce všechny) funkce nemusí fungovat a vzhled a chování aplikace nemusí být správné.",
|
||||
"features": "%(brand)s využívá pokročilých funkcí prohlížeče, které ten váš nepodporuje.",
|
||||
"summary": "Váš prohlížeč nedokáže spustit %(brand)s",
|
||||
"title": "Nepodporovaný prohlížeč"
|
||||
},
|
||||
"powered_by_matrix": "Běží na Matrixu",
|
||||
"powered_by_matrix_with_logo": "Decentralizovaný, šifrovaný chat a spolupráce na platformě $matrixLogo",
|
||||
"unknown_device": "Neznámé zařízení",
|
||||
"use_brand_on_mobile": "Používání %(brand)s v mobilních zařízeních",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s na %(osName)s",
|
||||
"welcome_to_element": "Vítá vás Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Ungültiges JSON",
|
||||
"misconfigured": "Dein Element ist falsch konfiguriert"
|
||||
},
|
||||
"failed_to_start": "Start fehlgeschlagen",
|
||||
"go_to_element_io": "Gehe zu element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Bitte installiere <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> oder <safariLink>Safari</safariLink> für das beste Erlebnis.",
|
||||
"continue_warning": "Ich verstehe die Risiken und möchte fortfahren",
|
||||
"feature_warning": "Du kannst deinen aktuellen Browser weiterhin verwenden. Es ist aber möglich, dass nicht alles richtig funktioniert oder das Aussehen der App inkorrekt ist.",
|
||||
"features": "%(brand)s verwendet erweiterte Browserfunktionen, die von deinem Browser nicht unterstützt werden.",
|
||||
"summary": "Dein Browser kann %(brand)s nicht ausführen",
|
||||
"title": "Nicht unterstützter Browser"
|
||||
},
|
||||
"powered_by_matrix": "Betrieben mit Matrix",
|
||||
"powered_by_matrix_with_logo": "Dezentralisierter, verschlüsselter Chat & Zusammenarbeit unterstützt von $matrixLogo",
|
||||
"unknown_device": "Unbekanntes Gerät",
|
||||
"use_brand_on_mobile": "Verwende %(brand)s am Handy",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s auf %(osName)s",
|
||||
"welcome_to_element": "Willkommen bei Element"
|
||||
}
|
||||
|
|
|
@ -19,19 +19,11 @@
|
|||
"invalid_json_generic": "Μη έγκυρο JSON",
|
||||
"misconfigured": "Το Element σας δεν εχει ρυθμιστεί σωστά"
|
||||
},
|
||||
"failed_to_start": "Αποτυχία έναρξης",
|
||||
"go_to_element_io": "Πήγαινε στο element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Παρακαλούμε εγκαταστήστε <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ή <safariLink>Safari</safariLink> για καλύτερη εμπειρία χρήσης.",
|
||||
"continue_warning": "Κατανοώ τους κινδύνους και επιθυμώ να συνεχίσω",
|
||||
"feature_warning": "Μπορείτε να συνεχίσετε να χρησιμοποιείτε το τρέχον πρόγραμμα περιήγησής σας, αλλά ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν και η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι λανθασμένη.",
|
||||
"features": "%(brand)s χρησιμοποιεί προηγμένες δυνατότητες προγράμματος περιήγησης που δεν υποστηρίζονται από το τρέχον πρόγραμμα περιήγησής σας.",
|
||||
"summary": "Το πρόγραμμα περιήγησής σας δεν μπορεί να εκτελέσει %(brand)s",
|
||||
"title": "Μη υποστηριζόμενο πρόγραμμα περιήγησης"
|
||||
},
|
||||
"powered_by_matrix": "Με την υποστήριξη του Matrix",
|
||||
"powered_by_matrix_with_logo": "Αποκεντρωμένη, κρυπτογραφημένη συνομιλία και συνεργασία χρησιμοποιώντας το $matrixLogo",
|
||||
"unknown_device": "Άγνωστη συσκευή",
|
||||
"use_brand_on_mobile": "Χρήση %(brand)s σε κινητό",
|
||||
"welcome_to_element": "Καλώς ήλθατε στο Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,24 @@
|
|||
"invalid_json_generic": "Invalid JSON",
|
||||
"misconfigured": "Your Element is misconfigured"
|
||||
},
|
||||
"failed_to_start": "Failed to start",
|
||||
"go_to_element_io": "Go to element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.",
|
||||
"continue_warning": "I understand the risks and wish to continue",
|
||||
"feature_warning": "You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.",
|
||||
"features": "%(brand)s uses advanced browser features which aren't supported by your current browser.",
|
||||
"summary": "Your browser can't run %(brand)s",
|
||||
"title": "Unsupported browser"
|
||||
"continue": "Continue anyway",
|
||||
"description": "%(brand)s uses some browser features which are not available in your current browser. %(detail)s",
|
||||
"detail_can_continue": "If you continue, some features may stop working and there is a risk that you may lose data in the future.",
|
||||
"detail_no_continue": "Try updating this browser if you're not using the latest version and try again.",
|
||||
"learn_more": "Learn more",
|
||||
"linux": "Linux",
|
||||
"macos": "Mac",
|
||||
"supported_browsers": "For the best experience, use <Chrome>Chrome</Chrome>, <Firefox>Firefox</Firefox>, <Edge>Edge</Edge>, or <Safari>Safari</Safari>.",
|
||||
"title": "%(brand)s does not support this browser",
|
||||
"use_desktop_heading": "Use %(brand)s Desktop instead",
|
||||
"use_mobile_heading": "Use %(brand)s on mobile instead",
|
||||
"use_mobile_heading_after_desktop": "Or use our mobile app",
|
||||
"windows": "Windows (%(bits)s-bit)"
|
||||
},
|
||||
"powered_by_matrix": "Powered by Matrix",
|
||||
"powered_by_matrix_with_logo": "Decentralised, encrypted chat & collaboration powered by $matrixLogo",
|
||||
"unknown_device": "Unknown device",
|
||||
"use_brand_on_mobile": "Use %(brand)s on mobile",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s on %(osName)s",
|
||||
"welcome_to_element": "Welcome to Element"
|
||||
}
|
||||
|
|
|
@ -20,20 +20,12 @@
|
|||
"invalid_json_generic": "Nevalida JSON",
|
||||
"misconfigured": "Via Elemento estas misagordita"
|
||||
},
|
||||
"failed_to_start": "Malsukcesis starti",
|
||||
"go_to_element_io": "Iri al element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Bonvolu instali retumilon <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, aŭ <safariLink>Safari</safariLink>, por la plej bona sperto.",
|
||||
"continue_warning": "Mi komprenas la riskon kaj volas pluiĝi",
|
||||
"feature_warning": "Vi povas daŭre uzi vian nunan foliumilon, sed iuj (eĉ ĉiuj) funkcioj eble ne funkciu, kaj la aspekto de la aplikaĵo eble ne estu ĝusta.",
|
||||
"features": "%(brand)s uzas specialajn funkciojn de retumilo, kiujn via nuna retumilo ne subtenas.",
|
||||
"summary": "Via retumilo ne povas ruli %(brand)s",
|
||||
"title": "Nesubtenata retumilo"
|
||||
},
|
||||
"powered_by_matrix": "Povigata de Matrix",
|
||||
"powered_by_matrix_with_logo": "Malcentralizita kaj ĉifrita babilejo; kunlaboro danke al $matrixLogo",
|
||||
"unknown_device": "Nekonata aparato",
|
||||
"use_brand_on_mobile": "Uzi %(brand)s poŝtelefone",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s sur %(osName)s",
|
||||
"welcome_to_element": "Bonvenon al Element"
|
||||
}
|
||||
|
|
|
@ -20,20 +20,12 @@
|
|||
"invalid_json_generic": "JSON inválido",
|
||||
"misconfigured": "Tu aplicación Element está mal configurada"
|
||||
},
|
||||
"failed_to_start": "Fallo al iniciar",
|
||||
"go_to_element_io": "Ir a element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Por favor, instale <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> para la mejor experiencia.",
|
||||
"continue_warning": "Entiendo los riesgos y quiero continuar",
|
||||
"feature_warning": "Puedes seguir utilizando tu navegador actual, pero puede que algunas funcionalidades no estén disponibles o que algunas partes de la aplicación se muestren de forma incorrecta.",
|
||||
"features": "%(brand)s usa funciones avanzadas que su navegador actual no soporta.",
|
||||
"summary": "Tu navegador no es compatible con %(brand)s",
|
||||
"title": "Navegador no compatible"
|
||||
},
|
||||
"powered_by_matrix": "Funciona con Matrix",
|
||||
"powered_by_matrix_with_logo": "Conversaciones y colaboración descentralizadas y cifradas gracias a $matrixLogo",
|
||||
"unknown_device": "Dispositivo desconocido",
|
||||
"use_brand_on_mobile": "Usar %(brand)s en modo móvil",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s en %(osName)s",
|
||||
"welcome_to_element": "Te damos la bienvenida a Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Vigane JSON",
|
||||
"misconfigured": "Sinu Element on valesti seadistatud"
|
||||
},
|
||||
"failed_to_start": "Käivitamine ei õnnestunud",
|
||||
"go_to_element_io": "Mine element.io lehele",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Parima kasutuskogemuse jaoks palun paigalda <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> või <safariLink>Safari</safariLink>.",
|
||||
"continue_warning": "Ma mõistan riske ja soovin jätkata",
|
||||
"feature_warning": "Sa võid jätkata praeguse brauseri kasutamist, kuid mõned või kõik funktsionaalsused ei pruugi toimida ning rakenduse välimus võib vigane olla.",
|
||||
"features": "%(brand)s kasutab mitmeid uusi brauseri-põhiseid tehnoloogiaid, mis ei ole veel sinu veebibrauseris toetatud.",
|
||||
"summary": "%(brand)s ei toimi sinu brauseris",
|
||||
"title": "Sellele brauserile puudub tugi"
|
||||
},
|
||||
"powered_by_matrix": "Põhineb Matrix'il",
|
||||
"powered_by_matrix_with_logo": "Hajutatud ja krüpteeritud suhtlus- ning ühistöörakendus, mille aluseks on $matrixLogo",
|
||||
"unknown_device": "Tundmatu seade",
|
||||
"use_brand_on_mobile": "Kasuta rakendust %(brand)s nutiseadmes",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s operatsioonisüsteemis %(osName)s",
|
||||
"welcome_to_element": "Tere tulemast kasutama suhtlusrakendust Element"
|
||||
}
|
||||
|
|
|
@ -20,20 +20,12 @@
|
|||
"invalid_json_generic": "JSON اشتباه",
|
||||
"misconfigured": "Element شما پیکربندی نشده است"
|
||||
},
|
||||
"failed_to_start": "خطا در شروع",
|
||||
"go_to_element_io": "برو به element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "لطفا برای تجربه بهتر <chromeLink>کروم</chromeLink>، <firefoxLink>فایرفاکس</firefoxLink>، یا <safariLink>سافاری</safariLink> را نصب کنید.",
|
||||
"continue_warning": "از خطرات این کار آگاهم و مایلم که ادامه بدهم",
|
||||
"feature_warning": "شما می توانید با مرورگر فعلی خود ادامه دهید، اما ممکن است عملکرد تمامی یا برخی از قابلیت ها با اشکال روبرو شود و نمایش برنامه صحیح نباشد.",
|
||||
"features": "%(brand)s از ویژگی های پیشرفته مرورگر استفاده می کند که در مرورگر فعلی شما پشتیبانی نمی شوند.",
|
||||
"summary": "مرورگر شما نمی تواند %(brand)s را اجرا کند",
|
||||
"title": "مرورگر پشتبانی نمی شود"
|
||||
},
|
||||
"powered_by_matrix": "راه اندازی شده با استفاده از ماتریکس",
|
||||
"powered_by_matrix_with_logo": "همکاری چت غیرمتمرکز و رمزگذاری شده & توسعه یافته با استفاده از $matrixLogo",
|
||||
"unknown_device": "دستگاه ناشناخته",
|
||||
"use_brand_on_mobile": "از %(brand)s گوشی استفاده کنید",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s: روی %(osName)s",
|
||||
"welcome_to_element": "به Element خوشآمدید"
|
||||
}
|
||||
|
|
|
@ -20,20 +20,12 @@
|
|||
"invalid_json_generic": "Virheellinen JSON",
|
||||
"misconfigured": "Elementisi asetukset ovat pielessä"
|
||||
},
|
||||
"failed_to_start": "Käynnistys ei onnistunut",
|
||||
"go_to_element_io": "Mene osoitteeseen riot.im",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Asenna <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> tai <safariLink>Safari</safariLink>, jotta kaikki toimii parhaiten.",
|
||||
"continue_warning": "Ymmärrän riskit ja haluan jatkaa",
|
||||
"feature_warning": "Voit käyttää edelleen nykyistä selaintasi, mutta jotkut tai kaikki ominaisuudet eivät ehkä toimi ja sovelluksen ulkoasu voi olla virheellinen.",
|
||||
"features": "%(brand)s käyttää edistyneitä selaimen ominaisuuksia, joita nykyinen selaimesi ei tue.",
|
||||
"summary": "%(brand)s ei toimi selaimessasi",
|
||||
"title": "Selainta ei tueta"
|
||||
},
|
||||
"powered_by_matrix": "Moottorina Matrix",
|
||||
"powered_by_matrix_with_logo": "Hajautettu, salattu keskustelu & yhteistyö, taustavoimana $matrixLogo",
|
||||
"unknown_device": "Tuntematon laite",
|
||||
"use_brand_on_mobile": "Käytä %(brand)sia mobiilisti",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s käyttöjärjestelmällä %(osName)s",
|
||||
"welcome_to_element": "Tervetuloa Element-sovellukseen"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "JSON non valide",
|
||||
"misconfigured": "Votre Element est mal configuré"
|
||||
},
|
||||
"failed_to_start": "Échec au démarrage",
|
||||
"go_to_element_io": "Aller vers element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Veuillez installer <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> ou <safariLink>Safari</safariLink> pour une expérience optimale.",
|
||||
"continue_warning": "Je comprends les risques et souhaite continuer",
|
||||
"feature_warning": "Vous pouvez continuer à utiliser votre navigateur actuel, mais vous risquez de trouver que certaines fonctionnalités et/ou l’apparence de l’application sont incorrectes.",
|
||||
"features": "%(brand)s nécessite des fonctionnalités avancées que votre navigateur actuel ne prend pas en charge.",
|
||||
"summary": "Votre navigateur ne peut pas exécuter %(brand)s",
|
||||
"title": "Navigateur non pris en charge"
|
||||
},
|
||||
"powered_by_matrix": "Propulsé par Matrix",
|
||||
"powered_by_matrix_with_logo": "Messagerie décentralisée, chiffrée & une collaboration alimentée par $matrixLogo",
|
||||
"unknown_device": "Appareil inconnu",
|
||||
"use_brand_on_mobile": "Utiliser %(brand)s sur téléphone",
|
||||
"web_default_device_name": "%(appName)s : %(browserName)s pour %(osName)s",
|
||||
"welcome_to_element": "Bienvenue sur Element"
|
||||
}
|
||||
|
|
|
@ -20,20 +20,12 @@
|
|||
"invalid_json_generic": "JSON non válido",
|
||||
"misconfigured": "Element non está ben configurado"
|
||||
},
|
||||
"failed_to_start": "Fallou o inicio",
|
||||
"go_to_element_io": "Ir a element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Instala <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ou <safariLink>Safari</safariLink> para ter unha mellor experiencia.",
|
||||
"continue_warning": "Entendo os riscos e desexo continuar",
|
||||
"feature_warning": "Podes continuar co teu navegador, pero algunhas características poderían non funcionar e o aspecto da aplicación podería non ser o correcto.",
|
||||
"features": "%(brand)s utiliza características avanzadas do navegador que non están dispoñibles no teu navegador.",
|
||||
"summary": "O teu navegador non pode executar %(brand)s",
|
||||
"title": "Navegador non soportado"
|
||||
},
|
||||
"powered_by_matrix": "Funciona grazas a Matrix",
|
||||
"powered_by_matrix_with_logo": "Conversas & colaboración descentralizadas e cifradas grazas a $matrixLogo",
|
||||
"unknown_device": "Dispositivo descoñecido",
|
||||
"use_brand_on_mobile": "Utiliza %(brand)s no móbil",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s en %(osName)s",
|
||||
"welcome_to_element": "Benvida/o a Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "JSON לא חוקי",
|
||||
"misconfigured": "Element אינו מוגדר תקין"
|
||||
},
|
||||
"failed_to_start": "כשל בהעלאת התוכנה",
|
||||
"go_to_element_io": "חזור לאתר הראשי: element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "נא התקן את דפדפן <chromeLink>כרום</chromeLink>, <firefoxLink>פיירפוקס</firefoxLink> או <safariLink>סאפרי</safariLink> בשביל החוויה הטובה ביותר.",
|
||||
"continue_warning": "הסיכונים מובנים לי ואני מעוניינ/ת להמשיך",
|
||||
"feature_warning": "ניתן להמשיך ולהשתמש בדפדפן זה, אך ייתכן שחלק מן התכונות והמאפיינים לא יעבדו כשורה או ייראו כשגויים.",
|
||||
"features": "%(brand)s משתמש בתכונות דפדפן מתקדמות שאינן נתמכות בדפדפן הנוכחי שלך.",
|
||||
"summary": "הדפדפן שלך לא יכול להריץ %(brand)s",
|
||||
"title": "דפדפן לא נתמך"
|
||||
},
|
||||
"powered_by_matrix": "מופעל על ידי מטריקס",
|
||||
"powered_by_matrix_with_logo": "צ'אט מבוזר ומוצפן & מופעל בשיתוף פעולה ע\"י $matrixLogo",
|
||||
"unknown_device": "מכשיר לא ידוע",
|
||||
"use_brand_on_mobile": "השתמש ב-%(brand)s במכשיר הנייד",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s עַל %(osName)s",
|
||||
"welcome_to_element": "ברוכים הבאים ל Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Érvénytelen JSON",
|
||||
"misconfigured": "Az Element hibásan van beállítva"
|
||||
},
|
||||
"failed_to_start": "Az indítás sikertelen",
|
||||
"go_to_element_io": "Irány az element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "A legjobb élmény érdékében telepítsen <chromeLink>Chrome-ot</chromeLink>, <firefoxLink>Firefoxot</firefoxLink> vagy <safariLink>Safarit</safariLink>.",
|
||||
"continue_warning": "Megértettem a kockázatot és folytatom",
|
||||
"feature_warning": "Folytathatja a jelenlegi böngészőjével, de néhány vagy az összes funkció használhatatlan lehet, vagy hibák lehetnek az alkalmazás kinézetében és viselkedésében.",
|
||||
"features": "A(z) %(brand)s speciális böngészőfunkciókat használ, amelyeket a jelenlegi böngészője nem támogat.",
|
||||
"summary": "A böngészője nem tudja futtatni ezt: %(brand)s",
|
||||
"title": "Nem támogatott böngésző"
|
||||
},
|
||||
"powered_by_matrix": "A gépházban: Matrix",
|
||||
"powered_by_matrix_with_logo": "Elosztott, titkosított csevegés és együttműködés ezzel: $matrixLogo",
|
||||
"unknown_device": "Ismeretlen eszköz",
|
||||
"use_brand_on_mobile": "Mobilon használja ezt: %(brand)s",
|
||||
"web_default_device_name": "%(appName)s: (%(browserName)s itt: %(osName)s)",
|
||||
"welcome_to_element": "Üdvözli az Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "JSON tidak absah",
|
||||
"misconfigured": "Anda salah mengatur Element"
|
||||
},
|
||||
"failed_to_start": "Gagal untuk memulai",
|
||||
"go_to_element_io": "Buka element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Silakan instal <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, atau <safariLink>Safari</safariLink> untuk pengalaman yang terbaik.",
|
||||
"continue_warning": "Saya memahami risikonya dan ingin melanjutkan",
|
||||
"feature_warning": "Anda dapat melanjutkan menggunakan peramban Anda saat ini, tetapi beberapa atau semua fitur mungkin tidak berfungsi dan tampilan serta nuansa aplikasi mungkin tidak benar.",
|
||||
"features": "%(brand)s menggunakan fitur peramban tingkat lanjut yang tidak didukung oleh peramban Anda saat ini.",
|
||||
"summary": "Peramban Anda tidak dapat menjalankan %(brand)s",
|
||||
"title": "Peramban tidak didukung"
|
||||
},
|
||||
"powered_by_matrix": "Diberdayakan oleh Matrix",
|
||||
"powered_by_matrix_with_logo": "Obrolan & kolaborasi terdesentralisasi dan terenkripsi diberdayakan oleh $matrixLogo",
|
||||
"unknown_device": "Perangkat tidak diketahui",
|
||||
"use_brand_on_mobile": "Gunakan %(brand)s di ponsel",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s di %(osName)s",
|
||||
"welcome_to_element": "Selamat datang di Element"
|
||||
}
|
||||
|
|
|
@ -20,20 +20,12 @@
|
|||
"invalid_json_generic": "Ógilt JSON",
|
||||
"misconfigured": "Element-tilvikið þitt er rangt stillt"
|
||||
},
|
||||
"failed_to_start": "Mistókst að ræsa",
|
||||
"go_to_element_io": "Fara á element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Þú ættir að setja upp <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, eða <safariLink>Safari</safariLink> til að fá sem besta útkomu.",
|
||||
"continue_warning": "Ég skil áhættuna og óska að halda áfram",
|
||||
"feature_warning": "Þú getur haldið áfram að nota núverandi vafra, en sumir eða allir eiginleikar virka mögulega ekki rétt, auk þess sem útlit og hegðun forritsins geta verið röng.",
|
||||
"features": "%(brand)s notar háþróaða vafraeiginleika sem eru ekki studdir af vafranum þínum.",
|
||||
"summary": "Vafrinn þinn getur ekki keyrt %(brand)s",
|
||||
"title": "Óstuddur vafri"
|
||||
},
|
||||
"powered_by_matrix": "Keyrt með Matrix",
|
||||
"powered_by_matrix_with_logo": "Dreifstýrt, dulritað spjall og samskipti keyrt með $matrixLogo",
|
||||
"unknown_device": "Óþekkt tæki",
|
||||
"use_brand_on_mobile": "Nota %(brand)s í síma",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s á %(osName)s",
|
||||
"welcome_to_element": "Velkomin í Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "JSON non valido",
|
||||
"misconfigured": "Il tuo elemento è configurato male"
|
||||
},
|
||||
"failed_to_start": "Avvio fallito",
|
||||
"go_to_element_io": "Vai su element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Installa <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> per una migliore esperienza.",
|
||||
"continue_warning": "Capisco i rischi e desidero continuare",
|
||||
"feature_warning": "Puoi comunque usare il browser attuale, ma alcune o tutte le caratteristiche potrebbero non funzionare e l'aspetto dell'applicazione potrebbe essere sbagliato.",
|
||||
"features": "%(brand)s usa funzionalità avanzate del browser che non sono supportate dal tuo browser attuale.",
|
||||
"summary": "Il tuo browser non può eseguire %(brand)s",
|
||||
"title": "Browser non supportato"
|
||||
},
|
||||
"powered_by_matrix": "Offerto da Matrix",
|
||||
"powered_by_matrix_with_logo": "Chat e collaborazioni criptate e decentralizzate offerte da $matrixLogo",
|
||||
"unknown_device": "Dispositivo sconosciuto",
|
||||
"use_brand_on_mobile": "Usa %(brand)s su mobile",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s su %(osName)s",
|
||||
"welcome_to_element": "Benvenuti su Element"
|
||||
}
|
||||
|
|
|
@ -20,19 +20,11 @@
|
|||
"invalid_json_generic": "不正なJSON",
|
||||
"misconfigured": "Elementの設定が誤っています"
|
||||
},
|
||||
"failed_to_start": "起動に失敗しました",
|
||||
"go_to_element_io": "element.ioへ移動",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "最高のユーザー体験を得るためには、<chromeLink>Chrome</chromeLink>か<firefoxLink>Firefox</firefoxLink>、もしくは<safariLink>Safari</safariLink>をインストールしてください。",
|
||||
"continue_warning": "リスクを理解して続行",
|
||||
"feature_warning": "現在のブラウザーを使い続けることもできますが、いくつか(もしくは全ての)機能が動作しなかったり、外観が崩れたりする可能性があります。",
|
||||
"features": "%(brand)sはブラウザーの高度な機能を使う必要がありますが、このブラウザーではその機能がサポートされていないようです。",
|
||||
"summary": "このブラウザーでは%(brand)sが動きません",
|
||||
"title": "サポートされていないブラウザー"
|
||||
},
|
||||
"powered_by_matrix_with_logo": "$matrixLogo による、分散型で暗号化された会話とコラボレーション",
|
||||
"unknown_device": "不明な端末",
|
||||
"use_brand_on_mobile": "携帯端末で%(brand)sを使用できます",
|
||||
"web_default_device_name": "%(appName)s: %(osName)sの%(browserName)s",
|
||||
"welcome_to_element": "Elementにようこそ"
|
||||
}
|
||||
|
|
|
@ -19,19 +19,11 @@
|
|||
"invalid_json_generic": "JSON ບໍ່ຖືກຕ້ອງ",
|
||||
"misconfigured": "ການຕັ້ງຄ່າແອັບ Element ຂອງທ່ານບໍ່ຖືກຕ້ອງ"
|
||||
},
|
||||
"failed_to_start": "ບໍ່ສາມາດເປີດໄດ້",
|
||||
"go_to_element_io": "ໄປຫາ element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "ກະລຸນາຕິດຕັ້ງ <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> ສຳລັບປະສົບການທີ່ດີທີ່ສຸດ.",
|
||||
"continue_warning": "ຂ້າພະເຈົ້າເຂົ້າໃຈຄວາມສ່ຽງ ແລະຢາກສືບຕໍ່",
|
||||
"feature_warning": "ທ່ານສາມາດສືບຕໍ່ນຳໃຊ້ບຣາວເຊີປັດຈຸບັນຂອງເຈົ້າໄດ້, ແຕ່ບາງຄຸນສົມບັດ ຫຼື ທັງໝົດອາດຈະບໍ່ເຮັດວຽກ ແລະ ລັກສະນະ ແລະ ຄວາມຮູ້ສຶກຂອງແອັບພລິເຄຊັນອາດບໍ່ຖືກຕ້ອງ.",
|
||||
"features": "%(brand)s ໃຊ້ຄຸນສົມບັດຂອງບຣາວເຊີຂັ້ນສູງທີ່ບຼາວເຊີປັດຈຸບັນຂອງທ່ານຍັງບໍ່ຮອງຮັບ.",
|
||||
"summary": "ບຣາວເຊີຂອງທ່ານບໍ່ສາມາດແລ່ນ %(brand)s ໄດ້",
|
||||
"title": "ບໍ່ຮັບຮອງເວັບບຣາວເຊີນີ້"
|
||||
},
|
||||
"powered_by_matrix": "ສະໜັບສະໜູນໂດຍ Matrix",
|
||||
"powered_by_matrix_with_logo": "ການສົນທະນາແບບເຂົ້າລະຫັດ ແລະກະຈ່າຍການຄຸ້ມຄອງ & ການຮ່ວມມື້ ແລະສະໜັບສະໜູນໂດຍ $matrixLogo",
|
||||
"unknown_device": "ທີ່ບໍ່ຮູ້ຈັກອຸປະກອນນີ້",
|
||||
"use_brand_on_mobile": "ໃຊ້ມືຖື %(brand)s",
|
||||
"welcome_to_element": "ຍິນດີຕ້ອນຮັບ"
|
||||
}
|
||||
|
|
|
@ -20,19 +20,11 @@
|
|||
"invalid_json_generic": "Klaidingas JSON",
|
||||
"misconfigured": "Jūsų Element yra neteisingai sukonfigūruotas"
|
||||
},
|
||||
"failed_to_start": "Nepavyko paleisti",
|
||||
"go_to_element_io": "Eiti į element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Geriausiam veikimui suinstaliuokite <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, arba <safariLink>Safari</safariLink>.",
|
||||
"continue_warning": "Suprantu šią riziką ir noriu tęsti",
|
||||
"feature_warning": "Jūs galite toliau naudotis savo dabartine naršykle, bet kai kurios arba visos funkcijos gali neveikti ir programos išvaizda bei sąsaja gali būti neteisingai rodoma.",
|
||||
"features": "%(brand)s naudoja išplėstines naršyklės funkcijas, kurių jūsų dabartinė naršyklė nepalaiko.",
|
||||
"summary": "Jūsų naršyklė negali paleisti %(brand)s",
|
||||
"title": "Nepalaikoma naršyklė"
|
||||
},
|
||||
"powered_by_matrix": "Veikia su Matrix",
|
||||
"powered_by_matrix_with_logo": "Decentralizuotas, užšifruotų pokalbių & bendradarbiavimas, paremtas $matrixLogo",
|
||||
"unknown_device": "Nežinomas įrenginys",
|
||||
"use_brand_on_mobile": "Naudoti %(brand)s mobiliajame telefone",
|
||||
"welcome_to_element": "Sveiki atvykę į Element"
|
||||
}
|
||||
|
|
|
@ -19,20 +19,12 @@
|
|||
"invalid_json_generic": "Ongeldige JSON",
|
||||
"misconfigured": "Jouw Element is verkeerd geconfigureerd"
|
||||
},
|
||||
"failed_to_start": "Opstarten mislukt",
|
||||
"go_to_element_io": "Ga naar element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Installeer <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, of <safariLink>Safari</safariLink> voor de beste gebruikservaring.",
|
||||
"continue_warning": "Ik begrijp de risico's en wil verder gaan",
|
||||
"feature_warning": "Je kan je huidige browser blijven gebruiken, maar sommige of alle functies zouden niet kunnen werken en de weergave van het programma kan verkeerd zijn.",
|
||||
"features": "%(brand)s gebruikt geavanceerde functies die niet ondersteund worden in je huidige browser.",
|
||||
"summary": "Jouw browser kan %(brand)s niet starten",
|
||||
"title": "Niet-ondersteunde browser"
|
||||
},
|
||||
"powered_by_matrix": "Mogelijk gemaakt door Matrix",
|
||||
"powered_by_matrix_with_logo": "Gedecentraliseerde, versleutelde chat & samenwerking mogelijk gemaakt door $matrixLogo",
|
||||
"unknown_device": "Onbekend apparaat",
|
||||
"use_brand_on_mobile": "Gebruik %(brand)s op je mobiel",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s op %(osName)s",
|
||||
"welcome_to_element": "Welkom bij Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,24 @@
|
|||
"invalid_json_generic": "Błędny JSON",
|
||||
"misconfigured": "Twój Element jest nieprawidłowo skonfigurowany"
|
||||
},
|
||||
"failed_to_start": "Nie udało się wystartować",
|
||||
"go_to_element_io": "Przejdź do element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Zainstaluj <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, lub <safariLink>Safari</safariLink> w celu zapewnienia najlepszego działania.",
|
||||
"continue_warning": "Rozumiem ryzyko i chcę kontynuować",
|
||||
"feature_warning": "Możesz kontynuować używając obecnej przeglądarki, lecz niektóre lub wszystkie funkcje mogą nie działać oraz wygląd aplikacji może być niepoprawny.",
|
||||
"features": "%(brand)s używa funkcji zaawansowanych, które nie są dostępne w Twojej przeglądarce.",
|
||||
"summary": "Twoja przeglądarka nie obsługuje %(brand)s",
|
||||
"title": "Niewspierana przeglądarka"
|
||||
"continue": "Kontynuuj mimo to",
|
||||
"description": "%(brand)s korzysta z niektórych funkcji, które nie są obecnie dostępne w Twojej przeglądarce. %(detail)s",
|
||||
"detail_can_continue": "Jeśli kontynuujesz, niektóre funkcje mogą przestać działać, jak i istnieje ryzyko utraty danych w przyszłości.",
|
||||
"detail_no_continue": "Zaktualizuj przeglądarkę, jeśli jeszcze tego nie zrobiłeś i spróbuj ponownie.",
|
||||
"learn_more": "Dowiedz się więcej",
|
||||
"linux": "Linux",
|
||||
"macos": "Mac",
|
||||
"supported_browsers": "Dla najlepszego doświadczenia korzystaj z <Chrome>Chrome</Chrome>, <Firefox>Firefox</Firefox>, <Edge>Edge</Edge> lub <Safari>Safari</Safari>.",
|
||||
"title": "%(brand)s nie wspiera tej przeglądarki",
|
||||
"use_desktop_heading": "Zamiast tego użyj %(brand)s Desktop",
|
||||
"use_mobile_heading": "Zamiast tego użyj %(brand)s Mobile",
|
||||
"use_mobile_heading_after_desktop": "lub skorzystaj z naszej aplikacji mobilnej",
|
||||
"windows": "Windows (%(bits)s-bit)"
|
||||
},
|
||||
"powered_by_matrix": "Zasilane przez Matrix",
|
||||
"powered_by_matrix_with_logo": "Zdecentralizowany czat szyfrowany i współpraca oparta na $matrixLogo",
|
||||
"unknown_device": "Nieznane urządzenie",
|
||||
"use_brand_on_mobile": "Użyj %(brand)s w telefonie",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s na %(osName)s",
|
||||
"welcome_to_element": "Witamy w Element"
|
||||
}
|
||||
|
|
|
@ -19,19 +19,11 @@
|
|||
"invalid_json_generic": "JSON inválido",
|
||||
"misconfigured": "Seu Element está mal configurado"
|
||||
},
|
||||
"failed_to_start": "Falha para iniciar",
|
||||
"go_to_element_io": "Ir para element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Por favor instale <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ou <safariLink>Safari</safariLink> para a melhor experiência.",
|
||||
"continue_warning": "Eu entendo os riscos e desejo continuar",
|
||||
"feature_warning": "Você pode continuar usando seu browser atual, mas alguma ou toda funcionalidade pode não funcionar e a aparência e sensação do aplicativo pode estar incorretas.",
|
||||
"features": "%(brand)s usa funcionalidade de browser avançada que não é suportada por seu browser atual.",
|
||||
"summary": "Seu browser não consegue rodar %(brand)s",
|
||||
"title": "Browser insuportado"
|
||||
},
|
||||
"powered_by_matrix_with_logo": "Chat descentralizado e encriptado & colaboração, powered by $matrixLogo",
|
||||
"unknown_device": "Dispositivo desconhecido",
|
||||
"use_brand_on_mobile": "Usar %(brand)s em celular",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s em %(osName)s",
|
||||
"welcome_to_element": "Boas-vindas a Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Неверный JSON",
|
||||
"misconfigured": "Ваш Element неверно настроен"
|
||||
},
|
||||
"failed_to_start": "Старт не удался",
|
||||
"go_to_element_io": "К element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Пожалуйста поставьте <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, или <safariLink>Safari</safariLink> для лучшей совместимости.",
|
||||
"continue_warning": "Я понимаю риск и хочу продолжить",
|
||||
"feature_warning": "Вы можете продолжать пользоваться этим браузером, но некоторые возможности будут недоступны и интерфейс может быть отрисован неправильно.",
|
||||
"features": "%(brand)s использует расширенные возможности, которые не поддерживаются вашим браузером.",
|
||||
"summary": "Ваш браузер не может запустить %(brand)s",
|
||||
"title": "Неподдерживаемый браузер"
|
||||
},
|
||||
"powered_by_matrix": "На технологии Matrix",
|
||||
"powered_by_matrix_with_logo": "Децентрализованное, зашифрованное общение и сотрудничество на основе $matrixLogo",
|
||||
"unknown_device": "Неизвестное устройство",
|
||||
"use_brand_on_mobile": "Воспользуйтесь %(brand)s на мобильном телефоне",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s на %(osName)s",
|
||||
"welcome_to_element": "Добро пожаловать в Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Neplatný JSON",
|
||||
"misconfigured": "Váš Element je nesprávne nastavený"
|
||||
},
|
||||
"failed_to_start": "Spustenie zlyhalo",
|
||||
"go_to_element_io": "Prejsť na element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Prosím, nainštalujte si <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> alebo <safariLink>Safari</safariLink> pre najlepší zážitok.",
|
||||
"continue_warning": "Rozumiem riziku a chcem pokračovať",
|
||||
"feature_warning": "Môžete naďalej používať váš súčasný prehliadač, ale niektoré alebo všetky funkcie nemusia fungovať a zážitok z aplikácie nemusí byť optimálny.",
|
||||
"features": "%(brand)s používa pokročilé funkcie prehliadača, ktoré nie sú podporované vaším aktuálnym prehliadačom.",
|
||||
"summary": "Váš prehliadač nedokáže spustiť %(brand)s",
|
||||
"title": "Nepodporovaný prehliadač"
|
||||
},
|
||||
"powered_by_matrix": "používa protokol Matrix",
|
||||
"powered_by_matrix_with_logo": "Decentralizované, šifrované konverzácie a spolupráca na platforme $matrixLogo",
|
||||
"unknown_device": "Neznáme zariadenie",
|
||||
"use_brand_on_mobile": "Používať %(brand)s na mobilnom zariadení",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s na %(osName)s",
|
||||
"welcome_to_element": "Víta vás Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "JSON i pavlefshëm",
|
||||
"misconfigured": "Element-i juaj është i keqformësuar"
|
||||
},
|
||||
"failed_to_start": "S’u arrit të nisej",
|
||||
"go_to_element_io": "Shko te element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Ju lutemi, për funksionimin më të mirë, instaloni <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ose <safariLink>Safari</safariLink>.",
|
||||
"continue_warning": "I kuptoj rreziqet dhe dëshiroj të vazhdoj",
|
||||
"feature_warning": "Mund të vazhdoni të përdorni shfletuesin tuaj të tanishëm, por disa ose krejt veçoritë mund të mos funksionojnë dhe pamja dhe ndjesitë prej aplikacionit të mos jenë të sakta.",
|
||||
"features": "%(brand)s përdor veçori të thelluara të shfletuesit, të cilat shfletuesi juaj i tanishëm s’i mbulon.",
|
||||
"summary": "Shfletuesi juaj s’mund të xhirojë %(brand)s",
|
||||
"title": "Shfletues i pambuluar"
|
||||
},
|
||||
"powered_by_matrix": "Bazuar në Matrix",
|
||||
"powered_by_matrix_with_logo": "Fjalosje & bashkëpunim i decentralizuar, i fshehtëzuar, bazuar në $matrixLogo",
|
||||
"unknown_device": "Pajisje e panjohur",
|
||||
"use_brand_on_mobile": "Përdor %(brand)s në celular",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s në %(osName)s",
|
||||
"welcome_to_element": "Mirë se vini te Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Ogiltig JSON",
|
||||
"misconfigured": "Din Element är felkonfigurerad"
|
||||
},
|
||||
"failed_to_start": "Misslyckade att starta",
|
||||
"go_to_element_io": "Gå till element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Installera <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, eller <safariLink>Safari</safariLink> för den bästa upplevelsen.",
|
||||
"continue_warning": "Jag förstår riskerna och vill fortsätta",
|
||||
"feature_warning": "Du kan fortsätta använda din nuvarande webbläsare, men vissa eller alla funktioner kanske inte fungerar och utseendet och känslan av applikationen kan var felaktig.",
|
||||
"features": "%(brand)s använder avancerade webbläsarfunktioner som inte stöds av din aktuella webbläsare.",
|
||||
"summary": "Din webbläsare kan inte köra %(brand)s",
|
||||
"title": "Webbläsaren stöds ej"
|
||||
},
|
||||
"powered_by_matrix": "Drivs av Matrix",
|
||||
"powered_by_matrix_with_logo": "Decentraliserad krypterad chatt & samarbete som drivs av $matrixLogo",
|
||||
"unknown_device": "Okänd enhet",
|
||||
"use_brand_on_mobile": "Använd %(brand)s på mobilen",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s på %(osName)s",
|
||||
"welcome_to_element": "Välkommen till Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "Хибний JSON",
|
||||
"misconfigured": "Ваш Element налаштовано неправильно"
|
||||
},
|
||||
"failed_to_start": "Не вдалося запустити",
|
||||
"go_to_element_io": "Перейти на element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Для найкращих вражень від користування встановіть, будь ласка, <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, або <safariLink>Safari</safariLink>.",
|
||||
"continue_warning": "Я усвідомлюю ризик і бажаю продовжити",
|
||||
"feature_warning": "Ви можете продовжити, користуючись вашим поточним браузером, але деякі функції можуть не працювати, а застосунок може виглядати неправильно.",
|
||||
"features": "%(brand)s використовує передові властивості, які ваш браузер не підтримує.",
|
||||
"summary": "Ваш браузер не може запустити %(brand)s",
|
||||
"title": "Непідтримуваний браузер"
|
||||
},
|
||||
"powered_by_matrix": "Працює на Matrix",
|
||||
"powered_by_matrix_with_logo": "Децентралізована, зашифрована бесіда та співпраця на основі $matrixLogo",
|
||||
"unknown_device": "Невідомий пристрій",
|
||||
"use_brand_on_mobile": "Користуйтеся %(brand)s на мобільному",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s на %(osName)s",
|
||||
"welcome_to_element": "Ласкаво просимо до Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "JSON không hợp lệ",
|
||||
"misconfigured": "Element đang bị thiết lập sai"
|
||||
},
|
||||
"failed_to_start": "Không khởi động được",
|
||||
"go_to_element_io": "Qua element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "Hãy cài đặt <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, hoặc <safariLink>Safari</safariLink> để có trải nghiệm tốt nhất.",
|
||||
"continue_warning": "Tôi hiểu rủi ro và muốn tiếp tục",
|
||||
"feature_warning": "Bạn có thể tiếp tục sử dụng trình duyệt hiện tại, tuy nhiên các tính năng có thể sẽ không hoạt động và trải nghiệm ứng dụng có thể sẽ không được tốt.",
|
||||
"features": "%(brand)s sử dụng một số tính năng nâng cao mà trình duyệt của bạn không thể đáp ứng.",
|
||||
"summary": "Trình duyệt của bạn không thể chạy %(brand)s",
|
||||
"title": "Trình duyệt không được hỗ trợ"
|
||||
},
|
||||
"powered_by_matrix": "Chạy trên giao thức Matrix",
|
||||
"powered_by_matrix_with_logo": "Dịch vụ nhắn tin & liên lạc được mã hóa, phi tập trung. Được vận hành trên $matrixLogo",
|
||||
"unknown_device": "Thiết bị không xác định",
|
||||
"use_brand_on_mobile": "Sử dụng %(brand)s trên di động",
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s trên %(osName)s",
|
||||
"welcome_to_element": "Chào mừng tới Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "无效的 JSON",
|
||||
"misconfigured": "Element 配置错误"
|
||||
},
|
||||
"failed_to_start": "启动失败",
|
||||
"go_to_element_io": "前往 element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "请安装 <chromeLink>Chrome</chromeLink>、<firefoxLink>Firefox</firefoxLink> 或 <safariLink>Safari</safariLink> 以获得最佳体验。",
|
||||
"continue_warning": "我了解风险并希望继续",
|
||||
"feature_warning": "您可以继续使用您目前的浏览器,但部分或全部功能可能无法正常工作,应用程序的外观可能也看起来不正确。",
|
||||
"features": "当前浏览器不支持 %(brand)s 所需的高级浏览器特性。",
|
||||
"summary": "你的浏览器无法运行 %(brand)s",
|
||||
"title": "不支持的浏览器"
|
||||
},
|
||||
"powered_by_matrix": "由 Matrix 驱动",
|
||||
"powered_by_matrix_with_logo": "去中心化、加密的聊天与协作,由 $matrixLogo 驱动",
|
||||
"unknown_device": "未知设备",
|
||||
"use_brand_on_mobile": "在移动设备上使用 %(brand)s",
|
||||
"web_default_device_name": "%(appName)s:%(browserName)s在%(osName)s",
|
||||
"welcome_to_element": "欢迎来到 Element"
|
||||
}
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
"invalid_json_generic": "無效的 JSON",
|
||||
"misconfigured": "您的 Element 設定錯誤"
|
||||
},
|
||||
"failed_to_start": "啟動失敗",
|
||||
"go_to_element_io": "前往 element.io",
|
||||
"incompatible_browser": {
|
||||
"browser_links": "請安裝 <chromeLink>Chrome</chromeLink>、<firefoxLink>Firefox</firefoxLink> 或 <safariLink>Safari</safariLink> 以取得最佳體驗。",
|
||||
"continue_warning": "我了解風險並希望繼續",
|
||||
"feature_warning": "您可以繼續使用目前的瀏覽器,但部份或全部的功能可能會無法運作,而應用程式的外觀與感覺可能也可能不正確。",
|
||||
"features": "%(brand)s 使用了您目前瀏覽器不支援的進階功能。",
|
||||
"summary": "您的瀏覽器無法執行 %(brand)s",
|
||||
"title": "不支援的瀏覽器"
|
||||
},
|
||||
"powered_by_matrix": "由Matrix支持",
|
||||
"powered_by_matrix_with_logo": "由 $matrixLogo 驅動的去中心化、加密的聊天與協作工具",
|
||||
"unknown_device": "未知裝置",
|
||||
"use_brand_on_mobile": "在行動裝置上使用 %(brand)s",
|
||||
"web_default_device_name": "%(appName)s:%(osName)s 的 %(browserName)s",
|
||||
"welcome_to_element": "歡迎使用 Element"
|
||||
}
|
||||
|
|
|
@ -25,13 +25,13 @@ const serverSupportMap: {
|
|||
};
|
||||
} = {};
|
||||
|
||||
self.addEventListener("install", (event) => {
|
||||
global.addEventListener("install", (event) => {
|
||||
// We skipWaiting() to update the service worker more frequently, particularly in development environments.
|
||||
// @ts-expect-error - service worker types are not available. See 'fetch' event handler.
|
||||
event.waitUntil(skipWaiting());
|
||||
});
|
||||
|
||||
self.addEventListener("activate", (event) => {
|
||||
global.addEventListener("activate", (event) => {
|
||||
// We force all clients to be under our control, immediately. This could be old tabs.
|
||||
// @ts-expect-error - service worker types are not available. See 'fetch' event handler.
|
||||
event.waitUntil(clients.claim());
|
||||
|
@ -40,7 +40,7 @@ self.addEventListener("activate", (event) => {
|
|||
// @ts-expect-error - the service worker types conflict with the DOM types available through TypeScript. Many hours
|
||||
// have been spent trying to convince the type system that there's no actual conflict, but it has yet to work. Instead
|
||||
// of trying to make it do the thing, we force-cast to something close enough where we can (and ignore errors otherwise).
|
||||
self.addEventListener("fetch", (event: FetchEvent) => {
|
||||
global.addEventListener("fetch", (event: FetchEvent) => {
|
||||
// This is the authenticated media (MSC3916) check, proxying what was unauthenticated to the authenticated variants.
|
||||
|
||||
if (event.request.method !== "GET") {
|
||||
|
@ -72,7 +72,7 @@ self.addEventListener("fetch", (event: FetchEvent) => {
|
|||
|
||||
// Locate our access token, and populate the fetchConfig with the authentication header.
|
||||
// @ts-expect-error - service worker types are not available. See 'fetch' event handler.
|
||||
const client = await self.clients.get(event.clientId);
|
||||
const client = await global.clients.get(event.clientId);
|
||||
accessToken = await getAccessToken(client);
|
||||
|
||||
// Update or populate the server support map using a (usually) authenticated `/versions` call.
|
||||
|
@ -166,9 +166,9 @@ async function askClientForUserIdParams(client: unknown): Promise<{ userId: stri
|
|||
if (event.data?.responseKey !== responseKey) return; // not for us
|
||||
clearTimeout(timeoutId); // do this as soon as possible, avoiding a race between resolve and reject.
|
||||
resolve(event.data); // "unblock" the remainder of the thread, if that were such a thing in JavaScript.
|
||||
self.removeEventListener("message", listener); // cleanup, since we're not going to do anything else.
|
||||
global.removeEventListener("message", listener); // cleanup, since we're not going to do anything else.
|
||||
};
|
||||
self.addEventListener("message", listener);
|
||||
global.addEventListener("message", listener);
|
||||
|
||||
// Ask the tab for the information we need. This is handled by WebPlatform.
|
||||
(client as Window).postMessage({ responseKey, type: "userinfo" });
|
||||
|
|
|
@ -23,7 +23,7 @@ export async function getVectorConfig(relativeLocation = ""): Promise<IConfigOpt
|
|||
|
||||
// Handle trailing dot FQDNs
|
||||
let domain = window.location.hostname.trimEnd();
|
||||
if (domain[domain.length - 1] === ".") {
|
||||
if (domain.endsWith(".")) {
|
||||
domain = domain.slice(0, -1);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { shouldPolyfill as shouldPolyFillIntlSegmenter } from "@formatjs/intl-segmenter/should-polyfill";
|
||||
|
||||
// These are things that can run before the skin loads - be careful not to reference the react-sdk though.
|
||||
import { parseQsFromFragment } from "./url_utils";
|
||||
|
@ -77,6 +78,8 @@ function checkBrowserFeatures(): boolean {
|
|||
// ES2024: https://402.ecma-international.org/9.0/#sec-intl.segmenter
|
||||
// The built-in modernizer 'intl' check only checks for the presence of the Intl object, not the Segmenter,
|
||||
// and older Firefox has the former but not the latter, so we add our own.
|
||||
// This is polyfilled now, but we still want to show the warning because we want to remove the polyfill
|
||||
// at some point.
|
||||
window.Modernizr.addTest("intlsegmenter", () => typeof window.Intl?.Segmenter === "function");
|
||||
|
||||
// Basic test for WebAssembly support. We could also try instantiating a simple module,
|
||||
|
@ -112,6 +115,10 @@ const supportedBrowser = checkBrowserFeatures();
|
|||
// the browser to use as much parallelism as it can.
|
||||
// Load parallelism is based on research in https://github.com/element-hq/element-web/issues/12253
|
||||
async function start(): Promise<void> {
|
||||
if (shouldPolyFillIntlSegmenter()) {
|
||||
await import(/* webpackChunkName: "intl-segmenter-polyfill" */ "@formatjs/intl-segmenter/polyfill-force");
|
||||
}
|
||||
|
||||
// load init.ts async so that its code is not executed immediately and we can catch any exceptions
|
||||
const {
|
||||
rageshakePromise,
|
||||
|
@ -132,6 +139,8 @@ async function start(): Promise<void> {
|
|||
"./init"
|
||||
);
|
||||
|
||||
// Now perform the next stage of initialisation. This has its own try/catch in which we render
|
||||
// a react error page on failure.
|
||||
try {
|
||||
// give rageshake a chance to load/fail, we don't actually assert rageshake loads, we allow it to fail if no IDB
|
||||
await settled(rageshakePromise);
|
||||
|
|
|
@ -109,12 +109,10 @@ export async function loadApp(fragParams: {}): Promise<void> {
|
|||
}
|
||||
|
||||
export async function showError(title: string, messages?: string[]): Promise<void> {
|
||||
const ErrorView = (
|
||||
await import(
|
||||
/* webpackChunkName: "error-view" */
|
||||
"../async-components/structures/ErrorView"
|
||||
)
|
||||
).default;
|
||||
const { ErrorView } = await import(
|
||||
/* webpackChunkName: "error-view" */
|
||||
"../async-components/structures/ErrorView"
|
||||
);
|
||||
window.matrixChat = ReactDOM.render(
|
||||
<ErrorView title={title} messages={messages} />,
|
||||
document.getElementById("matrixchat"),
|
||||
|
@ -122,14 +120,12 @@ export async function showError(title: string, messages?: string[]): Promise<voi
|
|||
}
|
||||
|
||||
export async function showIncompatibleBrowser(onAccept: () => void): Promise<void> {
|
||||
const CompatibilityView = (
|
||||
await import(
|
||||
/* webpackChunkName: "compatibility-view" */
|
||||
"../async-components/structures/CompatibilityView"
|
||||
)
|
||||
).default;
|
||||
const { UnsupportedBrowserView } = await import(
|
||||
/* webpackChunkName: "error-view" */
|
||||
"../async-components/structures/ErrorView"
|
||||
);
|
||||
window.matrixChat = ReactDOM.render(
|
||||
<CompatibilityView onAccept={onAccept} />,
|
||||
<UnsupportedBrowserView onAccept={onAccept} />,
|
||||
document.getElementById("matrixchat"),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -34,7 +34,6 @@ import type {
|
|||
JitsiMeetExternalAPIConstructor,
|
||||
ExternalAPIEventCallbacks,
|
||||
JitsiMeetExternalAPI as _JitsiMeetExternalAPI,
|
||||
AudioMuteStatusChangedEvent,
|
||||
LogEvent,
|
||||
VideoMuteStatusChangedEvent,
|
||||
ExternalAPIOptions as _ExternalAPIOptions,
|
||||
|
@ -103,6 +102,14 @@ let widgetApi: WidgetApi | undefined;
|
|||
let meetApi: _JitsiMeetExternalAPI | undefined;
|
||||
let skipOurWelcomeScreen = false;
|
||||
|
||||
async function checkAudioVideoEnabled(): Promise<[audioEnabled: boolean, videoEnabled: boolean]> {
|
||||
if (!meetApi) return [false, false];
|
||||
const [audioEnabled, videoEnabled] = (await Promise.all([meetApi.isAudioMuted(), meetApi.isVideoMuted()])).map(
|
||||
(muted) => !muted,
|
||||
);
|
||||
return [audioEnabled, videoEnabled];
|
||||
}
|
||||
|
||||
const setupCompleted = (async (): Promise<string | void> => {
|
||||
try {
|
||||
// Queue a config.json lookup asap, so we can use it later on. We want this to be concurrent with
|
||||
|
@ -159,7 +166,7 @@ const setupCompleted = (async (): Promise<string | void> => {
|
|||
|
||||
const handleAction = (
|
||||
action: WidgetApiAction,
|
||||
handler: (request: IWidgetApiRequestData) => Promise<void>,
|
||||
handler: (request: IWidgetApiRequestData) => Promise<IWidgetApiResponseData | void>,
|
||||
): void => {
|
||||
widgetApi!.on(`action:${action}`, async (ev: CustomEvent<IWidgetApiRequest>) => {
|
||||
ev.preventDefault();
|
||||
|
@ -167,8 +174,7 @@ const setupCompleted = (async (): Promise<string | void> => {
|
|||
|
||||
let response: IWidgetApiResponseData;
|
||||
try {
|
||||
await handler(ev.detail.data);
|
||||
response = {};
|
||||
response = (await handler(ev.detail.data)) ?? {};
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
response = { error: { message: e.message } };
|
||||
|
@ -194,25 +200,26 @@ const setupCompleted = (async (): Promise<string | void> => {
|
|||
meetApi?.executeCommand("hangup");
|
||||
}
|
||||
});
|
||||
handleAction(ElementWidgetActions.MuteAudio, async () => {
|
||||
if (meetApi && !(await meetApi.isAudioMuted())) {
|
||||
handleAction(ElementWidgetActions.DeviceMute, async (params) => {
|
||||
if (!meetApi) return;
|
||||
|
||||
const [audioEnabled, videoEnabled] = await checkAudioVideoEnabled();
|
||||
|
||||
if (Object.keys(params).length === 0) {
|
||||
// Handle query
|
||||
return {
|
||||
audio_enabled: audioEnabled,
|
||||
video_enabled: videoEnabled,
|
||||
};
|
||||
}
|
||||
|
||||
if (params.audio_enabled !== audioEnabled) {
|
||||
meetApi.executeCommand("toggleAudio");
|
||||
}
|
||||
});
|
||||
handleAction(ElementWidgetActions.UnmuteAudio, async () => {
|
||||
if (meetApi && (await meetApi.isAudioMuted())) {
|
||||
meetApi.executeCommand("toggleAudio");
|
||||
}
|
||||
});
|
||||
handleAction(ElementWidgetActions.MuteVideo, async () => {
|
||||
if (meetApi && !(await meetApi.isVideoMuted())) {
|
||||
meetApi.executeCommand("toggleVideo");
|
||||
}
|
||||
});
|
||||
handleAction(ElementWidgetActions.UnmuteVideo, async () => {
|
||||
if (meetApi && (await meetApi.isVideoMuted())) {
|
||||
if (params.video_enabled !== videoEnabled) {
|
||||
meetApi.executeCommand("toggleVideo");
|
||||
}
|
||||
return params;
|
||||
});
|
||||
handleAction(ElementWidgetActions.TileLayout, async () => {
|
||||
meetApi?.executeCommand("setTileView", true);
|
||||
|
@ -473,7 +480,7 @@ async function joinConference(audioInput?: string | null, videoInput?: string |
|
|||
meetApi.on("videoConferenceLeft", onVideoConferenceLeft);
|
||||
meetApi.on("readyToClose", closeConference as ExternalAPIEventCallbacks["readyToClose"]);
|
||||
meetApi.on("errorOccurred", onErrorOccurred);
|
||||
meetApi.on("audioMuteStatusChanged", onAudioMuteStatusChanged);
|
||||
meetApi.on("audioMuteStatusChanged", onMuteStatusChanged);
|
||||
meetApi.on("videoMuteStatusChanged", onVideoMuteStatusChanged);
|
||||
|
||||
(["videoConferenceJoined", "participantJoined", "participantLeft"] as const).forEach((event) => {
|
||||
|
@ -523,9 +530,13 @@ const onErrorOccurred = ({ error }: Parameters<ExternalAPIEventCallbacks["errorO
|
|||
}
|
||||
};
|
||||
|
||||
const onAudioMuteStatusChanged = ({ muted }: AudioMuteStatusChangedEvent): void => {
|
||||
const action = muted ? ElementWidgetActions.MuteAudio : ElementWidgetActions.UnmuteAudio;
|
||||
void widgetApi?.transport.send(action, {});
|
||||
const onMuteStatusChanged = async (): Promise<void> => {
|
||||
if (!meetApi) return;
|
||||
const [audioEnabled, videoEnabled] = await checkAudioVideoEnabled();
|
||||
void widgetApi?.transport.send(ElementWidgetActions.DeviceMute, {
|
||||
audio_enabled: audioEnabled,
|
||||
video_enabled: videoEnabled,
|
||||
});
|
||||
};
|
||||
|
||||
const onVideoMuteStatusChanged = ({ muted }: VideoMuteStatusChangedEvent): void => {
|
||||
|
@ -534,11 +545,9 @@ const onVideoMuteStatusChanged = ({ muted }: VideoMuteStatusChangedEvent): void
|
|||
// hanging up, which we need to ignore by padding the timeout here,
|
||||
// otherwise the React SDK will mistakenly think the user turned off
|
||||
// their video by hand
|
||||
setTimeout(() => {
|
||||
if (meetApi) void widgetApi?.transport.send(ElementWidgetActions.MuteVideo, {});
|
||||
}, 200);
|
||||
setTimeout(() => onMuteStatusChanged, 200);
|
||||
} else {
|
||||
void widgetApi?.transport.send(ElementWidgetActions.UnmuteVideo, {});
|
||||
void onMuteStatusChanged();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
if (window.localStorage) {
|
||||
Object.keys(window.localStorage).forEach((key) => {
|
||||
if (key.indexOf("loglevel:") === 0) {
|
||||
if (key.startsWith("loglevel:")) {
|
||||
window.localStorage.removeItem(key);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -70,7 +70,7 @@ async function initPage(): Promise<void> {
|
|||
try {
|
||||
const result = await fetch(`https://${serverName}/.well-known/matrix/client`);
|
||||
const wkConfig = await result.json();
|
||||
if (wkConfig && wkConfig["m.homeserver"]) {
|
||||
if (wkConfig?.["m.homeserver"]) {
|
||||
hsUrl = wkConfig["m.homeserver"]["base_url"];
|
||||
|
||||
if (wkConfig["m.identity_server"]) {
|
||||
|
@ -78,7 +78,7 @@ async function initPage(): Promise<void> {
|
|||
}
|
||||
}
|
||||
} catch (e) {
|
||||
if (wkConfig && wkConfig["m.homeserver"]) {
|
||||
if (wkConfig?.["m.homeserver"]) {
|
||||
hsUrl = wkConfig["m.homeserver"]["base_url"] || undefined;
|
||||
|
||||
if (wkConfig["m.identity_server"]) {
|
||||
|
|
|
@ -170,8 +170,8 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
|||
title: _t("download_completed"),
|
||||
props: {
|
||||
description: name,
|
||||
acceptLabel: _t("action|open"),
|
||||
onAccept,
|
||||
primaryLabel: _t("action|open"),
|
||||
onPrimaryClick: onAccept,
|
||||
dismissLabel: _t("action|dismiss"),
|
||||
onDismiss,
|
||||
numSeconds: 10,
|
||||
|
|
|
@ -16,8 +16,9 @@ limitations under the License.
|
|||
|
||||
import * as React from "react";
|
||||
import { render } from "@testing-library/react";
|
||||
import SdkConfig from "matrix-react-sdk/src/SdkConfig";
|
||||
|
||||
import ErrorView from "../../../../src/async-components/structures/ErrorView";
|
||||
import { ErrorView, UnsupportedBrowserView } from "../../../../src/async-components/structures/ErrorView";
|
||||
import { setupLanguageMock } from "../../../setup/setupLanguage";
|
||||
|
||||
describe("<ErrorView />", () => {
|
||||
|
@ -30,3 +31,15 @@ describe("<ErrorView />", () => {
|
|||
expect(asFragment()).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
||||
describe("<UnsupportedBrowserView />", () => {
|
||||
beforeEach(() => {
|
||||
setupLanguageMock();
|
||||
SdkConfig.put({});
|
||||
});
|
||||
|
||||
it("should match snapshot", () => {
|
||||
const { asFragment } = render(<UnsupportedBrowserView />);
|
||||
expect(asFragment()).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -3,63 +3,248 @@
|
|||
exports[`<ErrorView /> should match snapshot 1`] = `
|
||||
<DocumentFragment>
|
||||
<div
|
||||
class="mx_ErrorView"
|
||||
class="mx_ErrorView cpd-theme-light"
|
||||
>
|
||||
<img
|
||||
alt="Element"
|
||||
class="mx_ErrorView_logo"
|
||||
height="160"
|
||||
src="themes/element/img/logos/element-app-logo.png"
|
||||
/>
|
||||
<div
|
||||
class="mx_ErrorView_container"
|
||||
>
|
||||
<div
|
||||
class="mx_HomePage_header"
|
||||
<h1
|
||||
class="_typography_yh5dq_162 _font-heading-md-semibold_yh5dq_121"
|
||||
>
|
||||
<span
|
||||
class="mx_HomePage_logo"
|
||||
>
|
||||
<img
|
||||
alt="Element"
|
||||
height="42"
|
||||
src="themes/element/img/logos/element-logo.svg"
|
||||
/>
|
||||
</span>
|
||||
<h1>
|
||||
Failed to start
|
||||
</h1>
|
||||
</div>
|
||||
<div
|
||||
class="mx_HomePage_col"
|
||||
TITLE
|
||||
</h1>
|
||||
<p
|
||||
class="_typography_yh5dq_162 _font-body-lg-regular_yh5dq_78"
|
||||
>
|
||||
<div
|
||||
class="mx_HomePage_row"
|
||||
>
|
||||
<div>
|
||||
<h2
|
||||
id="step1_heading"
|
||||
>
|
||||
TITLE
|
||||
</h2>
|
||||
<p>
|
||||
MSG1
|
||||
</p>
|
||||
<p>
|
||||
MSG2
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="mx_HomePage_row mx_Center mx_Spacer"
|
||||
MSG1
|
||||
</p>
|
||||
<p
|
||||
class="_typography_yh5dq_162 _font-body-lg-regular_yh5dq_78"
|
||||
>
|
||||
<p
|
||||
class="mx_Spacer"
|
||||
>
|
||||
<a
|
||||
class="mx_FooterLink"
|
||||
href="https://element.io"
|
||||
target="_blank"
|
||||
>
|
||||
Go to element.io
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
MSG2
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</DocumentFragment>
|
||||
`;
|
||||
|
||||
exports[`<UnsupportedBrowserView /> should match snapshot 1`] = `
|
||||
<DocumentFragment>
|
||||
<div
|
||||
class="mx_ErrorView cpd-theme-light"
|
||||
>
|
||||
<img
|
||||
alt="Element"
|
||||
class="mx_ErrorView_logo"
|
||||
height="160"
|
||||
src="themes/element/img/logos/element-app-logo.png"
|
||||
/>
|
||||
<div
|
||||
class="mx_ErrorView_container"
|
||||
>
|
||||
<h1
|
||||
class="_typography_yh5dq_162 _font-heading-md-semibold_yh5dq_121"
|
||||
>
|
||||
Element does not support this browser
|
||||
</h1>
|
||||
<p
|
||||
class="_typography_yh5dq_162 _font-body-lg-regular_yh5dq_78"
|
||||
>
|
||||
Element uses some browser features which are not available in your current browser. Try updating this browser if you're not using the latest version and try again.
|
||||
</p>
|
||||
<p
|
||||
class="_typography_yh5dq_162 _font-body-lg-regular_yh5dq_78"
|
||||
>
|
||||
<span>
|
||||
For the best experience, use
|
||||
<a
|
||||
href="https://google.com/chrome"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
Chrome
|
||||
</a>
|
||||
,
|
||||
<a
|
||||
href="https://firefox.com"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
Firefox
|
||||
</a>
|
||||
,
|
||||
<a
|
||||
href="https://microsoft.com/edge"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
Edge
|
||||
</a>
|
||||
, or
|
||||
<a
|
||||
href="https://apple.com/safari"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
Safari
|
||||
</a>
|
||||
.
|
||||
</span>
|
||||
</p>
|
||||
<div
|
||||
class="mx_Flex mx_ErrorView_buttons"
|
||||
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: start; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-4x);"
|
||||
>
|
||||
<button
|
||||
class="_button_zt6rp_17 _has-icon_zt6rp_61"
|
||||
data-kind="secondary"
|
||||
data-size="sm"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
>
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
height="20"
|
||||
viewBox="0 0 24 24"
|
||||
width="20"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M5 3h6a1 1 0 1 1 0 2H5v14h14v-6a1 1 0 1 1 2 0v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2Z"
|
||||
/>
|
||||
<path
|
||||
d="M15 3h5a1 1 0 0 1 1 1v5a1 1 0 1 1-2 0V6.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L17.586 5H15a1 1 0 1 1 0-2Z"
|
||||
/>
|
||||
</svg>
|
||||
Learn more
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="_separator_144s5_17"
|
||||
data-kind="primary"
|
||||
data-orientation="horizontal"
|
||||
role="separator"
|
||||
/>
|
||||
<h2
|
||||
class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102"
|
||||
>
|
||||
Use Element Desktop instead
|
||||
</h2>
|
||||
<div
|
||||
class="mx_Flex"
|
||||
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: start; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-4x);"
|
||||
>
|
||||
<a
|
||||
class="_button_zt6rp_17 _has-icon_zt6rp_61"
|
||||
data-kind="secondary"
|
||||
data-size="lg"
|
||||
href="https://packages.element.io/desktop/install/macos/Element.dmg"
|
||||
role="link"
|
||||
tabindex="0"
|
||||
>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
height="20"
|
||||
width="20"
|
||||
/>
|
||||
Mac
|
||||
</a>
|
||||
<a
|
||||
class="_button_zt6rp_17 _has-icon_zt6rp_61"
|
||||
data-kind="secondary"
|
||||
data-size="lg"
|
||||
href="https://packages.element.io/desktop/install/win32/x64/Element%20Setup.exe"
|
||||
role="link"
|
||||
tabindex="0"
|
||||
>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
height="20"
|
||||
width="20"
|
||||
/>
|
||||
Windows (64-bit)
|
||||
</a>
|
||||
<a
|
||||
class="_button_zt6rp_17 _has-icon_zt6rp_61"
|
||||
data-kind="secondary"
|
||||
data-size="lg"
|
||||
href="https://packages.element.io/desktop/install/win32/ia32/Element%20Setup.exe"
|
||||
role="link"
|
||||
tabindex="0"
|
||||
>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
height="20"
|
||||
width="20"
|
||||
/>
|
||||
Windows (32-bit)
|
||||
</a>
|
||||
<a
|
||||
class="_button_zt6rp_17 _has-icon_zt6rp_61"
|
||||
data-kind="secondary"
|
||||
data-size="lg"
|
||||
href="https://element.io/download#linux"
|
||||
role="link"
|
||||
tabindex="0"
|
||||
>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
height="20"
|
||||
width="20"
|
||||
/>
|
||||
Linux
|
||||
</a>
|
||||
</div>
|
||||
<h2
|
||||
class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102"
|
||||
>
|
||||
Or use our mobile app
|
||||
</h2>
|
||||
<div
|
||||
class="mx_Flex"
|
||||
style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: start; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-6x);"
|
||||
>
|
||||
<a
|
||||
href="https://apps.apple.com/app/vector/id1083446067"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
alt="Apple App Store"
|
||||
height="64"
|
||||
src="themes/element/img/download/apple.svg"
|
||||
/>
|
||||
</a>
|
||||
<a
|
||||
href="https://play.google.com/store/apps/details?id=im.vector.app"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
alt="Google Play Store"
|
||||
height="64"
|
||||
src="themes/element/img/download/google.svg"
|
||||
/>
|
||||
</a>
|
||||
<a
|
||||
href="https://f-droid.org/repository/browse/?fdid=im.vector.app"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
alt="F-Droid"
|
||||
height="64"
|
||||
src="themes/element/img/download/fdroid.svg"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</DocumentFragment>
|
||||
|
|
|
@ -4,9 +4,10 @@
|
|||
"emitDecoratorMetadata": false,
|
||||
"resolveJsonModule": true,
|
||||
"esModuleInterop": true,
|
||||
"useDefineForClassFields": true,
|
||||
"module": "es2022",
|
||||
"moduleResolution": "node",
|
||||
"target": "es2018",
|
||||
"target": "es2022",
|
||||
"noUnusedLocals": true,
|
||||
"sourceMap": false,
|
||||
"outDir": "./lib",
|
||||
|
@ -23,6 +24,7 @@
|
|||
"./node_modules/matrix-react-sdk/src/@types/png-chunks-extract.d.ts",
|
||||
"./node_modules/matrix-react-sdk/src/@types/sanitize-html.d.ts",
|
||||
"./node_modules/matrix-react-sdk/src/@types/matrix-js-sdk.d.ts",
|
||||
"./node_modules/matrix-react-sdk/src/@types/electron-to-chromium.d.ts",
|
||||
"./src/**/*.ts",
|
||||
"./src/**/*.tsx",
|
||||
"./test/**/*.ts",
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"jsx": "preserve",
|
||||
"declaration": false,
|
||||
"outDir": "./lib/module_system",
|
||||
"lib": ["es2020"],
|
||||
"lib": ["es2022"],
|
||||
"types": ["node"]
|
||||
},
|
||||
"include": ["./module_system/**/*.ts"]
|
||||
|
|
|
@ -714,8 +714,8 @@ module.exports = (env, argv) => {
|
|||
sourcemaps: {
|
||||
paths: "./webapp/bundles/**",
|
||||
},
|
||||
errorHandler: (err, invokeErr, compilation) => {
|
||||
compilation.warnings.push("Sentry CLI Plugin: " + err.message);
|
||||
errorHandler: (err) => {
|
||||
console.warn("Sentry CLI Plugin: " + err.message);
|
||||
console.log(`::warning title=Sentry error::${err.message}`);
|
||||
},
|
||||
}),
|
||||
|
|