mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-16 05:04:57 +08:00
Merge branch 'develop' into bwindels/bacat-scrolling
This commit is contained in:
commit
494779393f
66
.buildkite/pipeline.yaml
Normal file
66
.buildkite/pipeline.yaml
Normal file
@ -0,0 +1,66 @@
|
||||
steps:
|
||||
- label: ":eslint: Lint"
|
||||
command:
|
||||
- "yarn install"
|
||||
- "yarn lintwithexclusions"
|
||||
plugins:
|
||||
- docker#v3.0.1:
|
||||
image: "node:10"
|
||||
|
||||
# - label: ":chains: End-to-End Tests"
|
||||
# command:
|
||||
# # TODO: Remove hacky chmod for BuildKite
|
||||
# - "chmod +x ./scripts/ci/*.sh"
|
||||
# - "chmod +x ./scripts/*"
|
||||
# - "sudo apt-get install build-essential python2.7-dev libffi-dev python-pip python-setuptools sqlite3 libssl-dev python-virtualenv libjpeg-dev libxslt1-dev"
|
||||
# - "./scripts/ci/install-deps.sh"
|
||||
# - "./scripts/ci/end-to-end-tests.sh"
|
||||
# plugins:
|
||||
# - docker#v3.0.1:
|
||||
# image: "node:10"
|
||||
|
||||
- label: ":karma: Tests"
|
||||
command:
|
||||
# Install chrome
|
||||
- "echo '--- Installing Chrome'"
|
||||
- "wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -"
|
||||
- "sh -c 'echo \"deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main\" >> /etc/apt/sources.list.d/google.list'"
|
||||
- "apt-get update"
|
||||
- "apt-get install -y google-chrome-stable"
|
||||
# Run tests
|
||||
# TODO: Remove hacky chmod for BuildKite
|
||||
- "chmod +x ./scripts/ci/*.sh"
|
||||
- "chmod +x ./scripts/*"
|
||||
- "echo '--- Installing Dependencies'"
|
||||
- "./scripts/ci/install-deps.sh"
|
||||
- "echo '+++ Running Tests'"
|
||||
- "./scripts/ci/unit-tests.sh"
|
||||
env:
|
||||
CHROME_BIN: "/usr/bin/google-chrome-stable"
|
||||
plugins:
|
||||
- docker#v3.0.1:
|
||||
image: "node:10"
|
||||
propagate-environment: true
|
||||
|
||||
- label: "🔧 Riot Tests"
|
||||
command:
|
||||
# Install chrome
|
||||
- "echo '--- Installing Chrome'"
|
||||
- "wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -"
|
||||
- "sh -c 'echo \"deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main\" >> /etc/apt/sources.list.d/google.list'"
|
||||
- "apt-get update"
|
||||
- "apt-get install -y google-chrome-stable"
|
||||
# Run tests
|
||||
# TODO: Remove hacky chmod for BuildKite
|
||||
- "chmod +x ./scripts/ci/*.sh"
|
||||
- "chmod +x ./scripts/*"
|
||||
- "echo '--- Installing Dependencies'"
|
||||
- "./scripts/ci/install-deps.sh"
|
||||
- "echo '+++ Running Tests'"
|
||||
- "./scripts/ci/riot-unit-tests.sh"
|
||||
env:
|
||||
CHROME_BIN: "/usr/bin/google-chrome-stable"
|
||||
plugins:
|
||||
- docker#v3.0.1:
|
||||
image: "node:10"
|
||||
propagate-environment: true
|
38
.travis.yml
38
.travis.yml
@ -1,38 +0,0 @@
|
||||
# we need trusty for the chrome addon
|
||||
dist: trusty
|
||||
|
||||
# we don't need sudo, so can run in a container, which makes startup much
|
||||
# quicker.
|
||||
#
|
||||
# unfortunately we do temporarily require sudo as a workaround for
|
||||
# https://github.com/travis-ci/travis-ci/issues/8836
|
||||
sudo: required
|
||||
|
||||
language: node_js
|
||||
node_js:
|
||||
- node # Latest stable version of nodejs.
|
||||
addons:
|
||||
chrome: stable
|
||||
before_install:
|
||||
- curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0
|
||||
- export PATH=$HOME/.yarn/bin:$PATH
|
||||
install:
|
||||
- ./scripts/travis/install-deps.sh
|
||||
matrix:
|
||||
include:
|
||||
- name: Linting Checks
|
||||
script:
|
||||
# run the linter, but exclude any files known to have errors or warnings.
|
||||
- yarn lintwithexclusions
|
||||
# - name: End-to-End Tests
|
||||
# if: branch = develop
|
||||
# install:
|
||||
# - sudo apt-get install build-essential python2.7-dev libffi-dev python-pip python-setuptools sqlite3 libssl-dev python-virtualenv libjpeg-dev libxslt1-dev
|
||||
# script:
|
||||
# - ./scripts/travis/end-to-end-tests.sh
|
||||
- name: Unit Tests
|
||||
script:
|
||||
- ./scripts/travis/unit-tests.sh
|
||||
- name: Riot-web Unit Tests
|
||||
script:
|
||||
- ./scripts/travis/riot-unit-tests.sh
|
122
CHANGELOG.md
122
CHANGELOG.md
@ -1,3 +1,125 @@
|
||||
Changes in [1.0.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.0.5) (2019-03-21)
|
||||
===================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.0.4...v1.0.5)
|
||||
|
||||
* Hotfix: disable typing notifs jumping prevention for now
|
||||
[\#2811](https://github.com/matrix-org/matrix-react-sdk/pull/2811)
|
||||
|
||||
Changes in [1.0.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.0.4) (2019-03-18)
|
||||
===================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.0.4-rc.1...v1.0.4)
|
||||
|
||||
* No changes since rc.1
|
||||
|
||||
Changes in [1.0.4-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.0.4-rc.1) (2019-03-13)
|
||||
=============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.0.3...v1.0.4-rc.1)
|
||||
|
||||
* Update from Weblate
|
||||
[\#2785](https://github.com/matrix-org/matrix-react-sdk/pull/2785)
|
||||
* Remove padlock click handler to show unknown devices
|
||||
[\#2784](https://github.com/matrix-org/matrix-react-sdk/pull/2784)
|
||||
* Use modern Yarn version on Travis CI
|
||||
[\#2783](https://github.com/matrix-org/matrix-react-sdk/pull/2783)
|
||||
* Add versioning to integration manager API /register and /account calls
|
||||
[\#2782](https://github.com/matrix-org/matrix-react-sdk/pull/2782)
|
||||
* Ensure scalar_token is valid before opening integrations manager
|
||||
[\#2777](https://github.com/matrix-org/matrix-react-sdk/pull/2777)
|
||||
* Switch to `yarn` for dependency management
|
||||
[\#2773](https://github.com/matrix-org/matrix-react-sdk/pull/2773)
|
||||
* Use a distinct color for selected autocomplete items
|
||||
[\#2778](https://github.com/matrix-org/matrix-react-sdk/pull/2778)
|
||||
* Provide an escape from the registration process
|
||||
[\#2775](https://github.com/matrix-org/matrix-react-sdk/pull/2775)
|
||||
* Fix instantly sending RRs
|
||||
[\#2770](https://github.com/matrix-org/matrix-react-sdk/pull/2770)
|
||||
* Fix simple header counters to correctly handle zero, take two
|
||||
[\#2776](https://github.com/matrix-org/matrix-react-sdk/pull/2776)
|
||||
* Fix sticky hover state by listening for hover on the document
|
||||
[\#2764](https://github.com/matrix-org/matrix-react-sdk/pull/2764)
|
||||
* Fix header counters to correctly handle zero
|
||||
[\#2772](https://github.com/matrix-org/matrix-react-sdk/pull/2772)
|
||||
* Pass correct args when creating event permalink in context menu
|
||||
[\#2774](https://github.com/matrix-org/matrix-react-sdk/pull/2774)
|
||||
* Update from Weblate
|
||||
[\#2771](https://github.com/matrix-org/matrix-react-sdk/pull/2771)
|
||||
* Scroll investigation changes
|
||||
[\#2766](https://github.com/matrix-org/matrix-react-sdk/pull/2766)
|
||||
* Ability to bulk accept all invites (and fix rejecting all invites)
|
||||
[\#2757](https://github.com/matrix-org/matrix-react-sdk/pull/2757)
|
||||
* Don't trample over existing sessions when verifying email addresses
|
||||
[\#2768](https://github.com/matrix-org/matrix-react-sdk/pull/2768)
|
||||
* Misc fixes to StatusMessageContextMenu
|
||||
[\#2767](https://github.com/matrix-org/matrix-react-sdk/pull/2767)
|
||||
* Fix erroneously sending RRs, pt1.
|
||||
[\#2769](https://github.com/matrix-org/matrix-react-sdk/pull/2769)
|
||||
* Tweak country dropdown for redesign
|
||||
[\#2765](https://github.com/matrix-org/matrix-react-sdk/pull/2765)
|
||||
* Prevent space characters from stopping big emoji messages
|
||||
[\#2745](https://github.com/matrix-org/matrix-react-sdk/pull/2745)
|
||||
* Tweak auth components when dark theme is default
|
||||
[\#2763](https://github.com/matrix-org/matrix-react-sdk/pull/2763)
|
||||
* Move country dropdown inside field in Settings
|
||||
[\#2756](https://github.com/matrix-org/matrix-react-sdk/pull/2756)
|
||||
* npm audit fix --force
|
||||
[\#2758](https://github.com/matrix-org/matrix-react-sdk/pull/2758)
|
||||
* Use Field component in auth flows
|
||||
[\#2749](https://github.com/matrix-org/matrix-react-sdk/pull/2749)
|
||||
* Add /shrug command
|
||||
[\#2660](https://github.com/matrix-org/matrix-react-sdk/pull/2660)
|
||||
* Support linking to hosting providers
|
||||
[\#2748](https://github.com/matrix-org/matrix-react-sdk/pull/2748)
|
||||
* Get confirmation before enabling encryption
|
||||
[\#2728](https://github.com/matrix-org/matrix-react-sdk/pull/2728)
|
||||
* clear min-height for typing notifs when the timeline viewport changes size
|
||||
[\#2747](https://github.com/matrix-org/matrix-react-sdk/pull/2747)
|
||||
* Prevent flair pushing timeline downwards
|
||||
[\#2746](https://github.com/matrix-org/matrix-react-sdk/pull/2746)
|
||||
* Include tag name when warning about rooms running off lists
|
||||
[\#2741](https://github.com/matrix-org/matrix-react-sdk/pull/2741)
|
||||
* Reorganise props handling in Field
|
||||
[\#2740](https://github.com/matrix-org/matrix-react-sdk/pull/2740)
|
||||
* Limit Field label to size of input
|
||||
[\#2742](https://github.com/matrix-org/matrix-react-sdk/pull/2742)
|
||||
* Don't loop forever if you demote yourself via Enter on a PowerSelector
|
||||
[\#2743](https://github.com/matrix-org/matrix-react-sdk/pull/2743)
|
||||
* Check if users are already in the room before inviting them
|
||||
[\#2734](https://github.com/matrix-org/matrix-react-sdk/pull/2734)
|
||||
* Don't duplicate direct chats from other tags
|
||||
[\#2735](https://github.com/matrix-org/matrix-react-sdk/pull/2735)
|
||||
* Fix media device selectors not updating
|
||||
[\#2739](https://github.com/matrix-org/matrix-react-sdk/pull/2739)
|
||||
* Fix Room Directory custom homeserver entry not showing properly
|
||||
[\#2708](https://github.com/matrix-org/matrix-react-sdk/pull/2708)
|
||||
* Add missing permalinkCreator prop
|
||||
[\#2729](https://github.com/matrix-org/matrix-react-sdk/pull/2729)
|
||||
* Patch users not existing when opening settings
|
||||
[\#2738](https://github.com/matrix-org/matrix-react-sdk/pull/2738)
|
||||
* Use a mask for the continuation icon
|
||||
[\#2737](https://github.com/matrix-org/matrix-react-sdk/pull/2737)
|
||||
* Always insert rooms into lists when they get lost
|
||||
[\#2736](https://github.com/matrix-org/matrix-react-sdk/pull/2736)
|
||||
* Convert objects and such to usable strings in rageshake
|
||||
[\#2732](https://github.com/matrix-org/matrix-react-sdk/pull/2732)
|
||||
* Support stacking dialogs to prevent unmounting
|
||||
[\#2724](https://github.com/matrix-org/matrix-react-sdk/pull/2724)
|
||||
* Convert PowerSelector to use mxField instead
|
||||
[\#2725](https://github.com/matrix-org/matrix-react-sdk/pull/2725)
|
||||
* Don't re-enable the save button after saving profiles
|
||||
[\#2726](https://github.com/matrix-org/matrix-react-sdk/pull/2726)
|
||||
* Support multiple email pushers and remove the legacy UserSettingsStore
|
||||
[\#2727](https://github.com/matrix-org/matrix-react-sdk/pull/2727)
|
||||
* Bring back #528 fix as it still seems broken on OSX
|
||||
[\#2731](https://github.com/matrix-org/matrix-react-sdk/pull/2731)
|
||||
* Fix margin on e2e icon in member panel
|
||||
[\#2721](https://github.com/matrix-org/matrix-react-sdk/pull/2721)
|
||||
* Improved scrolling & pagination
|
||||
[\#2676](https://github.com/matrix-org/matrix-react-sdk/pull/2676)
|
||||
* Nudge karma to 3.1.2
|
||||
[\#2719](https://github.com/matrix-org/matrix-react-sdk/pull/2719)
|
||||
* Stop listening to account data when the stickerpicker is unmounted
|
||||
[\#2723](https://github.com/matrix-org/matrix-react-sdk/pull/2723)
|
||||
|
||||
Changes in [1.0.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.0.3) (2019-03-06)
|
||||
===================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.0.2...v1.0.3)
|
||||
|
@ -25,7 +25,6 @@ Developer Guide
|
||||
|
||||
Platform Targets:
|
||||
* Chrome, Firefox and Safari.
|
||||
* Edge should also work, but we're not testing it proactively.
|
||||
* WebRTC features (VoIP and Video calling) are only available in Chrome & Firefox.
|
||||
* Mobile Web is not currently a target platform - instead please use the native
|
||||
iOS (https://github.com/matrix-org/matrix-ios-kit) and Android
|
||||
|
@ -135,9 +135,10 @@ module.exports = function (config) {
|
||||
],
|
||||
|
||||
customLaunchers: {
|
||||
'ChromeHeadless': {
|
||||
'VectorChromeHeadless': {
|
||||
base: 'Chrome',
|
||||
flags: [
|
||||
'--no-sandbox',
|
||||
// See https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
|
||||
'--headless',
|
||||
'--disable-gpu',
|
||||
|
10
package.json
10
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "matrix-react-sdk",
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.5",
|
||||
"description": "SDK for matrix.org using React",
|
||||
"author": "matrix.org",
|
||||
"repository": {
|
||||
@ -51,7 +51,7 @@
|
||||
"lintwithexclusions": "eslint --max-warnings 0 --ignore-path .eslintignore.errorfiles src test",
|
||||
"clean": "rimraf lib",
|
||||
"prepare": "yarn clean && yarn build && git rev-parse HEAD > git-revision.txt",
|
||||
"test": "karma start --single-run=true --browsers ChromeHeadless",
|
||||
"test": "karma start --single-run=true --browsers VectorChromeHeadless",
|
||||
"test-multi": "karma start"
|
||||
},
|
||||
"dependencies": {
|
||||
@ -79,7 +79,7 @@
|
||||
"linkifyjs": "^2.1.6",
|
||||
"lodash": "^4.13.1",
|
||||
"lolex": "2.3.2",
|
||||
"matrix-js-sdk": "1.0.1",
|
||||
"matrix-js-sdk": "1.0.2",
|
||||
"optimist": "^0.6.1",
|
||||
"pako": "^1.0.5",
|
||||
"prop-types": "^15.5.8",
|
||||
@ -99,7 +99,7 @@
|
||||
"slate-react": "^0.18.10",
|
||||
"text-encoding-utf-8": "^1.0.1",
|
||||
"url": "^0.11.0",
|
||||
"velocity-vector": "github:vector-im/velocity#059e3b2",
|
||||
"velocity-animate": "^1.5.2",
|
||||
"whatwg-fetch": "^1.1.1",
|
||||
"zxcvbn": "^4.4.2"
|
||||
},
|
||||
@ -131,7 +131,7 @@
|
||||
"flow-parser": "^0.57.3",
|
||||
"jest-mock": "^23.2.0",
|
||||
"karma": "^4.0.1",
|
||||
"karma-chrome-launcher": "^0.2.3",
|
||||
"karma-chrome-launcher": "^2.2.0",
|
||||
"karma-cli": "^1.0.1",
|
||||
"karma-junit-reporter": "^2.0.0",
|
||||
"karma-logcapture-reporter": "0.0.1",
|
||||
|
@ -16,6 +16,16 @@ limitations under the License.
|
||||
|
||||
.mx_BaseAvatar {
|
||||
position: relative;
|
||||
// In at least Firefox, the case of relative positioned inline elements
|
||||
// (such as mx_BaseAvatar) with absolute positioned children (such as
|
||||
// mx_BaseAvatar_initial) is a dark corner full of spider webs. It will give
|
||||
// different results during full reflow of the page vs. incremental reflow
|
||||
// of small portions. While that's surely a browser bug, we can avoid it by
|
||||
// using `inline-block` instead of the default `inline`.
|
||||
// https://github.com/vector-im/riot-web/issues/5594
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1535053
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=255139
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.mx_BaseAvatar_initial {
|
||||
|
@ -22,10 +22,20 @@ limitations under the License.
|
||||
}
|
||||
|
||||
.mx_EntityTile:hover {
|
||||
background-image: url('$(res)/img/member_chevron.png');
|
||||
background-position: center right 10px;
|
||||
background-repeat: no-repeat;
|
||||
padding-right: 30px;
|
||||
position: relative; // to keep the chevron aligned
|
||||
}
|
||||
|
||||
.mx_EntityTile:hover::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: calc(50% - 8px); // center
|
||||
right: 10px;
|
||||
mask: url('$(res)/img/member_chevron.png');
|
||||
mask-repeat: no-repeat;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-color: $rightpanel-button-color;
|
||||
}
|
||||
|
||||
.mx_EntityTile .mx_PresenceLabel {
|
||||
@ -92,19 +102,19 @@ limitations under the License.
|
||||
.mx_EntityTile_unavailable .mx_EntityTile_avatar,
|
||||
.mx_EntityTile_unavailable .mx_EntityTile_name,
|
||||
.mx_EntityTile_offline_beenactive .mx_EntityTile_avatar,
|
||||
.mx_EntityTile_offline_beenactive .mx_EntityTile_name,
|
||||
.mx_EntityTile_offline_beenactive .mx_EntityTile_name
|
||||
{
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.mx_EntityTile_offline_neveractive .mx_EntityTile_avatar,
|
||||
.mx_EntityTile_offline_neveractive .mx_EntityTile_name,
|
||||
.mx_EntityTile_offline_neveractive .mx_EntityTile_name
|
||||
{
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
.mx_EntityTile_unknown .mx_EntityTile_avatar,
|
||||
.mx_EntityTile_unknown .mx_EntityTile_name,
|
||||
.mx_EntityTile_unknown .mx_EntityTile_name
|
||||
{
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ limitations under the License.
|
||||
|
||||
.mx_RoomUpgradeWarningBar {
|
||||
text-align: center;
|
||||
height: 176px;
|
||||
height: 235px;
|
||||
background-color: $event-selected-color;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
|
@ -14,6 +14,10 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
.mx_SettingsTab_warningText {
|
||||
color: $warning-color;
|
||||
}
|
||||
|
||||
.mx_SettingsTab_heading {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
|
2
scripts/travis/build.sh → scripts/ci/build.sh
Executable file → Normal file
2
scripts/travis/build.sh → scripts/ci/build.sh
Executable file → Normal file
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# script which is run by the travis build (after `yarn test`).
|
||||
# script which is run by the CI build (after `yarn test`).
|
||||
#
|
||||
# clones riot-web develop and runs the tests against our version of react-sdk.
|
||||
|
4
scripts/travis/end-to-end-tests.sh → scripts/ci/end-to-end-tests.sh
Executable file → Normal file
4
scripts/travis/end-to-end-tests.sh → scripts/ci/end-to-end-tests.sh
Executable file → Normal file
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# script which is run by the travis build (after `yarn test`).
|
||||
# script which is run by the CI build (after `yarn test`).
|
||||
#
|
||||
# clones riot-web develop and runs the tests against our version of react-sdk.
|
||||
|
||||
@ -9,7 +9,7 @@ set -ev
|
||||
RIOT_WEB_DIR=riot-web
|
||||
REACT_SDK_DIR=`pwd`
|
||||
|
||||
scripts/travis/build.sh
|
||||
scripts/ci/build.sh
|
||||
# run end to end tests
|
||||
scripts/fetchdep.sh matrix-org matrix-react-end-to-end-tests master
|
||||
pushd matrix-react-end-to-end-tests
|
0
scripts/travis/install-deps.sh → scripts/ci/install-deps.sh
Executable file → Normal file
0
scripts/travis/install-deps.sh → scripts/ci/install-deps.sh
Executable file → Normal file
4
scripts/travis/riot-unit-tests.sh → scripts/ci/riot-unit-tests.sh
Executable file → Normal file
4
scripts/travis/riot-unit-tests.sh → scripts/ci/riot-unit-tests.sh
Executable file → Normal file
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# script which is run by the travis build (after `yarn test`).
|
||||
# script which is run by the CI build (after `yarn test`).
|
||||
#
|
||||
# clones riot-web develop and runs the tests against our version of react-sdk.
|
||||
|
||||
@ -8,7 +8,7 @@ set -ev
|
||||
|
||||
RIOT_WEB_DIR=riot-web
|
||||
|
||||
scripts/travis/build.sh
|
||||
scripts/ci/build.sh
|
||||
pushd "$RIOT_WEB_DIR"
|
||||
yarn test
|
||||
popd
|
10
scripts/ci/unit-tests.sh
Normal file
10
scripts/ci/unit-tests.sh
Normal file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# script which is run by the CI build (after `yarn test`).
|
||||
#
|
||||
# clones riot-web develop and runs the tests against our version of react-sdk.
|
||||
|
||||
set -ev
|
||||
|
||||
scripts/ci/build.sh
|
||||
yarn test
|
@ -1,27 +1,40 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
org="$1"
|
||||
repo="$2"
|
||||
set -x
|
||||
|
||||
deforg="$1"
|
||||
defrepo="$2"
|
||||
defbranch="$3"
|
||||
|
||||
[ -z "$defbranch" ] && defbranch="develop"
|
||||
|
||||
rm -r "$repo" || true
|
||||
rm -r "$defrepo" || true
|
||||
|
||||
clone() {
|
||||
branch=$1
|
||||
org=$1
|
||||
repo=$2
|
||||
branch=$3
|
||||
if [ -n "$branch" ]
|
||||
then
|
||||
echo "Trying to use the branch $branch"
|
||||
git clone https://github.com/$org/$repo.git $repo --branch "$branch" && exit 0
|
||||
echo "Trying to use $org/$repo#$branch"
|
||||
git clone git://github.com/$org/$repo.git $repo --branch "$branch" && exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Try the PR author's branch in case it exists on the deps as well.
|
||||
clone $TRAVIS_PULL_REQUEST_BRANCH
|
||||
# If BUILDKITE_BRANCH is set, it will contain either:
|
||||
# * "branch" when the author's branch and target branch are in the same repo
|
||||
# * "author:branch" when the author's branch is in their fork
|
||||
# We can split on `:` into an array to check.
|
||||
BUILDKITE_BRANCH_ARRAY=(${BUILDKITE_BRANCH//:/ })
|
||||
if [[ "${#BUILDKITE_BRANCH_ARRAY[@]}" == "1" ]]; then
|
||||
clone $deforg $defrepo $BUILDKITE_BRANCH
|
||||
elif [[ "${#BUILDKITE_BRANCH_ARRAY[@]}" == "2" ]]; then
|
||||
clone ${BUILDKITE_BRANCH_ARRAY[0]} $defrepo ${BUILDKITE_BRANCH_ARRAY[1]}
|
||||
fi
|
||||
# Try the target branch of the push or PR.
|
||||
clone $TRAVIS_BRANCH
|
||||
clone $deforg $defrepo $BUILDKITE_PULL_REQUEST_BASE_BRANCH
|
||||
# Try the current branch from Jenkins.
|
||||
clone `"echo $GIT_BRANCH" | sed -e 's/^origin\///'`
|
||||
clone $deforg $defrepo `"echo $GIT_BRANCH" | sed -e 's/^origin\///'`
|
||||
# Use the default branch as the last resort.
|
||||
clone $defbranch
|
||||
clone $deforg $defrepo $defbranch
|
||||
|
@ -1,10 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# script which is run by the travis build (after `yarn test`).
|
||||
#
|
||||
# clones riot-web develop and runs the tests against our version of react-sdk.
|
||||
|
||||
set -ev
|
||||
|
||||
scripts/travis/build.sh
|
||||
CHROME_BIN='/usr/bin/google-chrome-stable' yarn test
|
@ -28,6 +28,7 @@ import {MATRIXTO_URL_PATTERN} from "./linkify-matrix";
|
||||
import * as querystring from "querystring";
|
||||
import MultiInviter from './utils/MultiInviter';
|
||||
import { linkifyAndSanitizeHtml } from './HtmlUtils';
|
||||
import QuestionDialog from "./components/views/dialogs/QuestionDialog";
|
||||
|
||||
class Command {
|
||||
constructor({name, args='', description, runFn, hideCompletionAfterSpace=false}) {
|
||||
@ -105,7 +106,72 @@ export const CommandMap = {
|
||||
description: _td('Upgrades a room to a new version'),
|
||||
runFn: function(roomId, args) {
|
||||
if (args) {
|
||||
return success(MatrixClientPeg.get().upgradeRoom(roomId, args));
|
||||
const room = MatrixClientPeg.get().getRoom(roomId);
|
||||
Modal.createTrackedDialog('Slash Commands', 'upgrade room confirmation',
|
||||
QuestionDialog, {
|
||||
title: _t('Room upgrade confirmation'),
|
||||
description: (
|
||||
<div>
|
||||
<p>{_t("Upgrading a room can be destructive and isn't always necessary.")}</p>
|
||||
<p>
|
||||
{_t(
|
||||
"Room upgrades are usually recommended when a room version is considered " +
|
||||
"<i>unstable</i>. Unstable room versions might have bugs, missing features, or " +
|
||||
"security vulnerabilities.",
|
||||
{}, {
|
||||
"i": (sub) => <i>{sub}</i>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{_t(
|
||||
"Room upgrades usually only affect <i>server-side</i> processing of the " +
|
||||
"room. If you're having problems with your Riot client, please file an issue " +
|
||||
"with <issueLink />.",
|
||||
{}, {
|
||||
"i": (sub) => <i>{sub}</i>,
|
||||
"issueLink": () => {
|
||||
return <a href="https://github.com/vector-im/riot-web/issues/new/choose"
|
||||
target="_blank" rel="noopener">
|
||||
https://github.com/vector-im/riot-web/issues/new/choose
|
||||
</a>;
|
||||
},
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{_t(
|
||||
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room " +
|
||||
"members to the new version of the room.</i> We'll post a link to the new room " +
|
||||
"in the old version of the room - room members will have to click this link to " +
|
||||
"join the new room.",
|
||||
{}, {
|
||||
"b": (sub) => <b>{sub}</b>,
|
||||
"i": (sub) => <i>{sub}</i>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{_t(
|
||||
"Please confirm that you'd like to go forward with upgrading this room " +
|
||||
"from <oldVersion /> to <newVersion />",
|
||||
{},
|
||||
{
|
||||
oldVersion: () => <code>{room ? room.getVersion() : "1"}</code>,
|
||||
newVersion: () => <code>{args}</code>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
),
|
||||
button: _t("Upgrade"),
|
||||
onFinished: (confirm) => {
|
||||
if (!confirm) return;
|
||||
|
||||
MatrixClientPeg.get().upgradeRoom(roomId, args);
|
||||
},
|
||||
});
|
||||
return success();
|
||||
}
|
||||
return reject(this.getUsage());
|
||||
},
|
||||
|
@ -1,7 +1,7 @@
|
||||
const React = require('react');
|
||||
const ReactDom = require('react-dom');
|
||||
import PropTypes from 'prop-types';
|
||||
const Velocity = require('velocity-vector');
|
||||
const Velocity = require('velocity-animate');
|
||||
|
||||
/**
|
||||
* The Velociraptor contains components and animates transitions with velocity.
|
||||
|
@ -1,4 +1,4 @@
|
||||
const Velocity = require('velocity-vector');
|
||||
const Velocity = require('velocity-animate');
|
||||
|
||||
// courtesy of https://github.com/julianshapiro/velocity/issues/283
|
||||
// We only use easeOutBounce (easeInBounce is just sort of nonsensical)
|
||||
|
@ -19,8 +19,8 @@ import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import sdk from '../../index';
|
||||
import dis from '../../dispatcher';
|
||||
import Velocity from 'velocity-vector';
|
||||
import 'velocity-vector/velocity.ui';
|
||||
import Velocity from 'velocity-animate';
|
||||
import 'velocity-animate/velocity.ui';
|
||||
import SettingsStore from '../../settings/SettingsStore';
|
||||
|
||||
const CALLOUT_ANIM_DURATION = 1000;
|
||||
|
@ -48,19 +48,13 @@ module.exports = React.createClass({
|
||||
</p>
|
||||
<p>
|
||||
{ _t(
|
||||
'Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> ' +
|
||||
'for the best experience.',
|
||||
'Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ' +
|
||||
'or <safariLink>Safari</safariLink> for the best experience.',
|
||||
{},
|
||||
{
|
||||
'chromeLink': (sub) => <a href="https://www.google.com/chrome">{sub}</a>,
|
||||
'firefoxLink': (sub) => <a href="https://getfirefox.com">{sub}</a>,
|
||||
},
|
||||
)}
|
||||
{ _t('<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.',
|
||||
{},
|
||||
{
|
||||
'safariLink': (sub) => <a href="http://apple.com/safari">{sub}</a>,
|
||||
'operaLink': (sub) => <a href="http://opera.com">{sub}</a>,
|
||||
'firefoxLink': (sub) => <a href="https://firefox.com">{sub}</a>,
|
||||
'safariLink': (sub) => <a href="https://apple.com/safari">{sub}</a>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
|
@ -84,7 +84,7 @@ class CustomRoomTagTile extends React.Component {
|
||||
render() {
|
||||
const BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
|
||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||
const RoomTooltip = sdk.getComponent('rooms.RoomTooltip');
|
||||
const Tooltip = sdk.getComponent('elements.Tooltip');
|
||||
|
||||
const tag = this.props.tag;
|
||||
const avatarHeight = 40;
|
||||
@ -103,7 +103,7 @@ class CustomRoomTagTile extends React.Component {
|
||||
}
|
||||
|
||||
const tip = (this.state.hover ?
|
||||
<RoomTooltip className="mx_TagTile_tooltip" label={name} /> :
|
||||
<Tooltip className="mx_TagTile_tooltip" label={name} /> :
|
||||
<div />);
|
||||
return (
|
||||
<AccessibleButton className={className} onClick={this.onClick}>
|
||||
|
@ -70,6 +70,11 @@ module.exports = React.createClass({
|
||||
fieldErrors: {},
|
||||
// The ISO2 country code selected in the phone number entry
|
||||
phoneCountry: this.props.defaultPhoneCountry,
|
||||
username: "",
|
||||
email: "",
|
||||
phoneNumber: "",
|
||||
password: "",
|
||||
passwordConfirm: "",
|
||||
};
|
||||
},
|
||||
|
||||
@ -89,7 +94,7 @@ module.exports = React.createClass({
|
||||
|
||||
const self = this;
|
||||
if (this.allFieldsValid()) {
|
||||
if (this.refs.email.value == '') {
|
||||
if (this.state.email == '') {
|
||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||
Modal.createTrackedDialog('If you don\'t specify an email address...', '', QuestionDialog, {
|
||||
title: _t("Warning!"),
|
||||
@ -112,13 +117,13 @@ module.exports = React.createClass({
|
||||
},
|
||||
|
||||
_doSubmit: function(ev) {
|
||||
const email = this.refs.email.value.trim();
|
||||
const email = this.state.email.trim();
|
||||
const promise = this.props.onRegisterClick({
|
||||
username: this.refs.username.value.trim(),
|
||||
password: this.refs.password.value.trim(),
|
||||
username: this.state.username.trim(),
|
||||
password: this.state.password.trim(),
|
||||
email: email,
|
||||
phoneCountry: this.state.phoneCountry,
|
||||
phoneNumber: this.refs.phoneNumber ? this.refs.phoneNumber.value.trim() : '',
|
||||
phoneNumber: this.state.phoneNumber,
|
||||
});
|
||||
|
||||
if (promise) {
|
||||
@ -143,13 +148,13 @@ module.exports = React.createClass({
|
||||
},
|
||||
|
||||
validateField: function(fieldID, eventType) {
|
||||
const pwd1 = this.refs.password.value.trim();
|
||||
const pwd2 = this.refs.passwordConfirm.value.trim();
|
||||
const pwd1 = this.state.password.trim();
|
||||
const pwd2 = this.state.passwordConfirm.trim();
|
||||
const allowEmpty = eventType === "blur";
|
||||
|
||||
switch (fieldID) {
|
||||
case FIELD_EMAIL: {
|
||||
const email = this.refs.email.value;
|
||||
const email = this.state.email;
|
||||
const emailValid = email === '' || Email.looksValid(email);
|
||||
if (this._authStepIsRequired('m.login.email.identity') && (!emailValid || email === '')) {
|
||||
this.markFieldValid(fieldID, false, "RegistrationForm.ERR_MISSING_EMAIL");
|
||||
@ -157,7 +162,7 @@ module.exports = React.createClass({
|
||||
break;
|
||||
}
|
||||
case FIELD_PHONE_NUMBER: {
|
||||
const phoneNumber = this.refs.phoneNumber ? this.refs.phoneNumber.value : '';
|
||||
const phoneNumber = this.state.phoneNumber;
|
||||
const phoneNumberValid = phoneNumber === '' || phoneNumberLooksValid(phoneNumber);
|
||||
if (this._authStepIsRequired('m.login.msisdn') && (!phoneNumberValid || phoneNumber === '')) {
|
||||
this.markFieldValid(fieldID, false, "RegistrationForm.ERR_MISSING_PHONE_NUMBER");
|
||||
@ -165,7 +170,7 @@ module.exports = React.createClass({
|
||||
break;
|
||||
}
|
||||
case FIELD_USERNAME: {
|
||||
const username = this.refs.username.value.trim();
|
||||
const username = this.state.username;
|
||||
if (allowEmpty && username === '') {
|
||||
this.markFieldValid(fieldID, true);
|
||||
} else if (!SAFE_LOCALPART_REGEX.test(username)) {
|
||||
@ -230,21 +235,6 @@ module.exports = React.createClass({
|
||||
this.props.onValidationChange(fieldErrors);
|
||||
},
|
||||
|
||||
fieldElementById(fieldID) {
|
||||
switch (fieldID) {
|
||||
case FIELD_EMAIL:
|
||||
return this.refs.email;
|
||||
case FIELD_PHONE_NUMBER:
|
||||
return this.refs.phoneNumber;
|
||||
case FIELD_USERNAME:
|
||||
return this.refs.username;
|
||||
case FIELD_PASSWORD:
|
||||
return this.refs.password;
|
||||
case FIELD_PASSWORD_CONFIRM:
|
||||
return this.refs.passwordConfirm;
|
||||
}
|
||||
},
|
||||
|
||||
_classForField: function(fieldID, ...baseClasses) {
|
||||
let cls = baseClasses.join(' ');
|
||||
if (this.state.fieldErrors[fieldID]) {
|
||||
@ -258,14 +248,32 @@ module.exports = React.createClass({
|
||||
this.validateField(FIELD_EMAIL, ev.type);
|
||||
},
|
||||
|
||||
onEmailChange(ev) {
|
||||
this.setState({
|
||||
email: ev.target.value,
|
||||
});
|
||||
},
|
||||
|
||||
onPasswordBlur(ev) {
|
||||
this.validateField(FIELD_PASSWORD, ev.type);
|
||||
},
|
||||
|
||||
onPasswordChange(ev) {
|
||||
this.setState({
|
||||
password: ev.target.value,
|
||||
});
|
||||
},
|
||||
|
||||
onPasswordConfirmBlur(ev) {
|
||||
this.validateField(FIELD_PASSWORD_CONFIRM, ev.type);
|
||||
},
|
||||
|
||||
onPasswordConfirmChange(ev) {
|
||||
this.setState({
|
||||
passwordConfirm: ev.target.value,
|
||||
});
|
||||
},
|
||||
|
||||
onPhoneCountryChange(newVal) {
|
||||
this.setState({
|
||||
phoneCountry: newVal.iso2,
|
||||
@ -277,10 +285,22 @@ module.exports = React.createClass({
|
||||
this.validateField(FIELD_PHONE_NUMBER, ev.type);
|
||||
},
|
||||
|
||||
onPhoneNumberChange(ev) {
|
||||
this.setState({
|
||||
phoneNumber: ev.target.value,
|
||||
});
|
||||
},
|
||||
|
||||
onUsernameBlur(ev) {
|
||||
this.validateField(FIELD_USERNAME, ev.type);
|
||||
},
|
||||
|
||||
onUsernameChange(ev) {
|
||||
this.setState({
|
||||
username: ev.target.value,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* A step is required if all flows include that step.
|
||||
*
|
||||
@ -343,12 +363,12 @@ module.exports = React.createClass({
|
||||
<Field
|
||||
className={this._classForField(FIELD_EMAIL)}
|
||||
id="mx_RegistrationForm_email"
|
||||
ref="email"
|
||||
type="text"
|
||||
label={emailPlaceholder}
|
||||
defaultValue={this.props.defaultEmail}
|
||||
value={this.state.email}
|
||||
onBlur={this.onEmailBlur}
|
||||
onChange={this.onEmailChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@ -370,13 +390,13 @@ module.exports = React.createClass({
|
||||
phoneSection = <Field
|
||||
className={this._classForField(FIELD_PHONE_NUMBER)}
|
||||
id="mx_RegistrationForm_phoneNumber"
|
||||
ref="phoneNumber"
|
||||
type="text"
|
||||
label={phoneLabel}
|
||||
defaultValue={this.props.defaultPhoneNumber}
|
||||
value={this.state.phoneNumber}
|
||||
prefix={phoneCountry}
|
||||
onBlur={this.onPhoneNumberBlur}
|
||||
onChange={this.onPhoneNumberChange}
|
||||
/>;
|
||||
}
|
||||
|
||||
@ -395,32 +415,35 @@ module.exports = React.createClass({
|
||||
<Field
|
||||
className={this._classForField(FIELD_USERNAME)}
|
||||
id="mx_RegistrationForm_username"
|
||||
ref="username"
|
||||
type="text"
|
||||
autoFocus={true}
|
||||
label={_t("Username")}
|
||||
defaultValue={this.props.defaultUsername}
|
||||
value={this.state.username}
|
||||
onBlur={this.onUsernameBlur}
|
||||
onChange={this.onUsernameChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="mx_AuthBody_fieldRow">
|
||||
<Field
|
||||
className={this._classForField(FIELD_PASSWORD)}
|
||||
id="mx_RegistrationForm_password"
|
||||
ref="password"
|
||||
type="password"
|
||||
label={_t("Password")}
|
||||
defaultValue={this.props.defaultPassword}
|
||||
value={this.state.password}
|
||||
onBlur={this.onPasswordBlur}
|
||||
onChange={this.onPasswordChange}
|
||||
/>
|
||||
<Field
|
||||
className={this._classForField(FIELD_PASSWORD_CONFIRM)}
|
||||
id="mx_RegistrationForm_passwordConfirm"
|
||||
ref="passwordConfirm"
|
||||
type="password"
|
||||
label={_t("Confirm")}
|
||||
defaultValue={this.props.defaultPassword}
|
||||
value={this.state.passwordConfirm}
|
||||
onBlur={this.onPasswordConfirmBlur}
|
||||
onChange={this.onPasswordConfirmChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="mx_AuthBody_fieldRow">
|
||||
|
@ -21,7 +21,7 @@ import sdk from '../../../index';
|
||||
import Analytics from '../../../Analytics';
|
||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||
import * as Lifecycle from '../../../Lifecycle';
|
||||
import Velocity from 'velocity-vector';
|
||||
import Velocity from 'velocity-animate';
|
||||
import { _t } from '../../../languageHandler';
|
||||
|
||||
export default class DeactivateAccountDialog extends React.Component {
|
||||
|
@ -336,9 +336,14 @@ export default class AppTile extends React.Component {
|
||||
* Called when widget iframe has finished loading
|
||||
*/
|
||||
_onLoaded() {
|
||||
if (!ActiveWidgetStore.getWidgetMessaging(this.props.id)) {
|
||||
this._setupWidgetMessaging();
|
||||
// Destroy the old widget messaging before starting it back up again. Some widgets
|
||||
// have startup routines that run when they are loaded, so we just need to reinitialize
|
||||
// the messaging for them.
|
||||
if (ActiveWidgetStore.getWidgetMessaging(this.props.id)) {
|
||||
ActiveWidgetStore.delWidgetMessaging(this.props.id);
|
||||
}
|
||||
this._setupWidgetMessaging();
|
||||
|
||||
ActiveWidgetStore.setRoomId(this.props.id, this.props.room.roomId);
|
||||
this.setState({loading: false});
|
||||
}
|
||||
|
@ -53,12 +53,6 @@ export default class Field extends React.PureComponent {
|
||||
};
|
||||
}
|
||||
|
||||
/* TODO: Remove this once `RegistrationForm` no longer uses refs */
|
||||
get value() {
|
||||
if (!this.refs.fieldInput) return null;
|
||||
return this.refs.fieldInput.value;
|
||||
}
|
||||
|
||||
onChange = (ev) => {
|
||||
if (this.props.onValidate) {
|
||||
const result = this.props.onValidate(ev.target.value);
|
||||
|
@ -431,7 +431,7 @@ module.exports = React.createClass({
|
||||
|
||||
const stripReply = ReplyThread.getParentEventId(mxEvent);
|
||||
let body = HtmlUtils.bodyToHtml(content, this.props.highlights, {
|
||||
disableBigEmoji: !SettingsStore.getValue('TextualBody.enableBigEmoji'),
|
||||
disableBigEmoji: content.msgtype === "m.emote" || !SettingsStore.getValue('TextualBody.enableBigEmoji'),
|
||||
// Part of Replies fallback support
|
||||
stripReplyFallback: stripReply,
|
||||
});
|
||||
|
@ -34,14 +34,20 @@ export default class RoomProfileSettings extends React.Component {
|
||||
const client = MatrixClientPeg.get();
|
||||
const room = client.getRoom(props.roomId);
|
||||
if (!room) throw new Error("Expected a room for ID: ", props.roomId);
|
||||
|
||||
const avatarEvent = room.currentState.getStateEvents("m.room.avatar", "");
|
||||
let avatarUrl = avatarEvent && avatarEvent.getContent() ? avatarEvent.getContent()["url"] : null;
|
||||
if (avatarUrl) avatarUrl = client.mxcUrlToHttp(avatarUrl, 96, 96, 'crop', false);
|
||||
|
||||
const topicEvent = room.currentState.getStateEvents("m.room.topic", "");
|
||||
const topic = topicEvent && topicEvent.getContent() ? topicEvent.getContent()['topic'] : '';
|
||||
|
||||
const nameEvent = room.currentState.getStateEvents('m.room.name', '');
|
||||
const name = nameEvent && nameEvent.getContent() ? nameEvent.getContent()['name'] : '';
|
||||
|
||||
this.state = {
|
||||
originalDisplayName: room.name,
|
||||
displayName: room.name,
|
||||
originalDisplayName: name,
|
||||
displayName: name,
|
||||
originalAvatarUrl: avatarUrl,
|
||||
avatarUrl: avatarUrl,
|
||||
avatarFile: null,
|
||||
|
@ -37,41 +37,43 @@ module.exports = React.createClass({
|
||||
render: function() {
|
||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||
|
||||
let upgradeText = (
|
||||
<div>
|
||||
return (
|
||||
<div className="mx_RoomUpgradeWarningBar">
|
||||
<div className="mx_RoomUpgradeWarningBar_header">
|
||||
{_t(
|
||||
"This room is running room version <roomVersion />, which this homeserver has " +
|
||||
"marked as <i>unstable</i>.",
|
||||
{},
|
||||
{
|
||||
"roomVersion": () => <code>{this.props.room.getVersion()}</code>,
|
||||
"i": (sub) => <i>{sub}</i>,
|
||||
},
|
||||
)}
|
||||
</div>
|
||||
<div className="mx_RoomUpgradeWarningBar_body">
|
||||
{_t("This room is using an unstable room version. If you aren't expecting " +
|
||||
"this, please upgrade the room.")}
|
||||
<p>
|
||||
{_t(
|
||||
"Upgrading this room will shut down the current instance of the room and create " +
|
||||
"an upgraded room with the same name.",
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{_t(
|
||||
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members " +
|
||||
"to the new version of the room.</i> We'll post a link to the new room in the old " +
|
||||
"version of the room - room members will have to click this link to join the new room.",
|
||||
{}, {
|
||||
"b": (sub) => <b>{sub}</b>,
|
||||
"i": (sub) => <i>{sub}</i>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
<p className="mx_RoomUpgradeWarningBar_upgradelink">
|
||||
<AccessibleButton onClick={this.onUpgradeClick}>
|
||||
{_t("Click here to upgrade to the latest room version.")}
|
||||
{_t("Upgrade this room to the recommended room version")}
|
||||
</AccessibleButton>
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
if (this.props.recommendation.urgent) {
|
||||
upgradeText = (
|
||||
<div>
|
||||
<div className="mx_RoomUpgradeWarningBar_header">
|
||||
{_t("There is a known vulnerability affecting this room.")}
|
||||
</div>
|
||||
<div className="mx_RoomUpgradeWarningBar_body">
|
||||
{_t("This room version is vulnerable to malicious modification of room state.")}
|
||||
</div>
|
||||
<p className="mx_RoomUpgradeWarningBar_upgradelink">
|
||||
<AccessibleButton onClick={this.onUpgradeClick}>
|
||||
{_t("Click here to upgrade to the latest room version and ensure room integrity " +
|
||||
"is protected.")}
|
||||
</AccessibleButton>
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mx_RoomUpgradeWarningBar">
|
||||
{upgradeText}
|
||||
<div className="mx_RoomUpgradeWarningBar_small">
|
||||
{_t("Only room administrators will see this warning")}
|
||||
</div>
|
||||
|
@ -25,6 +25,7 @@ import dis from '../../../dispatcher';
|
||||
import AccessibleButton from '../elements/AccessibleButton';
|
||||
import WidgetUtils from '../../../utils/WidgetUtils';
|
||||
import ActiveWidgetStore from '../../../stores/ActiveWidgetStore';
|
||||
import PersistedElement from "../elements/PersistedElement";
|
||||
|
||||
const widgetType = 'm.stickerpicker';
|
||||
|
||||
@ -32,6 +33,9 @@ const widgetType = 'm.stickerpicker';
|
||||
// above it, so it needs a greater z-index than the ContextMenu
|
||||
const STICKERPICKER_Z_INDEX = 5000;
|
||||
|
||||
// Key to store the widget's AppTile under in PersistedElement
|
||||
const PERSISTED_ELEMENT_KEY = "stickerPicker";
|
||||
|
||||
export default class Stickerpicker extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
@ -126,6 +130,23 @@ export default class Stickerpicker extends React.Component {
|
||||
|
||||
_updateWidget() {
|
||||
const stickerpickerWidget = WidgetUtils.getStickerpickerWidgets()[0];
|
||||
|
||||
const currentWidget = this.state.stickerpickerWidget;
|
||||
let currentUrl = null;
|
||||
if (currentWidget && currentWidget.content && currentWidget.content.url) {
|
||||
currentUrl = currentWidget.content.url;
|
||||
}
|
||||
|
||||
let newUrl = null;
|
||||
if (stickerpickerWidget && stickerpickerWidget.content && stickerpickerWidget.content.url) {
|
||||
newUrl = stickerpickerWidget.content.url;
|
||||
}
|
||||
|
||||
if (newUrl !== currentUrl) {
|
||||
// Destroy the existing frame so a new one can be created
|
||||
PersistedElement.destroyElement(PERSISTED_ELEMENT_KEY);
|
||||
}
|
||||
|
||||
this.setState({
|
||||
stickerpickerWidget,
|
||||
widgetId: stickerpickerWidget ? stickerpickerWidget.id : null,
|
||||
@ -211,7 +232,7 @@ export default class Stickerpicker extends React.Component {
|
||||
width: this.popoverWidth,
|
||||
}}
|
||||
>
|
||||
<PersistedElement persistKey="stickerPicker" style={{zIndex: STICKERPICKER_Z_INDEX}}>
|
||||
<PersistedElement persistKey={PERSISTED_ELEMENT_KEY} style={{zIndex: STICKERPICKER_Z_INDEX}}>
|
||||
<AppTile
|
||||
id={stickerpickerWidget.id}
|
||||
url={stickerpickerWidget.content.url}
|
||||
|
@ -67,9 +67,22 @@ export default class AdvancedRoomSettingsTab extends React.Component {
|
||||
let roomUpgradeButton;
|
||||
if (this.state.upgradeRecommendation && this.state.upgradeRecommendation.needsUpgrade) {
|
||||
roomUpgradeButton = (
|
||||
<AccessibleButton onClick={this._upgradeRoom} kind='primary'>
|
||||
{_t("Upgrade room to version %(ver)s", {ver: this.state.upgradeRecommendation.version})}
|
||||
</AccessibleButton>
|
||||
<div>
|
||||
<p className='mx_SettingsTab_warningText'>
|
||||
{_t(
|
||||
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members " +
|
||||
"to the new version of the room.</i> We'll post a link to the new room in the old " +
|
||||
"version of the room - room members will have to click this link to join the new room.",
|
||||
{}, {
|
||||
"b": (sub) => <b>{sub}</b>,
|
||||
"i": (sub) => <i>{sub}</i>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
<AccessibleButton onClick={this._upgradeRoom} kind='primary'>
|
||||
{_t("Upgrade this room to the recommended room version")}
|
||||
</AccessibleButton>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -66,5 +66,8 @@
|
||||
"Collapse panel": "طي الجدول",
|
||||
"Set Password": "تعيين كلمة سرية",
|
||||
"Checking for an update...": "البحث عن تحديث …",
|
||||
"powered by Matrix": "مشغل بواسطة Matrix"
|
||||
"powered by Matrix": "مشغل بواسطة Matrix",
|
||||
"The platform you're on": "المنصة الحالية",
|
||||
"Your language of choice": "اللغة المختارة",
|
||||
"e.g. %(exampleValue)s": "مثال %(exampleValue)s"
|
||||
}
|
||||
|
@ -132,6 +132,13 @@
|
||||
"/ddg is not a command": "/ddg is not a command",
|
||||
"To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.",
|
||||
"Upgrades a room to a new version": "Upgrades a room to a new version",
|
||||
"Room upgrade confirmation": "Room upgrade confirmation",
|
||||
"Upgrading a room can be destructive and isn't always necessary.": "Upgrading a room can be destructive and isn't always necessary.",
|
||||
"Room upgrades are usually recommended when a room version is considered <i>unstable</i>. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Room upgrades are usually recommended when a room version is considered <i>unstable</i>. Unstable room versions might have bugs, missing features, or security vulnerabilities.",
|
||||
"Room upgrades usually only affect <i>server-side</i> processing of the room. If you're having problems with your Riot client, please file an issue with <issueLink />.": "Room upgrades usually only affect <i>server-side</i> processing of the room. If you're having problems with your Riot client, please file an issue with <issueLink />.",
|
||||
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members to the new version of the room.</i> We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members to the new version of the room.</i> We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.",
|
||||
"Please confirm that you'd like to go forward with upgrading this room from <oldVersion /> to <newVersion />": "Please confirm that you'd like to go forward with upgrading this room from <oldVersion /> to <newVersion />",
|
||||
"Upgrade": "Upgrade",
|
||||
"Changes your display nickname": "Changes your display nickname",
|
||||
"Changes your display nickname in the current room only": "Changes your display nickname in the current room only",
|
||||
"Changes colour scheme of current room": "Changes colour scheme of current room",
|
||||
@ -581,7 +588,7 @@
|
||||
"Camera": "Camera",
|
||||
"Voice & Video": "Voice & Video",
|
||||
"This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers",
|
||||
"Upgrade room to version %(ver)s": "Upgrade room to version %(ver)s",
|
||||
"Upgrade this room to the recommended room version": "Upgrade this room to the recommended room version",
|
||||
"Room information": "Room information",
|
||||
"Internal room ID:": "Internal room ID:",
|
||||
"Room version": "Room version",
|
||||
@ -802,11 +809,8 @@
|
||||
"Not now": "Not now",
|
||||
"Don't ask me again": "Don't ask me again",
|
||||
"Add a topic": "Add a topic",
|
||||
"This room is using an unstable room version. If you aren't expecting this, please upgrade the room.": "This room is using an unstable room version. If you aren't expecting this, please upgrade the room.",
|
||||
"Click here to upgrade to the latest room version.": "Click here to upgrade to the latest room version.",
|
||||
"There is a known vulnerability affecting this room.": "There is a known vulnerability affecting this room.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "This room version is vulnerable to malicious modification of room state.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Click here to upgrade to the latest room version and ensure room integrity is protected.",
|
||||
"This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.": "This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.",
|
||||
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.",
|
||||
"Only room administrators will see this warning": "Only room administrators will see this warning",
|
||||
"This Room": "This Room",
|
||||
"All Rooms": "All Rooms",
|
||||
@ -1288,8 +1292,7 @@
|
||||
"Find other public servers or use a custom server": "Find other public servers or use a custom server",
|
||||
"Sorry, your browser is <b>not</b> able to run Riot.": "Sorry, your browser is <b>not</b> able to run Riot.",
|
||||
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.",
|
||||
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.",
|
||||
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.",
|
||||
"Please install <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.",
|
||||
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!",
|
||||
"I understand the risks and wish to continue": "I understand the risks and wish to continue",
|
||||
"Couldn't load page": "Couldn't load page",
|
||||
|
@ -1747,5 +1747,7 @@
|
||||
"If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Nahi gabe egin baduzu hau, Mezu seguruak ezarri ditzakezu gailu honetan eta gailu honetako mezuen historiala berreskuratze metodo berriarekin zifratuko da.",
|
||||
"If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ez baduzu berreskuratze metodoa kendu, agian erasotzaile bat zure mezuen historialera sarbidea lortu nahi du. Aldatu kontuaren pasahitza eta ezarri berreskuratze metodo berri bat berehala ezarpenetan.",
|
||||
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "Zerbitzari pertsonalizatuaren aukera erabili dezakezu beste Matrix zerbitzarietan saioa hasteko beste hasiera-zerbitzari batek URLa adieraziz. Honek aplikazio hau beste Matrix zerbitzari batean duzun Matrix kontua erabiltzea baimentzen dizu.",
|
||||
"The homeserver URL %(hsUrl)s doesn't seem to be valid URL. Please enter a valid URL including the protocol prefix.": "Hasiera zerbitzariaren URL-a %(hsUrl)s ez ditudi baliozko URL bat. Sartu baliozko URL bat protokoloaren aurrekaria barne."
|
||||
"The homeserver URL %(hsUrl)s doesn't seem to be valid URL. Please enter a valid URL including the protocol prefix.": "Hasiera zerbitzariaren URL-a %(hsUrl)s ez ditudi baliozko URL bat. Sartu baliozko URL bat protokoloaren aurrekaria barne.",
|
||||
"Changes your display nickname in the current room only": "Zure pantailako izena aldatzen du gela honetan bakarrik",
|
||||
"Your Matrix account on %(serverName)s": "Zure %(serverName)s zerbitzariko Matrix kontua"
|
||||
}
|
||||
|
@ -1557,5 +1557,28 @@
|
||||
"Power level": "Oikeuksien taso",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Tapahtuman, johon oli vastattu, lataaminen epäonnistui. Se joko ei ole olemassa tai sinulla ei ole oikeutta katsoa sitä.",
|
||||
"The following users may not exist": "Seuraavat käyttäjät eivät välttämättä ole olemassa",
|
||||
"Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Alla luetelluille Matrix ID:ille ei löytynyt profiileja. Haluaisitko kutsua ne siitä huolimatta?"
|
||||
"Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Alla luetelluille Matrix ID:ille ei löytynyt profiileja. Haluaisitko kutsua ne siitä huolimatta?",
|
||||
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Debug-lokit sisältävät ohjelman käyttödataa, kuten käyttäjätunnuksesi, huoneiden ja ryhmien ID:t tai aliakset, joissa olet vieraillut sekä muiden käyttäjien käyttäjätunnukset. Ne eivät sisällä viestejä.",
|
||||
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Ennen lokien lähettämistä sinun täytyy <a>luoda tapahtuma Githubiin</a>, joka sisältää kuvauksen ongelmastasi.",
|
||||
"What GitHub issue are these logs for?": "Mihin Github-tapahtumaan nämä lokit liittyvät?",
|
||||
"Notes:": "Huomiot:",
|
||||
"Unable to load commit detail: %(msg)s": "Commitin tietojen hakeminen epäonnistui: %(msg)s",
|
||||
"Community IDs cannot be empty.": "Yhteisön ID:t eivät voi olla tyhjänä.",
|
||||
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Jotta et menetä keskusteluhistoriaasi, sinun täytyy tallentaa huoneen avaimet ennen kuin kirjaudut ulos. Joudut käyttämään uudempaa Riotin versiota tätä varten",
|
||||
"You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Olet aikaisemmin käyttänyt uudempaa Riotin versiota koneella %(host)s. Jotta voit käyttää tätä versiota osapuolten välisellä salauksella, sinun täytyy kirjautua ulos ja kirjautua takaisin sisään. ",
|
||||
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Tämä tekee tunnuksestasi lopullisesti käyttökelvottoman. Et voi kirjautua sisään, eikä kukaan voi rekisteröidä tunnusta samalla käyttäjä-ID:llä. Tunnuksesi tulee lähtemään kaikista huoneista, joihin se on liittynyt, ja tietosi tullaan poistamaan identiteettipalvelimelta. <b>Tämä toimenpide on lopullinen eikä sitä voi kumota.</b>",
|
||||
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Tunnuksesi poistaminen käytöstä <b>ei oletuksena saa meitä unohtamaan lähettämiäsi viestejä.</b> Jos haluaisit meidän unohtavan viestisi, klikkaa alapuolella olevasta laatikosta.",
|
||||
"Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Viestien näkyvyys Matrixissa on samanlainen kuin sähköpostissa. Vaikka se, et unohdamme viestisi, tarkoittaa, ettei viestejäsi jaeta enää uusille tai rekisteröitymättömille käyttäjille, käyttäjät, jotka ovat jo saaneet viestisi pystyvät lukemaan jatkossakin omaa kopioonsa viesteistäsi.",
|
||||
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Unohda kaikki viestit, jotka olen lähettänyt, kun tunnukseni on otettu pois käytöstä (b>Warning:</b> tämä aiheuttaa tulevien käyttäjien näkevän epätäydellisen version keskusteluista)",
|
||||
"Use Legacy Verification (for older clients)": "Käytä vanhentunutta varmennustapaa (vanhemmille asiakasohjelmille)",
|
||||
"Verify by comparing a short text string.": "Varmenna vertaamalla lyhyttä tekstijonoa.",
|
||||
"Begin Verifying": "Aloita varmentaminen",
|
||||
"Waiting for partner to accept...": "Odotetaan, että toinen osapuoli hyväksyy...",
|
||||
"Nothing appearing? Not all clients support interactive verification yet. <button>Use legacy verification</button>.": "Näytölle ei ilmesty mitään? Kaikki asiakasohjelmat eivät vielä tue interaktiivista varmentamista. <button>Käytä vanhentunutta varmennusta</button>.",
|
||||
"Waiting for %(userId)s to confirm...": "Odotetaan, että %(userId)s hyväksyy...",
|
||||
"Use two-way text verification": "Käytä kahdensuuntaista tekstivarmennusta",
|
||||
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitsemällä hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi osapuolten välistä salausta.",
|
||||
"Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Tämän käyttäjän varmentaminen merkitsee heidän laitteensa luotetuiksi, sekä merkitsee sinun laitteesi luotetuiksi tälle käyttäjälle.",
|
||||
"Waiting for partner to confirm...": "Odotetaan, että toinen osapuoli varmistaa...",
|
||||
"Incoming Verification Request": "Saapuva varmennuspyyntö"
|
||||
}
|
||||
|
@ -1600,5 +1600,33 @@
|
||||
"FAQ": "FAQ",
|
||||
"Versions": "Versões",
|
||||
"Close button should minimize window to tray": "O botão Fechar deve minimizar a janela para a bandeja",
|
||||
"Preferences": "Preferências"
|
||||
"Preferences": "Preferências",
|
||||
"Composer": "Compositor",
|
||||
"Timeline": "Linha do Tempo",
|
||||
"Room list": "Lista de Salas",
|
||||
"Autocomplete delay (ms)": "Atraso no preenchimento automático (ms)",
|
||||
"Ignored users": "Usuários ignorados",
|
||||
"Bulk options": "Opções em massa",
|
||||
"Accept all %(invitedRooms)s invites": "Aceite todos os convites de %(invitedRooms)s",
|
||||
"Key backup": "Backup da chave",
|
||||
"Security & Privacy": "Segurança & Privacidade",
|
||||
"Missing media permissions, click the button below to request.": "Permissões de mídia ausentes, clique no botão abaixo para solicitar.",
|
||||
"Request media permissions": "Solicitar permissões de mídia",
|
||||
"Voice & Video": "Voz e vídeo",
|
||||
"Room information": "Informação da sala",
|
||||
"Internal room ID:": "ID da sala interna:",
|
||||
"Room version": "Versão da sala",
|
||||
"Room version:": "Versão da sala:",
|
||||
"Developer options": "Opções de desenvolvedor",
|
||||
"Room Addresses": "Endereços da sala",
|
||||
"Change room avatar": "Alterar avatar da sala",
|
||||
"Change room name": "Alterar nome da sala",
|
||||
"Change main address for the room": "Alterar o endereço principal da sala",
|
||||
"Change history visibility": "Alterar a visibilidade do histórico",
|
||||
"Change permissions": "Alterar permissões",
|
||||
"Change topic": "Alterar o tópico",
|
||||
"Modify widgets": "Modificar widgets",
|
||||
"Default role": "Papel padrão",
|
||||
"Send messages": "Enviar mensagens",
|
||||
"Invite users": "Convidar usuários"
|
||||
}
|
||||
|
@ -1236,7 +1236,7 @@
|
||||
"Increase performance by only loading room members on first view": "Увеличьте производительность, загрузив только список участников комнаты",
|
||||
"Lazy loading members not supported": "Задержка загрузки элементов не поддерживается",
|
||||
"Registration Required": "Требуется регистрация",
|
||||
"You need to register to do this. Would you like to register now?": "Необходимо зарегистрироваться. Хотите зарегистрироваться?",
|
||||
"You need to register to do this. Would you like to register now?": "Необходима регистрация. Хотите зарегистрироваться?",
|
||||
"You can also set a custom identity server, but you won't be able to invite users by email address, or be invited by email address yourself.": "Также можно изменить сервер идентификации, но без возможности приглашать (или быть приглашённым) по адресу электронной почты.",
|
||||
"Whether or not you're logged in (we don't record your username)": "Независимо от того, вошли вы или нет (мы не записываем ваше имя пользователя)",
|
||||
"Unable to load! Check your network connectivity and try again.": "Не удалось загрузить! Проверьте подключение к сети и попробуйте снова.",
|
||||
@ -1257,7 +1257,7 @@
|
||||
"%(names)s and %(count)s others are typing …|one": "%(names)s и ещё один печатают…",
|
||||
"%(names)s and %(lastPerson)s are typing …": "%(names)s и %(lastPerson)s печатают…",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Сервер достиг ежемесячного ограничения активных пользователей.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Превышен один из ресурсных лимитов сервера.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Превышен один из лимитов на ресурсы сервера.",
|
||||
"Unable to connect to Homeserver. Retrying...": "Невозможно подключиться к серверу. Выполняется повторная попытка...",
|
||||
"Unrecognised address": "Нераспознанный адрес",
|
||||
"You do not have permission to invite people to this room.": "У вас нет разрешения приглашать людей в эту комнату.",
|
||||
@ -1272,7 +1272,7 @@
|
||||
"Avoid years that are associated with you": "Избегайте годов, которые связаны с вами",
|
||||
"Avoid dates and years that are associated with you": "Избегайте дат и годов, которые связаны с вами",
|
||||
"Capitalization doesn't help very much": "Заглавные буквы не особо помогают",
|
||||
"All-uppercase is almost as easy to guess as all-lowercase": "Прописные буквы почти так же легко угадать, как строчные",
|
||||
"All-uppercase is almost as easy to guess as all-lowercase": "Всё прописными буквами так же легко угадывается как и всё строчными",
|
||||
"Reversed words aren't much harder to guess": "Угадать перевёрнутые слова не сильно труднее",
|
||||
"Predictable substitutions like '@' instead of 'a' don't help very much": "Предсказуемые замены типа «@» вместо «a» не особо помогают",
|
||||
"Add another word or two. Uncommon words are better.": "Добавьте ещё слово или два. Лучше редких.",
|
||||
@ -1285,12 +1285,12 @@
|
||||
"This is a top-100 common password": "Это топ-100 распространенных паролей",
|
||||
"This is a very common password": "Это очень распространенный пароль",
|
||||
"This is similar to a commonly used password": "Это похоже на распространенный пароль",
|
||||
"A word by itself is easy to guess": "Слово легко угадываемо",
|
||||
"A word by itself is easy to guess": "Общеупотребительные слова легко угадываемы",
|
||||
"Names and surnames by themselves are easy to guess": "Имена и фамилии легко угадываемы",
|
||||
"Common names and surnames are easy to guess": "Общие имена и фамилии легко угадываемы",
|
||||
"Common names and surnames are easy to guess": "Распространённые имена и фамилии легко угадываемы",
|
||||
"Straight rows of keys are easy to guess": "Прямые ряды клавиш легко угадываемы",
|
||||
"Short keyboard patterns are easy to guess": "Короткие клавиатурные шаблоны легко угадываемы",
|
||||
"There was an error joining the room": "При входе в комнату произошла ошибка",
|
||||
"There was an error joining the room": "Ошибка при входе в комнату",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Извините, ваш сервер слишком старый, для участия в этой комнате.",
|
||||
"Please contact your homeserver administrator.": "Пожалуйста, свяжитесь с администратором вашего сервера.",
|
||||
"Tabbed settings": "Настройки с вкладками",
|
||||
@ -1383,7 +1383,7 @@
|
||||
"Enable Community Filter Panel": "Включить панель сообществ",
|
||||
"Pin rooms I'm mentioned in to the top of the room list": "Помещать комнаты наверху списка, в которых меня упоминали",
|
||||
"Pin unread rooms to the top of the room list": "Помещать комнаты с непрочитанными сообщениями наверху списка",
|
||||
"Prompt before sending invites to potentially invalid matrix IDs": "Подтверждать отправку приглашений на потенциально недействительных ID",
|
||||
"Prompt before sending invites to potentially invalid matrix IDs": "Подтверждать отправку приглашений на потенциально недействительные matrix ID",
|
||||
"To continue, click on each pair to confirm it's correct.": "Для продолжения, нажмите на каждую пару, чтобы подтвердить правильность.",
|
||||
"Custom user status messages": "Модифицированный статус пользователя",
|
||||
"This device is using key backup": "Это устройство использует резервную копию ключей",
|
||||
@ -1495,13 +1495,13 @@
|
||||
"Pizza": "Пицца",
|
||||
"Cake": "Кекс",
|
||||
"Heart": "Сердце",
|
||||
"Smiley": "Смайл",
|
||||
"Smiley": "Смайлик",
|
||||
"Robot": "Робот",
|
||||
"Hat": "Шляпа",
|
||||
"Glasses": "Очки",
|
||||
"Spanner": "Гаечный ключ",
|
||||
"Santa": "Санта",
|
||||
"Thumbs up": "Пальцы вверх",
|
||||
"Thumbs up": "Большой палец вверх",
|
||||
"Umbrella": "Зонтик",
|
||||
"Hourglass": "Песочные часы",
|
||||
"Clock": "Часы",
|
||||
@ -1530,5 +1530,53 @@
|
||||
"Folder": "Папка",
|
||||
"Pin": "Кнопка",
|
||||
"Your homeserver does not support device management.": "Ваш сервер не поддерживает управление устройством.",
|
||||
"Your keys are being backed up (the first backup could take a few minutes).": "Выполняется резервная копия ключей (первый раз это может занять несколько минут)."
|
||||
"Your keys are being backed up (the first backup could take a few minutes).": "Выполняется резервная копия ключей (первый раз это может занять несколько минут).",
|
||||
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Размер файла \"%(fileName)s\" превышает лимит текущего сервера на загрузку",
|
||||
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Добавляет смайл ¯\\_(ツ)_/¯ в начало сообщения",
|
||||
"Changes your display nickname in the current room only": "Изменяет ваш псевдоним только для текущей комнаты",
|
||||
"Gets or sets the room topic": "Читает или устанавливает тему комнаты",
|
||||
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s делает комнату публичной для всех кто знает ссылку.",
|
||||
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s делает комнату доступной только по приглашению.",
|
||||
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s меняет правило входа на \"%(rule)s\"",
|
||||
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s разрешает гостям присоединяться к комнате.",
|
||||
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s запрещает гостям присоединяться к комнате.",
|
||||
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s меняет гостевой доступ на \"%(rule)s\"",
|
||||
"User %(userId)s is already in the room": "Пользователь %(userId)s уже находится в комнате",
|
||||
"The user must be unbanned before they can be invited.": "Пользователь должен быть разблокирован прежде чем может быть приглашён.",
|
||||
"Allow Peer-to-Peer for 1:1 calls": "Разрешить прямое соединение (p2p) для прямых звонков (один на один)",
|
||||
"Order rooms in the room list by most important first instead of most recent": "Сортировать список комнат по важности вместо активности",
|
||||
"Verify this user by confirming the following emoji appear on their screen.": "Проверьте собеседника, убедившись, что на его экране отображаются следующие символы (смайлы).",
|
||||
"Unable to find a supported verification method.": "Невозможно определить поддерживаемый метод верификации.",
|
||||
"Scissors": "Ножницы",
|
||||
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Общение с этим пользователем зашифровано сквозным шифрованием и недоступно третьим лицам.",
|
||||
"We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Мы отправили вам сообщение для подтверждения адреса электронной почты. Пожалуйста выполните указания данные в сообщении и нажмите кнопку внизу.",
|
||||
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Вы уверены? Зашифрованные сообщения будут безвозвратно утеряны при отсутствии соответствующего резервного копирования ваших ключей.",
|
||||
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифрованные сообщения защищены сквозным шифрованием. Только вы и ваш собеседник имеете ключи для их расшифровки и чтения.",
|
||||
"Unable to load key backup status": "Не удалось получить статус резервного копирования для ключей шифрования",
|
||||
"Restore from Backup": "Восстановить из резервной копии",
|
||||
"This device is backing up your keys. ": "Это устройство хранит резервную копию ключей шифрования",
|
||||
"This device is <b>not backing up your keys</b>.": "Это устройство <b>не хранит резервных копий ключей шифрования</b>.",
|
||||
"Back up your keys before signing out to avoid losing them.": "Перед выходом сохраните резервную копию ключей шифрования чтобы не потерять их",
|
||||
"Use key backup": "Использовать резервную копию ключей",
|
||||
"Backup has a signature from <verify>unknown</verify> device with ID %(deviceId)s.": "Резервная копия подписана <verify>неизвестным</verify> устройством с ID %(deviceId)s",
|
||||
"Backup has a <validity>valid</validity> signature from this device": "Резервная копия заверена <validity>действительной</validity> подписью от этого устройства",
|
||||
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> device <device></device>": "Резервная копия заверена <validity>действительной</validity> подписью от <verify>подтверждённого</verify> устройства <device></device>",
|
||||
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> device <device></device>": "Резервная копия заверена <validity>действительной</validity> подписью от <verify>неподтверждённого</verify> устройства <device></device>",
|
||||
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> device <device></device>": "Резервная копия заверена <validity>недействительной</validity> подписью от <verify>подтверждённого</verify> устройства <device></device>",
|
||||
"Backup has an <validity>invalid</validity> signature from <verify>unverified</verify> device <device></device>": "Резервная копия заверена <validity>недействительной</validity> подписью от <verify>неподтверждённого</verify> устройства <device></device>",
|
||||
"Backup is not signed by any of your devices": "Резервная копия не заверена ни одним из ваших устройств",
|
||||
"This backup is trusted because it has been restored on this device": "Эта резервная копия считается надёжной потому что была восстановлена на этом устройстве",
|
||||
"Your keys are <b>not being backed up from this device</b>.": "Ключи шифрования с этого устройства <b>не сохраняются в резервную копию</b>.",
|
||||
"Start using Key Backup": "Использовать резервную копию ключей шифрования",
|
||||
"Profile picture": "Аватар",
|
||||
"Upload profile picture": "Загрузить аватар",
|
||||
"Close button should minimize window to tray": "Кнопка закрытия сворачивает окно в область уведомлений (системный трей)",
|
||||
"Accept all %(invitedRooms)s invites": "Принять все приглашения (%(invitedRooms)s)",
|
||||
"Missing media permissions, click the button below to request.": "Отсутствует доступ к источнику медиа. Нажмите кнопку ниже чтобы запросить.",
|
||||
"Request media permissions": "Запросить доступ к медиа носителю",
|
||||
"Change room name": "Изменить название комнаты",
|
||||
"For help with using Riot, click <a>here</a>.": "Для получения помощи по использованию Riot, нажмите <a>здесь</a>.",
|
||||
"For help with using Riot, click <a>here</a> or start a chat with our bot using the button below.": "Для получения помощи по использованию Riot, нажмите <a>здесь</a> или начните чат с нашим ботом, используюя кнопку ниже.",
|
||||
"Bug reporting": "Сообщить об ошибке",
|
||||
"Open Devtools": "Открыть инструменты разработчика"
|
||||
}
|
||||
|
@ -1292,7 +1292,7 @@
|
||||
"Avoid repeated words and characters": "Neopakujte krátke slová, znaky alebo ich skupiny",
|
||||
"Avoid sequences": "Nestláčajte klávesy umiestnené v poradí vedľa seba",
|
||||
"Avoid recent years": "Nepíšte čísla podľa aktuálneho alebo posledných rokov",
|
||||
"Avoid years that are associated with you": "Vyvarujte sa rokov, ktoré sú s vami stotožnené",
|
||||
"Avoid years that are associated with you": "Vyvarujte sa rokom, ktoré sú s vami stotožnené",
|
||||
"Avoid dates and years that are associated with you": "Vyvarujte sa dátumov a rokov, ktoré sú s vami stotožnené",
|
||||
"Capitalization doesn't help very much": "Veľkosť písmen nie je veľmi rozhodujúca",
|
||||
"All-uppercase is almost as easy to guess as all-lowercase": "Všetky veľké písmená je možné uhádnuť rovnako ľahko ako všetky malé písmená",
|
||||
@ -1331,9 +1331,9 @@
|
||||
"This device is uploading keys to this backup": "Z tohoto zariadenia nahrávate kľúče do tejto zálohy",
|
||||
"This device is <b>not</b> uploading keys to this backup": "Toto zariadenie <b>nenahráva</b> kľúče do tejto zálohy",
|
||||
"Backup has a <validity>valid</validity> signature from this device": "Záloha je podpísaná <validity>platným</validity> kľúčom z tohoto zariadenia",
|
||||
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> device <device></device>": "Záloha je podpísaná <validity>platným</validity> kľúčom z tohoto zariadenia\nZáloha je podpísaná <validity>správnym</validity> kľúčom z <verify>overeného</verify> zariadenia <device></device>",
|
||||
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> device <device></device>": "Záloha je podpísaná <validity>platným</validity> kľúčom z <verify>neovereného</verify> zariadenia <device></device>",
|
||||
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> device <device></device>": "Záloha je podpísaná <validity>neplatným</validity> kľúčom z <verify>overeného</verify> zariadenia <device></device>",
|
||||
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> device <device></device>": "Podpis zálohy je <validity>platný</validity> a pochádza z <verify>overeného</verify> zariadenia <device></device>",
|
||||
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> device <device></device>": "Podpis zálohy je <validity>platný</validity> a pochádza z <verify>neovereného</verify> zariadenia <device></device>",
|
||||
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> device <device></device>": "Podpis zálohy je <validity>neplatný</validity> a pochádza z <verify>overeného</verify> zariadenia <device></device>",
|
||||
"Backup has an <validity>invalid</validity> signature from <verify>unverified</verify> device <device></device>": "Záloha je podpísaná <validity>neplatným</validity> kľúčom z <verify>neovereného</verify> zariadenia <device></device>",
|
||||
"Backup is not signed by any of your devices": "Záloha nie je podpísaná žiadnym z vašich zariadení",
|
||||
"Backup version: ": "Verzia zálohy: ",
|
||||
@ -1450,5 +1450,199 @@
|
||||
"Setting up Secure Messages on this device will re-encrypt this device's message history with the new recovery method.": "Nastavením Bezpečného obnovenia správ na tomto zariadení znovu zašifrujete históriu šifrovaných konverzácií novou metódov obnovenia.",
|
||||
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ak ste si nenastavili nový spôsob obnovenia útočníci sa môžu pokúsiť dostať k vášmu účtu. Ihneď si v nastaveniach zmente heslo a nastavte nový spôsob obnovi.",
|
||||
"Set up Secure Messages": "Nastaviť bezpečné obnovenie správ",
|
||||
"Go to Settings": "Otvoriť nastavenia"
|
||||
"Go to Settings": "Otvoriť nastavenia",
|
||||
"Whether or not you're logged in (we don't record your username)": "Či ste alebo nie ste prihlásení (nezaznamenávame vaše meno používateľa)",
|
||||
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Veľkosť súboru „%(fileName)s“ prekračuje limit veľkosti súboru nahrávania na tento domovský server",
|
||||
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Pridá znaky ¯\\_(ツ)_/¯ pred správy vo formáte obyčajného textu",
|
||||
"Upgrades a room to a new version": "Aktualizuje miestnosť na novšiu verziu",
|
||||
"Changes your display nickname in the current room only": "Zmení vaše zobrazované meno / prezývku len v aktuálnej miestnosti",
|
||||
"Gets or sets the room topic": "Zobrazí alebo nastaví tému miestnosti",
|
||||
"This room has no topic.": "Táto miestnosť nemá nastavenú tému.",
|
||||
"Sets the room name": "Nastaví názov miestnosti",
|
||||
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s aktualizoval túto miestnosť.",
|
||||
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s zverejnil túto miestnosť pre všetkých, ktorí poznajú jej odkaz.",
|
||||
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s nastavil vstup do miestnosti len pre pozvaných.",
|
||||
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s zmenil podmienku vstupu na %(rule)s",
|
||||
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s umožnil hosťom vstúpiť do miestnosti.",
|
||||
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s zamedzil hosťom vstúpiť do miestnosti",
|
||||
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s zmenil prístup hostí na %(rule)s",
|
||||
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s aktivoval zobrazenie členstva v komunite %(groups)s pre túto miestnosť.",
|
||||
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s deaktivoval zobrazenie členstva v komunite %(groups)s pre túto miestnosť.",
|
||||
"%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s aktivoval zobrazenie členstva v %(newGroups)s a deaktivoval zobrazovanie členstva v %(oldGroups)s pre túto miestnosť.",
|
||||
"%(displayName)s is typing …": "%(displayName)s píše …",
|
||||
"%(names)s and %(count)s others are typing …|other": "%(names)s a %(count)s ďalší píšu …",
|
||||
"%(names)s and %(count)s others are typing …|one": "%(names)s a jeden ďalší píšu …",
|
||||
"%(names)s and %(lastPerson)s are typing …": "%(names)s a %(lastPerson)s píšu …",
|
||||
"User %(userId)s is already in the room": "Používateľ %(userId)s je už v tejto miestnosti",
|
||||
"The user must be unbanned before they can be invited.": "Tomuto používateľovi musíte pred odoslaním pozvania povoliť vstup.",
|
||||
"Show recent room avatars above the room list (refresh to apply changes)": "Zobrazovať obrázky naposledy otvorených miestností nad zoznamom miestností (zmena sa prejaví po obnovení stránky)",
|
||||
"Group & filter rooms by custom tags (refresh to apply changes)": "Zoskupiť a filtrovať miestnosti podľa vlastných značiek (zmeny sa prejavia po obnovení stránky)",
|
||||
"Render simple counters in room header": "Zobraziť jednoduchú štatistiku v záhlaví miestnosti",
|
||||
"Enable Emoji suggestions while typing": "Umožniť automatické návrhy Emoji počas písania",
|
||||
"Show a placeholder for removed messages": "Zobrazovať náhrady za odstránené správy",
|
||||
"Show join/leave messages (invites/kicks/bans unaffected)": "Zobrazovať správy o vstupe a opustení miestnosti (Nemá vplyv na pozvania/vykázania/zákazy vstupu)",
|
||||
"Show avatar changes": "Zobrazovať zmeny obrázka v profile",
|
||||
"Show display name changes": "Zobrazovať zmeny zobrazovaného mena",
|
||||
"Show read receipts sent by other users": "Zobrazovať potvrdenia o prečítaní od ostatných používateľov",
|
||||
"Show avatars in user and room mentions": "Pri zmienkach používateľov a miestností zobrazovať aj obrázok",
|
||||
"Enable big emoji in chat": "Povoliť veľké Emoji v konverzáciách",
|
||||
"Send typing notifications": "Posielať oznámenia, keď píšete",
|
||||
"Enable Community Filter Panel": "Povoliť panel filter komunít",
|
||||
"Allow Peer-to-Peer for 1:1 calls": "Povoliť P2P počas priamych audio/video hovorov",
|
||||
"Order rooms in the room list by most important first instead of most recent": "Uprednostňovať najdôležitejšie namiesto naposledy aktívnych v zozname miestností",
|
||||
"Messages containing my username": "Správy obsahujúce moje meno používateľa",
|
||||
"The other party cancelled the verification.": "Proti strana zrušila overovanie.",
|
||||
"Verified!": "Overený!",
|
||||
"You've successfully verified this user.": "Úspešne ste overili tohoto používateľa.",
|
||||
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Zabezpečené správi s týmto používateľom sú E2E šifrované, čo znamená, že čítanie tretími stranami nie je možné.",
|
||||
"Got It": "Rozumiem",
|
||||
"Verify this user by confirming the following emoji appear on their screen.": "Overte tohoto používateľa tým, že zistíte, či sa na jeho obrazovke objaví nasledujúci emoji.",
|
||||
"Verify this user by confirming the following number appears on their screen.": "Overte tohoto používateľa tým, že zistíte, či sa na jeho obrazovke objaví nasledujúce číslo.",
|
||||
"Unable to find a supported verification method.": "Nie je možné nájsť podporovanú metódu overenia.",
|
||||
"For maximum security, we recommend you do this in person or use another trusted means of communication.": "Pre zachovanie maximálnej bezpečnosti odporúčame, aby ste toto vykonali osobne, alebo použili iný dôverihodný komunikačný kanál.",
|
||||
"Dog": "Pes",
|
||||
"Cat": "Mačka",
|
||||
"Lion": "Lev",
|
||||
"Horse": "Kôň",
|
||||
"Unicorn": "Jednorožec",
|
||||
"Pig": "Prasa",
|
||||
"Elephant": "Slon",
|
||||
"Rabbit": "Zajac",
|
||||
"Panda": "Panda",
|
||||
"Rooster": "Kohút",
|
||||
"Penguin": "Tučniak",
|
||||
"Turtle": "Koritnačka",
|
||||
"Fish": "Ryba",
|
||||
"Octopus": "Chobotnica",
|
||||
"Butterfly": "Motýľ",
|
||||
"Flower": "Kvetina",
|
||||
"Tree": "Strom",
|
||||
"Cactus": "Kaktus",
|
||||
"Mushroom": "Hríb",
|
||||
"Globe": "Zemeguľa",
|
||||
"Moon": "Mesiac",
|
||||
"Cloud": "Oblak",
|
||||
"Fire": "Oheň",
|
||||
"Banana": "Banán",
|
||||
"Apple": "Jablko",
|
||||
"Strawberry": "Jahoda",
|
||||
"Corn": "Kukurica",
|
||||
"Pizza": "Pizza",
|
||||
"Cake": "Koláč",
|
||||
"Heart": "Srdce",
|
||||
"Smiley": "Úsmev",
|
||||
"Robot": "Robot",
|
||||
"Hat": "Klobúk",
|
||||
"Glasses": "Okuliare",
|
||||
"Spanner": "Skrutkovač",
|
||||
"Santa": "Mikuláš",
|
||||
"Thumbs up": "palec nahor",
|
||||
"Umbrella": "Dáždnik",
|
||||
"Hourglass": "Presípacie hodiny",
|
||||
"Clock": "Hodiny",
|
||||
"Gift": "Darček",
|
||||
"Light bulb": "Žiarovka",
|
||||
"Book": "Kniha",
|
||||
"Pencil": "Ceruzka",
|
||||
"Paperclip": "Kancelárska sponka",
|
||||
"Scissors": "Nožnice",
|
||||
"Padlock": "Visiaci zámok",
|
||||
"Key": "Kľúč",
|
||||
"Hammer": "Kladivo",
|
||||
"Telephone": "Telefón",
|
||||
"Flag": "Vlajka",
|
||||
"Train": "Vlak",
|
||||
"Bicycle": "Bicykel",
|
||||
"Aeroplane": "Lietadlo",
|
||||
"Rocket": "Raketa",
|
||||
"Trophy": "Trofej",
|
||||
"Ball": "Lopta",
|
||||
"Guitar": "Gitara",
|
||||
"Trumpet": "Trúbka",
|
||||
"Bell": "Zvonček",
|
||||
"Anchor": "Kotva",
|
||||
"Headphones": "Slúchadlá",
|
||||
"Folder": "Priečinok",
|
||||
"Pin": "Pin",
|
||||
"Your homeserver does not support device management.": "Váš domovský server nepodporuje správu zariadení.",
|
||||
"Yes": "Áno",
|
||||
"No": "Nie",
|
||||
"We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Poslali sme vám email, aby sme mohli overiť vašu adresu. Postupujte podľa odoslaných inštrukcií a potom klepnite na nižšie zobrazené tlačidlo.",
|
||||
"Email Address": "Emailová adresa",
|
||||
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ste si istí? Ak nemáte správne zálohované šifrovacie kľúče, prídete o históriu šifrovaných konverzácií.",
|
||||
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Šifrované správy sú zabezpečené E2E šifrov. Ku kľúčom určeným na čítanie týchto správ máte prístup len vy a adresát(i) týchto správ.",
|
||||
"Restore from Backup": "Obnoviť zo zálohy",
|
||||
"This device is backing up your keys. ": "Kľúče z tohoto zariadenia sú zálohované. ",
|
||||
"This device is <b>not backing up your keys</b>.": "Kľúče z tohoto zariadenia <b>nie sú zálohované</b>.",
|
||||
"Back up your keys before signing out to avoid losing them.": "Zálohujte si šifrovacie kľúče pred odhlásením, aby ste zabránili ich strate.",
|
||||
"Use key backup": "Použiť zálohovanie kľúčov",
|
||||
"Backing up %(sessionsRemaining)s keys...": "Zálohovanie %(sessionsRemaining)s kľúčov…",
|
||||
"All keys backed up": "Všetky kľúče sú zálohované",
|
||||
"Backup has a signature from <verify>unknown</verify> device with ID %(deviceId)s.": "Podpis zálohy pochádza z <verify>neznámeho</verify> zariadenia ID %(deviceId)s.",
|
||||
"This backup is trusted because it has been restored on this device": "Táto záloha je dôverihodná, pretože ste z nej obnovili kľúče v tomto zariadení",
|
||||
"Your keys are <b>not being backed up from this device</b>.": "Kľúče <b>z tohoto zariadenia nemáte zálohované</b>.",
|
||||
"Start using Key Backup": "Začnite používať zálohovanie kľúčov",
|
||||
"Add an email address to configure email notifications": "Oznámenia emailom nastavíte pridaním emailovej adresy",
|
||||
"Unable to verify phone number.": "Nie je možné overiť telefónne číslo.",
|
||||
"Verification code": "Overovací kód",
|
||||
"Phone Number": "Telefónne číslo",
|
||||
"Profile picture": "Obrázok v profile",
|
||||
"Upload profile picture": "Nahrať obrázok v profile",
|
||||
"<a>Upgrade</a> to your own domain": "<a>Použiť</a> vlastnú doménu",
|
||||
"Display Name": "Zobrazované meno",
|
||||
"Set a new account password...": "Nastaviť nové heslo k účtu…",
|
||||
"Email addresses": "Emailové adresy",
|
||||
"Phone numbers": "Telefónne čísla",
|
||||
"Language and region": "Jazyk a región",
|
||||
"Theme": "Vzhľad",
|
||||
"Account management": "Správa účtu",
|
||||
"Deactivating your account is a permanent action - be careful!": "Buďte opatrní, deaktivácia účtu je nezvratná akcia!",
|
||||
"General": "Všeobecné",
|
||||
"Credits": "Poďakovanie",
|
||||
"For help with using Riot, click <a>here</a>.": "Pomoc pri používaní Riot môžete získať kliknutím <a>sem</a>.",
|
||||
"For help with using Riot, click <a>here</a> or start a chat with our bot using the button below.": "Pomoc pri používaní Riot môžete získať kliknutím <a>sem</a>, alebo začnite konverzáciu s našim robotom klepnutím na tlačidlo nižšie.",
|
||||
"Chat with Riot Bot": "Konverzácia s Riot Bot",
|
||||
"Help & About": "Pomocník & O programe",
|
||||
"Bug reporting": "Hlásenie chýb",
|
||||
"FAQ": "Často kladené otázky (FAQ)",
|
||||
"Versions": "Verzie",
|
||||
"Close button should minimize window to tray": "Tlačidlo zavrieť minimalizuje okno do oznamovacej oblasti",
|
||||
"Preferences": "Predvoľby",
|
||||
"Composer": "Editor",
|
||||
"Timeline": "Časová os",
|
||||
"Room list": "Zoznam miestností",
|
||||
"Autocomplete delay (ms)": "Oneskorenie automatického dokončovania (ms)",
|
||||
"Ignored users": "Ignorovaní používatelia",
|
||||
"Bulk options": "Hromadné možnosti",
|
||||
"Accept all %(invitedRooms)s invites": "Prijať všetkých %(invitedRooms)s pozvaní",
|
||||
"Key backup": "Zálohovanie kľúčov",
|
||||
"Security & Privacy": "Bezpečnosť & Súkromie",
|
||||
"Missing media permissions, click the button below to request.": "Chýbajú povolenia na médiá, vyžiadate klepnutím na tlačidlo nižšie.",
|
||||
"Request media permissions": "Požiadať povolenia pristupovať k médiám",
|
||||
"Voice & Video": "Hlas & Video",
|
||||
"Room information": "Informácie o miestnosti",
|
||||
"Internal room ID:": "Interné ID miestnosti:",
|
||||
"Room version": "Verzia miestnosti",
|
||||
"Room version:": "Verzia miestnosti:",
|
||||
"Developer options": "Vývojárske možnosti",
|
||||
"Room Addresses": "Adresy miestnosti",
|
||||
"Change room avatar": "Zmeniť obrázok miestnosti",
|
||||
"Change room name": "Zmeniť názov miestnosti",
|
||||
"Change main address for the room": "Zmeniť hlavnú adresu miestnosti",
|
||||
"Change history visibility": "Zmeniť viditeľnosť histórie",
|
||||
"Change permissions": "Zmeniť povolenia",
|
||||
"Change topic": "Zmeniť tému",
|
||||
"Modify widgets": "Upraviť widgety",
|
||||
"Default role": "Predvolená úloha",
|
||||
"Send messages": "Odoslať správy",
|
||||
"Invite users": "Pozvať používateľov",
|
||||
"Change settings": "Zmeniť nastavenia",
|
||||
"Kick users": "Vykázať používateľov",
|
||||
"Ban users": "Zakázať používateľom vstup",
|
||||
"Remove messages": "Odstrániť správy",
|
||||
"Notify everyone": "Poslať oznámenie všetkým",
|
||||
"Send %(eventType)s events": "Poslať udalosti %(eventType)s",
|
||||
"Roles & Permissions": "Role & Povolenia",
|
||||
"Select the roles required to change various parts of the room": "Vyberte role potrebné na zmenu rôznych častí miestnosti",
|
||||
"Enable encryption?": "Povoliť šifrovanie?"
|
||||
}
|
||||
|
@ -1770,5 +1770,32 @@
|
||||
"Create your Matrix account on %(serverName)s": "Krijoni llogarinë tuaj Matrix te %(serverName)s",
|
||||
"Could not load user profile": "S’u ngarkua dot profili i përdoruesit",
|
||||
"Your Matrix account": "Llogaria juaj Matrix",
|
||||
"Your Matrix account on %(serverName)s": "Llogaria juaj Matrix te %(serverName)s"
|
||||
"Your Matrix account on %(serverName)s": "Llogaria juaj Matrix te %(serverName)s",
|
||||
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Parashtoji ¯\\_(ツ)_/¯ një mesazhi tekst të thjeshtë",
|
||||
"User %(userId)s is already in the room": "Përdoruesi %(userId)s gjendet tashmë në dhomë",
|
||||
"The user must be unbanned before they can be invited.": "Para se të ftohen, përdoruesve u duhet hequr dëbimi",
|
||||
"<a>Upgrade</a> to your own domain": "<a>Kaloni një shkallë më lart</a> me përkatësinë tuaj vetjake",
|
||||
"Accept all %(invitedRooms)s invites": "Prano krejt ftesat prej %(invitedRooms)s",
|
||||
"Change room avatar": "Ndryshoni avatar dhome",
|
||||
"Change room name": "Ndryshoni emër dhome",
|
||||
"Change main address for the room": "Ndryshoni adresë kryesore për dhomën",
|
||||
"Change history visibility": "Ndryshoni dukshmëri historiku",
|
||||
"Change permissions": "Ndryshoni leje",
|
||||
"Change topic": "Ndryshoni temë",
|
||||
"Modify widgets": "Modifikoni widget-e",
|
||||
"Default role": "Rol parazgjedhje",
|
||||
"Send messages": "Dërgoni mesazhe",
|
||||
"Invite users": "Ftoni përdorues",
|
||||
"Change settings": "Ndryshoni rregullime",
|
||||
"Kick users": "Përzini përdoruesi",
|
||||
"Ban users": "Dëboni përdorues",
|
||||
"Remove messages": "Hiqni mesazhe",
|
||||
"Notify everyone": "Njoftoni gjithëkënd",
|
||||
"Send %(eventType)s events": "Dërgo akte %(eventType)s",
|
||||
"Select the roles required to change various parts of the room": "Përzgjidhni rolet e domosdoshme për të ndryshuar anë të ndryshme të dhomës",
|
||||
"Enable encryption?": "Të aktivizohet fshehtëzim?",
|
||||
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. <a>Learn more about encryption.</a>": "Pasi të aktivizohet, fshehtëzimi për një dhomë nuk mund të çaktivizohet. Mesazhet e dërguar në një dhomë të fshehtëzuar s’mund të shihen nga shërbyesi, vetëm nga pjesëmarrësit në dhomë. Aktivizimi i fshehtëzimit mund të pengojë funksionimin si duhet të mjaft robotëve dhe urave. <a>Mësoni më tepër rreth fshehtëzimit.</a>",
|
||||
"Want more than a community? <a>Get your own server</a>": "Doni më shumë se një bashkësi? <a>Merrni një shërbyes tuajin</a>",
|
||||
"You are logged in to another account": "Jeni futur në një tjetër llogari",
|
||||
"Thank you for verifying your email! The account you're logged into here (%(sessionUserId)s) appears to be different from the account you've verified an email for (%(verifiedUserId)s). If you would like to log in to %(verifiedUserId2)s, please log out first.": "Faleminderit për verifikimin e email-it tuaj! Llogaria ku keni hyrë këtu (%(sessionUserId)s) duket të jetë tjetër nga llogaria për të cilën verifikuat një (%(verifiedUserId)s). Nëse doni të bëni hyrjen te %(verifiedUserId2)s, së pari, ju lutemi, bëni daljen."
|
||||
}
|
||||
|
@ -32,6 +32,8 @@ import Matrix from 'matrix-js-sdk';
|
||||
const test_utils = require('test-utils');
|
||||
const mockclock = require('mock-clock');
|
||||
|
||||
import Velocity from 'velocity-animate';
|
||||
|
||||
let client;
|
||||
const room = new Matrix.Room();
|
||||
|
||||
@ -72,9 +74,17 @@ describe('MessagePanel', function() {
|
||||
|
||||
// HACK: We assume all settings want to be disabled
|
||||
SettingsStore.getValue = sinon.stub().returns(false);
|
||||
|
||||
// This option clobbers the duration of all animations to be 1ms
|
||||
// which makes unit testing a lot simpler (the animation doesn't
|
||||
// complete without this even if we mock the clock and tick it
|
||||
// what should be the correct amount of time).
|
||||
Velocity.mock = true;
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
delete Velocity.mock;
|
||||
|
||||
clock.uninstall();
|
||||
sandbox.restore();
|
||||
});
|
||||
|
27
yarn.lock
27
yarn.lock
@ -3956,7 +3956,7 @@ jest-regex-util@^24.3.0:
|
||||
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36"
|
||||
integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==
|
||||
|
||||
"jquery@>= 1.4.3", jquery@^3.3.1:
|
||||
jquery@^3.3.1:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
|
||||
integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==
|
||||
@ -4065,10 +4065,10 @@ just-extend@^4.0.2:
|
||||
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc"
|
||||
integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==
|
||||
|
||||
karma-chrome-launcher@^0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-0.2.3.tgz#4c6d700d163a9d34c618efd87918be49e7a4a8c9"
|
||||
integrity sha1-TG1wDRY6nTTGGO/YeRi+SeekqMk=
|
||||
karma-chrome-launcher@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf"
|
||||
integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==
|
||||
dependencies:
|
||||
fs-access "^1.0.0"
|
||||
which "^1.2.1"
|
||||
@ -4371,10 +4371,10 @@ math-random@^1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
|
||||
integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
|
||||
|
||||
matrix-js-sdk@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-1.0.1.tgz#783efc501e2521997869cfe8e719134d9e10a45c"
|
||||
integrity sha512-+ErnXHfkxOoRHUYbY/R+2ZHvPKdPCx/eoYjb2Oy7L9pBqCNllI0WRVsro6oqRJQs0krVP8blyIjWOJynWSw96g==
|
||||
matrix-js-sdk@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-1.0.2.tgz#482d8d2076c7565cf7354722e96c9971e372182a"
|
||||
integrity sha512-4WCBJFSoOLelHi7IUAcVxPQF+gTc/i9NUKZ77qwUfcZVED8VKTIyWZnwpeLgocK5gAOJV9fkAyO5mny9SkZaGg==
|
||||
dependencies:
|
||||
another-json "^0.2.0"
|
||||
babel-runtime "^6.26.0"
|
||||
@ -6851,11 +6851,10 @@ validate-npm-package-license@^3.0.1:
|
||||
spdx-correct "^3.0.0"
|
||||
spdx-expression-parse "^3.0.0"
|
||||
|
||||
"velocity-vector@github:vector-im/velocity#059e3b2":
|
||||
version "1.2.3"
|
||||
resolved "https://codeload.github.com/vector-im/velocity/tar.gz/059e3b2348f1110888d033974d3109fd5a3af00f"
|
||||
dependencies:
|
||||
jquery ">= 1.4.3"
|
||||
velocity-animate@^1.5.2:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105"
|
||||
integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==
|
||||
|
||||
verror@1.10.0:
|
||||
version "1.10.0"
|
||||
|
Loading…
Reference in New Issue
Block a user