Merge remote-tracking branch 'origin/develop' into jryans/rebrand-packaged-artifact

This commit is contained in:
J. Ryan Stinnett 2020-11-23 17:43:19 +00:00
commit 5b86aa3a7a
67 changed files with 2439 additions and 958 deletions

View file

@ -8,7 +8,7 @@ module.exports = {
"quotes": "off", "quotes": "off",
}, },
"overrides": [{ "overrides": [{
"files": ["src/**/*.{ts, tsx}"], "files": ["src/**/*.{ts,tsx}"],
"extends": ["matrix-org/ts", "matrix-org/react"], "extends": ["matrix-org/ts", "matrix-org/react"],
"env": { "env": {
"browser": true, "browser": true,

View file

@ -38,7 +38,7 @@ For the web app:
- **Browser**: Chrome, Safari, Firefox? which version? - **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web? - **URL**: develop.element.io / app.element.io / somewhere else? If a private server, what version of Element Web?
For the desktop app: For the desktop app:

View file

@ -48,7 +48,7 @@ For the web app:
- **Browser**: Chrome, Safari, Firefox? which version? - **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web? - **URL**: develop.element.io / app.element.io / somewhere else? If a private server, what version of Element Web?
For the desktop app: For the desktop app:

View file

@ -50,7 +50,7 @@ For the web app:
- **Browser**: Chrome, Safari, Firefox? which version? - **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web? - **URL**: develop.element.io / app.element.io / somewhere else? If a private server, what version of Element Web?
For the desktop app: For the desktop app:

View file

@ -1,3 +1,299 @@
Changes in [1.7.13](https://github.com/vector-im/element-web/releases/tag/v1.7.13) (2020-11-09)
===============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.13-rc.1...v1.7.13)
* Upgrade to React SDK 3.8.0 and JS SDK 9.1.0
Changes in [1.7.13-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.13-rc.1) (2020-11-04)
=========================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.12...v1.7.13-rc.1)
* Upgrade to React SDK 3.8.0-rc.1 and JS SDK 9.1.0-rc.1
* Translations update from Weblate
[\#15644](https://github.com/vector-im/element-web/pull/15644)
* Add countly experiment to develop/nightly configs
[\#15614](https://github.com/vector-im/element-web/pull/15614)
* Add documentation for new UIFeature flag regarding room history settings
[\#15592](https://github.com/vector-im/element-web/pull/15592)
* Rename Docker repo in docs
[\#15590](https://github.com/vector-im/element-web/pull/15590)
* Fix Jitsi regressions with custom themes
[\#15575](https://github.com/vector-im/element-web/pull/15575)
Changes in [1.7.12](https://github.com/vector-im/element-web/releases/tag/v1.7.12) (2020-10-28)
===============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.11...v1.7.12)
* Upgrade to React SDK 3.7.1 and JS SDK 9.0.1
* [Release] Fix Jitsi regressions with custom themes
[\#15577](https://github.com/vector-im/element-web/pull/15577)
Changes in [1.7.11](https://github.com/vector-im/element-web/releases/tag/v1.7.11) (2020-10-26)
===============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.11-rc.1...v1.7.11)
* Upgrade to React SDK 3.7.0 and JS SDK 9.0.0
Changes in [1.7.11-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.11-rc.1) (2020-10-21)
=========================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.10...v1.7.11-rc.1)
* Upgrade to React SDK 3.7.0-rc.2 and JS SDK 9.0.0-rc.1
* Update Weblate URL
[\#15516](https://github.com/vector-im/element-web/pull/15516)
* Translations update from Weblate
[\#15517](https://github.com/vector-im/element-web/pull/15517)
* Jitsi accept theme variable and restyle
[\#15499](https://github.com/vector-im/element-web/pull/15499)
* Skip editor confirmation of upgrades
[\#15506](https://github.com/vector-im/element-web/pull/15506)
* Adjust for new widget messaging APIs
[\#15495](https://github.com/vector-im/element-web/pull/15495)
* Use HTTPS_PROXY environment variable for downloading external_api.min…
[\#15479](https://github.com/vector-im/element-web/pull/15479)
* Document customisation points
[\#15475](https://github.com/vector-im/element-web/pull/15475)
* Don't fatally end the Jitsi widget when it's not being used as a widget
[\#15466](https://github.com/vector-im/element-web/pull/15466)
* electron-platform: Pass the user/devce id pair when initializing the event
index.
[\#15455](https://github.com/vector-im/element-web/pull/15455)
Changes in [1.7.10](https://github.com/vector-im/element-web/releases/tag/v1.7.10) (2020-10-20)
===============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.9...v1.7.10)
* [Release] Adjust for new widget messaging APIs
[\#15497](https://github.com/vector-im/element-web/pull/15497)
* Upgrade to React SDK 3.6.1
Changes in [1.7.9](https://github.com/vector-im/element-web/releases/tag/v1.7.9) (2020-10-12)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.9-rc.1...v1.7.9)
* Upgrade to React SDK 3.6.0 and JS SDK 8.5.0
Changes in [1.7.9-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.9-rc.1) (2020-10-07)
=======================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.8...v1.7.9-rc.1)
* Upgrade to React SDK 3.6.0-rc.1 and JS SDK 8.5.0-rc.1
* Update from Weblate
[\#15406](https://github.com/vector-im/element-web/pull/15406)
* Update Jest and JSDOM
[\#15402](https://github.com/vector-im/element-web/pull/15402)
* Add support for dehydration/fallback keys
[\#15398](https://github.com/vector-im/element-web/pull/15398)
* Remove riot-bot from sample config
[\#15376](https://github.com/vector-im/element-web/pull/15376)
* Switch to using the Widget API SDK for Jitsi widgets
[\#15102](https://github.com/vector-im/element-web/pull/15102)
* Remove workbox
[\#15352](https://github.com/vector-im/element-web/pull/15352)
* Disable workbox when running in webpack dev server, not in dev mode
[\#15345](https://github.com/vector-im/element-web/pull/15345)
* Update Riot -> Element in contribute.json
[\#15326](https://github.com/vector-im/element-web/pull/15326)
* Update Riot -> Element in redeploy.py
[\#15336](https://github.com/vector-im/element-web/pull/15336)
* Update Riot -> Element in docs/feature-flags.md
[\#15325](https://github.com/vector-im/element-web/pull/15325)
* Update Riot -> Element in element.io/README.md
[\#15327](https://github.com/vector-im/element-web/pull/15327)
* Update Riot -> Element in VectorAuthFooter
[\#15328](https://github.com/vector-im/element-web/pull/15328)
* Update Riot -> Element in VectorEmbeddedPage
[\#15329](https://github.com/vector-im/element-web/pull/15329)
* Update Riot -> Element in docs/review.md
[\#15330](https://github.com/vector-im/element-web/pull/15330)
* Update Riot -> Element in welcome.html
[\#15332](https://github.com/vector-im/element-web/pull/15332)
* Update Riot -> Element in issues-burndown.pl
[\#15333](https://github.com/vector-im/element-web/pull/15333)
* Update Riot -> Element in redeploy.py
[\#15334](https://github.com/vector-im/element-web/pull/15334)
* Update Riot -> Element in index.ts
[\#15335](https://github.com/vector-im/element-web/pull/15335)
* Update Riot -> Element Web in issue templates
[\#15324](https://github.com/vector-im/element-web/pull/15324)
* Give the Jitsi widget an icon to help with discovery
[\#15316](https://github.com/vector-im/element-web/pull/15316)
* Jitsi widget wrapper updates for hangup button
[\#15219](https://github.com/vector-im/element-web/pull/15219)
* Tidy up Service Worker, only run Workbox in production
[\#15271](https://github.com/vector-im/element-web/pull/15271)
* Remove conference handler
[\#15274](https://github.com/vector-im/element-web/pull/15274)
* Rebrand the webpack pipeline for Element
[\#15266](https://github.com/vector-im/element-web/pull/15266)
* Replace dummy sw.js with pre-caching and runtime-caching workbox SW
[\#15196](https://github.com/vector-im/element-web/pull/15196)
Changes in [1.7.8](https://github.com/vector-im/element-web/releases/tag/v1.7.8) (2020-09-28)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.8-rc.1...v1.7.8)
* Upgrade to React SDK 3.5.0 and JS SDK 8.4.1
Changes in [1.7.8-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.8-rc.1) (2020-09-23)
=======================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.7...v1.7.8-rc.1)
* Upgrade to React SDK 3.5.0-rc.1 and JS SDK 8.4.0-rc.1
* Update from Weblate
[\#15262](https://github.com/vector-im/element-web/pull/15262)
* Upgrade sanitize-html
[\#15260](https://github.com/vector-im/element-web/pull/15260)
* Document config for preferring Secure Backup setup methods
[\#15251](https://github.com/vector-im/element-web/pull/15251)
* Add end-user documentation for UI features
[\#15190](https://github.com/vector-im/element-web/pull/15190)
* Update git checkout instructions
[\#15218](https://github.com/vector-im/element-web/pull/15218)
* If no bug_report_endpoint_url, hide rageshaking from the App
[\#15201](https://github.com/vector-im/element-web/pull/15201)
* Bump node-fetch from 2.6.0 to 2.6.1
[\#15153](https://github.com/vector-im/element-web/pull/15153)
* Remove references to Travis CI
[\#15137](https://github.com/vector-im/element-web/pull/15137)
* Fix onNewScreen to use replace when going from roomId->roomAlias
[\#15127](https://github.com/vector-im/element-web/pull/15127)
* Enable Estonian in language menu
[\#15136](https://github.com/vector-im/element-web/pull/15136)
Changes in [1.7.7](https://github.com/vector-im/element-web/releases/tag/v1.7.7) (2020-09-14)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.6...v1.7.7)
* Upgrade to React SDK 3.4.1
Changes in [1.7.6](https://github.com/vector-im/element-web/releases/tag/v1.7.6) (2020-09-14)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.6-rc.1...v1.7.6)
* Upgrade to React SDK 3.4.0 and JS SDK 8.3.0
Changes in [1.7.6-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.6-rc.1) (2020-09-09)
=======================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.5...v1.7.6-rc.1)
* Upgrade to React SDK 3.4.0-rc.1 and JS SDK 8.3.0-rc.1
* Update from Weblate
[\#15125](https://github.com/vector-im/element-web/pull/15125)
* Support usage of Jitsi widgets with "openidtoken-jwt" auth
[\#15114](https://github.com/vector-im/element-web/pull/15114)
* Fix eslint ts override tsx matching and delint
[\#15064](https://github.com/vector-im/element-web/pull/15064)
* Add testing to review guidelines
[\#15050](https://github.com/vector-im/element-web/pull/15050)
Changes in [1.7.5](https://github.com/vector-im/element-web/releases/tag/v1.7.5) (2020-09-01)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.5-rc.1...v1.7.5)
## Security notice
Element Web 1.7.5 fixes an issue where encrypted state events could break incoming call handling.
Thanks to @awesome-michael from Awesome Technologies for responsibly disclosing this via Matrix's
Security Disclosure Policy.
## All changes
* Upgrade to React SDK 3.3.0 and JS SDK 8.2.0
Changes in [1.7.5-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.5-rc.1) (2020-08-26)
=======================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.4...v1.7.5-rc.1)
* Upgrade to React SDK 3.3.0-rc.1 and JS SDK 8.2.0-rc.1
* Update from Weblate
[\#15045](https://github.com/vector-im/element-web/pull/15045)
* Document .well-known E2EE secure backup setting
[\#15003](https://github.com/vector-im/element-web/pull/15003)
* Add docs for communities v2 prototyping feature flag
[\#15013](https://github.com/vector-im/element-web/pull/15013)
* Update links in README.md to point to Element
[\#14973](https://github.com/vector-im/element-web/pull/14973)
* Make kabyle translation available
[\#15027](https://github.com/vector-im/element-web/pull/15027)
* Change Riot to Element in readme
[\#15016](https://github.com/vector-im/element-web/pull/15016)
* Update links to element in the readme
[\#15014](https://github.com/vector-im/element-web/pull/15014)
* Link to Element in F-Droid as well
[\#15002](https://github.com/vector-im/element-web/pull/15002)
* Settings v3: Update documentation and configs for new feature flag behaviour
[\#14986](https://github.com/vector-im/element-web/pull/14986)
* Update jitsi.md with Element Android details
[\#14952](https://github.com/vector-im/element-web/pull/14952)
* TypeScript: enable es2019 lib for newer definitions
[\#14983](https://github.com/vector-im/element-web/pull/14983)
* Add reaction preview labs flags to develop
[\#14979](https://github.com/vector-im/element-web/pull/14979)
* Document new labs tweaks
[\#14958](https://github.com/vector-im/element-web/pull/14958)
Changes in [1.7.4](https://github.com/vector-im/element-web/releases/tag/v1.7.4) (2020-08-17)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.4-rc.1...v1.7.4)
* Upgrade to React SDK 3.2.0 and JS SDK 8.1.0
Changes in [1.7.4-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.4-rc.1) (2020-08-13)
=======================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.3...v1.7.4-rc.1)
* Upgrade to React SDK 3.2.0-rc.1 and JS SDK 8.1.0-rc.1
* Update policy links to element.io
[\#14905](https://github.com/vector-im/element-web/pull/14905)
* Update from Weblate
[\#14949](https://github.com/vector-im/element-web/pull/14949)
* Try to close notification on all platforms which support it, not just
electron
[\#14939](https://github.com/vector-im/element-web/pull/14939)
* Update bug report submission URL
[\#14903](https://github.com/vector-im/element-web/pull/14903)
* Fix arm docker build
[\#14522](https://github.com/vector-im/element-web/pull/14522)
Changes in [1.7.3](https://github.com/vector-im/element-web/releases/tag/v1.7.3) (2020-08-05)
=============================================================================================
## Security notice
Element Web 1.7.3 (as well as the earlier release 1.7.2) fixes an issue where
replying to a specially formatted message would make it seem like the replier
said something they did not. Thanks to Sorunome for responsibly disclosing this
via Matrix's Security Disclosure Policy.
Element Web 1.7.3 (as well as the earlier release 1.7.2) fixes an issue where an
unexpected language ID in a code block could cause Element to crash. Thanks to
SakiiR for responsibly disclosing this via Matrix's Security Disclosure Policy.
## All changes
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.3-rc.1...v1.7.3)
* Upgrade to React SDK 3.1.0 and JS SDK 8.0.1
Changes in [1.7.3-rc.1](https://github.com/vector-im/riot-web/releases/tag/v1.7.3-rc.1) (2020-07-31)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.7.2...v1.7.3-rc.1)
* Upgrade to React SDK 3.1.0-rc.1 and JS SDK 8.0.1-rc.1
* Make Lojban translation available
[\#14703](https://github.com/vector-im/riot-web/pull/14703)
* Update from Weblate
[\#14841](https://github.com/vector-im/riot-web/pull/14841)
* Remove redundant lint dependencies
[\#14810](https://github.com/vector-im/riot-web/pull/14810)
* Bump elliptic from 6.5.2 to 6.5.3
[\#14826](https://github.com/vector-im/riot-web/pull/14826)
* Update mobile config intercept URL
[\#14796](https://github.com/vector-im/riot-web/pull/14796)
* Fix typo in https://
[\#14791](https://github.com/vector-im/riot-web/pull/14791)
Changes in [1.7.2](https://github.com/vector-im/riot-web/releases/tag/v1.7.2) (2020-07-27) Changes in [1.7.2](https://github.com/vector-im/riot-web/releases/tag/v1.7.2) (2020-07-27)
========================================================================================== ==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.7.1...v1.7.2) [Full Changelog](https://github.com/vector-im/riot-web/compare/v1.7.1...v1.7.2)

View file

@ -1,4 +1,4 @@
Contributing code to Riot Contributing code to Element
========================= ============================
Riot follows the same pattern as https://github.com/matrix-org/matrix-js-sdk/blob/master/CONTRIBUTING.rst. Element follows the same pattern as https://github.com/matrix-org/matrix-js-sdk/blob/master/CONTRIBUTING.rst.

View file

@ -2,7 +2,7 @@
FROM node:12 as builder FROM node:12 as builder
# Support custom branches of the react-sdk and js-sdk. This also helps us build # Support custom branches of the react-sdk and js-sdk. This also helps us build
# images of riot-web develop. # images of element-web develop.
ARG USE_CUSTOM_SDKS=false ARG USE_CUSTOM_SDKS=false
ARG REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git" ARG REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git"
ARG REACT_SDK_BRANCH="master" ARG REACT_SDK_BRANCH="master"

View file

@ -24,8 +24,8 @@ Element has several tiers of support for different environments:
* Everything else * Everything else
For accessing Element on an Android or iOS device, we currently recommend the For accessing Element on an Android or iOS device, we currently recommend the
native apps [riot-android](https://github.com/vector-im/riot-android) native apps [element-android](https://github.com/vector-im/element-android)
and [riot-ios](https://github.com/vector-im/riot-ios). and [element-ios](https://github.com/vector-im/element-ios).
Getting Started Getting Started
=============== ===============
@ -37,7 +37,7 @@ for those who like living dangerously.
To host your own copy of Element, the quickest bet is to use a pre-built To host your own copy of Element, the quickest bet is to use a pre-built
released version of Element: released version of Element:
1. Download the latest version from https://github.com/vector-im/riot-web/releases 1. Download the latest version from https://github.com/vector-im/element-web/releases
1. Untar the tarball on your web server 1. Untar the tarball on your web server
1. Move (or symlink) the `riot-x.x.x` directory to an appropriate name 1. Move (or symlink) the `riot-x.x.x` directory to an appropriate name
1. Configure the correct caching headers in your webserver (see below) 1. Configure the correct caching headers in your webserver (see below)
@ -69,7 +69,7 @@ access to Element (or other apps) due to sharing the same domain.
We have put some coarse mitigations into place to try to protect against this We have put some coarse mitigations into place to try to protect against this
situation, but it's still not good practice to do it in the first place. See situation, but it's still not good practice to do it in the first place. See
https://github.com/vector-im/riot-web/issues/1977 for more details. https://github.com/vector-im/element-web/issues/1977 for more details.
Building From Source Building From Source
==================== ====================
@ -82,8 +82,8 @@ guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it alread
1. Install or update `node.js` so that your `node` is at least v10.x. 1. Install or update `node.js` so that your `node` is at least v10.x.
1. Install `yarn` if not present already. 1. Install `yarn` if not present already.
1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git`. 1. Clone the repo: `git clone https://github.com/vector-im/element-web.git`.
1. Switch to the riot-web directory: `cd riot-web`. 1. Switch to the element-web directory: `cd element-web`.
1. Install the prerequisites: `yarn install`. 1. Install the prerequisites: `yarn install`.
* If you're using the `develop` branch, then it is recommended to set up a * If you're using the `develop` branch, then it is recommended to set up a
proper development environment (see [Setting up a dev proper development environment (see [Setting up a dev
@ -105,10 +105,10 @@ Running as a Desktop app
======================== ========================
Element can also be run as a desktop app, wrapped in Electron. You can download a Element can also be run as a desktop app, wrapped in Electron. You can download a
pre-built version from https://riot.im/download/desktop/ or, if you prefer, pre-built version from https://element.io/get-started or, if you prefer,
build it yourself. build it yourself.
To build it yourself, follow the instructions at https://github.com/vector-im/riot-desktop. To build it yourself, follow the instructions at https://github.com/vector-im/element-desktop.
Many thanks to @aviraldg for the initial work on the Electron integration. Many thanks to @aviraldg for the initial work on the Electron integration.
@ -126,31 +126,31 @@ override the desktop app's default settings if desired.
Running from Docker Running from Docker
=================== ===================
The Docker image can be used to serve riot-web as a web server. The easiest way to use The Docker image can be used to serve element-web as a web server. The easiest way to use
it is to use the prebuilt image: it is to use the prebuilt image:
```bash ```bash
docker run -p 80:80 vectorim/riot-web docker run -p 80:80 vectorim/element-web
``` ```
To supply your own custom `config.json`, map a volume to `/app/config.json`. For example, To supply your own custom `config.json`, map a volume to `/app/config.json`. For example,
if your custom config was located at `/etc/riot-web/config.json` then your Docker command if your custom config was located at `/etc/element-web/config.json` then your Docker command
would be: would be:
```bash ```bash
docker run -p 80:80 -v /etc/riot-web/config.json:/app/config.json vectorim/riot-web docker run -p 80:80 -v /etc/element-web/config.json:/app/config.json vectorim/element-web
``` ```
To build the image yourself: To build the image yourself:
```bash ```bash
git clone https://github.com/vector-im/riot-web.git riot-web git clone https://github.com/vector-im/element-web.git element-web
cd riot-web cd element-web
git checkout master git checkout master
docker build -t vectorim/riot-web . docker build .
``` ```
If you're building a custom branch, or want to use the develop branch, check out the appropriate If you're building a custom branch, or want to use the develop branch, check out the appropriate
riot-web branch and then run: element-web branch and then run:
```bash ```bash
docker build -t vectorim/riot-web:develop \ docker build -t \
--build-arg USE_CUSTOM_SDKS=true \ --build-arg USE_CUSTOM_SDKS=true \
--build-arg REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git" \ --build-arg REACT_SDK_REPO="https://github.com/matrix-org/matrix-react-sdk.git" \
--build-arg REACT_SDK_BRANCH="develop" \ --build-arg REACT_SDK_BRANCH="develop" \
@ -169,7 +169,7 @@ Labs Features
============= =============
Some features of Element may be enabled by flags in the `Labs` section of the settings. Some features of Element may be enabled by flags in the `Labs` section of the settings.
Some of these features are described in [labs.md](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md). Some of these features are described in [labs.md](https://github.com/vector-im/element-web/blob/develop/docs/labs.md).
Caching requirements Caching requirements
==================== ====================
@ -186,13 +186,13 @@ Element requires the following URLs not to be cached, when/if you are serving El
Development Development
=========== ===========
Before attempting to develop on Riot you **must** read the [developer guide Before attempting to develop on Element you **must** read the [developer guide
for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which
also defines the design, architecture and style for Element too. also defines the design, architecture and style for Element too.
Before starting work on a feature, it's best to ensure your plan aligns well Before starting work on a feature, it's best to ensure your plan aligns well
with our vision for Riot. Please chat with the team in with our vision for Element. Please chat with the team in
[#riot-dev:matrix.org](https://matrix.to/#/#riot-dev:matrix.org) before you [#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org) before you
start so we can ensure it's something we'd be willing to merge. start so we can ensure it's something we'd be willing to merge.
You should also familiarise yourself with the ["Here be Dragons" guide You should also familiarise yourself with the ["Here be Dragons" guide
@ -225,7 +225,6 @@ First clone and build `matrix-js-sdk`:
``` bash ``` bash
git clone https://github.com/matrix-org/matrix-js-sdk.git git clone https://github.com/matrix-org/matrix-js-sdk.git
pushd matrix-js-sdk pushd matrix-js-sdk
git checkout develop
yarn link yarn link
yarn install yarn install
popd popd
@ -236,7 +235,6 @@ Then similarly with `matrix-react-sdk`:
```bash ```bash
git clone https://github.com/matrix-org/matrix-react-sdk.git git clone https://github.com/matrix-org/matrix-react-sdk.git
pushd matrix-react-sdk pushd matrix-react-sdk
git checkout develop
yarn link yarn link
yarn link matrix-js-sdk yarn link matrix-js-sdk
yarn install yarn install
@ -246,9 +244,8 @@ popd
Finally, build and start Element itself: Finally, build and start Element itself:
```bash ```bash
git clone https://github.com/vector-im/riot-web.git git clone https://github.com/vector-im/element-web.git
cd riot-web cd element-web
git checkout develop
yarn link matrix-js-sdk yarn link matrix-js-sdk
yarn link matrix-react-sdk yarn link matrix-react-sdk
yarn install yarn install
@ -275,7 +272,7 @@ bundle.css.map 116 kB 0 [emitted] main
Configure the app by copying `config.sample.json` to `config.json` and Configure the app by copying `config.sample.json` to `config.json` and
modifying it. See the [configuration docs](docs/config.md) for details. modifying it. See the [configuration docs](docs/config.md) for details.
Open http://127.0.0.1:8080/ in your browser to see your newly built Riot. Open http://127.0.0.1:8080/ in your browser to see your newly built Element.
**Note**: The build script uses inotify by default on Linux to monitor directories **Note**: The build script uses inotify by default on Linux to monitor directories
for changes. If the inotify watch limit is too low your build will silently fail. for changes. If the inotify watch limit is too low your build will silently fail.
@ -336,7 +333,7 @@ To add a new translation, head to the [translating doc](docs/translating.md).
For a developer guide, see the [translating dev doc](docs/translating-dev.md). For a developer guide, see the [translating dev doc](docs/translating-dev.md).
[<img src="https://translate.riot.im/widgets/riot-web/-/multi-auto.svg" alt="translationsstatus" width="340">](https://translate.riot.im/engage/riot-web/?utm_source=widget) [<img src="https://translate.element.io/widgets/element-web/-/multi-auto.svg" alt="translationsstatus" width="340">](https://translate.element.io/engage/element-web/?utm_source=widget)
Triaging issues Triaging issues
=============== ===============

View file

@ -22,15 +22,11 @@
"https://scalar-staging.vector.im/api", "https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api" "https://scalar-staging.riot.im/scalar/api"
], ],
"bug_report_endpoint_url": "https://riot.im/bugreports/submit", "bug_report_endpoint_url": "https://element.io/bugreports/submit",
"defaultCountryCode": "GB", "defaultCountryCode": "GB",
"showLabsSettings": false, "showLabsSettings": false,
"features": { "features": {
"feature_new_spinner": "labs", "feature_new_spinner": false
"feature_pinning": "labs",
"feature_custom_status": "labs",
"feature_custom_tags": "labs",
"feature_state_counters": "labs"
}, },
"default_federate": true, "default_federate": true,
"default_theme": "light", "default_theme": "light",
@ -39,7 +35,6 @@
"matrix.org" "matrix.org"
] ]
}, },
"welcomeUserId": "@riot-bot:matrix.org",
"piwik": { "piwik": {
"url": "https://piwik.riot.im/", "url": "https://piwik.riot.im/",
"whitelistedHSUrls": ["https://matrix.org"], "whitelistedHSUrls": ["https://matrix.org"],

View file

@ -1,13 +1,13 @@
{ {
"name": "Riot", "name": "Element",
"description": "A glossy Matrix collaboration client for the web.", "description": "A glossy Matrix collaboration client for the web.",
"repository": { "repository": {
"url": "https://github.com/vector-im/riot-web", "url": "https://github.com/vector-im/element-web",
"license": "Apache License 2.0" "license": "Apache License 2.0"
}, },
"bugs": { "bugs": {
"list": "https://github.com/vector-im/riot-web/issues", "list": "https://github.com/vector-im/element-web/issues",
"report": "https://github.com/vector-im/riot-web/issues/new/choose" "report": "https://github.com/vector-im/element-web/issues/new/choose"
}, },
"keywords": [ "keywords": [
"chat", "chat",

View file

@ -22,12 +22,12 @@ For a good example, see https://develop.element.io/config.json.
`default_hs_url` is specified. When multiple sources are specified, it is unclear `default_hs_url` is specified. When multiple sources are specified, it is unclear
which should take priority and therefore the application cannot continue. which should take priority and therefore the application cannot continue.
* As of Element 1.4.0, identity servers are optional. See [Identity servers](#identity-servers) below. * As of Element 1.4.0, identity servers are optional. See [Identity servers](#identity-servers) below.
1. `features`: Lookup of optional features that may be `enable`d, `disable`d, or 1. `features`: Lookup of optional features that may be force-enabled (`true`) or force-disabled (`false`).
exposed to the user in the `labs` section of settings. The available When features are not listed here, their defaults will be used, and users can turn them on/off if `showLabsSettings`
optional experimental features vary from release to release and are [documented](labs.md). The feature flag process is allows them to. The available optional experimental features vary from release to release and are
[documented](feature-flags.md) as well. [documented](labs.md). The feature flag process is [documented](feature-flags.md) as well.
1. `showLabsSettings`: Shows the "labs" tab of user settings even when no `features` are enabled 1. `showLabsSettings`: Shows the "labs" tab of user settings. Useful to allow users to turn on experimental features
or present. Useful for getting at settings which may be otherwise hidden. they might not otherwise have access to.
1. `brand`: String to pass to your homeserver when configuring email notifications, to let the 1. `brand`: String to pass to your homeserver when configuring email notifications, to let the
homeserver know what email template to use when talking to you. homeserver know what email template to use when talking to you.
1. `branding`: Configures various branding and logo details, such as: 1. `branding`: Configures various branding and logo details, such as:
@ -48,7 +48,7 @@ For a good example, see https://develop.element.io/config.json.
1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server. 1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server.
1. `bug_report_endpoint_url`: endpoint to send bug reports to (must be running a 1. `bug_report_endpoint_url`: endpoint to send bug reports to (must be running a
https://github.com/matrix-org/rageshake server). Bug reports are sent when a user clicks https://github.com/matrix-org/rageshake server). Bug reports are sent when a user clicks
"Send Logs" within the application. Bug reports can be disabled by leaving the "Send Logs" within the application. Bug reports can be disabled/hidden by leaving the
`bug_report_endpoint_url` out of your config file. `bug_report_endpoint_url` out of your config file.
1. `roomDirectory`: config for the public room directory. This section is optional. 1. `roomDirectory`: config for the public room directory. This section is optional.
1. `roomDirectory.servers`: List of other homeservers' directories to include in the drop 1. `roomDirectory.servers`: List of other homeservers' directories to include in the drop
@ -101,6 +101,15 @@ For a good example, see https://develop.element.io/config.json.
Defaults to false (3rd party identity options are shown). Defaults to false (3rd party identity options are shown).
1. `default_federate`: Default option for room federation when creating a room 1. `default_federate`: Default option for room federation when creating a room
Defaults to true (room federation enabled). Defaults to true (room federation enabled).
1. `desktopBuilds`: Used to alter promotional links to the desktop app. By default
the builds are considered available and accessible from https://element.io. This
config option is typically used in the context of encouraging encrypted message
search capabilities (Seshat). All the options listed below are required if this
option is specified.
1. `available`: When false, the desktop app will not be promoted to the user.
1. `logo`: An HTTP URL to the avatar for the desktop build. Should be 24x24, ideally
an SVG.
1. `url`: An HTTP URL for where to send the user to download the desktop build.
Note that `index.html` also has an og:image meta tag that is set to an image Note that `index.html` also has an og:image meta tag that is set to an image
hosted on riot.im. This is the image used if links to your copy of Element hosted on riot.im. This is the image used if links to your copy of Element
@ -144,3 +153,44 @@ Desktop app configuration
========================= =========================
See https://github.com/vector-im/riot-desktop#user-specified-configjson See https://github.com/vector-im/riot-desktop#user-specified-configjson
UI Features
===========
Parts of the UI can be disabled using UI features. These are settings which appear
under `settingDefaults` and can only be `true` (default) or `false`. When `false`,
parts of the UI relating to that feature will be disabled regardless of the user's
preferences.
Currently, the following UI feature flags are supported:
* `UIFeature.urlPreviews` - Whether URL previews are enabled across the entire application.
* `UIFeature.feedback` - Whether prompts to supply feedback are shown.
* `UIFeature.voip` - Whether or not VoIP is shown readily to the user. When disabled,
Jitsi widgets will still work though they cannot easily be added.
* `UIFeature.widgets` - Whether or not widgets will be shown.
* `UIFeature.flair` - Whether or not community flair is shown in rooms.
* `UIFeature.communities` - Whether or not to show any UI related to communities. Implicitly
disables `UIFeature.flair` when disabled.
* `UIFeature.advancedSettings` - Whether or not sections titled "advanced" in room and
user settings are shown to the user.
* `UIFeature.shareQrCode` - Whether or not the QR code on the share room/event dialog
is shown.
* `UIFeature.shareSocial` - Whether or not the social icons on the share room/event dialog
are shown.
* `UIFeature.identityServer` - Whether or not functionality requiring an identity server
is shown. When disabled, the user will not be able to interact with the identity
server (sharing email addresses, 3PID invites, etc).
* `UIFeature.thirdPartyId` - Whether or not UI relating to third party identifiers (3PIDs)
is shown. Typically this is considered "contact information" on the homeserver, and is
not directly related to the identity server.
* `UIFeature.registration` - Whether or not the registration page is accessible. Typically
useful if accounts are managed externally.
* `UIFeature.passwordReset` - Whether or not the password reset page is accessible. Typically
useful if accounts are managed externally.
* `UIFeature.deactivate` - Whether or not the deactivate account button is accessible. Typically
useful if accounts are managed externally.
* `UIFeature.advancedEncryption` - Whether or not advanced encryption options are shown to the
user.
* `UIFeature.roomHistorySettings` - Whether or not the room history settings are shown to the user.
This should only be used if the room history visibility options are managed by the server.

34
docs/customisations.md Normal file
View file

@ -0,0 +1,34 @@
# Customisations
Element Web and the React SDK support "customisation points" that can be used to
easily add custom logic specific to a particular deployment of Element Web.
An example of this is the [security customisations
module](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/customisations/Security.ts).
This module in the React SDK only defines some empty functions and their types:
it does not do anything by default.
To make use of these customisation points, you will first need to fork Element
Web so that you can add your own code. Even though the default module is part of
the React SDK, you can still override it from the Element Web layer:
1. Copy the default customisation module to
`element-web/src/customisations/YourNameSecurity.ts`
2. Edit customisations points and make sure export the ones you actually want to
activate
3. Tweak the Element build process to use the customised module instead of the
default by adding this to end of the `plugins` array in `webpack.config.js`:
```js
new webpack.NormalModuleReplacementPlugin(
/src\/customisations\/Security.ts/,
path.resolve(__dirname, 'src/customisations/YourNameSecurity.ts'),
),
```
If we add more customisation modules in the future, we'll likely improve these
steps to remove the need for build changes like the above.
By isolating customisations to their own module, this approach should remove the
chance of merge conflicts when updating your fork, and thus simplify ongoing
maintenance.

View file

@ -7,10 +7,57 @@ For private room creation, Element will default to encryption on but give you th
Set the following on your homeserver's Set the following on your homeserver's
`/.well-known/matrix/client` config: `/.well-known/matrix/client` config:
```json ```json
{ {
"im.vector.riot.e2ee": { "io.element.e2ee": {
"default": false "default": false
} }
} }
``` ```
# Secure backup
By default, Element strongly encourages (but does not require) users to set up
Secure Backup so that cross-signing identity key and message keys can be
recovered in case of a disaster where you lose access to all active devices.
## Requiring secure backup
To require Secure Backup to be configured before Element can be used, set the
following on your homeserver's `/.well-known/matrix/client` config:
```json
{
"io.element.e2ee": {
"secure_backup_required": true
}
}
```
## Preferring setup methods
By default, Element offers users a choice of a random key or user-chosen
passphrase when setting up Secure Backup. If a homeserver admin would like to
only offer one of these, you can signal this via the
`/.well-known/matrix/client` config, for example:
```json
{
"io.element.e2ee": {
"secure_backup_setup_methods": ["passphrase"]
}
}
```
The field `secure_backup_setup_methods` is an array listing the methods the
client should display. Supported values currently include `key` and
`passphrase`. If the `secure_backup_setup_methods` field is not present or
exists but does not contain any supported methods, Element will fallback to the
default value of: `["key", "passphrase"]`.
# Compatibility
The settings above were first proposed under a `im.vector.riot.e2ee` key, which
is now deprecated. Element will check for either key, preferring
`io.element.e2ee` if both exist.

View file

@ -8,7 +8,7 @@ For example, flags make the following things possible:
* Extended testing of a feature via labs on develop * Extended testing of a feature via labs on develop
* Enabling features when ready instead of the first moment the code is released * Enabling features when ready instead of the first moment the code is released
* Testing a feature with a specific set of users (by enabling only on a specific * Testing a feature with a specific set of users (by enabling only on a specific
Riot instance) Element instance)
The size of the feature controlled by a feature flag may vary widely: it could The size of the feature controlled by a feature flag may vary widely: it could
be a large project like reactions or a smaller change to an existing algorithm. be a large project like reactions or a smaller change to an existing algorithm.
@ -35,7 +35,7 @@ clients commit to doing the associated clean up work once a feature stabilises.
When starting work on a feature, we should create a matching feature flag: When starting work on a feature, we should create a matching feature flag:
1. Add a new 1. Add a new
[setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.js) [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts)
of the form: of the form:
```js ```js
"feature_cats": { "feature_cats": {
@ -47,17 +47,9 @@ When starting work on a feature, we should create a matching feature flag:
``` ```
2. Check whether the feature is enabled as appropriate: 2. Check whether the feature is enabled as appropriate:
```js ```js
SettingsStore.isFeatureEnabled("feature_cats") SettingsStore.getValue("feature_cats")
``` ```
3. Add the feature to the set of labs on 3. Document the feature in the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json)
and [nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json):
```json
"features": {
"feature_cats": "labs"
},
```
4. Document the feature in the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md)
With these steps completed, the feature is disabled by default, but can be With these steps completed, the feature is disabled by default, but can be
enabled on develop and nightly by interested users for testing. enabled on develop and nightly by interested users for testing.
@ -67,69 +59,49 @@ The following lists a few common options.
## Enabling by default on develop and nightly ## Enabling by default on develop and nightly
Set the feature to `enable` in the Set the feature to `true` in the
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json) [develop](https://github.com/vector-im/element-web/blob/develop/element.io/develop/config.json)
and and
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json) [nightly](https://github.com/vector-im/element-desktop/blob/develop/element.io/nightly/config.json)
configs: configs:
```json ```json
"features": { "features": {
"feature_cats": "enable" "feature_cats": true
}, },
``` ```
## Enabling by default on staging, app, and release ## Enabling by default on staging, app, and release
Set the feature to `enable` in the Set the feature to `true` in the
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json) [staging / app](https://github.com/vector-im/element-web/blob/develop/element.io/app/config.json)
and and
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json) [release](https://github.com/vector-im/element-desktop/blob/develop/element.io/release/config.json)
configs. configs.
**Warning:** While this does mean the feature is enabled by default for **Note:** The above will only enable the feature for https://app.element.io and official Element
https://app.element.io and official Element Desktop builds, it will not be enabled by Desktop builds. It will not be enabled for self-hosted installed, custom desktop builds, etc. To
default for self-hosted installs, custom desktop builds, etc. To cover those cover these cases, change the setting's `default` in `Settings.ts` to `true`.
cases as well, the best options at the moment are converting to a regular
setting defaulted on or to remove the flag. Simply enabling the existing flag by
default in `Settings.js`
[does not work currently](https://github.com/vector-im/riot-web/issues/10360).
## Feature deployed successfully ## Feature deployed successfully
Once we're confident that a feature is working well, we should remove the flag: Once we're confident that a feature is working well, we should remove or convert the flag.
1. Remove the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.js) If the feature is meant to be turned off/on by the user:
2. Remove all `isFeatureEnabled` lines that test for the feature's setting 1. Remove `isFeature` from the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts)
3. Remove the feature from the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md) 2. Change the `default` to `true` (if desired).
4. Remove feature state from 3. Remove the feature from the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json), 4. Celebrate! 🥳
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json),
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json), If the feature is meant to be forced on (non-configurable):
1. Remove the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts)
2. Remove all `getValue` lines that test for the feature.
3. Remove the feature from the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)
4. If applicable, remove the feature state from
[develop](https://github.com/vector-im/element-web/blob/develop/element.io/develop/config.json),
[nightly](https://github.com/vector-im/element-desktop/blob/develop/element.io/nightly/config.json),
[staging / app](https://github.com/vector-im/element-web/blob/develop/element.io/app/config.json),
and and
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json) [release](https://github.com/vector-im/element-desktop/blob/develop/element.io/release/config.json)
configs configs
5. Celebrate! 🥳 5. Celebrate! 🥳
## Convert to a regular setting (optional)
Sometimes we decide a feature should always be user-controllable as a setting
even after it has been fully deployed. In that case, we would craft a new,
regular setting:
1. Remove the feature flag from
[settings](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.js)
and add a regular setting with the appropriate levels for your feature
2. Replace the `isFeatureEnabled` lines with `getValue` or similar calls
according to the [settings
docs](https://github.com/matrix-org/matrix-react-sdk/blob/develop/docs/settings.md)
(checking carefully, as we may want a different mix of code paths when the
feature is always present but gated by a setting)
3. Remove the feature from the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md)
4. Remove feature state from
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json),
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json),
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json),
and
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json)
configs

View file

@ -50,7 +50,22 @@ default, and you are using riot-web 1.6 or newer, set the following on your home
} }
``` ```
## Mobile app support ## Element Android
Element Android (1.0.5+) supports custom Jitsi domains, similar to Element Web above.
1:1 calls, or calls between you and one other person, do not use Jitsi. Instead, those
calls work directly between clients or via TURN servers configured on the respective
homeservers.
For rooms with more than 2 joined members, when creating a Jitsi conference via call/video buttons of the toolbar (not via integration manager), Element Android will create a widget using the [wrapper](https://github.com/vector-im/element-web/blob/develop/docs/jitsi-dev.md) hosted on `app.element.io`.
The domain used is the one specified by the `/.well-known/matrix/client` endpoint, and if not present it uses the fallback defined in `config.xml` (jitsi.riot.im)
For active Jitsi widgets in the room, a native Jitsi widget UI is created and points to the instance specified in the `domain` key of the widget content data.
Element Android manages allowed native widgets permissions a bit differently than web widgets (as the data shared are different and never shared with the widget URL). For Jitsi widgets, permissions are requested only once per domain (consent saved in account data).
## Element iOS
Currently the Element mobile apps do not support custom Jitsi servers and will instead Currently the Element mobile apps do not support custom Jitsi servers and will instead
use the default `jitsi.riot.im` server. When users on the mobile apps join the call, use the default `jitsi.riot.im` server. When users on the mobile apps join the call,

View file

@ -94,3 +94,20 @@ adds an ability for end users to add themes themselves by using a URL to the JSO
theme definition. theme definition.
For some sample themes, check out [aaronraimist/element-themes](https://github.com/aaronraimist/element-themes). For some sample themes, check out [aaronraimist/element-themes](https://github.com/aaronraimist/element-themes).
## Message preview tweaks
To enable message previews for reactions in all rooms, enable `feature_roomlist_preview_reactions_all`.
To enable message previews for reactions in DMs, enable `feature_roomlist_preview_reactions_dms`, ignored when it is enabled for all rooms.
## Communities v2 prototyping (`feature_communities_v2_prototypes`) [In Development]
**This is a highly experimental implementation for parts of the communities v2 experience.** It does not
represent what communities v2 will look/feel like and can/will change without notice. Due to the early
stages this feature is in and the requirement for a compatible homeserver, we will not be accepting issues
or feedback for this functionality at this time.
## Dehydrated devices (`feature_dehydration`)
Allows users to receive encrypted messages by creating a device that is stored
encrypted on the server, as described in [MSC2697](https://github.com/matrix-org/matrix-doc/pull/2697).

View file

@ -14,6 +14,7 @@ When reviewing code, here are some things we look for and also things we avoid:
* Performance * Performance
* Accessibility * Accessibility
* Security * Security
* Quality via automated and manual testing
* Comments and documentation where needed * Comments and documentation where needed
* Sharing knowledge of different areas among the team * Sharing knowledge of different areas among the team
* Ensuring it's something we're comfortable maintaining for the long term * Ensuring it's something we're comfortable maintaining for the long term
@ -34,6 +35,7 @@ When reviewing code, here are some things we look for and also things we avoid:
* Reviewers should be explicit about required versus optional changes * Reviewers should be explicit about required versus optional changes
* Reviews are conversations and the PR author should feel comfortable * Reviews are conversations and the PR author should feel comfortable
discussing and pushing back on changes before making them discussing and pushing back on changes before making them
* Reviewers are encouraged to ask for tests where they believe it is reasonable
* Core team should lead by example through their tone and language * Core team should lead by example through their tone and language
* Take the time to thank and point out good code changes * Take the time to thank and point out good code changes
* Using softer language like "please" and "what do you think?" goes a long way * Using softer language like "please" and "what do you think?" goes a long way
@ -74,7 +76,7 @@ As it can be difficult to review design work from looking at just the changed
files in a PR, authors should be prepared for Design and / or Product teams to files in a PR, authors should be prepared for Design and / or Product teams to
request a link to an ad-hoc build of Element (hosted anywhere) that can be used for request a link to an ad-hoc build of Element (hosted anywhere) that can be used for
the review. In the future, we [hope to automate the review. In the future, we [hope to automate
this](https://github.com/vector-im/riot-web/issues/12624) for every PR. this](https://github.com/vector-im/element-web/issues/12624) for every PR.
Before starting work on a feature, it's best to ensure your plan aligns well Before starting work on a feature, it's best to ensure your plan aligns well
with our vision for Element. Please chat with the team in with our vision for Element. Please chat with the team in

View file

@ -6,27 +6,27 @@
- Be able to understand English - Be able to understand English
- Be able to understand the language you want to translate Element into - Be able to understand the language you want to translate Element into
## Step 0: Join #riotweb-translations:matrix.org ## Step 0: Join #element-translations:matrix.org
1. Come and join https://matrix.to/#/#riotweb-translations:matrix.org 1. Come and join https://matrix.to/#/#element-translations:matrix.org
2. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :) 2. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :)
## Step 1: Preparing your Weblate Profile ## Step 1: Preparing your Weblate Profile
1. Head to https://translate.riot.im and register either via Github or email 1. Head to https://translate.element.io and register either via Github or email
2. After registering check if you got an email to verify your account and click the link (if there is none head to step 1.4) 2. After registering check if you got an email to verify your account and click the link (if there is none head to step 1.4)
3. Log into weblate 3. Log into weblate
4. Head to https://translate.riot.im/accounts/profile/ and select the languages you know and maybe another language you know too. 4. Head to https://translate.element.io/accounts/profile/ and select the languages you know and maybe another language you know too.
6. Head to https://translate.riot.im/accounts/profile/#subscriptions and select Element Web as Project 6. Head to https://translate.element.io/accounts/profile/#subscriptions and select Element Web as Project
## How to check if your language already is being translated ## How to check if your language already is being translated
Go to https://translate.riot.im/projects/riot-web/ and visit the 2 sub-projects. Go to https://translate.element.io/projects/element-web/ and visit the 2 sub-projects.
If your language is listed go to Step 2a and if not go to Step 2b If your language is listed go to Step 2a and if not go to Step 2b
## Step 2a: Helping on existing languages. ## Step 2a: Helping on existing languages.
1. Head to one of the projects listed https://translate.riot.im/projects/riot-web/ 1. Head to one of the projects listed https://translate.element.io/projects/element-web/
2. Click on the ``translate`` button on the right side of your language 2. Click on the ``translate`` button on the right side of your language
3. Fill in the translations in the writeable field. You will see the original English string and the string of your second language above. 3. Fill in the translations in the writeable field. You will see the original English string and the string of your second language above.
@ -34,7 +34,7 @@ Head to the explanations under Steb 2b
## Step 2b: Adding a new language ## Step 2b: Adding a new language
1. Go to one of the projects listed https://translate.riot.im/projects/riot-web/ 1. Go to one of the projects listed https://translate.element.io/projects/element-web/
2. Click the ``Start new translation`` button at the bottom 2. Click the ``Start new translation`` button at the bottom
3. Select a language 3. Select a language
4. Start translating like in 2a.3 4. Start translating like in 2a.3

View file

@ -6,7 +6,7 @@ official element.io distribution, but these files may be useful if you want to
inspect the configuration used there. inspect the configuration used there.
Element Desktop uses a separate config (see Element Desktop uses a separate config (see
https://github.com/vector-im/riot-desktop/tree/develop/element.io). https://github.com/vector-im/element-desktop/tree/develop/element.io).
Deployment scripts (such as app/deploy.py) are meant to be run on the web server Deployment scripts (such as app/deploy.py) are meant to be run on the web server
hosting the Element installation. hosting the Element installation.

View file

@ -11,13 +11,12 @@
"https://scalar-staging.riot.im/scalar/api" "https://scalar-staging.riot.im/scalar/api"
], ],
"hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web", "hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web",
"bug_report_endpoint_url": "https://riot.im/bugreports/submit", "bug_report_endpoint_url": "https://element.io/bugreports/submit",
"features": { "showLabsSettings": false,
},
"piwik": { "piwik": {
"url": "https://piwik.riot.im/", "url": "https://piwik.riot.im/",
"siteId": 1, "siteId": 1,
"policyUrl": "https://matrix.org/legal/riot-im-cookie-policy" "policyUrl": "https://element.io/cookie-policy"
}, },
"roomDirectory": { "roomDirectory": {
"servers": [ "servers": [
@ -30,11 +29,11 @@
}, },
"terms_and_conditions_links": [ "terms_and_conditions_links": [
{ {
"url": "https://riot.im/privacy", "url": "https://element.io/privacy",
"text": "Privacy Policy" "text": "Privacy Policy"
}, },
{ {
"url": "https://matrix.org/legal/riot-im-cookie-policy", "url": "https://element.io/cookie-policy",
"text": "Cookie Policy" "text": "Cookie Policy"
} }
] ]

View file

@ -11,24 +11,16 @@
"https://scalar-staging.riot.im/scalar/api" "https://scalar-staging.riot.im/scalar/api"
], ],
"hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web", "hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web",
"bug_report_endpoint_url": "https://riot.im/bugreports/submit", "bug_report_endpoint_url": "https://element.io/bugreports/submit",
"features": { "showLabsSettings": true,
"feature_new_spinner": "labs",
"feature_pinning": "labs",
"feature_custom_status": "labs",
"feature_custom_tags": "labs",
"feature_state_counters": "labs",
"feature_many_integration_managers": "labs",
"feature_mjolnir": "labs",
"feature_dm_verification": "labs",
"feature_bridge_state": "labs",
"feature_presence_in_room_list": "labs",
"feature_custom_themes": "labs"
},
"piwik": { "piwik": {
"url": "https://piwik.riot.im/", "url": "https://piwik.riot.im/",
"siteId": 1, "siteId": 1,
"policyUrl": "https://matrix.org/legal/riot-im-cookie-policy" "policyUrl": "https://element.io/cookie-policy"
},
"countly": {
"url": "https://try.count.ly",
"appKey": "8abf1ee15646bc884556b82e5053857904264b66"
}, },
"roomDirectory": { "roomDirectory": {
"servers": [ "servers": [
@ -41,11 +33,11 @@
}, },
"terms_and_conditions_links": [ "terms_and_conditions_links": [
{ {
"url": "https://riot.im/privacy", "url": "https://element.io/privacy",
"text": "Privacy Policy" "text": "Privacy Policy"
}, },
{ {
"url": "https://matrix.org/legal/riot-im-cookie-policy", "url": "https://element.io/cookie-policy",
"text": "Cookie Policy" "text": "Cookie Policy"
} }
] ]

View file

@ -1,7 +1,7 @@
{ {
"name": "riot-web", "name": "riot-web",
"productName": "Riot", "productName": "Riot",
"version": "1.7.2", "version": "1.7.13",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.", "author": "New Vector Ltd.",
"repository": { "repository": {
@ -46,7 +46,7 @@
"build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json", "build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json",
"build:types": "tsc --emitDeclarationOnly --jsx react", "build:types": "tsc --emitDeclarationOnly --jsx react",
"dist": "scripts/package.sh", "dist": "scripts/package.sh",
"start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,riot-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"", "start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,element-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"",
"start:res": "yarn build:jitsi && node scripts/copy-res.js -w", "start:res": "yarn build:jitsi && node scripts/copy-res.js -w",
"start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development", "start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development",
"lint": "yarn lint:types && yarn lint:js && yarn lint:style", "lint": "yarn lint:types && yarn lint:js && yarn lint:style",
@ -59,13 +59,15 @@
"browser-request": "^0.3.3", "browser-request": "^0.3.3",
"gfm.css": "^1.1.2", "gfm.css": "^1.1.2",
"highlight.js": "^9.13.1", "highlight.js": "^9.13.1",
"jsrsasign": "^9.1.5",
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
"matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop",
"olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz", "matrix-widget-api": "^0.1.0-beta.8",
"olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "^16.9.0", "react": "^16.9.0",
"react-dom": "^16.9.0", "react-dom": "^16.9.0",
"sanitize-html": "^1.19.1", "sanitize-html": "github:apostrophecms/sanitize-html#3c7f93f2058f696f5359e3e58d464161647226db",
"ua-parser-js": "^0.7.19", "ua-parser-js": "^0.7.19",
"url": "^0.11.0" "url": "^0.11.0"
}, },
@ -91,6 +93,7 @@
"@types/node": "^12.12.41", "@types/node": "^12.12.41",
"@types/react": "16.9", "@types/react": "16.9",
"@types/react-dom": "^16.9.4", "@types/react-dom": "^16.9.4",
"@types/sanitize-html": "^1.23.3",
"autoprefixer": "^9.7.3", "autoprefixer": "^9.7.3",
"babel-eslint": "^10.0.3", "babel-eslint": "^10.0.3",
"babel-jest": "^24.9.0", "babel-jest": "^24.9.0",
@ -111,8 +114,8 @@
"file-loader": "^5.0.2", "file-loader": "^5.0.2",
"fs-extra": "^0.30.0", "fs-extra": "^0.30.0",
"html-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^3.2.0",
"jest": "^24.9.0", "jest": "^26.5.2",
"jest-environment-jsdom-fourteen": "^1.0.1", "jest-environment-jsdom-sixteen": "^1.0.3",
"json-loader": "^0.5.3", "json-loader": "^0.5.3",
"loader-utils": "^1.2.3", "loader-utils": "^1.2.3",
"matrix-mock-request": "^1.2.3", "matrix-mock-request": "^1.2.3",
@ -136,6 +139,7 @@
"postcss-strip-inline-comments": "^0.1.5", "postcss-strip-inline-comments": "^0.1.5",
"rimraf": "^2.4.3", "rimraf": "^2.4.3",
"shell-escape": "^0.2.0", "shell-escape": "^0.2.0",
"simple-proxy-agent": "^1.1.0",
"stylelint": "^12.0.1", "stylelint": "^12.0.1",
"terser-webpack-plugin": "^2.3.0", "terser-webpack-plugin": "^2.3.0",
"typescript": "^3.7.3", "typescript": "^3.7.3",
@ -144,7 +148,7 @@
"webpack-dev-server": "^3.9.0" "webpack-dev-server": "^3.9.0"
}, },
"jest": { "jest": {
"testEnvironment": "jest-environment-jsdom-fourteen", "testEnvironment": "jest-environment-jsdom-sixteen",
"testMatch": [ "testMatch": [
"<rootDir>/test/**/*-test.js" "<rootDir>/test/**/*-test.js"
], ],

View file

@ -38,9 +38,7 @@ do
echo "Upgrading $i to $latestver..." echo "Upgrading $i to $latestver..."
yarn add -E $i@$latestver yarn add -E $i@$latestver
git add -u git add -u
# The `-e` flag opens the editor and gives you a chance to check git commit -m "Upgrade $i to $latestver"
# the upgrade for correctness.
git commit -m "Upgrade $i to $latestver" -e
fi fi
fi fi
done done

View file

@ -1 +1 @@
self.addEventListener('fetch',() => {}); self.addEventListener('fetch', () => {});

View file

@ -169,7 +169,7 @@ we don't have an account and should hide them. No account == no guest account ei
</style> </style>
<div class="mx_Parent"> <div class="mx_Parent">
<a href="https://riot.im" target="_blank" rel="noopener"> <a href="https://element.io" target="_blank" rel="noopener">
<img src="welcome/images/logo.svg" alt="" class="mx_Logo"/> <img src="welcome/images/logo.svg" alt="" class="mx_Logo"/>
</a> </a>
<h1 class="mx_Header_title">_t("Welcome to Element")</h1> <h1 class="mx_Header_title">_t("Welcome to Element")</h1>
@ -185,7 +185,7 @@ we don't have an account and should hide them. No account == no guest account ei
</div> </div>
<!-- The comments below are meant to be used by Ansible as a quick way <!-- The comments below are meant to be used by Ansible as a quick way
to strip out the marked content when desired. to strip out the marked content when desired.
See https://github.com/vector-im/riot-web/issues/8622. See https://github.com/vector-im/element-web/issues/8622.
TODO: Strip out these comments and rely on the guest flag --> TODO: Strip out these comments and rely on the guest flag -->
<!-- BEGIN Ansible: Remove these lines when guest access is disabled --> <!-- BEGIN Ansible: Remove these lines when guest access is disabled -->
<div class="mx_ButtonRow mx_WelcomePage_guestFunctions"> <div class="mx_ButtonRow mx_WelcomePage_guestFunctions">

View file

@ -7,6 +7,7 @@ const fs = require("fs");
const path = require("path"); const path = require("path");
const mkdirp = require("mkdirp"); const mkdirp = require("mkdirp");
const fetch = require("node-fetch"); const fetch = require("node-fetch");
const ProxyAgent = require("simple-proxy-agent");
console.log("Making webapp directory"); console.log("Making webapp directory");
mkdirp.sync("webapp"); mkdirp.sync("webapp");
@ -14,7 +15,13 @@ mkdirp.sync("webapp");
// curl -s https://jitsi.riot.im/libs/external_api.min.js > ./webapp/jitsi_external_api.min.js // curl -s https://jitsi.riot.im/libs/external_api.min.js > ./webapp/jitsi_external_api.min.js
console.log("Downloading Jitsi script"); console.log("Downloading Jitsi script");
const fname = path.join("webapp", "jitsi_external_api.min.js"); const fname = path.join("webapp", "jitsi_external_api.min.js");
fetch("https://jitsi.riot.im/libs/external_api.min.js").then(res => {
const options = {};
if (process.env.HTTPS_PROXY) {
options.agent = new ProxyAgent(process.env.HTTPS_PROXY, {tunnel: true});
}
fetch("https://jitsi.riot.im/libs/external_api.min.js", options).then(res => {
const stream = fs.createWriteStream(fname); const stream = fs.createWriteStream(fname);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
res.body.pipe(stream); res.body.pipe(stream);

View file

@ -21,6 +21,7 @@ const INCLUDE_LANGS = [
{'value': 'en_US', 'label': 'English (US)'}, {'value': 'en_US', 'label': 'English (US)'},
{'value': 'eo', 'label': 'Esperanto'}, {'value': 'eo', 'label': 'Esperanto'},
{'value': 'es', 'label': 'Español'}, {'value': 'es', 'label': 'Español'},
{'value': 'et', 'label': 'Eesti'},
{'value': 'eu', 'label': 'Euskara'}, {'value': 'eu', 'label': 'Euskara'},
{'value': 'fi', 'label': 'Suomi'}, {'value': 'fi', 'label': 'Suomi'},
{'value': 'fr', 'label': 'Français'}, {'value': 'fr', 'label': 'Français'},
@ -31,6 +32,7 @@ const INCLUDE_LANGS = [
{'value': 'it', 'label': 'Italiano'}, {'value': 'it', 'label': 'Italiano'},
{'value': 'ja', 'label': '日本語'}, {'value': 'ja', 'label': '日本語'},
{'value': 'jbo', 'label': 'banjubu\'o'}, {'value': 'jbo', 'label': 'banjubu\'o'},
{'value': 'kab', 'label': 'Taqbaylit'},
{'value': 'ko', 'label': '한국어'}, {'value': 'ko', 'label': '한국어'},
{'value': 'lt', 'label': 'Lietuvių'}, {'value': 'lt', 'label': 'Lietuvių'},
{'value': 'lv', 'label': 'Latviešu'}, {'value': 'lv', 'label': 'Latviešu'},

View file

@ -70,7 +70,6 @@ function dodep() {
############################## ##############################
echo -en 'travis_fold:start:matrix-js-sdk\r'
echo 'Setting up matrix-js-sdk' echo 'Setting up matrix-js-sdk'
dodep matrix-org matrix-js-sdk dodep matrix-org matrix-js-sdk
@ -83,11 +82,8 @@ popd
yarn link matrix-js-sdk yarn link matrix-js-sdk
echo -en 'travis_fold:end:matrix-js-sdk\r'
############################## ##############################
echo -en 'travis_fold:start:matrix-react-sdk\r'
echo 'Setting up matrix-react-sdk' echo 'Setting up matrix-react-sdk'
dodep matrix-org matrix-react-sdk dodep matrix-org matrix-react-sdk
@ -101,8 +97,6 @@ popd
yarn link matrix-react-sdk yarn link matrix-react-sdk
echo -en 'travis_fold:end:matrix-react-sdk\r'
############################## ##############################
# Link the reskindex binary in place: if we used `yarn link`, # Link the reskindex binary in place: if we used `yarn link`,

View file

@ -18,7 +18,7 @@ my $gh = Net::GitHub->new(
login => 'ara4n', pass => read_password("github password: "), login => 'ara4n', pass => read_password("github password: "),
); );
$gh->set_default_user_repo('vector-im', 'riot-web'); $gh->set_default_user_repo('vector-im', 'element-web');
#my @issues = $gh->issue->repos_issues({ state => 'all', milestone => 3 }); #my @issues = $gh->issue->repos_issues({ state => 'all', milestone => 3 });
my @issues = $gh->issue->repos_issues({ state => 'all' }); my @issues = $gh->issue->repos_issues({ state => 'all' });

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
# #
# auto-deploy script for https://riot.im/develop # auto-deploy script for https://develop.element.io
# #
# Listens for buildkite webhook pokes (https://buildkite.com/docs/apis/webhooks) # Listens for buildkite webhook pokes (https://buildkite.com/docs/apis/webhooks)
# When it gets one, downloads the artifact from buildkite # When it gets one, downloads the artifact from buildkite
@ -191,7 +191,7 @@ def deploy_tarball(artifact, build_dir):
# Download the tarball here as buildkite needs auth to do this # Download the tarball here as buildkite needs auth to do this
# we don't pgp-sign buildkite artifacts, relying on HTTPS and buildkite # we don't pgp-sign buildkite artifacts, relying on HTTPS and buildkite
# not being evil. If that's not good enough for you, don't use riot.im/develop. # not being evil. If that's not good enough for you, don't use develop.element.io.
resp = requests.get(artifact['download_url'], stream=True, headers=req_headers()) resp = requests.get(artifact['download_url'], stream=True, headers=req_headers())
resp.raise_for_status() resp.raise_for_status()
with open(artifact['filename'], 'wb') as ofp: with open(artifact['filename'], 'wb') as ofp:

View file

@ -78,17 +78,26 @@ const CompatibilityView: React.FC<IProps> = ({ onAccept }) => {
<div> <div>
<h2 id="step2_heading">Use Element on mobile</h2> <h2 id="step2_heading">Use Element on mobile</h2>
<p><strong>iOS</strong> (iPhone or iPad)</p> <p><strong>iOS</strong> (iPhone or iPad)</p>
<a href="https://apps.apple.com/app/vector/id1083446067" target="_blank" <a
className="mx_ClearDecoration"> href="https://apps.apple.com/app/vector/id1083446067"
target="_blank"
className="mx_ClearDecoration"
>
<img height="48" src="themes/element/img/download/apple.svg" alt="Apple App Store" /> <img height="48" src="themes/element/img/download/apple.svg" alt="Apple App Store" />
</a> </a>
<p className="mx_Spacer"><strong>Android</strong></p> <p className="mx_Spacer"><strong>Android</strong></p>
<a href="https://play.google.com/store/apps/details?id=im.vector.app" target="_blank" <a
className="mx_ClearDecoration"> href="https://play.google.com/store/apps/details?id=im.vector.app"
target="_blank"
className="mx_ClearDecoration"
>
<img height="48" src="themes/element/img/download/google.svg" alt="Google Play Store" /> <img height="48" src="themes/element/img/download/google.svg" alt="Google Play Store" />
</a> </a>
<a href="https://f-droid.org/repository/browse/?fdid=im.vector.alpha" target="_blank" <a
className="mx_ClearDecoration"> href="https://f-droid.org/repository/browse/?fdid=im.vector.app"
target="_blank"
className="mx_ClearDecoration"
>
<img height="48" src="themes/element/img/download/fdroid.svg" alt="F-Droid" /> <img height="48" src="themes/element/img/download/fdroid.svg" alt="F-Droid" />
</a> </a>
</div> </div>

View file

@ -28,7 +28,7 @@ export default class VectorEmbeddedPage extends EmbeddedPage {
// we're overriding the base component here, for Element-specific tweaks // we're overriding the base component here, for Element-specific tweaks
translate(s) { translate(s) {
s = sanitizeHtml(_t(s)); s = sanitizeHtml(_t(s));
// ugly fix for https://github.com/vector-im/riot-web/issues/4243 // ugly fix for https://github.com/vector-im/element-web/issues/4243
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
s = s.replace(/\[matrix\]/, '<a href="https://matrix.org" target="_blank" rel="noreferrer noopener"><img width="79" height="34" alt="Matrix" style="padding-left: 1px;vertical-align: middle" src="welcome/images/matrix.svg"/></a>'); s = s.replace(/\[matrix\]/, '<a href="https://matrix.org" target="_blank" rel="noreferrer noopener"><img width="79" height="34" alt="Matrix" style="padding-left: 1px;vertical-align: middle" src="welcome/images/matrix.svg"/></a>');
return s; return s;

View file

@ -24,7 +24,7 @@ const VectorAuthFooter = () => {
let links = [ let links = [
{"text": "Blog", "url": "https://element.io/blog"}, {"text": "Blog", "url": "https://element.io/blog"},
{"text": "Twitter", "url": "https://twitter.com/element_hq"}, {"text": "Twitter", "url": "https://twitter.com/element_hq"},
{"text": "GitHub", "url": "https://github.com/vector-im/riot-web"}, {"text": "GitHub", "url": "https://github.com/vector-im/element-web"},
]; ];
if (brandingConfig && brandingConfig.authFooterLinks) { if (brandingConfig && brandingConfig.authFooterLinks) {

View file

@ -0,0 +1 @@
../../docs/customisations.md

View file

@ -1,35 +1,36 @@
{ {
"Dismiss": "تجاهل", "Dismiss": "أهمِل",
"Unknown device": "جهاز مجهول", "Unknown device": "جهاز مجهول",
"You need to be using HTTPS to place a screen-sharing call.": "تحتاج الى استخدام الاتصال الآمن (HTTPS) للسماح بمشاركة الشاشة.", "You need to be using HTTPS to place a screen-sharing call.": "عليك استعمال ميفاق HTTPS للاتصال بمشاركة الشاشة.",
"powered by Matrix": "مشغل بواسطة Matrix", "powered by Matrix": "مشغل بواسطة Matrix",
"Welcome to Element": "مرحبا بك في Element", "Welcome to Element": "مرحبًا بك في Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "دردشة مشفرة غير مركزية &amp;تطبيق تعاوني مدعوم بواسطة [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "دردشة وتعاون غير مركزي معمّى، تدعمه [matrix]",
"Create Account": "انشاء حساب", "Create Account": "أنشِئ حسابًا",
"Explore rooms": "استكشف غرف المحادثات", "Explore rooms": "استكشِف الغرف",
"Sign In": "الدخول", "Sign In": "لِج",
"Missing indexeddb worker script!": "منفذ السكريبت الخاص ب Indexeddb غير موجود!", "Missing indexeddb worker script!": "سكربت عامل indexeddb ناقص!",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "خطأ في الاعدادات: يمكنك فقط تحديد واحد فقط من: default_server_config، default_server_name، أو default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "الضبط غير صالح: يمكنك تحديد واحدًا من الآتي فقط: default_server_config أو default_server_name أو default_hs_url.",
"Invalid configuration: no default server specified.": "اعدادات خاطئة: لم يتم تحديد السيرفر الافتراضي.", "Invalid configuration: no default server specified.": "الضبط غير صالح: لم تحدّد خادومًا مبدئيًا.",
"Your Element is misconfigured": "تطبيقك معد بطريقة خاطئة", "Your Element is misconfigured": "لم يُضبط تطبيق Element كما ينبغي",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "اعداداتك تحتوى على بنية JSON غير صحيحة. يرجى تصحيح المشكلة واعادة تحديث الصفحة.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "يحتوي ضبط تطبيق Element على تنسيق JSON غير صالح. من فضلك صحّح المشكلة وأعِد تحميل الصفحة.",
"The message from the parser is: %(message)s": "الرسالة من المدقق هي:%(message)s", "The message from the parser is: %(message)s": "الرسالة القادمة من المحلّل: %(message)s",
"Invalid JSON": "JSON خاطئ", "Invalid JSON": "تنسيق JSON غير صالح",
"Unable to load config file: please refresh the page to try again.": "لم نستطع تحميل ملف الاعداد: يرجى تحديث الصفحة للمحاولة مرة اخرى.", "Unable to load config file: please refresh the page to try again.": "تعذّر تحميل ملف الضبط: من فضلك أنعِش الصفحة لمعاودة المحاولة.",
"Unexpected error preparing the app. See console for details.": "حدث خطأ غير متوقع عند تجهيز التطبيق. انظر الى منصة التحكم للمزيد من التفاصيل.", "Unexpected error preparing the app. See console for details.": "حدث عُطل غير متوقع أثناء تجهيز التطبيق. طالِع المِعراض للتفاصيل.",
"Download Completed": "تم اكتمال التحميل", "Download Completed": "اكتمل التنزيل",
"Open": "فتح", "Open": "افتح",
"Open user settings": "فتح اعدادات المستخدم", "Open user settings": "افتح إعدادات المستخدم",
"Previous/next recently visited room or community": "السابقة/اللاحقة الغرفة او المجتمع الذي تمت زيارته مؤخرا", "Previous/next recently visited room or community": "الغرفة أو المجتمع التالي/السابق الذي زرته حديثًا",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s سطح المكتب (%(platformName)s)", "%(brand)s Desktop (%(platformName)s)": "%(brand)s لسطح المكتب (%(platformName)s)",
"Go to your browser to complete Sign In": "اذهب الى المتصفح لاكمال تسجيل الدخول", "Go to your browser to complete Sign In": "افتح المتصفح لإكمال الولوج",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s، %(osName)s)",
"Unsupported browser": "متصفح غير متوافق", "Unsupported browser": "متصفح غير مدعوم",
"Your browser can't run %(brand)s": "متصفحك لايمكنه تشغيل %(brand)s", "Your browser can't run %(brand)s": "لا يمكن لمتصفحك تشغيل %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s يستخدم مزايا المتصفح المتقدمة والتي لا يدعمها متصفحك الحالي.", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "يستعمل %(brand)s ميزات متقدمة في المتصفحات لا يدعمها متصفحك الحالي.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "يرجى تثبيت <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.", "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "من فضلك ثبّت <chromeLink>كروم</chromeLink> أو <firefoxLink>فَيَرفُكس</firefoxLink> أو <safariLink>سفاري</safariLink> لأفضل تجربة.",
"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.": "يمكنك الاستمرار في استخدام متصفحك الحالي، ولكن بعض او كل المزايا ربما لا تعمل ويكون شكل التطبيق وشعورك تجاهه غير صحيح.", "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.": "يمكنك مواصل استعمال متصفحك الحالي ولكن قد لا تعمل بعض المزايا (أو كلها) وقد لا يظهر التطبيق كما ينبغي له أن يظهر.",
"I understand the risks and wish to continue": "ادرك المخاطر وارغب في الاستمرار", "I understand the risks and wish to continue": "أفهم المخاطرة وأود المواصلة",
"Go to element.io": "اذهب الى Element.io", "Go to element.io": "انتقل إلى element.io",
"Failed to start": "فشل الاقلاع" "Failed to start": "فشل البدء",
"Powered by Matrix": "تدعمه «ماترِكس»"
} }

View file

@ -31,5 +31,6 @@
"Download Completed": "Свалянето завърши", "Download Completed": "Свалянето завърши",
"Open": "Отвори", "Open": "Отвори",
"Your browser can't run %(brand)s": "Браузърът ви не може да изпълни %(brand)s", "Your browser can't run %(brand)s": "Браузърът ви не може да изпълни %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s използва модерни функции на браузъра, които не се поддържат от Вашия." "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s използва модерни функции на браузъра, които не се поддържат от Вашия.",
"Powered by Matrix": "Базирано на Matrix"
} }

View file

@ -1 +1,35 @@
{} {
"Missing indexeddb worker script!": "Nedostaje indexeddb radna skripta!",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Neispravna konfiguracija: navesti se samo može jedan od default_server_config, default_server_name ili default_hs_url.",
"Invalid configuration: no default server specified.": "Neispravna konfiguracija: nije naveden zadani server.",
"Your Element is misconfigured": "Vaš element je pogrešno konfiguriran",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfiguracija vašeg elementa sadrži nevažeći JSON. Ispravite problem i ponovo učitajte stranicu.",
"The message from the parser is: %(message)s": "Poruka parsera je: %(message)s",
"Invalid JSON": "Nevažeći JSON",
"Unable to load config file: please refresh the page to try again.": "Nije moguće učitati konfiguracijsku datoteku: osvježite stranicu i pokušajte ponovo.",
"Unexpected error preparing the app. See console for details.": "Neočekivana greška prilikom pripreme aplikacije. Pogledajte konzolu za detalje.",
"Download Completed": "Preuzimanje završeno",
"Open": "Otvori",
"Dismiss": "Odbaci",
"Open user settings": "Otvori korisničke postavke",
"Previous/next recently visited room or community": "Prethodna / sljedeća nedavno posjećena soba ili zajednica",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Radna povrsina (%(platformName)s)",
"Go to your browser to complete Sign In": "Idite na svoj pretraživač da biste dovršili prijavu",
"Unknown device": "Nepoznat uređaj",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"You need to be using HTTPS to place a screen-sharing call.": "Morate koristiti HTTPS za upućivanje poziva za dijeljenje ekrana.",
"Powered by Matrix": "Pokretano uz Matrix",
"Unsupported browser": "Nepodržani pretraživač",
"Your browser can't run %(brand)s": "Vaš pretraživač ne može pokretati %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s koristi napredne funkcije pretraživača koje vaš trenutni pretraživač ne podržava.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Molimo instalirajte <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> ili <safariLink>Safari</safariLink> za najbolje iskustvo.",
"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.": "Možete nastaviti koristiti svoj trenutni pretraživač, ali neke ili sve funkcije možda neće raditi, a izgled i dojam aplikacije mogu biti neispravani.",
"I understand the risks and wish to continue": "Razumijem rizike i želim nastaviti",
"Go to element.io": "Idite na element.io",
"Failed to start": "Pokretanje nije uspjelo",
"Welcome to Element": "Dobrodošli u Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralizirani, šifrirani razgovor &amp; suradnja pokrenuta [matrix]",
"Sign In": "Prijavite se",
"Create Account": "Otvori račun",
"Explore rooms": "Istražite sobe"
}

View file

@ -10,5 +10,26 @@
"Sign In": "Inicia la sessió", "Sign In": "Inicia la sessió",
"Invalid configuration: no default server specified.": "Configuració no vàlida: no s'ha especificat cap servidor per defecte.", "Invalid configuration: no default server specified.": "Configuració no vàlida: no s'ha especificat cap servidor per defecte.",
"Invalid JSON": "JSON no vàlid", "Invalid JSON": "JSON no vàlid",
"Go to your browser to complete Sign In": "Aneu al vostre navegador per completar l'inici de sessió" "Go to your browser to complete Sign In": "Aneu al vostre navegador per completar l'inici de sessió",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuració incorrecta: només podeu especificar una de les opcions default_server_config, default_server_name, o default_hs_url.",
"Your Element is misconfigured": "El vostre Element està mal configurat",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "El vostre Element conté un JSON incorrecte. Si us plau arregleu el problema i recarregueu la pàgina.",
"The message from the parser is: %(message)s": "El missatge de l'analitzador és: %(message)s",
"Unable to load config file: please refresh the page to try again.": "No he pogut carregar l'arxiu de configuració: si us plau recarregueu la pàgina per provar-ho de nou.",
"Unexpected error preparing the app. See console for details.": "Error inesperat preparant l'app. Vegeu la consola pels detalls.",
"Download Completed": "Descàrrega completada",
"Open": "Obre",
"Open user settings": "Obre configuració d'usuari",
"Previous/next recently visited room or community": "Anterior/Següent sala o comunitat visitada recentment",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s d'escriptori (%(platformName)s)",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Powered by Matrix": "En funcionament gràcies a Matrix",
"Unsupported browser": "Navegador no suportat",
"Your browser can't run %(brand)s": "El vostre navegador no pot executar %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa característiques avançades del navegador que el vostre navegador no suporta.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Si us plau instal·leu<chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> per una millor experiència.",
"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.": "Podeu continuar usant el vostre navegador actual, però algunes o totes les característiques podrien no funcionar i l'aspepte de l'aplicació podria mostrar errors.",
"I understand the risks and wish to continue": "Entenc els riscos i voldria continuar",
"Go to element.io": "Vés a element.io",
"Failed to start": "Ha fallat en iniciar-se"
} }

View file

@ -1,6 +1,6 @@
{ {
"powered by Matrix": "betrieben mit Matrix", "powered by Matrix": "betrieben mit Matrix",
"Dismiss": "Ablehnen", "Dismiss": "Ausblenden",
"Unknown device": "Unbekanntes Gerät", "Unknown device": "Unbekanntes Gerät",
"You need to be using HTTPS to place a screen-sharing call.": "Du musst HTTPS nutzen um einen Anruf mit Bildschirmfreigabe durchzuführen.", "You need to be using HTTPS to place a screen-sharing call.": "Du musst HTTPS nutzen um einen Anruf mit Bildschirmfreigabe durchzuführen.",
"Welcome to Element": "Willkommen bei Element", "Welcome to Element": "Willkommen bei Element",
@ -15,8 +15,8 @@
"Invalid JSON": "Ungültiges JSON", "Invalid JSON": "Ungültiges JSON",
"Go to your browser to complete Sign In": "Gehe zu deinem Browser, um die Anmeldung abzuschließen", "Go to your browser to complete Sign In": "Gehe zu deinem Browser, um die Anmeldung abzuschließen",
"Open user settings": "Öffne Nutzer-Einstellungen", "Open user settings": "Öffne Nutzer-Einstellungen",
"Unable to load config file: please refresh the page to try again.": "Konfigurationsdatei kann nicht geladen werden: Bitte aktualisieren Sie die Seite, um es erneut zu versuchen.", "Unable to load config file: please refresh the page to try again.": "Konfigurationsdatei kann nicht geladen werden: Bitte aktualisiere die Seite, um es erneut zu versuchen.",
"Missing indexeddb worker script!": "Indexeddb worker Skript fehlt!", "Missing indexeddb worker script!": "Fehlendes indexeddb Worker-Skript!",
"Previous/next recently visited room or community": "Vorheriger/nächster kürzlich besuchter Raum oder Community", "Previous/next recently visited room or community": "Vorheriger/nächster kürzlich besuchter Raum oder Community",
"Unsupported browser": "Nicht unterstützter Browser", "Unsupported browser": "Nicht unterstützter Browser",
"Go to element.io": "Gehe zu element.io", "Go to element.io": "Gehe zu element.io",
@ -29,8 +29,8 @@
"Your Element is misconfigured": "Dein Element ist fehlkonfiguriert", "Your Element is misconfigured": "Dein Element ist fehlkonfiguriert",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Deine Element Konfiguration enthält ungültiges JSON. Bitte korrigiere das Problem und lade die Seite neu.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Deine Element Konfiguration enthält ungültiges JSON. Bitte korrigiere das Problem und lade die Seite neu.",
"Download Completed": "Download fertiggestellt", "Download Completed": "Download fertiggestellt",
"Open": "Offen", "Open": "Öffnen",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s verwendet erweiterte Browserfunktionen, die von Ihrem aktuellen Browser nicht unterstützt werden.", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s verwendet erweiterte Browserfunktionen, die von Ihrem aktuellen Browser nicht unterstützt werden.",
"Your browser can't run %(brand)s": "Dein Browser kann %(brand)s nicht ausführen", "Your browser can't run %(brand)s": "Dein Browser kann %(brand)s nicht ausführen",
"Powered by Matrix": "Powered by Matrix" "Powered by Matrix": "Betrieben mit Matrix"
} }

View file

@ -10,7 +10,27 @@
"The message from the parser is: %(message)s": "Το μήνυμα από τον αναλυτή είναι: %(message)s", "The message from the parser is: %(message)s": "Το μήνυμα από τον αναλυτή είναι: %(message)s",
"Invalid JSON": "Μη έγκυρο JSON", "Invalid JSON": "Μη έγκυρο JSON",
"Unexpected error preparing the app. See console for details.": "Απρόοπτο σφάλμα κατά την προετοιμασία της εφαρμογής. Δείτε το τερματικό για λεπτομέρειες.", "Unexpected error preparing the app. See console for details.": "Απρόοπτο σφάλμα κατά την προετοιμασία της εφαρμογής. Δείτε το τερματικό για λεπτομέρειες.",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Μη έγκυρη ρύθμιση παραμέτρων: δυνατότητα ορισμού μόνο ένα από τα default_server_config, default_server_name, ή default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Μη έγκυρη ρύθμιση: δυνατότητα ορισμού μόνο ένα από τα default_server_config, default_server_name, ή default_hs_url.",
"Invalid configuration: no default server specified.": "Μη έγκυρη ρύθμιση παραμέτρων: δεν έχει οριστεί προκαθορισμένος διακομιστής.", "Invalid configuration: no default server specified.": "Μη έγκυρη ρύθμιση παραμέτρων: δεν έχει οριστεί προκαθορισμένος διακομιστής.",
"Explore rooms": "Εξερευνήστε δωμάτια" "Explore rooms": "Εξερευνήστε δωμάτια",
"Open": "Άνοιγμα",
"Go to your browser to complete Sign In": "Μεταβείτε στο πρόγραμμα περιήγησής σας για να ολοκληρώσετε τη σύνδεση",
"Powered by Matrix": "Με την υποστήριξη του Matrix",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Παρακαλούμε εγκαταστήστε <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ή <safariLink>Safari</safariLink> για καλύτερη εμπειρία χρήσης.",
"Your Element is misconfigured": "Το Element σας δεν εχει ρυθμιστεί σωστά",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Η ρύθμιση του Element περιέχει μη έγκυρο JSON. Διορθώστε το πρόβλημα και φορτώστε ξανά τη σελίδα.",
"Unable to load config file: please refresh the page to try again.": "Δεν είναι δυνατή η φόρτωση του αρχείου config: ανανεώστε τη σελίδα για να δοκιμάσετε ξανά.",
"Download Completed": "Η λήψη ολοκληρώθηκε",
"Open user settings": "Ανοίξτε τις ρυθμίσεις χρήστη",
"Previous/next recently visited room or community": "Προηγούμενο / επόμενο δωμάτιο ή κοινότητα που επισκεφτήκατε πρόσφατα",
"Unsupported browser": "Μη υποστηριζόμενο πρόγραμμα περιήγησης",
"Your browser can't run %(brand)s": "Το πρόγραμμα περιήγησής σας δεν μπορεί να εκτελέσει %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s χρησιμοποιεί προηγμένες δυνατότητες προγράμματος περιήγησης που δεν υποστηρίζονται από το τρέχον πρόγραμμα περιήγησής σας.",
"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.": "Μπορείτε να συνεχίσετε να χρησιμοποιείτε το τρέχον πρόγραμμα περιήγησής σας, αλλά ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν και η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι λανθασμένη.",
"I understand the risks and wish to continue": "Κατανοώ τους κινδύνους και επιθυμώ να συνεχίσω",
"Go to element.io": "Πήγαινε στο element.io",
"Failed to start": "Αποτυχία έναρξης",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)",
"Missing indexeddb worker script!": "Απουσία indexeddb worker script!"
} }

View file

@ -4,7 +4,7 @@
"powered by Matrix": "con el poder de Matrix", "powered by Matrix": "con el poder de Matrix",
"You need to be using HTTPS to place a screen-sharing call.": "Debes usar HTTPS para hacer una llamada con pantalla compartida.", "You need to be using HTTPS to place a screen-sharing call.": "Debes usar HTTPS para hacer una llamada con pantalla compartida.",
"Welcome to Element": "Bienvenido a Element", "Welcome to Element": "Bienvenido a Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Conversaciones cifradas y descentralizadas y colaboración con el poder de [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Conversaciones cifradas y descentralizadas &amp; colaboración impulsada por [matrix]",
"Sign In": "Iniciar sesión", "Sign In": "Iniciar sesión",
"Create Account": "Crear cuenta", "Create Account": "Crear cuenta",
"Explore rooms": "Explorar salas", "Explore rooms": "Explorar salas",
@ -15,10 +15,10 @@
"Invalid JSON": "JSON inválido", "Invalid JSON": "JSON inválido",
"Open user settings": "Abrir opciones de usuario", "Open user settings": "Abrir opciones de usuario",
"Go to your browser to complete Sign In": "Abre tu navegador web para completar el registro", "Go to your browser to complete Sign In": "Abre tu navegador web para completar el registro",
"Missing indexeddb worker script!": "¡Worker script “indexeddb” faltante!", "Missing indexeddb worker script!": "Falta el script de trabajo indexeddb!",
"Unable to load config file: please refresh the page to try again.": "No se ha podido cargar el archivo de configuración. Recarga la página para intentar nuevamente.", "Unable to load config file: please refresh the page to try again.": "No se ha podido cargar el archivo de configuración. Recarga la página para intentar nuevamente.",
"Previous/next recently visited room or community": "Anterior/siguiente sala o comunidad visitada recientemente", "Previous/next recently visited room or community": "Anterior/siguiente sala o comunidad visitada recientemente",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)", "%(brand)s Desktop (%(platformName)s)": "%(brand)s Escritorio (%(platformName)s)",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Unsupported browser": "Navegador no soportado", "Unsupported browser": "Navegador no soportado",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Por favor, instale <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> para la mejor experiencia.", "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Por favor, instale <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> para la mejor experiencia.",
@ -26,10 +26,11 @@
"I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar", "I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar",
"Go to element.io": "Ir a element.io", "Go to element.io": "Ir a element.io",
"Failed to start": "Fallo al iniciar", "Failed to start": "Fallo al iniciar",
"Your Element is misconfigured": "Su Element está mal configurado", "Your Element is misconfigured": "Tu elemento está mal configurado",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Su configuración de Element contiene JSON inválido. Por favor corríjalo e inténtelo de nuevo.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Su configuración de Element contiene JSON inválido. Por favor corríjalo e inténtelo de nuevo.",
"Download Completed": "Descarga completada", "Download Completed": "Descarga completada",
"Open": "Abrir", "Open": "Abrir",
"Your browser can't run %(brand)s": "Su navegador es compatible con %(brand)s", "Your browser can't run %(brand)s": "Su navegador es incompatible con %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s utiliza funciones avanzadas no soportadas por su navegador." "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa funciones avanzadas que su navegador actual no soporta.",
"Powered by Matrix": "Desarrollado por Matrix"
} }

View file

@ -31,5 +31,6 @@
"Your Element is misconfigured": "Votre Element est mal configuré", "Your Element is misconfigured": "Votre Element est mal configuré",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "La configuration de votre Element contient du JSON invalide. Veuillez corriger le problème et recharger la page.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "La configuration de votre Element contient du JSON invalide. Veuillez corriger le problème et recharger la page.",
"Your browser can't run %(brand)s": "Votre navigateur ne peut pas exécuter %(brand)s", "Your browser can't run %(brand)s": "Votre navigateur ne peut pas exécuter %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s nécessite des fonctionnalités avancées que votre navigateur actuel ne supporte pas." "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s nécessite des fonctionnalités avancées que votre navigateur actuel ne supporte pas.",
"Powered by Matrix": "Propulsé par Matrix"
} }

View file

@ -31,5 +31,6 @@
"Download Completed": "Asider yemmed", "Download Completed": "Asider yemmed",
"Open": "Ldi", "Open": "Ldi",
"Your browser can't run %(brand)s": "Iminig-inek·inem ur isselkan ara %(brand)s", "Your browser can't run %(brand)s": "Iminig-inek·inem ur isselkan ara %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s isseqdac timahilin n yiminig leqqayen ur yessefrak ara yiminig-ik·im amiran." "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s isseqdac timahilin n yiminig leqqayen ur yessefrak ara yiminig-ik·im amiran.",
"Powered by Matrix": "Iteddu s lmendad n Matrix"
} }

View file

@ -31,5 +31,6 @@
"Open": "Atidaryti", "Open": "Atidaryti",
"Your browser can't run %(brand)s": "Jūsų naršyklė negali paleisti %(brand)s", "Your browser can't run %(brand)s": "Jūsų naršyklė negali paleisti %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s naudoja išplėstines naršyklės funkcijas, kurių jūsų dabartinė naršyklė nepalaiko.", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s naudoja išplėstines naršyklės funkcijas, kurių jūsų dabartinė naršyklė nepalaiko.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Geriausiam veikimui suinstaliuokite <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, arba <safariLink>Safari</safariLink>." "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Geriausiam veikimui suinstaliuokite <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, arba <safariLink>Safari</safariLink>.",
"Powered by Matrix": "Veikia su Matrix"
} }

View file

@ -7,7 +7,7 @@
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Gedecentraliseerd en versleuteld chatten &amp; samenwerken dankzij [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Gedecentraliseerd en versleuteld chatten &amp; samenwerken dankzij [matrix]",
"Sign In": "Aanmelden", "Sign In": "Aanmelden",
"Create Account": "Account aanmaken", "Create Account": "Account aanmaken",
"Explore rooms": "Gesprekken ontdekken", "Explore rooms": "Kamers verkennen",
"Unexpected error preparing the app. See console for details.": "Er is een onverwachte fout opgetreden bij het voorbereiden van de app. Zie de console voor details.", "Unexpected error preparing the app. See console for details.": "Er is een onverwachte fout opgetreden bij het voorbereiden van de app. Zie de console voor details.",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuratiefout: kan slechts één van default_server_config, default_server_name, of default_hs_url opgeven.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuratiefout: kan slechts één van default_server_config, default_server_name, of default_hs_url opgeven.",
"Invalid configuration: no default server specified.": "Configuratie ongeldig: geen standaardserver opgegeven.", "Invalid configuration: no default server specified.": "Configuratie ongeldig: geen standaardserver opgegeven.",
@ -22,8 +22,13 @@
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Unsupported browser": "Niet-ondersteunde browser", "Unsupported browser": "Niet-ondersteunde browser",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Installeer <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, of <safariLink>Safari</safariLink> voor de beste gebruikservaring.", "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Installeer <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, of <safariLink>Safari</safariLink> voor de beste gebruikservaring.",
"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.": "U kunt uw huidige browser blijven gebruiken, maar sommige of alle features zouden niet kunnen werken en de uitstraling van het programma kan verkeerd zijn.", "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.": "U kunt uw huidige browser blijven gebruiken, maar sommige of alle functies zouden niet kunnen werken en de uitstraling van het programma kan verkeerd zijn.",
"I understand the risks and wish to continue": "Ik begrijp de risico's en wil verder gaan", "I understand the risks and wish to continue": "Ik begrijp de risico's en wil verder gaan",
"Go to element.io": "Ga naar element.io", "Go to element.io": "Ga naar element.io",
"Failed to start": "Opstarten gefaald" "Failed to start": "Opstarten mislukt",
"Open": "Open",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Uw Element configuratie bevat ongeldige JSON. Gelieve het probleem te corrigeren daarna de pagina te herladen.",
"Download Completed": "Download voltooid",
"Your Element is misconfigured": "Uw Element is verkeerd geconfigureerd",
"Your browser can't run %(brand)s": "Uw browser kan %(brand)s niet draaien."
} }

View file

@ -25,5 +25,11 @@
"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.": "Możesz kontynuować używanie obecnej przeglądarki, lecz niektóre lub wszystkie funkcje mogą nie działać oraz wygląd aplikacji może być niepoprawny.", "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.": "Możesz kontynuować używanie obecnej przeglądarki, lecz niektóre lub wszystkie funkcje mogą nie działać oraz wygląd aplikacji może być niepoprawny.",
"I understand the risks and wish to continue": "Rozumiem ryzyko i chcę kontynuować", "I understand the risks and wish to continue": "Rozumiem ryzyko i chcę kontynuować",
"Go to element.io": "Przejdź do element.io", "Go to element.io": "Przejdź do element.io",
"Failed to start": "Nie udało się wystartować" "Failed to start": "Nie udało się wystartować",
"Download Completed": "Pobieranie Zakończone",
"Open": "Otwórz",
"Your browser can't run %(brand)s": "Twoja przeglądarka nie obsługuje %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s używa zaawansowanych funkcji przeglądarki, które nie są dostępne w twojej przeglądarce.",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfiguracja Elementa zawiera niepoprawny JSON. Popraw konfiguracje i odśwież stronę.",
"Your Element is misconfigured": "Element jest nieprawidłowo skonfigurowany"
} }

View file

@ -3,7 +3,7 @@
"powered by Matrix": "powered by Matrix", "powered by Matrix": "powered by Matrix",
"Unknown device": "Dispositivo desconhecido", "Unknown device": "Dispositivo desconhecido",
"You need to be using HTTPS to place a screen-sharing call.": "Necessita de estar a usar HTTPS para poder iniciar uma chamada com partilha de ecrã.", "You need to be using HTTPS to place a screen-sharing call.": "Necessita de estar a usar HTTPS para poder iniciar uma chamada com partilha de ecrã.",
"Welcome to Element": "Bem-vindo ao Element", "Welcome to Element": "Boas-vindas ao Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat descentralizado, encriptado &amp; colaborativo powered by [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat descentralizado, encriptado &amp; colaborativo powered by [matrix]",
"The message from the parser is: %(message)s": "A mensagem do parser é: %(message)s", "The message from the parser is: %(message)s": "A mensagem do parser é: %(message)s",
"Invalid JSON": "JSON inválido", "Invalid JSON": "JSON inválido",
@ -13,5 +13,10 @@
"Sign In": "Iniciar sessão", "Sign In": "Iniciar sessão",
"Create Account": "Criar conta", "Create Account": "Criar conta",
"Explore rooms": "Explorar rooms", "Explore rooms": "Explorar rooms",
"Go to your browser to complete Sign In": "Abra o seu navegador para completar o inicio de sessão" "Go to your browser to complete Sign In": "Abra o seu navegador para completar o inicio de sessão",
"Open": "Abrir",
"Download Completed": "Transferência concluída",
"Unable to load config file: please refresh the page to try again.": "Não foi possível carregar o ficheiro de configuração: atualize a página para tentar novamente.",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "A configuração do Element contém um JSON inválido. Corrija o problema e recarregue a página.",
"Your Element is misconfigured": "O Element está configurado incorretamente"
} }

View file

@ -2,19 +2,19 @@
"Dismiss": "Descartar", "Dismiss": "Descartar",
"powered by Matrix": "oferecido por Matrix", "powered by Matrix": "oferecido por Matrix",
"Unknown device": "Aparelho desconhecido", "Unknown device": "Aparelho desconhecido",
"You need to be using HTTPS to place a screen-sharing call.": "Você precisa estar usando HTTPS para poder iniciar uma chamada com compartilhamento de tela.", "You need to be using HTTPS to place a screen-sharing call.": "Você precisa usar HTTPS para compartilhar a tela durante uma chamada.",
"Welcome to Element": "Seja bem-vinda(o) a Element", "Welcome to Element": "Boas-vindas ao Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo construído com [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo construído com [matrix]",
"Sign In": "Entrar", "Sign In": "Entrar",
"Create Account": "Criar Conta", "Create Account": "Criar Conta",
"Explore rooms": "Explore as salas", "Explore rooms": "Explorar salas",
"The message from the parser is: %(message)s": "A mensagem do parser é: %(message)s", "The message from the parser is: %(message)s": "A mensagem do parser é: %(message)s",
"Invalid JSON": "JSON inválido", "Invalid JSON": "JSON inválido",
"Unexpected error preparing the app. See console for details.": "Erro inesperado preparando o aplicativo. Veja o console para mais detalhes.", "Unexpected error preparing the app. See console for details.": "Erro inesperado preparando o aplicativo. Veja o console para mais detalhes.",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuração inválida: somente se pode especificar um valor entre default_server_config, default_server_name, ou default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuração inválida: você só pode especificar um valor dentre default_server_config, default_server_name, ou default_hs_url.",
"Invalid configuration: no default server specified.": "Configuração inválida: servidor padrão não especificado.", "Invalid configuration: no default server specified.": "Configuração inválida: servidor padrão não especificado.",
"Unable to load config file: please refresh the page to try again.": "Não foi possível carregar o arquivo de configuração: por favor, atualize a página para tentar novamente.", "Unable to load config file: please refresh the page to try again.": "Não foi possível carregar o arquivo de configuração: por favor, atualize a página para tentar novamente.",
"Download Completed": "Download Concluído", "Download Completed": "Download concluído",
"Open user settings": "Abrir configurações do usuário", "Open user settings": "Abrir configurações do usuário",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Unsupported browser": "Navegador não suportado", "Unsupported browser": "Navegador não suportado",
@ -26,11 +26,11 @@
"Missing indexeddb worker script!": "O script indexeddb não foi encontrado!", "Missing indexeddb worker script!": "O script indexeddb não foi encontrado!",
"Open": "Abrir", "Open": "Abrir",
"Previous/next recently visited room or community": "Anterior/Próxima sala ou comunidade visitada recentemente", "Previous/next recently visited room or community": "Anterior/Próxima sala ou comunidade visitada recentemente",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)", "%(brand)s Desktop (%(platformName)s)": "%(brand)s para Computador (%(platformName)s)",
"Go to your browser to complete Sign In": "Vá para o seu navegador para concluir o login", "Go to your browser to complete Sign In": "Vá para o seu navegador para concluir o login",
"Your Element is misconfigured": "Seu Element está desconfigurado", "Your Element is misconfigured": "Seu Element está desconfigurado",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Sua configuração do Element contém JSON inválido. Por favor, corrija o problema e recarregue a página.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Sua configuração do Element contém JSON inválido. Por favor, corrija o problema e recarregue a página.",
"Your browser can't run %(brand)s": "Seu navegador não consegue rodar %(brand)s", "Your browser can't run %(brand)s": "Seu navegador não consegue rodar o %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa funcionalidades avançadas de navegador que não são suportadas pelo seu navegador atual.", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa recursos avançados que não são suportados pelo seu navegador de internet atual.",
"Powered by Matrix": "Construído com tecnologia Matrix" "Powered by Matrix": "Construído com tecnologia Matrix"
} }

View file

@ -29,7 +29,8 @@
"Download Completed": "Preberanie dokončené", "Download Completed": "Preberanie dokončené",
"Open": "Otvoriť", "Open": "Otvoriť",
"Your Element is misconfigured": "Váš Element je nesprávne nastavený", "Your Element is misconfigured": "Váš Element je nesprávne nastavený",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Vaša konfigurácia Elementu obsahuje nesprávne JSON. Prosím, opravte chybu a obnovte stránku.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Vaša konfigurácia Elementu obsahuje nesprávny údaj JSON. Prosím, opravte chybu a obnovte stránku.",
"Your browser can't run %(brand)s": "Váš prehliadač nerozbehne %(brand)s", "Your browser can't run %(brand)s": "Váš prehliadač nerozbehne %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s používa pokročilé funkcie prehliadača, ktoré nie sú podporované vaším aktuálnym prehliadačom." "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s používa pokročilé funkcie prehliadača, ktoré nie sú podporované vaším aktuálnym prehliadačom.",
"Powered by Matrix": "používa protokol Matrix"
} }

View file

@ -7,5 +7,30 @@
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralizirano šifrirano sporočanje &amp; sodelovanje s pomočjo [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralizirano šifrirano sporočanje &amp; sodelovanje s pomočjo [matrix]",
"Sign In": "Prijava", "Sign In": "Prijava",
"Create Account": "Registracija", "Create Account": "Registracija",
"Explore rooms": "Raziščite sobe" "Explore rooms": "Raziščite sobe",
"Missing indexeddb worker script!": "Manjka skript za IndexDB!",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Neveljavna konfiguracija: lahko izberete samo eno izmed default_server_config, default_server_name ali default_hs_url.",
"Invalid configuration: no default server specified.": "Neveljavna konfiguracija: privzeti strežnik ni nastavljen.",
"Your Element is misconfigured": "Vaš Element je napačno nastavljen",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfiguracije vašega Elementa vsebujejo neveljaven JSON. Prosim, popravite napako in znova naložite stran.",
"The message from the parser is: %(message)s": "Sporočilo parserja je: %(message)s",
"Invalid JSON": "Neveljaven JSON",
"Unable to load config file: please refresh the page to try again.": "Ni uspelo naložiti konfiguracijske datoteke: prosim, ponovno naložite stran.",
"Unexpected error preparing the app. See console for details.": "Nepričakovana napaka pri pripravi aplikacije: Za več poglejte konzolo.",
"Download Completed": "Prenos zaključen",
"Open": "Odpri",
"Open user settings": "Odpri uporabniške nastavitve",
"Previous/next recently visited room or community": "Prejšnja/naslednja soba ali skupnost, ki je bila pred kratkim odprta",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s namizje za (%(platformName)s)",
"Go to your browser to complete Sign In": "Nadaljujte s prijavo v spletnem brskalniku",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Powered by Matrix": "Poganja Matrix",
"Unsupported browser": "Nepodprt brskalnik",
"Your browser can't run %(brand)s": "Vaš brskalnik ne more poganjati %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s uporablja napredne lastnosti brskalnika, ki jih vaš trenutni brskalnik ne podpira.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Za najboljšo izkušnjo, prosim namestite <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> ali <safariLink>Safari</safariLink>.",
"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.": "Lahko nadaljujete z uporabo vašega trenutnega brskalnika, vendar lahko to privede do manjkajočih funkcionalnosti ali napačnega izgleda aplikacije.",
"I understand the risks and wish to continue": "Razumem riziko in želim vseeno nadaljevati",
"Go to element.io": "Pojdi na element.io",
"Failed to start": "Neuspel zagon"
} }

View file

@ -4,26 +4,33 @@
"Unknown device": "Okänd enhet", "Unknown device": "Okänd enhet",
"You need to be using HTTPS to place a screen-sharing call.": "Du måste använda HTTPS för att ringa med skärmdelning.", "You need to be using HTTPS to place a screen-sharing call.": "Du måste använda HTTPS för att ringa med skärmdelning.",
"Welcome to Element": "Välkommen till Element", "Welcome to Element": "Välkommen till Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentraliserad, krypterad chatt &amp; samarbetsplattform möjliggjort med [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentraliserad, krypterad chatt &amp; samarbetsplattform baserad på [matrix]",
"Sign In": "Logga in", "Sign In": "Logga in",
"Create Account": "Skapa konto", "Create Account": "Skapa konto",
"Explore rooms": "Utforska rum", "Explore rooms": "Utforska rum",
"The message from the parser is: %(message)s": "Medelandet från parsern är: %(message)s", "The message from the parser is: %(message)s": "Meddelandet från parsern är: %(message)s",
"Invalid JSON": "Ogiltig JSON", "Invalid JSON": "Ogiltig JSON",
"Unexpected error preparing the app. See console for details.": "Oväntat fel vid appstart. Se konsollen för mer information.", "Unexpected error preparing the app. See console for details.": "Oväntat fel vid appstart. Se konsolen för mer information.",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Ogilitiga inställningar: enbart möjligt att specificera en default_config, default_server, eller default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Ogiltiga inställningar: det är enbart möjligt att specificera en default_config, default_server, eller default_hs_url.",
"Invalid configuration: no default server specified.": "Ogilitiga inställningar: ingen standardserver specificerad.", "Invalid configuration: no default server specified.": "Ogiltiga inställningar: ingen standardserver specificerad.",
"Open user settings": "Öppna användarinställningar", "Open user settings": "Öppna användarinställningar",
"Go to your browser to complete Sign In": "Gå till din webbläsare för att slutföra inloggningen", "Go to your browser to complete Sign In": "Gå till din webbläsare för att slutföra inloggningen",
"Missing indexeddb worker script!": "Saknar indexeddb worker skript!", "Missing indexeddb worker script!": "Saknar IndexedDB-workerscript!",
"Unable to load config file: please refresh the page to try again.": "Kan inte ladda konfigurationsfilen: var god ladda om sidan för att försöka igen.", "Unable to load config file: please refresh the page to try again.": "Kan inte ladda konfigurationsfilen: ladda om sidan för att försöka igen.",
"Previous/next recently visited room or community": "Föregående/nästa nyligen besökt rum eller community", "Previous/next recently visited room or community": "Föregående/nästa nyligen besökt rum eller gemenskap",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)", "%(brand)s Desktop (%(platformName)s)": "%(brand)s skrivbord (%(platformName)s)",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Unsupported browser": "Webbläsaren stöds ej", "Unsupported browser": "Webbläsaren stöds ej",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Installera <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, eller <safariLink>Safari</safariLink> för den bästa upplevelsen.", "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Installera <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, eller <safariLink>Safari</safariLink> för den bästa upplevelsen.",
"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.": "Du kan fortsätta använda din nuvarande webbläsare, men vissa eller alla funktioner kanske inte fungerar och uteseendet samt känslan av applikationen kan var felaktig.", "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.": "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.",
"I understand the risks and wish to continue": "Jag förstår riskerna och vill fortsätta", "I understand the risks and wish to continue": "Jag förstår riskerna och vill fortsätta",
"Go to element.io": "Gå till element.io", "Go to element.io": "Gå till element.io",
"Failed to start": "Misslyckade att starta" "Failed to start": "Misslyckade att starta",
"Your Element is misconfigured": "Din Element är felkonfigurerad",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Din Elementkonfiguration innehåller ogiltig JSON. Vänligen rätta till problemet och ladda om sidan.",
"Download Completed": "Nedladdning slutförd",
"Open": "Öppna",
"Powered by Matrix": "Drivs av Matrix",
"Your browser can't run %(brand)s": "Din webbläsare kan inte köra %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s använder avancerade webbläsarfunktioner som inte stöds av din aktuella webbläsare."
} }

14
src/i18n/strings/tzm.json Normal file
View file

@ -0,0 +1,14 @@
{
"Create Account": "Ssenflul amiḍan",
"Download Completed": "Ittusmed wagam",
"Powered by Matrix": "Ittusker s Matrix",
"Sign In": "Kcem",
"Go to your browser to complete Sign In": "Ddu ɣer umessara fad ad tsemded azemmem",
"Welcome to Element": "Azul g Element",
"Go to element.io": "Ddu ɣer element.io",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Unknown device": "Allal arussin",
"Open user settings": "Ṛẓem tisɣal n unessemres",
"Dismiss": "Nexxel",
"Open": "Ṛẓem"
}

View file

@ -8,9 +8,9 @@
"Sign In": "Увійти", "Sign In": "Увійти",
"Create Account": "Створити обліковий запис", "Create Account": "Створити обліковий запис",
"Explore rooms": "Шукати кімнати", "Explore rooms": "Шукати кімнати",
"Unexpected error preparing the app. See console for details.": "Неочікувана помилка при підготовці програми. Дивіться деталі у виводі консолі.", "Unexpected error preparing the app. See console for details.": "Неочікувана помилка при готуванні програми. Дивіться деталі у виводі консолі.",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Невірна конфігурація: можна вказати лише default_server_config, default_server_name або default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Невірна конфігурація: можна вказати лише default_server_config, default_server_name або default_hs_url.",
"Invalid configuration: no default server specified.": "Невірна конфігурація: не вказано сервер за замовчуванням.", "Invalid configuration: no default server specified.": "Невірна конфігурація: не вказано усталений сервер.",
"The message from the parser is: %(message)s": "Аналізатор повідомляє: %(message)s", "The message from the parser is: %(message)s": "Аналізатор повідомляє: %(message)s",
"Invalid JSON": "Хибний JSON", "Invalid JSON": "Хибний JSON",
"Unsupported browser": "Непідтримуваний переглядач", "Unsupported browser": "Непідтримуваний переглядач",
@ -28,7 +28,7 @@
"Open user settings": "Відкрити користувацькі налаштування", "Open user settings": "Відкрити користувацькі налаштування",
"Previous/next recently visited room or community": "Попередня/наступна нещодавно відвідана кімната чи спільнота", "Previous/next recently visited room or community": "Попередня/наступна нещодавно відвідана кімната чи спільнота",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)", "%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)",
"Go to your browser to complete Sign In": "Відкрийте переглядач щоб завершити входження", "Go to your browser to complete Sign In": "Перейдіть у ваш переглядач щоб завершити входження",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Powered by Matrix": "Працює на Matrix", "Powered by Matrix": "Працює на Matrix",
"Your browser can't run %(brand)s": "Ваш переглядач неспроможний запустити %(brand)s", "Your browser can't run %(brand)s": "Ваш переглядач неспроможний запустити %(brand)s",

View file

@ -7,7 +7,7 @@
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "去中心化、加密聊天&amp;与协作,由 [matrix] 驱动", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "去中心化、加密聊天&amp;与协作,由 [matrix] 驱动",
"Sign In": "登入", "Sign In": "登入",
"Create Account": "创建帐号", "Create Account": "创建帐号",
"Explore rooms": "探索房间", "Explore rooms": "探索聊天室",
"The message from the parser is: %(message)s": "语法分析器的信息:%(message)s", "The message from the parser is: %(message)s": "语法分析器的信息:%(message)s",
"Invalid JSON": "无效的 JSON", "Invalid JSON": "无效的 JSON",
"Unexpected error preparing the app. See console for details.": "软件准备时出错,详细信息请查看控制台。", "Unexpected error preparing the app. See console for details.": "软件准备时出错,详细信息请查看控制台。",
@ -32,5 +32,5 @@
"Open": "打开", "Open": "打开",
"Your browser can't run %(brand)s": "浏览器无法运行%(brand)s", "Your browser can't run %(brand)s": "浏览器无法运行%(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "当前浏览器不支持%(brand)s调用的高级浏览器特性。", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "当前浏览器不支持%(brand)s调用的高级浏览器特性。",
"Powered by Matrix": "Powered by Matrix" "Powered by Matrix": "由 Matrix 驱动"
} }

View file

@ -32,5 +32,5 @@
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Element 的配置中包含無效JSON請更正錯誤並重新加載網頁。", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Element 的配置中包含無效JSON請更正錯誤並重新加載網頁。",
"Your browser can't run %(brand)s": "當前瀏覽器無法運行%(brand)s", "Your browser can't run %(brand)s": "當前瀏覽器無法運行%(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "當前瀏覽器不支持%(brand)s使用的高級特性。", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "當前瀏覽器不支持%(brand)s使用的高級特性。",
"Powered by Matrix": "威力本源 Matrix" "Powered by Matrix": "由 Matrix 提供"
} }

View file

@ -26,7 +26,6 @@ window.React = React;
import url from 'url'; import url from 'url';
import * as sdk from 'matrix-react-sdk'; import * as sdk from 'matrix-react-sdk';
import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg'; import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg';
import * as VectorConferenceHandler from 'matrix-react-sdk/src/VectorConferenceHandler';
import {_td, newTranslatableError} from 'matrix-react-sdk/src/languageHandler'; import {_td, newTranslatableError} from 'matrix-react-sdk/src/languageHandler';
import AutoDiscoveryUtils from 'matrix-react-sdk/src/utils/AutoDiscoveryUtils'; import AutoDiscoveryUtils from 'matrix-react-sdk/src/utils/AutoDiscoveryUtils';
import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery"; import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery";
@ -34,7 +33,6 @@ import * as Lifecycle from "matrix-react-sdk/src/Lifecycle";
import type MatrixChatType from "matrix-react-sdk/src/components/structures/MatrixChat"; import type MatrixChatType from "matrix-react-sdk/src/components/structures/MatrixChat";
import {MatrixClientPeg} from 'matrix-react-sdk/src/MatrixClientPeg'; import {MatrixClientPeg} from 'matrix-react-sdk/src/MatrixClientPeg';
import SdkConfig from "matrix-react-sdk/src/SdkConfig"; import SdkConfig from "matrix-react-sdk/src/SdkConfig";
import CallHandler from 'matrix-react-sdk/src/CallHandler';
import {parseQs, parseQsFromFragment} from './url_utils'; import {parseQs, parseQsFromFragment} from './url_utils';
import VectorBasePlatform from "./platform/VectorBasePlatform"; import VectorBasePlatform from "./platform/VectorBasePlatform";
@ -71,11 +69,16 @@ function onHashChange(ev: HashChangeEvent) {
// This will be called whenever the SDK changes screens, // This will be called whenever the SDK changes screens,
// so a web page can update the URL bar appropriately. // so a web page can update the URL bar appropriately.
function onNewScreen(screen: string) { function onNewScreen(screen: string, replaceLast = false) {
console.log("newscreen " + screen); console.log("newscreen " + screen);
const hash = '#/' + screen; const hash = '#/' + screen;
lastLocationHashSet = hash; lastLocationHashSet = hash;
window.location.hash = hash;
if (replaceLast) {
window.location.replace(hash);
} else {
window.location.assign(hash);
}
} }
// We use this to work out what URL the SDK should // We use this to work out what URL the SDK should
@ -136,7 +139,6 @@ export async function loadApp(fragParams: {}) {
throw newTranslatableError(_td("Missing indexeddb worker script!")); throw newTranslatableError(_td("Missing indexeddb worker script!"));
} }
MatrixClientPeg.setIndexedDbWorkerScript(vectorIndexeddbWorkerScript); MatrixClientPeg.setIndexedDbWorkerScript(vectorIndexeddbWorkerScript);
CallHandler.setConferenceHandler(VectorConferenceHandler);
window.addEventListener('hashchange', onHashChange); window.addEventListener('hashchange', onHashChange);
@ -155,7 +157,6 @@ export async function loadApp(fragParams: {}) {
return <MatrixChat return <MatrixChat
onNewScreen={onNewScreen} onNewScreen={onNewScreen}
makeRegistrationUrl={makeRegistrationUrl} makeRegistrationUrl={makeRegistrationUrl}
ConferenceHandler={VectorConferenceHandler}
config={config} config={config}
realQueryParams={params} realQueryParams={params}
startingFragmentQueryParams={fragParams} startingFragmentQueryParams={fragParams}

View file

@ -85,7 +85,7 @@ const supportedBrowser = checkBrowserFeatures();
// try in react but fallback to an `alert` // try in react but fallback to an `alert`
// We start loading stuff but don't block on it until as late as possible to allow // We start loading stuff but don't block on it until as late as possible to allow
// the browser to use as much parallelism as it can. // the browser to use as much parallelism as it can.
// Load parallelism is based on research in https://github.com/vector-im/riot-web/issues/12253 // Load parallelism is based on research in https://github.com/vector-im/element-web/issues/12253
async function start() { async function start() {
// load init.ts async so that its code is not executed immediately and we can catch any exceptions // load init.ts async so that its code is not executed immediately and we can catch any exceptions
const { const {
@ -114,7 +114,7 @@ async function start() {
// don't try to redirect to the native apps if we're // don't try to redirect to the native apps if we're
// verifying a 3pid (but after we've loaded the config) // verifying a 3pid (but after we've loaded the config)
// or if the user is following a deep link // or if the user is following a deep link
// (https://github.com/vector-im/riot-web/issues/7378) // (https://github.com/vector-im/element-web/issues/7378)
const preventRedirect = fragparts.params.client_secret || fragparts.location.length > 0; const preventRedirect = fragparts.params.client_secret || fragparts.location.length > 0;
if (!preventRedirect) { if (!preventRedirect) {

View file

@ -17,6 +17,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore // @ts-ignore
import olmWasmPath from "olm/olm.wasm"; import olmWasmPath from "olm/olm.wasm";
import Olm from 'olm'; import Olm from 'olm';
@ -127,6 +128,7 @@ export async function loadSkin() {
import( import(
/* webpackChunkName: "riot-web-component-index" */ /* webpackChunkName: "riot-web-component-index" */
/* webpackPreload: true */ /* webpackPreload: true */
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore - this module is generated so may fail lint // @ts-ignore - this module is generated so may fail lint
"../component-index"), "../component-index"),
]); ]);

View file

@ -9,9 +9,12 @@
<div id="joinButtonContainer"> <div id="joinButtonContainer">
<div class="joinConferenceFloating"> <div class="joinConferenceFloating">
<div class="joinConferencePrompt"> <div class="joinConferencePrompt">
<span class="icon"><!-- managed by CSS --></span>
<!-- TODO: i18n --> <!-- TODO: i18n -->
<h2>Jitsi Video Conference</h2> <h2>Jitsi Video Conference</h2>
<button type="button" id="joinButton">Join Conference</button> <div id="widgetActionContainer">
<button type="button" id="joinButton">Join Conference</button>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -23,10 +23,19 @@ limitations under the License.
src: url('~matrix-react-sdk/res/fonts/Nunito/Nunito-Regular.ttf') format('truetype'); src: url('~matrix-react-sdk/res/fonts/Nunito/Nunito-Regular.ttf') format('truetype');
} }
$dark-fg: #edf3ff;
$dark-bg: #363c43;
$light-fg: #2e2f32;
$light-bg: #fff;
body { body {
font-family: Nunito, Arial, Helvetica, sans-serif; font-family: Nunito, Arial, Helvetica, sans-serif;
background-color: #181b21; background-color: $dark-bg;
color: #edf3ff; color: $dark-fg;
}
body.theme-light {
background-color: $light-bg;
color: $light-fg;
} }
body, html { body, html {
@ -73,3 +82,26 @@ body, html {
background-color: #03b381; background-color: #03b381;
border: 0; border: 0;
} }
.icon {
$icon-size: 42px;
margin-top: -$icon-size; // to visually center the form
&::before {
content: '';
background-size: contain;
background-color: $dark-fg;
mask-repeat: no-repeat;
mask-position: center;
mask-image: url("~matrix-react-sdk/res/img/element-icons/call/video-call.svg");
mask-size: $icon-size;
display: block;
width: $icon-size;
height: $icon-size;
margin: 0 auto; // center
}
}
body.theme-light .icon::before {
background-color: $light-fg;
}

View file

@ -18,7 +18,16 @@ limitations under the License.
require("./index.scss"); require("./index.scss");
import * as qs from 'querystring'; import * as qs from 'querystring';
import { Capability, WidgetApi } from "matrix-react-sdk/src/widgets/WidgetApi"; import {KJUR} from 'jsrsasign';
import {
IOpenIDCredentials,
IWidgetApiRequest,
VideoConferenceCapabilities,
WidgetApi,
} from "matrix-widget-api";
import { ElementWidgetActions } from "matrix-react-sdk/src/stores/widgets/ElementWidgetActions";
const JITSI_OPENIDTOKEN_JWT_AUTH = 'openidtoken-jwt';
// Dev note: we use raw JS without many dependencies to reduce bundle size. // Dev note: we use raw JS without many dependencies to reduce bundle size.
// We do not need all of React to render a Jitsi conference. // We do not need all of React to render a Jitsi conference.
@ -33,8 +42,12 @@ let conferenceId: string;
let displayName: string; let displayName: string;
let avatarUrl: string; let avatarUrl: string;
let userId: string; let userId: string;
let jitsiAuth: string;
let roomId: string;
let openIdToken: IOpenIDCredentials;
let widgetApi: WidgetApi; let widgetApi: WidgetApi;
let meetApi: any; // JitsiMeetExternalAPI
(async function() { (async function() {
try { try {
@ -54,13 +67,33 @@ let widgetApi: WidgetApi;
// out into a browser. // out into a browser.
const parentUrl = qsParam('parentUrl', true); const parentUrl = qsParam('parentUrl', true);
const widgetId = qsParam('widgetId', true); const widgetId = qsParam('widgetId', true);
const theme = qsParam('theme', true);
if (theme) {
document.body.classList.add(`theme-${theme.replace(" ", "_")}`);
}
// Set this up as early as possible because Element will be hitting it almost immediately. // Set this up as early as possible because Element will be hitting it almost immediately.
let readyPromise: Promise<[void, void]>;
if (parentUrl && widgetId) { if (parentUrl && widgetId) {
widgetApi = new WidgetApi(qsParam('parentUrl'), qsParam('widgetId'), [ const parentOrigin = new URL(qsParam('parentUrl')).origin;
Capability.AlwaysOnScreen, widgetApi = new WidgetApi(qsParam("widgetId"), parentOrigin);
widgetApi.requestCapabilities(VideoConferenceCapabilities);
readyPromise = Promise.all([
new Promise<void>(resolve => {
widgetApi.once(`action:${ElementWidgetActions.ClientReady}`, ev => {
ev.preventDefault();
widgetApi.transport.reply(ev.detail, {});
resolve();
});
}),
new Promise<void>(resolve => {
widgetApi.once("ready", () => resolve());
}),
]); ]);
widgetApi.expectingExplicitReady = true; widgetApi.start();
} else {
console.warn("No parent URL or no widget ID - assuming no widget API is available");
} }
// Populate the Jitsi params now // Populate the Jitsi params now
@ -69,40 +102,112 @@ let widgetApi: WidgetApi;
displayName = qsParam('displayName', true); displayName = qsParam('displayName', true);
avatarUrl = qsParam('avatarUrl', true); // http not mxc avatarUrl = qsParam('avatarUrl', true); // http not mxc
userId = qsParam('userId'); userId = qsParam('userId');
jitsiAuth = qsParam('auth', true);
roomId = qsParam('roomId', true);
if (widgetApi) { if (widgetApi) {
await widgetApi.waitReady(); await readyPromise;
await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen
// See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) {
// Request credentials, give callback to continue when received
openIdToken = await widgetApi.requestOpenIDConnectToken();
console.log("Got OpenID Connect token");
}
// TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795)
widgetApi.on(`action:${ElementWidgetActions.HangupCall}`,
(ev: CustomEvent<IWidgetApiRequest>) => {
if (meetApi) meetApi.executeCommand('hangup');
widgetApi.transport.reply(ev.detail, {}); // ack
},
);
} }
// TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795) enableJoinButton(); // always enable the button
document.getElementById("joinButton").onclick = () => joinConference();
} catch (e) { } catch (e) {
console.error("Error setting up Jitsi widget", e); console.error("Error setting up Jitsi widget", e);
document.getElementById("jitsiContainer").innerText = "Failed to load Jitsi widget"; document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
switchVisibleContainers();
} }
})(); })();
function enableJoinButton() {
document.getElementById("joinButton").onclick = () => joinConference();
}
function switchVisibleContainers() { function switchVisibleContainers() {
inConference = !inConference; inConference = !inConference;
document.getElementById("jitsiContainer").style.visibility = inConference ? 'unset' : 'hidden'; document.getElementById("jitsiContainer").style.visibility = inConference ? 'unset' : 'hidden';
document.getElementById("joinButtonContainer").style.visibility = inConference ? 'hidden' : 'unset'; document.getElementById("joinButtonContainer").style.visibility = inConference ? 'hidden' : 'unset';
} }
/**
* Create a JWT token fot jitsi openidtoken-jwt auth
*
* See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
*/
function createJWTToken() {
// Header
const header = {alg: 'HS256', typ: 'JWT'};
// Payload
const payload = {
// As per Jitsi token auth, `iss` needs to be set to something agreed between
// JWT generating side and Prosody config. Since we have no configuration for
// the widgets, we can't set one anywhere. Using the Jitsi domain here probably makes sense.
iss: jitsiDomain,
sub: jitsiDomain,
aud: `https://${jitsiDomain}`,
room: "*",
context: {
matrix: {
token: openIdToken.access_token,
room_id: roomId,
},
user: {
avatar: avatarUrl,
name: displayName,
},
},
};
// Sign JWT
// The secret string here is irrelevant, we're only using the JWT
// to transport data to Prosody in the Jitsi stack.
return KJUR.jws.JWS.sign(
'HS256',
JSON.stringify(header),
JSON.stringify(payload),
'notused',
);
}
function joinConference() { // event handler bound in HTML function joinConference() { // event handler bound in HTML
let jwt;
if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) {
if (!openIdToken?.access_token) { // eslint-disable-line camelcase
// We've failing to get a token, don't try to init conference
console.warn('Expected to have an OpenID credential, cannot initialize widget.');
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
return;
}
jwt = createJWTToken();
}
switchVisibleContainers(); switchVisibleContainers();
// noinspection JSIgnoredPromiseFromCall if (widgetApi) {
if (widgetApi) widgetApi.setAlwaysOnScreen(true); // ignored promise because we don't care if it works // ignored promise because we don't care if it works
// noinspection JSIgnoredPromiseFromCall
widgetApi.setAlwaysOnScreen(true);
}
console.warn( console.warn(
"[Jitsi Widget] The next few errors about failing to parse URL parameters are fine if " + "[Jitsi Widget] The next few errors about failing to parse URL parameters are fine if " +
"they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " + "they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " +
"our fragment values and not recognizing the options.", "our fragment values and not recognizing the options.",
); );
const meetApi = new JitsiMeetExternalAPI(jitsiDomain, { const options = {
width: "100%", width: "100%",
height: "100%", height: "100%",
parentNode: document.querySelector("#jitsiContainer"), parentNode: document.querySelector("#jitsiContainer"),
@ -113,7 +218,10 @@ function joinConference() { // event handler bound in HTML
MAIN_TOOLBAR_BUTTONS: [], MAIN_TOOLBAR_BUTTONS: [],
VIDEO_LAYOUT_FIT: "height", VIDEO_LAYOUT_FIT: "height",
}, },
}); jwt: jwt,
};
meetApi = new JitsiMeetExternalAPI(jitsiDomain, options);
if (displayName) meetApi.executeCommand("displayName", displayName); if (displayName) meetApi.executeCommand("displayName", displayName);
if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl); if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl);
if (userId) meetApi.executeCommand("email", userId); if (userId) meetApi.executeCommand("email", userId);
@ -121,9 +229,13 @@ function joinConference() { // event handler bound in HTML
meetApi.on("readyToClose", () => { meetApi.on("readyToClose", () => {
switchVisibleContainers(); switchVisibleContainers();
// noinspection JSIgnoredPromiseFromCall if (widgetApi) {
if (widgetApi) widgetApi.setAlwaysOnScreen(false); // ignored promise because we don't care if it works // ignored promise because we don't care if it works
// noinspection JSIgnoredPromiseFromCall
widgetApi.setAlwaysOnScreen(false);
}
document.getElementById("jitsiContainer").innerHTML = ""; document.getElementById("jitsiContainer").innerHTML = "";
meetApi = null;
}); });
} }

View file

@ -260,7 +260,7 @@ body {
</g> </g>
</g> </g>
</svg> </svg>
<a href="https://f-droid.org/repository/browse/?fdid=im.vector.alpha" target="_blank" class="mx_ClearDecoration"> <a href="https://f-droid.org/repository/browse/?fdid=im.vector.app" target="_blank" class="mx_ClearDecoration">
<svg width="164px" height="48px" viewBox="0 0 157 46" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <svg width="164px" height="48px" viewBox="0 0 157 46" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<desc>Get it on F-Droid.</desc> <desc>Get it on F-Droid.</desc>
<defs> <defs>

View file

@ -27,7 +27,7 @@ import BaseEventIndexManager, {
MatrixEvent, MatrixEvent,
MatrixProfile, MatrixProfile,
SearchArgs, SearchArgs,
SearchResult SearchResult,
} from 'matrix-react-sdk/src/indexing/BaseEventIndexManager'; } from 'matrix-react-sdk/src/indexing/BaseEventIndexManager';
import dis from 'matrix-react-sdk/src/dispatcher/dispatcher'; import dis from 'matrix-react-sdk/src/dispatcher/dispatcher';
import {_t, _td} from 'matrix-react-sdk/src/languageHandler'; import {_t, _td} from 'matrix-react-sdk/src/languageHandler';
@ -99,7 +99,7 @@ interface IPCPayload {
class SeshatIndexManager extends BaseEventIndexManager { class SeshatIndexManager extends BaseEventIndexManager {
private pendingIpcCalls: Record<number, { resolve, reject }> = {}; private pendingIpcCalls: Record<number, { resolve, reject }> = {};
private nextIpcCallId: number = 0; private nextIpcCallId = 0;
constructor() { constructor() {
super(); super();
@ -140,8 +140,8 @@ class SeshatIndexManager extends BaseEventIndexManager {
return this._ipcCall('supportsEventIndexing'); return this._ipcCall('supportsEventIndexing');
} }
async initEventIndex(): Promise<void> { async initEventIndex(userId: string, deviceId: string): Promise<void> {
return this._ipcCall('initEventIndex'); return this._ipcCall('initEventIndex', userId, deviceId);
} }
async addEventToIndex(ev: MatrixEvent, profile: MatrixProfile): Promise<void> { async addEventToIndex(ev: MatrixEvent, profile: MatrixProfile): Promise<void> {
@ -216,7 +216,7 @@ class SeshatIndexManager extends BaseEventIndexManager {
export default class ElectronPlatform extends VectorBasePlatform { export default class ElectronPlatform extends VectorBasePlatform {
private eventIndexManager: BaseEventIndexManager = new SeshatIndexManager(); private eventIndexManager: BaseEventIndexManager = new SeshatIndexManager();
private pendingIpcCalls: Record<number, { resolve, reject }> = {}; private pendingIpcCalls: Record<number, { resolve, reject }> = {};
private nextIpcCallId: number = 0; private nextIpcCallId = 0;
// this is the opaque token we pass to the HS which when we get it in our callback we can resolve to a profile // this is the opaque token we pass to the HS which when we get it in our callback we can resolve to a profile
private ssoID: string = randomString(32); private ssoID: string = randomString(32);
@ -374,10 +374,6 @@ export default class ElectronPlatform extends VectorBasePlatform {
ipcRenderer.send('loudNotification'); ipcRenderer.send('loudNotification');
} }
clearNotification(notif: Notification) {
notif.close();
}
async getAppVersion(): Promise<string> { async getAppVersion(): Promise<string> {
return this._ipcCall('getAppVersion'); return this._ipcCall('getAppVersion');
} }

View file

@ -51,12 +51,18 @@ export function initRageshake() {
} }
window.mxSendRageshake = function(text: string, withLogs?: boolean) { window.mxSendRageshake = function(text: string, withLogs?: boolean) {
const url = SdkConfig.get().bug_report_endpoint_url;
if (!url) {
console.error("Cannot send a rageshake - no bug_report_endpoint_url configured");
return;
}
if (withLogs === undefined) withLogs = true; if (withLogs === undefined) withLogs = true;
if (!text || !text.trim()) { if (!text || !text.trim()) {
console.error("Cannot send a rageshake without a message - please tell us what went wrong"); console.error("Cannot send a rageshake without a message - please tell us what went wrong");
return; return;
} }
sendBugReport(SdkConfig.get().bug_report_endpoint_url, { sendBugReport(url, {
userText: text, userText: text,
sendLogs: withLogs, sendLogs: withLogs,
progressCallback: console.log.bind(console), progressCallback: console.log.bind(console),

View file

@ -339,7 +339,7 @@
</g> </g>
</svg> </svg>
</a> </a>
<a href="https://f-droid.org/repository/browse/?fdid=im.vector.alpha" target="_blank" <a href="https://f-droid.org/repository/browse/?fdid=im.vector.app" target="_blank"
class="mx_ClearDecoration"> class="mx_ClearDecoration">
<svg width="164px" height="48px" viewBox="0 0 157 46" version="1.1" <svg width="164px" height="48px" viewBox="0 0 157 46" version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

View file

@ -16,6 +16,11 @@
"node", "node",
"react", "react",
"flux" "flux"
],
"lib": [
"es2019",
"dom",
"dom.iterable"
] ]
}, },
"include": [ "include": [

2063
yarn.lock

File diff suppressed because it is too large Load diff