From 237084da7866432321ac52fcc7de74e8ec6c1075 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 11 Apr 2020 23:46:58 +0100 Subject: [PATCH 001/319] wrap node-qrcode in a React FC and use it for ShareDialog instead of qrcode-react Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 2 +- res/css/views/dialogs/_ShareDialog.scss | 9 +- src/components/views/dialogs/ShareDialog.js | 4 +- src/components/views/elements/QRCode.tsx | 50 +++++ yarn.lock | 214 ++------------------ 5 files changed, 77 insertions(+), 202 deletions(-) create mode 100644 src/components/views/elements/QRCode.tsx diff --git a/package.json b/package.json index 616f3f541e..02ec206ee3 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "project-name-generator": "^2.1.7", "prop-types": "^15.5.8", "qrcode": "^1.4.4", - "qrcode-react": "^0.1.16", "qs": "^6.6.0", "react": "^16.9.0", "react-addons-css-transition-group": "15.6.2", @@ -118,6 +117,7 @@ "@babel/register": "^7.7.4", "@peculiar/webcrypto": "^1.0.22", "@types/classnames": "^2.2.10", + "@types/qrcode": "^1.3.4", "@types/react": "16.9", "babel-eslint": "^10.0.3", "babel-jest": "^24.9.0", diff --git a/res/css/views/dialogs/_ShareDialog.scss b/res/css/views/dialogs/_ShareDialog.scss index 9a2f67dea3..3c984bbd1b 100644 --- a/res/css/views/dialogs/_ShareDialog.scss +++ b/res/css/views/dialogs/_ShareDialog.scss @@ -64,12 +64,15 @@ limitations under the License. .mx_ShareDialog_qrcode_container { float: left; - background-color: #ffffff; - padding: 5px; // makes qr code more readable in dark theme - border-radius: 5px; height: 256px; width: 256px; margin-right: 64px; + + img { + width: 100%; + height: 100%; + border-radius: 8px; + } } .mx_ShareDialog_social_container { diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index 1bc9decd39..a2554c3dcf 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import {Room, User, Group, RoomMember, MatrixEvent} from 'matrix-js-sdk'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; -import QRCode from 'qrcode-react'; +import QRCode from "../elements/QRCode"; import {RoomPermalinkCreator, makeGroupPermalink, makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import * as ContextMenu from "../../structures/ContextMenu"; import {toRightOf} from "../../structures/ContextMenu"; @@ -213,7 +213,7 @@ export default class ShareDialog extends React.Component {
- +
{ diff --git a/src/components/views/elements/QRCode.tsx b/src/components/views/elements/QRCode.tsx new file mode 100644 index 0000000000..5e5db8cf93 --- /dev/null +++ b/src/components/views/elements/QRCode.tsx @@ -0,0 +1,50 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import * as React from "react"; +import {toDataURL, QRCodeSegment, QRCodeToDataURLOptions} from "qrcode"; + +import {_t} from "../../../languageHandler"; +import Spinner from "./Spinner"; + +interface IProps extends QRCodeToDataURLOptions { + data: string | QRCodeSegment[]; +} + +const defaultOptions: QRCodeToDataURLOptions = { + errorCorrectionLevel: 'L', // we want it as trivial-looking as possible +}; + +const QRCode: React.FC = ({data, ...options}) => { + const [dataUri, setUri] = React.useState(null); + React.useEffect(() => { + let cancelled = false; + toDataURL(data, {...defaultOptions, ...options}).then(uri => { + if (cancelled) return; + setUri(uri); + }); + return () => { + cancelled = true; + }; + }, [data, options]); + + + return
+ { dataUri ? {_t("QR: } +
; +}; + +export default QRCode; diff --git a/yarn.lock b/yarn.lock index 538a049bff..05716ae985 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1267,6 +1267,13 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== +"@types/qrcode@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.3.4.tgz#984d97bb72caa558d470158701081ccb712f616b" + integrity sha512-aILE5yvKaqQXlY0YPMEYwK/KwdD43fwQTyagj0ffBBTQj8h//085Zp8LUrOnZ9FT69x64f5UgDo0EueY4BPAdg== + dependencies: + "@types/node" "*" + "@types/react@16.9": version "16.9.32" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" @@ -1496,11 +1503,6 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - acorn-globals@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -1634,19 +1636,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2553,11 +2547,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2803,7 +2792,7 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2879,11 +2868,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -2897,11 +2881,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -3916,13 +3895,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -3985,20 +3957,6 @@ fuse.js@^2.2.0: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-2.7.4.tgz#96e420fde7ef011ac49c258a621314fe576536f9" integrity sha1-luQg/efvARrEnCWKYhMU/ldlNvk= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -4196,11 +4154,6 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -4388,7 +4341,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4405,13 +4358,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -5975,21 +5921,6 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, "minimist@~ 1.2.0": resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -6014,7 +5945,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -6091,15 +6022,6 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a" - integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -6177,35 +6099,11 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.53: version "1.1.53" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -6238,27 +6136,6 @@ normalize-selector@^0.2.0: resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6266,16 +6143,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -6425,11 +6292,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -6439,19 +6301,11 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -7006,18 +6860,6 @@ pvutils@latest: resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.0.17.tgz#ade3c74dfe7178944fe44806626bd2e249d996bf" integrity sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ== -qr.js@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" - integrity sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8= - -qrcode-react@^0.1.16: - version "0.1.16" - resolved "https://registry.yarnpkg.com/qrcode-react/-/qrcode-react-0.1.16.tgz#d064999d510ffc3e55a9ca3ffcf6c203c69f1517" - integrity sha512-FK+QCfFqCQMSxUE1byzglERJQkwKqXYvYMCS+/Ad2zACJOfoHkHHtRqsQQPji7lfb1y1qCXLvL+3eP1hAfg8Ng== - dependencies: - qr.js "0.0.0" - qrcode@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" @@ -7096,7 +6938,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@1.2.8, rc@^1.2.7, rc@^1.2.8: +rc@1.2.8, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7254,7 +7096,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7614,7 +7456,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -7776,7 +7618,7 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -8112,7 +7954,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8393,19 +8235,6 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - terser-webpack-plugin@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" @@ -9128,13 +8957,6 @@ which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -9219,7 +9041,7 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 610fab7857d32ab9af557eae8fac1a1211d02713 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 11 Apr 2020 23:53:24 +0100 Subject: [PATCH 002/319] i18n and delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/QRCode.tsx | 2 +- src/i18n/strings/en_EN.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/elements/QRCode.tsx b/src/components/views/elements/QRCode.tsx index 5e5db8cf93..9c867058c0 100644 --- a/src/components/views/elements/QRCode.tsx +++ b/src/components/views/elements/QRCode.tsx @@ -43,7 +43,7 @@ const QRCode: React.FC = ({data, ...options}) => { return
- { dataUri ? {_t("QR: } + { dataUri ? {_t("QR : }
; }; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ae8ed90402..832b53e67c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1482,6 +1482,7 @@ "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes", "Power level": "Power level", "Custom level": "Custom level", + "QR Code": "QR Code", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.", "In reply to ": "In reply to ", "Room alias": "Room alias", From 3962c98c9beaeee3f1685e63fe3604ed8a1a68eb Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Thu, 23 Apr 2020 22:53:02 +0300 Subject: [PATCH 003/319] Ensure PersistedElements are refreshed when AuxPanel scrolls If the screen is not tall enough, AuxPanel starts scrolling its content. If it contains PersistedElements, they need to be notified about scrolling as they only listen on resize events to move their element. Signed-off-by: Pauli Virtanen --- src/components/views/rooms/AuxPanel.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/AuxPanel.js b/src/components/views/rooms/AuxPanel.js index e102b0dba4..00bdb1c45a 100644 --- a/src/components/views/rooms/AuxPanel.js +++ b/src/components/views/rooms/AuxPanel.js @@ -141,6 +141,15 @@ export default createReactClass({ return counters; }, + _onScroll: function(rect) { + if (this.props.onResize) { + this.props.onResize(); + } + + /* Force refresh of PersistedElements which may be partially hidden */ + window.dispatchEvent(new Event('resize')); + }, + render: function() { const CallView = sdk.getComponent("voip.CallView"); const TintableSvg = sdk.getComponent("elements.TintableSvg"); @@ -265,7 +274,7 @@ export default createReactClass({ } return ( - + { stateViews } { appsDrawer } { fileDropTarget } From e16f5115276466256c223502a04eb2ee451ca868 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 24 Apr 2020 15:07:39 +0100 Subject: [PATCH 004/319] Redesign redactions Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 2 +- .../{_UnknownBody.scss => _RedactedBody.scss} | 23 +++++++++- res/css/views/rooms/_EventTile.scss | 28 ------------ res/img/feather-customised/trash (custom).svg | 7 +++ .../views/messages/EditHistoryMessage.js | 4 +- src/components/views/messages/MessageEvent.js | 5 +-- .../views/messages/RedactedBody.tsx | 45 +++++++++++++++++++ src/components/views/messages/UnknownBody.js | 40 ----------------- src/i18n/strings/en_EN.json | 5 +-- 9 files changed, 80 insertions(+), 79 deletions(-) rename res/css/views/messages/{_UnknownBody.scss => _RedactedBody.scss} (52%) create mode 100644 res/img/feather-customised/trash (custom).svg create mode 100644 src/components/views/messages/RedactedBody.tsx delete mode 100644 src/components/views/messages/UnknownBody.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 0ba2b609e8..0344074369 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -140,10 +140,10 @@ @import "./views/messages/_ReactionsRow.scss"; @import "./views/messages/_ReactionsRowButton.scss"; @import "./views/messages/_ReactionsRowButtonTooltip.scss"; +@import "./views/messages/_RedactedBody.scss"; @import "./views/messages/_RoomAvatarEvent.scss"; @import "./views/messages/_SenderProfile.scss"; @import "./views/messages/_TextualEvent.scss"; -@import "./views/messages/_UnknownBody.scss"; @import "./views/messages/_ViewSourceEvent.scss"; @import "./views/messages/_common_CryptoEvent.scss"; @import "./views/right_panel/_EncryptionInfo.scss"; diff --git a/res/css/views/messages/_UnknownBody.scss b/res/css/views/messages/_RedactedBody.scss similarity index 52% rename from res/css/views/messages/_UnknownBody.scss rename to res/css/views/messages/_RedactedBody.scss index 9036e12bf0..c0001db5d3 100644 --- a/res/css/views/messages/_UnknownBody.scss +++ b/res/css/views/messages/_RedactedBody.scss @@ -1,5 +1,6 @@ /* -Copyright 2015, 2016 OpenMarket Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -11,6 +12,24 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_UnknownBody { +.mx_RedactedBody { white-space: pre-wrap; + color: $muted-fg-color; + + padding-left: 16px; + position: relative; + + &::before { + height: 14px; + width: 14px; + background-color: $muted-fg-color; + mask-image: url('$(res)/img/feather-customised/trash (custom).svg'); + mask-repeat: no-repeat; + mask-position: center; + mask-size: contain; + content: ''; + position: absolute; + top: 2px; + left: 0; + } } diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 0dc60226b8..3f5f039005 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -242,34 +242,6 @@ limitations under the License. color: $event-notsent-color; } -.mx_EventTile_redacted .mx_EventTile_line .mx_UnknownBody, -.mx_EventTile_redacted .mx_EventTile_reply .mx_UnknownBody { - --lozenge-color: $event-redacted-fg-color; - --lozenge-border-color: $event-redacted-border-color; - display: block; - height: 22px; - width: 250px; - border-radius: 11px; - background: - repeating-linear-gradient( - -45deg, - var(--lozenge-color), - var(--lozenge-color) 3px, - transparent 3px, - transparent 6px - ); - box-shadow: 0px 0px 3px var(--lozenge-border-color) inset; -} - -.mx_EventTile_sending.mx_EventTile_redacted .mx_UnknownBody { - opacity: 0.4; -} - -div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { - --lozenge-color: $event-notsent-color; - --lozenge-border-color: $event-notsent-color; -} - .mx_EventTile_contextual { opacity: 0.4; } diff --git a/res/img/feather-customised/trash (custom).svg b/res/img/feather-customised/trash (custom).svg new file mode 100644 index 0000000000..dc1985ddb2 --- /dev/null +++ b/res/img/feather-customised/trash (custom).svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/components/views/messages/EditHistoryMessage.js b/src/components/views/messages/EditHistoryMessage.js index 679a8f7471..e0ca23d244 100644 --- a/src/components/views/messages/EditHistoryMessage.js +++ b/src/components/views/messages/EditHistoryMessage.js @@ -26,6 +26,7 @@ import * as sdk from '../../../index'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import Modal from '../../../Modal'; import classNames from 'classnames'; +import RedactedBody from "./RedactedBody"; function getReplacedContent(event) { const originalContent = event.getOriginalContent(); @@ -132,8 +133,7 @@ export default class EditHistoryMessage extends React.PureComponent { const content = getReplacedContent(mxEvent); let contentContainer; if (mxEvent.isRedacted()) { - const UnknownBody = sdk.getComponent('messages.UnknownBody'); - contentContainer = ; + contentContainer = ; } else { let contentElements; if (this.props.previousEdit) { diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index beba986104..f8bd23cbe3 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -20,6 +20,7 @@ import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; import SettingsStore from "../../../settings/SettingsStore"; import {Mjolnir} from "../../../mjolnir/Mjolnir"; +import RedactedBody from "./RedactedBody"; export default createReactClass({ displayName: 'MessageEvent', @@ -61,8 +62,6 @@ export default createReactClass({ }, render: function() { - const UnknownBody = sdk.getComponent('messages.UnknownBody'); - const bodyTypes = { 'm.text': sdk.getComponent('messages.TextualBody'), 'm.notice': sdk.getComponent('messages.TextualBody'), @@ -79,7 +78,7 @@ export default createReactClass({ const content = this.props.mxEvent.getContent(); const type = this.props.mxEvent.getType(); const msgtype = content.msgtype; - let BodyType = UnknownBody; + let BodyType = RedactedBody; if (!this.props.mxEvent.isRedacted()) { // only resolve BodyType if event is not redacted if (type && evTypes[type]) { diff --git a/src/components/views/messages/RedactedBody.tsx b/src/components/views/messages/RedactedBody.tsx new file mode 100644 index 0000000000..f219e3bd91 --- /dev/null +++ b/src/components/views/messages/RedactedBody.tsx @@ -0,0 +1,45 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React, {useContext} from "react"; +import {MatrixClient} from "matrix-js-sdk/src/client"; +import {MatrixEvent} from "matrix-js-sdk/src/models/event"; +import { _t } from "../../../languageHandler"; +import MatrixClientContext from "../../../contexts/MatrixClientContext"; + +interface IProps { + mxEvent: MatrixEvent; +} + +const RedactedBody = React.forwardRef(({mxEvent}, ref) => { + const cli: MatrixClient = useContext(MatrixClientContext); + + let text = _t("Message deleted"); + const redactedBecauseUserId = mxEvent.getUnsigned().redacted_because.sender; + if (redactedBecauseUserId !== cli.getUserId()) { + const room = cli.getRoom(mxEvent.getRoomId()); + const sender = room && room.getMember(redactedBecauseUserId); + text = _t("Message deleted by %(user)s", { user: sender.name || redactedBecauseUserId }); + } + + return ( + + { text } + + ); +}); + +export default RedactedBody; diff --git a/src/components/views/messages/UnknownBody.js b/src/components/views/messages/UnknownBody.js deleted file mode 100644 index 2a19f324e8..0000000000 --- a/src/components/views/messages/UnknownBody.js +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from 'react'; -import createReactClass from 'create-react-class'; -import { _t } from '../../../languageHandler'; - -export default createReactClass({ - displayName: 'UnknownBody', - - render: function() { - let tooltip = _t("Removed or unknown message type"); - if (this.props.mxEvent.isRedacted()) { - const redactedBecauseUserId = this.props.mxEvent.getUnsigned().redacted_because.sender; - tooltip = redactedBecauseUserId ? - _t("Message removed by %(userId)s", { userId: redactedBecauseUserId }) : - _t("Message removed"); - } - - const text = this.props.mxEvent.getContent().body; - return ( - - { text } - - ); - }, -}); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3eac055054..356e80afcf 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1328,6 +1328,8 @@ "Reactions": "Reactions", " reacted with %(content)s": " reacted with %(content)s", "reacted with %(shortName)s": "reacted with %(shortName)s", + "Message deleted": "Message deleted", + "Message deleted by %(user)s": "Message deleted by %(user)s", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s changed the room avatar to ", @@ -1341,9 +1343,6 @@ "edited": "edited", "Can't load this message": "Can't load this message", "Submit logs": "Submit logs", - "Removed or unknown message type": "Removed or unknown message type", - "Message removed by %(userId)s": "Message removed by %(userId)s", - "Message removed": "Message removed", "Failed to load group members": "Failed to load group members", "Filter community members": "Filter community members", "Invite to this community": "Invite to this community", From d3b0e008c1b80acecd537c728c20cb9894d9f550 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 24 Apr 2020 15:39:23 +0100 Subject: [PATCH 005/319] first draft of Redaction ELS Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/messages/_RedactedBody.scss | 1 + src/components/structures/MessagePanel.js | 100 +++++++++++++++++- .../elements/RedactionEventListSummary.tsx | 81 ++++++++++++++ .../views/messages/RedactedBody.tsx | 2 +- src/i18n/strings/en_EN.json | 4 +- 5 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 src/components/views/elements/RedactionEventListSummary.tsx diff --git a/res/css/views/messages/_RedactedBody.scss b/res/css/views/messages/_RedactedBody.scss index c0001db5d3..c0e5be2c89 100644 --- a/res/css/views/messages/_RedactedBody.scss +++ b/res/css/views/messages/_RedactedBody.scss @@ -15,6 +15,7 @@ limitations under the License. .mx_RedactedBody { white-space: pre-wrap; color: $muted-fg-color; + vertical-align: middle; padding-left: 16px; position: relative; diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 6fbfdb504b..30c139d440 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -29,6 +29,7 @@ import SettingsStore from '../../settings/SettingsStore'; import {_t} from "../../languageHandler"; import {haveTileForEvent} from "../views/rooms/EventTile"; import {textForEvent} from "../../TextForEvent"; +import RedactionEventListSummary from "../views/elements/RedactionEventListSummary"; const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes const continuedTypes = ['m.sticker', 'm.room.message']; @@ -1062,5 +1063,102 @@ class MemberGrouper { } } +// Wrap consecutive redactions by the same user in a ListSummary, ignore if redacted +class RedactionGrouper { + static canStartGroup = function(panel, ev) { + return panel._shouldShowEvent(ev) && ev.isRedacted(); + } + + constructor(panel, ev, prevEvent, lastShownEvent) { + this.panel = panel; + this.readMarker = panel._readMarkerForEvent( + ev.getId(), + ev === lastShownEvent, + ); + this.events = [ev]; + this.prevEvent = prevEvent; + this.lastShownEvent = lastShownEvent; + } + + shouldGroup(ev) { + if (this.panel._wantsDateSeparator(this.events[0], ev.getDate())) return false; + if (ev.getType() === "m.room.redaction") return true; // for show-hidden-events users + return ev.isRedacted() && ev.sender === this.events[0].sender && + ev.getUnsigned().redacted_because.sender === this.events[0].getUnsigned().redacted_because.sender; + } + + add(ev) { + if (ev.getType() === "m.room.redaction") return; // for show-hidden-events users + this.readMarker = this.readMarker || this.panel._readMarkerForEvent( + ev.getId(), + ev === this.lastShownEvent, + ); + this.events.push(ev); + } + + getTiles() { + // If we don't have any events to group, don't even try to group them. The logic + // below assumes that we have a group of events to deal with, but we might not if + // the events we were supposed to group were redacted. + if (!this.events || !this.events.length) return []; + + const DateSeparator = sdk.getComponent('messages.DateSeparator'); + + const panel = this.panel; + const lastShownEvent = this.lastShownEvent; + const ret = []; + + if (panel._wantsDateSeparator(this.prevEvent, this.events[0].getDate())) { + const ts = this.events[0].getTs(); + ret.push( +
  • , + ); + } + + // Ensure that the key of the MemberEventListSummary does not change with new + // member events. This will prevent it from being re-created unnecessarily, and + // instead will allow new props to be provided. In turn, the shouldComponentUpdate + // method on ELS can be used to prevent unnecessary renderings. + const key = "redactioneventlistsummary-" + (this.prevEvent ? this.events[0].getId() : "initial"); + + let highlightInMels = false; + let eventTiles = this.events.map((e) => { + if (e.getId() === panel.props.highlightedEventId) { + highlightInMels = true; + } + // In order to prevent DateSeparators from appearing in the expanded form + // of MemberEventListSummary, render each member event as if the previous + // one was itself. This way, the timestamp of the previous event === the + // timestamp of the current event, and no DateSeparator is inserted. + return panel._getTilesForEvent(e, e, e === lastShownEvent); + }).reduce((a, b) => a.concat(b), []); + + if (eventTiles.length === 0) { + eventTiles = null; + } + + ret.push( + + { eventTiles } + , + ); + + if (this.readMarker) { + ret.push(this.readMarker); + } + + return ret; + } + + getNewPrevEvent() { + return this.events[0]; + } +} + // all the grouper classes that we use -const groupers = [CreationGrouper, MemberGrouper]; +const groupers = [CreationGrouper, MemberGrouper, RedactionGrouper]; diff --git a/src/components/views/elements/RedactionEventListSummary.tsx b/src/components/views/elements/RedactionEventListSummary.tsx new file mode 100644 index 0000000000..55538ca236 --- /dev/null +++ b/src/components/views/elements/RedactionEventListSummary.tsx @@ -0,0 +1,81 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; +import {MatrixClient} from "matrix-js-sdk/src/client"; +import {MatrixEvent} from "matrix-js-sdk/src/models/event"; + +import { _t } from "../../../languageHandler"; +import * as sdk from "../../../index"; +import MatrixClientContext from "../../../contexts/MatrixClientContext"; + +interface IProps { + // An array of member events to summarise + events: MatrixEvent[]; + // An array of EventTiles to render when expanded + children: React.ReactChildren; + // The minimum number of events needed to trigger summarisation + threshold?: number; + // Called when the ELS expansion is toggled + onToggle: () => void; + // Whether or not to begin with state.expanded=true + startExpanded?: boolean; +} + +export default class RedactionEventListSummary extends React.Component { + static displayName = "RedactionEventListSummary"; + + static defaultProps = { + threshold: 2, + }; + + static contextType = MatrixClientContext; + + shouldComponentUpdate(nextProps) { + // Update if + // - The number of summarised events has changed + // - or if the summary is about to toggle to become collapsed + // - or if there are fewEvents, meaning the child eventTiles are shown as-is + return ( + nextProps.events.length !== this.props.events.length || + nextProps.events.length < this.props.threshold + ); + } + + render() { + const count = this.props.events.length; + const redactionSender = this.props.events[0].getUnsigned().redacted_because.sender; + + let avatarMember = this.props.events[0].sender; + let summaryText = _t("%(count)s messages deleted", { count }); + if (redactionSender !== this.context.getUserId()) { + const room = (this.context as MatrixClient).getRoom(redactionSender || this.props.events[0].getSender()); + avatarMember = room && room.getMember(redactionSender); + const name = avatarMember ? avatarMember.name : redactionSender; + summaryText = _t("%(count)s messages deleted by %(name)s", { count, name }); + } + + const EventListSummary = sdk.getComponent("views.elements.EventListSummary"); + return ; + } +} diff --git a/src/components/views/messages/RedactedBody.tsx b/src/components/views/messages/RedactedBody.tsx index f219e3bd91..654f1622b1 100644 --- a/src/components/views/messages/RedactedBody.tsx +++ b/src/components/views/messages/RedactedBody.tsx @@ -32,7 +32,7 @@ const RedactedBody = React.forwardRef(({mxEvent}, ref) => { if (redactedBecauseUserId !== cli.getUserId()) { const room = cli.getRoom(mxEvent.getRoomId()); const sender = room && room.getMember(redactedBecauseUserId); - text = _t("Message deleted by %(user)s", { user: sender.name || redactedBecauseUserId }); + text = _t("Message deleted by %(name)s", { name: sender ? sender.name : redactedBecauseUserId }); } return ( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 356e80afcf..53818d4747 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1329,7 +1329,7 @@ " reacted with %(content)s": " reacted with %(content)s", "reacted with %(shortName)s": "reacted with %(shortName)s", "Message deleted": "Message deleted", - "Message deleted by %(user)s": "Message deleted by %(user)s", + "Message deleted by %(name)s": "Message deleted by %(name)s", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s changed the room avatar to ", @@ -1487,6 +1487,8 @@ "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes", "Power level": "Power level", "Custom level": "Custom level", + "%(count)s messages deleted|other": "%(count)s messages deleted", + "%(count)s messages deleted by %(name)s|other": "%(count)s messages deleted by %(name)s", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.", "In reply to ": "In reply to ", "Room alias": "Room alias", From d690d4bed2cb1562fface956ed0c4e34e4e35c54 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Tue, 21 Apr 2020 01:19:39 +0300 Subject: [PATCH 006/319] Prevent PersistedElements overflowing scrolled areas As the DOM element is not in reality contained inside "the parent", it may overflow the area if the parent gets partially hidden by scrolling etc. To make the effect visually less annoying, emulate this by clipping to the element wrapper. This is not a full general-purpose fix, but improves the current situation. Signed-off-by: Pauli Virtanen --- res/css/views/rooms/_AppsDrawer.scss | 4 ++ .../views/elements/PersistedElement.js | 58 ++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss index 1b1bab67bc..e4743f189e 100644 --- a/res/css/views/rooms/_AppsDrawer.scss +++ b/res/css/views/rooms/_AppsDrawer.scss @@ -96,6 +96,10 @@ $AppsDrawerBodyHeight: 273px; height: $AppsDrawerBodyHeight; } +.mx_AppTile_persistedWrapper > div { + height: 100%; +} + .mx_AppTile_mini .mx_AppTile_persistedWrapper { height: 114px; } diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index 53f2501f19..18fa2aafef 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -156,16 +156,70 @@ export default class PersistedElement extends React.Component { child.style.display = visible ? 'block' : 'none'; } + /* + * Clip element bounding rectangle to that of the parent elements. + * This is not a full visibility check, but prevents the persisted + * element from overflowing parent containers when inside a scrolled + * area. + */ + _getClippedBoundingClientRect(element) { + let parentElement = element.parentElement; + let rect = element.getBoundingClientRect(); + + rect = new DOMRect(rect.left, rect.top, rect.width, rect.height); + + while (parentElement) { + const parentRect = parentElement.getBoundingClientRect(); + + if (parentRect.left > rect.left) { + rect.width = rect.width - (parentRect.left - rect.left); + rect.x = parentRect.x; + } + + if (parentRect.top > rect.top) { + rect.height = rect.height - (parentRect.top - rect.top); + rect.y = parentRect.y; + } + + if (parentRect.right < rect.right) { + rect.width = rect.width - (rect.right - parentRect.right); + } + + if (parentRect.bottom < rect.bottom) { + rect.height = rect.height - (rect.bottom - parentRect.bottom); + } + + parentElement = parentElement.parentElement; + } + + if (rect.width < 0) rect.width = 0; + if (rect.height < 0) rect.height = 0; + + return rect; + } + updateChildPosition(child, parent) { if (!child || !parent) return; const parentRect = parent.getBoundingClientRect(); + const clipRect = this._getClippedBoundingClientRect(parent); + + Object.assign(child.parentElement.style, { + position: 'absolute', + top: clipRect.top + 'px', + left: clipRect.left + 'px', + width: clipRect.width + 'px', + height: clipRect.height + 'px', + overflow: "hidden", + }); + Object.assign(child.style, { position: 'absolute', - top: parentRect.top + 'px', - left: parentRect.left + 'px', + top: (parentRect.top - clipRect.top) + 'px', + left: (parentRect.left - clipRect.left) + 'px', width: parentRect.width + 'px', height: parentRect.height + 'px', + overflow: "hidden", }); } From a399b1018ae1aa18e815dcbccdf35222ec1571ed Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Apr 2020 23:16:08 +0100 Subject: [PATCH 007/319] fix flashing `by ""` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/RedactedBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/RedactedBody.tsx b/src/components/views/messages/RedactedBody.tsx index 654f1622b1..e347e879a3 100644 --- a/src/components/views/messages/RedactedBody.tsx +++ b/src/components/views/messages/RedactedBody.tsx @@ -29,7 +29,7 @@ const RedactedBody = React.forwardRef(({mxEvent}, ref) => { let text = _t("Message deleted"); const redactedBecauseUserId = mxEvent.getUnsigned().redacted_because.sender; - if (redactedBecauseUserId !== cli.getUserId()) { + if (redactedBecauseUserId && redactedBecauseUserId !== cli.getUserId()) { const room = cli.getRoom(mxEvent.getRoomId()); const sender = room && room.getMember(redactedBecauseUserId); text = _t("Message deleted by %(name)s", { name: sender ? sender.name : redactedBecauseUserId }); From 83a4558d49021b58f30a47637ce69beb5d6b1fd3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Apr 2020 23:27:46 +0100 Subject: [PATCH 008/319] remove RedactedGrouper for now Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MessagePanel.js | 99 +------------------ .../views/elements/EventListSummary.js | 18 ++-- .../elements/RedactionEventListSummary.tsx | 81 --------------- 3 files changed, 13 insertions(+), 185 deletions(-) delete mode 100644 src/components/views/elements/RedactionEventListSummary.tsx diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 30c139d440..a83529e055 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -1063,102 +1063,5 @@ class MemberGrouper { } } -// Wrap consecutive redactions by the same user in a ListSummary, ignore if redacted -class RedactionGrouper { - static canStartGroup = function(panel, ev) { - return panel._shouldShowEvent(ev) && ev.isRedacted(); - } - - constructor(panel, ev, prevEvent, lastShownEvent) { - this.panel = panel; - this.readMarker = panel._readMarkerForEvent( - ev.getId(), - ev === lastShownEvent, - ); - this.events = [ev]; - this.prevEvent = prevEvent; - this.lastShownEvent = lastShownEvent; - } - - shouldGroup(ev) { - if (this.panel._wantsDateSeparator(this.events[0], ev.getDate())) return false; - if (ev.getType() === "m.room.redaction") return true; // for show-hidden-events users - return ev.isRedacted() && ev.sender === this.events[0].sender && - ev.getUnsigned().redacted_because.sender === this.events[0].getUnsigned().redacted_because.sender; - } - - add(ev) { - if (ev.getType() === "m.room.redaction") return; // for show-hidden-events users - this.readMarker = this.readMarker || this.panel._readMarkerForEvent( - ev.getId(), - ev === this.lastShownEvent, - ); - this.events.push(ev); - } - - getTiles() { - // If we don't have any events to group, don't even try to group them. The logic - // below assumes that we have a group of events to deal with, but we might not if - // the events we were supposed to group were redacted. - if (!this.events || !this.events.length) return []; - - const DateSeparator = sdk.getComponent('messages.DateSeparator'); - - const panel = this.panel; - const lastShownEvent = this.lastShownEvent; - const ret = []; - - if (panel._wantsDateSeparator(this.prevEvent, this.events[0].getDate())) { - const ts = this.events[0].getTs(); - ret.push( -
  • , - ); - } - - // Ensure that the key of the MemberEventListSummary does not change with new - // member events. This will prevent it from being re-created unnecessarily, and - // instead will allow new props to be provided. In turn, the shouldComponentUpdate - // method on ELS can be used to prevent unnecessary renderings. - const key = "redactioneventlistsummary-" + (this.prevEvent ? this.events[0].getId() : "initial"); - - let highlightInMels = false; - let eventTiles = this.events.map((e) => { - if (e.getId() === panel.props.highlightedEventId) { - highlightInMels = true; - } - // In order to prevent DateSeparators from appearing in the expanded form - // of MemberEventListSummary, render each member event as if the previous - // one was itself. This way, the timestamp of the previous event === the - // timestamp of the current event, and no DateSeparator is inserted. - return panel._getTilesForEvent(e, e, e === lastShownEvent); - }).reduce((a, b) => a.concat(b), []); - - if (eventTiles.length === 0) { - eventTiles = null; - } - - ret.push( - - { eventTiles } - , - ); - - if (this.readMarker) { - ret.push(this.readMarker); - } - - return ret; - } - - getNewPrevEvent() { - return this.events[0]; - } -} - // all the grouper classes that we use -const groupers = [CreationGrouper, MemberGrouper, RedactionGrouper]; +const groupers = [CreationGrouper, MemberGrouper]; diff --git a/src/components/views/elements/EventListSummary.js b/src/components/views/elements/EventListSummary.js index 79c84293c2..707b9e79b0 100644 --- a/src/components/views/elements/EventListSummary.js +++ b/src/components/views/elements/EventListSummary.js @@ -22,7 +22,8 @@ import {MatrixEvent, RoomMember} from "matrix-js-sdk"; import {useStateToggle} from "../../../hooks/useStateToggle"; import AccessibleButton from "./AccessibleButton"; -const EventListSummary = ({events, children, threshold=3, onToggle, startExpanded, summaryMembers=[], summaryText}) => { +const EventListSummary = (props) => { + const {events, children, threshold=3, onToggle, startExpanded, summaryMembers=[], summaryText, summary} = props; const [expanded, toggleExpanded] = useStateToggle(startExpanded); // Whenever expanded changes call onToggle @@ -49,6 +50,8 @@ const EventListSummary = ({events, children, threshold=3, onToggle, startExpande
     
    { children } ; + } else if (summary) { + body = summary; } else { const avatars = summaryMembers.map((m) => ); body = ( @@ -66,12 +69,12 @@ const EventListSummary = ({events, children, threshold=3, onToggle, startExpande } return ( -
    +
  • { expanded ? _t('collapse') : _t('expand') } { body } -
  • + ); }; @@ -87,10 +90,13 @@ EventListSummary.propTypes = { // Whether or not to begin with state.expanded=true startExpanded: PropTypes.bool, - // The list of room members for which to show avatars next to the summary + // The node to render as a summary when the summary is not collapsed, + // alternately summaryMembers and summaryText can be provided. + summary: PropTypes.node, + // The list of room members for which to show avatars next to the summary, ignored if summary is provided summaryMembers: PropTypes.arrayOf(PropTypes.instanceOf(RoomMember)), - // The text to show as the summary of this event list - summaryText: PropTypes.string.isRequired, + // The text to show as the summary of this event list, ignored if summary is provided + summaryText: PropTypes.string, }; export default EventListSummary; diff --git a/src/components/views/elements/RedactionEventListSummary.tsx b/src/components/views/elements/RedactionEventListSummary.tsx deleted file mode 100644 index 55538ca236..0000000000 --- a/src/components/views/elements/RedactionEventListSummary.tsx +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import {MatrixClient} from "matrix-js-sdk/src/client"; -import {MatrixEvent} from "matrix-js-sdk/src/models/event"; - -import { _t } from "../../../languageHandler"; -import * as sdk from "../../../index"; -import MatrixClientContext from "../../../contexts/MatrixClientContext"; - -interface IProps { - // An array of member events to summarise - events: MatrixEvent[]; - // An array of EventTiles to render when expanded - children: React.ReactChildren; - // The minimum number of events needed to trigger summarisation - threshold?: number; - // Called when the ELS expansion is toggled - onToggle: () => void; - // Whether or not to begin with state.expanded=true - startExpanded?: boolean; -} - -export default class RedactionEventListSummary extends React.Component { - static displayName = "RedactionEventListSummary"; - - static defaultProps = { - threshold: 2, - }; - - static contextType = MatrixClientContext; - - shouldComponentUpdate(nextProps) { - // Update if - // - The number of summarised events has changed - // - or if the summary is about to toggle to become collapsed - // - or if there are fewEvents, meaning the child eventTiles are shown as-is - return ( - nextProps.events.length !== this.props.events.length || - nextProps.events.length < this.props.threshold - ); - } - - render() { - const count = this.props.events.length; - const redactionSender = this.props.events[0].getUnsigned().redacted_because.sender; - - let avatarMember = this.props.events[0].sender; - let summaryText = _t("%(count)s messages deleted", { count }); - if (redactionSender !== this.context.getUserId()) { - const room = (this.context as MatrixClient).getRoom(redactionSender || this.props.events[0].getSender()); - avatarMember = room && room.getMember(redactionSender); - const name = avatarMember ? avatarMember.name : redactionSender; - summaryText = _t("%(count)s messages deleted by %(name)s", { count, name }); - } - - const EventListSummary = sdk.getComponent("views.elements.EventListSummary"); - return ; - } -} From c7870090f8466bff4f40ea074c36c56b68469f28 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Apr 2020 23:29:38 +0100 Subject: [PATCH 009/319] clean ups Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MessagePanel.js | 1 - src/components/views/elements/EventListSummary.js | 8 +------- src/i18n/strings/en_EN.json | 2 -- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index a83529e055..6fbfdb504b 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -29,7 +29,6 @@ import SettingsStore from '../../settings/SettingsStore'; import {_t} from "../../languageHandler"; import {haveTileForEvent} from "../views/rooms/EventTile"; import {textForEvent} from "../../TextForEvent"; -import RedactionEventListSummary from "../views/elements/RedactionEventListSummary"; const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes const continuedTypes = ['m.sticker', 'm.room.message']; diff --git a/src/components/views/elements/EventListSummary.js b/src/components/views/elements/EventListSummary.js index 707b9e79b0..bf0f8ea133 100644 --- a/src/components/views/elements/EventListSummary.js +++ b/src/components/views/elements/EventListSummary.js @@ -22,8 +22,7 @@ import {MatrixEvent, RoomMember} from "matrix-js-sdk"; import {useStateToggle} from "../../../hooks/useStateToggle"; import AccessibleButton from "./AccessibleButton"; -const EventListSummary = (props) => { - const {events, children, threshold=3, onToggle, startExpanded, summaryMembers=[], summaryText, summary} = props; +const EventListSummary = ({events, children, threshold=3, onToggle, startExpanded, summaryMembers=[], summaryText}) => { const [expanded, toggleExpanded] = useStateToggle(startExpanded); // Whenever expanded changes call onToggle @@ -50,8 +49,6 @@ const EventListSummary = (props) => {
     
    { children } ; - } else if (summary) { - body = summary; } else { const avatars = summaryMembers.map((m) => ); body = ( @@ -90,9 +87,6 @@ EventListSummary.propTypes = { // Whether or not to begin with state.expanded=true startExpanded: PropTypes.bool, - // The node to render as a summary when the summary is not collapsed, - // alternately summaryMembers and summaryText can be provided. - summary: PropTypes.node, // The list of room members for which to show avatars next to the summary, ignored if summary is provided summaryMembers: PropTypes.arrayOf(PropTypes.instanceOf(RoomMember)), // The text to show as the summary of this event list, ignored if summary is provided diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index de3f88c244..8785b5e244 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1488,8 +1488,6 @@ "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes", "Power level": "Power level", "Custom level": "Custom level", - "%(count)s messages deleted|other": "%(count)s messages deleted", - "%(count)s messages deleted by %(name)s|other": "%(count)s messages deleted by %(name)s", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.", "In reply to ": "In reply to ", "Room alias": "Room alias", From a5830c229ec62448cb014d3552955552be0f3ec6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Apr 2020 23:30:40 +0100 Subject: [PATCH 010/319] more tidying Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/EventListSummary.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/EventListSummary.js b/src/components/views/elements/EventListSummary.js index bf0f8ea133..5a4a6e4f5a 100644 --- a/src/components/views/elements/EventListSummary.js +++ b/src/components/views/elements/EventListSummary.js @@ -87,9 +87,9 @@ EventListSummary.propTypes = { // Whether or not to begin with state.expanded=true startExpanded: PropTypes.bool, - // The list of room members for which to show avatars next to the summary, ignored if summary is provided + // The list of room members for which to show avatars next to the summary summaryMembers: PropTypes.arrayOf(PropTypes.instanceOf(RoomMember)), - // The text to show as the summary of this event list, ignored if summary is provided + // The text to show as the summary of this event list summaryText: PropTypes.string, }; From 3e35cffae7ffb4ab6447f75464b84df82176a84d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Apr 2020 23:53:32 +0100 Subject: [PATCH 011/319] null-guards Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/RedactedBody.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/messages/RedactedBody.tsx b/src/components/views/messages/RedactedBody.tsx index e347e879a3..5dada64b52 100644 --- a/src/components/views/messages/RedactedBody.tsx +++ b/src/components/views/messages/RedactedBody.tsx @@ -28,8 +28,9 @@ const RedactedBody = React.forwardRef(({mxEvent}, ref) => { const cli: MatrixClient = useContext(MatrixClientContext); let text = _t("Message deleted"); - const redactedBecauseUserId = mxEvent.getUnsigned().redacted_because.sender; - if (redactedBecauseUserId && redactedBecauseUserId !== cli.getUserId()) { + const unsigned = mxEvent.getUnsigned(); + const redactedBecauseUserId = unsigned && unsigned.redacted_because && unsigned.redacted_because.sender; + if (redactedBecauseUserId && redactedBecauseUserId !== mxEvent.getSender()) { const room = cli.getRoom(mxEvent.getRoomId()); const sender = room && room.getMember(redactedBecauseUserId); text = _t("Message deleted by %(name)s", { name: sender ? sender.name : redactedBecauseUserId }); From eaf8cf9170fb67cc00b86f3965cd6c5e490c23ec Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Mon, 4 May 2020 12:57:37 +0000 Subject: [PATCH 012/319] Translated using Weblate (German) Currently translated at 78.2% (1801 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 083ca396fc..e69aadcb39 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1862,5 +1862,14 @@ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Gibt den per SMS an +%(msisdn)s gesendeten Bestätigungscode ein.", "Someone is using an unknown session": "Jemand verwendet eine unbekannte Sitzung", "This room is end-to-end encrypted": "Dieser Raum ist Ende-zu-Ende verschlüsselt", - "You are not subscribed to any lists": "Du hast keine Listen abonniert" + "You are not subscribed to any lists": "Du hast keine Listen abonniert", + "Error adding ignored user/server": "Fehler beim Hinzufügen eines ignorierten Nutzers/Servers", + "None": "Keine", + "Ban list rules - %(roomName)s": "Verbotslistenregeln - %(roomName)s", + "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Füge hier Benutzer!nnen und Server hinzu, die du ignorieren willst. Verwende Sternchen, damit Riot mit beliebigen Zeichen übereinstimmt. Bspw. würde @bot: * alle Benutzer!nnen ignorieren, die auf einem Server den Namen 'bot' haben.", + "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Ignorieren von Personen erfolgt über Sperrlisten. Wenn eine Sperrliste abonniert wird, werden die von dieser Liste blockierten Benutzer!nnen/Server ausgeblendet.", + "Personal ban list": "Persönliche Sperrliste", + "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Deine persönliche Sperrliste enthält alle Benutzer!nnen/Server, von denen du persönlich keine Nachrichten sehen willst. Nachdem du den ersten Benutzer/Server ignoriert hast, wird in der Raumliste \"Meine Sperrliste\" angezeigt - bleibe in diesem Raum, um die Sperrliste aufrecht zu halten.", + "Server or user ID to ignore": "Zu ignorierende Server- oder Benutzer-ID", + "eg: @bot:* or example.org": "z.B. @bot:* oder example.org" } From 7dfc01eed114f2084b6e15e8297dd19633fa2b39 Mon Sep 17 00:00:00 2001 From: Max Klenk Date: Mon, 4 May 2020 13:01:56 +0000 Subject: [PATCH 013/319] Translated using Weblate (German) Currently translated at 78.4% (1805 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index e69aadcb39..b1e91c2cec 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1871,5 +1871,5 @@ "Personal ban list": "Persönliche Sperrliste", "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Deine persönliche Sperrliste enthält alle Benutzer!nnen/Server, von denen du persönlich keine Nachrichten sehen willst. Nachdem du den ersten Benutzer/Server ignoriert hast, wird in der Raumliste \"Meine Sperrliste\" angezeigt - bleibe in diesem Raum, um die Sperrliste aufrecht zu halten.", "Server or user ID to ignore": "Zu ignorierende Server- oder Benutzer-ID", - "eg: @bot:* or example.org": "z.B. @bot:* oder example.org" + "eg: @bot:* or example.org": "z.B. @bot:* oder example.org" } From 3327b9e298dd4d1e94048e49a2a0fe7f56367efb Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Mon, 4 May 2020 13:02:03 +0000 Subject: [PATCH 014/319] Translated using Weblate (German) Currently translated at 78.4% (1805 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b1e91c2cec..3ff8feaccb 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1871,5 +1871,9 @@ "Personal ban list": "Persönliche Sperrliste", "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Deine persönliche Sperrliste enthält alle Benutzer!nnen/Server, von denen du persönlich keine Nachrichten sehen willst. Nachdem du den ersten Benutzer/Server ignoriert hast, wird in der Raumliste \"Meine Sperrliste\" angezeigt - bleibe in diesem Raum, um die Sperrliste aufrecht zu halten.", "Server or user ID to ignore": "Zu ignorierende Server- oder Benutzer-ID", - "eg: @bot:* or example.org": "z.B. @bot:* oder example.org" + "eg: @bot:* or example.org": "z.B. @bot:* oder example.org", + "Subscribed lists": "Abonnierte Listen", + "Subscribing to a ban list will cause you to join it!": "Eine Verbotsliste abonnieren bedeutet ihr beizutreten!", + "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Tool, um Benutzer!nnen zu ignorieren.", + "Room ID or alias of ban list": "Raum-ID oder Alias ​​der Sperrliste" } From ae1fe0d625089241e2f24924de23ae0bc23ed6a6 Mon Sep 17 00:00:00 2001 From: Max Klenk Date: Mon, 4 May 2020 13:03:24 +0000 Subject: [PATCH 015/319] Translated using Weblate (German) Currently translated at 78.5% (1808 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3ff8feaccb..97e2bbfae7 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1875,5 +1875,5 @@ "Subscribed lists": "Abonnierte Listen", "Subscribing to a ban list will cause you to join it!": "Eine Verbotsliste abonnieren bedeutet ihr beizutreten!", "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Tool, um Benutzer!nnen zu ignorieren.", - "Room ID or alias of ban list": "Raum-ID oder Alias ​​der Sperrliste" + "Room ID or alias of ban list": "Raum-ID oder -Alias der Sperrliste" } From bcf0a5268e4fb50f235108b208ef4fbd0aa1408a Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Mon, 4 May 2020 13:03:29 +0000 Subject: [PATCH 016/319] Translated using Weblate (German) Currently translated at 78.5% (1808 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 97e2bbfae7..237c56fba7 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1875,5 +1875,8 @@ "Subscribed lists": "Abonnierte Listen", "Subscribing to a ban list will cause you to join it!": "Eine Verbotsliste abonnieren bedeutet ihr beizutreten!", "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Tool, um Benutzer!nnen zu ignorieren.", - "Room ID or alias of ban list": "Raum-ID oder -Alias der Sperrliste" + "Room ID or alias of ban list": "Raum-ID oder -Alias der Sperrliste", + "Subscribe": "Abonnieren", + "Always show the window menu bar": "Fenstermenüleiste immer anzeigen", + "Show tray icon and minimize window to it on close": "Tray-Symbol anzeigen und Fenster beim Schließen minimieren" } From 9b291e51a782687976fb97318691ba44f63fb2c1 Mon Sep 17 00:00:00 2001 From: Max Klenk Date: Mon, 4 May 2020 13:05:58 +0000 Subject: [PATCH 017/319] Translated using Weblate (German) Currently translated at 79.1% (1820 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 237c56fba7..74247bbf6b 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -783,7 +783,7 @@ "Explore Account Data": "Konto-Daten erkunden", "All messages (noisy)": "Alle Nachrichten (laut)", "Saturday": "Samstag", - "I understand the risks and wish to continue": "Ich verstehe das Risiko und möchte fortfahren", + "I understand the risks and wish to continue": "Ich verstehe die Risiken und möchte fortfahren", "Direct Chat": "Direkt-Chat", "The server may be unavailable or overloaded": "Der Server ist vermutlich nicht erreichbar oder überlastet", "Reject": "Ablehnen", @@ -1348,7 +1348,7 @@ "Share Permalink": "Teile permanenten Link", "Sign in to your Matrix account on %(serverName)s": "Melde dich mit deinem Matrixkonto auf %(serverName)s an", "Create your Matrix account on %(serverName)s": "Erstelle ein Matrixkonto auf %(serverName)s", - "Please install Chrome, Firefox, or Safari for the best experience.": "Bitte installiere Chrome, Firefox, oder Safari für die beste Erfahrung.", + "Please install Chrome, Firefox, or Safari for the best experience.": " Bitte installiere Chrome, Firefox, oder Safari für das beste Erlebnis.", "Want more than a community? Get your own server": "Du möchtest mehr als eine Community? Hol dir deinen eigenen Server", "Could not load user profile": "Konnte Nutzerprofil nicht laden", "Your Matrix account on %(serverName)s": "Dein Matrixkonto auf %(serverName)s", @@ -1878,5 +1878,5 @@ "Room ID or alias of ban list": "Raum-ID oder -Alias der Sperrliste", "Subscribe": "Abonnieren", "Always show the window menu bar": "Fenstermenüleiste immer anzeigen", - "Show tray icon and minimize window to it on close": "Tray-Symbol anzeigen und Fenster beim Schließen minimieren" + "Show tray icon and minimize window to it on close": "Taskleistensymbol anzeigen und Fenster beim Schließen dorthin minimieren" } From 74fdbcd02f31bb1ba1feec6160475cee82df4957 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Mon, 4 May 2020 13:07:02 +0000 Subject: [PATCH 018/319] Translated using Weblate (German) Currently translated at 79.1% (1820 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 74247bbf6b..bea4ab51c8 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1751,7 +1751,7 @@ "Read Marker lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung (ms)", "Read Marker off-screen lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)", "Session key:": "Sitzungsschlüssel:", - "A session's public name is visible to people you communicate with": "Der Sitzungsname ist sichtbar für die Personen mit denen du kommunizierst", + "A session's public name is visible to people you communicate with": "Der öffentliche Sitzungsname ist sichtbar für Personen, mit denen du kommunizierst", "Sounds": "Töne", "Upgrade the room": "Raum hochstufen", "Enable room encryption": "Verschlüsselung aktivieren", @@ -1878,5 +1878,12 @@ "Room ID or alias of ban list": "Raum-ID oder -Alias der Sperrliste", "Subscribe": "Abonnieren", "Always show the window menu bar": "Fenstermenüleiste immer anzeigen", - "Show tray icon and minimize window to it on close": "Taskleistensymbol anzeigen und Fenster beim Schließen dorthin minimieren" + "Show tray icon and minimize window to it on close": "Taskleistensymbol anzeigen und Fenster beim Schließen dorthin minimieren", + "Session ID:": "Sitzungs-ID:", + "Message search": "Nachrichtensuche", + "Cross-signing": "Cross-Signing", + "This room is bridging messages to the following platforms. Learn more.": "Dieser Raum verbindet Nachrichten mit den folgenden Plattformen. Mehr erfahren.", + "This room isn’t bridging messages to any platforms. Learn more.": "Dieser Raum verbindet keine Nachrichten mit Plattformen. Mehr erfahren.", + "Bridges": "Bridges", + "Uploaded sound": "Hochgeladener Ton" } From 07a4503e350789b1ee8c6d18aa49a0766718bbf1 Mon Sep 17 00:00:00 2001 From: Luca Corbatto Date: Mon, 4 May 2020 13:08:15 +0000 Subject: [PATCH 019/319] Translated using Weblate (German) Currently translated at 79.1% (1820 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index bea4ab51c8..c63cce305a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1235,7 +1235,7 @@ "Confirm your passphrase": "Bestätige deine Passphrase", "Secure your backup with a passphrase": "Sichere dein Backup mit einer Passphrase", "Your keys are being backed up (the first backup could take a few minutes).": "Deine Schlüssel werden gesichert (Das erste Backup könnte ein paar Minuten in Anspruch nehmen).", - "Voice & Video": "Sprache & Video", + "Voice & Video": "Sprach- & Videoanruf", "Never lose encrypted messages": "Verliere niemals verschlüsselte Nachrichten", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Nachrichten in diesem Raum sind mit einer Ende-zu-Ende-Verschlüsselung gesichert. Nur du und dein(e) Gesprächspartner haben die Schlüssel, um die Nachrichten zu lesen.", "Securely back up your keys to avoid losing them. Learn more.": "Speichere deine Schlüssel an einem sicheren Ort, um diese nicht zu verlieren. Lerne wie.", From b298d27c21c37b0734b2a9983cb1d511962bed9f Mon Sep 17 00:00:00 2001 From: BenjaminVettori Date: Mon, 4 May 2020 13:08:26 +0000 Subject: [PATCH 020/319] Translated using Weblate (German) Currently translated at 79.1% (1820 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c63cce305a..3668b08bca 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1885,5 +1885,8 @@ "This room is bridging messages to the following platforms. Learn more.": "Dieser Raum verbindet Nachrichten mit den folgenden Plattformen. Mehr erfahren.", "This room isn’t bridging messages to any platforms. Learn more.": "Dieser Raum verbindet keine Nachrichten mit Plattformen. Mehr erfahren.", "Bridges": "Bridges", - "Uploaded sound": "Hochgeladener Ton" + "Uploaded sound": "Hochgeladener Ton", + "Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion", + "this room": "Dieser Raum", + "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s." } From 0b089858ede64c2cb2df2086a72c1444e5210dd0 Mon Sep 17 00:00:00 2001 From: code-surfer <1703github@rainbow.in-berlin.de> Date: Mon, 4 May 2020 13:20:38 +0000 Subject: [PATCH 021/319] Translated using Weblate (German) Currently translated at 79.1% (1820 of 2302 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3668b08bca..4500a678e6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1888,5 +1888,7 @@ "Uploaded sound": "Hochgeladener Ton", "Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion", "this room": "Dieser Raum", - "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s." + "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.", + "Send a bug report with logs": "Sende Fehlermeldung mit Protokoll", + "Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen" } From 26a42ce62e085795e025ac5d4d8656774089e3c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Mesk=C3=B3?= Date: Tue, 5 May 2020 14:46:01 +0000 Subject: [PATCH 022/319] Translated using Weblate (Hungarian) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 188 ++++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 93 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 8bf5e28f7f..5eebbe8478 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2,7 +2,7 @@ "Cancel": "Mégse", "Search": "Keresés", "OK": "Rendben", - "Custom Server Options": "Egyedi szerverbeállítások", + "Custom Server Options": "Egyéni kiszolgálóbeállítások", "Dismiss": "Eltüntetés", "Error": "Hiba", "Failed to forget room %(errCode)s": "Nem sikerült elfelejteni a szobát: %(errCode)s", @@ -10,7 +10,7 @@ "Mute": "Elnémít", "Notifications": "Értesítések", "Operation failed": "Sikertelen művelet", - "powered by Matrix": "Matrix hajtja", + "powered by Matrix": "a gépházban: Matrix", "Remove": "Kitakarás", "Settings": "Beállítások", "unknown error code": "ismeretlen hibakód", @@ -70,7 +70,7 @@ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s megváltoztatta a szoba nevét erre: %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s megváltoztatta a témát erre \"%(topic)s\".", - "Changes your display nickname": "Becenév megváltoztatása", + "Changes your display nickname": "Megváltoztatja a becenevedet", "Claimed Ed25519 fingerprint key": "Igényelt Ed25519 ujjlenyomat kulcs", "Click here to fix": "A javításhoz kattints ide", "Click to mute audio": "Hang némításhoz kattints ide", @@ -88,7 +88,7 @@ "Curve25519 identity key": "Curve25519 azonosítási kulcs", "Custom": "Egyedi", "Custom level": "Egyedi szint", - "/ddg is not a command": "/ddg nem egy parancs", + "/ddg is not a command": "A /ddg nem egy parancs", "Deactivate Account": "Fiók bezárása", "Decline": "Elutasít", "Decrypt %(text)s": "%(text)s visszafejtése", @@ -159,7 +159,7 @@ "%(senderName)s invited %(targetName)s.": "%(senderName)s meghívta: %(targetName)s.", "Invited": "Meghívva", "Invites": "Meghívók", - "Invites user with given id to current room": "Felhasználó meghívása ebbe a szobába megadott azonosítóval", + "Invites user with given id to current room": "A megadott azonosítójú felhasználó meghívása a jelenlegi szobába", "Sign in with": "Belépés ezzel:", "Join as voice or video.": "Csatlakozás hanggal vagy videóval.", "Join Room": "Belépés a szobába", @@ -182,8 +182,8 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik bárki.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik ismeretlen (%(visibility)s).", "Manage Integrations": "Integrációk kezelése", - "Missing room_id in request": "Hiányzó room_id a kérésben", - "Missing user_id in request": "Hiányzó user_id a kérésben", + "Missing room_id in request": "A kérésből hiányzik a room_id", + "Missing user_id in request": "A kérésből hiányzik a user_id", "Moderator": "Moderátor", "Name": "Név", "New address (e.g. #foo:%(localDomain)s)": "Új cím (e.g. #foo:%(localDomain)s)", @@ -240,7 +240,7 @@ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", "Server error": "Szerver hiba", "Server may be unavailable, overloaded, or search timed out :(": "A szerver elérhetetlen, túlterhelt vagy a keresés túllépte az időkorlátot :(", - "Server may be unavailable, overloaded, or you hit a bug.": "A szerver elérhetetlen, túlterhelt vagy hibára futott.", + "Server may be unavailable, overloaded, or you hit a bug.": "A kiszolgáló elérhetetlen, túlterhelt vagy hibára futott.", "Server unavailable, overloaded, or something else went wrong.": "A szerver elérhetetlen, túlterhelt vagy valami más probléma van.", "Session ID": "Kapcsolat azonosító", "%(senderName)s set a profile picture.": "%(senderName)s profil képet állított be.", @@ -266,7 +266,7 @@ "This phone number is already in use": "Ez a telefonszám már használatban van", "This room": "Ebben a szobában", "This room is not accessible by remote Matrix servers": "Ez a szoba távoli Matrix szerverről nem érhető el", - "To use it, just wait for autocomplete results to load and tab through them.": "A használatához csak várd meg az automatikus kiegészítéshez a találatok betöltését és TAB-bal választhatsz közülük.", + "To use it, just wait for autocomplete results to load and tab through them.": "A használatához csak várd meg az automatikus kiegészítési találatok betöltését, majd Tabbal választhatsz közülük.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nincs jogod a kérdéses üzenetek megjelenítéséhez.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nem találom.", "Unable to add email address": "Az e-mail címet nem sikerült hozzáadni", @@ -304,7 +304,7 @@ "Voice call": "Hang hívás", "VoIP conference finished.": "VoIP konferencia befejeződött.", "VoIP conference started.": "VoIP konferencia elkezdődött.", - "VoIP is unsupported": "VoIP nem támogatott", + "VoIP is unsupported": "A VoIP nem támogatott", "(could not connect media)": "(média kapcsolat nem hozható létre)", "(no answer)": "(nincs válasz)", "(unknown failure: %(reason)s)": "(ismeretlen hiba: %(reason)s)", @@ -320,33 +320,33 @@ "You have enabled URL previews by default.": "Az URL előnézet alapból engedélyezve van.", "You have no visible notifications": "Nincsenek látható értesítéseid", "You must register to use this functionality": "Regisztrálnod kell hogy ezt használhasd", - "You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.", + "You need to be able to invite users to do that.": "Hogy ezt tehesd, meg kell tudnod hívni felhasználókat.", "You need to be logged in.": "Be kell jelentkezz.", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a Matrix szerveren.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a Matrix-kiszolgálón.", "You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?", "You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.", - "Sun": "vas", - "Mon": "hé", + "Sun": "v", + "Mon": "h", "Tue": "k", "Wed": "sze", - "Thu": "csü", - "Fri": "pé", + "Thu": "cs", + "Fri": "p", "Sat": "szo", - "Jan": "jan", - "Feb": "feb", - "Mar": "már", - "Apr": "ápr", - "May": "máj", - "Jun": "jún", - "Jul": "júl", - "Aug": "aug", - "Sep": "szept", - "Oct": "okt", - "Nov": "nov", - "Dec": "dec", - "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", + "Jan": "jan.", + "Feb": "feb.", + "Mar": "már.", + "Apr": "ápr.", + "May": "máj.", + "Jun": "jún.", + "Jul": "júl.", + "Aug": "aug.", + "Sep": "szept.", + "Oct": "okt.", + "Nov": "nov.", + "Dec": "dec.", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(monthName)s %(day)s, %(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(fullYear)s. %(monthName)s %(day)s, %(weekDayName)s %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "Set a display name:": "Megjelenítési név beállítása:", "Upload an avatar:": "Avatar kép feltöltése:", @@ -438,8 +438,8 @@ "Define the power level of a user": "A felhasználó szintjének meghatározása", "Edit": "Szerkeszt", "Enable automatic language detection for syntax highlighting": "Nyelv automatikus felismerése szintaxis kiemeléshez", - "AM": "de", - "PM": "du", + "AM": "de.", + "PM": "du.", "To get started, please pick a username!": "Az induláshoz válassz egy felhasználói nevet!", "Unable to create widget.": "Nem lehet kisalkalmazást létrehozni.", "You are not in this room.": "Nem vagy ebben a szobában.", @@ -465,15 +465,15 @@ "You are no longer ignoring %(userId)s": "Ismét figyelembe veszed: %(userId)s", "Unignored user": "Figyelembe vett felhasználó", "Ignored user": "Figyelmen kívül hagyott felhasználó", - "Stops ignoring a user, showing their messages going forward": "Felhasználót újra figyelembe vesszük és megmutatjuk az új üzeneteit", - "Ignores a user, hiding their messages from you": "Felhasználó figyelmen kívül hagyásával elrejtheted az üzeneteit magad elől", + "Stops ignoring a user, showing their messages going forward": "A felhasználó újbóli figyelembe vétele, és az üzenetei megjelenítése a jövőben", + "Ignores a user, hiding their messages from you": "Figyelmen kívül hagy egy felhasználót, elrejtve előled az üzeneteit", "Banned by %(displayName)s": "Kitiltotta: %(displayName)s", "Message removed by %(userId)s": "Üzenetet törölte: %(userId)s", "Description": "Leírás", "Unable to accept invite": "A meghívót nem lehet elfogadni", "Leave": "Elhagy", - "Failed to invite the following users to %(groupId)s:": "Az alábbi felhasználókat nem sikerült meghívni a(z) %(groupId)s:", - "Failed to invite users to %(groupId)s": "Nem sikerült meghívni a felhasználókat ebbe a csoportba: %(groupId)s", + "Failed to invite the following users to %(groupId)s:": "A következő felhasználókat nem sikerült meghívni a(z) %(groupId)s csoportba:", + "Failed to invite users to %(groupId)s": "A felhasználók meghívása a(z) %(groupId)s csoportba sikertelen", "Unable to reject invite": "Nem sikerül elutasítani a meghívót", "Leave %(groupName)s?": "Elhagyod a csoportot: %(groupName)s?", "Add a Room": "Szoba hozzáadása", @@ -491,7 +491,7 @@ "Light theme": "Világos téma", "Dark theme": "Sötét téma", "Unknown": "Ismeretlen", - "Failed to add the following rooms to %(groupId)s:": "Az alábbi szobákat nem sikerült hozzáadni a(z) %(groupId)s csoporthoz:", + "Failed to add the following rooms to %(groupId)s:": "A következő szobák hozzáadása a(z) %(groupId)s csoporthoz sikertelen:", "Matrix ID": "Matrix azonosító", "Matrix Room ID": "Szoba Matrix azonosító", "email address": "E-mail cím", @@ -504,13 +504,13 @@ "Pinned Messages": "Kitűzött üzenetek", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s megváltoztatta a szoba kitűzött szövegeit.", "Who would you like to add to this community?": "Kit szeretnél hozzáadni ehhez a közösséghez?", - "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Figyelem: minden személy akit hozzáadsz a közösséghez mindenki számára látható lesz aki ismeri a közösség azonosítóját", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Figyelem: minden személy akit hozzáadsz a közösséghez mindenki számára látható lesz, aki ismeri a közösség azonosítóját", "Invite new community members": "Új tagok meghívása a közösségbe", "Invite to Community": "Meghívás a közösségbe", "Which rooms would you like to add to this community?": "Melyik szobákat szeretnéd hozzáadni a közösséghez?", "Add rooms to the community": "Szobák hozzáadása a közösséghez", "Add to community": "Hozzáadás a közösséghez", - "Failed to invite users to community": "Nem sikerült tagokat meghívni a közösségbe", + "Failed to invite users to community": "A felhasználók meghívása a közösségbe sikertelen", "Communities": "Közösségek", "Unpin Message": "Üzenet levétele", "Jump to message": "Üzenetre ugrás", @@ -636,7 +636,7 @@ "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "A közösségednek nincs bő leírása, HTML oldala ami megjelenik a közösség tagjainak.
    A létrehozáshoz kattints ide!", "Notify the whole room": "Az egész szoba értesítése", "Room Notification": "Szoba értesítések", - "Show these rooms to non-members on the community page and room list?": "Mutassuk meg ezeket a szobákat kívülállóknak a közösségi oldalon és a szobák listájában?", + "Show these rooms to non-members on the community page and room list?": "Megjelenjenek ezek a szobák kívülállóknak a közösségi oldalon és a szobalistában?", "Please note you are logging into the %(hs)s server, not matrix.org.": "Figyelem, a %(hs)s szerverre jelentkezel be és nem a matrix.org szerverre.", "Restricted": "Korlátozott", "Enable inline URL previews by default": "Beágyazott URL előnézetek alapértelmezett engedélyezése", @@ -667,7 +667,7 @@ "Answer Anyway": "Felvétel mindenképpen", "Call": "Hívás", "Answer": "Felvétel", - "Send": "Elküld", + "Send": "Elküldés", "Old cryptography data detected": "Régi titkosítási adatot találhatók", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Régebbi Riot verzióból származó adatok találhatók. Ezek hibás működéshez vezethettek a végponttól-végpontig titkosításban régebbi verzióknál. A nemrég küldött/fogadott titkosított üzenetek ha a régi adatokat használták lehetséges hogy nem lesznek visszafejthetők ebben a verzióban. Ha problémákba ütközöl jelentkezz ki és vissza. A régi üzenetek elérésének biztosításához mentsd ki a kulcsokat és töltsd be újra.", "Warning": "Figyelmeztetés", @@ -684,13 +684,13 @@ "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A személyes adatok védelme fontos számunkra, így mi nem gyűjtünk személyes és személyhez köthető adatokat az analitikánkhoz.", "Learn more about how we use analytics.": "Tudj meg többet arról hogyan használjuk az analitikai adatokat.", "The information being sent to us to help make Riot.im better includes:": "Az adatok amiket a Riot.im javításához felhasználunk az alábbiak:", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Minden azonosításra alkalmas adatot mint a szoba, felhasználó vagy csoport azonosítót mielőtt az adatokat elküldenénk eltávolításra kerülnek.", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Minden azonosításra alkalmas adat, mint a szoba-, felhasználó- vagy csoportazonosítók, eltávolításra kerülnek, mielőtt elküldenénk a kiszolgálónak.", "The platform you're on": "A platform amit használsz", "The version of Riot.im": "Riot.im verziója", "Your language of choice": "A használt nyelv", - "Which officially provided instance you are using, if any": "Milyen hivatalosan nyújtott verziót használsz", + "Which officially provided instance you are using, if any": "Melyik hivatalosan nyújtott példányt használod", "Whether or not you're using the Richtext mode of the Rich Text Editor": "Használod-e a Richtext módot a szerkesztőben vagy nem", - "Your homeserver's URL": "A Matrix szerver URL-t", + "Your homeserver's URL": "A Matrix kiszolgálód URL-je", "Your identity server's URL": "Az azonosítási szerver URL-t", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s. %(monthName)s %(day)s, %(weekDayName)s", "This room is not public. You will not be able to rejoin without an invite.": "Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.", @@ -848,7 +848,7 @@ "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!": "Ebben a böngészőben az alkalmazás felülete tele lehet hibával, és az is lehet, hogy egyáltalán nem működik. Ha így is ki szeretnéd próbálni, megteheted, de ha valami gondod van, nem tudunk segíteni!", "Checking for an update...": "Frissítés keresése...", "There are advanced notifications which are not shown here": "Vannak itt nem látható, haladó értesítések", - "Missing roomId.": "Hiányzó szoba azonosító.", + "Missing roomId.": "Hiányzó szobaazonosító.", "Popout widget": "Kiugró kisalkalmazás", "Every page you use in the app": "Minden oldal, amit az alkalmazásban használsz", "e.g. ": "pl.: ", @@ -902,7 +902,7 @@ "Demote yourself?": "Lefokozod magad?", "Demote": "Lefokozás", "This event could not be displayed": "Az eseményt nem lehet megjeleníteni", - "Permission Required": "Engedély szükséges", + "Permission Required": "Jogosultság szükséges", "You do not have permission to start a conference call in this room": "Nincs jogosultságod konferencia hívást kezdeményezni ebben a szobában", "A call is currently being placed!": "A hívás indítás alatt!", "Failed to remove widget": "A kisalkalmazás törlése sikertelen", @@ -1028,7 +1028,7 @@ "Great! This passphrase looks strong enough.": "Szuper! Ez a jelmondat elég erősnek látszik.", "As a safety net, you can use it to restore your encrypted message history.": "Használhatod egy biztonsági hálóként a titkosított üzenetek visszaállításához.", "Failed to load group members": "A közösség tagságokat nem sikerült betölteni", - "Failed to invite users to the room:": "Felhasználókat nem sikerült meghívni a szobába:", + "Failed to invite users to the room:": "A felhasználók meghívása a szobába sikertelen:", "You do not have permission to invite people to this room.": "Nincs jogosultságod embereket meghívni ebbe a szobába.", "User %(user_id)s does not exist": "%(user_id)s felhasználó nem létezik", "Unknown server error": "Ismeretlen szerver hiba", @@ -1063,7 +1063,7 @@ "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Az alábbi Matrix ID-koz nem sikerül megtalálni a profilokat - így is meghívod őket?", "Invite anyway and never warn me again": "Mindenképpen meghív és ne figyelmeztess többet", "Invite anyway": "Mindenképpen meghív", - "Whether or not you're logged in (we don't record your username)": "Se akkor ha bejelentkezel se akkor ha nem; mi nem tároljuk a felhasználói nevedet", + "Whether or not you're logged in (we don't record your username)": "Akár be vagy jelentkezve, akár nem; nem tároljuk a felhasználónevedet", "Upgrades a room to a new version": "Szoba fejlesztése új verzióra", "Sets the room name": "Szobanév beállítása", "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s fejlesztette a szobát.", @@ -1167,7 +1167,7 @@ "Create your account": "Felhasználói fiók létrehozása", "Email (optional)": "E-mail (nem kötelező)", "Phone (optional)": "Telefonszám (nem kötelező)", - "Confirm": "Megerősít", + "Confirm": "Megerősítés", "Other servers": "Más szerverek", "Homeserver URL": "Matrixszerver URL", "Identity Server URL": "Azonosítási Szerver URL", @@ -1187,7 +1187,7 @@ "Recovery Method Removed": "Visszaállítási eljárás törölve", "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.": "Ha nem te törölted a visszaállítási eljárást, akkor egy támadó hozzá akar férni a fiókodhoz. Azonnal változtasd meg a jelszavadat és állíts be egy visszaállítási eljárást a Beállításokban.", "Chat with Riot Bot": "Csevegés a Riot Robottal", - "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "'%(fileName)s' mérete nagyobb mint amekkorát a Matrix szerver megenged feltölteni", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "A(z) „%(fileName)s” mérete nagyobb mint amekkorát a Matrix-kiszolgáló enged feltölteni", "Gets or sets the room topic": "Lekérdezi vagy beállítja a szoba témáját", "This room has no topic.": "A szobának nincs témája.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s hozzáférhetővé tette a szobát bárkinek, aki ismeri a linket.", @@ -1303,7 +1303,7 @@ "Allow Peer-to-Peer for 1:1 calls": "Ponttól-pontig kapcsolat engedélyezése az 1:1 hívásokban", "Credits": "Közreműködők", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Ha bármilyen hibába botlasz vagy szeretnél visszajelzést küldeni nekünk, kérjük oszd meg velünk a GitHub-on.", - "Changes your display nickname in the current room only": "Csak ebben a szobában változtatod meg a becenevedet", + "Changes your display nickname in the current room only": "Csak ebben a szobában változtatja meg a becenevedet", "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s engedélyezte a kitűzőket ebben a szobában az alábbi közösséghez: %(groups)s.", "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s letiltotta a kitűzőket ebben a szobában az alábbi közösséghez: %(groups)s.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s engedélyezte a kitűzőket ebben a szobában az alábbi közösséghez: %(newGroups)s és letiltotta ehhez a közösséghez: %(oldGroups)s.", @@ -1325,7 +1325,7 @@ "Create your Matrix account on %(serverName)s": "Készíts egy Matrix fiókot itt: %(serverName)s", "Could not load user profile": "A felhasználói profil nem tölthető be", "Your Matrix account on %(serverName)s": "A Matrix fiókod itt: %(serverName)s", - "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Hozzáteszi a sima szöveges üzenethez ezt: ¯\\_(ツ)_/¯", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "A sima szöveges üzenet elé teszi ezt: ¯\\_(ツ)_/¯", "User %(userId)s is already in the room": "%(userId)s felhasználó már a szobában van", "The user must be unbanned before they can be invited.": "A felhasználó kitiltását először vissza kell vonni mielőtt újra meghívható lesz.", "Upgrade to your own domain": "Frissíts a saját domain-re", @@ -1353,9 +1353,9 @@ "Want more than a community? Get your own server": "Többet szeretnél, mint egy közösség? Szerezz saját szervert", "Please install Chrome, Firefox, or Safari for the best experience.": "A legjobb élmény eléréséhez kérlek telepíts Chrome-ot, Firefoxot vagy Safarit.", "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. 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.": "Figyelmeztetés: A szoba frissítése nem fogja automatikusan átvinni a szoba résztvevőit az új verziójú szobába. A régi szobába bekerül egy link az új szobához - a tagoknak rá kell kattintani a linkre az új szobába való belépéshez.", - "Adds a custom widget by URL to the room": "Egyedi kisalkalmazás hozzáadása a szobához URL-lel", - "Please supply a https:// or http:// widget URL": "Kérlek add meg a https:// vagy http:// kisalkalmazás URL-t", - "You cannot modify widgets in this room.": "A kisalkalmazásokat nem módosíthatod a szobában.", + "Adds a custom widget by URL to the room": "Egyéni kisalkalmazás hozzáadása a szobához URL alapján", + "Please supply a https:// or http:// widget URL": "Add meg a kisalkalmazás https:// vagy http:// URL-jét", + "You cannot modify widgets in this room.": "Nem módosíthatod a kisalkalmazásokat a szobában.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s visszavonta %(targetDisplayName)s a szobába való belépéséhez szükséges meghívóját.", "Upgrade this room to the recommended room version": "A szoba fejlesztése a javasolt verzióra", "This room is running room version , which this homeserver has marked as unstable.": "A szoba verziója: , amit a Matrix szerver instabilnak tekint.", @@ -1376,8 +1376,8 @@ "You have %(count)s unread notifications in a prior version of this room.|one": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használsz-e „morzsákat” (profilképek a szobalista felett)", "Replying With Files": "Válasz fájlokkal", - "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyenlőre nem lehet fájlal válaszolni. Szeretnéd feltölteni a fájlt úgy, hogy az nem egy válasz lesz?", - "The file '%(fileName)s' failed to upload.": "A %(fileName)s fájlt nem sikerült feltölteni.", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyelőre nem lehet fájllal válaszolni. Szeretnéd feltölteni a fájlt úgy, hogy az nem egy válasz lesz?", + "The file '%(fileName)s' failed to upload.": "A(z) „%(fileName)s” fájl feltöltése sikertelen.", "Rotate counter-clockwise": "Óramutató járásával ellentétesen fordít", "Rotate clockwise": "Óramutató járásával megegyező irányba fordít", "GitHub issue": "GitHub hibajegy", @@ -1398,8 +1398,8 @@ "Upload %(count)s other files|one": "Feltölt %(count)s másik fájlt", "Cancel All": "Mindent megszakít", "Upload Error": "Feltöltési hiba", - "The server does not support the room version specified.": "A szerver nem támogatja a megadott szoba verziót.", - "Changes your avatar in this current room only": "A profilképedet csak ebben a szobában változtatja meg", + "The server does not support the room version specified.": "A kiszolgáló nem támogatja a megadott szobaverziót.", + "Changes your avatar in this current room only": "Csak ebben a szobában változtatja meg a profilképedet", "Sends the given message coloured as a rainbow": "A megadott üzenetet szivárvány színben küldi el", "Sends the given emote coloured as a rainbow": "A megadott hangulatjelet szivárvány színben küldi el", "The user's homeserver does not support the version of the room.": "A felhasználó matrix szervere nem támogatja a megadott szoba verziót.", @@ -1452,7 +1452,7 @@ "Invalid base_url for m.identity_server": "Érvénytelen base_url az m.identity_server -hez", "Identity server URL does not appear to be a valid identity server": "Az Azonosító szerver URL nem tűnik érvényesnek", "A conference call could not be started because the integrations server is not available": "A konferencia hívást nem lehet elkezdeni mert az integrációs szerver nem érhető el", - "Name or Matrix ID": "Név vagy Matrix azon.", + "Name or Matrix ID": "Név vagy Matrix azonosító", "Unbans user with given ID": "Visszaengedi a megadott azonosítójú felhasználót", "reacted with %(shortName)s": "ezzel reagált: %(shortName)s", "edited": "szerkesztve", @@ -1500,7 +1500,7 @@ "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s nem változtattak semmit", "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s %(count)s alkalommal nem változtatott semmit", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)snem változtatott semmit", - "Changes your avatar in all rooms": "A profilképed megváltozik minden szobában", + "Changes your avatar in all rooms": "Megváltoztatja a profilképed az összes szobában", "Removing…": "Eltávolítás…", "Clear all data": "Minden adat törlése", "Your homeserver doesn't seem to support this feature.": "A matrix szervered úgy tűnik nem támogatja ezt a szolgáltatást.", @@ -1523,10 +1523,10 @@ "Terms of Service": "Felhasználási feltételek", "Service": "Szolgáltatás", "Summary": "Összefoglaló", - "Call failed due to misconfigured server": "A hívás meghiúsult a helytelenül beállított szerver miatt", - "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Kérd meg a matrix szerver (%(homeserverDomain)s) adminisztrátorát, hogy a hívások megfelelő működéséhez állítson be egy TURN szervert.", - "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Másik lehetőségként használhatod a nyilvános szervert: turn.matrix.org, de ez nem lesz annyira megbízható és megosztja az IP címedet a szerverrel. A Beállításokban állíthatod be.", - "Try using turn.matrix.org": "Próbáld meg használni a turn.matrix.org-ot", + "Call failed due to misconfigured server": "A hívás a helytelenül beállított kiszolgáló miatt sikertelen", + "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Kérd meg a Matrix-kiszolgálód (%(homeserverDomain)s) adminisztrátorát, hogy a hívások megfelelő működéséhez állítson be egy TURN-kiszolgálót.", + "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Másik lehetőségként használhatod a turn.matrix.org nyilvános kiszolgálót, de ez nem lesz annyira megbízható, és megosztja az IP-címedet a kiszolgálóval. A Beállításokban állíthatod be.", + "Try using turn.matrix.org": "A turn.matrix.org használatának kipróbálása", "Messages": "Üzenetek", "Actions": "Műveletek", "Displays list of commands with usages and descriptions": "Parancsok megjelenítése példával és leírással", @@ -1539,9 +1539,9 @@ "Could not connect to Identity Server": "Az Azonosítási Szerverhez nem lehet csatlakozni", "Checking server": "Szerver ellenőrzése", "Terms of service not accepted or the identity server is invalid.": "A felhasználási feltételek nincsenek elfogadva vagy az azonosítási szerver nem érvényes.", - "Identity server has no terms of service": "Az azonosítási szerverhez nincsenek felhasználási feltételek", + "Identity server has no terms of service": "Az azonosítási kiszolgálónak nincsenek felhasználási feltételei", "The identity server you have chosen does not have any terms of service.": "Az általad választott azonosítási szerverhez nincsenek felhasználási feltételek.", - "Only continue if you trust the owner of the server.": "Csak akkor lépj tovább ha megbízol a szerver tulajdonosában.", + "Only continue if you trust the owner of the server.": "Csak akkor lépj tovább, ha megbízol a kiszolgáló tulajdonosában.", "Disconnect from the identity server ?": "Bontod a kapcsolatot ezzel az azonosítási szerverrel: ?", "Disconnect": "Kapcsolat bontása", "Identity Server (%(server)s)": "Azonosítás Szerver (%(server)s)", @@ -1582,13 +1582,13 @@ "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Használj azonosítási szervert e-mail címmel való meghíváshoz. Használd az alapértelmezett szervert (%(defaultIdentityServerName)s) vagy adj meg mást a Beállításokban.", "Use an identity server to invite by email. Manage in Settings.": "Használj azonosítási szervert e-mail címmel való meghíváshoz. Megadása a Beállításokban.", "Enable room encryption": "Szoba titkosításának bekapcsolása", - "Use an identity server": "Azonosítási szerver használata", - "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Azonosítási szerver használata e-maillel való meghíváshoz. Kattints a folytatáshoz az alapértelmezett (%(defaultIdentityServerName)s) azonosítási szerverrel vagy változtasd meg a Beállításokban.", - "Use an identity server to invite by email. Manage in Settings.": "Az e-maillel való meghíváshoz használj azonosítási szervert. Módosítsd a Beállításokban.", + "Use an identity server": "Azonosítási kiszolgáló használata", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Egy azonosítási kiszolgáló használata az e-maillel történő meghíváshoz. Kattints a folytatáshoz az alapértelmezett azonosítási kiszolgáló (%(defaultIdentityServerName)s) használatához, vagy állítsd be a Beállításokban.", + "Use an identity server to invite by email. Manage in Settings.": "Egy azonosítási kiszolgáló használata az e-maillel történő meghíváshoz. Módosítás a Beállításokban.", "Deactivate user?": "Felhasználó felfüggesztése?", "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "A felhasználó felfüggesztése a felhasználót kijelentkezteti és megakadályozza, hogy vissza tudjon lépni. Továbbá kilép minden szobából aminek tagja volt. Ezt nem lehet visszavonni. Biztos, hogy felfüggeszted ezt a felhasználót?", "Deactivate user": "Felhasználó felfüggesztése", - "Sends a message as plain text, without interpreting it as markdown": "Az üzenet elküldése sima szövegként anélkül, hogy „markdown” formázás lenne", + "Sends a message as plain text, without interpreting it as markdown": "Az üzenet elküldése sima szövegként anélkül, hogy „markdown” formázásként értelmezné", "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "A meghívód ellenőrzésekor az alábbi hibát kaptuk: %(errcode)s. Ezt az információt megpróbálhatod eljuttatni a szoba gazdájának.", "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "A meghívó ehhez a szobához: %(roomName)s erre az e-mail címre lett elküldve: %(email)s ami nincs társítva a fiókodhoz", "Link this email with your account in Settings to receive invites directly in Riot.": "Kösd össze a Beállításokban ezt az e-mail címet a fiókoddal, hogy közvetlenül a Riotba kaphassa meghívókat.", @@ -1604,7 +1604,7 @@ "Change identity server": "Azonosítási szerver kicserélése", "Disconnect from the identity server and connect to instead?": " azonosítási szerverről lecsatlakozás és csatlakozás ehhez: ?", "Disconnect identity server": "Az azonosítási szerverről lecsatlakozás", - "You are still sharing your personal data on the identity server .": "Az azonosítási szerverrel () továbbra is megosztasz személyes adatokat.", + "You are still sharing your personal data on the identity server .": "Továbbra is megosztasz személyes adatokat a(z) azonosítási kiszolgálón.", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Javasoljuk, hogy mielőtt az azonosítási szerverről lecsatlakozol töröld az e-mail címedet és telefonszámodat.", "Disconnect anyway": "Mindenképpen lecsatlakozás", "No recent messages by %(user)s found": "Nincs friss üzenet ettől a felhasználótól: %(user)s", @@ -1635,7 +1635,7 @@ "Report Content": "Tartalom jelentése", "Read Marker lifetime (ms)": "Olvasás visszajelzés érvényesség (ms)", "Read Marker off-screen lifetime (ms)": "Olvasás visszajelzés érvényessége képernyőn kívül (ms)", - "Changes the avatar of the current room": "Profilkép megváltoztatása az adott szobában", + "Changes the avatar of the current room": "Megváltoztatja a profilképed a jelenlegi szobában", "Room alias": "Szoba álnév", "e.g. my-room": "pl.: szobam", "Please provide a room alias": "Kérlek adj meg egy álnevet a szobához", @@ -1705,7 +1705,7 @@ "%(count)s unread messages.|one": "1 olvasatlan üzenet.", "Unread messages.": "Olvasatlan üzenetek.", "Show tray icon and minimize window to it on close": "Tálcaikon mutatása és az ablak összecsukása bezáráskor", - "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Ez a művelet az e-mail cím vagy telefonszám ellenőrzése miatt hozzáférést igényel az alapértelmezett azonosítási szerverhez (), de a szervernek nincsen semmilyen felhasználási feltétele.", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Ez a művelet az e-mail cím vagy telefonszám ellenőrzése miatt hozzáférést igényel a(z) alapértelmezett azonosítási kiszolgálóhoz, de a kiszolgálónak nincsenek felhasználási feltételei.", "Trust": "Megbízom benne", "Message Actions": "Üzenet Műveletek", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", @@ -1752,7 +1752,7 @@ "Room ID or alias of ban list": "Tiltó lista szoba azonosítója vagy alternatív neve", "Subscribe": "Feliratkozás", "You have ignored this user, so their message is hidden. Show anyways.": "Ezt a felhasználót figyelmen kívül hagyod, így az üzenetei el lesznek rejtve. Mindenképpen megmutat.", - "Custom (%(level)s)": "Egyedi (%(level)s)", + "Custom (%(level)s)": "Egyéni (%(level)s)", "Trusted": "Megbízható", "Not trusted": "Megbízhatatlan", "Direct message": "Közvetlen beszélgetés", @@ -1767,7 +1767,7 @@ "Your theme": "Témád", "Riot URL": "Riot URL", "Room ID": "Szoba azonosító", - "Widget ID": "Kisalkalmazás azon.", + "Widget ID": "Kisalkalmazás azonosító", "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg %(widgetDomain)s domain-nel és az Integrációs Menedzserrel.", "Using this widget may share data with %(widgetDomain)s.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg %(widgetDomain)s domain-nel.", "Widget added by": "A kisalkalmazást hozzáadta", @@ -1801,8 +1801,8 @@ "Match system theme": "A rendszer témájához megfelelő", "Clear notifications": "Értesítések törlése", "Customise your experience with experimental labs features. Learn more.": "Kísérleti labor tulajdonságokkal egyénre szabhatod az élményt. Tudj meg többet.", - "Error upgrading room": "A szoba verziófrissítésénél hiba történt", - "Double check that your server supports the room version chosen and try again.": "Ellenőrizd még egyszer, hogy a szervered támogatja-e a szoba verzióját és próbáld újra.", + "Error upgrading room": "Hiba a szoba verziófrissítésekor", + "Double check that your server supports the room version chosen and try again.": "Ellenőrizd még egyszer, hogy a kiszolgálód támogatja-e kiválasztott szobaverziót, és próbáld újra.", "This message cannot be decrypted": "Ezt az üzenetet nem lehet visszafejteni", "Unencrypted": "Titkosítatlan", "Automatically invite users": "Felhasználók automatikus meghívása", @@ -1845,7 +1845,7 @@ "Unable to set up secret storage": "A biztonsági tárolót nem sikerült beállítani", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s törölte azt a szabályt amivel ilyen felhasználók voltak kitiltva: %(glob)s", "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s törölte azt a szabályt amivel ilyen szobák voltak kitiltva: %(glob)s", - "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s törölte azt a szabályt amivel ilyen szerverek voltak kitiltva: %(glob)s", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s törölte azt a szabályt, amivel az ennek megfelelő kiszolgálók ki voltak tiltva: %(glob)s", "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s törölte ezt a kitiltó szabályt: %(glob)s", "%(senderName)s updated an invalid ban rule": "%(senderName)s frissített egy érvénytelen kitiltó szabályt", "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s frissítette azt a szabályt amivel ilyen felhasználók voltak kitiltva: %(glob)s ezért: %(reason)s", @@ -1945,7 +1945,7 @@ "Encryption upgraded": "Titkosítás fejlesztve", "Encryption setup complete": "Titkosítás beállítása kész", "Verify this session": "Munkamenet ellenőrzése", - "Encryption upgrade available": "A titkosítás fejlesztése elérhető", + "Encryption upgrade available": "A titkosítási fejlesztés elérhető", "%(senderName)s turned on end-to-end encryption.": "%(senderName)s bekapcsolta a végpontok közötti titkosítást.", "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus: %(algorithm)s).", "Enable message search in encrypted rooms": "Üzenetek keresésének engedélyezése titkosított szobákban", @@ -1985,7 +1985,7 @@ "Unverified session": "Ellenőrizetlen munkamenet", "Verifies a user, session, and pubkey tuple": "Felhasználó, munkamenet és nyilvános kulcs hármas ellenőrzése", "Unknown (user, session) pair:": "Ismeretlen (felhasználó, munkamenet) páros:", - "Session already verified!": "Munkamenet már ellenőrizve!", + "Session already verified!": "A munkamenet már ellenőrizve volt!", "WARNING: Session already verified, but keys do NOT MATCH!": "FIGYELEM: A munkamenet már ellenőrizve van de a kulcsok NEM EGYEZNEK!", "Enable cross-signing to verify per-user instead of per-session (in development)": "Kereszt-aláírás engedélyezése a felhasználó alapú azonosításhoz a munkamenet alapú helyett (fejlesztés alatt)", "Show padlocks on invite only rooms": "Lakat mutatása azoknál a szobáknál amikbe csak meghívóval lehet belépni", @@ -2007,8 +2007,8 @@ "Delete %(count)s sessions|other": "%(count)s munkamenet törlése", "Delete %(count)s sessions|one": "%(count)s munkamenet törlése", "This session is backing up your keys. ": "Ez a munkamenet elmenti a kulcsaidat. ", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: KULCS ELLENŐRZÉS HIBÁS! %(userId)s aláírási kulcsa és a munkamenet: %(deviceId)s ujjlenyomata \"%(fprint)s\" ami nem egyezik meg a megadott ujjlenyomattal ami \"%(fingerprint)s\". Ez jelentheti azt, hogy a kommunikációt lehallgatják!", - "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A megadott aláírási kulcs megegyezik %(userId)s felhasználótól kapott aláírási kulccsal ebben a munkamenetben: %(deviceId)s. A munkamenet hitelesnek lett jelölve.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: KULCSELLENŐRZÉS SIKERTELEN! %(userId)s aláírási kulcsa és a %(deviceId)s munkamenet ujjlenyomata „%(fprint)s”, ami nem egyezik meg a megadott ujjlenyomattal: „%(fingerprint)s”. Ez azt is jelentheti, hogy a kommunikációt lehallgatják!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A megadott aláírási kulcs megegyezik %(userId)s felhasználótól kapott aláírási kulccsal ebben a munkamenetben: %(deviceId)s. A munkamenet ellenőrzöttnek lett jelölve.", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelenleg a jelszó változtatás minden munkamenet végpontok közötti titkosító kulcsait alaphelyzetbe állítja, ezáltal a titkosított üzenetek olvashatatlanok lesznek, hacsak először nem mented ki a szobák kulcsait és töltöd vissza jelszóváltoztatás után. A jövőben ezt egyszerűsítjük majd.", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ez az munkamenet nem menti el a kulcsaidat, de van létező mentésed ahonnan vissza tudsz állni és továbbléphetsz.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Állítsd be ezen az munkameneten a Kulcs Mentést kijelentkezés előtt, hogy ne veszíts el olyan kulcsot ami csak ezen az eszközön van meg.", @@ -2052,7 +2052,7 @@ "Your messages are not secure": "Az üzeneteid nincsenek biztonságban", "One of the following may be compromised:": "Valamelyik az alábbiak közül kompromittált:", "Your homeserver": "Matrix szervered", - "The homeserver the user you’re verifying is connected to": "Az ellenőrizendő felhasználó ehhez a matrix szerverhez kapcsolódik:", + "The homeserver the user you’re verifying is connected to": "Az ellenőrizendő felhasználó ehhez a matrix kiszolgálóhoz kapcsolódik:", "Yours, or the other users’ internet connection": "A te vagy a másik felhasználó Internet kapcsolata", "Yours, or the other users’ session": "A te vagy a másik felhasználó munkamenete", "%(count)s sessions|other": "%(count)s munkamenet", @@ -2147,9 +2147,9 @@ "Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló visszaállítása", "The version of Riot": "Riot verziója", "Whether you're using Riot on a device where touch is the primary input mechanism": "Olyan eszközön használod-e a Riotot, ahol az érintés az elsődleges beviteli mód", - "Whether you're using Riot as an installed Progressive Web App": "A Riotot progresszív webalkalmazásként használod-e", + "Whether you're using Riot as an installed Progressive Web App": "Progresszív webalkalmazásként használod-e a Riotot", "Your user agent": "Felhasználói ügynök", - "The information being sent to us to help make Riot better includes:": "Az alábbi információk kerülnek elküldésre amivel a Riotot jobbá tudjuk tenni:", + "The information being sent to us to help make Riot better includes:": "Az alábbi információk kerülnek elküldésre, amivel jobbá tehetjük a Riotot:", "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Az ellenőrizni kívánt munkamenet nem támogatja se a QR kód beolvasást se az emodzsi ellenőrzést, amit a Riot támogat. Próbáld meg egy másik klienssel.", "You declined": "Elutasítottad", "%(name)s declined": "%(name)s elutasította", @@ -2171,8 +2171,8 @@ "Order rooms by name": "Szobák rendezése név szerint", "Show rooms with unread notifications first": "Olvasatlan üzeneteket tartalmazó szobák megjelenítése elől", "Show shortcuts to recently viewed rooms above the room list": "Billentyűkombináció megjelenítése a nemrég meglátogatott szobákhoz a szoba lista felett", - "Sign In or Create Account": "Belépés vagy Fiók Készítés", - "Use your account or create a new one to continue.": "A folytatáshoz használd a fiókodat vagy készíts egy újat.", + "Sign In or Create Account": "Bejelentkezés vagy fiók létrehozása", + "Use your account or create a new one to continue.": "A folytatáshoz használd a fiókodat, vagy hozz létre egy újat.", "Create Account": "Fiók létrehozása", "Displays information about a user": "A felhasználóról információ megjelenítése", "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Matrix-szal kapcsolatos biztonsági hibák jelentésével kapcsolatban kérlek olvasd el a Matrix.org Biztonsági hiba közzétételi szabályzatot.", @@ -2304,8 +2304,8 @@ "Session backup key:": "Munkamenet másolat kulcs:", "Use Single Sign On to continue": "A folytatáshoz használd az egyszeri bejelentkezést (SSO)", "Single Sign On": "Egyszeri bejelentkezés", - "%(name)s is requesting verification": "%(name)s ellenőrzést kér", - "Sends a message as html, without interpreting it as markdown": "Az üzenet elküldése html szövegként anélkül, hogy „markdown” formázás lenne", + "%(name)s is requesting verification": "A(z) %(name)s ellenőrzést kér", + "Sends a message as html, without interpreting it as markdown": "Az üzenet elküldése html szövegként anélkül, hogy „markdown” formázásként értelmezné", "Confirm the emoji below are displayed on both sessions, in the same order:": "Erősítsd meg, hogy az alábbi emodzsik mindkét munkamenetben azonos sorrendben jelentek meg:", "Verify this session by confirming the following number appears on its screen.": "Ellenőrizd ezt a munkamenetet azzal, hogy megerősíted, hogy az alábbi szám jelent meg a kijelzőjén.", "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Az ellenőrzéshez a másik munkamenetedre várakozunk, %(deviceName)s (%(deviceId)s)…", @@ -2348,8 +2348,8 @@ "Confirm adding this email address by using Single Sign On to prove your identity.": "Erősítsd meg, hogy az egyszeri bejelentkezésnél a személyazonosságod bizonyításaként használt e-mail címet hozzáadod.", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Erősítsd meg, hogy az egyszeri bejelentkezésnél a személyazonosságod bizonyításaként használt telefonszámot hozzáadod.", "If you cancel now, you won't complete your operation.": "A műveletet nem fejezed be, ha ezt most megszakítod.", - "Failed to set topic": "A téma beállítása nem sikerült", - "Command failed": "A parancs nem sikerült", + "Failed to set topic": "A téma beállítása sikertelen", + "Command failed": "A parancs sikertelen", "Could not find user in room": "A felhasználó nem található a szobában", "Enable cross-signing to verify per-user instead of per-session": "A felhasználó alapú ellenőrzéshez a munkamenet alapú helyett engedélyezd az eszközök közötti hitelesítést", "Keep recovery passphrase in memory for this session": "A visszaállítási jelmondat memóriában tartása ebben a munkamenetben", @@ -2406,5 +2406,7 @@ "Fetching keys from server...": "Kulcsok lekérdezése a szerverről…", "%(completed)s of %(total)s keys restored": "%(completed)s/%(total)s kulcs visszaállítva", "Keys restored": "Kulcsok visszaállítva", - "Successfully restored %(sessionCount)s keys": "Kulcsok (%(sessionCount)s) sikeresen visszaállítva" + "Successfully restored %(sessionCount)s keys": "Kulcsok (%(sessionCount)s) sikeresen visszaállítva", + "You signed in to a new session without verifying it:": "Ellenőrzés nélkül jelentkeztél be egy új munkamenetbe:", + "Verify your other session using one of the options below.": "Ellenőrizd a másik munkameneted a lenti lehetőségek egyikével." } From 626a3009163a6c6baf4b1a56a14cb0ff1d3b7bcc Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 6 May 2020 08:11:31 +0000 Subject: [PATCH 023/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 5ea7e7a413..f7122b400c 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2416,5 +2416,7 @@ "Fetching keys from server...": "正在從伺服器擷取金鑰……", "%(completed)s of %(total)s keys restored": "%(total)s 中的 %(completed)s 金鑰已復原", "Keys restored": "金鑰已復原", - "Successfully restored %(sessionCount)s keys": "成功復原 %(sessionCount)s 金鑰" + "Successfully restored %(sessionCount)s keys": "成功復原 %(sessionCount)s 金鑰", + "You signed in to a new session without verifying it:": "您已登入新的工作階段但未驗證:", + "Verify your other session using one of the options below.": "使用下方的其中一個選項來驗證您其他的工作階段。" } From b57bb6b29144e700a3fe8d394d782ff9f86216a3 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Wed, 6 May 2020 09:35:11 +0000 Subject: [PATCH 024/319] Translated using Weblate (Esperanto) Currently translated at 99.4% (2291 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 92 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 42a6ed52ca..031aac3fb3 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -688,7 +688,7 @@ "Submit debug logs": "Sendi sencimigan protokolon", "Fetching third party location failed": "Malsukcesis trovi lokon de ekstera liveranto", "A new version of Riot is available.": "Nova versio de Riot haveblas.", - "I understand the risks and wish to continue": "Mi komprenas la riskojn kaj volas daŭrigi", + "I understand the risks and wish to continue": "Mi komprenas la riskon kaj volas pluiĝi", "Send Account Data": "Sendi kontajn informojn", "Advanced notification settings": "Specialaj agordoj de sciigoj", "Uploading report": "Alŝutante raporton", @@ -1160,7 +1160,7 @@ "View older messages in %(roomName)s.": "Montri pli malnovajn mesaĝojn en %(roomName)s.", "Account management": "Administrado de kontoj", "This event could not be displayed": "Ĉi tiu okazo ne povis montriĝi", - "Please install Chrome, Firefox, or Safari for the best experience.": "Bonvolu instali Ĥromon, Fajrfokson, aŭ Safarion por la plej bonaj spertoj.", + "Please install Chrome, Firefox, or Safari for the best experience.": "Bonvolu instali foliumilon Chrome, Firefox, aŭ Safari, por la plej bona sperto.", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Vi estas administranto de tiu ĉi komunumo. Sen invito de alia administranto vi ne povos realiĝi.", "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Ŝanĝoj al viaj komunumaj nomo kaj profilbildo eble ne montriĝos al aliaj uzantoj ĝis 30 minutoj.", "Who can join this community?": "Kiu povas aliĝi al tiu ĉi komunumo?", @@ -2294,5 +2294,91 @@ "Confirm adding this email address by using Single Sign On to prove your identity.": "Konfirmi aldonon de ĉi tiu retpoŝtadreso, uzante ununuran saluton por pruvi vian identecon.", "Single Sign On": "Ununura saluto", "Confirm adding email": "Konfirmi aldonon de retpoŝtadreso", - "Click the button below to confirm adding this email address.": "Klaku la ĉi-suban butonon por konfirmi aldonon de ĉi tiu retpoŝtadreso." + "Click the button below to confirm adding this email address.": "Klaku la ĉi-suban butonon por konfirmi aldonon de ĉi tiu retpoŝtadreso.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Konfirmu aldonon de ĉi tiu telefonnumero per identiĝo per ununura saluto.", + "Confirm adding phone number": "Konfirmu aldonon de telefonnumero", + "Click the button below to confirm adding this phone number.": "Klaku la ĉi-suban butonon por konfirmi aldonon de ĉi tiu telefonnumero.", + "If you cancel now, you won't complete your operation.": "Se vi nuligos nun, vi ne finos vian agon.", + "Review where you’re logged in": "Kontrolu, kie vi salutis", + "New login. Was this you?": "Nova saluto. Ĉu tio estis vi?", + "%(name)s is requesting verification": "%(name)s petas kontrolon", + "Sends a message as html, without interpreting it as markdown": "Sendas mesaĝon kiel HTML, ne interpretante ĝin kiel MarkDown", + "Failed to set topic": "Malsukcesis agordi temon", + "Command failed": "Komando malsukcesis", + "Could not find user in room": "Ne povis trovi uzanton en ĉambro", + "Please supply a widget URL or embed code": "Bonvolu provizi URL-on al fenestraĵo aŭ enkorpigi kodon", + "Send a bug report with logs": "Sendi erarraporton kun protokolo", + "You signed in to a new session without verifying it:": "Vi salutis novan salutaĵon sen kontrolo:", + "Verify your other session using one of the options below.": "Kontrolu vian alian salutaĵon per unu el la ĉi-subaj elektebloj.", + "Enable cross-signing to verify per-user instead of per-session": "Permesi transirajn subskribojn por kontroli unuopajn uzantojn anstataŭ salutaĵojn", + "Keep recovery passphrase in memory for this session": "Teni rehavan pasfrazon en memoro dum ĉi tiu salutaĵo", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Konfirmu, ke la ĉi-subaj bildsignoj aperas samorde en ambaŭ salutaĵoj:", + "Verify this session by confirming the following number appears on its screen.": "Kontrolu ĉi tiun salutaĵon per konfirmo, ke la jena nombro aperas sur ĝia ekrano.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Atendante konfirmon de via alia salutaĵo, %(deviceName)s (%(deviceId)s)…", + "Verify all your sessions to ensure your account & messages are safe": "Kontrolu ĉiujn viajn salutaĵojn por certigi, ke viaj konto kaj mesaĝoj sekuras", + "Verify the new login accessing your account: %(name)s": "Kontrolu la novan saluton alirantan vian konton: %(name)s", + "From %(deviceName)s (%(deviceId)s)": "De %(deviceName)s (%(deviceId)s)", + "well formed": "bone formita", + "unexpected type": "neatendita tipo", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Konfirmu forigon de ĉi tiuj salutaĵoj per identiĝo per ununura saluto.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Konfirmu forigon de ĉi tiu salutaĵo per identiĝo per ununura saluto.", + "Confirm deleting these sessions": "Konfirmi forigon de ĉi tiuj salutaĵoj", + "Click the button below to confirm deleting these sessions.|other": "Klaku la ĉi-suban butonon por konfirmi forigon de ĉi tiuj salutaĵoj.", + "Click the button below to confirm deleting these sessions.|one": "Klaku la ĉi-suban butonon por konfirmi forigon de ĉi tiu salutaĵo.", + "Delete sessions|other": "Forigi salutaĵojn", + "Delete sessions|one": "Forigi salutaĵon", + "Where you’re logged in": "Kie vi salutis", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Sube administru la nomojn de viaj salutaĵoj kaj ilin adiaŭu, aŭ kontrolu ilin en via profilo de uzanto.", + "Waiting for you to accept on your other session…": "Atendante vian akcepton en via alia salutaĵo…", + "Almost there! Is your other session showing the same shield?": "Preskaŭ finite! Ĉu via alia salutaĵo montras la saman ŝildon?", + "Almost there! Is %(displayName)s showing the same shield?": "Preskaŭ finite! Ĉu %(displayName)s montras la saman ŝildon?", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Vi sukcese kontrolis %(deviceName)s (%(deviceId)s)!", + "Start verification again from the notification.": "Rekomencu kontroladon el la sciigo.", + "Start verification again from their profile.": "Rekomencu kontroladon el ĝia profilo.", + "Verification timed out.": "Kontrolo atingis tempolimon.", + "You cancelled verification on your other session.": "Vi nuligis kontrolon en via alia salutaĵo.", + "%(displayName)s cancelled verification.": "%(displayName)s nuligis kontrolon.", + "You cancelled verification.": "Vi nuligis kontrolon.", + "Can't load this message": "Ne povas enlegi ĉi tiun mesaĝon", + "Submit logs": "Alŝuti protokolon", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Rememorigo: via foliumilo ne estas subtenata, kaj via sperto do povas esti stranga.", + "Enable end-to-end encryption": "Ŝalti tutvojan ĉifradon", + "You can’t disable this later. Bridges & most bots won’t work yet.": "Vi ne povas ĉi tion malŝalti poste. Pontoj kaj plej multaj robotoj ankoraŭ ne funkcios.", + "Server did not require any authentication": "Servilo bezonis nenian kontrolon de aŭtentiko", + "Server did not return valid authentication information.": "Servilo ne redonis validajn informojn pri kontrolo de aŭtentiko.", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Knfirmu malaktivigon de via konto per identiĝo per ununura saluto.", + "Are you sure you want to deactivate your account? This is irreversible.": "Ĉu vi certe volas malaktivigi vian konton? Tio ne malfareblas.", + "Confirm account deactivation": "Konfirmi malaktivigon de konto", + "There was a problem communicating with the server. Please try again.": "Eraris komunikado kun la servilo. Bonvolu reprovi.", + "Unable to upload": "Ne povas alŝuti", + "Verify other session": "Kontroli alian salutaĵon", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Ne povas aliri sekretan deponejon. Bonvolu kontroli, ke vi enigis la ĝustan rehavan pasfrazon.", + "Warning: You should only do this on a trusted computer.": "Averto: vi faru ĉi tion nur per fidata komputilo.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "Se vi forgesis vian rehavan pasfrazon, vi povas uzi vian rehavan ŝlosilonagordi novajn rehavajn elekteblojn.", + "Restoring keys from backup": "Rehavo de ŝlosiloj el savkopio", + "Fetching keys from server...": "Akirante ŝlosilojn el servilo…", + "%(completed)s of %(total)s keys restored": "%(completed)s el %(total)s ŝlosiloj rehaviĝis", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Savkopio ne estis malĉifrebla per ĉi tiu rehava ŝlosilo: bonvolu kontroli, ke vi enigis la ĝustan rehavan ŝlosilon.", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Savkopio ne estis malĉifrebla per ĉi tiu rehava pasfrazo: bonvolu kontroli, ke vi enigis la ĝustan rehavan pasfrazon.", + "Keys restored": "Ŝlosiloj rehaviĝis", + "Successfully restored %(sessionCount)s keys": "Sukcese rehavis %(sessionCount)s ŝlosilojn", + "Sign in with SSO": "Saluti per ununura saluto", + "Welcome to %(appName)s": "Bonvenu al %(appName)s", + "Liberate your communication": "Liberigu vian komunikadon", + "Send a Direct Message": "Sendi rektan mesaĝon", + "Explore Public Rooms": "Esplori publikajn ĉambrojn", + "Create a Group Chat": "Krei grupan babilon", + "Self-verification request": "Memkontrola peto", + "Verify this login": "Kontroli ĉi tiun saluton", + "Syncing...": "Spegulante…", + "Signing In...": "Salutante…", + "If you've joined lots of rooms, this might take a while": "Se vi aliĝis al multaj ĉambroj, tio povas daŭri longe", + "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Konfirmu vian identecon per kontrolo de ĉi tiu saluto el unu el viaj aliaj salutaĵoj, permesante al ĝi legadon de ĉifritaj mesaĝoj.", + "This requires the latest Riot on your other devices:": "Ĉi tio bezonas la plej freŝan version de Rion sur viaj aliaj aparatoj:", + "or another cross-signing capable Matrix client": "aŭ alian Matrix-klienton kapablan je transiraj subskriboj", + "Use Recovery Passphrase or Key": "Uzi rehavajn pasfrazon aŭ ŝlosilon", + "Great! This recovery passphrase looks strong enough.": "Bonege! Ĉi tiu rehava pasfrazo ŝajnas sufiĉe forta.", + "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Agordu rehavan pasfrazon por sekurigi ĉifritajn informojn kaj rehavi ilin post adiaŭo. Ĝi malsamu al la pasvorto de via konto:", + "Enter a recovery passphrase": "Enigu rehavan pasfrazon", + "Back up encrypted message keys": "Savkopii ŝlosilojn al ĉifritaj mesaĝoj" } From 85524a053eb2a8f134cbe5d53eea3f8742507160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 6 May 2020 06:44:07 +0000 Subject: [PATCH 025/319] Translated using Weblate (French) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index d3c671a898..74c3e6e959 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2417,5 +2417,7 @@ "Fetching keys from server...": "Récupération des clés depuis le serveur…", "%(completed)s of %(total)s keys restored": "%(completed)s clés sur %(total)s restaurées", "Keys restored": "Clés restaurées", - "Successfully restored %(sessionCount)s keys": "%(sessionCount)s clés ont été restaurées avec succès" + "Successfully restored %(sessionCount)s keys": "%(sessionCount)s clés ont été restaurées avec succès", + "You signed in to a new session without verifying it:": "Vous vous êtes connecté·e à une nouvelle session sans la vérifier :", + "Verify your other session using one of the options below.": "Vérifiez votre autre session en utilisant une des options ci-dessous." } From 3fd089d084d8776af9c2108ce6c9952f567c82b3 Mon Sep 17 00:00:00 2001 From: call_xz Date: Wed, 6 May 2020 05:11:52 +0000 Subject: [PATCH 026/319] Translated using Weblate (Japanese) Currently translated at 54.9% (1264 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 7e7c1443a4..024f6cd2c4 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -305,7 +305,7 @@ "Define the power level of a user": "ユーザーの権限レベルを定義", "Deops user with given id": "指定されたIDのユーザーを非表示", "Opens the Developer Tools dialog": "開発者ツールダイアログを開きます", - "Verified key": "確認済みのキー", + "Verified key": "検証済みの鍵", "Displays action": "アクションを表示", "Forces the current outbound group session in an encrypted room to be discarded": "暗号化されたルーム内の現在のアウトバウンドグループセッションを強制的に破棄します", "Reason": "理由", @@ -953,8 +953,8 @@ "Open Devtools": "開発ツールを開く", "Flair": "バッジ", "Fill screen": "フィルスクリーン", - "Light theme": "明るいテーマ", - "Dark theme": "暗いテーマ", + "Light theme": "ライトテーマ", + "Dark theme": "ダークテーマ", "Unignore": "無視しない", "Unable to load! Check your network connectivity and try again.": "ロードできません! ネットワーク通信を確認の上もう一度お試しください。", "Failed to invite users to the room:": "部屋にユーザーを招待できませんでした:", @@ -1272,5 +1272,32 @@ "Enter your custom homeserver URL What does this mean?": "独自のホームサーバー URL を入力 詳細情報", "Homeserver URL": "ホームサーバー URL", "Sign in instead": "サインインする", - "Create your account": "アカウントの作成" + "Create your account": "アカウントの作成", + "Verify this session": "このセッションの検証", + "Encryption upgrade available": "暗号化のアップグレードが利用できます", + "Not Trusted": "まだ信頼されていません", + "Manually Verify by Text": "テキストを使って手動で検証", + "Interactively verify by Emoji": "絵文字を使って検証", + "Done": "戻る", + "Later": "後で", + "Review": "検証", + "Verify yourself & others to keep your chats safe": "あなたと他の人々とのチャットの安全性を検証", + "Upgrade": "アップグレード", + "Verify": "検証", + "Invite only": "招待者のみ参加可能", + "Trusted": "信頼済み", + "Not trusted": "未信頼", + "%(count)s verified sessions|other": "%(count)s 件の検証済みのセッション", + "%(count)s verified sessions|one": "1 件の検証済みのセッション", + "Hide verified sessions": "検証済みのセッションを隠す", + "%(count)s sessions|other": "%(count)s 件のセッション", + "%(count)s sessions|one": "%(count)s 件のセッション", + "Hide sessions": "セッションを隠す", + "Security": "セキュリティ", + "Welcome to %(appName)s": "%(appName)s へようこそ", + "Liberate your communication": "あなたのコミュニケーションを解放する", + "Send a Direct Message": "ダイレクトメッセージを送信", + "Explore Public Rooms": "公開された部屋を探す", + "Create a Group Chat": "グループチャットを作成", + "Go Back": "戻る" } From c74537383a9246ad688a16aecf0564f7bb5ce894 Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Wed, 6 May 2020 00:17:44 +0000 Subject: [PATCH 027/319] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 50.1% (1155 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index da3b56ccc5..fe6ca61a49 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1138,5 +1138,31 @@ "Signing In...": "Logger inn …", "NOT verified": "IKKE verifisert", "Calls": "Samtaler", - "Room List": "Romliste" + "Room List": "Romliste", + "Never send encrypted messages to unverified sessions from this session": "Aldri send krypterte meldinger til uverifiserte økter fra denne økten", + "Verify yourself & others to keep your chats safe": "Verifiser deg selv og andre for å holde samtalene dine trygge", + "Cross-signing and secret storage are enabled.": "Kryssignering og hemmelig lagring er skrudd på.", + "Cross-signing and secret storage are not yet set up.": "Kryssignering og hemmelig lagring er ikke satt enda.", + "Reset cross-signing and secret storage": "Tilbakestill kryssignering og hemmelig lagring", + "Bootstrap cross-signing and secret storage": "Iverksett kryssignering og hemmelig lagring", + "Cross-signing public keys:": "Offentlige nøkler for kryssignering:", + "Cross-signing private keys:": "Private nøkler for kryssignering:", + "Self signing private key:": "Selvsignert privat nøkkel:", + "User signing private key:": "Brukersignert privat nøkkel:", + "Session backup key:": "Øktsikkerhetskopieringsnøkkel:", + "Secret storage public key:": "Offentlig nøkkel for hemmelig lagring:", + "Homeserver feature support:": "Hjemmetjener-funksjonsstøtte:", + "Secret Storage key format:": "Nøkkelformatet for hemmelig lagring:", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot kan ikke lagre krypterte meldinger sikkert når den kjøres i en nettleser. Bruk Riot Desktop for at krypterte meldinger skal dukke opp i søkeresultater.", + "Read Marker lifetime (ms)": "Lesemarkørens visningstid (ms)", + "Read Marker off-screen lifetime (ms)": "Lesemarkørens visningstid utenfor skjermen (ms)", + "Cross-signing": "Kryssignering", + "Where you’re logged in": "Der du er pålogget", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Behandle navnene til samt logge av dine økter nedenfor eller verifiser dem i brukerprofilen din.", + "Learn more about how we use analytics.": "Lær mer om hvordan vi bruker statistikker.", + "To link to this room, please add an alias.": "For å lenke til dette rommet, vennligst legg til et alias.", + "Showing flair for these communities:": "Viser merkeskilt for disse samfunnene:", + "URL previews are enabled by default for participants in this room.": "URL-forhåndsvisninger er skrudd på som standard for deltakerene i dette rommet.", + "URL previews are disabled by default for participants in this room.": "URL-forhåndsvisninger er skrudd av som standard for deltakerene i dette rommet.", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "I krypterte rom som denne, er URL-forhåndsvisninger skrudd av som standard for å sikre at hjemmetjeneren din (der forhåndsvisningene blir generert) ikke kan samle inn informasjon om lenkene som du ser i dette rommet." } From d3a276c627995514a5ad45a10c6086541cbfe0d7 Mon Sep 17 00:00:00 2001 From: call_xz Date: Wed, 6 May 2020 12:45:54 +0000 Subject: [PATCH 028/319] Translated using Weblate (Japanese) Currently translated at 54.9% (1266 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 024f6cd2c4..c39500d816 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1183,7 +1183,7 @@ "Display Name": "表示名", "Profile picture": "プロフィール画像", "Encryption enabled": "暗号化が有効です", - "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "この部屋内のメッセージはエンドツーエンドで暗号化されます。詳細およびユーザーの検証に関しては各ユーザーのプロフィールをご確認ください。", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されています。詳細およびユーザーの検証に関しては各ユーザーのプロフィールをご確認ください。", "Encryption not enabled": "暗号化が無効です", "The encryption used by this room isn't supported.": "この部屋では暗号化の使用がサポートされていません。", "Cross-signing public keys:": "クロス署名公開鍵:", @@ -1299,5 +1299,7 @@ "Send a Direct Message": "ダイレクトメッセージを送信", "Explore Public Rooms": "公開された部屋を探す", "Create a Group Chat": "グループチャットを作成", - "Go Back": "戻る" + "Go Back": "戻る", + "Messages in this room are end-to-end encrypted.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されています。", + "Messages in this room are not end-to-end encrypted.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されていません。" } From c750c28af9195334c265af10652d1fe1efa39848 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Wed, 6 May 2020 13:12:27 +0000 Subject: [PATCH 029/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 031aac3fb3..0c7312fcf9 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -2380,5 +2380,18 @@ "Great! This recovery passphrase looks strong enough.": "Bonege! Ĉi tiu rehava pasfrazo ŝajnas sufiĉe forta.", "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Agordu rehavan pasfrazon por sekurigi ĉifritajn informojn kaj rehavi ilin post adiaŭo. Ĝi malsamu al la pasvorto de via konto:", "Enter a recovery passphrase": "Enigu rehavan pasfrazon", - "Back up encrypted message keys": "Savkopii ŝlosilojn al ĉifritaj mesaĝoj" + "Back up encrypted message keys": "Savkopii ŝlosilojn al ĉifritaj mesaĝoj", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Atingu vian sekuran historion de mesaĝoj kaj vian transire subskriban identecon per enigo de via rehava pasfrazo.", + "Enter your recovery passphrase a second time to confirm it.": "Enigu vian rehavan pasfrazon duafoje por konfirmi ĝin.", + "Confirm your recovery passphrase": "Konfirmi vian rehavan pasfrazon", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Via rehava ŝlosilo asekuras vin – vi povas ĝin uzi por rehavi aliron al viaj ĉifritaj mesaĝoj se vi forgesas vian rehavan pasfrazon.", + "Unable to query secret storage status": "Ne povis peti staton de sekreta deponejo", + "Confirm recovery passphrase": "Konfirmi rehavan pasfrazon", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Ni deponos ĉifritan kopion de viaj ŝlosiloj en nia servilo. Sekurigu vian savkopion per rehava pasfrazo.", + "Enter a recovery passphrase...": "Enigu rehavan pasfrazon…", + "Please enter your recovery passphrase a second time to confirm.": "Bonvolu enigi vian rehavan pasfrazon duafoje por konfirmi.", + "Repeat your recovery passphrase...": "Ripetu vian rehavan pasfrazon…", + "Secure your backup with a recovery passphrase": "Sekurigu vian savkopion per rehava pasfrazo", + "Currently indexing: %(currentRoom)s": "Nun indeksante: %(currentRoom)s", + "Cancel replying to a message": "Nuligi respondon al mesaĝo" } From c42755c69343c576a90ca036a35a8888793c301a Mon Sep 17 00:00:00 2001 From: random Date: Wed, 6 May 2020 15:44:47 +0000 Subject: [PATCH 030/319] Translated using Weblate (Italian) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 78abb0e53e..e8012733c3 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2412,5 +2412,7 @@ "Fetching keys from server...": "Ricezione delle chiavi dal server...", "%(completed)s of %(total)s keys restored": "%(completed)s di %(total)s chiavi ripristinate", "Keys restored": "Chiavi ripristinate", - "Successfully restored %(sessionCount)s keys": "Ripristinate %(sessionCount)s chiavi correttamente" + "Successfully restored %(sessionCount)s keys": "Ripristinate %(sessionCount)s chiavi correttamente", + "You signed in to a new session without verifying it:": "Hai fatto l'accesso ad una nuova sessione senza verificarla:", + "Verify your other session using one of the options below.": "Verifica la tua altra sessione usando una delle opzioni sotto." } From fe00c23be88b7ba8f1a4f330d2279b7ac6c3b1b8 Mon Sep 17 00:00:00 2001 From: call_xz Date: Wed, 6 May 2020 12:53:40 +0000 Subject: [PATCH 031/319] Translated using Weblate (Japanese) Currently translated at 55.2% (1272 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index c39500d816..4188464408 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1301,5 +1301,11 @@ "Create a Group Chat": "グループチャットを作成", "Go Back": "戻る", "Messages in this room are end-to-end encrypted.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されています。", - "Messages in this room are not end-to-end encrypted.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されていません。" + "Messages in this room are not end-to-end encrypted.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されていません。", + "You signed in to a new session without verifying it:": "あなたのこのセッションはまだ検証されていません:", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) のこのセッションはまだ検証されていません:", + "Recent Conversations": "最近会話したユーザー", + "Suggestions": "提案", + "Start a conversation with someone using their name, username (like ) or email address.": "相手の名前、( のような)ユーザー名、メールアドレスを使って会話を開始できます。", + "Go": "続行" } From 7eea8277c54848b5a876e0e57292a2abd92e6588 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 6 May 2020 16:18:12 +0000 Subject: [PATCH 032/319] Translated using Weblate (Albanian) Currently translated at 99.9% (2301 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 7e94977f63..2232da27e0 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -213,7 +213,7 @@ "Invite to this room": "Ftojeni te kjo dhomë", "You cannot delete this message. (%(code)s)": "S’mund ta fshini këtë mesazh. (%(code)s)", "Thursday": "E enjte", - "I understand the risks and wish to continue": "I kuptoj rreziqet dhe dua të vazhdoj", + "I understand the risks and wish to continue": "I kuptoj rreziqet dhe dëshiroj të vazhdoj", "Logs sent": "Regjistrat u dërguan", "Back": "Mbrapsht", "Reply": "Përgjigje", @@ -1347,7 +1347,7 @@ "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. Learn more about encryption.": "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. Mësoni më tepër rreth fshehtëzimit.", "Want more than a community? Get your own server": "Doni më shumë se një bashkësi? Merrni një shërbyes tuajin", "Power level": "Shkallë pushteti", - "Please install Chrome, Firefox, or Safari for the best experience.": "Për funksionimin më të mirë, ju lutemi, instaloni Chrome, Firefox, ose Safari.", + "Please install Chrome, Firefox, or Safari for the best experience.": "Ju lutemi, për funksionimin më të mirë, instaloni Chrome, Firefox, ose Safari.", "A conference call could not be started because the integrations server is not available": "S’u nis dot një thirrje konferencë, ngaqë shërbyesi i integrimit s’është i kapshëm", "Replying With Files": "Përgjigje Me Kartela", "The file '%(fileName)s' failed to upload.": "Dështoi ngarkimi i kartelës '%(fileName)s'.", @@ -2378,5 +2378,35 @@ "Enter a recovery passphrase...": "Jepni një frazëkalim rimarrjesh…", "Please enter your recovery passphrase a second time to confirm.": "Ju lutemi, jepeni frazëkalimin tuaj të rimarrjeve edhe një herë, për ta ripohuar.", "Repeat your recovery passphrase...": "Përsëritni frazëkalimin tuaj të rimarrjeve…", - "Secure your backup with a recovery passphrase": "Sigurojeni kopjeruajtjen tuaj me një frazëkalim rimarrjesh" + "Secure your backup with a recovery passphrase": "Sigurojeni kopjeruajtjen tuaj me një frazëkalim rimarrjesh", + "Review where you’re logged in": "Shqyrtojini kur të jeni i futur", + "New login. Was this you?": "Hyrje e re. Ju qetë?", + "Please supply a widget URL or embed code": "Ju lutemi, furnizoni një URL widget-i ose kod trupëzimi", + "Send a bug report with logs": "Dërgoni një njoftim të metash me regjistra", + "You signed in to a new session without verifying it:": "Bëtë hyrjen në një sesion të ri pa e verifikuar:", + "Verify your other session using one of the options below.": "Verifikoni sesionit tuaj tjetër duke përdorur një nga mundësitë më poshtë.", + "Enable cross-signing to verify per-user instead of per-session": "Aktivizoni cross-signing për të verifikuar me bazë përdorues në vend se me bazë sesioni", + "Lock": "Kyçje", + "Verify all your sessions to ensure your account & messages are safe": "Verifikoni krejt sesionet tuaj që të siguroheni se llogaria & mesazhet tuaja janë të sigurt", + "Verify the new login accessing your account: %(name)s": "Verifikoni kredencialet e reja për hyrje te llogaria juaj: %(name)s", + "Cross-signing": "Cross-signing", + "Where you’re logged in": "Kur të jeni i futur", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Administroni emrat dhe bëni daljen pre sesioneve tuaj më poshtë ose verifikojini te Profili juaj i Përdoruesit.", + "Reset": "Rikthe te parazgjedhjet", + "Can't load this message": "S’ngarkohet dot ky mesazh", + "Submit logs": "Parashtro regjistra", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Kujtesë: Shfletuesi juaj është i pambuluar, ndaj punimi juaj mund të jetë i paparashikueshëm.", + "Unable to upload": "S’arrihet të ngarkohet", + "Restoring keys from backup": "Po rikthehen kyçesh nga kopjeruajtje", + "Fetching keys from server...": "Po sillen kyçet prej shërbyesi…", + "%(completed)s of %(total)s keys restored": "U rikthyen %(completed)s nga %(total)s kyçe", + "Keys restored": "Kyçet u rikthyen", + "Successfully restored %(sessionCount)s keys": "U rikthyen me sukses %(sessionCount)s kyçe", + "Verify this login": "Verifikoni këto kredenciale hyrjeje", + "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Ripohoni identitetin tuaj duke verifikuar këto kredenciale hyrjesh prej një nga sesionet tuaj të tjerë, duke i akorduar hyrje te mesazhet e fshehtëzuar.", + "This requires the latest Riot on your other devices:": "Kjo lyp Riot-in më të ri te pajisjet tuaja të tjera:", + "or another cross-signing capable Matrix client": "ose një tjetër klient Matrix i aftë për cross-signing Date: Wed, 6 May 2020 17:38:00 +0000 Subject: [PATCH 033/319] Translated using Weblate (Albanian) Currently translated at 99.8% (2300 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 2232da27e0..ee2781f445 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -1100,7 +1100,7 @@ "Developer options": "Mundësi zhvilluesi", "General": "Të përgjithshme", "Room Addresses": "Adresa Dhomash", - "Set a new account password...": "Caktoni një fjalëkalim të rri llogarie…", + "Set a new account password...": "Caktoni një fjalëkalim të ri llogarie…", "Email addresses": "Adresa email", "Phone numbers": "Numra telefonash", "Language and region": "Gjuhë dhe rajon", From cff7ce3934ef03659d75881f59b8f6559bcca678 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 6 May 2020 18:48:53 +0000 Subject: [PATCH 034/319] Translated using Weblate (Hungarian) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 5eebbe8478..afad390192 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2408,5 +2408,6 @@ "Keys restored": "Kulcsok visszaállítva", "Successfully restored %(sessionCount)s keys": "Kulcsok (%(sessionCount)s) sikeresen visszaállítva", "You signed in to a new session without verifying it:": "Ellenőrzés nélkül jelentkeztél be egy új munkamenetbe:", - "Verify your other session using one of the options below.": "Ellenőrizd a másik munkameneted a lenti lehetőségek egyikével." + "Verify your other session using one of the options below.": "Ellenőrizd a másik munkameneted a lenti lehetőségek egyikével.", + "Invite someone using their name, username (like ), email address or share this room.": "Hívj meg valakit a nevével, felhasználónevével (mint ), e-mail címével vagy oszd meg ezt a szobát." } From d31a0199bc60d0e007f98f0af692fd58e9f6209c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 6 May 2020 14:24:16 -0600 Subject: [PATCH 035/319] Add default dialog aesthetics to avoid empty SSO dialogs in future --- .../views/dialogs/InteractiveAuthDialog.js | 32 +++++++++++++++++-- src/i18n/strings/en_EN.json | 3 ++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.js b/src/components/views/dialogs/InteractiveAuthDialog.js index af5dc5108c..d9cc13e11c 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.js +++ b/src/components/views/dialogs/InteractiveAuthDialog.js @@ -25,6 +25,7 @@ import { _t } from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; import {ERROR_USER_CANCELLED} from "../../structures/InteractiveAuth"; +import {SSOAuthEntry} from "../auth/InteractiveAuthEntryComponents"; export default createReactClass({ displayName: 'InteractiveAuthDialog', @@ -66,6 +67,8 @@ export default createReactClass({ // } // } // } + // + // Default is defined in _getDefaultDialogAesthetics() aestheticsForStagePhases: PropTypes.object, }, @@ -79,6 +82,28 @@ export default createReactClass({ }; }, + _getDefaultDialogAesthetics: function() { + const ssoAesthetics = { + [SSOAuthEntry.PHASE_PREAUTH]: { + title: _t("Use Single Sign On to continue"), + body: _t("To continue, use Single Sign On to prove your identity."), + continueText: _t("Single Sign On"), + continueKind: "primary", + }, + [SSOAuthEntry.PHASE_POSTAUTH]: { + title: _t("Confirm to continue"), + body: _t("Click the button below to confirm your identity."), + continueText: _t("Confirm"), + continueKind: "primary", + }, + }; + + return { + [SSOAuthEntry.LOGIN_TYPE]: ssoAesthetics, + [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: ssoAesthetics, + } + }, + _onAuthFinished: function(success, result) { if (success) { this.props.onFinished(true, result); @@ -113,9 +138,10 @@ export default createReactClass({ let body = this.state.authError ? null : this.props.body; let continueText = null; let continueKind = null; - if (!this.state.authError && this.props.aestheticsForStagePhases) { - if (this.props.aestheticsForStagePhases[this.state.uiaStage]) { - const aesthetics = this.props.aestheticsForStagePhases[this.state.uiaStage][this.state.uiaStagePhase]; + const dialogAesthetics = this.props.aestheticsForStagePhases || this._getDefaultDialogAesthetics(); + if (!this.state.authError && dialogAesthetics) { + if (dialogAesthetics[this.state.uiaStage]) { + const aesthetics = dialogAesthetics[this.state.uiaStage][this.state.uiaStagePhase]; if (aesthetics && aesthetics.title) title = aesthetics.title; if (aesthetics && aesthetics.body) body = aesthetics.body; if (aesthetics && aesthetics.continueText) continueText = aesthetics.continueText; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a24b2bde73..dc92ef310d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1639,6 +1639,9 @@ "Enable 'Manage Integrations' in Settings to do this.": "Enable 'Manage Integrations' in Settings to do this.", "Integrations not allowed": "Integrations not allowed", "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.", + "To continue, use Single Sign On to prove your identity.": "To continue, use Single Sign On to prove your identity.", + "Confirm to continue": "Confirm to continue", + "Click the button below to confirm your identity.": "Click the button below to confirm your identity.", "Failed to invite the following users to chat: %(csvUsers)s": "Failed to invite the following users to chat: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.", "Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.", From 17be9805e15c094fc1942deb30eb7f57bccdcf9e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 6 May 2020 14:24:37 -0600 Subject: [PATCH 036/319] Set SSO dialog aesthetics for cross-signing setup Fixes https://github.com/vector-im/riot-web/issues/13042 --- .../CreateSecretStorageDialog.js | 21 +++++++++++++++++++ src/i18n/strings/en_EN.json | 2 ++ 2 files changed, 23 insertions(+) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 2c05f231e7..c8ddd361fc 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -25,6 +25,7 @@ import { _t } from '../../../../languageHandler'; import Modal from '../../../../Modal'; import { promptForBackupPassphrase } from '../../../../CrossSigningManager'; import {copyNode} from "../../../../utils/strings"; +import {SSOAuthEntry} from "../../../../components/views/auth/InteractiveAuthEntryComponents"; const PHASE_LOADING = 0; const PHASE_LOADERROR = 1; @@ -209,12 +210,32 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } else { const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); + + const dialogAesthetics = { + [SSOAuthEntry.PHASE_PREAUTH]: { + title: _t("Use Single Sign On to continue"), + body: _t("To continue, use Single Sign On to prove your identity."), + continueText: _t("Single Sign On"), + continueKind: "primary", + }, + [SSOAuthEntry.PHASE_POSTAUTH]: { + title: _t("Confirm encryption setup"), + body: _t("Click the button below to confirm setting up encryption."), + continueText: _t("Confirm"), + continueKind: "primary", + }, + }; + const { finished } = Modal.createTrackedDialog( 'Cross-signing keys dialog', '', InteractiveAuthDialog, { title: _t("Setting up keys"), matrixClient: MatrixClientPeg.get(), makeRequest, + aestheticsForStagePhases: { + [SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics, + [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics, + }, }, ); const [confirmed] = await finished; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index dc92ef310d..7d2e016394 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2193,6 +2193,8 @@ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", "File to import": "File to import", "Import": "Import", + "Confirm encryption setup": "Confirm encryption setup", + "Click the button below to confirm setting up encryption.": "Click the button below to confirm setting up encryption.", "Enter your account password to confirm the upgrade:": "Enter your account password to confirm the upgrade:", "Restore your key backup to upgrade your encryption": "Restore your key backup to upgrade your encryption", "Restore": "Restore", From b8fd50c5e328058a0928ff007c22e959b843de6d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 6 May 2020 14:27:32 -0600 Subject: [PATCH 037/319] Appease the linter --- src/components/views/dialogs/InteractiveAuthDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.js b/src/components/views/dialogs/InteractiveAuthDialog.js index d9cc13e11c..b06ce63ecd 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.js +++ b/src/components/views/dialogs/InteractiveAuthDialog.js @@ -101,7 +101,7 @@ export default createReactClass({ return { [SSOAuthEntry.LOGIN_TYPE]: ssoAesthetics, [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: ssoAesthetics, - } + }; }, _onAuthFinished: function(success, result) { From e5da81b6ba3ed6ba9274504f66ca6aed06b7fcb4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 6 May 2020 14:42:03 -0600 Subject: [PATCH 038/319] Ensure key backup gets dealt with correctly during secret storage reset Fixes https://github.com/vector-im/riot-web/issues/13562 We only initialize a new key backup if the user requested one. If they've requested new keys but have not asked for keys to be backed up, we simply delete the now-invalid backup. This also adds some logging to identify in rageshakes when someone resets their cross-signing, and when their key backup is being deleted. --- .../dialogs/secretstorage/CreateSecretStorageDialog.js | 10 +++++++++- src/components/views/settings/CrossSigningPanel.js | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 2c05f231e7..9d07628093 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -236,12 +236,20 @@ export default class CreateSecretStorageDialog extends React.PureComponent { try { if (force) { + console.log("Forcing secret storage reset"); // log something so we can debug this later await cli.bootstrapSecretStorage({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, createSecretStorageKey: async () => this._recoveryKey, - setupNewKeyBackup: true, + setupNewKeyBackup: this.state.useKeyBackup, setupNewSecretStorage: true, }); + if (!this.state.useKeyBackup && this.state.backupInfo) { + // If the user is resetting their cross-signing keys and doesn't want + // key backup (but had it enabled before), delete the key backup as it's + // no longer valid. + console.log("Deleting invalid key backup (secrets have been reset; key backup not requested)"); + await cli.deleteKeyBackupVersion(this.state.backupInfo.version); + } } else { await cli.bootstrapSecretStorage({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index cb04d2a018..c07f1c25dd 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -131,8 +131,8 @@ export default class CrossSigningPanel extends React.PureComponent { } _destroySecureSecretStorage = () => { - const ConfirmDestoryCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog"); - Modal.createDialog(ConfirmDestoryCrossSigningDialog, { + const ConfirmDestroyCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog"); + Modal.createDialog(ConfirmDestroyCrossSigningDialog, { onFinished: this.onDestroyStorage, }); } From fa5aa2847290f0bd0a6a1261545cae8798f6415f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 6 May 2020 23:06:20 +0000 Subject: [PATCH 039/319] Translated using Weblate (Estonian) Currently translated at 35.3% (813 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index d640121c0b..01096fd62c 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -810,5 +810,7 @@ "Encrypted messages in group chats": "Rühmavestluste krüptitud sõnumid", "When I'm invited to a room": "Kui mind kutsutakse jututuppa", "Call invitation": "Kõnekutse", - "Messages sent by bot": "Robotite saadetud sõnumid" + "Messages sent by bot": "Robotite saadetud sõnumid", + "Please install Chrome, Firefox, or Safari for the best experience.": "Parima kasutuskogemuse jaoks palun paigalda Chrome, Firefox või Safari.", + "I understand the risks and wish to continue": "Ma mõistan riske ja soovin jätkata" } From c6b8f5048428f92c7af5693eb922d3b3b6ded414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 6 May 2020 23:10:46 +0000 Subject: [PATCH 040/319] Translated using Weblate (Estonian) Currently translated at 35.5% (818 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 01096fd62c..096d97b5ac 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -812,5 +812,10 @@ "Call invitation": "Kõnekutse", "Messages sent by bot": "Robotite saadetud sõnumid", "Please install Chrome, Firefox, or Safari for the best experience.": "Parima kasutuskogemuse jaoks palun paigalda Chrome, Firefox või Safari.", - "I understand the risks and wish to continue": "Ma mõistan riske ja soovin jätkata" + "I understand the risks and wish to continue": "Ma mõistan riske ja soovin jätkata", + "URL Previews": "URL'ide eelvaated", + "You have enabled URL previews by default.": "Vaikimisi oled URL'ide eelvaated võtnud kasutusele.", + "You have disabled URL previews by default.": "Vaikimisi oled URL'ide eelvaated lülitanud välja.", + "URL previews are enabled by default for participants in this room.": "URL'ide eelvaated on vaikimisi kasutusel selles jututoas osalejate jaoks.", + "URL previews are disabled by default for participants in this room.": "URL'ide eelvaated on vaikimisi lülitatud välja selles jututoas osalejate jaoks." } From 7c1ac7aaffe17a7a3941cb8bda4fb822876bf1ad Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 May 2020 10:02:40 +0100 Subject: [PATCH 041/319] fix unrelated tautology Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MatrixChat.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 05354fa5f2..3929711406 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1339,7 +1339,7 @@ export default class MatrixChat extends React.PureComponent { // this if we are not scrolled up in the view. To find out, delegate to // the timeline panel. If the timeline panel doesn't exist, then we assume // it is safe to reset the timeline. - if (!this.loggedInView.current || !this.loggedInView.current) { + if (!this.loggedInView.current) { return true; } return this.loggedInView.current.canResetTimelineInRoom(roomId); From e78c9ebbc5201139be83efdf4902f43df7eccc1d Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Thu, 7 May 2020 07:21:43 +0000 Subject: [PATCH 042/319] Translated using Weblate (Bulgarian) Currently translated at 93.3% (2149 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/bg/ --- src/i18n/strings/bg.json | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 87e5d928ac..347823f95c 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -2177,5 +2177,39 @@ "%(networkName)s rooms": "%(networkName)s стаи", "Matrix rooms": "Matrix стаи", "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Напомняне: браузърът ви не се поддържа, така че не всичко може да работи правилно.", - "Destroy cross-signing keys?": "Унищожаване на ключовете за кръстосано-подписване?" + "Destroy cross-signing keys?": "Унищожаване на ключовете за кръстосано-подписване?", + "You signed in to a new session without verifying it:": "Влязохте в нова сесия без да я верифицирате:", + "Verify your other session using one of the options below.": "Верифицирайте другите си сесии използвайки една от опциите по-долу.", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Изтриването на ключовете за кръстосано-подписване е необратимо. Всички, с които сте се верифицирали ще видят предупреждения за сигурността. Почти със сигурност не искате да направите това, освен ако не сте загубили всички устройства, от които можете да подписвате кръстосано.", + "Clear cross-signing keys": "Изчисти ключовете за кръстосано-подписване", + "Clear all data in this session?": "Изчисти всички данни в тази сесия?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Изчистването на всички данни от сесията е необратимо. Шифрованите съобщения ще бъдат загубени, освен ако няма резервно копие на ключовете им.", + "Enable end-to-end encryption": "Включи шифроване от-край-до-край", + "You can’t disable this later. Bridges & most bots won’t work yet.": "Не може да изключите това по-късно. Мостовете и повечето ботове все още не работят с това.", + "Server did not require any authentication": "Сървърът не изисква никаква автентикация", + "Server did not return valid authentication information.": "Сървърът не върна валидна информация относно автентикация.", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Потвърдете деактивацията на профила си използвайки Single Sign On за потвърждаване на самоличността.", + "Are you sure you want to deactivate your account? This is irreversible.": "Сигурни ли сте, че искате да деактивирате профила си? Това е необратимо.", + "Confirm account deactivation": "Потвърдете деактивирането на профила", + "There was a problem communicating with the server. Please try again.": "Имаше проблем при комуникацията със сървъра. Опитайте пак.", + "Verify session": "Потвърди сесията", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "За да потвърдите, че сесията е доверена, проверете, че ключа, който виждате в потребителските настройки на устройството съвпада с ключа по-долу:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "За да потвърдите, че сесията е доверена, свържете се със собственика й по друг начин (например на живо или по телефона) и ги попитайте дали ключът, който виждат в потребителските си настройки съвпада с ключа по-долу:", + "Session name": "Име на сесията", + "Session key": "Ключ за сесията", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Ако съвпада, натиснете бутона за потвърждение по-долу. Ако пък не, тогава някой прихваща сесията и вероятно искате да използвате бутона за блокиране вместо това.", + "Verification Requests": "Заявки за верификация", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Верифицирането на този потребител ще маркира сесията им като доверена при вас, както и вашата като доверена при тях.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Верифицирайте това устройство за да го маркирате като доверено. Доверявайки се на това устройство дава на вас и на другите потребители допълнително спокойствие при използването на от-край-до-край-шифровани съобщения.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Верифицирането на това устройство ще го маркира като доверено, а потребителите, които са потвърдили вас също ще се доверяват на него.", + "Failed to invite the following users to chat: %(csvUsers)s": "Неуспешно поканване на следните потребители в чата: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "Не можахме да създадем директен чат. Проверете потребителите, които искате да поканите и опитайте пак.", + "Something went wrong trying to invite the users.": "Нещо се обърка при опита да бъдат поканени потребителите.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "Не можахме да поканим тези потребители. Проверете потребителите, които искате да поканите и опитайте пак.", + "Recently Direct Messaged": "Скорошни директни чатове", + "Start a conversation with someone using their name, username (like ) or email address.": "Започнете чат с някой посредством име, потребителско име (като ) или имейл адрес.", + "Invite someone using their name, username (like ), email address or share this room.": "Поканете някой посредством име, потребителско име (като ), имейл адрес или като споделите тази стая.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Добавихте нова сесия '%(displayName)s', която изисква ключове за шифроване.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Непотвърдената ви сесия '%(displayName)s' изисква ключове за шифроване.", + "Loading session info...": "Зареждане на информация за сесията..." } From 0955e13d36defa500bab2ea50b653613be7e878e Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 7 May 2020 02:58:23 +0000 Subject: [PATCH 043/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index f7122b400c..85bbaaabc1 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2418,5 +2418,6 @@ "Keys restored": "金鑰已復原", "Successfully restored %(sessionCount)s keys": "成功復原 %(sessionCount)s 金鑰", "You signed in to a new session without verifying it:": "您已登入新的工作階段但未驗證:", - "Verify your other session using one of the options below.": "使用下方的其中一個選項來驗證您其他的工作階段。" + "Verify your other session using one of the options below.": "使用下方的其中一個選項來驗證您其他的工作階段。", + "Invite someone using their name, username (like ), email address or share this room.": "使用某人的名字、使用者名稱(如 )、電子郵件地址或分享此聊天室來邀請他們。" } From a2cd6ea1a1cd84a056180bf55bb8c402289f471f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 7 May 2020 08:43:54 +0000 Subject: [PATCH 044/319] Translated using Weblate (Estonian) Currently translated at 38.6% (889 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 73 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 096d97b5ac..9d06be8c88 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -817,5 +817,76 @@ "You have enabled URL previews by default.": "Vaikimisi oled URL'ide eelvaated võtnud kasutusele.", "You have disabled URL previews by default.": "Vaikimisi oled URL'ide eelvaated lülitanud välja.", "URL previews are enabled by default for participants in this room.": "URL'ide eelvaated on vaikimisi kasutusel selles jututoas osalejate jaoks.", - "URL previews are disabled by default for participants in this room.": "URL'ide eelvaated on vaikimisi lülitatud välja selles jututoas osalejate jaoks." + "URL previews are disabled by default for participants in this room.": "URL'ide eelvaated on vaikimisi lülitatud välja selles jututoas osalejate jaoks.", + "Enable Emoji suggestions while typing": "Näita kirjutamise ajal emoji-soovitusi", + "Use compact timeline layout": "Kasuta tihedat ajajoone paigutust", + "Show a placeholder for removed messages": "Näita kustutatud sõnumite asemel kohatäidet", + "Show join/leave messages (invites/kicks/bans unaffected)": "Näita jututubade liitumise ja lahkumise teateid (ei käi kutsete, müksamiste ja keelamiste kohta)", + "Show avatar changes": "Näita avataride muutusi", + "Show read receipts sent by other users": "Näita teiste kasutajate lugemisteatiseid", + "Always show message timestamps": "Alati näita sõnumite ajatempleid", + "Autoplay GIFs and videos": "Esita GIF-animatsioonid ja videod automaatselt", + "Always show encryption icons": "Alati näita krüptimise oleku ikoone", + "Show avatars in user and room mentions": "Näita avatare kasutajate ja jututubade mainimistes", + "Manually verify all remote sessions": "Verifitseeri käsitsi kõik välised sessioonid", + "Collecting app version information": "Kogun teavet rakenduse versiooni kohta", + "unknown caller": "tundmatu helistaja", + "Incoming voice call from %(name)s": "Saabuv häälkõne kasutajalt %(name)s", + "Incoming video call from %(name)s": "Saabuv videokõne kasutajalt %(name)s", + "Incoming call from %(name)s": "Saabuv kõne kasutajalt %(name)s", + "Decline": "Keeldu", + "Accept": "Võta vastu", + "The other party cancelled the verification.": "Teine osapool tühistas verifitseerimise.", + "Verified!": "Verifitseeritud!", + "You've successfully verified this user.": "Sa oled edukalt verifitseerinud selle kasutaja.", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Turvalised sõnumid selle kasutajaga on läbivalt krüptitud ning kolmandad osapooled ei saa neid lugeda.", + "Got It": "Saan aru", + "Scan this unique code": "Skaneeri seda unikaalset koodi", + "or": "või", + "Compare unique emoji": "Võrdle unikaalseid emoji'sid", + "Compare a unique set of emoji if you don't have a camera on either device": "Kui sul mõlemas seadmes pole kaamerat, siis võrdle unikaalset emoji'de komplekti", + "Start": "Alusta", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Kontrolli, et allpool näidatud emoji'd on kuvatud mõlemas sessioonis samas järjekorras:", + "Verify this user by confirming the following number appears on their screen.": "Verifitseeri see kasutaja tehes kindlaks, et järgnev number kuvatakse tema ekraanil.", + "Unable to find a supported verification method.": "Ei suuda leida toetatud verifitseerimismeetodit.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Ootan, et sinu teine sessioon %(deviceName)s (%(deviceId)s) verifitseeriks…", + "Waiting for %(displayName)s to verify…": "Ootan kasutaja %(displayName)s verifitseerimist…", + "Cancelling…": "Tühistan…", + "They match": "Nad klapivad", + "They don't match": "Nad ei klapi", + "To be secure, do this in person or use a trusted way to communicate.": "Turvalisuse mõttes on oluline, et teed seda nii, et kas olete üheskoos või kasutate suhtluskanalit, mida mõlemad usaldate.", + "Dog": "Koer", + "Cat": "Kass", + "Lion": "Lõvi", + "Horse": "Hobune", + "Unicorn": "Ükssarvik", + "Pig": "Siga", + "Elephant": "Elevant", + "Rabbit": "Jänes", + "Panda": "Panda", + "Rooster": "Kukk", + "Penguin": "Pingviin", + "Turtle": "Kilpkonn", + "Fish": "Kala", + "Octopus": "Kaheksajalg", + "Butterfly": "Liblikas", + "Flower": "Lill", + "Tree": "Puu", + "Cactus": "Kaktus", + "Mushroom": "Seen", + "Globe": "Maakera", + "Moon": "Kuu", + "Cloud": "Pilv", + "Fire": "Tuli", + "Banana": "Banaan", + "Apple": "Õun", + "Strawberry": "Maasikas", + "Corn": "Mais", + "Pizza": "Pitsa", + "Cake": "Kook", + "Heart": "Süda", + "Smiley": "Smaili", + "Robot": "Robot", + "Hat": "Müts", + "Glasses": "Prillid" } From 97a794c31816c9be4e19a7c7740f6bb20767e075 Mon Sep 17 00:00:00 2001 From: Lasse Liehu Date: Thu, 7 May 2020 06:17:15 +0000 Subject: [PATCH 045/319] Translated using Weblate (Finnish) Currently translated at 90.3% (2081 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index c17a2e8c35..8135462d60 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -771,7 +771,7 @@ "Set Password": "Aseta salasana", "An error occurred whilst saving your email notification preferences.": "Sähköposti-ilmoitusasetuksia tallettaessa tapahtui virhe.", "remove %(name)s from the directory.": "poista %(name)s luettelosta.", - "Off": "Pois päältä", + "Off": "Ei päällä", "Riot does not know how to join a room on this network": "Riot ei tiedä miten liittyä huoneeseen tässä verkossa", "Mentions only": "Vain maininnat", "Failed to remove tag %(tagName)s from room": "Tagin %(tagName)s poistaminen huoneesta epäonnistui", @@ -903,8 +903,8 @@ "Pin": "Nuppineula", "Call in Progress": "Puhelu meneillään", "General": "Yleiset", - "Security & Privacy": "Turvallisuus ja yksityisyys", - "Roles & Permissions": "Roolit ja käyttöoikeudet", + "Security & Privacy": "Tietoturva ja -suoja", + "Roles & Permissions": "Roolit ja oikeudet", "Room Name": "Huoneen nimi", "Room Topic": "Huoneen aihe", "Developer options": "Kehittäjävalinnat", @@ -1489,7 +1489,7 @@ "Message edits": "Viestin muokkaukset", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Tämän huoneen päivittäminen edellyttää huoneen nykyisen instanssin sulkemista ja uuden huoneen luomista sen tilalle. Jotta tämä kävisi huoneen jäsenten kannalta mahdollisimman sujuvasti, teemme seuraavaa:", "Upload all": "Lataa kaikki palvelimelle", - "Upload": "Lataa palvelimelle", + "Upload": "Lähetä", "Changes your avatar in all rooms": "Vaihtaa kuvasi kaikissa huoneissa", "%(senderName)s made no change.": "%(senderName)s ei tehnyt muutoksia.", "Show all": "Näytä kaikki", From cd25361837609c11b74cf51f6a07c8502b074f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Thu, 7 May 2020 06:30:13 +0000 Subject: [PATCH 046/319] Translated using Weblate (French) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 74c3e6e959..b7344b592f 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2419,5 +2419,6 @@ "Keys restored": "Clés restaurées", "Successfully restored %(sessionCount)s keys": "%(sessionCount)s clés ont été restaurées avec succès", "You signed in to a new session without verifying it:": "Vous vous êtes connecté·e à une nouvelle session sans la vérifier :", - "Verify your other session using one of the options below.": "Vérifiez votre autre session en utilisant une des options ci-dessous." + "Verify your other session using one of the options below.": "Vérifiez votre autre session en utilisant une des options ci-dessous.", + "Invite someone using their name, username (like ), email address or share this room.": "Invitez quelqu’un en utilisant leur nom, leur nom d’utilisateur (comme ), leur adresse e-mail ou partagez ce salon." } From 93287503282f94b6838155e071840af8e235f2e1 Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Thu, 7 May 2020 01:44:26 +0000 Subject: [PATCH 047/319] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 57.8% (1332 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 183 +++++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index fe6ca61a49..147584ed00 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -419,7 +419,7 @@ "Security": "Sikkerhet", "Got it": "Jeg forstår", "Reply": "Svar", - "Edit": "Rediger ", + "Edit": "Rediger", "Attachment": "Vedlegg", "Download %(text)s": "Last ned %(text)s", "Show all": "Vis alt", @@ -996,7 +996,7 @@ "Create Community": "Opprett et samfunn", "Please enter a name for the room": "Vennligst skriv inn et navn for rommet", "Set a room alias to easily share your room with other people.": "Velg et rom-alias for å dele rommet ditt enkelt med andre.", - "This room is private, and can only be joined by invitation.": "Dette rommet er privat, og man kan kun bli med etter invitasjon", + "This room is private, and can only be joined by invitation.": "Dette rommet er privat, og man kan kun bli med etter invitasjon.", "Create a public room": "Opprett et offentlig rom", "Create a private room": "Opprett et privat rom", "Topic (optional)": "Tema (valgfritt)", @@ -1164,5 +1164,182 @@ "Showing flair for these communities:": "Viser merkeskilt for disse samfunnene:", "URL previews are enabled by default for participants in this room.": "URL-forhåndsvisninger er skrudd på som standard for deltakerene i dette rommet.", "URL previews are disabled by default for participants in this room.": "URL-forhåndsvisninger er skrudd av som standard for deltakerene i dette rommet.", - "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "I krypterte rom som denne, er URL-forhåndsvisninger skrudd av som standard for å sikre at hjemmetjeneren din (der forhåndsvisningene blir generert) ikke kan samle inn informasjon om lenkene som du ser i dette rommet." + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "I krypterte rom som denne, er URL-forhåndsvisninger skrudd av som standard for å sikre at hjemmetjeneren din (der forhåndsvisningene blir generert) ikke kan samle inn informasjon om lenkene som du ser i dette rommet.", + "Confirm adding email": "Bekreft tillegging av E-postadresse", + "Confirm adding phone number": "Bekreft tillegging av telefonnummer", + "Setting up keys": "Setter opp nøkler", + "Review where you’re logged in": "Gå gjennom der du er pålogget", + "New login. Was this you?": "En ny pålogging. Var det deg?", + "Sign In or Create Account": "Logg inn eller lag en konto", + "Use an identity server": "Bruk en identitetstjener", + "Command failed": "Kommandoen mislyktes", + "Could not find user in room": "Klarte ikke å finne brukeren i rommet", + "Session already verified!": "Økten er allerede verifisert!", + "Displays information about a user": "Viser informasjon om en bruker", + "%(senderName)s banned %(targetName)s.": "%(senderName)s bannlyste %(targetName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s endret visningsnavnet sitt til %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s satte visningsnavnet sitt til %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s fjernet visningsnavnet sitt (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s fjernet profilbildet sitt.", + "%(senderName)s changed their profile picture.": "%(senderName)s endret profilbildet sitt.", + "%(senderName)s made no change.": "%(senderName)s gjorde ingen endringer.", + "%(targetName)s rejected the invitation.": "%(targetName)s avslo invitasjonen.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s trakk tilbake invitasjonen til %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s sparket ut %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s endret temaet til «%(topic)s».", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjernet rommets navn.", + "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s oppgraderte dette rommet.", + "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s gjorde rommet offentlig for alle som kjenner til denne lenken.", + "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s har tillatt gjester å bli med i rommet.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s har hindret gjester fra å bli med i rommet.", + "%(senderName)s removed the main address for this room.": "%(senderName)s fjernet hovedadressen til dette rommet.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s endret adressene til dette rommet.", + "%(senderName)s answered the call.": "%(senderName)s svarte på oppringingen.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s gikk fra %(fromPowerLevel)s til %(toPowerLevel)s", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-modulen ble endret på av %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-modulen ble lagt til av %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-modulen ble fjernet av %(senderName)s", + "Your Riot is misconfigured": "Ditt Riot-oppsett er feiloppsatt", + "a few seconds from now": "om noen sekunder fra nå", + "about a minute from now": "rundt et minutt fra nå", + "%(num)s minutes from now": "%(num)s minutter fra nå", + "about an hour from now": "rundt en time fra nå", + "%(num)s hours from now": "%(num)s timer fra nå", + "about a day from now": "rundt en dag fra nå", + "%(num)s days from now": "%(num)s dager fra nå", + "Not a valid Riot keyfile": "Ikke en gyldig Riot-nøkkelfil", + "Unrecognised address": "Adressen ble ikke gjenkjent", + "Unknown server error": "Ukjent tjenerfeil", + "Recent years are easy to guess": "Nylige år er lette å gjette", + "Dates are often easy to guess": "Datoer er ofte lette å gjette", + "This is a top-10 common password": "Dette er et topp-10 vanlig passord", + "This is a top-100 common password": "Dette er et topp-100 vanlig passord", + "Message Pinning": "Meldingsklistring", + "Aeroplane": "Fly", + "Verify all your sessions to ensure your account & messages are safe": "Verifiser alle øktene dine for å sikre at kontoen og meldingene dine er trygge", + "From %(deviceName)s (%(deviceId)s)": "Fra %(deviceName)s (%(deviceId)s)", + "Decline (%(counter)s)": "Avslå (%(counter)s)", + "Upload new:": "Last opp ny:", + "No display name": "Ingen visningsnavn", + "New passwords don't match": "De nye passordene samsvarer ikke", + "Passwords can't be empty": "Passord kan ikke være tomme", + "Do you want to set an email address?": "Vil du velge en E-postadresse?", + "unexpected type": "uventet type", + "Delete sessions|other": "Slett økter", + "Delete sessions|one": "Slett økten", + "Clear notifications": "Tøm varsler", + "Disconnect anyway": "Koble fra likevel", + "You have not ignored anyone.": "Du har ikke ignorert noen.", + "You are not subscribed to any lists": "Du er ikke abonnert på noen lister", + "Uploaded sound": "Lastet opp lyd", + "Notify everyone": "Varsle alle", + "Muted Users": "Dempede brukere", + "Incorrect verification code": "Ugyldig verifiseringskode", + "Unable to add email address": "Klarte ikke å legge til E-postadressen", + "Invite only": "Kun ved invitasjon", + "Close preview": "Lukk forhåndsvisning", + "Failed to kick": "Mislyktes i å sparke ut", + "Unban this user?": "Vil du oppheve bannlysingen av denne brukeren?", + "Ban this user?": "Vil du bannlyse denne brukeren?", + "Demote yourself?": "Vil du degradere deg selv?", + "Demote": "Degrader", + "Revoke Moderator": "Trekk tilbake moderatorstatus", + "Make Moderator": "Gjør til moderator", + "and %(count)s others...|other": "og %(count)s andre …", + "and %(count)s others...|one": "og én annen …", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (styrkenivå %(powerLevelNumber)s)", + "Hangup": "Legg på røret", + "The conversation continues here.": "Samtalen fortsetter her.", + "Jump to message": "Hopp til meldingen", + "System Alerts": "Systemvarsler", + "Rejecting invite …": "Avslår invitasjonen …", + "You were kicked from %(roomName)s by %(memberName)s": "Du ble sparket ut fra %(roomName)s av %(memberName)s", + "Reason: %(reason)s": "Årsak: %(reason)s", + "You were banned from %(roomName)s by %(memberName)s": "Du ble bannlyst fra %(roomName)s av %(memberName)s", + "Do you want to chat with %(user)s?": "Vil du prate med %(user)s?", + "Do you want to join %(roomName)s?": "Vil du bli med i %(roomName)s?", + "Reject & Ignore user": "Avslå og ignorer brukeren", + "This room has already been upgraded.": "Dette rommet har allerede blitt oppgradert.", + "Unknown Command": "Ukjent kommando", + "Revoke invite": "Trekk tilbake invitasjonen", + "Invited by %(sender)s": "Invitert av %(sender)s", + "Mark all as read": "Merk alle som lest", + "Other published addresses:": "Andre publiserte adresser:", + "Invalid community ID": "Ugyldig samfunns-ID", + "Waiting for %(displayName)s to accept…": "Venter på at %(displayName)s skal akseptere …", + "Your homeserver": "Hjemmetjeneren din", + "%(count)s verified sessions|other": "%(count)s verifiserte økter", + "Hide verified sessions": "Skjul verifiserte økter", + "Remove from community": "Fjern fra samfunnet", + "Error decrypting audio": "Feil under dekryptering av lyd", + "Decrypt %(text)s": "Dekrypter %(text)s", + "You verified %(name)s": "Du verifiserte %(name)s", + "A new version of Riot is available.": "En ny versjon av Riot er tilgjengelig.", + "were kicked %(count)s times|other": "ble sparket ut %(count)s ganger", + "was kicked %(count)s times|other": "ble sparket ut %(count)s ganger", + "Some characters not allowed": "Noen tegn er ikke tillatt", + "This alias is available to use": "Dette aliaset er tilgjengelig for bruk", + "This alias is already in use": "Dette aliaset er allerede i bruk", + "You have entered an invalid address.": "Du har skrevet inn en ugyldig adresse.", + "Invite anyway": "Inviter likevel", + "Enable end-to-end encryption": "Aktiver start-til-mål-kryptering", + "You can’t disable this later. Bridges & most bots won’t work yet.": "Du kan ikke skru dette av senere. Broer og mange botter vil ikke fungere enda.", + "Begin Verifying": "Begynn verifiseringen", + "View Servers in Room": "Vis tjenerne i rommet", + "Ignore request": "Ignorer forespørselen", + "Loading session info...": "Laster inn økt-infoen …", + "a key signature": "en nøkkelsignatur", + "Send Logs": "Send loggbøker", + "Command Help": "Kommandohjelp", + "Share Permalink": "Del en permalenke", + "Who can join this community?": "Hvem kan bli med i dette samfunnet?", + "Long Description (HTML)": "Lang beskrivelse (HTML)", + "Welcome to %(appName)s": "Velkommen til %(appName)s", + "Send a Direct Message": "Send en direktemelding", + "Failed to leave room": "Mislyktes i å forlate rommet", + "Connectivity to the server has been lost.": "Tilkoblingen til tjeneren er nede.", + "Click to unmute video": "Klikk for å høre videoen", + "Click to mute video": "Klikk for å dempe videoen", + "Click to unmute audio": "Klikk for å høre lyden", + "Click to mute audio": "Klikk for å dempe lyden", + "Uploading %(filename)s and %(count)s others|zero": "Laster opp %(filename)s", + "Could not load user profile": "Klarte ikke å laste inn brukerprofilen", + "Verify this login": "Verifiser denne påloggingen", + "A new password must be entered.": "Et nytt passord må bli skrevet inn.", + "New passwords must match each other.": "De nye passordene må samsvare med hverandre.", + "This account has been deactivated.": "Denne kontoen har blitt deaktivert.", + "Incorrect username and/or password.": "Feil brukernavn og/eller passord.", + "Set a display name:": "Velg et visningsnavn:", + "Continue with previous account": "Fortsett med tidligere konto", + "Clear personal data": "Tøm personlige data", + "Ed25519 fingerprint": "Ed25519-fingeravtrykk", + "Curve25519 identity key": "Curve25519-identitetsnøkkel", + "Decryption error": "Dekrypteringsfeil", + "Passphrases must match": "Passfrasene må samsvare", + "Passphrase must not be empty": "Passfrasen kan ikke være tom", + "Confirm passphrase": "Bekreft passfrasen", + "Great! This recovery passphrase looks strong enough.": "Strålende! Denne gjenopprettingspassfrasen ser solid nok ut.", + "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Velg en gjenopprettingspassfrase til å sikre kryptert informasjon og å gjenopprette det hvis du logger av. Dette burde noe annet enn kontopassordet ditt:", + "Enter a recovery passphrase": "Skriv inn en gjenopprettingspassfrase", + "Back up encrypted message keys": "Sikkerhetskopier krypterte meldingsnøkler", + "Set up with a recovery key": "Sett det opp med en gjenopprettingsnøkkel", + "That matches!": "Det samsvarer!", + "That doesn't match.": "Det samsvarer ikke.", + "Go back to set it again.": "Gå tilbake for å velge på nytt.", + "Enter your recovery passphrase a second time to confirm it.": "Skriv inn gjenopprettingspassfrasen din en andre gang for å bekrefte den.", + "Confirm your recovery passphrase": "Bekreft gjenopprettingspassfrasen din", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Gjenopprettingsnøkkelen din er et sikkerhetsnett - du kan bruke den til å gjenopprette tilgangen til dine krypterte meldinger dersom du glemmer gjenopprettingspassfrasen din.", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Ha en kopi av den på et trygt sted, f.eks. en passordbehandler eller til og med i en safe.", + "Your recovery key has been copied to your clipboard, paste it to:": "Gjenopprettingsnøkkelen din har blitt kopiert til utklippstavlen din, lim den inn i:", + "Your recovery key is in your Downloads folder.": "Gjenopprettingsnøkkelen din er i Nedlastinger-mappen din.", + "Print it and store it somewhere safe": "Skriv den ut og lagre den på et sikkert sted", + "Save it on a USB key or backup drive": "Lagre den på en USB-pinne eller backup-harddisk", + "Copy it to your personal cloud storage": "Kopier den til din personlige skylagring", + "You can now verify your other devices, and other users to keep your chats safe.": "Du kan nå verifisere de andre enhetene dine, samt andre brukere for å holde samtalene dine trygge.", + "Confirm recovery passphrase": "Bekreft gjenopprettingspassfrasen", + "Make a copy of your recovery key": "Lag en kopi av gjenopprettingsnøkkelen din", + "You're done!": "Du har gjort alt klart!", + "Enter a recovery passphrase...": "Skriv inn en gjenopprettingspassfrase …", + "Please enter your recovery passphrase a second time to confirm.": "Skriv inn gjenopprettingspassfrasen din en andre gang for å bekrefte.", + "Repeat your recovery passphrase...": "Gjenta gjenopprettingspassfrasen din …" } From 345695f11099f011c3b99ad7882b48a7b164d6c1 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Thu, 7 May 2020 01:01:04 +0000 Subject: [PATCH 048/319] Translated using Weblate (Ukrainian) Currently translated at 23.8% (548 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index e1db73e8b1..50c15dad2d 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -549,5 +549,17 @@ "Send cross-signing keys to homeserver": "Надсилання ключей підпису на домашній сервер", "Custom (%(level)s)": "Власний (%(level)s)", "Error upgrading room": "Помилка оновлення кімнати", - "Double check that your server supports the room version chosen and try again.": "Перевірте, чи підримує ваш сервер вказану версію кімнати та спробуйте ще." + "Double check that your server supports the room version chosen and try again.": "Перевірте, чи підримує ваш сервер вказану версію кімнати та спробуйте ще.", + "Liberate your communication": "Вивільни своє спілкування", + "Send a Direct Message": "Надіслати особисте повідомлення", + "Explore Public Rooms": "Дослідити прилюдні кімнати", + "Create a Group Chat": "Створити групову балачку", + "Explore": "Дослідити", + "Filter": "Фільтрувати", + "Filter rooms…": "Фільтрувати кімнати…", + "Failed to reject invitation": "Не вдалось відхилити запрошення", + "This room is not public. You will not be able to rejoin without an invite.": "Ця кімната не є прилюдною. Ви не зможете перепід'єднатись без запрошення.", + "Failed to leave room": "Не вдалось залишити кімнату", + "Can't leave Server Notices room": "Неможливо залишити кімнату Оголошення Сервера", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ця кімната використовується для важливих повідомлень з домашнього сервера, тож ви не можете її залишити." } From b9e99ca9da4f71480939f02994f56505e14bfb66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 7 May 2020 09:42:47 +0000 Subject: [PATCH 049/319] Translated using Weblate (Estonian) Currently translated at 40.6% (936 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 9d06be8c88..9f410d8cf4 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -888,5 +888,52 @@ "Smiley": "Smaili", "Robot": "Robot", "Hat": "Müts", - "Glasses": "Prillid" + "Glasses": "Prillid", + "Spanner": "Mutrivõti", + "Santa": "Jõuluvana", + "Thumbs up": "Pöidlad püsti", + "Umbrella": "Vihmavari", + "Hourglass": "Liivakell", + "Clock": "Kell", + "Gift": "Kingitus", + "Light bulb": "Lambipirn", + "Book": "Raamat", + "Pencil": "Pliiats", + "Paperclip": "Kirjaklamber", + "Scissors": "Käärid", + "Lock": "Lukk", + "Key": "Võti", + "Hammer": "Haamer", + "Telephone": "Telefon", + "Flag": "Lipp", + "Train": "Rong", + "Bicycle": "Jalgratas", + "Aeroplane": "Lennuk", + "Rocket": "Rakett", + "Trophy": "Auhind", + "Ball": "Pall", + "Guitar": "Kitarr", + "Trumpet": "Trompet", + "Bell": "Kelluke", + "Anchor": "Ankur", + "Headphones": "Kõrvaklapid", + "Folder": "Kaust", + "Pin": "Knopka", + "Verify all your sessions to ensure your account & messages are safe": "Selleks et sinu konto ja sõnumid oleks turvatud, verifitseeri kõik oma sessioonid", + "Later": "Hiljem", + "Review": "Vaata üle", + "Verify yourself & others to keep your chats safe": "Selleks et sinu vestlused oleks turvatud, verifitseeri end ja teisi", + "Other users may not trust it": "Teised kasutajad ei pruugi seda usaldada", + "Update your secure storage": "Uuenda rakenduse sisemist turvalist salvestust", + "Set up": "Võta kasutusele", + "Upgrade": "Uuenda", + "Verify": "Verifitseeri", + "Verify the new login accessing your account: %(name)s": "Verifitseeri uus kasutajasessioon, kes pruugib sinu kontot: %(name)s", + "From %(deviceName)s (%(deviceId)s)": "Seadmest %(deviceName)s (%(deviceId)s)", + "Decline (%(counter)s)": "Lükka tagasi (%(counter)s)", + "Accept to continue:": "Jätkamiseks nõustu 'ga:", + "Show less": "Näita vähem", + "Show more": "Näita rohkem", + "Warning!": "Hoiatus!", + "Do you want to set an email address?": "Kas sa soovid seadistada e-posti aadressi?" } From 4d6cd3c0504e7f4bc07e4cce95177affdc84bb66 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 May 2020 12:50:04 +0100 Subject: [PATCH 050/319] Update padding-left to 20px as per Nad's iteration Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/messages/_RedactedBody.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/messages/_RedactedBody.scss b/res/css/views/messages/_RedactedBody.scss index c0e5be2c89..9ba35d7297 100644 --- a/res/css/views/messages/_RedactedBody.scss +++ b/res/css/views/messages/_RedactedBody.scss @@ -17,7 +17,7 @@ limitations under the License. color: $muted-fg-color; vertical-align: middle; - padding-left: 16px; + padding-left: 20px; position: relative; &::before { From a38d5eb2244711d89e9c51df2e3f5abf20ed6409 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 29 Apr 2020 14:57:45 +0100 Subject: [PATCH 051/319] add useIRCLayout setting --- src/i18n/strings/en_EN.json | 1 + src/settings/Settings.js | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a24b2bde73..3dcba0f546 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -408,6 +408,7 @@ "Enable cross-signing to verify per-user instead of per-session": "Enable cross-signing to verify per-user instead of per-session", "Show info about bridges in room settings": "Show info about bridges in room settings", "Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing", + "Use IRC layout": "Use IRC layout", "Use compact timeline layout": "Use compact timeline layout", "Show a placeholder for removed messages": "Show a placeholder for removed messages", "Show join/leave messages (invites/kicks/bans unaffected)": "Show join/leave messages (invites/kicks/bans unaffected)", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 5c6d843349..c51bf44ee5 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -94,6 +94,12 @@ export const SETTINGS = { // // not use this for new settings. // invertedSettingName: "my-negative-setting", // }, + "feature_alternate_message_layouts": { + isFeature: true, + displayName: _td("Alternate message layouts"), + supportedLevels: LEVELS_FEATURE, + default: false, + }, "feature_pinning": { isFeature: true, displayName: _td("Message Pinning"), @@ -164,6 +170,11 @@ export const SETTINGS = { default: true, invertedSettingName: 'MessageComposerInput.dontSuggestEmoji', }, + "useIRCLayout": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td('Use IRC layout'), + default: false, + }, "useCompactLayout": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td('Use compact timeline layout'), From e0c89f6180331350485ca7331ff9e190a83a3d5f Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 29 Apr 2020 15:06:38 +0100 Subject: [PATCH 052/319] Add switch between layout classes --- src/components/structures/MessagePanel.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 6fbfdb504b..0123d43920 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -117,6 +117,7 @@ export default class MessagePanel extends React.Component { // display 'ghost' read markers that are animating away ghostReadMarkers: [], showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), + useIRCLayout: SettingsStore.getValue("useIRCLayout"), }; // opaque readreceipt info for each userId; used by ReadReceiptMarker @@ -169,6 +170,8 @@ export default class MessagePanel extends React.Component { this._showTypingNotificationsWatcherRef = SettingsStore.watchSetting("showTypingNotifications", null, this.onShowTypingNotificationsChange); + + this._layoutWatcherRef = SettingsStore.watchSetting("useIRCLayout", null, this.onLayoutChange); } componentDidMount() { @@ -178,6 +181,7 @@ export default class MessagePanel extends React.Component { componentWillUnmount() { this._isMounted = false; SettingsStore.unwatchSetting(this._showTypingNotificationsWatcherRef); + SettingsStore.unwatchSetting(this._layoutWatcherRef); } componentDidUpdate(prevProps, prevState) { @@ -196,6 +200,12 @@ export default class MessagePanel extends React.Component { }); }; + onLayoutChange = () => { + this.setState({ + useIRCLayout: SettingsStore.getValue("useIRCLayout"), + }); + } + /* get the DOM node representing the given event */ getNodeForEventId(eventId) { if (!this.eventNodes) { @@ -779,6 +789,8 @@ export default class MessagePanel extends React.Component { this.props.className, { "mx_MessagePanel_alwaysShowTimestamps": this.props.alwaysShowTimestamps, + "mx_IRCLayout": this.state.useIRCLayout, + "mx_GroupLayout": !this.state.useIRCLayout, }, ); From c1e740a59603ae178364cac18c8ecdd5443c9df6 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 29 Apr 2020 15:07:17 +0100 Subject: [PATCH 053/319] Break out group layout settings --- res/css/views/rooms/_EventTile.scss | 12 ------- res/css/views/rooms/_GroupLayout.scss | 52 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 res/css/views/rooms/_GroupLayout.scss diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 752cf982f6..b9a41c4310 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -68,11 +68,9 @@ limitations under the License. display: inline-block; /* anti-zalgo, with overflow hidden */ overflow: hidden; cursor: pointer; - padding-left: 65px; /* left gutter */ padding-bottom: 0px; padding-top: 0px; margin: 0px; - line-height: $font-17px; /* the next three lines, along with overflow hidden, truncate long display names */ white-space: nowrap; text-overflow: ellipsis; @@ -101,12 +99,9 @@ limitations under the License. .mx_EventTile .mx_MessageTimestamp { display: block; - visibility: hidden; white-space: nowrap; left: 0px; - width: 46px; /* 8 + 30 (avatar) + 8 */ text-align: center; - position: absolute; user-select: none; } @@ -117,10 +112,7 @@ limitations under the License. .mx_EventTile_line, .mx_EventTile_reply { position: relative; padding-left: 65px; /* left gutter */ - padding-top: 3px; - padding-bottom: 3px; border-radius: 4px; - line-height: $font-22px; } .mx_RoomView_timeline_rr_enabled, @@ -151,10 +143,6 @@ limitations under the License. margin-right: 10px; } -.mx_EventTile_info .mx_EventTile_line { - padding-left: 83px; -} - /* HACK to override line-height which is already marked important elsewhere */ .mx_EventTile_bigEmoji.mx_EventTile_bigEmoji { font-size: 48px !important; diff --git a/res/css/views/rooms/_GroupLayout.scss b/res/css/views/rooms/_GroupLayout.scss new file mode 100644 index 0000000000..6528d6c6cd --- /dev/null +++ b/res/css/views/rooms/_GroupLayout.scss @@ -0,0 +1,52 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +$left-gutter: 65px; + +.mx_GroupLayout { + + .mx_EventTile { + > .mx_SenderProfile { + line-height: $font-17px; + padding-left: $left-gutter; + } + + > .mx_EventTile_line { + padding-left: $left-gutter; + } + + > .mx_EventTile_avatar { + position: absolute; + } + + .mx_MessageTimestamp { + visibility: hidden; + position: absolute; + width: 46px; /* 8 + 30 (avatar) + 8 */ + } + + .mx_EventTile_line, .mx_EventTile_reply { + padding-top: 3px; + padding-bottom: 3px; + line-height: $font-22px; + } + } + + .mx_EventTile_info .mx_EventTile_line { + padding-left: 83px; + } +} From 10c8d253c86334e11c3a8582db6d63e073bcb79e Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 29 Apr 2020 15:07:41 +0100 Subject: [PATCH 054/319] Create irc layout --- res/css/views/rooms/_IRCLayout.scss | 124 ++++++++++++++++++++++ src/components/structures/MessagePanel.js | 1 + src/components/views/rooms/EventTile.js | 30 ++++-- 3 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 res/css/views/rooms/_IRCLayout.scss diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss new file mode 100644 index 0000000000..6152749573 --- /dev/null +++ b/res/css/views/rooms/_IRCLayout.scss @@ -0,0 +1,124 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +$name-width: 50px; +$icon-width: 14px; +$timestamp-width: 45px; +$right-padding: 5px; + +.mx_IRCLayout { + + line-height: $font-22px !important; + + .mx_EventTile { + display: flex; + flex-direction: row; + align-items: flex-start; + + > * { + margin-right: $right-padding; + } + + > .mx_EventTile_msgOption { + order: 4; + flex-shrink: 0; + } + + > .mx_SenderProfile { + order: 2; + flex-shrink: 0; + width: $name-width; + text-overflow: ellipsis; + text-align: right; + display: flex; + align-items: center; + } + + > .mx_EventTile_line { + order: 3; + flex-grow: 1; + } + + > .mx_EventTile_avatar { + order: 1; + position: relative; + top: 0; + left: 0; + flex-shrink: 0; + height: 22px; + display: flex; + align-items: center; + + > .mx_BaseAvatar { + height: 1rem; + width: 1rem; + } + } + + .mx_MessageTimestamp { + font-size: $font-10px; + width: $timestamp-width; + text-align: right; + } + + .mx_EventTile_line, .mx_EventTile_reply { + padding: 0; + } + + .mx_EventTile_e2eIcon { + position: relative; + right: unset; + left: unset; + top: -2px; + padding: 0; + } + + .mx_EventTile_line > * { + display: inline-block; + } + } + + .mx_EventListSummary { + > .mx_EventTile_line { + padding-left: calc($name-width + $icon-width + $timestamp-width + 3 * $right-padding); // 15 px of padding + } + } + + .mx_EventTile.mx_EventTile_info { + .mx_EventTile_avatar { + left: calc($name-width + 10px + $icon-width); + top: 0; + } + + .mx_EventTile_line { + left: calc($name-width + 10px + $icon-width); + } + + .mx_TextualEvent { + line-height: $font-22px; + } + } + + .mx_EventTile_continuation:not(.mx_EventTile_info) { + .mx_EventTile_avatar { + visibility: hidden; + } + + .mx_SenderProfile { + visibility: hidden; + } + } +} diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 0123d43920..80e5d17bf3 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -607,6 +607,7 @@ export default class MessagePanel extends React.Component { isSelectedEvent={highlight} getRelationsForEvent={this.props.getRelationsForEvent} showReactions={this.props.showReactions} + useIRCLayout={this.state.useIRCLayout} /> , diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index a64fd82eb5..2da9677a17 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -206,6 +206,9 @@ export default createReactClass({ // whether to show reactions for this event showReactions: PropTypes.bool, + + // whether to use the irc layout + useIRCLayout: PropTypes.bool, }, getDefaultProps: function() { @@ -653,6 +656,8 @@ export default createReactClass({ const classes = classNames({ mx_EventTile_bubbleContainer: isBubbleMessage, mx_EventTile: true, + mx_EventTile_irc: this.props.useIRCLayout, + mx_EventTile_group: !this.props.useIRCLayout, mx_EventTile_isEditing: isEditing, mx_EventTile_info: isInfoMessage, mx_EventTile_12hr: this.props.isTwelveHour, @@ -696,6 +701,9 @@ export default createReactClass({ // joins/parts/etc avatarSize = 14; needsSenderProfile = false; + } else if (this.props.useIRCLayout) { + avatarSize = 14; + needsSenderProfile = true; } else if (this.props.continuation && this.props.tileShape !== "file_grid") { // no avatar or sender profile for continuation messages avatarSize = 0; @@ -879,21 +887,29 @@ export default createReactClass({ this.props.permalinkCreator, this._replyThread, ); + + const linkedTimestamp = + { timestamp } + ; + + const groupTimestamp = !this.props.useIRCLayout ? linkedTimestamp : null; + const ircTimestamp = this.props.useIRCLayout ? linkedTimestamp : null; + + // tab-index=-1 to allow it to be focusable but do not add tab stop for it, primarily for screen readers return (
    + { ircTimestamp }
    { readAvatars }
    { sender }
    - - { timestamp } - + { groupTimestamp } { !isBubbleMessage && this._renderE2EPadlock() } { thread } Date: Wed, 29 Apr 2020 15:07:47 +0100 Subject: [PATCH 055/319] Include new css files --- res/css/_components.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/css/_components.scss b/res/css/_components.scss index 0ba2b609e8..a66d15af18 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -159,6 +159,8 @@ @import "./views/rooms/_EditMessageComposer.scss"; @import "./views/rooms/_EntityTile.scss"; @import "./views/rooms/_EventTile.scss"; +@import "./views/rooms/_EventTile_group.scss"; +@import "./views/rooms/_EventTile_irc.scss"; @import "./views/rooms/_InviteOnlyIcon.scss"; @import "./views/rooms/_JumpToBottomButton.scss"; @import "./views/rooms/_LinkPreviewWidget.scss"; From 6c3e3161de314b109810db0987f04877e5f42a10 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 29 Apr 2020 15:29:25 +0100 Subject: [PATCH 056/319] Reduce padding --- res/css/views/rooms/_IRCLayout.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 6152749573..94ff681029 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -27,6 +27,7 @@ $right-padding: 5px; display: flex; flex-direction: row; align-items: flex-start; + padding-top: 0; > * { margin-right: $right-padding; From 54d211a847c8f198c2547c0cc9fc6c9715d142e5 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Mon, 4 May 2020 21:40:52 +0100 Subject: [PATCH 057/319] Index file name changes --- res/css/_components.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/_components.scss b/res/css/_components.scss index a66d15af18..5466b785c0 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -159,8 +159,8 @@ @import "./views/rooms/_EditMessageComposer.scss"; @import "./views/rooms/_EntityTile.scss"; @import "./views/rooms/_EventTile.scss"; -@import "./views/rooms/_EventTile_group.scss"; -@import "./views/rooms/_EventTile_irc.scss"; +@import "./views/rooms/_GroupLayout.scss"; +@import "./views/rooms/_IRCLayout.scss"; @import "./views/rooms/_InviteOnlyIcon.scss"; @import "./views/rooms/_JumpToBottomButton.scss"; @import "./views/rooms/_LinkPreviewWidget.scss"; From 67249e1e9c17c9886812e1e2e07a71e298d2bb9e Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Mon, 4 May 2020 21:53:48 +0100 Subject: [PATCH 058/319] Fix hover --- res/css/views/rooms/_IRCLayout.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 94ff681029..10d8c701c3 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -122,4 +122,12 @@ $right-padding: 5px; visibility: hidden; } } + + // Suppress highlight thing from the normal Layout. + .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line, + .mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line, + .mx_EventTile:hover.mx_EventTile_unknown .mx_EventTile_line { + padding-left: 0; + border-left: 0; + } } From 027826c2e1ca45cda9588a8d5cee257581048987 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Tue, 5 May 2020 10:54:44 +0100 Subject: [PATCH 059/319] Replies have the same layout as messages --- res/css/views/rooms/_IRCLayout.scss | 13 +++++++-- src/components/views/elements/ReplyThread.js | 9 ++++-- src/components/views/rooms/EventTile.js | 29 ++++++++++---------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 10d8c701c3..c7cf2c31c2 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -63,9 +63,12 @@ $right-padding: 5px; display: flex; align-items: center; - > .mx_BaseAvatar { - height: 1rem; - width: 1rem; + // Need to use important to override the js provided height and width values. + > .mx_BaseAvatar, .mx_BaseAvatar > * { + height: $font-14px !important; + width: $font-14px !important; + font-size: $font-10px !important; + line-height: $font-14px !important; } } @@ -90,6 +93,10 @@ $right-padding: 5px; .mx_EventTile_line > * { display: inline-block; } + + .mx_EventTile_reply { + order: 3; + } } .mx_EventListSummary { diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index eae2d13f8a..a8f9599f35 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -37,6 +37,8 @@ export default class ReplyThread extends React.Component { // called when the ReplyThread contents has changed, including EventTiles thereof onHeightChanged: PropTypes.func.isRequired, permalinkCreator: PropTypes.instanceOf(RoomPermalinkCreator).isRequired, + // Specifies which layout to use. + useIRCLayout: PropTypes.bool, }; static contextType = MatrixClientContext; @@ -176,12 +178,12 @@ export default class ReplyThread extends React.Component { }; } - static makeThread(parentEv, onHeightChanged, permalinkCreator, ref) { + static makeThread(parentEv, onHeightChanged, permalinkCreator, ref, useIRCLayout) { if (!ReplyThread.getParentEventId(parentEv)) { return
    ; } return ; + ref={ref} permalinkCreator={permalinkCreator} useIRCLayout={useIRCLayout} />; } componentDidMount() { @@ -331,7 +333,8 @@ export default class ReplyThread extends React.Component { onHeightChanged={this.props.onHeightChanged} permalinkCreator={this.props.permalinkCreator} isRedacted={ev.isRedacted()} - isTwelveHour={SettingsStore.getValue("showTwelveHourTimestamps")} /> + isTwelveHour={SettingsStore.getValue("showTwelveHourTimestamps")} + useIRCLayout={this.props.useIRCLayout} /> ; }); diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 2da9677a17..837c8929b9 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -795,6 +795,17 @@ export default createReactClass({ />; } + const linkedTimestamp = + { timestamp } + ; + + const groupTimestamp = !this.props.useIRCLayout ? linkedTimestamp : null; + const ircTimestamp = this.props.useIRCLayout ? linkedTimestamp : null; + switch (this.props.tileShape) { case 'notif': { const room = this.context.getRoom(this.props.mxEvent.getRoomId()); @@ -862,12 +873,11 @@ export default createReactClass({ } return (
    + { ircTimestamp } { avatar } { sender }
    - - { timestamp } - + { groupTimestamp } { !isBubbleMessage && this._renderE2EPadlock() } { thread } - { timestamp } - ; - - const groupTimestamp = !this.props.useIRCLayout ? linkedTimestamp : null; - const ircTimestamp = this.props.useIRCLayout ? linkedTimestamp : null; - - // tab-index=-1 to allow it to be focusable but do not add tab stop for it, primarily for screen readers return (
    From 0af265bf93e703c42492c51b41a23f485f4099fe Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Tue, 5 May 2020 16:24:50 +0100 Subject: [PATCH 060/319] Fix replies --- res/css/views/rooms/_IRCLayout.scss | 9 ++++++++- src/components/views/elements/ReplyThread.js | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index c7cf2c31c2..b45d34013c 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -90,10 +90,17 @@ $right-padding: 5px; padding: 0; } - .mx_EventTile_line > * { + .mx_EventTile_line .mx_EventTile_content, + .mx_EventTile_line .mx_EventTile_e2eIcon, + .mx_eventTile_line > div { display: inline-block; } + .mx_EvenTile_line .mx_MessageActionBar, + .mx_EvenTile_line .mx_ReplyThread_wrapper { + display: block; + } + .mx_EventTile_reply { order: 3; } diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index a8f9599f35..52a94110ba 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -338,7 +338,7 @@ export default class ReplyThread extends React.Component { ; }); - return
    + return
    { header }
    { evTiles }
    ; From 07c2d0cb0256ff7ab359416222d6411e0100594a Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 6 May 2020 09:24:33 +0100 Subject: [PATCH 061/319] Composer reply previews have group layout --- src/components/views/rooms/MessageComposer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 4749742a7d..663db5e942 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -370,7 +370,7 @@ export default class MessageComposer extends React.Component { } return ( -
    +
    { controls } From 5568e6488d18c2ef8da79514f852ac562cdcf049 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 6 May 2020 09:51:01 +0100 Subject: [PATCH 062/319] Fix encryption badge layout --- res/css/views/rooms/_IRCLayout.scss | 2 +- src/components/views/elements/ReplyThread.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index b45d34013c..968d8ebdea 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -92,7 +92,7 @@ $right-padding: 5px; .mx_EventTile_line .mx_EventTile_content, .mx_EventTile_line .mx_EventTile_e2eIcon, - .mx_eventTile_line > div { + .mx_EventTile_line .mx_ReplyThread_wrapper_empty { display: inline-block; } diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 52a94110ba..de242f5632 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -180,7 +180,7 @@ export default class ReplyThread extends React.Component { static makeThread(parentEv, onHeightChanged, permalinkCreator, ref, useIRCLayout) { if (!ReplyThread.getParentEventId(parentEv)) { - return
    ; + return
    ; } return ; From 771ae5e18f23b7b7954950b43fa7e5e52b70b0e8 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Thu, 7 May 2020 13:55:23 +0100 Subject: [PATCH 063/319] Fix encryption badge layouts and replies. Begin removing dependence on slider. Move settings to labs. Username disambiguation. --- res/css/views/rooms/_IRCLayout.scss | 34 +++++++++++++++---- src/components/structures/MessagePanel.js | 16 +++++++-- src/components/views/elements/ReplyThread.js | 10 ++++-- .../views/messages/SenderProfile.js | 3 ++ src/components/views/rooms/EventTile.js | 6 +++- src/i18n/strings/en_EN.json | 1 + src/settings/Settings.js | 17 +++++++--- 7 files changed, 69 insertions(+), 18 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 968d8ebdea..e4536aec20 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -14,14 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -$name-width: 50px; +$name-width: 70px; $icon-width: 14px; $timestamp-width: 45px; $right-padding: 5px; .mx_IRCLayout { - line-height: $font-22px !important; + line-height: $font-20px !important; .mx_EventTile { display: flex; @@ -46,11 +46,13 @@ $right-padding: 5px; text-align: right; display: flex; align-items: center; + overflow: visible; } > .mx_EventTile_line { order: 3; flex-grow: 1; + margin-bottom: -6px; } > .mx_EventTile_avatar { @@ -90,10 +92,13 @@ $right-padding: 5px; padding: 0; } - .mx_EventTile_line .mx_EventTile_content, - .mx_EventTile_line .mx_EventTile_e2eIcon, - .mx_EventTile_line .mx_ReplyThread_wrapper_empty { - display: inline-block; + .mx_EventTile_line { + .mx_EventTile_e2eIcon, + .mx_TextualEvent, + .mx_MTextBody, + .mx_ReplyThread_wrapper_empty { + display: inline-block; + } } .mx_EvenTile_line .mx_MessageActionBar, @@ -104,6 +109,10 @@ $right-padding: 5px; .mx_EventTile_reply { order: 3; } + + .mx_EditMessageComposer_buttons { + position: relative; + } } .mx_EventListSummary { @@ -144,4 +153,17 @@ $right-padding: 5px; padding-left: 0; border-left: 0; } + + .mx_SenderProfile_hover { + background-color: $primary-bg-color; + overflow: hidden; + width: $name-width; + transition: width 2s; + } + + .mx_SenderProfile_hover:hover { + overflow: visible; + width: auto; + z-index: 10; + } } diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 80e5d17bf3..66ed5ee81f 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -117,7 +117,8 @@ export default class MessagePanel extends React.Component { // display 'ghost' read markers that are animating away ghostReadMarkers: [], showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), - useIRCLayout: SettingsStore.getValue("useIRCLayout"), + useIRCLayout: SettingsStore.getValue("feature_irc_ui"), + displayAvatars: SettingsStore.getValue("feature_no_timeline_avatars"), }; // opaque readreceipt info for each userId; used by ReadReceiptMarker @@ -171,7 +172,8 @@ export default class MessagePanel extends React.Component { this._showTypingNotificationsWatcherRef = SettingsStore.watchSetting("showTypingNotifications", null, this.onShowTypingNotificationsChange); - this._layoutWatcherRef = SettingsStore.watchSetting("useIRCLayout", null, this.onLayoutChange); + this._layoutWatcherRef = SettingsStore.watchSetting("feature_irc_ui", null, this.onLayoutChange); + this._displayAvatarsWatcherRef = SettingsStore.watchSetting("feature_no_timeline_avatars", null, this.onDisplayAvatarsChange); } componentDidMount() { @@ -182,6 +184,7 @@ export default class MessagePanel extends React.Component { this._isMounted = false; SettingsStore.unwatchSetting(this._showTypingNotificationsWatcherRef); SettingsStore.unwatchSetting(this._layoutWatcherRef); + SettingsStore.unwatchSetting(this._displayAvatarsWatcherRef); } componentDidUpdate(prevProps, prevState) { @@ -202,7 +205,13 @@ export default class MessagePanel extends React.Component { onLayoutChange = () => { this.setState({ - useIRCLayout: SettingsStore.getValue("useIRCLayout"), + useIRCLayout: SettingsStore.getValue("feature_irc_ui"), + }); + } + + onDisplayAvatarsChange = () => { + this.setState({ + displayAvatars: SettingsStore.getValue("feature_no_timeline_avatars"), }); } @@ -608,6 +617,7 @@ export default class MessagePanel extends React.Component { getRelationsForEvent={this.props.getRelationsForEvent} showReactions={this.props.showReactions} useIRCLayout={this.state.useIRCLayout} + displayAvatars={this.state.displayAvatars} /> , diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index de242f5632..d1d46e709a 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -39,6 +39,8 @@ export default class ReplyThread extends React.Component { permalinkCreator: PropTypes.instanceOf(RoomPermalinkCreator).isRequired, // Specifies which layout to use. useIRCLayout: PropTypes.bool, + // Specifies whether to display avatars. + displayAvatars: PropTypes.bool, }; static contextType = MatrixClientContext; @@ -178,12 +180,12 @@ export default class ReplyThread extends React.Component { }; } - static makeThread(parentEv, onHeightChanged, permalinkCreator, ref, useIRCLayout) { + static makeThread(parentEv, onHeightChanged, permalinkCreator, ref, useIRCLayout, displayAvatars) { if (!ReplyThread.getParentEventId(parentEv)) { return
    ; } return ; + ref={ref} permalinkCreator={permalinkCreator} useIRCLayout={useIRCLayout} displayAvatars={displayAvatars} />; } componentDidMount() { @@ -334,7 +336,9 @@ export default class ReplyThread extends React.Component { permalinkCreator={this.props.permalinkCreator} isRedacted={ev.isRedacted()} isTwelveHour={SettingsStore.getValue("showTwelveHourTimestamps")} - useIRCLayout={this.props.useIRCLayout} /> + useIRCLayout={this.props.useIRCLayout} + displayAvatars={this.props.displayAvatars} + /> ; }); diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js index bed93b68c3..d95c9d685a 100644 --- a/src/components/views/messages/SenderProfile.js +++ b/src/components/views/messages/SenderProfile.js @@ -131,7 +131,10 @@ export default createReactClass({ return (
    +
    + { content } { content } +
    ); }, diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 837c8929b9..b2daa5667f 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -209,6 +209,9 @@ export default createReactClass({ // whether to use the irc layout useIRCLayout: PropTypes.bool, + + // whether to display avatars + displayAvatars: PropTypes.bool, }, getDefaultProps: function() { @@ -713,7 +716,7 @@ export default createReactClass({ needsSenderProfile = true; } - if (this.props.mxEvent.sender && avatarSize) { + if (this.props.mxEvent.sender && avatarSize && this.props.displayAvatars) { avatar = (
    Date: Thu, 7 May 2020 14:06:40 +0100 Subject: [PATCH 064/319] Remove unused setting --- src/settings/Settings.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 7942aa67fc..032b0ee906 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -94,12 +94,6 @@ export const SETTINGS = { // // not use this for new settings. // invertedSettingName: "my-negative-setting", // }, - "feature_alternate_message_layouts": { - isFeature: true, - displayName: _td("Alternate message layouts"), - supportedLevels: LEVELS_FEATURE, - default: false, - }, "feature_pinning": { isFeature: true, displayName: _td("Message Pinning"), From bc5fc57dd667d89fd774949cb2b940d198518a90 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Thu, 7 May 2020 14:22:15 +0100 Subject: [PATCH 065/319] Lint This is why we shouldn't rely on regex --- src/components/structures/MessagePanel.js | 6 +++++- src/components/views/elements/ReplyThread.js | 9 +++++++-- src/i18n/strings/en_EN.json | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 66ed5ee81f..f46df0175a 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -173,7 +173,11 @@ export default class MessagePanel extends React.Component { SettingsStore.watchSetting("showTypingNotifications", null, this.onShowTypingNotificationsChange); this._layoutWatcherRef = SettingsStore.watchSetting("feature_irc_ui", null, this.onLayoutChange); - this._displayAvatarsWatcherRef = SettingsStore.watchSetting("feature_no_timeline_avatars", null, this.onDisplayAvatarsChange); + this._displayAvatarsWatcherRef = SettingsStore.watchSetting( + "feature_no_timeline_avatars", + null, + this.onDisplayAvatarsChange, + ); } componentDidMount() { diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index d1d46e709a..6bfda5dd94 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -184,8 +184,13 @@ export default class ReplyThread extends React.Component { if (!ReplyThread.getParentEventId(parentEv)) { return
    ; } - return ; + return ; } componentDidMount() { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a3cd88f9ae..ca62eb44fa 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -405,11 +405,11 @@ "Multiple integration managers": "Multiple integration managers", "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", "Support adding custom themes": "Support adding custom themes", + "Use IRC layout": "Use IRC layout", + "Display user avatars on messages": "Display user avatars on messages", "Enable cross-signing to verify per-user instead of per-session": "Enable cross-signing to verify per-user instead of per-session", "Show info about bridges in room settings": "Show info about bridges in room settings", "Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing", - "Use IRC layout": "Use IRC layout", - "Display user avatars on messages": "Display user avatars on messages", "Use compact timeline layout": "Use compact timeline layout", "Show a placeholder for removed messages": "Show a placeholder for removed messages", "Show join/leave messages (invites/kicks/bans unaffected)": "Show join/leave messages (invites/kicks/bans unaffected)", From ac95172ed4e6981bc5615fb982176d4a8c17a866 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Thu, 7 May 2020 14:56:45 +0100 Subject: [PATCH 066/319] tighter layout --- res/css/views/rooms/_IRCLayout.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index e4536aec20..fcdeef6590 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -21,7 +21,7 @@ $right-padding: 5px; .mx_IRCLayout { - line-height: $font-20px !important; + line-height: $font-18px !important; .mx_EventTile { display: flex; @@ -52,7 +52,6 @@ $right-padding: 5px; > .mx_EventTile_line { order: 3; flex-grow: 1; - margin-bottom: -6px; } > .mx_EventTile_avatar { From 4068c64b9230c627fc16ed9d5fc1798381370b6b Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Thu, 7 May 2020 14:31:46 +0000 Subject: [PATCH 067/319] Translated using Weblate (German) Currently translated at 78.9% (1819 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4500a678e6..c320bfff3f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1470,8 +1470,8 @@ "Double check that your server supports the room version chosen and try again.": "Überprüfe nochmal ob dein Server die ausgewählte Raumversion unterstützt und versuche es nochmal.", "%(senderName)s placed a voice call.": "%(senderName)s hat einen Sprachanruf getätigt.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s hat einen Sprachanruf getätigt. (Nicht von diesem Browser unterstützt)", - "%(senderName)s placed a video call.": "%(senderName)s hat einen Sprachanruf getätigt.", - "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s hat einen Sprachanruf getätigt. (Nicht von diesem Browser unterstützt)", + "%(senderName)s placed a video call.": "%(senderName)s hat einen Videoanruf getätigt.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s hat einen Videoanruf getätigt. (Nicht von diesem Browser unterstützt)", "Verify this session": "Sitzung verifizieren", "Set up encryption": "Verschlüsselung einrichten", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s hat %(addedAddresses)s und %(count)s Adressen zu diesem Raum hinzugefügt", From 2f7f76acd1958afa3c5c1f4cb41cb4631e1e8317 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 7 May 2020 14:22:23 +0000 Subject: [PATCH 068/319] Translated using Weblate (Italian) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index e8012733c3..53f4ea1aa3 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2414,5 +2414,6 @@ "Keys restored": "Chiavi ripristinate", "Successfully restored %(sessionCount)s keys": "Ripristinate %(sessionCount)s chiavi correttamente", "You signed in to a new session without verifying it:": "Hai fatto l'accesso ad una nuova sessione senza verificarla:", - "Verify your other session using one of the options below.": "Verifica la tua altra sessione usando una delle opzioni sotto." + "Verify your other session using one of the options below.": "Verifica la tua altra sessione usando una delle opzioni sotto.", + "Invite someone using their name, username (like ), email address or share this room.": "Invita qualcuno usando il suo nome, nome utente (come ), indirizzo email o condividi questa stanza." } From f70a06083a34f8577a9d226089703938dc0ec83a Mon Sep 17 00:00:00 2001 From: call_xz Date: Thu, 7 May 2020 12:25:51 +0000 Subject: [PATCH 069/319] Translated using Weblate (Japanese) Currently translated at 57.2% (1318 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 72 ++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 4188464408..20f8097c0c 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -376,9 +376,9 @@ "Enable automatic language detection for syntax highlighting": "構文強調表示の自動言語検出を有効にする", "Mirror local video feed": "ローカルビデオ映像送信", "Send analytics data": "分析データを送信する", - "Enable inline URL previews by default": "デフォルトでインラインURLプレビューを有効にする", - "Enable URL previews for this room (only affects you)": "この部屋のURLプレビューを有効にする (あなたにのみ影響する)", - "Enable URL previews by default for participants in this room": "この部屋の参加者のためにデフォルトでURLプレビューを有効にする", + "Enable inline URL previews by default": "デフォルトでインライン URL プレビューを有効にする", + "Enable URL previews for this room (only affects you)": "この部屋の URL プレビューを有効にする (あなたにのみ影響する)", + "Enable URL previews by default for participants in this room": "この部屋の参加者のためにデフォルトで URL プレビューを有効にする", "Room Colour": "部屋の色", "Enable widget screenshots on supported widgets": "サポートされているウィジェットでウィジェットのスクリーンショットを有効にする", "Active call (%(roomName)s)": "アクティブな通話 (%(roomName)s)", @@ -540,12 +540,12 @@ "Showing flair for these communities:": "次のコミュニティのバッジを表示:", "This room is not showing flair for any communities": "この部屋はどんなコミュニティに対してもバッジを表示していません", "New community ID (e.g. +foo:%(localDomain)s)": "新しいコミュニティID (例 +foo:%(localDomain)s)", - "You have enabled URL previews by default.": "デフォルトでURLプレビューが有効です。", - "You have disabled URL previews by default.": "デフォルトでURLプレビューが無効です。", - "URL previews are enabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが有効です。", - "URL previews are disabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが無効です。", - "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "このような暗号化された部屋では、URLプレビューはデフォルトで無効になっており、あなたのホームサーバー(プレビューを作成する場所)がこの部屋に表示されているリンクに関する情報を収集できないようにしています。", - "URL Previews": "URLプレビュー", + "You have enabled URL previews by default.": "デフォルトで URL プレビューが有効です。", + "You have disabled URL previews by default.": "デフォルトで URL プレビューが無効です。", + "URL previews are enabled by default for participants in this room.": "この部屋の参加者は、デフォルトで URL プレビューが有効です。", + "URL previews are disabled by default for participants in this room.": "この部屋の参加者は、デフォルトで URL プレビューが無効です。", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "このような暗号化された部屋では、URL プレビューはデフォルトで無効になっており、あなたのホームサーバー(プレビューを作成する場所)がこの部屋に表示されているリンクに関する情報を収集できないようにしています。", + "URL Previews": "URL プレビュー", "Historical": "履歴のある", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "メッセージにURLを入力すると、URLプレビューが表示され、タイトル、説明、ウェブサイトからの画像など、そのリンクに関する詳細情報が表示されます。", "Error decrypting audio": "オーディオの復号化エラー", @@ -931,7 +931,7 @@ "Algorithm": "アルゴリズム", "unencrypted": "暗号化されていない", "Decryption error": "復号化エラー", - "Session ID": "セッションID", + "Session ID": "セッション ID", "End-to-end encryption information": "エンドツーエンド暗号化情報", "Event information": "イベント情報", "Passphrases must match": "パスフレーズは一致する必要があります", @@ -1050,7 +1050,7 @@ "Show display name changes": "表示名の変更を表示する", "Show read receipts sent by other users": "他の人の既読情報を表示する", "Enable big emoji in chat": "チャットで大きな絵文字を有効にする", - "Send typing notifications": "入力中であることを通知する", + "Send typing notifications": "入力中通知を送信する", "Enable Community Filter Panel": "コミュニティーフィルターパネルを有効にする", "Show recently visited rooms above the room list": "最近訪問した部屋をリストの上位に表示する", "Low bandwidth mode": "低帯域通信モード", @@ -1192,7 +1192,7 @@ "Delete %(count)s sessions|one": "%(count)s 件のセッションを削除", "ID": "ID", "Clear cache and reload": "キャッシュを削除して再読み込み", - "Session ID:": "セッションID:", + "Session ID:": "セッション ID:", "Session key:": "セッション鍵:", "Cross-signing": "クロス署名", "Sessions": "セッション", @@ -1307,5 +1307,51 @@ "Recent Conversations": "最近会話したユーザー", "Suggestions": "提案", "Start a conversation with someone using their name, username (like ) or email address.": "相手の名前、( のような)ユーザー名、メールアドレスを使って会話を開始できます。", - "Go": "続行" + "Go": "続行", + "Session already verified!": "このセッションは検証済みです。", + "WARNING: Session already verified, but keys do NOT MATCH!": "警告: このセッションは検証済みです、しかし鍵が一致していません!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告: 鍵の検証に失敗しました!提供された鍵「%(fingerprint)s」は、%(userId)s およびセッション %(deviceId)s の署名鍵「%(fprint)s」と一致しません。これはつまり、あなたの会話が傍受・盗聴されようとしている恐れがあるということです!", + "Show typing notifications": "入力中通知を表示する", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "あなたのホームサーバーが対応していない場合は (通話中に自己の IP アドレスが相手に共有されるのを防ぐために) 代替通話支援サーバー turn.matrix.org の使用を許可する", + "Your homeserver does not support cross-signing.": "あなたのホームサーバーはクロス署名に対応していません。", + "Cross-signing and secret storage are enabled.": "クロス署名および機密ストレージは有効です。", + "Reset cross-signing and secret storage": "クロス署名および機密ストレージをリセット", + "in memory": "メモリー内", + "not found": "存在しない", + "in secret storage": "機密ストレージ内", + "Self signing private key:": "自己署名秘密鍵:", + "cached locally": "ローカルキャッシュ", + "not found locally": "ローカルに存在しない", + "User signing private key:": "ユーザー署名秘密鍵:", + "Session backup key:": "セッションバックアップ鍵:", + "Secret storage public key:": "機密ストレージ公開鍵:", + "in account data": "アカウントデータ内", + "Homeserver feature support:": "ホームサーバーの対応状況:", + "exists": "対応している", + "Secret Storage key format:": "機密ストレージ鍵の形式:", + "outdated": "最新版でない", + "up to date": "最新版", + "Your homeserver does not support session management.": "あなたのホームサーバーはセッション管理に対応していません。", + "Unable to load session list": "セッション一覧を読み込めません", + "Securely cache encrypted messages locally for them to appear in search results, using ": "検索結果を表示するため、暗号化されたメッセージをローカルに安全にキャッシュしています。 キャッシュの保存に ", + " to store messages from ": " を使用中であり ", + "rooms.": "件の部屋のメッセージが含まれています。", + "Manage": "管理", + "Add an email address to configure email notifications": "メールアドレスを追加すると電子メール通知の設定も行えます。", + "Custom theme URL": "カスタムテーマ URL", + "Add theme": "テーマの追加", + "Account management": "アカウントの管理", + "Deactivating your account is a permanent action - be careful!": "アカウントの無効化は取り消せません。ご注意ください。", + "Deactivate account": "アカウントの無効化", + "Room list": "部屋一覧", + "Timeline": "タイムライン", + "Message search": "メッセージの検索", + "Published Addresses": "公開アドレス", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "公開アドレスを使うと、どのサーバーのどのユーザーでもあなたの部屋に参加することができます。アドレスを公開するには、まずローカルアドレスとして設定する必要があります。", + "Local Addresses": "ローカルアドレス", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot は検索結果を表示するため、暗号化されたメッセージをローカルに安全にキャッシュしています:", + "Space used:": "使用中のストレージ容量:", + "Indexed messages:": "インデックス済みのメッセージ数:", + "Indexed rooms:": "インデックス済みの部屋数:", + "%(doneRooms)s out of %(totalRooms)s": "%(totalRooms)s 件の部屋の内 %(doneRooms)s 件" } From fa0f704b567701ff9089934ad118722c98afeb85 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 8 May 2020 00:05:16 +0100 Subject: [PATCH 070/319] clear tag panel selection if the community selected is left Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/stores/GroupStore.js | 6 ++++++ src/stores/TagOrderStore.js | 13 ++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/stores/GroupStore.js b/src/stores/GroupStore.js index 6aad6aeaec..78a144f755 100644 --- a/src/stores/GroupStore.js +++ b/src/stores/GroupStore.js @@ -18,6 +18,7 @@ import EventEmitter from 'events'; import { groupMemberFromApiObject, groupRoomFromApiObject } from '../groups'; import FlairStore from './FlairStore'; import {MatrixClientPeg} from '../MatrixClientPeg'; +import dis from '../dispatcher'; function parseMembersResponse(response) { return response.chunk.map((apiMember) => groupMemberFromApiObject(apiMember)); @@ -295,6 +296,11 @@ class GroupStore extends EventEmitter { } leaveGroup(groupId) { + // ensure the tag panel filter is cleared if the group was selected + dis.dispatch({ + action: "deselect_tags", + tag: groupId, + }); return MatrixClientPeg.get().leaveGroup(groupId) // The user should now not be able to access group settings .then(this._fetchResource.bind(this, this.STATE_KEY.Summary, groupId)) diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index 6d03a2b289..c05728e497 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -168,9 +168,16 @@ class TagOrderStore extends Store { } break; case 'deselect_tags': - this._setState({ - selectedTags: [], - }); + if (payload.tag) { + // if a tag is passed, only deselect that tag + this._setState({ + selectedTags: this._state.selectedTags.filter(tag => tag !== payload.tag), + }); + } else { + this._setState({ + selectedTags: [], + }); + } Analytics.trackEvent('FilterStore', 'deselect_tags'); break; case 'on_client_not_viable': From 5402839f309ac377b6bdb898d1def370235641c6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 8 May 2020 00:15:48 +0100 Subject: [PATCH 071/319] Close ImageView when Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/ImageView.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/elements/ImageView.js b/src/components/views/elements/ImageView.js index e675e6b73f..edadc841a3 100644 --- a/src/components/views/elements/ImageView.js +++ b/src/components/views/elements/ImageView.js @@ -73,6 +73,7 @@ export default class ImageView extends React.Component { Modal.createTrackedDialog('Confirm Redact Dialog', 'Image View', ConfirmRedactDialog, { onFinished: (proceed) => { if (!proceed) return; + this.props.onFinished(); MatrixClientPeg.get().redactEvent( this.props.mxEvent.getRoomId(), this.props.mxEvent.getId(), ).catch(function(e) { From baa7a86e3ea5d9e79481b9d037a29f7df4af1928 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Fri, 8 May 2020 16:33:50 +0100 Subject: [PATCH 072/319] Assume room should be unencrypted if homeserver does not implement keys/query Dendrite (and others) do not support key fetching (or indeed, E2E at all). Rather than failing to create a room at all, leave it unencrypted. Fixes #13598 --- src/createRoom.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/createRoom.js b/src/createRoom.js index a39d2c2216..4d59b11656 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -212,7 +212,17 @@ export async function _waitForMember(client, roomId, userId, opts = { timeout: 1 * can encrypt to. */ export async function canEncryptToAllUsers(client, userIds) { - const usersDeviceMap = await client.downloadKeys(userIds); + let usersDeviceMap; + try { + usersDeviceMap = await client.downloadKeys(userIds); + } catch (ex) { + if (ex.httpStatus === 404) { + // The endpoint to fetch keys doesn't exist: force unencrypted. + // See: https://github.com/vector-im/riot-web/issues/13598 + return false; + } + throw ex; + } // { "@user:host": { "DEVICE": {...}, ... }, ... } return Object.values(usersDeviceMap).every((userDevices) => // { "DEVICE": {...}, ... } From 055fcd1e984a6ccd982571cf77b82f072d985c4a Mon Sep 17 00:00:00 2001 From: Tirifto Date: Fri, 8 May 2020 14:25:01 +0000 Subject: [PATCH 073/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2304 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 0c7312fcf9..5d6ac9ed48 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -2393,5 +2393,6 @@ "Repeat your recovery passphrase...": "Ripetu vian rehavan pasfrazon…", "Secure your backup with a recovery passphrase": "Sekurigu vian savkopion per rehava pasfrazo", "Currently indexing: %(currentRoom)s": "Nun indeksante: %(currentRoom)s", - "Cancel replying to a message": "Nuligi respondon al mesaĝo" + "Cancel replying to a message": "Nuligi respondon al mesaĝo", + "Invite someone using their name, username (like ), email address or share this room.": "Invitu iun per ĝia nomo, uzantonomo (kiel ), retpoŝtadreso, aŭ kunhavigu la ĉambron." } From f1c625aac9fd53a170483641dfa1929cbfcddaec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 7 May 2020 20:23:09 +0000 Subject: [PATCH 074/319] Translated using Weblate (Estonian) Currently translated at 40.8% (939 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 9f410d8cf4..47afbd1fcd 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -935,5 +935,8 @@ "Show less": "Näita vähem", "Show more": "Näita rohkem", "Warning!": "Hoiatus!", - "Do you want to set an email address?": "Kas sa soovid seadistada e-posti aadressi?" + "Do you want to set an email address?": "Kas sa soovid seadistada e-posti aadressi?", + "Close dialog": "Sulge dialoog", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Meeldetuletus: sinu brauser ei ole toetatud ja seega rakenduse kasutuskogemus võib olla ennustamatu.", + "Toggle this dialog": "Lülita see dialoog sisse/välja" } From 823699c2c228e628050071f2d54d5adb3554bd1f Mon Sep 17 00:00:00 2001 From: David Mehren Date: Fri, 8 May 2020 13:13:57 +0000 Subject: [PATCH 075/319] Translated using Weblate (German) Currently translated at 79.0% (1820 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c320bfff3f..99f58d865a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1890,5 +1890,6 @@ "this room": "Dieser Raum", "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.", "Send a bug report with logs": "Sende Fehlermeldung mit Protokoll", - "Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen" + "Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen", + "Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen." } From 1d9f2eb017180e0b16cb4d8ec32e0da3e71100f8 Mon Sep 17 00:00:00 2001 From: Frisk Date: Fri, 8 May 2020 15:26:15 +0000 Subject: [PATCH 076/319] Translated using Weblate (Polish) Currently translated at 67.8% (1563 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 7cf8a256c8..b54c950263 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1588,5 +1588,6 @@ "Toggle Bold": "Przełącz pogrubienie", "Toggle Italics": "Przełącz kursywę", "Toggle Quote": "Przełącz cytowanie", - "Cancel autocomplete": "Anuluj autouzupełnienie" + "Cancel autocomplete": "Anuluj autouzupełnienie", + "Please install Chrome, Firefox, or Safari for the best experience.": "Zainstaluj Chrome, Firefox, lub Safari w celu zapewnienia najlepszego działania." } From 5601e80ea2a8f44261b683220ec48870527ad45f Mon Sep 17 00:00:00 2001 From: rkfg Date: Fri, 8 May 2020 08:15:23 +0000 Subject: [PATCH 077/319] Translated using Weblate (Russian) Currently translated at 90.4% (2083 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 24fd434155..3591d96120 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1284,7 +1284,7 @@ "Something went wrong with your invite to %(roomName)s": "Что-то пошло не так с вашим приглашением в %(roomName)s", "You can only join it with a working invite.": "Вы можете присоединиться к ней только с рабочим приглашением.", "You can still join it because this is a public room.": "Вы всё ещё можете присоединиться к ней, потому что это публичная комната.", - "Join the discussion": "Присоединяйтесь к обсуждению", + "Join the discussion": "Присоединиться к обсуждению", "Try to join anyway": "Постарайся присоединиться в любом случае", "Do you want to chat with %(user)s?": "Хотите пообщаться с %(user)s?", "Do you want to join %(roomName)s?": "Хотите присоединиться к %(roomName)s?", @@ -1407,7 +1407,7 @@ "Some characters not allowed": "Некоторые символы не разрешены", "Create your Matrix account on %(serverName)s": "Создайте свою учётную запись Matrix на %(serverName)s", "Create your Matrix account on ": "Создайте учётную запись Matrix на ", - "Join millions for free on the largest public server": "Присоединяйтесь бесплатно к миллионам на крупнейшем общедоступном сервере", + "Join millions for free on the largest public server": "Присоединяйтесь бесплатно к миллионам на крупнейшем общедоступном сервере", "Premium hosting for organisations Learn more": "Премиум-хостинг для организаций Подробнее", "Find other public servers or use a custom server": "Найти другие общедоступные серверы или использовать другой сервер", "Please install Chrome, Firefox, or Safari for the best experience.": "Пожалуйста, установите Chrome, Firefox или Safari для наилучшего результата.", @@ -1685,7 +1685,7 @@ "Room Autocomplete": "Автозаполнение комнаты", "User Autocomplete": "Автозаполнение пользователя", "Quick Reactions": "Быстрая реакция", - "Frequently Used": "Часто используемый", + "Frequently Used": "Часто используемые", "Smileys & People": "Смайлики & Люди", "Animals & Nature": "Животные & Природа", "Food & Drink": "Еда & Напитки", From 737f83c94131650b9899ee808169f1aa40715475 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Thu, 7 May 2020 20:57:28 +0000 Subject: [PATCH 078/319] Translated using Weblate (Ukrainian) Currently translated at 25.9% (596 of 2304 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 68 ++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 50c15dad2d..f00ae5b399 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -21,7 +21,7 @@ "Failed to change password. Is your password correct?": "Не вдалось змінити пароль. Ви впевнені, що пароль введено правильно?", "Continue": "Продовжити", "Accept": "Прийняти", - "Account": "Обліковка", + "Account": "Обліківка", "%(targetName)s accepted an invitation.": "%(targetName)s приймає запрошення.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s приймає запрошення від %(displayName)s.", "Access Token:": "Токен доступу:", @@ -75,14 +75,14 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s видалив ім'я кімнати.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінив тему на %(topic)s.", "Email": "е-пошта", - "Email address": "Адреса е-почти", + "Email address": "Адреса е-пошти", "Failed to send email": "Помилка відправки е-почти", "Edit": "Редактувати", "Unpin Message": "Відкріпити повідомлення", "Register": "Зареєструватися", "Rooms": "Кімнати", "Add rooms to this community": "Добавити кімнати в це суспільство", - "This email address is already in use": "Ця електронна пошта вже використовується", + "This email address is already in use": "Ця е-пошта вже використовується", "This phone number is already in use": "Цей телефонний номер вже використовується", "Fetching third party location failed": "Не вдалось отримати стороннє місцеперебування", "Messages in one-to-one chats": "Повідомлення у чатах \"сам на сам\"", @@ -154,7 +154,7 @@ "Explore Account Data": "Продивитись данні аккаунта", "All messages (noisy)": "Усі повідомлення (гучно)", "Saturday": "Субота", - "I understand the risks and wish to continue": "Я ознайомлений з ризиками і хочу продовжити", + "I understand the risks and wish to continue": "Я усвідомлюю ризик і бажаю продовжити", "Direct Chat": "Прямий чат", "The server may be unavailable or overloaded": "Сервер може бути недосяжним або перевантаженим", "Room not found": "Кімнату не знайдено", @@ -188,7 +188,7 @@ "Invite to this room": "Запросити до цієї кімнати", "Thursday": "Четвер", "Search…": "Пошук…", - "Logs sent": "Журнали відправленні", + "Logs sent": "Журнали надіслані", "Back": "Назад", "Reply": "Відповісти", "Show message in desktop notification": "Показати повідомлення в сповіщення на робочому столі", @@ -216,7 +216,7 @@ "Event sent!": "Захід відправлено!", "Unhide Preview": "Відкрити попередній перегляд", "Event Content": "Зміст заходу", - "Thank you!": "Дякую!", + "Thank you!": "Дякуємо!", "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!": "У вашому оглядачі вигляд застосунку може бути повністю іншим, а деякі або навіть усі функції можуть не працювати. Якщо ви наполягаєте, то можете продовжити користування, але ви маєте впоратись з усіма можливими проблемами власноруч!", "Checking for an update...": "Перевірка оновлень…", "There are advanced notifications which are not shown here": "Є додаткові сповіщення, що не показуються тут", @@ -467,7 +467,7 @@ "Failed to mute user": "Не вдалося заглушити користувача", "Failed to toggle moderator status": "Не вдалося перемкнути статус модератора", "Failed to change power level": "Не вдалося змінити рівень повноважень", - "Chat with Riot Bot": "Чат із Riot-ботом", + "Chat with Riot Bot": "Балачка з Riot-ботом", "Whether or not you're logged in (we don't record your username)": "Незалежно від того, увійшли ви чи ні (ми не записуємо ваше ім'я користувача)", "A conference call could not be started because the integrations server is not available": "Конференц-дзвінок не можна розпочати оскільки інтеграційний сервер недоступний", "The file '%(fileName)s' failed to upload.": "Файл '%(fileName)s' не вийшло відвантажити.", @@ -484,7 +484,7 @@ "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Зараз неможливо відповісти файлом. Хочете відвантажити цей файл без відповіді?", "Name or Matrix ID": "Імʼя або Matrix ID", "Identity server has no terms of service": "Сервер ідентифікації не має умов надання послуг", - "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Щоб підтвердити адресу е-пошту або телефон ця дія потребує доступу до типового серверу ідентифікації , але сервер не має жодних умов надання послуг.", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Щоб підтвердити адресу е-пошти або телефон ця дія потребує доступу до типового серверу ідентифікації , але сервер не має жодних умов надання послуг.", "Only continue if you trust the owner of the server.": "Продовжуйте тільки якщо довіряєте власнику сервера.", "Trust": "Довіра", "Unable to load! Check your network connectivity and try again.": "Завантаження неможливе! Перевірте інтернет-зʼєднання та спробуйте ще.", @@ -505,7 +505,7 @@ "This room has no topic.": "Ця кімната не має теми.", "Sets the room name": "Встановлює назву кімнати", "Use an identity server": "Використовувати сервер ідентифікації", - "Use an identity server to invite by email. Manage in Settings.": "Використовувати ідентифікаційний сервер для запрошення через е-пошту. Керування у настройках.", + "Use an identity server to invite by email. Manage in Settings.": "Використовувати сервер ідентифікації для запрошень через е-пошту. Керується у налаштуваннях.", "Unbans user with given ID": "Розблоковує користувача з вказаним ідентифікатором", "Adds a custom widget by URL to the room": "Додає власний віджет до кімнати за посиланням", "Please supply a https:// or http:// widget URL": "Вкажіть посилання на віджет — https:// або http://", @@ -561,5 +561,53 @@ "This room is not public. You will not be able to rejoin without an invite.": "Ця кімната не є прилюдною. Ви не зможете перепід'єднатись без запрошення.", "Failed to leave room": "Не вдалось залишити кімнату", "Can't leave Server Notices room": "Неможливо залишити кімнату Оголошення Сервера", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ця кімната використовується для важливих повідомлень з домашнього сервера, тож ви не можете її залишити." + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ця кімната використовується для важливих повідомлень з домашнього сервера, тож ви не можете її залишити.", + "Use Single Sign On to continue": "Використати Single Sign On для продовження", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Підтвердьте додавання цієї адреси е-пошти через використання Single Sign On аби довести вашу ідентичність.", + "Single Sign On": "Single Sign On", + "Confirm adding email": "Підтвердити додавання е-пошти", + "Click the button below to confirm adding this email address.": "Клацніть на кнопці нижче щоб підтвердити додавання цієї адреси е-пошти.", + "Confirm": "Підтвердити", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Підтвердьте додавання цього телефонного номера через використання Single Sign On аби довести вашу ідентичність.", + "Confirm adding phone number": "Підтвердити додавання телефонного номера", + "Click the button below to confirm adding this phone number.": "Клацніть на кнопці нижче щоб підтвердити додавання цього телефонного номера.", + "The version of Riot": "Версія Riot", + "Whether you're using Riot on a device where touch is the primary input mechanism": "Чи використовуєте ви Riot на пристрої, де основним засобом вводження є дотик", + "Whether you're using Riot as an installed Progressive Web App": "Чи використовуєте ви Riot як встановлений Progressive Web App", + "Your user agent": "Ваш user agent", + "The information being sent to us to help make Riot better includes:": "Відсилана до нас інформація, що допомагає покращити Riot, містить:", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "У цій кімнаті є невідомі сесії: якщо ви продовжите не звіряючи їх, то ваші розмови можуть бути прослухані.", + "Review Sessions": "Переглянути сесії", + "If you cancel now, you won't complete verifying the other user.": "Якщо ви скасуєте зараз, то не завершите звіряння іншого користувача.", + "If you cancel now, you won't complete verifying your other session.": "Якщо ви скасуєте зараз, то не завершите звіряння вашої іншої сесії.", + "If you cancel now, you won't complete your operation.": "Якщо ви скасуєте зараз, то не завершите вашу дію.", + "Cancel entering passphrase?": "Скасувати введення парольної фрази?", + "Enter passphrase": "Введіть парольну фразу", + "Setting up keys": "Налаштовування ключів", + "Verify this session": "Звірити цю сесію", + "Sign In or Create Account": "Увійти або створити обліківку", + "Use your account or create a new one to continue.": "Скористайтесь вашою обліківкою або створіть нову щоб продовжити.", + "Create Account": "Створити обліківку", + "Sign In": "Увійти", + "Verify all your sessions to ensure your account & messages are safe": "Звірте усі ваші сесії аби переконатись, що ваші обліківка та повідомлення у безпеці", + "Later": "Пізніше", + "Review": "Переглянути", + "Verify yourself & others to keep your chats safe": "Звірте себе й інших щоб зберегти ваше спілкування у безпеці", + "Verify": "Звірити", + "Verify the new login accessing your account: %(name)s": "Звірити новий вхід, що доступається до вашої обліковки: %(name)s", + "From %(deviceName)s (%(deviceId)s)": "Від %(deviceName)s (%(deviceId)s)", + "Decline (%(counter)s)": "Відхилити (%(counter)s)", + "Language and region": "Мова та регіон", + "Account management": "Керування обліківкою", + "Deactivating your account is a permanent action - be careful!": "Деактивація вашої обліківки є безповоротною дією — будьте обережні!", + "Deactivate Account": "Деактивувати обліківку", + "Deactivate account": "Деактивувати обліківку", + "Legal": "Правова інформація", + "Credits": "Подяки", + "For help with using Riot, click here.": "Якщо необхідна допомога у користуванні Riot'ом, клацніть тут.", + "For help with using Riot, click here or start a chat with our bot using the button below.": "Якщо необхідна допомога у користуванні Riot'ом, клацніть тут або розпочніть балачку з нашим ботом, клацнувши на кнопці нижче.", + "Join the conversation with an account": "Приєднатись до бесіди з обліківкою", + "Unable to restore session": "Неможливо відновити сесію", + "We encountered an error trying to restore your previous session.": "Ми натрапили на помилку, намагаючись відновити вашу попередню сесію.", + "Please install Chrome, Firefox, or Safari for the best experience.": "Для найкращих вражень від користування встановіть, будь ласка, Chrome, Firefox, або Safari." } From 93f2a8377432dd5310417534ee240f0271d6dc18 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Fri, 8 May 2020 16:36:13 +0100 Subject: [PATCH 079/319] Revert "Assume room should be unencrypted if homeserver does not implement keys/query" This reverts commit baa7a86e3ea5d9e79481b9d037a29f7df4af1928. --- src/createRoom.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/createRoom.js b/src/createRoom.js index 4d59b11656..a39d2c2216 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -212,17 +212,7 @@ export async function _waitForMember(client, roomId, userId, opts = { timeout: 1 * can encrypt to. */ export async function canEncryptToAllUsers(client, userIds) { - let usersDeviceMap; - try { - usersDeviceMap = await client.downloadKeys(userIds); - } catch (ex) { - if (ex.httpStatus === 404) { - // The endpoint to fetch keys doesn't exist: force unencrypted. - // See: https://github.com/vector-im/riot-web/issues/13598 - return false; - } - throw ex; - } + const usersDeviceMap = await client.downloadKeys(userIds); // { "@user:host": { "DEVICE": {...}, ... }, ... } return Object.values(usersDeviceMap).every((userDevices) => // { "DEVICE": {...}, ... } From 6ff093f5a36034af61f53258b2dc525a621b5755 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 8 May 2020 19:15:59 +0100 Subject: [PATCH 080/319] Bring back UnknownBody for UISIs Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 1 + res/css/views/messages/_UnknownBody.scss | 16 +++++++++++ .../views/messages/EditHistoryMessage.js | 1 - src/components/views/messages/MessageEvent.js | 4 +++ src/components/views/messages/UnknownBody.js | 27 +++++++++++++++++++ src/components/views/rooms/EventTile.js | 1 - 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 res/css/views/messages/_UnknownBody.scss create mode 100644 src/components/views/messages/UnknownBody.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 0344074369..428a28ac3a 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -144,6 +144,7 @@ @import "./views/messages/_RoomAvatarEvent.scss"; @import "./views/messages/_SenderProfile.scss"; @import "./views/messages/_TextualEvent.scss"; +@import "./views/messages/_UnknownBody.scss"; @import "./views/messages/_ViewSourceEvent.scss"; @import "./views/messages/_common_CryptoEvent.scss"; @import "./views/right_panel/_EncryptionInfo.scss"; diff --git a/res/css/views/messages/_UnknownBody.scss b/res/css/views/messages/_UnknownBody.scss new file mode 100644 index 0000000000..9036e12bf0 --- /dev/null +++ b/res/css/views/messages/_UnknownBody.scss @@ -0,0 +1,16 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_UnknownBody { + white-space: pre-wrap; +} diff --git a/src/components/views/messages/EditHistoryMessage.js b/src/components/views/messages/EditHistoryMessage.js index e0ca23d244..df27773a40 100644 --- a/src/components/views/messages/EditHistoryMessage.js +++ b/src/components/views/messages/EditHistoryMessage.js @@ -158,7 +158,6 @@ export default class EditHistoryMessage extends React.PureComponent { const isSending = (['sending', 'queued', 'encrypting'].indexOf(this.state.sendStatus) !== -1); const classes = classNames({ "mx_EventTile": true, - "mx_EventTile_redacted": mxEvent.isRedacted(), "mx_EventTile_sending": isSending, "mx_EventTile_notSent": this.state.sendStatus === 'not_sent', }); diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index f8bd23cbe3..eb74270762 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -21,6 +21,7 @@ import * as sdk from '../../../index'; import SettingsStore from "../../../settings/SettingsStore"; import {Mjolnir} from "../../../mjolnir/Mjolnir"; import RedactedBody from "./RedactedBody"; +import UnknownBody from "./UnknownBody"; export default createReactClass({ displayName: 'MessageEvent', @@ -88,6 +89,9 @@ export default createReactClass({ } else if (content.url) { // Fallback to MFileBody if there's a content URL BodyType = bodyTypes['m.file']; + } else { + // Fallback to UnknownBody otherwise if not redacted + BodyType = UnknownBody; } } diff --git a/src/components/views/messages/UnknownBody.js b/src/components/views/messages/UnknownBody.js new file mode 100644 index 0000000000..6c00921b45 --- /dev/null +++ b/src/components/views/messages/UnknownBody.js @@ -0,0 +1,27 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; + +export default ({mxEvent}) => { + const text = mxEvent.getContent().body; + return ( + + { text } + + ); +}; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index a64fd82eb5..33ee8a0f63 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -670,7 +670,6 @@ export default createReactClass({ mx_EventTile_unknown: !isBubbleMessage && this.state.verified === E2E_STATE.UNKNOWN, mx_EventTile_bad: isEncryptionFailure, mx_EventTile_emote: msgtype === 'm.emote', - mx_EventTile_redacted: isRedacted, }); let permalink = "#"; From 9b7c63a7116c369d3e3e59c3a643067b6666ebca Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Fri, 8 May 2020 20:53:32 +0100 Subject: [PATCH 081/319] Duplicated names --- src/components/views/messages/SenderProfile.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js index d95c9d685a..d512b186e9 100644 --- a/src/components/views/messages/SenderProfile.js +++ b/src/components/views/messages/SenderProfile.js @@ -133,7 +133,6 @@ export default createReactClass({
    { content } - { content }
    ); From 82396661cf86d7c41285cded2d22523e84f3bc23 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Fri, 8 May 2020 22:21:26 +0100 Subject: [PATCH 082/319] Implement nitpicks - usernames are elipsed - icon alignment fixed - replies are more dense - reply messages respond to name widths - fixed between message padding problem (flex ftw) --- res/css/views/rooms/_IRCLayout.scss | 62 +++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index fcdeef6590..f5d8664884 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -18,12 +18,19 @@ $name-width: 70px; $icon-width: 14px; $timestamp-width: 45px; $right-padding: 5px; +$irc-line-height: $font-18px; .mx_IRCLayout { - line-height: $font-18px !important; + line-height: $irc-line-height !important; .mx_EventTile { + + // timestamps are links which shouldn't be underlined + > a { + text-decoration: none; + } + display: flex; flex-direction: row; align-items: flex-start; @@ -49,7 +56,10 @@ $right-padding: 5px; overflow: visible; } - > .mx_EventTile_line { + .mx_EventTile_line, .mx_EventTile_reply { + padding: 0; + display: flex; + flex-direction: column; order: 3; flex-grow: 1; } @@ -60,7 +70,7 @@ $right-padding: 5px; top: 0; left: 0; flex-shrink: 0; - height: 22px; + height: $irc-line-height; display: flex; align-items: center; @@ -79,10 +89,6 @@ $right-padding: 5px; text-align: right; } - .mx_EventTile_line, .mx_EventTile_reply { - padding: 0; - } - .mx_EventTile_e2eIcon { position: relative; right: unset; @@ -98,6 +104,8 @@ $right-padding: 5px; .mx_ReplyThread_wrapper_empty { display: inline-block; } + + } .mx_EvenTile_line .mx_MessageActionBar, @@ -114,10 +122,25 @@ $right-padding: 5px; } } + .mx_EventTile_emote { + > .mx_EventTile_avatar { + margin-left: calc($name-width + $icon-width + $right-padding); + } + } + + blockquote { + margin: 0; + } + .mx_EventListSummary { > .mx_EventTile_line { padding-left: calc($name-width + $icon-width + $timestamp-width + 3 * $right-padding); // 15 px of padding } + + .mx_EventListSummary_avatars { + padding: 0; + margin: 0; + } } .mx_EventTile.mx_EventTile_info { @@ -131,16 +154,16 @@ $right-padding: 5px; } .mx_TextualEvent { - line-height: $font-22px; + line-height: $irc-line-height; } } .mx_EventTile_continuation:not(.mx_EventTile_info) { - .mx_EventTile_avatar { + > .mx_EventTile_avatar { visibility: hidden; } - .mx_SenderProfile { + > .mx_SenderProfile { visibility: hidden; } } @@ -156,8 +179,15 @@ $right-padding: 5px; .mx_SenderProfile_hover { background-color: $primary-bg-color; overflow: hidden; - width: $name-width; - transition: width 2s; + + > span { + display: flex; + + > .mx_SenderProfile_name { + overflow: hidden; + text-overflow: ellipsis; + } + } } .mx_SenderProfile_hover:hover { @@ -165,4 +195,12 @@ $right-padding: 5px; width: auto; z-index: 10; } + + .mx_ReplyThread { + margin: 0; + .mx_SenderProfile { + width: unset; + max-width: $name-width; + } + } } From fef4d882c44dcf93b677bac50cc09097df7f7839 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Fri, 8 May 2020 22:35:40 +0100 Subject: [PATCH 083/319] lint --- res/css/views/rooms/_IRCLayout.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index f5d8664884..301f712ffb 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -104,8 +104,6 @@ $irc-line-height: $font-18px; .mx_ReplyThread_wrapper_empty { display: inline-block; } - - } .mx_EvenTile_line .mx_MessageActionBar, From 3e3196ca4c51a010d629a26a3960c088c379e174 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Fri, 8 May 2020 19:58:06 +0000 Subject: [PATCH 084/319] Translated using Weblate (German) Currently translated at 90.7% (2088 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 275 +++++++++++++++++++++++++++++++++++- 1 file changed, 270 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 99f58d865a..5afc04771b 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -467,8 +467,8 @@ "Leave %(groupName)s?": "%(groupName)s verlassen?", "Add a Room": "Raum hinzufügen", "Add a User": "Benutzer hinzufügen", - "Light theme": "Helles Thema", - "Dark theme": "Dunkles Thema", + "Light theme": "Helles Design", + "Dark theme": "Dunkles Design", "You have entered an invalid address.": "Du hast eine ungültige Adresse eingegeben.", "Matrix ID": "Matrix-ID", "Unignore": "Ignorieren aufheben", @@ -964,7 +964,7 @@ "Incompatible Database": "Inkompatible Datenbanken", "Continue With Encryption Disabled": "Mit deaktivierter Verschlüsselung fortfahren", "Enter a passphrase...": "Passphrase eingeben...", - "Next": "Nächstes", + "Next": "Weiter", "That matches!": "Das passt!", "That doesn't match.": "Das passt nicht.", "Go back to set it again.": "Gehe zurück und setze es erneut.", @@ -1502,7 +1502,7 @@ "Verify": "Verifizieren", "Decline (%(counter)s)": "Zurückweisen (%(counter)s)", "not found": "nicht gefunden", - "rooms.": "Räume.", + "rooms.": "Räumen zu speichern.", "Manage": "Verwalten", "Securely cache encrypted messages locally for them to appear in search results.": "Speichere verschlüsselte Nachrichten sicher lokal zwischen, sodass sie in Suchergebnissen erscheinen können.", "Enable": "Aktivieren", @@ -1891,5 +1891,270 @@ "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.", "Send a bug report with logs": "Sende Fehlermeldung mit Protokoll", "Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen", - "Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen." + "Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen.", + "You signed in to a new session without verifying it:": "Du hast dich in einer neuen Sitzung angemeldet ohne sie zu verifizieren:", + "Other users may not trust it": "Andere Benutzer vertrauen ihr vielleicht nicht", + "Update your secure storage": "Aktualisiere deinen sicheren Speicher", + "Upgrade": "Hochstufen", + "Verify the new login accessing your account: %(name)s": "Verifiziere die neue Anmeldung an deinem Konto: %(name)s", + "From %(deviceName)s (%(deviceId)s)": "Von %(deviceName)s (%(deviceId)s)", + "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt cross-signing nicht.", + "Cross-signing and secret storage are enabled.": "Cross-signing und der sichere Speicher wurden eingerichtet.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine cross-signing Identität im sicheren Speicher aber diese Sitzung wird noch nicht vertraut.", + "Cross-signing and secret storage are not yet set up.": "Cross-signing und der sichere Speicher wurden noch nicht eingerichtet.", + "Reset cross-signing and secret storage": "Setze cross-signing und den sicheren Speicher zurück", + "Bootstrap cross-signing and secret storage": "Richte cross-signing und den sicheren Speicher ein", + "unexpected type": "unbekannter Typ", + "Cross-signing public keys:": "Öffentliche Cross-signing Schlüssel:", + "in memory": "im Speicher", + "Cross-signing private keys:": "Private Cross-signing Schlüssel:", + "in secret storage": "im sicheren Speicher", + "Self signing private key:": "Selbst signierter privater Schlüssel:", + "cached locally": "lokal zwischengespeichert", + "not found locally": "lokal nicht gefunden", + "User signing private key:": "Privater Benutzer-Schlüssel:", + "Session backup key:": "Sitzungswiederherstellungsschlüssel:", + "Secret storage public key:": "Öffentlicher Schlüssel des sicheren Speichers:", + "in account data": "in den Kontodaten", + "Homeserver feature support:": "Heimserverunterstützung:", + "exists": "existiert", + "Secret Storage key format:": "Sicherer Speicher Schlüssel Format:", + "outdated": "abgelaufen", + "up to date": "aktuell", + "Delete sessions|other": "Lösche Sitzungen", + "Delete sessions|one": "Lösche Sitzung", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Sitzungen eines Benutzers einzeln verifizieren. Geräten, die ein Benutzer als vertrauenswürdig markiert hat, wird nicht automatisch vertraut (cross-signing).", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Der Zwischenspeicher für die lokale Suche in verschlüsselten Nachrichten benötigt ", + " to store messages from ": " um Nachrichten aus ", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "Riot benötigt weitere Komponenten um verschlüsselte Nachrichten lokal zu durchsuchen. Wenn du diese Funktion testen möchtest kannst du dir deine eigene Version von Riot Desktop mit der integrierten Suchfunktion bauen.", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot kann verschlüsselte Nachrichten nicht lokal durchsuchen während es im Browser läuft. Verwende Riot Desktop damit verschlüsselte Nachrichten mit der Suchfunktion gefunden werden.", + "Backup has a valid signature from this user": "Die Sicherung hat eine gültige Signatur dieses Benutzers", + "Backup has a invalid signature from this user": "Die Sicherung hat eine ungültige Signatur dieses Benutzers", + "Backup has a valid signature from verified session ": "Die Sicherung hat eine gültige Signatur von einer verifizierten Sitzung ", + "Backup has a valid signature from unverified session ": "Die Sicherung hat eine gültige Signatur von einer nicht verifizierten Sitzung ", + "Backup has an invalid signature from verified session ": "Die Sicherung hat eine ungültige Signatur von einer verifizierten Sitzung ", + "Backup has an invalid signature from unverified session ": "Die Sicherung hat eine ungültige Signatur von einer nicht verifizierten Sitzung ", + "Your keys are not being backed up from this session.": "Deine Schlüssel werden nicht von dieser Sitzung gesichert.", + "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Du verwendest aktuell um andere Benutzer zu finden und gefunden zu werden. Du kannst deinen Identitätsserver unten ändern.", + "Invalid theme schema.": "Ungültiges Design Schema.", + "Error downloading theme information.": "Fehler beim herunterladen des Themas.", + "Theme added!": "Design hinzugefügt!", + "Custom theme URL": "URL des benutzerdefinierten Designs", + "Add theme": "Design hinzufügen", + "Keyboard Shortcuts": "Tastaturkürzel", + "Where you’re logged in": "Wo du dich angemeldet hast", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Benenne deine Sitzungen, melde dich aus den Sitzungen ab oder verifiziere sie in deinen Benutzereinstellungen.", + "Error changing power level requirement": "Fehler beim Ändern der Anforderungen für Benutzerrechte", + "Error changing power level": "Fehler beim Ändern der Benutzerrechte", + "Your email address hasn't been verified yet": "Deine E-Mail Adresse wurde noch nicht verifiziert", + "Verify the link in your inbox": "Verifiziere den Link in deinem Nachrichteneingang", + "Complete": "Fertig", + "Revoke": "Zurückziehen", + "Share": "Teilen", + "You have not verified this user.": "Du hast diesen Benutzer nicht verifiziert.", + "Everyone in this room is verified": "Jeder in diesem Raum ist verifiziert", + "Mod": "Mod", + "Invite only": "Nur auf Einladung", + "Scroll to most recent messages": "Springe zur neusten Nachricht", + "No recent messages by %(user)s found": "Keine neuen Nachrichten von %(user)s gefunden", + "Try scrolling up in the timeline to see if there are any earlier ones.": "Versuche nach oben zu scrollen um zu sehen ob sich dort frühere Nachrichten befinden.", + "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "Dies kann bei vielen Nachrichten einige Zeit dauern. Bitte lade die Anwendung in dieser Zeit nicht neu.", + "Deactivate user?": "Benutzer deaktivieren?", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Beim Deaktivieren wird der Benutzer abgemeldet und ein erneutes Anmelden verhindert. Zusätzlich wird er aus allen Räumen entfernt. Diese Aktion kann nicht rückgängig gemacht werden. Bist du sicher dass du diesen Benutzer deaktivieren willst?", + "Deactivate user": "Benutzer deaktivieren", + "Failed to deactivate user": "Deaktivieren des Benutzers fehlgeschlagen", + "Send a reply…": "Sende eine Antwort…", + "Send a message…": "Sende eine Nachricht…", + "Bold": "Fett", + "Italics": "Kursiv", + "Strikethrough": "Durchgestrichen", + "Code block": "Quelltext", + "Recent rooms": "Letzte Räume", + "Loading …": "Lade …", + "Join the conversation with an account": "Tritt der Unterhaltung mit einem Konto bei", + "You were kicked from %(roomName)s by %(memberName)s": "Du wurdest von %(memberName)s aus %(roomName)s entfernt", + "Re-join": "Wieder beitreten", + "You were banned from %(roomName)s by %(memberName)s": "Du wurdest von %(memberName)s aus %(roomName)s verbannt", + "Something went wrong with your invite to %(roomName)s": "Bei deiner Einladung zu %(roomName)s ist ein Fehler aufgetreten", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Während der Verifizierung deiner Einladung ist ein Fehler (%(errcode)s) aufgetreten. Du kannst diese Information einem Raum-Administrator weitergeben.", + "You can only join it with a working invite.": "Du kannst nur mit einer gültigen Einladung beitreten.", + "Try to join anyway": "Versuche trotzdem beizutreten", + "You can still join it because this is a public room.": "Du kannst trotzdem beitreten da dies ein öffentlicher Raum ist.", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Diese Einladung zu %(roomName)s wurde an die Adresse %(email)s gesendet, die nicht zu deinem Konto gehört", + "Link this email with your account in Settings to receive invites directly in Riot.": "Verbinde diese E-Mail-Adresse in den Einstellungen mit deinem Konto um die Einladungen direkt in Riot zu erhalten.", + "This invite to %(roomName)s was sent to %(email)s": "Diese Einladung zu %(roomName)s wurde an %(email)s gesendet", + "Use an identity server in Settings to receive invites directly in Riot.": "Verknüpfe einen Identitätsserver in den Einstellungen um die Einladungen direkt in Riot zu erhalten.", + "Share this email in Settings to receive invites directly in Riot.": "Teile diese E-Mail-Adresse in den Einstellungen um Einladungen direkt in Riot zu erhalten.", + "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s kann keine Vorschau erzeugt werden. Möchtest du den Raum betreten?", + "This room doesn't exist. Are you sure you're at the right place?": "Dieser Raum existiert nicht. Bist du sicher dass du hier richtig bist?", + "Try again later, or ask a room admin to check if you have access.": "Versuche es später erneut oder bitte einen Raum-Administrator deine Zutrittsrechte zu überprüfen.", + "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "Beim Betreten des Raums ist ein Fehler aufgetreten %(errcode)s. Wenn du denkst dass diese Meldung nicht korrekt ist sende bitte einen Fehlerbericht.", + "%(count)s unread messages including mentions.|other": "%(count)s ungelesene Nachrichten, inklusive Erwähnungen.", + "%(count)s unread messages including mentions.|one": "1 ungelesene Erwähnung.", + "%(count)s unread messages.|other": "%(count)s ungelesene Nachrichten.", + "%(count)s unread messages.|one": "1 ungelesene Nachricht.", + "Unread mentions.": "Ungelesene Erwähnungen.", + "Unread messages.": "Ungelesene Nachrichten.", + "This room has already been upgraded.": "Dieser Raum wurde bereits hochgestuft.", + "This room is running room version , which this homeserver has marked as unstable.": "Dieser Raum läuft mit der Raumversion , welcher dieser Heimserver als instabil markiert hat.", + "Unknown Command": "Unbekannter Befehl", + "Unrecognised command: %(commandText)s": "Unbekannter Befehl: %(commandText)s", + "Hint: Begin your message with // to start it with a slash.": "Hinweis: Beginne deine Nachricht mit // um sie mit einem Querstrich zu beginnen.", + "Send as message": "Als Nachricht senden", + "Failed to connect to integration manager": "Fehler beim Verbinden mit dem Integrationsserver", + "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Konnte die Einladung nicht zurückziehen. Der Server hat ein vorübergehendes Problem oder du besitzt nicht die nötigen Rechte um die Einladung zurückzuziehen.", + "Mark all as read": "Alle als gelesen markieren", + "You don't have permission to delete the alias.": "Du hast nicht die nötigen Rechte um den Alias zu löschen.", + "Local address": "Lokale Adresse", + "Published Addresses": "Öffentliche Adresse", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Öffentliche Adressen können von jedem verwendet werden um den Raum zu betreten. Um eine Adresse zu veröffentlichen musst du zunächst eine lokale Adresse anlegen.", + "Other published addresses:": "Andere öffentliche Adressen:", + "No other published addresses yet, add one below": "Keine anderen öffentlichen Adressen vorhanden, füge unten eine hinzu", + "New published address (e.g. #alias:server)": "Neue öffentliche Adresse (z.B. #alias:server)", + "Local Addresses": "Lokale Adressen", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Erstelle Adressen für diesen Raum, damit andere Benutzer den Raum auf deinem Heimserver (%(localDomain)s) finden können", + "Waiting for you to accept on your other session…": "Warte auf die Bestätigung in deiner anderen Sitzung…", + "Waiting for %(displayName)s to accept…": "Warte auf die Annahme von %(displayName)s …", + "Accepting…": "Annehmen…", + "Start Verification": "Starte Verifikation", + "Messages in this room are end-to-end encrypted.": "Nachrichten in diesem Raum sind Ende-zu-Ende verschlüsselt.", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Diese Nachrichten sind verschlüsselt und nur du und der Empfänger habt die Schlüssel um sie zu entschlüsseln.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "In verschlüsselten Räumen sind deine Nachrichten verschlüsselt und nur du und der Empfänger habt die Schlüssel um sie zu entschlüsseln.", + "Verify User": "Benutzer verifizieren", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Verifiziere den Benutzer, durch Vergleichen eines Einmal-Codes auf euren beiden Geräten, um die Sicherheit zu erhöhen.", + "Your messages are not secure": "Deine Nachrichten sind nicht sicher", + "One of the following may be compromised:": "Eines der folgenden könnte kompromittiert sein:", + "Your homeserver": "Dein Heimserver", + "The homeserver the user you’re verifying is connected to": "Der Heimserver an dem der zu verifizierende Benutzer angemeldet ist", + "Yours, or the other users’ internet connection": "Deine Internetverbindung oder die des anderen Benutzers", + "Yours, or the other users’ session": "Deine Sitzung oder die des anderen Benutzers", + "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", + "This client does not support end-to-end encryption.": "Diese Anwendung unterstützt keine Ende-zu-Ende-Verschlüsselung.", + "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Die Sitzung, die du verifizieren möchtest, unterstützt weder das Scannen eines QR Codes noch die Emoji Verifikation. Bitte versuche es mit einer anderen Anwendung.", + "Verify by scanning": "Mit Scannen eines QR Codes verifizieren", + "If you can't scan the code above, verify by comparing unique emoji.": "Wenn du den obenstehenden Code nicht scannen kannst versuche es mit der Emoji Verifikation.", + "Verify all users in a room to ensure it's secure.": "Verifiziere alle Benutzer in einem Raum um die vollständige Sicherheit zu gewährleisten.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Verifiziere alle Benutzer in verschlüsselten Räumen um die vollständige Sicherheit zu gewährleisten.", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Du hast %(deviceName)s (%(deviceId)s) erfolgreich verifiziert!", + "Verified": "Verifiziert", + "Start verification again from the notification.": "Starte die Verifikation aus der Benachrichtigung erneut.", + "Start verification again from their profile.": "Starte die Verifikation aus dem Benutzerprofil erneut.", + "Verification timed out.": "Verifikationsanfrage abgelaufen.", + "You cancelled verification on your other session.": "Du hast die Verifikationsanfrage in der anderen Sitzung abgelehnt.", + "%(displayName)s cancelled verification.": "%(displayName)s hat die Verifikationsanfrage abgelehnt.", + "You cancelled verification.": "Du hast die Verifikation abgebrochen.", + "Verification cancelled": "Verifikation abgebrochen", + "Compare emoji": "Vergleiche Emojis", + "Message Actions": "Nachrichten Aktionen", + "Show image": "Zeige Bild", + "You have ignored this user, so their message is hidden. Show anyways.": "Du ignorierst diesen Benutzer, deshalb werden seine Nachrichten nicht angezeigt. Trotzdem anzeigen.", + "You accepted": "Du hast angenommen", + "You declined": "Du hast abgelehnt", + "You cancelled": "Du hast abgebrochen", + "Accepting …": "Annehmen …", + "Declining …": "Ablehnen …", + "You sent a verification request": "Du hast eine Verifikationsanfrage gesendet", + "Show all": "Alle zeigen", + "Reactions": "Reaktionen", + " reacted with %(content)s": " hat mit %(content)s reagiert", + "reacted with %(shortName)s": "hat mit %(shortName)s reagiert", + "Message deleted": "Nachricht gelöscht", + "Message deleted by %(name)s": "Nachricht von %(name)s gelöscht", + "Edited at %(date)s. Click to view edits.": "Am %(date)s geändert. Klicke um Änderungen anzuzeigen.", + "Can't load this message": "Kann diese Nachricht nicht laden", + "Submit logs": "Logs übermitteln", + "Frequently Used": "Häufig verwendet", + "Smileys & People": "Smileys & Leute", + "Animals & Nature": "Tiere & Natur", + "Food & Drink": "Essen & Trinken", + "Activities": "Aktivitäten", + "Travel & Places": "Reisen & Orte", + "Objects": "Objekte", + "Symbols": "Symbole", + "Flags": "Flaggen", + "Quick Reactions": "Praktische Reaktionen", + "Cancel search": "Suche abbrechen", + "Any of the following data may be shared:": "Die folgenden Daten können geteilt werden:", + "Your avatar URL": "Deine Avatar URL", + "Your user ID": "Deine Benutzer ID", + "Your theme": "Dein Design", + "Riot URL": "Riot URL", + "Room ID": "Raum ID", + "Widget ID": "Widget ID", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Wenn du dieses Widget verwendest können Daten zu %(widgetDomain)s und deinem Integrationsserver übertragen werden.", + "Using this widget may share data with %(widgetDomain)s.": "Wenn du dieses Widget verwendest können Daten zu %(widgetDomain)s übertragen werden.", + "Widgets do not use message encryption.": "Widgets verschlüsseln deine Nachrichten nicht.", + "Please create a new issue on GitHub so that we can investigate this bug.": "Bitte erstelle ein neues Issue auf GitHub damit wir diesen Fehler untersuchen können.", + "Rotate Left": "Nach links drehen", + "Rotate counter-clockwise": "Gegen den Uhrzeigersinn drehen", + "Rotate Right": "Nach rechts drehen", + "Rotate clockwise": "Im Uhrzeigersinn drehen", + "Language Dropdown": "Sprachauswahl", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)shaben keine Änderung vorgenommen", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)shat %(count)s mal keine Änderung vorgenommen", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)shat keine Änderung vorgenommen", + "Room alias": "Raum Alias", + "Some characters not allowed": "Manche Zeichen sind nicht erlaubt", + "Please provide a room alias": "Bitte lege einen Raum Alias an", + "This alias is available to use": "Dieser Alias kann verwendet werden", + "This alias is already in use": "Dieser Alias wird bereits verwendet", + "Enter a server name": "Gibt einen Servernamen ein", + "Looks good": "Das sieht gut aus", + "Can't find this server or its room list": "Kann diesen Server oder seine Raumliste nicht finden", + "All rooms": "Alle Räume", + "Your server": "Dein Server", + "Are you sure you want to remove %(serverName)s": "Bist du sicher dass du %(serverName)s entfernen möchtest", + "Remove server": "Server entfernen", + "Matrix": "Matrix", + "Add a new server": "Einen Server hinzufügen", + "Enter the name of a new server you want to explore.": "Gib den Namen des Servers an den du erforschen möchtest.", + "Server name": "Servername", + "Add a new server...": "Füge einen Server hinzu...", + "%(networkName)s rooms": "%(networkName)s Räume", + "Matrix rooms": "Matrix Räume", + "Close dialog": "Dialog schließen", + "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Bitte teile uns mit was schiefgelaufen ist oder erstelle ein Github Issue und beschreibe das Problem.", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Warnung: Dein Browser wird nicht unterstützt. Die Anwendung kann instabil sein.", + "Notes": "Notizen", + "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Wenn du mehr Informationen hast die uns bei Untersuchung des Problems helfen (z.B. was du gerade getan hast, Raum IDs, Benutzer IDs, etc.) gib sie bitte hier an.", + "Removing…": "Löschen…", + "Destroy cross-signing keys?": "Cross-signing Schlüssel löschen?", + "Clear cross-signing keys": "Entferne Cross-signing Schlüssel", + "Enable end-to-end encryption": "Ende-zu-Ende Verschlüsselung aktivieren", + "You can’t disable this later. Bridges & most bots won’t work yet.": "Du kannst dies später nicht mehr ändern. Bridges und die meisten Bots werden nicht funktionieren.", + "Server did not require any authentication": "Der Server benötigt keine Authentifizierung", + "Server did not return valid authentication information.": "Der Server lieferte keine gültigen Authentifizierungsinformationen.", + "Are you sure you want to deactivate your account? This is irreversible.": "Bist du sicher dass du dein Konto deaktivieren möchtest? Dies kann nicht rückgängig gemacht werden.", + "There was a problem communicating with the server. Please try again.": "Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten. Bitte versuche es erneut.", + "View Servers in Room": "Zeige Server im Raum", + "Verification Requests": "Verifikationsanfragen", + "Integrations are disabled": "Integrationen sind deaktiviert", + "Integrations not allowed": "Integrationen sind nicht erlaubt", + "Failed to invite the following users to chat: %(csvUsers)s": "Fehler beim Einladen der folgenden Benutzer: %(csvUsers)s", + "Something went wrong trying to invite the users.": "Beim Einladen der Benutzer ist ein Fehler aufgetreten.", + "Failed to find the following users": "Kann die folgenden Benutzer nicht finden", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Die folgenden Benutzer konnten nicht eingeladen werden, da sie nicht existieren oder ungültig sind: %(csvNames)s", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Du hast eine neue Sitzung '%(displayName)s' hinzugefügt, die deine Verschlüsselungsschlüssel anfordert.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Deine nicht verifizierte Sitzung '%(displayName)s' fordert deine Verschlüsselungsschlüssel an.", + "Loading session info...": "Lade Sitzungsinformationen...", + "a new master key signature": "Eine neue Hauptschlüssel Signatur", + "a new cross-signing key signature": "Eine neue cross-signing Schlüssel Signatur", + "a device cross-signing signature": "Eine Geräte Schlüssel Signatur", + "a key signature": "Eine Schlüssel Signatur", + "Your password": "Dein Passwort", + "This session, or the other session": "Diese oder die andere Sitzung", + "Alt Gr": "Alt Gr", + "Shift": "Umschalt", + "Super": "Windows/Apple", + "Ctrl": "Strg", + "Toggle Bold": "Fett", + "Toggle Italics": "Kursiv", + "Toggle Quote": "Zitat", + "New line": "Neue Zeile", + "Page Up": "Bild hoch", + "Page Down": "Bild runter", + "Esc": "Esc", + "Enter": "Enter", + "Space": "Leertaste", + "End": "Ende" } From ea11016c4657535863c563f23d05691e22b62204 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 19:41:39 +0000 Subject: [PATCH 085/319] Translated using Weblate (German) Currently translated at 90.7% (2088 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 5afc04771b..d11a1d4768 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2156,5 +2156,10 @@ "Esc": "Esc", "Enter": "Enter", "Space": "Leertaste", - "End": "Ende" + "End": "Ende", + "Enable 'Manage Integrations' in Settings to do this.": "Aktiviere hierzu in den Einstellungen \"Integrationen verwalten\".", + "The internet connection either session is using": "Die Internetverbindung, die eine der beiden Sitzung verwendet", + "We recommend you change your password and recovery key in Settings immediately": "Wir empfehlen, dein Passwort und deine Wiederherstellungsschlüssel sofort in den Einstellungen zu ändern", + "New session": "Neue Sitzung", + "Use this session to verify your new one, granting it access to encrypted messages:": "Verwende diese Sitzung, um deine neue zu verifizieren und ihr Zugriff auf verschlüsselte Nachrichten zu gewähren:" } From 7b1a3e72105d9415746afd93d3d8d67f4c574376 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 19:54:54 +0000 Subject: [PATCH 086/319] Translated using Weblate (German) Currently translated at 90.8% (2091 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d11a1d4768..c74294e324 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2161,5 +2161,5 @@ "The internet connection either session is using": "Die Internetverbindung, die eine der beiden Sitzung verwendet", "We recommend you change your password and recovery key in Settings immediately": "Wir empfehlen, dein Passwort und deine Wiederherstellungsschlüssel sofort in den Einstellungen zu ändern", "New session": "Neue Sitzung", - "Use this session to verify your new one, granting it access to encrypted messages:": "Verwende diese Sitzung, um deine neue zu verifizieren und ihr Zugriff auf verschlüsselte Nachrichten zu gewähren:" + "Use this session to verify your new one, granting it access to encrypted messages:": "Verwende diese Sitzung, um deine neue Sitzung zu verifizieren und ihr Zugriff auf verschlüsselte Nachrichten zu gewähren:" } From c12105ca7f0c6f0338dcfd839e8b3f696812d029 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 19:55:08 +0000 Subject: [PATCH 087/319] Translated using Weblate (German) Currently translated at 90.8% (2091 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c74294e324..e18601e83c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2161,5 +2161,8 @@ "The internet connection either session is using": "Die Internetverbindung, die eine der beiden Sitzung verwendet", "We recommend you change your password and recovery key in Settings immediately": "Wir empfehlen, dein Passwort und deine Wiederherstellungsschlüssel sofort in den Einstellungen zu ändern", "New session": "Neue Sitzung", - "Use this session to verify your new one, granting it access to encrypted messages:": "Verwende diese Sitzung, um deine neue Sitzung zu verifizieren und ihr Zugriff auf verschlüsselte Nachrichten zu gewähren:" + "Use this session to verify your new one, granting it access to encrypted messages:": "Verwende diese Sitzung, um deine neue Sitzung zu verifizieren und ihr Zugriff auf verschlüsselte Nachrichten zu gewähren:", + "If you didn’t sign in to this session, your account may be compromised.": "Wenn du dich nicht bei dieser Sitzung angemeldet hast, ist dein Konto möglicherweise gefährdet.", + "This wasn't me": "Das war ich nicht", + "Please fill why you're reporting.": "Bitte gib an, weshalb du Bericht erstattest." } From 59aeb6e9460d76da8cae92bf3e4cd608c980a733 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 19:56:30 +0000 Subject: [PATCH 088/319] Translated using Weblate (German) Currently translated at 91.0% (2095 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index e18601e83c..dca994c2ac 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2164,5 +2164,8 @@ "Use this session to verify your new one, granting it access to encrypted messages:": "Verwende diese Sitzung, um deine neue Sitzung zu verifizieren und ihr Zugriff auf verschlüsselte Nachrichten zu gewähren:", "If you didn’t sign in to this session, your account may be compromised.": "Wenn du dich nicht bei dieser Sitzung angemeldet hast, ist dein Konto möglicherweise gefährdet.", "This wasn't me": "Das war ich nicht", - "Please fill why you're reporting.": "Bitte gib an, weshalb du Bericht erstattest." + "Please fill why you're reporting.": "Bitte gib an, weshalb du einen Fehler meldest.", + "Automatically invite users": "Benutzer automatisch einladen", + "Upgrade private room": "Privaten Raum hochstufen", + "Upgrade public room": "Öffentlichen Raum hochstufen" } From 7b1d23ea3e5724342ef51fe987fa525fc8f00b93 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 19:58:32 +0000 Subject: [PATCH 089/319] Translated using Weblate (German) Currently translated at 91.0% (2095 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index dca994c2ac..0ef49fc08d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2167,5 +2167,6 @@ "Please fill why you're reporting.": "Bitte gib an, weshalb du einen Fehler meldest.", "Automatically invite users": "Benutzer automatisch einladen", "Upgrade private room": "Privaten Raum hochstufen", - "Upgrade public room": "Öffentlichen Raum hochstufen" + "Upgrade public room": "Öffentlichen Raum hochstufen", + "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Dies wirkt sich normalerweise nur darauf aus, wie der Raum auf dem Server verarbeitet wird. Wenn du Probleme mit deinem Riot hast, bitte melde einen Bug." } From c3a5ad89445f294c109d04fccdd404c76fc1733d Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 19:58:45 +0000 Subject: [PATCH 090/319] Translated using Weblate (German) Currently translated at 91.2% (2100 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0ef49fc08d..9d17baab3a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2168,5 +2168,5 @@ "Automatically invite users": "Benutzer automatisch einladen", "Upgrade private room": "Privaten Raum hochstufen", "Upgrade public room": "Öffentlichen Raum hochstufen", - "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Dies wirkt sich normalerweise nur darauf aus, wie der Raum auf dem Server verarbeitet wird. Wenn du Probleme mit deinem Riot hast, bitte melde einen Bug." + "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Dies wirkt sich normalerweise nur darauf aus, wie der Raum auf dem Server verarbeitet wird. Wenn du Probleme mit deinem Riot hast, melde bitte einen Bug." } From b809be11c02c1a74a2718dbfabca77181d7b0117 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 19:59:02 +0000 Subject: [PATCH 091/319] Translated using Weblate (German) Currently translated at 91.2% (2100 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9d17baab3a..f0f943bb92 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2168,5 +2168,10 @@ "Automatically invite users": "Benutzer automatisch einladen", "Upgrade private room": "Privaten Raum hochstufen", "Upgrade public room": "Öffentlichen Raum hochstufen", - "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Dies wirkt sich normalerweise nur darauf aus, wie der Raum auf dem Server verarbeitet wird. Wenn du Probleme mit deinem Riot hast, melde bitte einen Bug." + "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Dies wirkt sich normalerweise nur darauf aus, wie der Raum auf dem Server verarbeitet wird. Wenn du Probleme mit deinem Riot hast, melde bitte einen Bug.", + "You'll upgrade this room from to .": "Du wirst diesen Raum von zu aktualisieren.", + "Missing session data": "Fehlende Sitzungsdaten", + "Your browser likely removed this data when running low on disk space.": "Dein Browser hat diese Daten wahrscheinlich entfernt als der Festplattenspeicher knapp wurde.", + "Integration Manager": " Integrationsverwaltung", + "Find others by phone or email": "Finde andere per Telefon oder E-Mail" } From f7b68667a0e56237eea9d37e8df1226ee6aae965 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:00:18 +0000 Subject: [PATCH 092/319] Translated using Weblate (German) Currently translated at 91.3% (2103 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index f0f943bb92..a49be9e13f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2173,5 +2173,5 @@ "Missing session data": "Fehlende Sitzungsdaten", "Your browser likely removed this data when running low on disk space.": "Dein Browser hat diese Daten wahrscheinlich entfernt als der Festplattenspeicher knapp wurde.", "Integration Manager": " Integrationsverwaltung", - "Find others by phone or email": "Finde andere per Telefon oder E-Mail" + "Find others by phone or email": "Finde Andere per Telefon oder E-Mail" } From d17e30f448ab4f095f7ee2afae053e2675669455 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:00:28 +0000 Subject: [PATCH 093/319] Translated using Weblate (German) Currently translated at 91.3% (2103 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a49be9e13f..7ac3a9495e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2173,5 +2173,8 @@ "Missing session data": "Fehlende Sitzungsdaten", "Your browser likely removed this data when running low on disk space.": "Dein Browser hat diese Daten wahrscheinlich entfernt als der Festplattenspeicher knapp wurde.", "Integration Manager": " Integrationsverwaltung", - "Find others by phone or email": "Finde Andere per Telefon oder E-Mail" + "Find others by phone or email": "Finde Andere per Telefon oder E-Mail", + "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", + "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", + "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": " Die Datei ist zu groß, um hochgeladen zu werden. Das Dateigrößenmaximum ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s." } From a262540dbf1a526e9cf1821815a8e698d18c10b1 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:01:55 +0000 Subject: [PATCH 094/319] Translated using Weblate (German) Currently translated at 91.4% (2104 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 7ac3a9495e..0549bf36a5 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2176,5 +2176,5 @@ "Find others by phone or email": "Finde Andere per Telefon oder E-Mail", "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", - "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": " Die Datei ist zu groß, um hochgeladen zu werden. Das Dateigrößenmaximum ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s." + "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s groß." } From ec5273646ae8bf2f2e65d5421b022fff79dc8ca9 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:02:05 +0000 Subject: [PATCH 095/319] Translated using Weblate (German) Currently translated at 91.4% (2104 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0549bf36a5..aa7122c124 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2176,5 +2176,6 @@ "Find others by phone or email": "Finde Andere per Telefon oder E-Mail", "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", - "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s groß." + "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s groß.", + "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Das Dateigrößenlimit ist %(limit)s." } From 5bc3cc557b6c7f632d67c34a29c6dde58d777278 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:02:26 +0000 Subject: [PATCH 096/319] Translated using Weblate (German) Currently translated at 91.4% (2105 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index aa7122c124..6bbe4b2ad1 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2177,5 +2177,5 @@ "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s groß.", - "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Das Dateigrößenlimit ist %(limit)s." + "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s." } From dfbc8e80c14c8515d87479a1c0cac7e309bc2d4d Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:02:32 +0000 Subject: [PATCH 097/319] Translated using Weblate (German) Currently translated at 91.4% (2105 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6bbe4b2ad1..4124f627e7 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2177,5 +2177,6 @@ "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s groß.", - "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s." + "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s.", + "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Einige Dateien sind zu groß, um hochgeladen zu werden. Das Dateigrößenlimit ist %(limit)s." } From b8f90ba186971ce6c7513e0f994a4fae95406134 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:02:51 +0000 Subject: [PATCH 098/319] Translated using Weblate (German) Currently translated at 91.7% (2111 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4124f627e7..3920c99273 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2178,5 +2178,7 @@ "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s, aber diese Datei ist %(sizeOfThisFile)s groß.", "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s.", - "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Einige Dateien sind zu groß, um hochgeladen zu werden. Das Dateigrößenlimit ist %(limit)s." + "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Einige Dateien sind zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s.", + "Verify other session": "Andere Sitzung verifizieren", + "Verification Request": "Verifikationsanfrage" } From f75d0dbcf13cbf71d14f2df8da1a11cbbbaefdc3 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:02:59 +0000 Subject: [PATCH 099/319] Translated using Weblate (German) Currently translated at 91.7% (2111 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3920c99273..23a7843913 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2180,5 +2180,9 @@ "These files are too large to upload. The file size limit is %(limit)s.": "Die Datei ist zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s.", "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Einige Dateien sind zu groß, um hochgeladen zu werden. Die maximale Dateigröße ist %(limit)s.", "Verify other session": "Andere Sitzung verifizieren", - "Verification Request": "Verifikationsanfrage" + "Verification Request": "Verifikationsanfrage", + "Upload %(count)s other files|other": "%(count)s andere Dateien hochladen", + "Upload %(count)s other files|one": "%(count)s andere Datei hochladen", + "A widget would like to verify your identity": "Ein Widget möchte deine Identität verifizieren", + "Remember my selection for this widget": "Erinnere meine Auswahl für dieses Widget" } From 36934b4e410b333a4004e3dfbf8e7f7f249a78ee Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:04:18 +0000 Subject: [PATCH 100/319] Translated using Weblate (German) Currently translated at 92.4% (2128 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 23a7843913..94a8a5c751 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2184,5 +2184,14 @@ "Upload %(count)s other files|other": "%(count)s andere Dateien hochladen", "Upload %(count)s other files|one": "%(count)s andere Datei hochladen", "A widget would like to verify your identity": "Ein Widget möchte deine Identität verifizieren", - "Remember my selection for this widget": "Erinnere meine Auswahl für dieses Widget" + "Remember my selection for this widget": "Speichere meine Auswahl für dieses Widget", + "Restoring keys from backup": "Schlüssel aus der Sicherung wiederherstellen", + "Fetching keys from server...": "Lade Schlüssel vom Server...", + "%(completed)s of %(total)s keys restored": "%(completed)s von %(total)s Schlüsseln wiederhergestellt", + "Keys restored": "Schlüssel wiederhergestellt", + "Successfully restored %(sessionCount)s keys": "%(sessionCount)s Schlüssel erfolgreich wiederhergestellt", + "Reload": "Neu laden", + "Take picture": "Foto machen", + "User Status": "Benutzerstatus", + "Country Dropdown": "Landauswahl" } From d8a343d675c183afdefb24e851f7c9eb3b3c02fe Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:04:56 +0000 Subject: [PATCH 101/319] Translated using Weblate (German) Currently translated at 92.4% (2128 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 94a8a5c751..2edc28f9be 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2193,5 +2193,13 @@ "Reload": "Neu laden", "Take picture": "Foto machen", "User Status": "Benutzerstatus", - "Country Dropdown": "Landauswahl" + "Country Dropdown": "Landauswahl", + "If you've forgotten your recovery key you can .": "Wenn du deinen Wiederherstellungsschlüssel vergessen hast, kannst du .", + "Recovery key mismatch": "Nicht übereinstimmende Wiederherstellungsschlüssel", + "Incorrect recovery passphrase": "Falsche Wiederherstellungspassphrase", + "If you've forgotten your recovery key you can ": "Wenn du deine Wiederherstellungsschlüssel vergessen hast, kannst du ", + "Resend edit": "Bearbeitung erneut senden", + "Resend %(unsentCount)s reaction(s)": "%(unsentCount)s Reaktion(en) erneut senden", + "Resend removal": "Entfernen erneut senden", + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Fehlender öffentlicher Captcha-Schlüssel in der Heimserver-Konfiguration. Bitte melde dies deiner Heimserver-Administration." } From 6dff315489106f52a6130681177b5318ffff161b Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:10:27 +0000 Subject: [PATCH 102/319] Translated using Weblate (German) Currently translated at 92.6% (2132 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 2edc28f9be..f21f1f3cac 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2201,5 +2201,5 @@ "Resend edit": "Bearbeitung erneut senden", "Resend %(unsentCount)s reaction(s)": "%(unsentCount)s Reaktion(en) erneut senden", "Resend removal": "Entfernen erneut senden", - "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Fehlender öffentlicher Captcha-Schlüssel in der Heimserver-Konfiguration. Bitte melde dies deiner Heimserver-Administration." + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Fehlender öffentlicher Captcha-Schlüssel in der Heimserver-Konfiguration. Bitte melde dies deinem Heimserver-Administrator." } From cf3a22e33ef23b340f6050a99e40312c9cfd08b7 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:10:53 +0000 Subject: [PATCH 103/319] Translated using Weblate (German) Currently translated at 92.6% (2132 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index f21f1f3cac..919c95224f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2201,5 +2201,9 @@ "Resend edit": "Bearbeitung erneut senden", "Resend %(unsentCount)s reaction(s)": "%(unsentCount)s Reaktion(en) erneut senden", "Resend removal": "Entfernen erneut senden", - "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Fehlender öffentlicher Captcha-Schlüssel in der Heimserver-Konfiguration. Bitte melde dies deinem Heimserver-Administrator." + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Fehlender öffentlicher Captcha-Schlüssel in der Heimserver-Konfiguration. Bitte melde dies deinem Heimserver-Administrator.", + "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Da kein Identitätsserver konfiguriert ist, kannst du keine E-Mail-Adresse hinzufügen, um dein Kennwort in Zukunft zurückzusetzen.", + "Use an email address to recover your account": "Verwende eine E-Mail-Adresse, um dein Konto wiederherzustellen", + "Enter email address (required on this homeserver)": "E-Mail-Adresse eingeben (auf diesem Heimserver erforderlich)", + "Doesn't look like a valid email address": "Sieht nicht nach einer gültigen E-Mail-Adresse aus" } From db7702c808b612681b5b0ad2c8390472ec584519 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:11:41 +0000 Subject: [PATCH 104/319] Translated using Weblate (German) Currently translated at 92.7% (2134 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 919c95224f..164aff2469 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2205,5 +2205,5 @@ "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Da kein Identitätsserver konfiguriert ist, kannst du keine E-Mail-Adresse hinzufügen, um dein Kennwort in Zukunft zurückzusetzen.", "Use an email address to recover your account": "Verwende eine E-Mail-Adresse, um dein Konto wiederherzustellen", "Enter email address (required on this homeserver)": "E-Mail-Adresse eingeben (auf diesem Heimserver erforderlich)", - "Doesn't look like a valid email address": "Sieht nicht nach einer gültigen E-Mail-Adresse aus" + "Doesn't look like a valid email address": "Das sieht nicht nach einer gültigen E-Mail-Adresse aus" } From 8a07e80ead24a0f4497cc70935c5de24c5d08303 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:12:01 +0000 Subject: [PATCH 105/319] Translated using Weblate (German) Currently translated at 92.7% (2134 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 164aff2469..577d49f2c8 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2205,5 +2205,7 @@ "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Da kein Identitätsserver konfiguriert ist, kannst du keine E-Mail-Adresse hinzufügen, um dein Kennwort in Zukunft zurückzusetzen.", "Use an email address to recover your account": "Verwende eine E-Mail-Adresse, um dein Konto wiederherzustellen", "Enter email address (required on this homeserver)": "E-Mail-Adresse eingeben (auf diesem Heimserver erforderlich)", - "Doesn't look like a valid email address": "Das sieht nicht nach einer gültigen E-Mail-Adresse aus" + "Doesn't look like a valid email address": "Das sieht nicht nach einer gültigen E-Mail-Adresse aus", + "Enter phone number (required on this homeserver)": "Telefonnummer eingeben (auf diesem Heimserver erforderlich)", + "Doesn't look like a valid phone number": "Sieht nicht nach einer gültigen Telefonnummer aus" } From 37471e451d88ffb349af5a7f98bc2dcfdcdad144 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:12:16 +0000 Subject: [PATCH 106/319] Translated using Weblate (German) Currently translated at 93.0% (2141 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 577d49f2c8..ff26afa4f3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2207,5 +2207,9 @@ "Enter email address (required on this homeserver)": "E-Mail-Adresse eingeben (auf diesem Heimserver erforderlich)", "Doesn't look like a valid email address": "Das sieht nicht nach einer gültigen E-Mail-Adresse aus", "Enter phone number (required on this homeserver)": "Telefonnummer eingeben (auf diesem Heimserver erforderlich)", - "Doesn't look like a valid phone number": "Sieht nicht nach einer gültigen Telefonnummer aus" + "Doesn't look like a valid phone number": "Das sieht nicht nach einer gültigen Telefonnummer aus", + "Sign in with SSO": "Mit Single-Sign-On anmelden", + "Welcome to %(appName)s": "Willkommen bei %(appName)s", + "Send a Direct Message": "Sende eine Direktnachricht", + "Create a Group Chat": "Erstelle einen Gruppenchat" } From 4dd26105fd9b56c84ef7d88e0234a553fce5558a Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:12:24 +0000 Subject: [PATCH 107/319] Translated using Weblate (German) Currently translated at 93.0% (2141 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ff26afa4f3..b9c4b15d7a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2211,5 +2211,8 @@ "Sign in with SSO": "Mit Single-Sign-On anmelden", "Welcome to %(appName)s": "Willkommen bei %(appName)s", "Send a Direct Message": "Sende eine Direktnachricht", - "Create a Group Chat": "Erstelle einen Gruppenchat" + "Create a Group Chat": "Erstelle einen Gruppenchat", + "Use lowercase letters, numbers, dashes and underscores only": "Verwende nur Kleinbuchstaben, Zahlen, Bindestriche und Unterstriche", + "Enter your custom identity server URL What does this mean?": "URL deines benutzerdefinierten Identitätsservers eingeben Was bedeutet das?", + "Riot failed to get the public room list.": "Riot konnte die Liste der öffentlichen Räume nicht erhalten." } From adeafc4d739560ad5df17be61e70128ed3a93161 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:14:56 +0000 Subject: [PATCH 108/319] Translated using Weblate (German) Currently translated at 93.7% (2158 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b9c4b15d7a..ead2d5403c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2214,5 +2214,8 @@ "Create a Group Chat": "Erstelle einen Gruppenchat", "Use lowercase letters, numbers, dashes and underscores only": "Verwende nur Kleinbuchstaben, Zahlen, Bindestriche und Unterstriche", "Enter your custom identity server URL What does this mean?": "URL deines benutzerdefinierten Identitätsservers eingeben Was bedeutet das?", - "Riot failed to get the public room list.": "Riot konnte die Liste der öffentlichen Räume nicht erhalten." + "Riot failed to get the public room list.": "Riot konnte die Liste der öffentlichen Räume nicht laden.", + "Verify this login": "Diese Anmeldung verifizieren", + "Syncing...": "Synchronisiere...", + "Signing In...": "Melde an..." } From cfc1e345f1ba9437fc735a7bbe2fe8301fefe89e Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:15:04 +0000 Subject: [PATCH 109/319] Translated using Weblate (German) Currently translated at 93.7% (2158 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ead2d5403c..c3d65f0b29 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2217,5 +2217,19 @@ "Riot failed to get the public room list.": "Riot konnte die Liste der öffentlichen Räume nicht laden.", "Verify this login": "Diese Anmeldung verifizieren", "Syncing...": "Synchronisiere...", - "Signing In...": "Melde an..." + "Signing In...": "Melde an...", + "The homeserver may be unavailable or overloaded.": "Der Heimserver ist möglicherweise nicht verfügbar oder überlastet.", + "Jump to first unread room.": "Zum ersten ungelesenen Raum springen.", + "Jump to first invite.": "Zur ersten Einladung springen.", + "You have %(count)s unread notifications in a prior version of this room.|other": "Du hast %(count)s ungelesene Benachrichtigungen in einer früheren Version dieses Raums.", + " (1/%(totalCount)s)": " (1/%(totalCount)s)", + "Session verified": "Sitzung verifiziert", + "Failed to get autodiscovery configuration from server": "Abrufen der Autodiscovery-Konfiguration vom Server fehlgeschlagen", + "Invalid base_url for m.homeserver": "Ungültige base_url für m.homeserver", + "Homeserver URL does not appear to be a valid Matrix homeserver": "Die Heimserver-URL scheint kein gültiger Matrix-Heimserver zu sein", + "Invalid base_url for m.identity_server": "Ungültige base_url für m.identity_server", + "Identity server URL does not appear to be a valid identity server": "Die Identitätsserver-URL scheint kein gültiger Identitätsserver zu sein", + "This account has been deactivated.": "Dieses Konto wurde deaktiviert.", + "Continue with previous account": "Mit vorherigen Konto fortfahren", + "Log in to your new account.": "Bei deinem neuen Konto anmelden." } From 1985935d55a3226d45a381c074d59dd9ab947809 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:18:52 +0000 Subject: [PATCH 110/319] Translated using Weblate (German) Currently translated at 93.7% (2159 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c3d65f0b29..c71db08aa4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2231,5 +2231,5 @@ "Identity server URL does not appear to be a valid identity server": "Die Identitätsserver-URL scheint kein gültiger Identitätsserver zu sein", "This account has been deactivated.": "Dieses Konto wurde deaktiviert.", "Continue with previous account": "Mit vorherigen Konto fortfahren", - "Log in to your new account.": "Bei deinem neuen Konto anmelden." + "Log in to your new account.": "Mit deinem neuen Konto anmelden." } From 19b0e60f7d95d31c93a5b9f52cf0cbf76ed9f237 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:19:07 +0000 Subject: [PATCH 111/319] Translated using Weblate (German) Currently translated at 93.7% (2159 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c71db08aa4..85d3464728 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2231,5 +2231,6 @@ "Identity server URL does not appear to be a valid identity server": "Die Identitätsserver-URL scheint kein gültiger Identitätsserver zu sein", "This account has been deactivated.": "Dieses Konto wurde deaktiviert.", "Continue with previous account": "Mit vorherigen Konto fortfahren", - "Log in to your new account.": "Mit deinem neuen Konto anmelden." + "Log in to your new account.": "Mit deinem neuen Konto anmelden.", + "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich bei deinem neuen Konto anmelden." } From 4282a396b0f095176b9edb586ae5905e4eb6e2da Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:19:20 +0000 Subject: [PATCH 112/319] Translated using Weblate (German) Currently translated at 93.8% (2160 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 85d3464728..ee30d62e30 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2232,5 +2232,5 @@ "This account has been deactivated.": "Dieses Konto wurde deaktiviert.", "Continue with previous account": "Mit vorherigen Konto fortfahren", "Log in to your new account.": "Mit deinem neuen Konto anmelden.", - "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich bei deinem neuen Konto anmelden." + "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich mit deinem neuen Konto anmelden." } From 93ece4b76a3c3fa5c7dcfb054d4205d73a88d26d Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:19:47 +0000 Subject: [PATCH 113/319] Translated using Weblate (German) Currently translated at 93.8% (2160 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ee30d62e30..19fe9d8b57 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2232,5 +2232,6 @@ "This account has been deactivated.": "Dieses Konto wurde deaktiviert.", "Continue with previous account": "Mit vorherigen Konto fortfahren", "Log in to your new account.": "Mit deinem neuen Konto anmelden.", - "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich mit deinem neuen Konto anmelden." + "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich mit deinem neuen Konto anmelden.", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Nutzer!nnen sehen sie als vertrauenswürdig an." } From 0ebc87d391c76c4d124aac01015bff4e7e7808f2 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:20:01 +0000 Subject: [PATCH 114/319] Translated using Weblate (German) Currently translated at 93.8% (2161 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 19fe9d8b57..98bb643ad6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2233,5 +2233,5 @@ "Continue with previous account": "Mit vorherigen Konto fortfahren", "Log in to your new account.": "Mit deinem neuen Konto anmelden.", "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich mit deinem neuen Konto anmelden.", - "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Nutzer!nnen sehen sie als vertrauenswürdig an." + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Benutzer sehen sie als vertrauenswürdig an." } From 4f5a335f6230db92f54ee14dab2d3263a0e74acf Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 20:20:08 +0000 Subject: [PATCH 115/319] Translated using Weblate (German) Currently translated at 93.8% (2161 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 98bb643ad6..3a7a63e043 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2233,5 +2233,6 @@ "Continue with previous account": "Mit vorherigen Konto fortfahren", "Log in to your new account.": "Mit deinem neuen Konto anmelden.", "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich mit deinem neuen Konto anmelden.", - "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Benutzer sehen sie als vertrauenswürdig an." + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Benutzer sehen sie als vertrauenswürdig an.", + "Your new session is now verified. Other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Andere Nutzer!nnen sehen sie als vertrauenswürdig an." } From 2f6275e0b6f9ba0aebea353b7d34d26b2807a46c Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 20:20:19 +0000 Subject: [PATCH 116/319] Translated using Weblate (German) Currently translated at 94.6% (2178 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3a7a63e043..109f2b58d2 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2234,5 +2234,14 @@ "Log in to your new account.": "Mit deinem neuen Konto anmelden.", "You can now close this window or log in to your new account.": "Du kannst dieses Fenster jetzt schließen oder dich mit deinem neuen Konto anmelden.", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Benutzer sehen sie als vertrauenswürdig an.", - "Your new session is now verified. Other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Andere Nutzer!nnen sehen sie als vertrauenswürdig an." + "Your new session is now verified. Other users will see it as trusted.": "Deine neue Sitzung ist nun verifiziert. Andere Benutzer sehen sie als vertrauenswürdig an.", + "well formed": "wohlgeformt", + "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Wenn du nicht verwenden willst um andere Benutzer zu finden und gefunden zu werden, trage unten einen anderen Identitätsserver ein.", + "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Wenn du einen sicherheitsrelevaten Fehler melden möchtest, lies bitte die Matrix.org Security Disclosure Policy.", + "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "Beim Ändern der Anforderungen für Benutzerrechte ist ein Fehler aufgetreten. Stelle sicher dass du die nötigen Berechtigungen besitzt und versuche es erneut.", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Beim Ändern der Benutzerrechte ist ein Fehler aufgetreten. Stelle sicher dass du die nötigen Berechtigungen besitzt und versuche es erneut.", + "Unable to share email address": "E-Mail Adresse konnte nicht geteilt werden", + "Please enter verification code sent via text.": "Gib den Verifikationscode ein, den du empfangen hast.", + "Almost there! Is your other session showing the same shield?": "Fast geschafft! Zeigt deine andere Sitzung die gleichen Zeichen?", + "Almost there! Is %(displayName)s showing the same shield?": "Fast geschafft! Werden bei %(displayName)s die gleichen Zeichen angezeigt?" } From 7f3d8194fdcba005ec7427ec57a898cb7c0befba Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:19:53 +0000 Subject: [PATCH 117/319] Translated using Weblate (German) Currently translated at 94.6% (2178 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 109f2b58d2..e64d6183bd 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -648,7 +648,7 @@ "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", - "%(duration)sd": "%(duration)sd", + "%(duration)sd": "%(duration)sT", "Online for %(duration)s": "Online seit %(duration)s", "Idle for %(duration)s": "Untätig seit %(duration)s", "Offline for %(duration)s": "Offline seit %(duration)s", @@ -2243,5 +2243,10 @@ "Unable to share email address": "E-Mail Adresse konnte nicht geteilt werden", "Please enter verification code sent via text.": "Gib den Verifikationscode ein, den du empfangen hast.", "Almost there! Is your other session showing the same shield?": "Fast geschafft! Zeigt deine andere Sitzung die gleichen Zeichen?", - "Almost there! Is %(displayName)s showing the same shield?": "Fast geschafft! Werden bei %(displayName)s die gleichen Zeichen angezeigt?" + "Almost there! Is %(displayName)s showing the same shield?": "Fast geschafft! Werden bei %(displayName)s die gleichen Zeichen angezeigt?", + "Click the link in the email you received to verify and then click continue again.": "Klicke auf den Link in der Bestätigungs-E-Mail, und dann auf Weiter.", + "Unable to revoke sharing for phone number": "Widerrufen der geteilten Telefonnummer nicht möglich", + "Unable to share phone number": "Teilen der Telefonnummer nicht möglich", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s haben %(count)s mal nichts geändert", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jede/r, mit dem du dich verifiziert hast, sieht Sicherheitswarnungen. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst." } From 4881b9c7718efa641ef3d8e0b1674da016b22420 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:26:00 +0000 Subject: [PATCH 118/319] Translated using Weblate (German) Currently translated at 94.7% (2180 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index e64d6183bd..b7cd330764 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2248,5 +2248,5 @@ "Unable to revoke sharing for phone number": "Widerrufen der geteilten Telefonnummer nicht möglich", "Unable to share phone number": "Teilen der Telefonnummer nicht möglich", "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s haben %(count)s mal nichts geändert", - "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jede/r, mit dem du dich verifiziert hast, sieht Sicherheitswarnungen. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst." + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jeder, mit dem du dich verifiziert hast, bekommt Sicherheitswarnungen angezeigt. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst." } From 4cf19f23b0d6bbc51af7c4d32f7df6866358d7e5 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:26:19 +0000 Subject: [PATCH 119/319] Translated using Weblate (German) Currently translated at 94.7% (2180 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b7cd330764..36e9d3ff32 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2248,5 +2248,7 @@ "Unable to revoke sharing for phone number": "Widerrufen der geteilten Telefonnummer nicht möglich", "Unable to share phone number": "Teilen der Telefonnummer nicht möglich", "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s haben %(count)s mal nichts geändert", - "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jeder, mit dem du dich verifiziert hast, bekommt Sicherheitswarnungen angezeigt. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst." + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jeder, mit dem du dich verifiziert hast, bekommt Sicherheitswarnungen angezeigt. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst.", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Das Löschen aller Daten aus dieser Sitzung ist dauerhaft. Verschlüsselte Nachrichten gehen verloren, sofern deine Schlüssel nicht gesichert wurden.", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Zum Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:" } From c601224966db5e0f3b0b6c66706a1fdd47957551 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:26:52 +0000 Subject: [PATCH 120/319] Translated using Weblate (German) Currently translated at 94.7% (2182 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 36e9d3ff32..d85d9b2e2e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2250,5 +2250,6 @@ "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s haben %(count)s mal nichts geändert", "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jeder, mit dem du dich verifiziert hast, bekommt Sicherheitswarnungen angezeigt. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst.", "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Das Löschen aller Daten aus dieser Sitzung ist dauerhaft. Verschlüsselte Nachrichten gehen verloren, sofern deine Schlüssel nicht gesichert wurden.", - "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Zum Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:" + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Um zu Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert." } From 2f01ea095caf15d7994ba9faea3391350476df2c Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:28:32 +0000 Subject: [PATCH 121/319] Translated using Weblate (German) Currently translated at 94.7% (2182 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d85d9b2e2e..712f2ed69d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2251,5 +2251,6 @@ "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Das Löschen von Cross-Signing-Schlüsseln ist dauerhaft. Jeder, mit dem du dich verifiziert hast, bekommt Sicherheitswarnungen angezeigt. Du möchtest dies mit ziemlicher Sicherheit nicht tun, es sei denn, du hast jedes Gerät verloren, von dem aus du ein Cross-Signing durchführen kannst.", "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Das Löschen aller Daten aus dieser Sitzung ist dauerhaft. Verschlüsselte Nachrichten gehen verloren, sofern deine Schlüssel nicht gesichert wurden.", "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Um zu Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:", - "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert." + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifizieren dieses Geräts, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet." } From 857d73193bd197c8bed5029492b158bd0c9fc123 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:28:53 +0000 Subject: [PATCH 122/319] Translated using Weblate (German) Currently translated at 94.8% (2183 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 712f2ed69d..884a1117a0 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2252,5 +2252,5 @@ "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Das Löschen aller Daten aus dieser Sitzung ist dauerhaft. Verschlüsselte Nachrichten gehen verloren, sofern deine Schlüssel nicht gesichert wurden.", "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Um zu Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", - "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifizieren dieses Geräts, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet." + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet." } From 7f11db782574f0639929980c89df797432018c36 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:29:12 +0000 Subject: [PATCH 123/319] Translated using Weblate (German) Currently translated at 94.8% (2183 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 884a1117a0..6ab28091f3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2252,5 +2252,6 @@ "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Das Löschen aller Daten aus dieser Sitzung ist dauerhaft. Verschlüsselte Nachrichten gehen verloren, sofern deine Schlüssel nicht gesichert wurden.", "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Um zu Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", - "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet." + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifizieren dieses Geräts, wird es als vertrauenswürdig markieren, und Nutzer!nnen, die sich bei dir verifiziert haben, vertrauen diesem Gerät." } From e6ac668042e927ed4ee6bdb24a8a00a66712dd99 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:30:22 +0000 Subject: [PATCH 124/319] Translated using Weblate (German) Currently translated at 94.8% (2184 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6ab28091f3..350e479e4a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2253,5 +2253,5 @@ "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Um zu Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", - "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifizieren dieses Geräts, wird es als vertrauenswürdig markieren, und Nutzer!nnen, die sich bei dir verifiziert haben, vertrauen diesem Gerät." + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen." } From 0b74e6bd4edacf9be6bf2151da27d56ac94555e7 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:30:31 +0000 Subject: [PATCH 125/319] Translated using Weblate (German) Currently translated at 94.8% (2184 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 350e479e4a..e5aa015fe9 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2253,5 +2253,6 @@ "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Um zu Überprüfen, ob dieser Sitzung vertraut werden kann, vergewissere dich, ob der in den Benutzereinstellungen auf diesem Gerät angezeigte Schlüssel mit dem folgenden übereinstimmt:", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", - "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen." + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", + "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, einen Integration Manager zu verwenden, um dies zu tun. Bitte kontaktiere die Administration." } From 418386606498cad13bd9aea6b2f93732f885862a Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:31:31 +0000 Subject: [PATCH 126/319] Translated using Weblate (German) Currently translated at 94.9% (2185 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index e5aa015fe9..b9c9e19708 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2254,5 +2254,5 @@ "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", - "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, einen Integration Manager zu verwenden, um dies zu tun. Bitte kontaktiere die Administration." + "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator." } From 44d59312ab964ec017a25a587afc273e4bd1c6b5 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:31:54 +0000 Subject: [PATCH 127/319] Translated using Weblate (German) Currently translated at 94.9% (2185 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b9c9e19708..fbfd38a73d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2254,5 +2254,6 @@ "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", - "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator." + "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", + "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine DM nicht erstellen. Bitte überprüfe die/den Nutzer!n, die du einladen möchtest, und versuche es erneut." } From b415f8b6c4274508b7df64c70b2343b28a09c560 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:32:31 +0000 Subject: [PATCH 128/319] Translated using Weblate (German) Currently translated at 94.9% (2186 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index fbfd38a73d..839631de7a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2255,5 +2255,5 @@ "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", - "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine DM nicht erstellen. Bitte überprüfe die/den Nutzer!n, die du einladen möchtest, und versuche es erneut." + "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine Direktnachricht nicht erstellen. Bitte überprüfe den Benutzer, den du einladen möchtest, und versuche es erneut." } From c89e8666f624860923f550baf5d14c6ac9ab4c49 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:32:40 +0000 Subject: [PATCH 129/319] Translated using Weblate (German) Currently translated at 94.9% (2186 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 839631de7a..3615aa28a7 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2255,5 +2255,6 @@ "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", - "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine Direktnachricht nicht erstellen. Bitte überprüfe den Benutzer, den du einladen möchtest, und versuche es erneut." + "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine Direktnachricht nicht erstellen. Bitte überprüfe den Benutzer, den du einladen möchtest, und versuche es erneut.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "Wir konnten diese Nutzer!nnen nicht einladen. Bitte überprüfe diese und versuche es erneut." } From 98e89f0468e206d5632511f7c2fa24c29f68e765 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:32:58 +0000 Subject: [PATCH 130/319] Translated using Weblate (German) Currently translated at 95.7% (2203 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3615aa28a7..90ca70983f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2256,5 +2256,16 @@ "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein Riot erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine Direktnachricht nicht erstellen. Bitte überprüfe den Benutzer, den du einladen möchtest, und versuche es erneut.", - "We couldn't invite those users. Please check the users you want to invite and try again.": "Wir konnten diese Nutzer!nnen nicht einladen. Bitte überprüfe diese und versuche es erneut." + "We couldn't invite those users. Please check the users you want to invite and try again.": "Wir konnten diese Benutzer nicht einladen. Bitte überprüfe sie und versuche es erneut.", + "Start a conversation with someone using their name, username (like ) or email address.": "Starte eine Unterhaltung mit jemandem indem du seinen Namen, Benutzernamen (z.B. ) oder E-Mail-Adresse eingibst.", + "Invite someone using their name, username (like ), email address or share this room.": "Lade jemanden mit seinem Namen, Benutzernamen (z.B. ) oder E-Mail-Adresse ein oder teile diesen Raum.", + "Riot encountered an error during upload of:": "Es trat ein Fehler auf beim Hochladen von:", + "Upload completed": "Hochladen abgeschlossen", + "Cancelled signature upload": "Hochladen der Signatur abgebrochen", + "Unable to upload": "Hochladen nicht möglich", + "Signature upload success": "Signatur erfolgreich hochgeladen", + "Signature upload failed": "Hochladen der Signatur fehlgeschlagen", + "Confirm by comparing the following with the User Settings in your other session:": "Bestätige indem du das folgende mit deinen Benutzereinstellungen in deiner anderen Sitzung vergleichst:", + "Confirm this user's session by comparing the following with their User Settings:": "Bestätige die Sitzung dieses Benutzers indem du das folgende mit seinen Benutzereinstellungen vergleichst:", + "If they don't match, the security of your communication may be compromised.": "Wenn sie nicht übereinstimmen kann die Sicherheit eurer Kommunikation kompromittiert sein." } From be48f4d02d8ecd81a41f22704a21480ef2ce93a7 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:40:28 +0000 Subject: [PATCH 131/319] Translated using Weblate (German) Currently translated at 95.7% (2203 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 90ca70983f..ead1fa9ca6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2267,5 +2267,10 @@ "Signature upload failed": "Hochladen der Signatur fehlgeschlagen", "Confirm by comparing the following with the User Settings in your other session:": "Bestätige indem du das folgende mit deinen Benutzereinstellungen in deiner anderen Sitzung vergleichst:", "Confirm this user's session by comparing the following with their User Settings:": "Bestätige die Sitzung dieses Benutzers indem du das folgende mit seinen Benutzereinstellungen vergleichst:", - "If they don't match, the security of your communication may be compromised.": "Wenn sie nicht übereinstimmen kann die Sicherheit eurer Kommunikation kompromittiert sein." + "If they don't match, the security of your communication may be compromised.": "Wenn sie nicht übereinstimmen kann die Sicherheit eurer Kommunikation kompromittiert sein.", + "Your homeserver doesn't seem to support this feature.": "Dein Heimserver scheint diese Funktion nicht zu unterstützen.", + "Message edits": "Nachrichtenänderungen", + "Your account is not secure": "Dein Konto ist nicht sicher", + "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", + "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualizieren ist eine fortgeschrittene Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist." } From 8165e8a4729a689969cf8efd563d0929bcbd1b80 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:41:32 +0000 Subject: [PATCH 132/319] Translated using Weblate (German) Currently translated at 95.7% (2204 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ead1fa9ca6..f838e9a370 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2272,5 +2272,5 @@ "Message edits": "Nachrichtenänderungen", "Your account is not secure": "Dein Konto ist nicht sicher", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", - "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualizieren ist eine fortgeschrittene Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist." + "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist." } From 2f0bbc25ff3de8b803f87cb2938a509f4f772074 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:41:40 +0000 Subject: [PATCH 133/319] Translated using Weblate (German) Currently translated at 95.7% (2204 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index f838e9a370..04b78e85f9 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2272,5 +2272,6 @@ "Message edits": "Nachrichtenänderungen", "Your account is not secure": "Dein Konto ist nicht sicher", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", - "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist." + "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", + "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich Nachrichtenschlüssel, fehlen. Melde dich ab und wieder an, um dies zu beheben, und stelle die Schlüssel aus der Sicherung wieder her." } From 67ec31a7a2e86948b87d8fdd51dcf9a53193348f Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:42:59 +0000 Subject: [PATCH 134/319] Translated using Weblate (German) Currently translated at 95.7% (2205 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 04b78e85f9..75a0df5cd6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2273,5 +2273,5 @@ "Your account is not secure": "Dein Konto ist nicht sicher", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", - "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich Nachrichtenschlüssel, fehlen. Melde dich ab und wieder an, um dies zu beheben, und stelle die Schlüssel aus der Sicherung wieder her." + "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich der Verschlüsselungsschlüssel, fehlen. Melde dich ab, wieder an und stelle die Schlüssel aus der Sicherung wieder her um dies zu beheben." } From 6813b6f71df3104425ee95f5c35f8c20957e4618 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:43:08 +0000 Subject: [PATCH 135/319] Translated using Weblate (German) Currently translated at 95.7% (2205 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 75a0df5cd6..783e84d902 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2273,5 +2273,6 @@ "Your account is not secure": "Dein Konto ist nicht sicher", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", - "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich der Verschlüsselungsschlüssel, fehlen. Melde dich ab, wieder an und stelle die Schlüssel aus der Sicherung wieder her um dies zu beheben." + "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich der Verschlüsselungsschlüssel, fehlen. Melde dich ab, wieder an und stelle die Schlüssel aus der Sicherung wieder her um dies zu beheben.", + "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Ein Widget unter %(widgetUrl)s findbar möchte deine Identität überprüfen. Wenn du dies zulässt, kann das Widget deine Nutzer-ID überprüfen, jedoch keine Aktionen wie du ausführen." } From a9ef4762cd48a83a83bff2409d3e92be6c21607c Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:43:30 +0000 Subject: [PATCH 136/319] Translated using Weblate (German) Currently translated at 95.8% (2207 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 783e84d902..593e905b33 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2274,5 +2274,6 @@ "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich der Verschlüsselungsschlüssel, fehlen. Melde dich ab, wieder an und stelle die Schlüssel aus der Sicherung wieder her um dies zu beheben.", - "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Ein Widget unter %(widgetUrl)s findbar möchte deine Identität überprüfen. Wenn du dies zulässt, kann das Widget deine Nutzer-ID überprüfen, jedoch keine Aktionen wie du ausführen." + "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Ein Widget unter %(widgetUrl)s möchte deine Identität überprüfen. Wenn du dies zulässt, kann das Widget deine Nutzer-ID überprüfen, jedoch keine Aktionen in deinem Namen ausführen.", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Der sichere Speicher konnte nicht geladen werden. Bitte stelle sicher dass du die richtige Wiederherstellungspassphrase eingegeben hast." } From a810708f7012ab3deb94ffb742dd0cefbf521e73 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:44:43 +0000 Subject: [PATCH 137/319] Translated using Weblate (German) Currently translated at 95.8% (2207 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 593e905b33..30b523b33e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2275,5 +2275,6 @@ "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Einen Raum zu aktualisieren ist eine komplexe Aktion und wird normalerweise empfohlen, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich der Verschlüsselungsschlüssel, fehlen. Melde dich ab, wieder an und stelle die Schlüssel aus der Sicherung wieder her um dies zu beheben.", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Ein Widget unter %(widgetUrl)s möchte deine Identität überprüfen. Wenn du dies zulässt, kann das Widget deine Nutzer-ID überprüfen, jedoch keine Aktionen in deinem Namen ausführen.", - "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Der sichere Speicher konnte nicht geladen werden. Bitte stelle sicher dass du die richtige Wiederherstellungspassphrase eingegeben hast." + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Der sichere Speicher konnte nicht geladen werden. Bitte stelle sicher dass du die richtige Wiederherstellungspassphrase eingegeben hast.", + "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Zugriff auf geheimen Speicher nicht möglich. Bitte überprüfe, ob du den richtigen Wiederherstellungsschlüssel eingegeben hast." } From a0b765d56845f532c6fff9e10cb336646a35414f Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:45:03 +0000 Subject: [PATCH 138/319] Translated using Weblate (German) Currently translated at 96.0% (2211 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 30b523b33e..5ef652761d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2276,5 +2276,8 @@ "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Einige Sitzungsdaten, einschließlich der Verschlüsselungsschlüssel, fehlen. Melde dich ab, wieder an und stelle die Schlüssel aus der Sicherung wieder her um dies zu beheben.", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Ein Widget unter %(widgetUrl)s möchte deine Identität überprüfen. Wenn du dies zulässt, kann das Widget deine Nutzer-ID überprüfen, jedoch keine Aktionen in deinem Namen ausführen.", "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Der sichere Speicher konnte nicht geladen werden. Bitte stelle sicher dass du die richtige Wiederherstellungspassphrase eingegeben hast.", - "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Zugriff auf geheimen Speicher nicht möglich. Bitte überprüfe, ob du den richtigen Wiederherstellungsschlüssel eingegeben hast." + "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Zugriff auf sicheren Speicher nicht möglich. Bitte überprüfe, ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Die Sicherung konnte nicht mit dem angegebenen Wiederherstellungsschlüssel entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Die Sicherung konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungspassphrase eingegeben hast.", + "Nice, strong password!": "Super, ein starkes Passwort!" } From c9d47eb2a80cc327cea13a211a78bee1fe622aef Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:48:24 +0000 Subject: [PATCH 139/319] Translated using Weblate (German) Currently translated at 96.0% (2211 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 5ef652761d..986200e41c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2279,5 +2279,6 @@ "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Zugriff auf sicheren Speicher nicht möglich. Bitte überprüfe, ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Die Sicherung konnte nicht mit dem angegebenen Wiederherstellungsschlüssel entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Die Sicherung konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungspassphrase eingegeben hast.", - "Nice, strong password!": "Super, ein starkes Passwort!" + "Nice, strong password!": "Super, ein starkes Passwort!", + "Other users can invite you to rooms using your contact details": "Andere Nutzer!nnen können dich mit deinen Kontaktdaten in Räume einladen" } From f90a72f64aacd11f03a44119a56b819717864973 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:48:33 +0000 Subject: [PATCH 140/319] Translated using Weblate (German) Currently translated at 96.0% (2212 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 986200e41c..1a7f3b1270 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2280,5 +2280,5 @@ "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Die Sicherung konnte nicht mit dem angegebenen Wiederherstellungsschlüssel entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Die Sicherung konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungspassphrase eingegeben hast.", "Nice, strong password!": "Super, ein starkes Passwort!", - "Other users can invite you to rooms using your contact details": "Andere Nutzer!nnen können dich mit deinen Kontaktdaten in Räume einladen" + "Other users can invite you to rooms using your contact details": "Andere Benutzer können dich mit deinen Kontaktdaten in Räume einladen" } From aea17818e93abefcbeec382c1f197cd63f239b07 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:48:55 +0000 Subject: [PATCH 141/319] Translated using Weblate (German) Currently translated at 96.0% (2212 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1a7f3b1270..0a4de52586 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2280,5 +2280,6 @@ "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Die Sicherung konnte nicht mit dem angegebenen Wiederherstellungsschlüssel entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Die Sicherung konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungspassphrase eingegeben hast.", "Nice, strong password!": "Super, ein starkes Passwort!", - "Other users can invite you to rooms using your contact details": "Andere Benutzer können dich mit deinen Kontaktdaten in Räume einladen" + "Other users can invite you to rooms using your contact details": "Andere Benutzer können dich mit deinen Kontaktdaten in Räume einladen", + "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Lege eine E-Mail für die Kontowiederherstellung fest. Verwende E-Mail oder Telefon, um optional von vorhandenen Kontakten gefunden zu werden." } From 902424a4d4b86b74e36b5ee96eebbb2c5f741103 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:49:30 +0000 Subject: [PATCH 142/319] Translated using Weblate (German) Currently translated at 96.3% (2217 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0a4de52586..8620b31a8f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2281,5 +2281,7 @@ "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Die Sicherung konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfe ob du den richtigen Wiederherstellungspassphrase eingegeben hast.", "Nice, strong password!": "Super, ein starkes Passwort!", "Other users can invite you to rooms using your contact details": "Andere Benutzer können dich mit deinen Kontaktdaten in Räume einladen", - "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Lege eine E-Mail für die Kontowiederherstellung fest. Verwende E-Mail oder Telefon, um optional von vorhandenen Kontakten gefunden zu werden." + "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Lege eine E-Mail für die Kontowiederherstellung fest. Verwende optional E-Mail oder Telefon, um von Anderen gefunden zu werden.", + "Explore Public Rooms": "Erkunde öffentliche Räume", + "If you've joined lots of rooms, this might take a while": "Du bist einer Menge Räumen beigetreten, das kann eine Weile dauern" } From 5265d873198c228d64e455bfcfa69dd11a78f08e Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:50:07 +0000 Subject: [PATCH 143/319] Translated using Weblate (German) Currently translated at 96.3% (2217 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8620b31a8f..c9c2d14548 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2283,5 +2283,8 @@ "Other users can invite you to rooms using your contact details": "Andere Benutzer können dich mit deinen Kontaktdaten in Räume einladen", "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Lege eine E-Mail für die Kontowiederherstellung fest. Verwende optional E-Mail oder Telefon, um von Anderen gefunden zu werden.", "Explore Public Rooms": "Erkunde öffentliche Räume", - "If you've joined lots of rooms, this might take a while": "Du bist einer Menge Räumen beigetreten, das kann eine Weile dauern" + "If you've joined lots of rooms, this might take a while": "Du bist einer Menge Räumen beigetreten, das kann eine Weile dauern", + "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot konnte die Protokollliste nicht vom Heimserver abrufen. Der Heimserver ist möglicherweise zu alt, um Netzwerke von Drittanbietern zu unterstützen.", + "No identity server is configured: add one in server settings to reset your password.": "Kein Identitätsserver konfiguriert: Füge einen in den Servereinstellungen hinzu, um dein Kennwort zurückzusetzen.", + "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Dein neues Konto (%(newAccountId)s) ist registriert, aber du bist bereits in ein anderes Konto (%(loggedInUserId)s) angemeldet." } From 6472ddfe8d698d166eafc6b76d62e8dc37e672fc Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:51:25 +0000 Subject: [PATCH 144/319] Translated using Weblate (German) Currently translated at 96.4% (2220 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c9c2d14548..81e2d63527 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2286,5 +2286,7 @@ "If you've joined lots of rooms, this might take a while": "Du bist einer Menge Räumen beigetreten, das kann eine Weile dauern", "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot konnte die Protokollliste nicht vom Heimserver abrufen. Der Heimserver ist möglicherweise zu alt, um Netzwerke von Drittanbietern zu unterstützen.", "No identity server is configured: add one in server settings to reset your password.": "Kein Identitätsserver konfiguriert: Füge einen in den Servereinstellungen hinzu, um dein Kennwort zurückzusetzen.", - "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Dein neues Konto (%(newAccountId)s) ist registriert, aber du bist bereits in ein anderes Konto (%(loggedInUserId)s) angemeldet." + "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Dein neues Konto (%(newAccountId)s) ist registriert, aber du hast dich bereits in mit einem anderen Konto (%(loggedInUserId)s) angemeldet.", + "This requires the latest Riot on your other devices:": "Dies benötigt die neuste Version von Riot auf deinen anderen Geräten:", + "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel" } From ea50116c9f17dfadd247489c9de260bdd6d5d5fe Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:52:42 +0000 Subject: [PATCH 145/319] Translated using Weblate (German) Currently translated at 96.4% (2220 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 81e2d63527..9afcd8debf 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2288,5 +2288,6 @@ "No identity server is configured: add one in server settings to reset your password.": "Kein Identitätsserver konfiguriert: Füge einen in den Servereinstellungen hinzu, um dein Kennwort zurückzusetzen.", "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Dein neues Konto (%(newAccountId)s) ist registriert, aber du hast dich bereits in mit einem anderen Konto (%(loggedInUserId)s) angemeldet.", "This requires the latest Riot on your other devices:": "Dies benötigt die neuste Version von Riot auf deinen anderen Geräten:", - "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel" + "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel", + "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Heimserver-Problems fehlgeschlagen" } From f96f1bb3ebccde0d03e559464f8d00245e9ec54d Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:52:57 +0000 Subject: [PATCH 146/319] Translated using Weblate (German) Currently translated at 96.5% (2222 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9afcd8debf..925b39e362 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2289,5 +2289,5 @@ "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Dein neues Konto (%(newAccountId)s) ist registriert, aber du hast dich bereits in mit einem anderen Konto (%(loggedInUserId)s) angemeldet.", "This requires the latest Riot on your other devices:": "Dies benötigt die neuste Version von Riot auf deinen anderen Geräten:", "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel", - "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Heimserver-Problems fehlgeschlagen" + "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Problems im Heimserver fehlgeschlagen" } From 14a68b63e8b68bcb4e99dedbb054fe453c6db117 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:53:01 +0000 Subject: [PATCH 147/319] Translated using Weblate (German) Currently translated at 96.5% (2222 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 925b39e362..8e9a3b3d8e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2289,5 +2289,7 @@ "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Dein neues Konto (%(newAccountId)s) ist registriert, aber du hast dich bereits in mit einem anderen Konto (%(loggedInUserId)s) angemeldet.", "This requires the latest Riot on your other devices:": "Dies benötigt die neuste Version von Riot auf deinen anderen Geräten:", "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel", - "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Problems im Heimserver fehlgeschlagen" + "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Problems im Heimserver fehlgeschlagen", + "Failed to re-authenticate": "Erneute Authentifizierung fehlgeschlagen", + "Command Autocomplete": "Auto-Vervollständigung anordnen" } From a637854fee748f89f6cf21f735d65ab2ccd7e3a8 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:53:20 +0000 Subject: [PATCH 148/319] Translated using Weblate (German) Currently translated at 96.6% (2224 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8e9a3b3d8e..36cc523161 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2291,5 +2291,5 @@ "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel", "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Problems im Heimserver fehlgeschlagen", "Failed to re-authenticate": "Erneute Authentifizierung fehlgeschlagen", - "Command Autocomplete": "Auto-Vervollständigung anordnen" + "Command Autocomplete": "Auto-Vervollständigung aktivieren" } From 8e94839a2c82fcd9b4a00265cb871d28e28bc353 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:53:27 +0000 Subject: [PATCH 149/319] Translated using Weblate (German) Currently translated at 96.6% (2224 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 36cc523161..9419f1d61a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2291,5 +2291,7 @@ "Use Recovery Passphrase or Key": "Benutze deine Wiederherstellungspassphrase oder den Wiederherstellungsschlüssel", "Failed to re-authenticate due to a homeserver problem": "Erneute Authentifizierung aufgrund eines Problems im Heimserver fehlgeschlagen", "Failed to re-authenticate": "Erneute Authentifizierung fehlgeschlagen", - "Command Autocomplete": "Auto-Vervollständigung aktivieren" + "Command Autocomplete": "Auto-Vervollständigung aktivieren", + "Community Autocomplete": "Community-Auto-Vervollständigung", + "DuckDuckGo Results": "DuckDuckGo Resultate" } From 15d1b7ac2265aae848f5f771557bb4745ee0cab2 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:53:39 +0000 Subject: [PATCH 150/319] Translated using Weblate (German) Currently translated at 97.0% (2235 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9419f1d61a..4a77feba38 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2293,5 +2293,8 @@ "Failed to re-authenticate": "Erneute Authentifizierung fehlgeschlagen", "Command Autocomplete": "Auto-Vervollständigung aktivieren", "Community Autocomplete": "Community-Auto-Vervollständigung", - "DuckDuckGo Results": "DuckDuckGo Resultate" + "DuckDuckGo Results": "DuckDuckGo Ergebnisse", + "Great! This recovery passphrase looks strong enough.": "Super! Diese Wiederherstellungspassphrase sieht stark genug aus.", + "Enter a recovery passphrase": "Gib eine Wiederherstellungspassphrase ein", + "Back up encrypted message keys": "Sichere die Verschlüsselungsschlüssel" } From bd36b0892c33806ac4d5ce2b76f620c17a5d3ed5 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:53:44 +0000 Subject: [PATCH 151/319] Translated using Weblate (German) Currently translated at 97.0% (2235 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4a77feba38..7952115d74 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2296,5 +2296,13 @@ "DuckDuckGo Results": "DuckDuckGo Ergebnisse", "Great! This recovery passphrase looks strong enough.": "Super! Diese Wiederherstellungspassphrase sieht stark genug aus.", "Enter a recovery passphrase": "Gib eine Wiederherstellungspassphrase ein", - "Back up encrypted message keys": "Sichere die Verschlüsselungsschlüssel" + "Back up encrypted message keys": "Sichere die Verschlüsselungsschlüssel", + "Emoji Autocomplete": "Emoji-Auto-Vervollständigung", + "Room Autocomplete": "Raum-Auto-Vervollständigung", + "User Autocomplete": "Nutzer-Auto-Vervollständigung", + "Restore your key backup to upgrade your encryption": "Schlüsselsicherung wiederherstellen, um deine Verschlüsselung zu aktualisieren", + "Restore": "Wiederherstellen", + "Your recovery key has been copied to your clipboard, paste it to:": "Dein Wiederherstellungsschlüssel wurde in die Zwischenablage kopiert. Füge ihn ein in:", + "Your recovery key is in your Downloads folder.": "Dein Wiederherstellungsschlüssel ist in deinem Download-Ordner.", + "You can now verify your other devices, and other users to keep your chats safe.": "Du kannst jetzt deine anderen Geräte und andere Nutzer!nnen verifizieren, um deine Chats zu schützen." } From bdfcd848cd35c95f0540965d12f1cef8d1e70897 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:59:16 +0000 Subject: [PATCH 152/319] Translated using Weblate (German) Currently translated at 97.2% (2238 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 7952115d74..b84f2613c1 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2304,5 +2304,5 @@ "Restore": "Wiederherstellen", "Your recovery key has been copied to your clipboard, paste it to:": "Dein Wiederherstellungsschlüssel wurde in die Zwischenablage kopiert. Füge ihn ein in:", "Your recovery key is in your Downloads folder.": "Dein Wiederherstellungsschlüssel ist in deinem Download-Ordner.", - "You can now verify your other devices, and other users to keep your chats safe.": "Du kannst jetzt deine anderen Geräte und andere Nutzer!nnen verifizieren, um deine Chats zu schützen." + "You can now verify your other devices, and other users to keep your chats safe.": "Du kannst jetzt deine anderen Geräte und andere Benutzer verifizieren, um deine Chats zu schützen." } From 239778cb4c52c61421fa2d5164c8843d7cfe71aa Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 21:59:25 +0000 Subject: [PATCH 153/319] Translated using Weblate (German) Currently translated at 97.2% (2238 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b84f2613c1..b2309c2d0a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2304,5 +2304,8 @@ "Restore": "Wiederherstellen", "Your recovery key has been copied to your clipboard, paste it to:": "Dein Wiederherstellungsschlüssel wurde in die Zwischenablage kopiert. Füge ihn ein in:", "Your recovery key is in your Downloads folder.": "Dein Wiederherstellungsschlüssel ist in deinem Download-Ordner.", - "You can now verify your other devices, and other users to keep your chats safe.": "Du kannst jetzt deine anderen Geräte und andere Benutzer verifizieren, um deine Chats zu schützen." + "You can now verify your other devices, and other users to keep your chats safe.": "Du kannst jetzt deine anderen Geräte und andere Benutzer verifizieren, um deine Chats zu schützen.", + "Upgrade your encryption": "Deine Verschlüsselung aktualisieren", + "You're done!": "Du bist fertig!", + "Unable to set up secret storage": "Geheimer Speicher kann nicht eingerichtet werden" } From fd916c407f414bed9411a43bf2f14b311a1d8b4a Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 21:59:49 +0000 Subject: [PATCH 154/319] Translated using Weblate (German) Currently translated at 97.4% (2244 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b2309c2d0a..7f8972dc48 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2307,5 +2307,8 @@ "You can now verify your other devices, and other users to keep your chats safe.": "Du kannst jetzt deine anderen Geräte und andere Benutzer verifizieren, um deine Chats zu schützen.", "Upgrade your encryption": "Deine Verschlüsselung aktualisieren", "You're done!": "Du bist fertig!", - "Unable to set up secret storage": "Geheimer Speicher kann nicht eingerichtet werden" + "Unable to set up secret storage": "Sicherer Speicher kann nicht eingerichtet werden", + "Enter a recovery passphrase...": "Gib eine Wiederherstellungspassphrase ein...", + "Repeat your recovery passphrase...": "Gib die Wiederherstellungspassphrase erneut ein...", + "Secure your backup with a recovery passphrase": "Verschlüssele deine Sicherung mit einer Wiederherstellungspassphrase" } From b2a22b13258edd8e07620e21774ef2a993c63779 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 22:01:51 +0000 Subject: [PATCH 155/319] Translated using Weblate (German) Currently translated at 97.4% (2244 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 7f8972dc48..8c70d7e40c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2310,5 +2310,8 @@ "Unable to set up secret storage": "Sicherer Speicher kann nicht eingerichtet werden", "Enter a recovery passphrase...": "Gib eine Wiederherstellungspassphrase ein...", "Repeat your recovery passphrase...": "Gib die Wiederherstellungspassphrase erneut ein...", - "Secure your backup with a recovery passphrase": "Verschlüssele deine Sicherung mit einer Wiederherstellungspassphrase" + "Secure your backup with a recovery passphrase": "Verschlüssele deine Sicherung mit einer Wiederherstellungspassphrase", + "Create key backup": "Schlüsselsicherung erstellen", + "This session is encrypting history using the new recovery method.": "Diese Sitzung verschlüsselt den Verlauf mit der neuen Wiederherstellungsmethode.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Diese Sitzung hat festgestellt, dass deine Wiederherstellungspassphrase und dein Schlüssel für gesicherte Nachrichten entfernt wurden." } From 65cc5bfea44829b5c28025dca8a62a51f3cae348 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 22:02:27 +0000 Subject: [PATCH 156/319] Translated using Weblate (German) Currently translated at 98.3% (2264 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8c70d7e40c..3660379302 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2313,5 +2313,16 @@ "Secure your backup with a recovery passphrase": "Verschlüssele deine Sicherung mit einer Wiederherstellungspassphrase", "Create key backup": "Schlüsselsicherung erstellen", "This session is encrypting history using the new recovery method.": "Diese Sitzung verschlüsselt den Verlauf mit der neuen Wiederherstellungsmethode.", - "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Diese Sitzung hat festgestellt, dass deine Wiederherstellungspassphrase und dein Schlüssel für gesicherte Nachrichten entfernt wurden." + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Diese Sitzung hat festgestellt, dass deine Wiederherstellungspassphrase und dein Schlüssel für sichere Nachrichten entfernt wurden.", + "Currently indexing: %(currentRoom)s": "Indiziere: %(currentRoom)s", + "Navigation": "Navigation", + "Calls": "Anrufe", + "Room List": "Raumliste", + "Autocomplete": "Auto-Vervollständigung", + "Alt": "Alt", + "Toggle microphone mute": "Schalte Mikrophon stumm", + "Toggle video on/off": "Schalte Video an/aus", + "Jump to room search": "Springe zur Raumsuche", + "Close dialog or context menu": "Schließe Dialog oder Kontextmenü", + "Cancel autocomplete": "Deaktiviere Auto-Vervollständigung" } From 138b5a08a4c88ad5b9681d1885a60ef3b1fbbb09 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 22:02:41 +0000 Subject: [PATCH 157/319] Translated using Weblate (German) Currently translated at 98.3% (2264 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3660379302..43734a5f8f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2324,5 +2324,14 @@ "Toggle video on/off": "Schalte Video an/aus", "Jump to room search": "Springe zur Raumsuche", "Close dialog or context menu": "Schließe Dialog oder Kontextmenü", - "Cancel autocomplete": "Deaktiviere Auto-Vervollständigung" + "Cancel autocomplete": "Deaktiviere Auto-Vervollständigung", + "Unable to revoke sharing for email address": "Das Teilen der E-Mail-Adresse kann nicht widerrufen werden", + "Unable to validate homeserver/identity server": "Heimserver/Identitätsserver nicht validierbar", + "Without completing security on this session, it won’t have access to encrypted messages.": "Ohne Abschluss der Sicherungseinrichtung in dieser Sitzung hat sie keinen Zugriff auf verschlüsselte Nachrichten.", + "Disable": "Deaktivieren", + "Not currently indexing messages for any room.": "Derzeit werden keine Nachrichten für Räume indiziert.", + "Space used:": "Speicherplatzbedarf:", + "Indexed messages:": "Indizierte Nachrichten:", + "Indexed rooms:": "Indizierte Räume:", + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s von %(totalRooms)s" } From e37e5a2a94b194937092136b44932f30c26bafc4 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 22:13:00 +0000 Subject: [PATCH 158/319] Translated using Weblate (German) Currently translated at 98.5% (2269 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 43734a5f8f..99e5420e88 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2327,11 +2327,15 @@ "Cancel autocomplete": "Deaktiviere Auto-Vervollständigung", "Unable to revoke sharing for email address": "Das Teilen der E-Mail-Adresse kann nicht widerrufen werden", "Unable to validate homeserver/identity server": "Heimserver/Identitätsserver nicht validierbar", - "Without completing security on this session, it won’t have access to encrypted messages.": "Ohne Abschluss der Sicherungseinrichtung in dieser Sitzung hat sie keinen Zugriff auf verschlüsselte Nachrichten.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Ohne Abschluss der Sicherungseinrichtung in dieser Sitzung wird sie keinen Zugriff auf verschlüsselte Nachrichten erhalten.", "Disable": "Deaktivieren", "Not currently indexing messages for any room.": "Derzeit werden keine Nachrichten für Räume indiziert.", "Space used:": "Speicherplatzbedarf:", "Indexed messages:": "Indizierte Nachrichten:", "Indexed rooms:": "Indizierte Räume:", - "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s von %(totalRooms)s" + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s von %(totalRooms)s", + "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Setze eine Wiederherstellungspassphrase um deine verschlüsselten Nachrichten nach dem Abmelden wiederherstellen zu können. Diese sollte sich von deinem Kontopasswort unterscheiden:", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Der Wiederherstellungsschlüssel ist ein Sicherheitsnetz - du kannst damit deine verschlüsselten Nachrichten wiederherstellen wenn du deine Wiederherstellungspassphrase vergessen hast.", + "Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase." } From 5cafad5f464154f393e5b81d150a6df1427975ff Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sat, 9 May 2020 22:17:31 +0000 Subject: [PATCH 159/319] Translated using Weblate (German) Currently translated at 98.5% (2269 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 99e5420e88..a7bd338bb4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2337,5 +2337,6 @@ "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Setze eine Wiederherstellungspassphrase um deine verschlüsselten Nachrichten nach dem Abmelden wiederherstellen zu können. Diese sollte sich von deinem Kontopasswort unterscheiden:", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Der Wiederherstellungsschlüssel ist ein Sicherheitsnetz - du kannst damit deine verschlüsselten Nachrichten wiederherstellen wenn du deine Wiederherstellungspassphrase vergessen hast.", "Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden", - "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase." + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase.", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne die Einrichtung von gesicherter Nachrichtenwiederherstellung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden, wenn du dich abmeldest oder eine andere Sitzung verwendest." } From ad2f704e76d31c25933f257cf62829a67e9739c0 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 10 May 2020 11:17:21 +0100 Subject: [PATCH 160/319] don't NPE on invites from Dendrite --- src/components/structures/RoomView.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 69a2e54a2c..f53929df4a 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1717,8 +1717,11 @@ export default createReactClass({ } else { const myUserId = this.context.credentials.userId; const myMember = this.state.room.getMember(myUserId); - const inviteEvent = myMember.events.member; - var inviterName = inviteEvent.sender ? inviteEvent.sender.name : inviteEvent.getSender(); + const inviteEvent = myMember ? myMember.events.member : null; + let inviterName = _t("Unknown"); + if (inviteEvent) { + inviterName = inviteEvent.sender ? inviteEvent.sender.name : inviteEvent.getSender(); + } // We deliberately don't try to peek into invites, even if we have permission to peek // as they could be a spam vector. From 85a8aaffcf5c8a27f51017df05c659caff8b71f9 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sat, 9 May 2020 22:18:06 +0000 Subject: [PATCH 161/319] Translated using Weblate (German) Currently translated at 98.6% (2270 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a7bd338bb4..0a9d4d3a7a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2338,5 +2338,5 @@ "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Der Wiederherstellungsschlüssel ist ein Sicherheitsnetz - du kannst damit deine verschlüsselten Nachrichten wiederherstellen wenn du deine Wiederherstellungspassphrase vergessen hast.", "Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden", "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase.", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne die Einrichtung von gesicherter Nachrichtenwiederherstellung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden, wenn du dich abmeldest oder eine andere Sitzung verwendest." + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne eine Schlüsselsicherung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden wenn du dich abmeldest oder eine andere Sitzung verwendest." } From 587eb8f8f1ca386823181e9ab36cc520acd0f7dc Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sun, 10 May 2020 11:37:07 +0000 Subject: [PATCH 162/319] Translated using Weblate (German) Currently translated at 98.6% (2270 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0a9d4d3a7a..20d58acfe5 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2338,5 +2338,6 @@ "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Der Wiederherstellungsschlüssel ist ein Sicherheitsnetz - du kannst damit deine verschlüsselten Nachrichten wiederherstellen wenn du deine Wiederherstellungspassphrase vergessen hast.", "Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden", "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase.", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne eine Schlüsselsicherung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden wenn du dich abmeldest oder eine andere Sitzung verwendest." + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne eine Schlüsselsicherung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden wenn du dich abmeldest oder eine andere Sitzung verwendest.", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Sicherungsschlüssel im geheimen Speicher gespeichert, aber diese Funktion ist in dieser Sitzung nicht aktiviert. Aktiviere Cross-Signing in Labs, um Status der Schlüsselsicherung zu ändern." } From 191247165fbcaee4ea4e05a7c14a2dcbd8d7b1b9 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sun, 10 May 2020 11:37:42 +0000 Subject: [PATCH 163/319] Translated using Weblate (German) Currently translated at 98.8% (2275 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 20d58acfe5..98ad1ee3b0 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2339,5 +2339,9 @@ "Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden", "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase.", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne eine Schlüsselsicherung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden wenn du dich abmeldest oder eine andere Sitzung verwendest.", - "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Sicherungsschlüssel im geheimen Speicher gespeichert, aber diese Funktion ist in dieser Sitzung nicht aktiviert. Aktiviere Cross-Signing in Labs, um Status der Schlüsselsicherung zu ändern." + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Der Sicherungsschlüssel ist im sicheren Speicher gespeichert, aber diese Funktion ist in dieser Sitzung nicht aktiviert. Aktiviere Cross-Signing in Labs, um den Status der Schlüsselsicherung zu ändern.", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Es gab einen Fehler beim Ändern des Raum-Aliases. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "Wenn du deine Wiederherstellungspassphrase vergessen hast kannst du deinen Wiederherstellungsschlüssel verwenden oder neue Wiederherstellungsoptionen anlegen.", + "Self-verification request": "Selbstverifikationsanfrage", + "or another cross-signing capable Matrix client": "oder einen anderen Matrix Client der Cross-signing fähig ist" } From 75a3d95aa8405f9c8ecfe51fe4f57e31ed47fa80 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sun, 10 May 2020 11:43:59 +0000 Subject: [PATCH 164/319] Translated using Weblate (German) Currently translated at 98.8% (2275 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 98ad1ee3b0..00dcec412e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2343,5 +2343,6 @@ "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Es gab einen Fehler beim Ändern des Raum-Aliases. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "Wenn du deine Wiederherstellungspassphrase vergessen hast kannst du deinen Wiederherstellungsschlüssel verwenden oder neue Wiederherstellungsoptionen anlegen.", "Self-verification request": "Selbstverifikationsanfrage", - "or another cross-signing capable Matrix client": "oder einen anderen Matrix Client der Cross-signing fähig ist" + "or another cross-signing capable Matrix client": "oder einen anderen Matrix Client der Cross-signing fähig ist", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot speichert verschlüsselte Nachrichten sicher lokal zwischen, damit sie in den Suchergebnissen angezeigt werden:" } From e7f8d211f99e381578daf9f837b216ba79915e3d Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sun, 10 May 2020 11:45:05 +0000 Subject: [PATCH 165/319] Translated using Weblate (German) Currently translated at 99.0% (2281 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 00dcec412e..a8fd1034c4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2344,5 +2344,11 @@ "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "Wenn du deine Wiederherstellungspassphrase vergessen hast kannst du deinen Wiederherstellungsschlüssel verwenden oder neue Wiederherstellungsoptionen anlegen.", "Self-verification request": "Selbstverifikationsanfrage", "or another cross-signing capable Matrix client": "oder einen anderen Matrix Client der Cross-signing fähig ist", - "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot speichert verschlüsselte Nachrichten sicher lokal zwischen, damit sie in den Suchergebnissen angezeigt werden:" + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot verwendet einen sicheren Zwischenspeicher für verschlüsselte Nachrichten, damit sie in den Suchergebnissen angezeigt werden:", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Erhalte Zugriff auf deine verschlüsselten Nachrichten und deine Cross-Signing Identität um andere Sitzungen zu verifizieren indem du deine Wiederherstellungspassphrase eingibst.", + "Liberate your communication": "Liberate your communication", + "Message downloading sleep time(ms)": "Wartezeit zwischen dem Herunterladen von Nachrichten (ms)", + "Navigate recent messages to edit": "Letzte Nachrichten zur Bearbeitung ansehen", + "Jump to start/end of the composer": "Springe zum Anfang/Ende der Nachrichteneingabe", + "Navigate composer history": "Verlauf der Nachrichteneingabe durchsuchen" } From a17820ed3a351521d241fe7aef49461e19233347 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sun, 10 May 2020 19:57:20 +0000 Subject: [PATCH 166/319] Translated using Weblate (German) Currently translated at 99.0% (2281 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a8fd1034c4..cac52fb477 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2350,5 +2350,6 @@ "Message downloading sleep time(ms)": "Wartezeit zwischen dem Herunterladen von Nachrichten (ms)", "Navigate recent messages to edit": "Letzte Nachrichten zur Bearbeitung ansehen", "Jump to start/end of the composer": "Springe zum Anfang/Ende der Nachrichteneingabe", - "Navigate composer history": "Verlauf der Nachrichteneingabe durchsuchen" + "Navigate composer history": "Verlauf der Nachrichteneingabe durchsuchen", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Wenn du dies versehentlich getan hast, kannst du in dieser Sitzung \"gesicherte Nachrichten\" einrichten, die den Nachrichtenverlauf dieser Sitzung mit einer neuen Wiederherstellungsmethode erneut verschlüsseln." } From 8ca72a883056a7a7fdd89afcd0a1569275f4d424 Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 15:37:19 +0000 Subject: [PATCH 167/319] Translated using Weblate (Spanish) Currently translated at 77.4% (1782 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 299 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 288 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 872bd7ab4c..99ad342b69 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -977,7 +977,7 @@ "User %(user_id)s does not exist": "El usuario %(user_id)s no existe", "User %(user_id)s may or may not exist": "El usuario %(user_id)s podría o no existir", "Unknown server error": "Error desconocido del servidor", - "Use a few words, avoid common phrases": "Usa varias palabras, evita frases comunes", + "Use a few words, avoid common phrases": "Usa unas pocas palabras, evita frases comunes", "No need for symbols, digits, or uppercase letters": "No hacen falta símbolos, números o letrás en mayúscula", "Avoid repeated words and characters": "Evita repetir palabras y letras", "Avoid sequences": "Evita frases", @@ -1001,7 +1001,7 @@ "A word by itself is easy to guess": "Una palabra es fácil de adivinar", "Names and surnames by themselves are easy to guess": "Nombres y apellidos son fáciles de adivinar", "Common names and surnames are easy to guess": "Nombres y apellidos comunes son fáciles de adivinar", - "Straight rows of keys are easy to guess": "Palabras formadas por repeticiones de teclas son fáciles de adivinar", + "Straight rows of keys are easy to guess": "Palabras formadas por secuencias de teclas alineadas son fáciles de adivinar", "Short keyboard patterns are easy to guess": "Patrones de tecleo cortos son fáciles de adivinar", "There was an error joining the room": "Hubo un error al unirse a la sala", "Custom user status messages": "Mensajes de estado de usuario personalizados", @@ -1208,7 +1208,7 @@ "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Te puedes registrar, pero algunas funcionalidades no estarán disponibles hasta que se pueda conectar con el servidor de identidad. Si continúas viendo este aviso, comprueba tu configuración o contacta con el administrador del servidor.", "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Puedes cambiar tu contraseña, pero algunas funcionalidades no estarán disponibles hasta que el servidor de identidad esté disponible. Si continúas viendo este aviso, comprueba tu configuración o contacta con el administrador del servidor.", "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Puedes iniciar sesión, pero algunas funcionalidades no estarán disponibles hasta que el servidor de identidad esté disponible. Si continúas viendo este mensaje, comprueba tu configuración o contacta con el administrador del servidor.", - "No homeserver URL provided": "No se ha indicado la URL del servidor", + "No homeserver URL provided": "No se ha indicado la URL del servidor local", "Unexpected error resolving homeserver configuration": "Error inesperado en la configuración del servidor", "Unexpected error resolving identity server configuration": "Error inesperado en la configuración del servidor de identidad", "User %(userId)s is already in the room": "El usuario %(userId)s ya está en la sala", @@ -1257,7 +1257,7 @@ "Enable local event indexing and E2EE search (requires restart)": "Active el indexado de eventos locales y la búsqueda E2EE (necesita reiniciar)", "Match system theme": "Usar el tema del sistema", "Show previews/thumbnails for images": "Mostrar vistas previas para las imágenes", - "When rooms are upgraded": "Cuando se mejoran las salas", + "When rooms are upgraded": "Cuando las salas son actualizadas", "My Ban List": "Mi lista de baneos", "This is your list of users/servers you have blocked - don't leave the room!": "Esta es la lista de usuarios y servidores que ha bloqueado - ¡No deje la sala!", "Decline (%(counter)s)": "Declinar (%(counter)s)", @@ -1442,11 +1442,11 @@ "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s actualizó una regla de bloqueo que correspondía a %(oldGlob)s a %(newGlob)s por %(reason)s", "The message you are trying to send is too large.": "El mensaje que estás intentando enviar es demasiado largo.", "a few seconds ago": "hace unos segundos", - "about a minute ago": "hace un minuto", + "about a minute ago": "hace aproximadamente un minuto", "%(num)s minutes ago": "hace %(num)s minutos", - "about an hour ago": "hace una hora", + "about an hour ago": "hace aprox. una hora", "%(num)s hours ago": "hace %(num)s horas", - "about a day ago": "hace un día", + "about a day ago": "hace aprox. un día", "%(num)s days ago": "hace %(num)s días", "a few seconds from now": "dentro de unos segundos", "about a minute from now": "dentro de un minuto", @@ -1466,7 +1466,7 @@ "or": "o", "Compare unique emoji": "Comparar emoji único", "Compare a unique set of emoji if you don't have a camera on either device": "Comparar un conjunto de emojis si no tienes cámara en ninguno de los dispositivos", - "Start": "Comenzar", + "Start": "Inicio", "Confirm the emoji below are displayed on both devices, in the same order:": "Confirma que los emojis a continuación son mostrados en ambos dispositivos, en el mismo orden:", "Verify this device by confirming the following number appears on its screen.": "Verifica este dispositivo confirmando que el siguiente número aparece en su pantalla.", "Waiting for %(displayName)s to verify…": "Esperando la verificación de %(displayName)s …", @@ -1493,7 +1493,7 @@ "Browse": "Navegar", "Change room avatar": "Cambiar avatar de sala", "Change room name": "Cambiar nombre de sala", - "Change main address for the room": "Cambiar dirección principal para la sala", + "Change main address for the room": "Cambiar la dirección principal para la sala", "Change history visibility": "Cambiar visibilidad del historial", "Change permissions": "Cambiar permisos", "Change topic": "Cambiar tema", @@ -1508,7 +1508,7 @@ "Send messages": "Enviar mensajes", "Invite users": "Invitar usuarios", "Change settings": "Cambiar la configuración", - "Kick users": "Echar a usuarios", + "Kick users": "Expulsar usuarios", "Ban users": "Bloquear a usuarios", "Remove messages": "Eliminar mensajes", "Notify everyone": "Notificar a todos", @@ -1536,5 +1536,282 @@ "Disconnect from the identity server ?": "¿Desconectarse del servidor de identidad ?", "Disconnect": "Desconectarse", "You should:": "Deberías:", - "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s de %(totalRooms)s" + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s de %(totalRooms)s", + "Use Single Sign On to continue": "Procede con Registro Único para continuar", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirma la adición de esta dirección de correo electrónico usando el Registro Único para probar tu identidad.", + "Single Sign On": "Registro Único", + "Confirm adding email": "Confirmar la adición del correo electrónico", + "Click the button below to confirm adding this email address.": "Haz clic en el botón de abajo para confirmar la adición de esta dirección de correo electrónico.", + "Confirm": "Confirmar", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirme la adición de este número de teléfono usando el Registro Único para probar su identidad...", + "Confirm adding phone number": "Confirmar la adición del número de teléfono", + "Click the button below to confirm adding this phone number.": "Haga clic en el botón de abajo para confirmar la adición de este número de teléfono.", + "Whether you're using Riot on a device where touch is the primary input mechanism": "Si estés usando Riot en un dispositivo donde una pantalla táctil es el principal mecanismo de entrada", + "Whether you're using Riot as an installed Progressive Web App": "Si estás usando Riot como una Aplicación Web Progresiva instalada", + "Review Sessions": "Sesiones de revisión", + "If you cancel now, you won't complete your operation.": "Si cancela ahora, no completará la operación.", + "Review where you’re logged in": "Revise dónde hizo su registro", + "New login. Was this you?": "Nuevo registro. ¿Fuiste tú?", + "%(name)s is requesting verification": "%(name)s solicita verificación", + "Sign In or Create Account": "Iniciar sesión o Crear una cuenta", + "Use your account or create a new one to continue.": "Usa tu cuenta existente o crea una nueva para continuar.", + "Create Account": "Crear cuenta", + "Sign In": "Registrarse", + "Sends a message as html, without interpreting it as markdown": "Envía un mensaje como html, sin interpretarlo como un markdown", + "Failed to set topic": "No se ha podido establecer el tema", + "Command failed": "El comando falló", + "Could not find user in room": "No pude encontrar el usuario en la sala", + "Please supply a widget URL or embed code": "Por favor, proporcione una URL del widget o un código de incrustación", + "Displays information about a user": "Muestra información sobre un usuario", + "Send a bug report with logs": "Envíe un informe de errores con los registros", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s cambió el nombre de la sala %(oldRoomName)s a %(newRoomName)s.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s añadió las direcciones alternativas %(addresses)s para esta sala.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s añadió la dirección alternativa %(addresses)s para esta sala.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s quitó la dirección alternativa %(addresses)s para esta sala.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s quitó la dirección alternativa %(addresses)s para esta sala.", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s cambió las direcciones alternativas de esta sala.", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s cambió la dirección principal y las alternativas de esta sala.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s cambió las direcciones de esta sala.", + "You signed in to a new session without verifying it:": "Iniciaste una nueva sesión sin verificarla:", + "Verify your other session using one of the options below.": "Verifique su otra sesión utilizando una de las siguientes opciones.", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) inició una nueva sesión sin verificarla:", + "Ask this user to verify their session, or manually verify it below.": "Pídale a este usuario que verifique su sesión, o verifíquela manualmente a continuación.", + "Not Trusted": "No es de confianza", + "Manually Verify by Text": "Verificar manualmente mediante texto", + "Interactively verify by Emoji": "Verifica interactivamente con unEmoji", + "Done": "Listo", + "Support adding custom themes": "Soporta la adición de temas personalizados", + "Enable cross-signing to verify per-user instead of per-session": "Habilitar la firma cruzada para verificar por usuario en lugar de por sesión", + "Show info about bridges in room settings": "Mostrar información sobre puentes en la configuración de salas", + "Order rooms by name": "Ordenar las salas por nombre", + "Show rooms with unread notifications first": "Mostrar primero las salas con notificaciones no leídas", + "Show shortcuts to recently viewed rooms above the room list": "Mostrar atajos a las salas recientemente vistas por encima de la lista de salas", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Permitir el servidor de respaldo de asistencia de llamadas turn.matrix.org cuando su servidor doméstico no lo ofrece (su dirección IP se compartiría durante una llamada)", + "Send read receipts for messages (requires compatible homeserver to disable)": "Enviar recibos de lectura de mensajes (requiere un servidor local compatible para desactivarlo)", + "Keep recovery passphrase in memory for this session": "Guarde la contraseña de recuperación en la memoria para esta sesión", + "Manually verify all remote sessions": "Verifica manualmente todas las sesiones remotas", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Confirma que los emoji de abajo se muestran en el mismo orden en ambas sesiones:", + "Verify this session by confirming the following number appears on its screen.": "Verifique esta sesión confirmando que el siguiente número aparece en su pantalla.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Esperando a que su otra sesión, %(deviceName)s (%(deviceId)s), verifica…", + "Cancelling…": "Anulando …", + "Verify all your sessions to ensure your account & messages are safe": "Verifica todas tus sesiones abiertas para asegurarte de que tu cuenta y tus mensajes estén seguros", + "Update your secure storage": "Actualice su almacenamiento seguro", + "Set up": "Configurar", + "Verify the new login accessing your account: %(name)s": "Verifique el nuevo ingreso que está accediendo a su cuenta: %(name)s", + "From %(deviceName)s (%(deviceId)s)": "De %(deviceName)s (%(deviceId)s)", + "This bridge was provisioned by .": "Este puente fue aportado por .", + "This bridge is managed by .": "Este puente es administrado por .", + "Your homeserver does not support cross-signing.": "Tu servidor doméstico no soporta las firmas cruzadas.", + "Cross-signing and secret storage are enabled.": "La firma cruzada y el almacenamiento secreto están activados.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Su cuenta tiene una identidad de firma cruzada en un almacenamiento secreto, pero aún no es confiada en esta sesión.", + "Cross-signing and secret storage are not yet set up.": "Las firmas cruzadas y el almacenamiento secreto aún no han sido configurados.", + "Reset cross-signing and secret storage": "Resetear las señales cruzadas y el almacenamiento secreto", + "Bootstrap cross-signing and secret storage": "Reconfiguración de firma cruzada y almacenamiento secreto", + "well formed": "bien formado", + "unexpected type": "tipo inesperado", + "Cross-signing public keys:": "Firmando las llaves públicas de manera cruzada:", + "Cross-signing private keys:": "Firmando las llaves privadas de manera cruzada:", + "Self signing private key:": "Clave privada autofirmada:", + "cached locally": "almacenado localmente", + "not found locally": "no encontrado localmente", + "User signing private key:": "Usuario firmando llave privada:", + "Session backup key:": "Llave / Código de respaldo de la sesión:", + "Homeserver feature support:": "Características apoyadas por servidor local:", + "exists": "existe", + "Secret Storage key format:": "Formato del código de almacenamiento secreto:", + "outdated": "no actual", + "up to date": "actualizado", + "Your homeserver does not support session management.": "Su servidor local no soporta la gestión de sesiones.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Confirme eliminar estas sesiones, probando su identidad con el Registro Único.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Confirme eliminar esta sesión, probando su identidad con el Registro Único.", + "Confirm deleting these sessions": "Confirmar la eliminación de estas sesiones", + "Click the button below to confirm deleting these sessions.|other": "Haga clic en el botón de abajo para confirmar la eliminación de estas sesiones.", + "Click the button below to confirm deleting these sessions.|one": "Haga clic en el botón de abajo para confirmar la eliminación de esta sesión.", + "Delete sessions|other": "Eliminar sesiones", + "Delete sessions|one": "Eliminar sesión", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verificar individualmente cada sesión utilizada por un usuario para marcarla como de confianza, no confiando en dispositivos de firma cruzada.", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Almacenar localmente, de manera segura, los mensajes cifrados localmente para que aparezcan en los resultados de la búsqueda, utilizando ", + " to store messages from ": " para almacenar mensajes de ", + "Securely cache encrypted messages locally for them to appear in search results.": "Almacenar localmente, de manera segura, a los mensajes cifrados localmente para que aparezcan en los resultados de búsqueda.", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riot le faltan algunos componentes necesarios para el almacenamiento seguro de mensajes cifrados a nivel local. Si quieres experimentar con esta característica, construye un Escritorio Riot personalizado con componentes de búsqueda añadidos.", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot no puede guardar de forma segura en la memoria caché a mensajes encriptados localmente, mientras se ejecuta en un navegador web. Use Riot Desktop para que los mensajes encriptados aparezcan en los resultados de la búsqueda.", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Esta sesión no ha creado una copia de seguridad de tus llaves, pero tienes una copia de seguridad existente de la que puedes restaurar y añadir para proceder.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Conecte esta sesión a la copia de seguridad de las claves antes de firmar y así evitar perder las claves que sólo existen en esta sesión.", + "Connect this session to Key Backup": "Conecte esta sesión a la copia de respaldo de tu clave", + "Backup has a valid signature from this user": "La copia de seguridad tiene una firma de valido de este usuario", + "Backup has a invalid signature from this user": "La copia de seguridad tiene una firma de no_valida de este usuario", + "Backup has a signature from unknown user with ID %(deviceId)s": "La copia de seguridad tiene una firma de desconocido del usuario con ID %(deviceId)s", + "Backup has a signature from unknown session with ID %(deviceId)s": "La copia de seguridad tiene una firma de desconocido de la sesión con ID %(deviceId)s", + "Backup has a valid signature from this session": "La copia de seguridad tiene una firma válida de esta sesión", + "Backup has an invalid signature from this session": "La copia de seguridad tiene una firma no_válida de esta sesión", + "Backup has a valid signature from verified session ": "La copia de seguridad tiene una firma válida de verificada sesión ", + "Backup has a valid signature from unverified session ": "La copia de seguridad tiene una firma de válida de sesión no verificada ", + "Backup has an invalid signature from verified session ": "La copia de seguridad tiene una firma de no válida de sesión verificada ", + "Backup has an invalid signature from unverified session ": "La copia de seguridad tiene una firma de no válida de sesión no verificada ", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "La clave de respaldo se guardó en un almacenamiento secreto, pero esta función no está habilitada en esta sesión. Por favor, habilite la firma cruzada en Labs para modificar el estado de respaldo de la clave.", + "Upgrade to your own domain": "Actualizar a su propio dominio", + "Identity Server URL must be HTTPS": "La URL del servidor de identidad debe ser tipo HTTPS", + "Not a valid Identity Server (status code %(code)s)": "No es un servidor de identidad válido (código de estado %(code)s)", + "Could not connect to Identity Server": "No se pudo conectar al Servidor de Identidad", + "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Usted debe eliminar sus datos personales del servidor de identidad antes de desconectarse. Desafortunadamente, el servidor de identidad está actualmente desconectado o es imposible comunicarse con él por otra razón.", + "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "comprueba los complementos (plugins) de tu navegador para ver si hay algo que pueda bloquear el servidor de identidad (como p.ej. Privacy Badger)", + "contact the administrators of identity server ": "contactar con los administradores del servidor de identidad ", + "wait and try again later": "espera y vuelve a intentarlo más tarde", + "Disconnect anyway": "Desconectar de todas formas", + "You are still sharing your personal data on the identity server .": "Usted todavía está compartiendo sus datos personales en el servidor de identidad .", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Le recomendamos que elimine sus direcciones de correo electrónico y números de teléfono del servidor de identidad antes de desconectarse.", + "Go back": "Atrás", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usar un Administrador de Integración (%(serverName)s) para manejar los bots, los widgets y los paquetes de pegatinas.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Utiliza un Administrador de Integración para gestionar los bots, los widgets y los paquetes de pegatinas.", + "Invalid theme schema.": "Esquema de tema inválido.", + "Error downloading theme information.": "Error al descargar la información del tema.", + "Theme added!": "¡Se añadió el tema!", + "Custom theme URL": "URL de tema personalizado", + "Add theme": "Añadir tema", + "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Para informar de un problema de seguridad relacionado con Matrix, por favor lea Security Disclosure Policy de Matrix.or.", + "Keyboard Shortcuts": "Atajos de teclado", + "Customise your experience with experimental labs features. Learn more.": "Personaliza tu experiencia con las funciones de los laboratorios experimentales. Learn more.", + "Something went wrong. Please try again or view your console for hints.": "Algo salió mal. Por favor, inténtalo de nuevo o mira tu consola para encontrar pistas.", + "Please try again or view your console for hints.": "Por favor, inténtalo de nuevo o mira tu consola para encontrar pistas.", + "Ban list rules - %(roomName)s": "Reglas de la lista negra - %(roomName)s", + "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Añade los usuarios y servidores que quieras ignorar aquí. Usa asteriscos para que Riot coincida cualquier conjunto de caracteres. Por ejemplo, @bot:* ignoraría a todos los usuarios,en cualquier servidor, que tengan el nombre 'bot' .", + "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Ignorar usuarios se hace mediante listas negras que contienen reglas sobre a quién bloquear. Suscribirse a una lista negra significa que los usuarios/servidores bloqueados serán invisibles para tí.", + "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Tu lista negra personal contiene todos los usuarios/servidores de los que no quieres ver mensajes. Después de ignorar su primer usuario/servidor, una nueva sala aparecerá en su lista de salas llamada \"Mi lista negra (de bloqueo)\" - permanezca en esta sala para mantener la lista de prohibición en efecto.", + "Subscribed lists": "Listados a que subscribiste", + "Subscribing to a ban list will cause you to join it!": "¡Suscribirse a una lista negra hará unirte a ella!", + "If this isn't what you want, please use a different tool to ignore users.": "Si esto no es lo que quieres, por favor usa una herramienta diferente para ignorar usuarios.", + "Room ID or alias of ban list": "Identificación (ID) de la habitación o alias de la lista negra", + "Subscribe": "Suscribir", + "Always show the window menu bar": "Siempre mostrar la barra de menú de la ventana", + "Show tray icon and minimize window to it on close": "Mostrar el icono en el Área de Notificación y minimizar la ventana al cerrarla", + "Composer": "Compositor", + "Timeline": "Línea de tiempo", + "Read Marker lifetime (ms)": "Permanencia del marcador de lectura (en ms)", + "Read Marker off-screen lifetime (ms)": "Permanencia del marcador de lectura fuera de la pantalla (en ms)", + "Session ID:": "Identidad (ID) de sesión:", + "Session key:": "Código de sesión:", + "Accept all %(invitedRooms)s invites": "Aceptar todas las invitaciones de %(invitedRooms)s", + "Cross-signing": "Firmar cruzada", + "Where you’re logged in": "En el lugar de ingreso (registro)", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Administre los nombres de sus sesiones y salga de las sesiones abajo o verifíquelos en su Perfil de Usuario.", + "A session's public name is visible to people you communicate with": "El nombre público de una sesión es visible para las personas con las que te comunicas", + "This room is bridging messages to the following platforms. Learn more.": "Esta sala está haciendo puente con las siguientes plataformas. Aprende más.", + "This room isn’t bridging messages to any platforms. Learn more.": "Esta sala no está haciendo puente con ninguna plataforma. Aprende más", + "Bridges": "Puentes", + "Uploaded sound": "Sonido subido", + "Reset": "Resetear", + "Unable to revoke sharing for email address": "No se logró revocar el compartir para la dirección de correo electrónico", + "Unable to share email address": "No se logró compartir la dirección de correo electrónico", + "Click the link in the email you received to verify and then click continue again.": "Haga clic en el enlace del correo electrónico que recibió para verificar y luego nuevamente haga clic en continuar.", + "Revoke": "Revocar", + "Discovery options will appear once you have added an email above.": "Las opciones de descubrimiento aparecerán una vez que haya añadido un correo electrónico arriba.", + "Unable to revoke sharing for phone number": "No se logró revocar el intercambio de un número de teléfono", + "Unable to share phone number": "No se logró compartir el número de teléfono", + "Please enter verification code sent via text.": "Por favor, introduzca el código de verificación enviado por mensaje de texto.", + "Discovery options will appear once you have added a phone number above.": "Las opciones de descubrimiento aparecerán una vez que haya añadido un número de teléfono arriba.", + "Remove %(phone)s?": "¿Eliminar %(phone)s?", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Se ha enviado un mensaje de texto a +%(msisdn)s. Por favor, introduzca el código de verificación que contiene.", + "This user has not verified all of their sessions.": "Este usuario no ha verificado todas sus sesiones.", + "You have not verified this user.": "No has verificado a este usuario.", + "You have verified this user. This user has verified all of their sessions.": "Usted ha verificado este usuario. Este usuario ha verificado todas sus sesiones.", + "Someone is using an unknown session": "Alguien está usando una sesión desconocida", + "This room is end-to-end encrypted": "Esta sala usa encriptación de extremo a extremo", + "Everyone in this room is verified": "Todos los participantes en esta sala están verificados", + "Some sessions for this user are not trusted": "Algunas sesiones para este usuario no son de confianza", + "All sessions for this user are trusted": "Todas las sesiones para este usuario son de confianza", + "Some sessions in this encrypted room are not trusted": "Algunas sesiones en esta sala encriptada no son de confianza", + "All sessions in this encrypted room are trusted": "Todas las sesiones en esta sala encriptada son de confianza", + "Edit message": "Editar mensaje", + "Mod": "Mod", + "Your key share request has been sent - please check your other sessions for key share requests.": "Su solicitud de intercambio de claves ha sido enviada. Por favor, compruebe en sus otras sesiones si hay solicitudes de intercambio de claves.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Solicitudes para compartir claves son enviadas a sus otras sesiones de forma automática. Si ha rechazado o descartado la solicitud de compartir claves en sus otras sesiones, haga clic aquí para solicitar de nuevo las claves de esta sesión.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Si sus otras sesiones no tienen la clave para este mensaje no podrás desencriptarlas.", + "Rotate counter-clockwise": "Girar en sentido contrario a las agujas del reloj", + "Rotate Right": "Girar a la derecha", + "Rotate clockwise": "Girar en el sentido de las agujas del reloj", + "Language Dropdown": "Lista selección de idiomas", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s %(count)s veces no efectuarion cambios", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s no efectuaron cambios", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s %(count)s veces no efectuó cambios", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s no efectuó cambios", + "Power level": "Nivel de poder", + "Room alias": "Alias (apodo) de la sala", + "e.g. my-room": "p.ej. mi-sala", + "Some characters not allowed": "Algunos caracteres no están permitidos", + "Please provide a room alias": "Por favor, proporcione un alias (apodo) para la sala", + "This alias is available to use": "Este alias (apodo) está disponible", + "This alias is already in use": "Este alias (apodo) ya está en uso", + "Sign in with single sign-on": "Ingresar con un Registro Único", + "Enter a server name": "Introduzca un nombre de servidor", + "Looks good": "Se ve bien", + "Can't find this server or its room list": "No puedo encontrar este servidor o su lista de salas", + "All rooms": "Todas las salas", + "Your server": "Tu", + "Are you sure you want to remove %(serverName)s": "¿Estás seguro de querer quitar %(serverName)s ?", + "Remove server": "Quitar servidor", + "Matrix": "Matrix", + "Add a new server": "Añadir un nuevo servidor", + "Enter the name of a new server you want to explore.": "Introduce el nombre de un nuevo servidor que quieras explorar.", + "Server name": "Nombre del servidor", + "Add a new server...": "Añade un nuevo servidor ...", + "%(networkName)s rooms": "%(networkName)s sala", + "Matrix rooms": "Salas de Matrix", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Usar un Servidor de Identidad para invitar vía correo electrónico. . Use (%(defaultIdentityServerName)s)o seleccione en Ajustes.", + "Use an identity server to invite by email. Manage in Settings.": "Utilice un servidor de identidad para invitar por correo electrónico. Gestionar en Ajustes.", + "Close dialog": "Cerrar diálogo", + "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Por favor, díganos qué salió mal o, mejor aún, cree un reporte de GitHub que describa el problema.", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Recordatorio: Su navegador no es compatible, por lo que su experiencia puede ser impredecible.", + "GitHub issue": "reporte GitHub", + "Notes": "Notas", + "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Si hay algún contexto adicional que ayude a analizar el tema, como por ejemplo lo que estaba haciendo en ese momento, nombre (ID) de sala, nombre (ID)de usuario, etc., por favor incluya esas cosas aquí.", + "Removing…": "Quitando…", + "Destroy cross-signing keys?": "¿Destruir las claves de firma cruzada?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "La eliminación de claves de firma cruzada es definitiva. Cualquiera con el que lo hayas verificado verá alertas de seguridad. Es casi seguro que no quieres hacer esto, a menos que hayas perdido todos los dispositivos puedas usar hacer una firma cruzada.", + "Clear cross-signing keys": "Borrar claves de firma cruzada", + "Clear all data in this session?": "¿Borrar todos los datos en esta sesión?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "La eliminación de todos los datos de esta sesión es definitiva. Los mensajes encriptados se perderán a menos que se haya hecho una copia de seguridad de sus claves.", + "Clear all data": "Borrar todos los datos", + "Please enter a name for the room": "Por favor, introduzca un nombre para la sala", + "Set a room alias to easily share your room with other people.": "Fijar un alias (apodo) para su sala para compartirla con mayor facilidadn con otras personas.", + "This room is private, and can only be joined by invitation.": "Esta sala es privada, y sólo se puede acceder a ella por invitación.", + "Enable end-to-end encryption": "Habilitar la encriptación de extremo a extremo", + "You can’t disable this later. Bridges & most bots won’t work yet.": "No puedes deshabilitar esto después. Los puentes y la mayoría de los bots no funcionarán todavía.", + "Create a public room": "Crear una sala pública", + "Create a private room": "Crear una sala pública", + "Topic (optional)": "Tema (opcional)", + "Make this room public": "Convierte esta sala en pública", + "Hide advanced": "Ocultar avanzado", + "Show advanced": "Mostrar avanzado", + "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Evitar que usuarios de otros servidores Matrix se unan a esta sala (¡Este ajuste no puede ser cambiada más tarde!)", + "Server did not require any authentication": "El servidor no requirió ninguna autenticación", + "Server did not return valid authentication information.": "El servidor no devolvió información de autenticación válida.", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Confirme la desactivación de su cuenta, usando Registro Único para probar su identidad.", + "Are you sure you want to deactivate your account? This is irreversible.": "¿Está seguro de que quiere desactivar su cuenta? Es irreversible.", + "Confirm account deactivation": "Confirmar la desactivación de la cuenta", + "There was a problem communicating with the server. Please try again.": "Hubo un problema de comunicación con el servidor. Por favor, inténtelo de nuevo.", + "Verify session": "Verificar sesión", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Para verificar que se puede confiar en esta sesión, comprueba que la clave que ves en la Configuración del Usuario de ese dispositivo coincide con la clave que aparece a continuación:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Para verificar que se puede confiar en esta sesión, póngase en contacto con su dueño por algún otro medio (por ejemplo, en persona o por teléfono) y pregúntele si el código que ve en su Configuración de usuario para esta sesión coincide con el código abajo:", + "Session name": "Nombre de sesión", + "Session key": "Código de sesión", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Si coincide, presione el botón de verificación de abajo. Si no, entonces otra persona está interceptando esta sesión y probablemente quieras presionar el botón de la lista negra en su lugar.", + "View Servers in Room": "Ver servidores en la sala", + "Verification Requests": "Solicitudes de verificación", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Verificar que este usuario marcará su sesión como de confianza, y también que marcará su sesión como de confianza para él.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifique este dispositivo para marcarlo como confiable. Confiar en este dispositivo le da a usted y a otros usuarios tranquilidad adicional cuando utilizan mensajes cifrados de extremo a extremo.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "La verificación de este dispositivo lo marcará como de confianza. Los usuarios que dejaron verificarse por usted confiarán en este dispositivo.", + "Integrations are disabled": "Las integraciones están deshabilitadas", + "Enable 'Manage Integrations' in Settings to do this.": "Habilita 'Gestionar Integraciones' en Ajustes para hacer esto.", + "Integrations not allowed": "Integraciones no están permitidas", + "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Su Riot no le permite utilizar un \"Administrador de Integración\" para hacer esto. Por favor, contacte con un administrador.", + "Failed to invite the following users to chat: %(csvUsers)s": "Error invitando a los siguientes usuarios al chat: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "No pudimos crear tu DM. Por favor, marca los usuarios que quieres invitar e inténtalo de nuevo.", + "Start a conversation with someone using their name, username (like ) or email address.": "Iniciar una conversación con alguien usando su nombre, nombre de usuario (como ) o dirección de correo electrónico.", + "Invite someone using their name, username (like ), email address or share this room.": "Invitar a alguien usando su nombre, nombre de usuario (como ), dirección de correo electrónico o compartir esta sala.", + "a new master key signature": "una nueva firma de llave maestra", + "a new cross-signing key signature": "una nueva firma de código de firma cruzada", + "a device cross-signing signature": "una firma para la firma cruzada de dispositivos", + "a key signature": "un firma de clave", + "Riot encountered an error during upload of:": "Riot encontró un error durante la carga de:", + "End": "Fin" } From a8db033dd45b026c6655bffe695ed900cc1fa22c Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:18:00 +0000 Subject: [PATCH 168/319] Translated using Weblate (Spanish) Currently translated at 77.4% (1782 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 99ad342b69..6d1701b580 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1813,5 +1813,12 @@ "a device cross-signing signature": "una firma para la firma cruzada de dispositivos", "a key signature": "un firma de clave", "Riot encountered an error during upload of:": "Riot encontró un error durante la carga de:", - "End": "Fin" + "End": "Fin", + "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. Learn more about encryption.": "Una vez habilitado, el cifrado de una sala no puede deshabilitarse. Los mensajes enviados a una sala cifrada no pueden ser vistos por el servidor, sólo lo verán los participantes de la sala. Habilitar el cifrado puede hacer que muchos bots y bridges no funcionen correctamente. Aprende más de cifrado", + "Joining room …": "Uniéndose a sala ...", + "Loading …": "Cargando ...", + "Rejecting invite …": "Rechazando invitación ...", + "Join the conversation with an account": "Unirse a la conversación con una cuenta", + "Sign Up": "Registrarse", + "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s te ha explusado de %(roomName)s" } From f0ffd8c2087f1886524f3db68c3f763c962fdfa2 Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:19:29 +0000 Subject: [PATCH 169/319] Translated using Weblate (Spanish) Currently translated at 77.6% (1787 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 6d1701b580..732c56b1d0 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1820,5 +1820,5 @@ "Rejecting invite …": "Rechazando invitación ...", "Join the conversation with an account": "Unirse a la conversación con una cuenta", "Sign Up": "Registrarse", - "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s te ha explusado de %(roomName)s" + "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s te ha explusado de la sala %(roomName)s" } From ecb3816e61886a6e29782ba5eb8b3b5535cf994f Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:19:39 +0000 Subject: [PATCH 170/319] Translated using Weblate (Spanish) Currently translated at 77.6% (1787 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 732c56b1d0..005c6363cc 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1820,5 +1820,10 @@ "Rejecting invite …": "Rechazando invitación ...", "Join the conversation with an account": "Unirse a la conversación con una cuenta", "Sign Up": "Registrarse", - "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s te ha explusado de la sala %(roomName)s" + "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s te ha explusado de la sala %(roomName)s", + "Reason: %(reason)s": "Razón: %(reason)s", + "Forget this room": "Olvidar esta sala", + "Re-join": "Re-entrar", + "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", + "Something went wrong with your invite to %(roomName)s": "Algo ha ido mal con tu invitación a %(roomName)s" } From e30d4dab35ecbc963678e1b50a3ec0809713beb0 Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:20:56 +0000 Subject: [PATCH 171/319] Translated using Weblate (Spanish) Currently translated at 77.6% (1788 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 005c6363cc..fec9b8688b 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1825,5 +1825,5 @@ "Forget this room": "Olvidar esta sala", "Re-join": "Re-entrar", "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", - "Something went wrong with your invite to %(roomName)s": "Algo ha ido mal con tu invitación a %(roomName)s" + "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s" } From 79fbc1452ebdd1cc48bf80ecd423776cc5115054 Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:21:19 +0000 Subject: [PATCH 172/319] Translated using Weblate (Spanish) Currently translated at 77.6% (1788 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index fec9b8688b..375a13a3f6 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1825,5 +1825,6 @@ "Forget this room": "Olvidar esta sala", "Re-join": "Re-entrar", "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", - "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s" + "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", + "You can only join it with a working invite.": "Sólo puedes unirte con una invitación activa." } From 94c1ef85531123092d3be05533e2c49d5d7b3dba Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:21:44 +0000 Subject: [PATCH 173/319] Translated using Weblate (Spanish) Currently translated at 77.7% (1789 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 375a13a3f6..ebe8399318 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1826,5 +1826,5 @@ "Re-join": "Re-entrar", "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", - "You can only join it with a working invite.": "Sólo puedes unirte con una invitación activa." + "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona." } From 6f2430daeae606ed3514efa135c8915e9d1f94ff Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:21:55 +0000 Subject: [PATCH 174/319] Translated using Weblate (Spanish) Currently translated at 77.7% (1789 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index ebe8399318..5efd6094d2 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1826,5 +1826,6 @@ "Re-join": "Re-entrar", "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", - "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona." + "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona.", + "Try to join anyway": "Unirse de todas formas" } From 584e56b4bb5366f1e2767fe93538156f973d3e9a Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:22:12 +0000 Subject: [PATCH 175/319] Translated using Weblate (Spanish) Currently translated at 77.7% (1790 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 5efd6094d2..fec02550ca 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1827,5 +1827,5 @@ "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona.", - "Try to join anyway": "Unirse de todas formas" + "Try to join anyway": "Intentar unirse de todas formas" } From c74b71013b45be98cdb9b1eff5cfb2b7a279cd4b Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:22:38 +0000 Subject: [PATCH 176/319] Translated using Weblate (Spanish) Currently translated at 77.7% (1790 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index fec02550ca..0cc68582ae 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1827,5 +1827,6 @@ "You were banned from %(roomName)s by %(memberName)s": "%(memberName)s te ha expulsado de %(roomName)s", "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona.", - "Try to join anyway": "Intentar unirse de todas formas" + "Try to join anyway": "Intentar unirse de todas formas", + "You can still join it because this is a public room.": "Puedes unirte porque es una sala pública." } From e61a5e04f2da11ca3236ebb56352a5dc9adad22a Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:23:28 +0000 Subject: [PATCH 177/319] Translated using Weblate (Spanish) Currently translated at 77.9% (1793 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 0cc68582ae..3edebaff1a 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1828,5 +1828,5 @@ "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona.", "Try to join anyway": "Intentar unirse de todas formas", - "You can still join it because this is a public room.": "Puedes unirte porque es una sala pública." + "You can still join it because this is a public room.": "Todavía puedes unirte, ya que es una sala pública." } From 71aa3d9487f2a1c3e288d1fe228cf8fd469ff368 Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:23:36 +0000 Subject: [PATCH 178/319] Translated using Weblate (Spanish) Currently translated at 77.9% (1793 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 3edebaff1a..76d07172fa 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1828,5 +1828,8 @@ "Something went wrong with your invite to %(roomName)s": "Algo salió a mal invitando a %(roomName)s", "You can only join it with a working invite.": "Sólo puedes unirte con una invitación que funciona.", "Try to join anyway": "Intentar unirse de todas formas", - "You can still join it because this is a public room.": "Todavía puedes unirte, ya que es una sala pública." + "You can still join it because this is a public room.": "Todavía puedes unirte, ya que es una sala pública.", + "Join the discussion": "Unirse a la discusión", + "Do you want to chat with %(user)s?": "¿Quieres chatear con %(user)s?", + "Do you want to join %(roomName)s?": "¿Quieres unirte a %(roomName)s?" } From b8910580a486696fe18dba93a45dc79bc7efa57c Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:24:03 +0000 Subject: [PATCH 179/319] Translated using Weblate (Spanish) Currently translated at 78.0% (1796 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 76d07172fa..dd6f930b0c 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1831,5 +1831,5 @@ "You can still join it because this is a public room.": "Todavía puedes unirte, ya que es una sala pública.", "Join the discussion": "Unirse a la discusión", "Do you want to chat with %(user)s?": "¿Quieres chatear con %(user)s?", - "Do you want to join %(roomName)s?": "¿Quieres unirte a %(roomName)s?" + "Do you want to join %(roomName)s?": "¿Quieres unirte a la sala %(roomName)s?" } From 8881758186f5aa5f7c300bfdfead3c0ed79bfb5a Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:24:19 +0000 Subject: [PATCH 180/319] Translated using Weblate (Spanish) Currently translated at 78.0% (1796 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index dd6f930b0c..272dfb121b 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1831,5 +1831,8 @@ "You can still join it because this is a public room.": "Todavía puedes unirte, ya que es una sala pública.", "Join the discussion": "Unirse a la discusión", "Do you want to chat with %(user)s?": "¿Quieres chatear con %(user)s?", - "Do you want to join %(roomName)s?": "¿Quieres unirte a la sala %(roomName)s?" + "Do you want to join %(roomName)s?": "¿Quieres unirte a la sala %(roomName)s?", + " invited you": " te ha invitado", + "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", + "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s no se puede previsualizar. ¿Quieres unirte?" } From d2d267421e9435e95fc2f00feb3a13a429ec834a Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:25:48 +0000 Subject: [PATCH 181/319] Translated using Weblate (Spanish) Currently translated at 78.0% (1797 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 272dfb121b..a4f12f4778 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1834,5 +1834,5 @@ "Do you want to join %(roomName)s?": "¿Quieres unirte a la sala %(roomName)s?", " invited you": " te ha invitado", "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", - "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s no se puede previsualizar. ¿Quieres unirte?" + "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?" } From d331b2d232533db8f690543bdab5336ec42526ee Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:26:05 +0000 Subject: [PATCH 182/319] Translated using Weblate (Spanish) Currently translated at 78.0% (1797 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index a4f12f4778..5f3f197cfc 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1834,5 +1834,6 @@ "Do you want to join %(roomName)s?": "¿Quieres unirte a la sala %(roomName)s?", " invited you": " te ha invitado", "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", - "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?" + "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", + "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de que la sala es correcta?" } From 49a531287fbcc88bd000deb30a561887fa7c39ed Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:26:41 +0000 Subject: [PATCH 183/319] Translated using Weblate (Spanish) Currently translated at 78.1% (1798 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 5f3f197cfc..4356129ed2 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1835,5 +1835,5 @@ " invited you": " te ha invitado", "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", - "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de que la sala es correcta?" + "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?" } From ddaac161dba5558d484716d5caca559f766967ba Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:26:56 +0000 Subject: [PATCH 184/319] Translated using Weblate (Spanish) Currently translated at 78.1% (1798 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 4356129ed2..010d714cf7 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1835,5 +1835,6 @@ " invited you": " te ha invitado", "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", - "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?" + "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?", + "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide a algún administrador de la sala que compruebe si tienes acceso." } From cfe5fc15fb23b8cfdff082a3d465d8b8ee4579c7 Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:27:42 +0000 Subject: [PATCH 185/319] Translated using Weblate (Spanish) Currently translated at 78.1% (1799 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 010d714cf7..8ce59bca92 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1836,5 +1836,5 @@ "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?", - "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide a algún administrador de la sala que compruebe si tienes acceso." + "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide que un administrador de la sala compruebe si tienes acceso." } From 93266aedede97a4661e159d58c682bfecb82d98a Mon Sep 17 00:00:00 2001 From: pebles Date: Sun, 10 May 2020 21:28:13 +0000 Subject: [PATCH 186/319] Translated using Weblate (Spanish) Currently translated at 78.1% (1799 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 8ce59bca92..45baa42f58 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1836,5 +1836,6 @@ "You're previewing %(roomName)s. Want to join it?": "Estás previsualizando %(roomName)s. ¿Quieres unirte?", "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?", - "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide que un administrador de la sala compruebe si tienes acceso." + "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide que un administrador de la sala compruebe si tienes acceso.", + "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s fue devuelto al intentar acceder a la sala. Si crees que no deberías ver el mensaje de error, por favor comunícanos el bug." } From 76d054bbf3025956aec248240ca0c01e5712c9f2 Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:29:15 +0000 Subject: [PATCH 187/319] Translated using Weblate (Spanish) Currently translated at 78.1% (1799 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 45baa42f58..3cb39a4b45 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1837,5 +1837,5 @@ "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?", "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide que un administrador de la sala compruebe si tienes acceso.", - "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s fue devuelto al intentar acceder a la sala. Si crees que no deberías ver el mensaje de error, por favor comunícanos el bug." + "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s fue devuelto al intentar acceder a la sala. Si crees que no deberías ver el mensaje, por favor somete un reporte de error." } From 662077fe67fdb363562c48d13c13318b54a4a00c Mon Sep 17 00:00:00 2001 From: Sejo Date: Sun, 10 May 2020 21:31:12 +0000 Subject: [PATCH 188/319] Translated using Weblate (Spanish) Currently translated at 78.1% (1799 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 3cb39a4b45..17ddee917f 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -537,7 +537,7 @@ "Event Type": "Tipo de Evento", "No rooms to show": "No hay salas para mostrar", "Download this file": "Descargar este archivo", - "Pin Message": "Marcar Mensaje", + "Pin Message": "Fija Mensaje", "Failed to change settings": "Error al cambiar los ajustes", "View Community": "Ver la comunidad", "Developer Tools": "Herramientas de desarrollo", From 19e8f16da6ececcf8c4d4ae208ec457f5fd542b8 Mon Sep 17 00:00:00 2001 From: "Pepper.Cabbit.Snoopy" Date: Sun, 10 May 2020 09:41:39 +0000 Subject: [PATCH 189/319] Translated using Weblate (Chinese (Simplified)) Currently translated at 60.7% (1399 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 70 +++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 58e4130d99..4eff773d1c 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -724,7 +724,7 @@ "Noisy": "响铃", "Error saving email notification preferences": "保存电子邮件通知选项时出错", "Messages containing my display name": "消息中含有我的显示名称", - "Messages in one-to-one chats": "一对一聊天种的消息", + "Messages in one-to-one chats": "一对一聊天中的消息", "Unavailable": "无法获得", "View Decrypted Source": "查看解密的来源", "Failed to update keywords": "无法更新关键词", @@ -1354,8 +1354,8 @@ "Please install Chrome, Firefox, or Safari for the best experience.": "请安装 ChromeFirefox,或 Safari 以获得最佳体验。", "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. 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.": "警告:升级聊天室 不会自动将聊天室成员转移到新版聊天室中。 我们将会在旧版聊天室中发布一个新版聊天室的链接 - 聊天室成员必须点击该链接以加入新聊天室。", "Adds a custom widget by URL to the room": "用链接方式为聊天室添加自定义小部件", - "Please supply a https:// or http:// widget URL": "请提供一个 https:// 或 http:// 形式的小部件链接", - "You cannot modify widgets in this room.": "您无法修改此聊天室的小部件。", + "Please supply a https:// or http:// widget URL": "请提供一个 https:// 或 http:// 形式的插件", + "You cannot modify widgets in this room.": "您无法修改此聊天室的插件。", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s 撤销了对 %(targetDisplayName)s 加入聊天室的邀请。", "Upgrade this room to the recommended room version": "升级此聊天室至推荐版本", "This room is running room version , which this homeserver has marked as unstable.": "此聊天室运行的聊天室版本是 ,该版本已被主服务器标记为 不稳定 。", @@ -1381,5 +1381,67 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "请联系您主服务器(%(homeserverDomain)s)的管理员设置 TURN 服务器来确保通话运作稳定。", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "您也可以尝试使用turn.matrix.org公共服务器,但通话质量稍差,并且其将会得知您的 IP。您可以在设置中更改此选项。", "Try using turn.matrix.org": "尝试使用 turn.matrix.org", - "Your Riot is misconfigured": "您的 Riot 配置有错误" + "Your Riot is misconfigured": "您的 Riot 配置有错误", + "Use Single Sign On to continue": "使用单点登陆继续", + "Confirm adding this email address by using Single Sign On to prove your identity.": "确认添加此邮件地址,通过使用单点登陆来证明您的身份。", + "Single Sign On": "单点登陆", + "Confirm adding email": "确认使用邮件", + "Click the button below to confirm adding this email address.": "点击下面的按钮,添加此邮箱地址。", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "通过单点确认添加此电话号码以确认您的身份。", + "Confirm adding phone number": "确认添加电话号码", + "Click the button below to confirm adding this phone number.": "点击下面的按钮,确认添加此电话号码。", + "The version of Riot": "Riot版本", + "Whether you're using Riot on a device where touch is the primary input mechanism": "是否在触屏设备上使用Riot", + "Whether you're using Riot as an installed Progressive Web App": "您是否已经安装Riot作为一种渐进式的Web应用", + "Your user agent": "您的代理用户", + "The information being sent to us to help make Riot better includes:": "发送信息给我们以帮助Riot:", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "聊天室有未知会话:如果您选择继续而不是验证他们,则您的电话可能会被窃听。", + "Review Sessions": "审查会议", + "Replying With Files": "回复文件", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "无法回复此文件。您要上传此文件但无需回复吗?", + "The file '%(fileName)s' failed to upload.": "上传文件 ‘%(fileName)s’失败。", + "The server does not support the room version specified.": "服务器不支持指定的聊天室版本。", + "If you cancel now, you won't complete verifying the other user.": "如果现在取消,您将无法完成验证其他用户。", + "If you cancel now, you won't complete verifying your other session.": "如果现在取消,您将无法完成验证您的其他会话。", + "If you cancel now, you won't complete your operation.": "如果现在取消,您将无法完成您的操作。", + "Cancel entering passphrase?": "取消输入密码?", + "Setting up keys": "设置按键", + "Verify this session": "验证此会话", + "Encryption upgrade available": "提供加密升级", + "Set up encryption": "设置加密", + "Review where you’re logged in": "查看您的登陆位置", + "New login. Was this you?": "现在登陆。请问是您本人吗?", + "Name or Matrix ID": "姓名或Matrix账号", + "Identity server has no terms of service": "身份服务器无服务条款", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "此操作需要访问默认的身份服务器以验证电子邮件地址或电话号码,但是此服务器无任何服务条款。", + "Only continue if you trust the owner of the server.": "只有您信任服务器所有者才能继续。", + "Trust": "信任", + "%(name)s is requesting verification": "%(name)s请求验证", + "Sign In or Create Account": "登录或创建账户", + "Use your account or create a new one to continue.": "使用已有账户或创建一个新账户。", + "Create Account": "创建账户", + "Sign In": "登录", + "Custom (%(level)s)": "访客(%(level)s)", + "Messages": "信息", + "Actions": "动作", + "Sends a message as plain text, without interpreting it as markdown": "以纯文本形式发送消息,而不是markdown", + "Sends a message as html, without interpreting it as markdown": "以html格式发送消息,而不是markdown", + "You do not have the required permissions to use this command.": "您没有权限使用此命令。", + "Error upgrading room": "升级聊天室出错", + "Double check that your server supports the room version chosen and try again.": "再次检查您的服务器是否支持所选聊天室版本,然后重试。", + "Changes the avatar of the current room": "更改当前聊天室头像", + "Changes your avatar in this current room only": "仅改变您在当前聊天室的头像", + "Changes your avatar in all rooms": "改变您在所有聊天室的头像", + "Failed to set topic": "设置话题失败", + "Use an identity server": "使用身份服务器", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "使用身份服务器通过电子邮件邀请。单击继续以使用默认身份服务器(%(defaultIdentityServerName)s)或在设置中进行管理。", + "Use an identity server to invite by email. Manage in Settings.": "使用身份服务器以电子邮件邀请。在设置中进行管理。", + "Unbans user with given ID": "禁止给定ID的用户", + "Command failed": "命令失败", + "Could not find user in room": "聊天室中无用户", + "Please supply a widget URL or embed code": "请提供一个插件或嵌入代码", + "Verifies a user, session, and pubkey tuple": "验证用户、会话和公钥元组", + "Unknown (user, session) pair:": "未知(用户、会话)对:", + "Session already verified!": "会话已验证!", + "WARNING: Session already verified, but keys do NOT MATCH!": "警告:会话已验证,但密钥不匹配!" } From 8cd04a5f3201f32a52382582cee56575d181aff5 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 9 May 2020 02:15:35 +0000 Subject: [PATCH 190/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2303 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 85bbaaabc1..ba8ffa0fcb 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2419,5 +2419,7 @@ "Successfully restored %(sessionCount)s keys": "成功復原 %(sessionCount)s 金鑰", "You signed in to a new session without verifying it:": "您已登入新的工作階段但未驗證:", "Verify your other session using one of the options below.": "使用下方的其中一個選項來驗證您其他的工作階段。", - "Invite someone using their name, username (like ), email address or share this room.": "使用某人的名字、使用者名稱(如 )、電子郵件地址或分享此聊天室來邀請他們。" + "Invite someone using their name, username (like ), email address or share this room.": "使用某人的名字、使用者名稱(如 )、電子郵件地址或分享此聊天室來邀請他們。", + "Message deleted": "訊息已刪除", + "Message deleted by %(name)s": "訊息已被 %(name)s 刪除" } From b5e10b4464be71535daeb8494b3ee8cc12a77f47 Mon Sep 17 00:00:00 2001 From: "J. A. Durieux" Date: Sat, 9 May 2020 13:49:33 +0000 Subject: [PATCH 191/319] Translated using Weblate (Dutch) Currently translated at 91.9% (2117 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 46 ++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 19f626bc0a..5dfb779ff1 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -247,8 +247,8 @@ "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-vergadering aangevraagd.", "Results from DuckDuckGo": "Resultaten van DuckDuckGo", "Return to login screen": "Terug naar het aanmeldscherm", - "Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen toestemming om u meldingen te versturen - controleer uw browserinstellingen", - "Riot was not given permission to send notifications - please try again": "Riot kreeg geen toestemming om u meldingen te sturen - probeer het opnieuw", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen toestemming u meldingen te sturen - controleer uw browserinstellingen", + "Riot was not given permission to send notifications - please try again": "Riot kreeg geen toestemming u meldingen te sturen - probeer het opnieuw", "riot-web version:": "riot-web-versie:", "Room %(roomId)s not visible": "Gesprek %(roomId)s is niet zichtbaar", "Room Colour": "Gesprekskleur", @@ -526,7 +526,7 @@ "Unknown for %(duration)s": "Onbekend voor %(duration)s", "Unknown": "Onbekend", "Replying": "Aan het beantwoorden", - "No rooms to show": "Geen gesprekken om weer te geven", + "No rooms to show": "Geen weer te geven gesprekken", "Unnamed room": "Naamloos gesprek", "World readable": "Leesbaar voor iedereen", "Guests can join": "Gasten kunnen toetreden", @@ -1376,7 +1376,7 @@ "You have %(count)s unread notifications in a prior version of this room.|one": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Of u de icoontjes voor recente gesprekken (boven de gesprekkenlijst) al dan niet gebruikt", "Replying With Files": "Beantwoorden met bestanden", - "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Momenteel is het niet mogelijk om met een bestand te antwoorden. Wilt u dit bestand uploaden zonder te antwoorden?", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Het is momenteel niet mogelijk met een bestand te antwoorden. Wilt u dit bestand uploaden zonder te antwoorden?", "The file '%(fileName)s' failed to upload.": "Het bestand ‘%(fileName)s’ kon niet geüpload worden.", "Rotate counter-clockwise": "Tegen de klok in draaien", "Rotate clockwise": "Met de klok mee draaien", @@ -1554,7 +1554,7 @@ "Command Help": "Hulp bij opdrachten", "No identity server is configured: add one in server settings to reset your password.": "Er is geen identiteitsserver geconfigureerd: voeg er één toe in de serverinstellingen om uw wachtwoord opnieuw in te stellen.", "Call failed due to misconfigured server": "Oproep mislukt door verkeerd geconfigureerde server", - "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vraag de beheerder van uw thuisserver (%(homeserverDomain)s) om een TURN-server te configureren teneinde oproepen betrouwbaar te doen werken.", + "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vraag uw thuisserverbeheerder (%(homeserverDomain)s) een TURN-server te configureren teneinde oproepen betrouwbaar te doen werken.", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "U kunt ook de publieke server op turn.matrix.org gebruiken, maar dit zal minder betrouwbaar zijn, en zal uw IP-adres met die server delen. U kunt dit ook beheren in de Instellingen.", "Try using turn.matrix.org": "Probeer turn.matrix.org te gebruiken", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Sta de terugvalserver voor oproepbijstand turn.matrix.org toe wanneer uw thuisserver er geen aanbiedt (uw IP-adres wordt gedeeld gedurende een oproep)", @@ -1682,7 +1682,7 @@ "Help": "Hulp", "Set up encryption": "Versleuteling instellen", "Unverified session": "Ongeverifieerde sessie", - "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Dit vergt toegang tot de standaardidentiteitsserver om een e-mailadres of telefoonnummer te valideren, maar die server heeft geen gebruiksvoorwaarden.", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Dit vergt validatie van een e-mailadres of telefoonnummer middels de standaardidentiteitsserver , maar die server heeft geen gebruiksvoorwaarden.", "Trust": "Vertrouwen", "Custom (%(level)s)": "Aangepast (%(level)s)", "Error upgrading room": "Bijwerken van gesprek mislukt", @@ -2168,5 +2168,37 @@ "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s van %(totalRooms)s", "Unverified login. Was this you?": "Ongeverifieerde aanmelding. Was u dit?", "Where you’re logged in": "Waar u aangemeld bent", - "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Beheer hieronder de namen van uw sessies en meld ze af. Of verifieer ze in uw gebruikersprofiel." + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Beheer hieronder de namen van uw sessies en meld ze af. Of verifieer ze in uw gebruikersprofiel.", + "Use Single Sign On to continue": "Ga verder met Eenmalige Aanmelding", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Bevestig uw identiteit met Eenmalige Aanmelding om dit emailadres toe te voegen.", + "Single Sign On": "Eenmalige Aanmelding", + "Confirm adding email": "Bevestig toevoegen van het e-mailadres", + "Click the button below to confirm adding this email address.": "Klik op de knop hieronder om dit e-mailadres toe te voegen.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bevestig uw identiteit met Eenmalige Aanmelding om dit telefoonnummer toe te voegen.", + "Confirm adding phone number": "Bevestig toevoegen van het telefoonnummer", + "Click the button below to confirm adding this phone number.": "Klik op de knop hieronder om het toevoegen van dit telefoonnummer te bevestigen.", + "Review Sessions": "Sessieverificatie", + "If you cancel now, you won't complete your operation.": "Als u de operatie afbreekt kunt u haar niet voltooien.", + "Review where you’re logged in": "Kijk na waar u aangemeld bent", + "New login. Was this you?": "Nieuwe aanmelding - was u dat?", + "%(name)s is requesting verification": "%(name)s verzoekt om verificatie", + "Sends a message as html, without interpreting it as markdown": "Stuurt een bericht als HTML, zonder markdown toe te passen", + "Failed to set topic": "Kon onderwerp niet instellen", + "Command failed": "Opdracht mislukt", + "Could not find user in room": "Kon die deelnemer aan het gesprek niet vinden", + "Please supply a widget URL or embed code": "Gelieve een widgetURL of in te bedden code te geven", + "Send a bug report with logs": "Rapporteer een fout, met foutopsporingslogboek bijgesloten", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s heeft het gesprek %(oldRoomName)s hernoemd tot %(newRoomName)s.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s heeft dit gesprek de nevenadressen %(addresses)s toegekend.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s heeft dit gesprek het nevenadres %(addresses)s toegekend.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s heeft de nevenadressen %(addresses)s voor dit gesprek geschrapt.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s heeft het nevenadres %(addresses)s voor dit gesprek geschrapt.", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s heeft de nevenadressen voor dit gesprek gewijzigd.", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s heeft hoofd- en nevenadressen voor dit gesprek gewijzigd.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s heeft de adressen voor dit gesprek gewijzigd.", + "You signed in to a new session without verifying it:": "U heeft zich bij een nog niet geverifieerde sessie aangemeld:", + "Verify your other session using one of the options below.": "Verifieer uw andere sessie op een van onderstaande wijzen.", + "Manually Verify by Text": "Handmatig middels een tekst", + "Interactively verify by Emoji": "Interactief middels emojis", + "Support adding custom themes": "Sta maatwerkthema's toe" } From 943eb57b15fcc8166a660d8baffc3eb838e800c2 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Sat, 9 May 2020 10:01:46 +0000 Subject: [PATCH 192/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2303 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 50 +++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 5d6ac9ed48..5e63974d12 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -97,7 +97,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s ŝanĝis sian profilbildon.", "%(senderName)s set a profile picture.": "%(senderName)s agordis profilbildon.", "VoIP conference started.": "Rettelefona voko komenciĝis.", - "%(targetName)s joined the room.": "%(targetName)s venis en la ĉambro.", + "%(targetName)s joined the room.": "%(targetName)s venis en la ĉambron.", "VoIP conference finished.": "Rettelefona voko finiĝis.", "%(targetName)s rejected the invitation.": "%(targetName)s rifuzis la inviton.", "%(targetName)s left the room.": "%(targetName)s forlasis la ĉambron.", @@ -246,7 +246,7 @@ "Unpin Message": "Malfiksi mesaĝon", "Jump to message": "Salti al mesaĝo", "No pinned messages.": "Neniuj fiksitaj mesaĝoj.", - "Loading...": "Enleganta…", + "Loading...": "Enlegante…", "Pinned Messages": "Fiksitaj mesaĝoj", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", @@ -481,7 +481,7 @@ "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se vi antaŭe uzis pli novan version de Riot, via salutaĵo eble ne akordos kun ĉi tiu versio. Fermu ĉi tiun fenestron kaj revenu al la pli nova versio.", "Invalid Email Address": "Malvalida retpoŝtadreso", "This doesn't appear to be a valid email address": "Tio ĉi ne ŝajnas esti valida retpoŝtadreso", - "Verification Pending": "Atendanta kontrolon", + "Verification Pending": "Atendante kontrolon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Bonvolu kontroli vian retpoŝton, kaj alklaki la ligilon enhavatan en la sendita mesaĝo. Farinte tion, klaku je 'daŭrigi'.", "Unable to add email address": "Ne povas aldoni retpoŝtadreson", "Unable to verify email address.": "Retpoŝtadreso ne kontroleblas.", @@ -567,9 +567,9 @@ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Provis enlegi certan parton de ĉi tiu historio, sed vi ne havas permeson vidi ĝin.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Provis enlegi certan parton de ĉi tiu historio, sed malsukcesis ĝin trovi.", "Failed to load timeline position": "Malsukcesis enlegi lokon en historio", - "Uploading %(filename)s and %(count)s others|other": "Alŝutanta dosieron %(filename)s kaj %(count)s aliajn", - "Uploading %(filename)s and %(count)s others|zero": "Alŝutanta dosieron %(filename)s", - "Uploading %(filename)s and %(count)s others|one": "Alŝutanta dosieron %(filename)s kaj %(count)s alian", + "Uploading %(filename)s and %(count)s others|other": "Alŝutante dosieron %(filename)s kaj %(count)s aliajn", + "Uploading %(filename)s and %(count)s others|zero": "Alŝutante dosieron %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Alŝutante dosieron %(filename)s kaj %(count)s alian", "Light theme": "Hela haŭto", "Dark theme": "Malhela haŭto", "Sign out": "Adiaŭi", @@ -731,7 +731,7 @@ "Members": "Anoj", "No update available.": "Neniuj ĝisdatigoj haveblas.", "Resend": "Resendi", - "Collecting app version information": "Kolektanta informon pri versio de la aplikaĵo", + "Collecting app version information": "Kolektante informon pri versio de la aplikaĵo", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la ujo?", "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto", "Invite to this community": "Inviti al tiu ĉi komunumo", @@ -766,7 +766,7 @@ "Send logs": "Sendi protokolojn", "All messages": "Ĉiuj mesaĝoj", "Call invitation": "Invito al voko", - "Downloading update...": "Elŝutanta ĝisdatigon…", + "Downloading update...": "Elŝutante ĝisdatigon…", "State Key": "Stata ŝlosilo", "Failed to send custom event.": "Malsukcesis sendi propran okazon.", "What's new?": "Kio novas?", @@ -810,12 +810,12 @@ "View Source": "Vidi fonton", "Event Content": "Enhavo de okazo", "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!": "Kun via nuna foliumilo, la aspekto kaj funkciado de la aplikaĵo povas esti tute malĝusta, kaj kelkaj aŭ ĉiu funkcioj eble ne tute funkcios. Se vi tamen volas provi, vi povas daŭrigi, sed vi ricevos nenian subtenon se vi renkontos problemojn!", - "Checking for an update...": "Serĉanta ĝisdatigojn…", + "Checking for an update...": "Serĉante ĝisdatigojn…", "There are advanced notifications which are not shown here": "Ekzistas specialaj sciigoj, kiuj ne montriĝas ĉi tie", "Logs sent": "Protokolo sendiĝis", "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.": "Sencimigaj protokoloj enhavas informojn pri uzo de aplikaĵo, inkluzive vian uzantonomon, la identigilojn aŭ nomojn de la ĉambroj aŭ grupoj kiujn vi vizitis, kaj la uzantonomojn de aliaj uzantoj. Ili ne enhavas mesaĝojn.", "Failed to send logs: ": "Malsukcesis sendi protokolon: ", - "Preparing to send logs": "Pretiganta sendon de protokolo", + "Preparing to send logs": "Pretigante sendon de protokolo", "e.g. %(exampleValue)s": "ekz. %(exampleValue)s", "Every page you use in the app": "Ĉiu paĝo kiun vi uzas en la aplikaĵo", "e.g. ": "ekz. ", @@ -844,7 +844,7 @@ "Opens the Developer Tools dialog": "Maflermas evoluigistan interagujon", "This homeserver has hit its Monthly Active User limit.": "Tiu ĉi hejmservilo atingis sian monatan limon de aktivaj uzantoj.", "This homeserver has exceeded one of its resource limits.": "Tiu ĉi hejmservilo superis je unu el siaj risurcaj limoj.", - "Unable to connect to Homeserver. Retrying...": "Ne povas konektiĝi al hejmservilo. Reprovanta…", + "Unable to connect to Homeserver. Retrying...": "Ne povas konektiĝi al hejmservilo. Reprovante…", "You do not have permission to invite people to this room.": "Vi ne havas permeson inviti homojn al la ĉambro.", "User %(user_id)s does not exist": "Uzanto %(user_id)s ne ekzistas", "Unknown server error": "Nekonata servila eraro", @@ -883,7 +883,7 @@ "Language and region": "Lingvo kaj regiono", "Theme": "Haŭto", "General": "Ĝenerala", - "In reply to ": "Respondanta al ", + "In reply to ": "Respondante al ", "Share Message": "Diskonigi", "Whether or not you're logged in (we don't record your username)": "Ĉu vi salutis aŭ ne (ni ne registras vian uzantonomon)", "You do not have permission to start a conference call in this room": "Vi ne havas permeson komenci grupvokon en ĉi tiu ĉambro", @@ -980,7 +980,7 @@ "Internal room ID:": "Ena ĉambra identigilo:", "Room version": "Ĉambra versio", "Room version:": "Ĉambra versio:", - "Developer options": "Verkantaj opcioj", + "Developer options": "Programistaj elektebloj", "Room Addresses": "Ĉambra adresoj", "Change room avatar": "Ŝanĝi profilbildon de ĉambro", "Change room name": "Ŝanĝi nomon de ĉambro", @@ -1142,7 +1142,7 @@ "Custom user status messages": "Propraj uzantoaj statmesaĝoj", "Group & filter rooms by custom tags (refresh to apply changes)": "Grupigi kaj filtri ĉambrojn per propraj etikedoj (aktualigu por ŝanĝojn apliki)", "Restore from Backup": "Rehavi el savkopio", - "Backing up %(sessionsRemaining)s keys...": "Savkopianta %(sessionsRemaining)s ŝlosilojn…", + "Backing up %(sessionsRemaining)s keys...": "Savkopiante %(sessionsRemaining)s ŝlosilojn…", "All keys backed up": "Ĉiuj ŝlosiloj estas savkopiitaj", "Backup version: ": "Versio de savkopio: ", "Algorithm: ": "Algoritmo: ", @@ -1198,9 +1198,9 @@ "This room has already been upgraded.": "Ĉi tiu ĉambro jam gradaltiĝis.", "This room is running room version , which this homeserver has marked as unstable.": "Ĉi tiu ĉambro uzas ĉambran version , kiun la hejmservilo markis kiel nestabilan.", "Your Riot is misconfigured": "Via kliento Riot estas misagordita", - "Joining room …": "Aliĝanta al ĉambro …", - "Loading …": "Enleganta …", - "Rejecting invite …": "Rifuzanta inviton …", + "Joining room …": "Aliĝante al ĉambro …", + "Loading …": "Enlegante …", + "Rejecting invite …": "Rifuzante inviton …", "Join the conversation with an account": "Aliĝu al la interparolo per konto", "Sign Up": "Registriĝi", "Sign In": "Saluti", @@ -1241,9 +1241,9 @@ "Use Legacy Verification (for older clients)": "Uzi malnovecan kontrolon (por malnovaj klientoj)", "Verify by comparing a short text string.": "Kontrolu per komparo de mallonga teksto.", "Begin Verifying": "Komenci kontrolon", - "Waiting for partner to accept...": "Atendanta akcepton de kunulo…", + "Waiting for partner to accept...": "Atendante akcepton de kunulo…", "Nothing appearing? Not all clients support interactive verification yet. .": "Ĉu neniu aperas? Ankoraŭ ne ĉiuj klientoj subtenas interagan kontrolon. .", - "Waiting for %(userId)s to confirm...": "Atendanta konfirmon de %(userId)s…", + "Waiting for %(userId)s to confirm...": "Atendante konfirmon de %(userId)s…", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Kontrolu ĉi tiun uzanton por marki ĝin fidata. Fidado devas vin trankviligi dum uzado de tutvoja ĉifrado.", "Waiting for partner to confirm...": "Atendas konfirmon de kunulo…", "Incoming Verification Request": "Venas kontrolpeto", @@ -1507,7 +1507,7 @@ "Confirm your passphrase": "Konfirmu vian pasfrazon", "Recovery key": "Rehava ŝlosilo", "Keep it safe": "Sekurigu ĝin", - "Starting backup...": "Komencanta savkopion…", + "Starting backup...": "Komencante savkopion…", "Create Key Backup": "Krei savkopion de ŝlosiloj", "Unable to create key backup": "Ne povas krei savkopion de ŝlosiloj", "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Sen agordo de Sekura rehavo de mesaĝoj, vi perdos vian sekuran historion de mesaĝoj per adiaŭo.", @@ -1695,7 +1695,7 @@ "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Bloki aliĝojn al ĉi tiu ĉambro de uzantoj el aliaj Matrix-serviloj (Ĉi tiun agordon ne eblas poste ŝanĝi!)", "Please fill why you're reporting.": "Bonvolu skribi, kial vi raportas.", "Report Content to Your Homeserver Administrator": "Raporti enhavon al la administrantode via hejmservilo", - "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Per raporto de ĝi tiu mesaĝo vi sendos ĝian unikan « eventan identigilon » al la administranto de via hejmservilo. Se mesaĝoj en ĉi tiu ĉambro estas ĉifrataj, la administranto de via hejmservilo ne povos legi la tekston de la mesaĝo, nek rigardi dosierojn aŭ bildojn.", + "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Per raporto de ĉi tiu mesaĝo vi sendos ĝian unikan « eventan identigilon » al la administranto de via hejmservilo. Se mesaĝoj en ĉi tiu ĉambro estas ĉifrataj, la administranto de via hejmservilo ne povos legi la tekston de la mesaĝo, nek rigardi dosierojn aŭ bildojn.", "Send report": "Sendi raporton", "Command Help": "Helpo pri komando", "To continue you need to accept the terms of this service.": "Por pluigi, vi devas akcepti la uzokondiĉojn de ĉi tiu servo.", @@ -1834,7 +1834,7 @@ "Double check that your server supports the room version chosen and try again.": "Bone kontrolu, ĉu via servilo subtenas la elektitan version de ĉambro, kaj reprovu.", "Verifies a user, session, and pubkey tuple": "Kontrolas opon de uzanto, salutaĵo, kaj publika ŝlosilo", "Unknown (user, session) pair:": "Nekonata duopo (uzanto, salutaĵo):", - "Session already verified!": "Kunsido jam estas kontrolita!", + "Session already verified!": "Salutaĵo jam estas kontrolita!", "WARNING: Session already verified, but keys do NOT MATCH!": "AVERTO: Salutaĵo jam estas kontrolita, sed la ŝlosiloj NE AKORDAS!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVERTO: MALSUKCESIS KONTROLO DE ŜLOSILOJ! La subskriba ŝlosilo de %(userId)s kaj session %(deviceId)s estas «%(fprint)s», kiu ne akordas la donitan ŝlosilon «%(fingerprint)s». Tio povus signifi, ke via komunikado estas spionata!", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "La subskriba ŝlosilo, kiun vi donis, akordas la subskribas ŝlosilon, kinu vi ricevis de la salutaĵo %(deviceId)s de la uzanto %(userId)s. Salutaĵo estis markita kontrolita.", @@ -1856,7 +1856,7 @@ "Confirm the emoji below are displayed on both devices, in the same order:": "Konfirmu, ke la ĉi-subaj bildsignoj estas montrataj sur ambaŭ aparatoj, samorde:", "Verify this device by confirming the following number appears on its screen.": "Kontrolu ĉi tiun aparaton per kontrolo, ke la jena nombro aperas sur ĝia ekrano.", "Waiting for %(displayName)s to verify…": "Atendas kontrolon de %(displayName)s…", - "Cancelling…": "Nuliganta…", + "Cancelling…": "Nuligante…", "They match": "Ili akordas", "They don't match": "Ili ne akordas", "To be secure, do this in person or use a trusted way to communicate.": "Por plia sekureco, faru tion persone, aŭ uzu alian fidatan komunikilon.", @@ -2394,5 +2394,7 @@ "Secure your backup with a recovery passphrase": "Sekurigu vian savkopion per rehava pasfrazo", "Currently indexing: %(currentRoom)s": "Nun indeksante: %(currentRoom)s", "Cancel replying to a message": "Nuligi respondon al mesaĝo", - "Invite someone using their name, username (like ), email address or share this room.": "Invitu iun per ĝia nomo, uzantonomo (kiel ), retpoŝtadreso, aŭ kunhavigu la ĉambron." + "Invite someone using their name, username (like ), email address or share this room.": "Invitu iun per ĝia nomo, uzantonomo (kiel ), retpoŝtadreso, aŭ kunhavigu la ĉambron.", + "Message deleted": "Mesaĝo foriĝis", + "Message deleted by %(name)s": "Mesaĝon forigis %(name)s" } From 64459f18c6a18cfa80b705c00c6f23c1536f033c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 10 May 2020 16:31:22 +0000 Subject: [PATCH 193/319] Translated using Weblate (Estonian) Currently translated at 41.6% (959 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 47afbd1fcd..e2d4e93e43 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -938,5 +938,28 @@ "Do you want to set an email address?": "Kas sa soovid seadistada e-posti aadressi?", "Close dialog": "Sulge dialoog", "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Meeldetuletus: sinu brauser ei ole toetatud ja seega rakenduse kasutuskogemus võib olla ennustamatu.", - "Toggle this dialog": "Lülita see dialoog sisse/välja" + "Toggle this dialog": "Lülita see dialoog sisse/välja", + "Enter your password to sign in and regain access to your account.": "Sisselogimiseks ja oma kontole ligipääsu saamiseks sisesta oma salasõna.", + "Forgotten your password?": "Kas sa unustasid oma salasõna?", + "Sign in and regain access to your account.": "Logi sisse ja pääse tagasi oma kasutajakonto juurde.", + "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Sa ei saa oma kasutajakontole sisse logida. Lisateabe saamiseks palun võta ühendust oma koduserveri halduriga.", + "Your recovery key": "Sinu taastevõti", + "Your recovery key has been copied to your clipboard, paste it to:": "Sinu taastevõti on kopeeritud lõikelauale, aseta ta:", + "Print it and store it somewhere safe": "Trüki ta välja ja hoia turvalises kohas", + "Save it on a USB key or backup drive": "Salvesta ta mälupulgale või varunduskettale", + "Copy it to your personal cloud storage": "Kopeeri ta isiklikku andmehoidlasse mis asub pilves", + "Retry": "Proovi uuesti", + "Upgrade your encryption": "Uuenda oma krüptimist", + "Make a copy of your recovery key": "Tee oma taastevõtmest koopia", + "You're done!": "Valmis!", + "Go to Settings": "Ava seadistused", + "Set up Secure Messages": "Võta kasutusele krüptitud sõnumid", + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s / %(totalRooms)s", + "Message downloading sleep time(ms)": "Paus millisekundites sõnumite allalaadimisel", + "Scroll up/down in the timeline": "Liigu ajajoonel üles/alla", + "Previous/next unread room or DM": "Eelmine/järgmine lugemata otsevestlus või sõnum jututoas", + "Previous/next room or DM": "Eelmine/järgmine otsevestlus või jututuba", + "Toggle the top left menu": "Lülita ülemine vasak menüü sisse/välja", + "Activate selected button": "Aktiveeri valitud nupp", + "Toggle right panel": "Lülita parem paan sisse/välja" } From 4b7aa45445a06401a113f706d25bb3434602f97a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Sat, 9 May 2020 06:25:29 +0000 Subject: [PATCH 194/319] Translated using Weblate (French) Currently translated at 100.0% (2303 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index b7344b592f..1756ff57ad 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2420,5 +2420,7 @@ "Successfully restored %(sessionCount)s keys": "%(sessionCount)s clés ont été restaurées avec succès", "You signed in to a new session without verifying it:": "Vous vous êtes connecté·e à une nouvelle session sans la vérifier :", "Verify your other session using one of the options below.": "Vérifiez votre autre session en utilisant une des options ci-dessous.", - "Invite someone using their name, username (like ), email address or share this room.": "Invitez quelqu’un en utilisant leur nom, leur nom d’utilisateur (comme ), leur adresse e-mail ou partagez ce salon." + "Invite someone using their name, username (like ), email address or share this room.": "Invitez quelqu’un en utilisant leur nom, leur nom d’utilisateur (comme ), leur adresse e-mail ou partagez ce salon.", + "Message deleted": "Message supprimé", + "Message deleted by %(name)s": "Message supprimé par %(name)s" } From bd79086702cbf98ee0fd9a7980c5eb09b0a02cca Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sun, 10 May 2020 19:57:44 +0000 Subject: [PATCH 195/319] Translated using Weblate (German) Currently translated at 99.9% (2301 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index cac52fb477..ad80bfbc4f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1348,7 +1348,7 @@ "Share Permalink": "Teile permanenten Link", "Sign in to your Matrix account on %(serverName)s": "Melde dich mit deinem Matrixkonto auf %(serverName)s an", "Create your Matrix account on %(serverName)s": "Erstelle ein Matrixkonto auf %(serverName)s", - "Please install Chrome, Firefox, or Safari for the best experience.": " Bitte installiere Chrome, Firefox, oder Safari für das beste Erlebnis.", + "Please install Chrome, Firefox, or Safari for the best experience.": "Bitte installiere Chrome, Firefox, oder Safari für das beste Erlebnis.", "Want more than a community? Get your own server": "Du möchtest mehr als eine Community? Hol dir deinen eigenen Server", "Could not load user profile": "Konnte Nutzerprofil nicht laden", "Your Matrix account on %(serverName)s": "Dein Matrixkonto auf %(serverName)s", @@ -1802,7 +1802,7 @@ "Command failed": "Befehl fehlgeschlagen", "Could not find user in room": "Der Benutzer konnte im Raum nicht gefunden werden", "Click the button below to confirm adding this email address.": "Klicken Sie auf die Schaltfläche unten, um das Hinzufügen dieser E-Mail-Adresse zu bestätigen.", - "Confirm adding phone number": "Bestätigen Sie das Hinzufügen der Telefonnummer.", + "Confirm adding phone number": "Bestätige das Hinzufügen der Telefonnummer", "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Server von %(oldGlob)s nach %(newGlob)s wegen %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erneuert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s wegen %(reason)s", "Not Trusted": "Nicht vertrauenswürdig", @@ -1820,7 +1820,7 @@ "Confirm the emoji below are displayed on both sessions, in the same order:": "Bestätige, dass die unten angezeigten Emojis auf beiden Sitzungen in der selben Reihenfolge angezeigt werden:", "Verify this session by confirming the following number appears on its screen.": "Verfiziere diese Sitzung, indem du bestätigst, dass die folgende Nummer auf ihrem Bildschirm erscheint.", "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Warte auf deine andere Sitzung,%(deviceName)s /%(deviceId)s), um zu verfizieren…", - "How fast should messages be downloaded.": "Wie schnell sollten Nachrichten heruntergeladen werden?", + "How fast should messages be downloaded.": "Wie schnell Nachrichten heruntergeladen werden sollen.", "Compare a unique set of emoji if you don't have a camera on either device": "Vergleiche eine einmalige Reihe von Emoji, sofern du an keinem Gerät eine Kamera hast", "Waiting for %(displayName)s to verify…": "Warte darauf, dass %(displayName)s bestätigt…", "Cancelling…": "Abbrechen…", @@ -2172,7 +2172,7 @@ "You'll upgrade this room from to .": "Du wirst diesen Raum von zu aktualisieren.", "Missing session data": "Fehlende Sitzungsdaten", "Your browser likely removed this data when running low on disk space.": "Dein Browser hat diese Daten wahrscheinlich entfernt als der Festplattenspeicher knapp wurde.", - "Integration Manager": " Integrationsverwaltung", + "Integration Manager": "Integrationsverwaltung", "Find others by phone or email": "Finde Andere per Telefon oder E-Mail", "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", @@ -2351,5 +2351,19 @@ "Navigate recent messages to edit": "Letzte Nachrichten zur Bearbeitung ansehen", "Jump to start/end of the composer": "Springe zum Anfang/Ende der Nachrichteneingabe", "Navigate composer history": "Verlauf der Nachrichteneingabe durchsuchen", - "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Wenn du dies versehentlich getan hast, kannst du in dieser Sitzung \"gesicherte Nachrichten\" einrichten, die den Nachrichtenverlauf dieser Sitzung mit einer neuen Wiederherstellungsmethode erneut verschlüsseln." + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Wenn du dies versehentlich getan hast, kannst du in dieser Sitzung \"sichere Nachrichten\" einrichten, die den Nachrichtenverlauf dieser Sitzung mit einer neuen Wiederherstellungsmethode erneut verschlüsseln.", + "Cancel replying to a message": "Nachricht beantworten abbrechen", + "Navigate up/down in the room list": "In der Raumliste nach oben/unten navigieren", + "Select room from the room list": "Wähle eine Raum aus der Raumliste", + "Collapse room list section": "Raumliste einklappen", + "Expand room list section": "Raumliste ausklappen", + "Clear room list filter field": "Raumlistenfilter zurücksetzen", + "Scroll up/down in the timeline": "In den Nachrichten vor/zurück blättern", + "Previous/next unread room or DM": "Vorheriger/Nächster ungelesener Raum oder Direktnachricht", + "Previous/next room or DM": "Vorheriger/Nächster Raum oder Direktnachricht", + "Toggle the top left menu": "Menü oben links ein-/ausblenden", + "Activate selected button": "Ausgewählten Button aktivieren", + "Toggle right panel": "Rechtes Panel ein-/ausblenden", + "Toggle this dialog": "Diesen Dialog ein-/ausblenden", + "Move autocomplete selection up/down": "Auto-Vervollständigung nach oben/unten verschieben" } From c9a208ce359595150e581f24fbf26c5924148931 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sun, 10 May 2020 20:06:50 +0000 Subject: [PATCH 196/319] Translated using Weblate (German) Currently translated at 99.9% (2301 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ad80bfbc4f..7fdaf20e40 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -698,7 +698,7 @@ "This room is not public. You will not be able to rejoin without an invite.": "Dies ist kein öffentlicher Raum. Du wirst diesen nicht ohne Einladung wieder beitreten können.", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s änderte den Anzeigenamen auf %(displayName)s.", "Failed to set direct chat tag": "Fehler beim Setzen der Direkt-Chat-Markierung", - "Failed to remove tag %(tagName)s from room": "Fehler beim Entfernen des \"%(tagName)s\"-Tags von dem Raum", + "Failed to remove tag %(tagName)s from room": "Entfernen der Raum-Kennzeichnung %(tagName)s fehlgeschlagen", "Failed to add tag %(tagName)s to room": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an dem Raum", "Did you know: you can use communities to filter your Riot.im experience!": "Wusstest du: Du kannst Communities nutzen um deine Riot.im-Erfahrung zu filtern!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Um einen Filter zu setzen, ziehe ein Community-Bild auf das Filter-Panel ganz links. Du kannst jederzeit auf einen Avatar im Filter-Panel klicken um nur die Räume und Personen aus der Community zu sehen.", From 38ed619e2cb8f0b2675e9590e140bd67f4d98fed Mon Sep 17 00:00:00 2001 From: random Date: Mon, 11 May 2020 08:16:36 +0000 Subject: [PATCH 197/319] Translated using Weblate (Italian) Currently translated at 100.0% (2303 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 53f4ea1aa3..d891a06687 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2415,5 +2415,7 @@ "Successfully restored %(sessionCount)s keys": "Ripristinate %(sessionCount)s chiavi correttamente", "You signed in to a new session without verifying it:": "Hai fatto l'accesso ad una nuova sessione senza verificarla:", "Verify your other session using one of the options below.": "Verifica la tua altra sessione usando una delle opzioni sotto.", - "Invite someone using their name, username (like ), email address or share this room.": "Invita qualcuno usando il suo nome, nome utente (come ), indirizzo email o condividi questa stanza." + "Invite someone using their name, username (like ), email address or share this room.": "Invita qualcuno usando il suo nome, nome utente (come ), indirizzo email o condividi questa stanza.", + "Message deleted": "Messaggio eliminato", + "Message deleted by %(name)s": "Messaggio eliminato da %(name)s" } From b72ae00222e95db314a60bd3cc95286fb3dc307e Mon Sep 17 00:00:00 2001 From: call_xz Date: Sat, 9 May 2020 16:59:39 +0000 Subject: [PATCH 198/319] Translated using Weblate (Japanese) Currently translated at 57.8% (1332 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 20f8097c0c..95cd093111 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -28,7 +28,7 @@ "Filter room members": "部屋メンバーを検索", "Show timestamps in 12 hour format (e.g. 2:30pm)": "発言時刻を12時間形式で表示 (例 2:30PM)", "Upload avatar": "アイコン画像を変更", - "Upload file": "添付ファイル送信", + "Upload file": "ファイルのアップロード", "Use compact timeline layout": "会話表示の行間を狭くする", "Riot collects anonymous analytics to allow us to improve the application.": "Riotはアプリケーションを改善するために匿名の分析情報を収集しています。", "Add": "追加", @@ -455,7 +455,7 @@ "Admin Tools": "管理者ツール", "and %(count)s others...|other": "そして、他 %(count)s ...", "and %(count)s others...|one": "そして、もう1つ...", - "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (パワー %(powerLevelNumber)s)", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (権限レベル: %(powerLevelNumber)s )", "Attachment": "付属品", "Hangup": "電話を切る", "Voice call": "音声通話", @@ -485,9 +485,9 @@ "Idle": "アイドル", "Offline": "オフライン", "Unknown": "未知の", - "Seen by %(userName)s at %(dateTime)s": "%(dateTime)s に %(userName)s が閲覧", - "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(dateTime)s に %(displayName)s (%(userName)s) が見た", - "Replying": "返信中", + "Seen by %(userName)s at %(dateTime)s": "%(dateTime)s に %(userName)s が既読", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(dateTime)s に %(displayName)s (%(userName)s) が既読", + "Replying": "以下に返信", "Save": "保存", "(~%(count)s results)|other": "(~%(count)s 結果)", "(~%(count)s results)|one": "(~%(count)s 結果)", @@ -1025,7 +1025,7 @@ "Use an identity server to invite by email. Manage in Settings.": "メールによる招待のためにIDサーバーを用いる。設定画面で管理する。", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s が参加ルールを「%(rule)s」に変更しました。", "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s がこの部屋へのゲストによる参加を拒否しました。", - "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s はゲストによるアクセスを %(rule)s に変更しました。", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s がゲストによるアクセスを %(rule)s に変更しました。", "%(displayName)s is typing …": "%(displayName)s が入力中 …", "%(names)s and %(count)s others are typing …|other": "%(names)s と他 %(count)s 名が入力中 …", "%(names)s and %(count)s others are typing …|one": "%(names)s ともう一人が入力中 …", @@ -1353,5 +1353,23 @@ "Space used:": "使用中のストレージ容量:", "Indexed messages:": "インデックス済みのメッセージ数:", "Indexed rooms:": "インデックス済みの部屋数:", - "%(doneRooms)s out of %(totalRooms)s": "%(totalRooms)s 件の部屋の内 %(doneRooms)s 件" + "%(doneRooms)s out of %(totalRooms)s": "%(totalRooms)s 件の部屋の内 %(doneRooms)s 件", + "Error changing power level": "権限レベルの変更中にエラーが発生しました", + "Frequently Used": "使用頻度の高いリアクション", + "Smileys & People": "表情と人々", + "Animals & Nature": "動物と植物", + "Food & Drink": "食べ物と飲み物", + "Activities": "アクティビティ", + "Travel & Places": "旅行と場所", + "Objects": "物体", + "Symbols": "シンボル", + "Flags": "旗", + "Cancel search": "検索をキャンセル", + "Your avatar URL": "あなたのアバター URL", + "Your user ID": "あなたのユーザー ID", + "Your theme": "あなたのテーマ", + "Riot URL": "Riot URL", + "Room ID": "部屋 ID", + "Maximize apps": "アプリを最大化する", + "More options": "更なるオプション" } From c3cd7e17c08ece9c2b77c7d69e460e180ae6c21b Mon Sep 17 00:00:00 2001 From: Frisk Date: Fri, 8 May 2020 22:19:53 +0000 Subject: [PATCH 199/319] Translated using Weblate (Polish) Currently translated at 68.4% (1576 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index b54c950263..30dd5b828d 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1589,5 +1589,21 @@ "Toggle Italics": "Przełącz kursywę", "Toggle Quote": "Przełącz cytowanie", "Cancel autocomplete": "Anuluj autouzupełnienie", - "Please install Chrome, Firefox, or Safari for the best experience.": "Zainstaluj Chrome, Firefox, lub Safari w celu zapewnienia najlepszego działania." + "Please install Chrome, Firefox, or Safari for the best experience.": "Zainstaluj Chrome, Firefox, lub Safari w celu zapewnienia najlepszego działania.", + "Confirm adding email": "Potwierdź dodanie e-maila", + "Click the button below to confirm adding this email address.": "Naciśnij przycisk poniżej aby zatwierdzić dodawanie adresu e-mail.", + "Confirm adding phone number": "Potwierdź dodanie numeru telefonu", + "Click the button below to confirm adding this phone number.": "Naciśnij przycisk poniżej aby potwierdzić dodanie tego numeru telefonu.", + "The version of Riot": "Wersja Riota", + "Your user agent": "Twój user agent", + "The information being sent to us to help make Riot better includes:": "Informacje przesyłane do nas w celu poprawy jakości Riota zawierają:", + "Sends a message as html, without interpreting it as markdown": "Wysyła wiadomość w formacie html, bez interpretowania jej jako markdown", + "Error upgrading room": "Błąd podczas aktualizacji pokoju", + "Double check that your server supports the room version chosen and try again.": "Sprawdź ponownie czy Twój serwer wspiera wybraną wersję pokoju i spróbuj ponownie.", + "Could not find user in room": "Nie znaleziono użytkownika w pokoju", + "Session already verified!": "Sesja już zweryfikowana!", + "WARNING: Session already verified, but keys do NOT MATCH!": "OSTRZEŻENIE: Sesja już zweryfikowana, ale klucze do siebie NIE PASUJĄ!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "OSTRZEŻENIE: WERYFIKACJA KLUCZY NIE POWIODŁA SIĘ! Klucz podpisujący dla %(userId)s oraz sesji %(deviceId)s to \"%(fprint)s\", nie pasuje on do podanego klucza \"%(fingerprint)s\". To może oznaczać że Twoja komunikacja jest przechwytywana!", + "Displays information about a user": "Pokazuje informacje na temat użytkownika", + "Send a bug report with logs": "Wyślij raport błędu z logami" } From 97cadfa9573fc8b3811312ad17f3e2b3ae4357ae Mon Sep 17 00:00:00 2001 From: Jan van der Weijst Date: Sun, 10 May 2020 21:31:25 +0000 Subject: [PATCH 200/319] Translated using Weblate (Spanish) Currently translated at 93.5% (2154 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 374 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 363 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 17ddee917f..6b6058d837 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -537,7 +537,7 @@ "Event Type": "Tipo de Evento", "No rooms to show": "No hay salas para mostrar", "Download this file": "Descargar este archivo", - "Pin Message": "Fija Mensaje", + "Pin Message": "Fijar Mensaje", "Failed to change settings": "Error al cambiar los ajustes", "View Community": "Ver la comunidad", "Developer Tools": "Herramientas de desarrollo", @@ -1355,7 +1355,7 @@ "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Si encuentras algún error o quieres compartir una opinión, por favor, contacta con nosotros en GitHub.", "Report bugs & give feedback": "Reportar errores y compartir mi opinión", "Please fill why you're reporting.": "Por favor, explica por qué estás reportando.", - "Report Content to Your Homeserver Administrator": "Reportar contenido a tu administrador del homeserver", + "Report Content to Your Homeserver Administrator": "Reportar contenido a tu administrador del Servidor Doméstico", "Send report": "Enviar reporte", "Room Settings - %(roomName)s": "Configuración de la sala - %(roomName)s", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Actualizar esta sala requiere cerrar la instancia actual de esta sala y crear una nueva sala en su lugar. Para dar a los miembros de la sala la mejor experiencia, haremos lo siguiente:", @@ -1470,7 +1470,7 @@ "Confirm the emoji below are displayed on both devices, in the same order:": "Confirma que los emojis a continuación son mostrados en ambos dispositivos, en el mismo orden:", "Verify this device by confirming the following number appears on its screen.": "Verifica este dispositivo confirmando que el siguiente número aparece en su pantalla.", "Waiting for %(displayName)s to verify…": "Esperando la verificación de %(displayName)s …", - "Review": "Revisar", + "Review": "Revise", "in secret storage": "en almacén secreto", "Secret storage public key:": "Clave pública del almacén secreto:", "in account data": "en datos de cuenta", @@ -1633,9 +1633,9 @@ "Securely cache encrypted messages locally for them to appear in search results, using ": "Almacenar localmente, de manera segura, los mensajes cifrados localmente para que aparezcan en los resultados de la búsqueda, utilizando ", " to store messages from ": " para almacenar mensajes de ", "Securely cache encrypted messages locally for them to appear in search results.": "Almacenar localmente, de manera segura, a los mensajes cifrados localmente para que aparezcan en los resultados de búsqueda.", - "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riot le faltan algunos componentes necesarios para el almacenamiento seguro de mensajes cifrados a nivel local. Si quieres experimentar con esta característica, construye un Escritorio Riot personalizado con componentes de búsqueda añadidos.", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riot le faltan algunos componentes necesarios para el almacenamiento seguro de mensajes cifrados a nivel local. Si quieres experimentar con esta característica, construye un Escritorio Riot personalizado con componentes de búsqueda añadidos.", "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot no puede guardar de forma segura en la memoria caché a mensajes encriptados localmente, mientras se ejecuta en un navegador web. Use Riot Desktop para que los mensajes encriptados aparezcan en los resultados de la búsqueda.", - "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Esta sesión no ha creado una copia de seguridad de tus llaves, pero tienes una copia de seguridad existente de la que puedes restaurar y añadir para proceder.", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Esta sesión no ha creado una copia de seguridad de tus llaves, pero tienes una copia de seguridad existente de la que puedes restaurar y añadir para proceder.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Conecte esta sesión a la copia de seguridad de las claves antes de firmar y así evitar perder las claves que sólo existen en esta sesión.", "Connect this session to Key Backup": "Conecte esta sesión a la copia de respaldo de tu clave", "Backup has a valid signature from this user": "La copia de seguridad tiene una firma de valido de este usuario", @@ -1747,7 +1747,7 @@ "Can't find this server or its room list": "No puedo encontrar este servidor o su lista de salas", "All rooms": "Todas las salas", "Your server": "Tu", - "Are you sure you want to remove %(serverName)s": "¿Estás seguro de querer quitar %(serverName)s ?", + "Are you sure you want to remove %(serverName)s": "¿Está seguro de querer eliminar %(serverName)s?", "Remove server": "Quitar servidor", "Matrix": "Matrix", "Add a new server": "Añadir un nuevo servidor", @@ -1805,7 +1805,7 @@ "Integrations not allowed": "Integraciones no están permitidas", "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Su Riot no le permite utilizar un \"Administrador de Integración\" para hacer esto. Por favor, contacte con un administrador.", "Failed to invite the following users to chat: %(csvUsers)s": "Error invitando a los siguientes usuarios al chat: %(csvUsers)s", - "We couldn't create your DM. Please check the users you want to invite and try again.": "No pudimos crear tu DM. Por favor, marca los usuarios que quieres invitar e inténtalo de nuevo.", + "We couldn't create your DM. Please check the users you want to invite and try again.": "No pudimos crear tu Mensaje Directo Por favor, marcar los usuarios que quieres invitar e inténtalo de nuevo.", "Start a conversation with someone using their name, username (like ) or email address.": "Iniciar una conversación con alguien usando su nombre, nombre de usuario (como ) o dirección de correo electrónico.", "Invite someone using their name, username (like ), email address or share this room.": "Invitar a alguien usando su nombre, nombre de usuario (como ), dirección de correo electrónico o compartir esta sala.", "a new master key signature": "una nueva firma de llave maestra", @@ -1815,9 +1815,9 @@ "Riot encountered an error during upload of:": "Riot encontró un error durante la carga de:", "End": "Fin", "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. Learn more about encryption.": "Una vez habilitado, el cifrado de una sala no puede deshabilitarse. Los mensajes enviados a una sala cifrada no pueden ser vistos por el servidor, sólo lo verán los participantes de la sala. Habilitar el cifrado puede hacer que muchos bots y bridges no funcionen correctamente. Aprende más de cifrado", - "Joining room …": "Uniéndose a sala ...", - "Loading …": "Cargando ...", - "Rejecting invite …": "Rechazando invitación ...", + "Joining room …": "Uniéndose a sala …", + "Loading …": "Cargando …", + "Rejecting invite …": "Rechazando invitación …", "Join the conversation with an account": "Unirse a la conversación con una cuenta", "Sign Up": "Registrarse", "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s te ha explusado de la sala %(roomName)s", @@ -1837,5 +1837,357 @@ "%(roomName)s can't be previewed. Do you want to join it?": "La sala %(roomName)s no permite previsualización. ¿Quieres unirte?", "This room doesn't exist. Are you sure you're at the right place?": "Esta sala no existe. ¿Está seguro de estar en el lugar correcto?", "Try again later, or ask a room admin to check if you have access.": "Inténtalo más tarde, o pide que un administrador de la sala compruebe si tienes acceso.", - "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s fue devuelto al intentar acceder a la sala. Si crees que no deberías ver el mensaje, por favor somete un reporte de error." + "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s fue devuelto al intentar acceder a la sala. Si crees que no deberías ver el mensaje, por favor somete un reporte de error.", + "Re-request encryption keys from your other sessions.": "Re-requestLink>Solicite nuevamente claves de encriptación de sus otras sesiones.", + "This message cannot be decrypted": "Este mensaje no puede ser desencriptado", + "Encrypted by an unverified session": "Encriptado por una sesión no verificada", + "Unencrypted": "Sin encriptación", + "Encrypted by a deleted session": "Encriptado por una sesión eliminada", + "Invite only": "Sólamente por invitación", + "Scroll to most recent messages": "Desplácese a los mensajes más recientes", + "Close preview": "Cerrar vista previa", + "No recent messages by %(user)s found": "No se han encontrado mensajes recientes de %(user)s", + "Try scrolling up in the timeline to see if there are any earlier ones.": "Intente desplazarse hacia arriba en la línea de tiempo para ver si hay alguna anterior.", + "Remove recent messages by %(user)s": "Eliminar mensajes recientes de %(user)s", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Estás a punto de eliminar %(count)s mensajes de %(user)s. Esto no se puede deshacer. ¿Desea continuar?", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Estás a punto de eliminar 1 mensaje de %(user)s. Esto no se puede deshacer. ¿Desea continuar?", + "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "Para una gran cantidad de mensajes, esto podría llevar algún tiempo. Por favor, no refresque a su cliente mientras tanto.", + "Remove %(count)s messages|other": "Eliminar %(count)s mensajes", + "Remove %(count)s messages|one": "Eliminar 1 mensaje", + "Deactivate user?": "¿Desactivar usuario?", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Desactivando a este usuario, este será desconectado y no podrá volver a ingresar. Además, saldrá de todas las salas a que se había unido. Esta acción no puede ser revertida. ¿Está seguro de desactivar este usuario?", + "Deactivate user": "Desactivar usuario", + "Failed to deactivate user": "Error en desactivar usuario", + "No sessions with registered encryption keys": "No hay sesiones con claves de cifrado registradas", + "Remove recent messages": "Eliminar mensajes recientes", + "Send a reply…": "Enviar una respuesta …", + "Send a message…": "Enviar un mensaje…", + "Bold": "Negrita", + "Italics": "Cursivo", + "Strikethrough": "Tachado", + "Code block": "Bloque de código", + "Room %(name)s": "Sala %(name)s", + "Recent rooms": "Salas recientes", + "Direct Messages": "Mensaje Directo", + "Loading room preview": "Cargando vista previa de la sala", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Un código de error (%(errcode)s) fue devuelto al tratar de validar su invitación. Podrías intentar pasar esta información a un administrador de la sala.", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Esta invitación a la sala %(roomName)s fue enviada a %(email)s que no está asociada a su cuenta", + "Link this email with your account in Settings to receive invites directly in Riot.": "Para recibir invitaciones directamente en Riot, en Configuración, debes vincular este correo electrónico con tu cuenta.", + "This invite to %(roomName)s was sent to %(email)s": "Esta invitación a %(roomName)s fue enviada a %(email)s", + "Use an identity server in Settings to receive invites directly in Riot.": "Utilice un servidor de identidad en Configuración para recibir invitaciones directamente en Riot.", + "Share this email in Settings to receive invites directly in Riot.": "Comparte este correo electrónico en Configuración para recibir invitaciones directamente en Riot.", + " wants to chat": " quiere chatear", + "Start chatting": "Empieza a chatear", + "Reject & Ignore user": "Rechazar e ignorar usuario", + "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Actualizar esta sala cerrará la instancia actual de la sala y creará una sala actualizada con el mismo nombre.", + "This room has already been upgraded.": "Esta sala ya ha sido actualizada.", + "This room is running room version , which this homeserver has marked as unstable.": "Esta sala está ejecutando la versión de sala , la cual ha sido marcado por este servidor doméstico como unstable.", + "Unknown Command": "Comando desconocido", + "Unrecognised command: %(commandText)s": "Comando no reconocido: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Puedes usar /ayuda para listar los comandos disponibles. ¿Querías enviarlo como un mensaje?", + "Hint: Begin your message with // to start it with a slash.": "Sugerencia: Comienza tu mensaje con // para que inicie con una barra inclinada.", + "Send as message": "Enviar como mensaje", + "Failed to connect to integration manager": "Error al conectarse con el administrador de integración", + "Failed to revoke invite": "Error al revocar la invitación", + "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "No se logró revocar la invitación. El servidor puede sufrir un problema temporal o usted no tiene los permisos suficientes para revocar la invitación.", + "Revoke invite": "Revocar invitación", + "Invited by %(sender)s": "Invitado por %(sender)s", + "Mark all as read": "Marcar todo como leído", + "Error updating main address": "Error al actualizar la dirección principal", + "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Hubo un error al actualizar la dirección principal de la sala. Posiblemente el servidor no lo permita o se produjo un error temporal.", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Hubo un error al actualizar la dirección alternativa de la sala. Posiblemente el servidor no lo permita o se produjo un error temporal.", + "Error creating alias": "Error al crear el alias (apodo)", + "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "Hubo un error al crear ese alias (apodo). Posiblemente no lo permita el servidor o puede que se haya producido un error temporal.", + "You don't have permission to delete the alias.": "No tienes permiso para borrar el alias (apodo).", + "There was an error removing that alias. It may no longer exist or a temporary error occurred.": "Se produjo un error al eliminar ese alias (apodo). Tal vez ya no exista o puede haberse producido un error temporal.", + "Error removing alias": "Error al eliminar el alias (apodo)", + "Local address": "Dirección local", + "Published Addresses": "Direcciones publicadas", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Las direcciones publicadas pueden ser usadas por cualquier usuario en cualquier servidor para unirse a tu salas. Para publicar una dirección, primero hay que establecerla como una dirección local.", + "Other published addresses:": "Otras direcciones publicadas:", + "No other published addresses yet, add one below": "No tiene direcciones publicadas todavía, agregue una más abajo", + "New published address (e.g. #alias:server)": "Nueva dirección publicada (p.ej.. #alias:server)", + "Local Addresses": "Direcciones locales", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Establezca las direcciones de esta sala para que los usuarios puedan encontrarla a través de tu servidor doméstico (%(localDomain)s)", + "Error updating flair": "Error al actualizar el botón", + "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Error al actualizar el botón para esta sala. Posiblemente el servidor no lo permita o que se produjo un error temporal.", + "Waiting for you to accept on your other session…": "Esperando que aceptes en tu otra sesión…", + "Waiting for %(displayName)s to accept…": "Esperando a que %(displayName)s acepte…", + "Accepting…": "Aceptando…", + "Start Verification": "Iniciar verificación", + "Messages in this room are end-to-end encrypted.": "Los mensajes en esta sala están encriptados de extremo a extremo.", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Sus mensajes son seguros y sólo usted y el destinatario tienen las claves únicas para desbloquearlos.", + "Messages in this room are not end-to-end encrypted.": "Los mensajes en esta habitación NO están encriptados de extremo a extremo.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "En las salas encriptadas, sus mensajes están seguros y sólo usted y el destinatario tienen las claves únicas para desbloquearlos.", + "Verify User": "Verificar usuario", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Para mayor seguridad, verifique este usuario comprobando un código temporal vez en ambos dispositivos.", + "Your messages are not secure": "Sus mensajes no son seguros", + "One of the following may be compromised:": "Uno de los siguientes puede estar comprometido:", + "Your homeserver": "Su servidor doméstico", + "The homeserver the user you’re verifying is connected to": "El servidor doméstico del usuario a que está verificando está conectado a", + "Yours, or the other users’ internet connection": "La conexión a Internet suya, o la de los otros usuarios", + "Yours, or the other users’ session": "La sesión suya, o la de los otros usuarios", + "Trusted": "De confianza", + "Not trusted": "No de confianza", + "%(count)s verified sessions|other": "%(count)s sesiones verificadas", + "%(count)s verified sessions|one": "1 sesión verificada", + "Hide verified sessions": "Ocultar sesiones verificadas", + "%(count)s sessions|other": "%(count)s sesiones", + "%(count)s sessions|one": "%(count)s sesión", + "Hide sessions": "Ocultar sesiones", + "Direct message": "Mensaje directo", + "%(role)s in %(roomName)s": "%(role)s en %(roomName)s", + "This client does not support end-to-end encryption.": "Este cliente no es compatible con el cifrado de extremo a extremo.", + "Security": "Seguridad", + "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "La sesión que está tratando de verificar no soporta el escaneo de un código QR o la verificación mediante emoji, que es lo que soporta Riot. Inténtalo con un cliente diferente.", + "Verify by scanning": "Verificar mediante escaneo", + "Ask %(displayName)s to scan your code:": "Pídele a %(displayName)s que escanee tu código:", + "If you can't scan the code above, verify by comparing unique emoji.": "Si no puedes escanear el código de arriba, verifica comparando emoji únicos.", + "Verify by comparing unique emoji.": "Verifica comparando emoji únicos.", + "Verify by emoji": "Verificar con emoji", + "Almost there! Is your other session showing the same shield?": "¡Ya casi está! ¿Su otra sesión muestra el mismo escudo?", + "Almost there! Is %(displayName)s showing the same shield?": "¡Ya casi está! ¿Está %(displayName)s mostrando el mismo escudo?", + "Verify all users in a room to ensure it's secure.": "Verifica a todos los usuarios de una sala para asegurar que es segura.", + "In encrypted rooms, verify all users to ensure it’s secure.": "En las salas encriptadas, verifique a todos los usuarios para asegurarse de son seguros.", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "¡Has verificado con éxito los %(deviceName)s (%(deviceId)s)!", + "You've successfully verified %(displayName)s!": "¡Has verificado con éxito los %(displayName)s!", + "Verified": "Verificado", + "Got it": "Lo he entendido", + "Start verification again from the notification.": "Inicie la verificación nuevamente a partir de la notificación.", + "Start verification again from their profile.": "Empieza la verificación de nuevo desde su perfil.", + "Verification timed out.": "El tiempo máximo para la verificación se ha agotado.", + "You cancelled verification on your other session.": "Canceló la verificación de su otra sesión.", + "%(displayName)s cancelled verification.": "%(displayName)s canceló la verificación.", + "You cancelled verification.": "Usted canceló la verificación.", + "Verification cancelled": "Verificación cancelada", + "Compare emoji": "Comparar emoji", + "Encryption enabled": "Encriptación habilitada", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Los mensajes en esta sala están encriptados de extremo a extremo. Aprende más & verifica este usuario en su perfil de usuario.", + "Encryption not enabled": "Encriptación no habilitada", + "The encryption used by this room isn't supported.": "La encriptación usada por esta sala no es compatible.", + "React": "Reaccione", + "Message Actions": "Acciones de mensaje", + "Show image": "Mostrar imagen", + "You have ignored this user, so their message is hidden. Show anyways.": "Ha ignorado a este usuario, así que su mensaje se ha ocultado. Mostrar de todos modos.", + "You verified %(name)s": "Usted verificó %(name)s", + "You cancelled verifying %(name)s": "Usted canceló la verificación de %(name)s", + "%(name)s cancelled verifying": "%(name)s canceló la verificación", + "You accepted": "Usted aceptó", + "%(name)s accepted": "%(name)s aceptó", + "You declined": "Usted declinó", + "You cancelled": "Usted canceló", + "%(name)s declined": "%(name)s declinó", + "%(name)s cancelled": "%(name)s canceló", + "Accepting …": "Aceptando…", + "Declining …": "Declinando…", + "%(name)s wants to verify": "%(name)s quiere verificar", + "You sent a verification request": "Usted envió una solicitud de verificación", + "Show all": "Mostrar todo", + "Reactions": "Reacciones", + " reacted with %(content)s": " reaccionó con %(content)s", + "reacted with %(shortName)s": " reaccionó con %(shortName)s", + "Message deleted": "Mensaje eliminado", + "Message deleted by %(name)s": "Mensaje eliminado por %(name)s", + "Edited at %(date)s. Click to view edits.": "Editado el día %(date)s. Haga clic para ver las ediciones.", + "edited": "editado", + "Can't load this message": "No puedo cargar este mensaje", + "Submit logs": "Enviar registros", + "Frequently Used": "Usado con frecuencia", + "Smileys & People": "Caritas y personas", + "Animals & Nature": "Animales y naturaleza", + "Food & Drink": "Comidas y bebidas", + "Activities": "Actividades", + "Travel & Places": "Viajes y lugares", + "Objects": "Objetos", + "Symbols": "Símbolos", + "Flags": "Banderas", + "Quick Reactions": "Reacciones rápidas", + "Cancel search": "Cancelar búsqueda", + "Any of the following data may be shared:": "Cualquiera de los siguientes datos puede ser compartido:", + "Your display name": "Su nombre mostrado", + "Your avatar URL": "La URL de su avatar", + "Your user ID": "Su identificación (ID) de usuario", + "Your theme": "Su tema", + "Riot URL": "URL de Riot", + "Room ID": "Identidad (ID) de la sala", + "Widget ID": "Identificación (ID) de widget", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Usar este widget puede resultar en compartir datos con %(widgetDomain)s y su Administrador de Integración.", + "Using this widget may share data with %(widgetDomain)s.": "Usar este widget puede resultar en compartir datos con %(widgetDomain)s.", + "Widgets do not use message encryption.": "Los widgets no utilizan la encriptación de mensajes.", + "Widget added by": "Widget añadido por", + "This widget may use cookies.": "Este widget posiblemente utilice cookies.", + "Maximize apps": "Maximizar apps", + "More options": "Mas opciones", + "Please create a new issue on GitHub so that we can investigate this bug.": "Por favor, crea un nuevo nodo en GitHub para que podamos investigar este error.", + "Rotate Left": "Girar a la izquierda", + "Upload completed": "Subida completada", + "Cancelled signature upload": "Subida de firma cancelada", + "Unable to upload": "No se puede subir", + "Signature upload success": "Subida de firma exitosa", + "Signature upload failed": "Subida de firma falló", + "Confirm by comparing the following with the User Settings in your other session:": "Confirme comparando lo siguiente con los ajustes de usuario de su otra sesión:", + "Confirm this user's session by comparing the following with their User Settings:": "Confirme la sesión de este usuario comparando lo siguiente con la configuración de usuario de él/ella:", + "If they don't match, the security of your communication may be compromised.": "Si no coinciden, la seguridad de su comunicación puede estar comprometida.", + "Your homeserver doesn't seem to support this feature.": "Tu servidor doméstico no parece soportar esta característica.", + "Your account is not secure": "Su cuenta no es segura", + "Your password": "Su contraseña", + "This session, or the other session": "Esta sesión, o la otra sesión", + "The internet connection either session is using": "La conexión a Internet usado por cualquiera de las dos sesiones", + "We recommend you change your password and recovery key in Settings immediately": "Le recomendamos que cambie inmediatamente su contraseña y su clave de recuperación en Configuración", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Para ayudar a evitar la duplicación de entradas, por favor ver primero los entradas existentes (y añadir un +1) o, si no lo encuentra, crear una nueva entrada .", + "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Reportar este mensaje enviará su único 'event ID' al administrador de su servidor doméstico. Si los mensajes en esta sala están encriptados, el administrador de tu servidor no podrá leer el texto del mensaje ni ver ningún archivo o imagen.", + "Command Help": "Ayuda del comando", + "Integration Manager": "Administrador de integración", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Actualmente está incluyendo sesiones no verificadas en la lista negra; para enviar mensajes a estas sesiones debe verificarlas primero.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Le recomendamos que pase por el proceso de verificación de cada sesión para confirmar que pertenecen a su legítimo propietario, pero puede reenviar el mensaje sin verificarlo si lo prefiere.", + "Verify other session": "Verifique otra sesión", + "Verification Request": "Solicitud de verificación", + "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Un widget localizado en %(widgetUrl)s desea verificar su identidad. Permitiendo esto, el widget podrá verificar su identidad de usuario, pero no realizar acciones como usted.", + "Enter recovery passphrase": "Introduzca la contraseña de recuperación", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "No se puede acceder al almacenamiento secreto. Por favor, compruebe que ha introducido la frase de recuperación correcta.", + "Warning: You should only do this on a trusted computer.": "Advertencia: Sólo debes hacer esto en un ordenador de su confianza.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Acceda a su historial de mensajes seguros y a su identidad de firma cruzada para verificar otras sesiones, introduciendo su frase de recuperación.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "Si has olvidado tu contraseña de recuperación puedes usar tu clave de recuperación o configurar nuevas opciones de recuperación .", + "Enter recovery key": "Introduzca la clave de recuperación", + "Unable to access secret storage. Please verify that you entered the correct recovery key.": "No se puede acceder al almacenamiento secreto. Por favor, compruebe que haya introducido la clave de recuperación correcta.", + "This looks like a valid recovery key!": "¡Esto tiene pinta de una llave de recuperación válida!", + "Not a valid recovery key": "Clave de recuperación no válida", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Acceda a su historial de mensajes seguros y a su identidad de firma cruzada para verificar otras sesiones, introduciendo su clave de recuperación.", + "If you've forgotten your recovery key you can .": "Si has olvidado tu clave de recuperación puedes .", + "Restoring keys from backup": "Restaurando las claves desde copia de seguridad", + "Fetching keys from server...": "Obteniendo las claves desde el servidor...", + "%(completed)s of %(total)s keys restored": "%(completed)s de %(total)s llaves restauradas", + "Unable to load backup status": "No se puede cargar el estado de la copia de seguridad", + "Recovery key mismatch": "No coincide la clave de recuperación", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "La copia de seguridad no pudo ser descifrada con esta clave de recuperación: por favor, comprueba que hayas introducido la clave de recuperación correcta.", + "Incorrect recovery passphrase": "Contraseña de recuperación incorrecta", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "La copia de seguridad no pudo ser descifrada con esta contraseña de recuperación: por favor, comprueba que hayas introducido la contraseña de recuperación correcta.", + "Unable to restore backup": "No se pudo restaurar la copia de seguridad", + "No backup found!": "¡No se encontró una copia de seguridad!", + "Keys restored": "Se restauraron las claves", + "Failed to decrypt %(failedCount)s sessions!": "¡Error en desencriptar %(failedCount) sesiones!", + "Successfully restored %(sessionCount)s keys": "%(sessionCount)s claves restauradas con éxito", + "Warning: you should only set up key backup from a trusted computer.": "Advertencia: sólo debes configurar la copia de seguridad de claves desde un ordenador de su confianza.", + "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Acceda a su historial de mensajes seguros y configure la mensajería segura introduciendo su contraseña de recuperación.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "Si has olvidado tu contraseña de recuperación puedes usar tu clave de recuperación o configurar nuevas opciones de recuperación ", + "Warning: You should only set up key backup from a trusted computer.": "Advertencia: Sólo debes configurar la copia de seguridad de claves desde un ordenador de su confianza.", + "Access your secure message history and set up secure messaging by entering your recovery key.": "Accede a tu historial de mensajes seguros y configura la mensajería segura introduciendo tu clave de recuperación.", + "If you've forgotten your recovery key you can ": "Si has olvidado tu clave de recuperación puedes ", + "Resend edit": "Reenviar la edición", + "Resend %(unsentCount)s reaction(s)": "Reenviar %(unsentCount)s reacción(es)", + "Resend removal": "Reenviar la eliminación", + "Share Permalink": "Compartir Permalink", + "Report Content": "Reportar contenido", + "Notification settings": "Configuración de notificaciones", + "Clear status": "Borrar estado", + "Update status": "Actualizar estado", + "Set status": "Establecer estado", + "Set a new status...": "Establecer un estado nuevo...", + "Hide": "Ocultar", + "Help": "Ayuda", + "Reload": "Recargar", + "Take picture": "Tomar una foto", + "Remove for everyone": "Eliminar para todos", + "Remove for me": "Eliminar para mi", + "User Status": "Estado de usuario", + "This homeserver would like to make sure you are not a robot.": "A este servidor le gustaría asegurarse de que no eres un robot.", + "Country Dropdown": "Seleccione país", + "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.": "Puede utilizar las opciones del servidor personalizado para iniciar sesión en otros servidores de Matrix, especificando una URL de servidor doméstico diferente. Esto le permite usar esta aplicación con una cuenta existente de Matrix en un servidor doméstico diferente.", + "Confirm your identity by entering your account password below.": "Confirme su identidad introduciendo la contraseña de su cuenta.", + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Falta la clave pública del captcha en la configuración del servidor doméstico. Por favor, informe de esto al administrador del servidor doméstico.", + "Please review and accept all of the homeserver's policies": "Por favor, revise y acepte todas las políticas del servidor doméstico", + "Please review and accept the policies of this homeserver:": "Por favor revise y acepte las políticas de este servidor doméstico:", + "Unable to validate homeserver/identity server": "No se pudo validar el servidor doméstico/servidor de identidad", + "Your Modular server": "Su servidor modular", + "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.": "Introduzca la ubicación de su Servidor Modular Doméstico. Este puede usar su propio nombre de dominio o ser un subdominio de modular.im.", + "Server Name": "Nombre del servidor", + "The username field must not be blank.": "El campo del nombre de usuario no puede estar en blanco.", + "Username": "Nombre de usuario", + "Not sure of your password? Set a new one": "¿No estás seguro de tu contraseña? Escoge una nueva", + "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "No se ha configurado ningún servidor de identidad, por lo que no se puede añadir una dirección de correo electrónico para restablecer la contraseña en el futuro.", + "Use an email address to recover your account": "Utilice una dirección de correo electrónico para recuperar su cuenta", + "Enter email address (required on this homeserver)": "Introduzca una dirección de correo electrónico (requerida en este servidor)", + "Doesn't look like a valid email address": "No parece una dirección de correo electrónico válida", + "Enter password": "Introduzca su contraseña", + "Password is allowed, but unsafe": "Contraseña permitida, pero no es segura", + "Nice, strong password!": "¡Fantástico, una contraseña fuerte!", + "Keep going...": "Continúa...", + "Passwords don't match": "Las contraseñas no coinciden", + "Other users can invite you to rooms using your contact details": "Otros usuarios pueden invitarte las salas utilizando tus datos de contacto", + "Enter phone number (required on this homeserver)": "Ingrese un número de teléfono (requerido en este servidor doméstico)", + "Doesn't look like a valid phone number": "No parece ser un número de teléfono válido", + "Use lowercase letters, numbers, dashes and underscores only": "Use sólo letras minúsculas, números, guiones y guiones bajos", + "Enter username": "Introduce nombre de usuario", + "Email (optional)": "Correo electrónico (opcional)", + "Phone (optional)": "Teléfono (opcional)", + "Create your Matrix account on %(serverName)s": "Crea tu cuenta de Matrix en %(serverName)s", + "Create your Matrix account on ": "Crea tu cuenta de Matrix en ", + "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Configura un correo electrónico para la recuperación de la cuenta. Opcionalmente utilice correo electrónico o teléfono para que los contactos existentes puedan descubrirlo.", + "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Configura un correo electrónico para la recuperación de la cuenta. Opcionalmente utilice el correo electrónico para poder ser descubierto por contactos existentes.", + "Enter your custom homeserver URL What does this mean?": "Ingrese la URL de su servidor doméstico ¿Qué significa esto?", + "Homeserver URL": "URL del servidor doméstico", + "Enter your custom identity server URL What does this mean?": "Introduzca la URL de su servidor de identidad personalizada ¿Qué significa esto?", + "Identity Server URL": "URL del servidor de identidad", + "Other servers": "Otros servidores", + "Free": "Gratis", + "Join millions for free on the largest public server": "Únete de forma gratuita a millones de personas en el servidor público más grande", + "Premium": "Premium", + "Premium hosting for organisations Learn more": "Alojamiento Premium para organizaciones Aprende más", + "Find other public servers or use a custom server": "Descubra otros servidores públicos o utilice un servidor personalizado", + "Sign in to your Matrix account on %(serverName)s": "Inicie sesión en su cuenta de Matrix en %(serverName)s", + "Sign in to your Matrix account on ": "Inicie sesión en su cuenta de Matrix en ", + "Sign in with SSO": "Ingrese con SSO", + "Please install Chrome, Firefox, or Safari for the best experience.": "Por favor, instale Chrome, Firefox, o Safari para la mejor experiencia.", + "Couldn't load page": "No pude cargar la página", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Usted es un administrador de esta comunidad. No podrás volver a unirte sin una invitación de otro administrador.", + "Want more than a community? Get your own server": "¿Quieres más que una comunidad? Obtenga su propio servidor", + "This homeserver does not support communities": "Este servidor doméstico no permite las comunidades", + "Welcome to %(appName)s": "Bienvenido a %(appName)s", + "Liberate your communication": "Libere su comunicación", + "Send a Direct Message": "Envía un mensaje directo", + "Explore Public Rooms": "Explorar salas públicas", + "Create a Group Chat": "Crear un chat grupal", + "Explore": "Explorar", + "Filter": "Filtrar", + "Filter rooms…": "Filtrar salas…", + "Self-verification request": "Solicitud de auto-verificación", + "%(creator)s created and configured the room.": "Sala creada y configurada por %(creator)s.", + "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot no logró obtener la lista de protocolo del servidor doméstico. El servidor doméstico puede ser demasiado viejo para admitir redes de terceros.", + "Riot failed to get the public room list.": "Riot no logró obtener la lista de salas públicas.", + "The homeserver may be unavailable or overloaded.": "Posiblemente el servidor de doméstico no esté disponible o esté sobrecargado.", + "Preview": "Vista previa", + "View": "Vista", + "Find a room…": "Encuentre una sala…", + "Find a room… (e.g. %(exampleRoom)s)": "Encuentre una sala... (p.ej. %(exampleRoom)s)", + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Si no puedes encontrar la habitación que buscas, solicite una invitación o Crea una nueva sala.", + "Explore rooms": "Explorar salas", + "Message not sent due to unknown sessions being present": "Mensaje no enviado debido a la presencia de sesiones desconocidas", + "Show sessions, send anyway or cancel.": "Mostrar sessiones, enviar de todas formas ocancelar.", + "Jump to first invite.": "Salte a la primera invitación.", + "Add room": "Añadir sala", + " (1/%(totalCount)s)": " (1/%(totalCount)s)", + "Guest": "Invitado", + "Your profile": "Su perfil", + "Could not load user profile": "No se pudo cargar el perfil de usuario", + "Verify this login": "Verifique este inicio de sesión", + "Session verified": "Sesión verificada", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Cambiar la contraseña restablecerá cualquier clave de cifrado de extremo a extremo en todas sus sesiones, haciendo ilegible el historial de chat cifrado. Configura la copia de seguridad de las claves o exporta las claves de la sala de otra sesión antes de restablecer la contraseña.", + "Your Matrix account on %(serverName)s": "Su cuenta de Matrix en %(serverName)s", + "Your Matrix account on ": "Su cuenta de Matrix en ", + "No identity server is configured: add one in server settings to reset your password.": "No hay ningún servidor de identidad configurado: añada uno en la configuración del servidor para poder restablecer su contraseña.", + "Sign in instead": "Regístrese", + "A verification email will be sent to your inbox to confirm setting your new password.": "Se enviará un correo electrónico de verificación a su bandeja de entrada para confirmar la configuración de su nueva contraseña.", + "Your password has been reset.": "Su contraseña ha sido restablecida.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Ha cerrado todas las sesiones y ya no recibirá más notificaciones push. Para volver a activar las notificaciones, inicie sesión de nuevo en cada dispositivo.", + "Set a new password": "Establezca una nueva contraseña", + "Invalid homeserver discovery response": "Respuesta inválida de descubrimiento de servidor doméstico", + "Failed to get autodiscovery configuration from server": "No se pudo obtener la configuración de autodescubrimiento del servidor", + "Invalid base_url for m.homeserver": "URL-base inválida para m.homeserver", + "Homeserver URL does not appear to be a valid Matrix homeserver": "La URL del servidor doméstico no parece ser un servidor doméstico válido de Matrix", + "Invalid identity server discovery response": "Respuesta inválida de descubrimiento de servidor de identidad", + "Invalid base_url for m.identity_server": "URL_base no válida para m.identity_server", + "Identity server URL does not appear to be a valid identity server": "La URL del servidor de identidad no parece ser un servidor de identidad válido", + "General failure": "Error no especificado", + "This homeserver does not support login using email address.": "Este servidor doméstico no admite iniciar sesión con una dirección de correo electrónico.", + "This account has been deactivated.": "Esta cuenta ha sido desactivada." } From 643ed5887499e82b65eda46be2579753ab7bf652 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Fri, 8 May 2020 17:50:14 +0000 Subject: [PATCH 201/319] Translated using Weblate (Ukrainian) Currently translated at 28.1% (647 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 63 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index f00ae5b399..bdef596b88 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -68,7 +68,7 @@ "Call Timeout": "Час очікування виклика", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Не вдається підключитись до домашнього серверу - перевірте підключення, переконайтесь, що ваш SSL-сертифікат домашнього сервера є довіреним і що розширення браузера не блокує запити.", "Cannot add any more widgets": "Неможливо додати більше віджетів", - "Change Password": "Поміняти пароль", + "Change Password": "Змінити пароль", "%(senderName)s changed their profile picture.": "%(senderName)s змінив/ла зображення профілю.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s змінив(ла) рівень доступу для %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінив/ла назву кімнати на %(roomName)s.", @@ -108,7 +108,7 @@ "All notifications are currently disabled for all targets.": "Сповіщення для усіх цілей на даний момент вимкнені.", "Failed to send logs: ": "Не вдалося відправити журнали: ", "delete the alias.": "видалити псевдонім.", - "To return to your account in future you need to set a password": "Щоб мати змогу використовувати вашу обліковку у майбутньому, зазначте пароль", + "To return to your account in future you need to set a password": "Щоб мати змогу використовувати вашу обліківку у майбутньому, зазначте пароль", "Forget": "Забути", "World readable": "Відкрито для світу", "You cannot delete this image. (%(code)s)": "Ви не можете видалити це зображення. (%(code)s)", @@ -138,7 +138,7 @@ "Collecting app version information": "Збір інформації про версію застосунка", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Видалити псевдонім %(alias)s та прибрати з каталогу %(name)s?", "Keywords": "Ключові слова", - "Enable notifications for this account": "Увімкнути сповіщення для цієї обліковки", + "Enable notifications for this account": "Увімкнути сповіщення для цієї обліківки", "Invite to this community": "Запросити в це суспільство", "Messages containing keywords": "Повідомлення, що містять ключові слова", "When I'm invited to a room": "Коли мене запрошено до кімнати", @@ -201,7 +201,7 @@ "Error encountered (%(errorDetail)s).": "Трапилась помилка (%(errorDetail)s).", "Low Priority": "Неважливі", "Unable to fetch notification target list": "Неможливо отримати перелік цілей сповіщення", - "Set Password": "Задати пароль", + "Set Password": "Встановити пароль", "Off": "Вимкнено", "Riot does not know how to join a room on this network": "Riot не знає як приєднатись до кімнати у цій мережі", "Mentions only": "Тільки згадки", @@ -594,7 +594,7 @@ "Review": "Переглянути", "Verify yourself & others to keep your chats safe": "Звірте себе й інших щоб зберегти ваше спілкування у безпеці", "Verify": "Звірити", - "Verify the new login accessing your account: %(name)s": "Звірити новий вхід, що доступається до вашої обліковки: %(name)s", + "Verify the new login accessing your account: %(name)s": "Звірити новий вхід, що доступається до вашої обліківки: %(name)s", "From %(deviceName)s (%(deviceId)s)": "Від %(deviceName)s (%(deviceId)s)", "Decline (%(counter)s)": "Відхилити (%(counter)s)", "Language and region": "Мова та регіон", @@ -609,5 +609,56 @@ "Join the conversation with an account": "Приєднатись до бесіди з обліківкою", "Unable to restore session": "Неможливо відновити сесію", "We encountered an error trying to restore your previous session.": "Ми натрапили на помилку, намагаючись відновити вашу попередню сесію.", - "Please install Chrome, Firefox, or Safari for the best experience.": "Для найкращих вражень від користування встановіть, будь ласка, Chrome, Firefox, або Safari." + "Please install Chrome, Firefox, or Safari for the best experience.": "Для найкращих вражень від користування встановіть, будь ласка, Chrome, Firefox, або Safari.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Ваша обліківка має перехресно-підписувану ідентичність у таємному сховищі, але вона ще не є довіреною у цій сесії.", + "in account data": "у даних обліківки", + "Clear notifications": "Очистити сповіщення", + "Add an email address to configure email notifications": "Додати адресу е-пошти для налаштування поштових сповіщень", + "Theme added!": "Тему додано!", + "Email addresses": "Адреси е-пошти", + "Phone numbers": "Номери телефонів", + "Set a new account password...": "Встановити новий пароль обліківки…", + "Forget this room": "Забути цю кімнату", + "Re-join": "Перепід'єднатись", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Це запрошення до %(roomName)s було надіслане на %(email)s, яка не пов'язана з вашою обліківкою", + "Link this email with your account in Settings to receive invites directly in Riot.": "Зв'яжіть цю е-пошту з вашою обліківкою у Налаштуваннях щоб отримувати сповіщення прямо у Riot.", + "This invite to %(roomName)s was sent to %(email)s": "Це запрошення до %(roomName)s було надіслане на %(email)s", + "Use an identity server in Settings to receive invites directly in Riot.": "Використовувати сервер ідентифікації у Налаштуваннях щоб отримувати запрошення прямо у Riot.", + "Are you sure you want to deactivate your account? This is irreversible.": "Ви впевнені у тому, що бажаєте деактивувати вашу обліківку? Це є безповоротним.", + "Confirm account deactivation": "Підтвердьте деактивацію обліківки", + "To continue, please enter your password:": "Щоб продовжити, введіть, будь ласка, ваш пароль:", + "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. This action is irreversible.": "Ваша обліківка стане назавжди невикористовною. Ви не матимете змоги увійти в неї і ніхто не зможе перереєструватись під цим користувацьким ID. Це призведе до виходу вашої обліківки з усіх кімнат та до видалення деталей вашої обліківки з вашого серверу ідентифікації. Ця дія є безповоротною.", + "Verify session": "Звірити сесію", + "Use Legacy Verification (for older clients)": "Використати успадковане звірення (для старих клієнтів)", + "Verify by comparing a short text string.": "Звірити порівнянням короткого текстового рядка.", + "Begin Verifying": "Почати звіряння", + "Waiting for partner to accept...": "Очікується підтвердження партнером…", + "Nothing appearing? Not all clients support interactive verification yet. .": "Нічого не з'являється? Поки що не всі клієнти підтримують взаємодійне звірення. .", + "Waiting for %(userId)s to confirm...": "Очікується підтвердження від %(userId)s…", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Щоб впевнитись, що цій сесії можна довіряти, переконайтесь, будь ласка, що показуваний у Налаштуваннях на тому пристрої ключ збігається з ключем внизу:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Щоб впевнитись, що цій сесії можна довіряти, зв'яжіться, будь ласка, з її власником якимось іншим шляхом (напр. через телефон або зустріч) і переконайтесь, що показуваний у Налаштуваннях на їхньому пристрої ключ збігається з ключем внизу:", + "Use two-way text verification": "Використати двонапрямне текстове звірення", + "Session name": "Назва сесії", + "Session ID": "ID сесії", + "Session key": "Ключ сесії", + "%(count)s of your messages have not been sent.|one": "Ваше повідомлення не було надіслано.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Перенадіслати усе або скасувати усе зараз. Ви також можете перенадіслати або скасувати окремі повідомлення.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Перенадіслати повідомлення або скасувати повідомлення зараз.", + "Connectivity to the server has been lost.": "З'єднання з сервером було втрачено.", + "Sent messages will be stored until your connection has returned.": "Надіслані повідомлення будуть збережені поки не з'явиться зв'язок.", + "Active call": "Активний виклик", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Тут нікого нема! Ви б хотіли запросити інших чи краще припинити попереджати про порожню кімнату?", + "Jump to first unread room.": "Перейти до першої непрочитаної кімнати.", + "Jump to first invite.": "Перейти до першого запрошення.", + "Add room": "Додати кімнату", + "You seem to be uploading files, are you sure you want to quit?": "Схоже, що ви зараз відвантажуєте файли. Ви впевнені, що хочете вийти?", + "You seem to be in a call, are you sure you want to quit?": "Схоже, ви намагаєтесь вийти посеред розмови. Ви впевнені, що хочете вийти?", + "Search failed": "Пошук не вдався", + "Server may be unavailable, overloaded, or search timed out :(": "Сервер може бути недосяжним, перевантаженим або запит на пошук застарів :(", + "No more results": "Інших результатів нема", + "Unknown room %(roomId)s": "Невідома кімната %(roomId)s", + "Room": "Кімната", + "Failed to reject invite": "Не вдалось відхилити запрошення", + "You have %(count)s unread notifications in a prior version of this room.|other": "Ви маєте %(count)s непрочитаних сповіщень у попередній версії цієї кімнати.", + "You have %(count)s unread notifications in a prior version of this room.|one": "У вас одне непрочитане сповіщення у попередній версії цієї кімнати." } From 6ea9aebda3e85afb2724a0455740a3f1c4c972d0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 10:54:28 +0100 Subject: [PATCH 202/319] Add slash commands /query and /msg to match IRC Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.tsx | 46 +++++++++++++++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 2 ++ 2 files changed, 48 insertions(+) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index bd7e60e2f4..ea561d9f12 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -40,6 +40,7 @@ import { Jitsi } from "./widgets/Jitsi"; import { parseFragment as parseHtml } from "parse5"; import sendBugReport from "./rageshake/submit-rageshake"; import SdkConfig from "./SdkConfig"; +import { ensureDMExists } from "./createRoom"; // XXX: workaround for https://github.com/microsoft/TypeScript/issues/31816 interface HTMLInputEvent extends Event { @@ -970,6 +971,51 @@ export const Commands = [ }, category: CommandCategories.advanced, }), + new Command({ + command: "query", + description: _td("Opens chat with the given user"), + args: "", + runFn: function(roomId, userId) { + if (!userId || !userId.startsWith("@") || !userId.includes(":")) { + return reject(this.getUsage()); + } + + return success((async () => { + dis.dispatch({ + action: 'view_room', + room_id: await ensureDMExists(MatrixClientPeg.get(), userId), + }); + })()); + }, + category: CommandCategories.actions, + }), + new Command({ + command: "msg", + description: _td("Sends a message to the given user"), + args: " ", + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)(?: +(.*))?$/s); + if (matches) { + const [userId, msg] = matches.slice(1); + if (msg && userId && userId.startsWith("@") && userId.includes(":")) { + return success((async () => { + const cli = MatrixClientPeg.get(); + const roomId = await ensureDMExists(cli, userId); + dis.dispatch({ + action: 'view_room', + room_id: roomId, + }); + cli.sendTextMessage(roomId, msg); + })()); + } + } + } + + return reject(this.getUsage()); + }, + category: CommandCategories.actions, + }), // Command definitions for autocompletion ONLY: // /me is special because its not handled by SlashCommands.js and is instead done inside the Composer classes diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 27b4252f77..ec5400179d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -221,6 +221,8 @@ "Send a bug report with logs": "Send a bug report with logs", "Logs sent": "Logs sent", "Thank you!": "Thank you!", + "Opens chat with the given user": "Opens chat with the given user", + "Sends a message to the given user": "Sends a message to the given user", "Displays action": "Displays action", "Reason": "Reason", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", From 293bd15ee90a6cafd610aedd48f2bada3710b4af Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 11:05:03 +0100 Subject: [PATCH 203/319] fix variable name shadowing Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index ea561d9f12..3fa6c0d7ee 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -993,7 +993,7 @@ export const Commands = [ command: "msg", description: _td("Sends a message to the given user"), args: " ", - runFn: function(roomId, args) { + runFn: function(_, args) { if (args) { const matches = args.match(/^(\S+?)(?: +(.*))?$/s); if (matches) { From 6486c749095e577ce08af4c900f9d570d06c5859 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 11 May 2020 14:21:59 +0100 Subject: [PATCH 204/319] Fix passphrase reset in key backup restore dialog We prompt to restore the key backup when bootstrapping if it's not trusted, but the 'set up new recovery options' in this dialog just sets up a new key backup which just goes back to trying to access SSSS if cross-signing is enabled. This makes it reset the SSSS passphase instead. Fixes https://github.com/vector-im/riot-web/issues/13578 --- .../keybackup/RestoreKeyBackupDialog.js | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js index f1008dfcb0..7e51e76f6c 100644 --- a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js @@ -23,6 +23,7 @@ import { MatrixClient } from 'matrix-js-sdk'; import Modal from '../../../../Modal'; import { _t } from '../../../../languageHandler'; import { accessSecretStorage } from '../../../../CrossSigningManager'; +import SettingsStore from "../../../../settings/SettingsStore"; const RESTORE_TYPE_PASSPHRASE = 0; const RESTORE_TYPE_RECOVERYKEY = 1; @@ -89,14 +90,21 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { _onResetRecoveryClick = () => { this.props.onFinished(false); - Modal.createTrackedDialogAsync('Key Backup', 'Key Backup', - import('../../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'), - { - onFinished: () => { - this._loadBackupStatus(); - }, - }, null, /* priority = */ false, /* static = */ true, - ); + + if (SettingsStore.getValue("feature_cross_signing")) { + // If cross-signing is enabled, we reset the SSSS recovery passphrase (and cross-signing keys) + this.props.onFinished(false); + accessSecretStorage(() => {}, /* forceReset = */ true); + } else { + Modal.createTrackedDialogAsync('Key Backup', 'Key Backup', + import('../../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'), + { + onFinished: () => { + this._loadBackupStatus(); + }, + }, null, /* priority = */ false, /* static = */ true, + ); + } } _onRecoveryKeyChange = (e) => { From 3e934c80816aaab1fb7c67ccb53cad7b757f7aa6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 15:17:25 +0100 Subject: [PATCH 205/319] Send cross-signing debug booleans over rageshake Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/rageshake/submit-rageshake.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 921f3fbf40..d01fa66655 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -109,7 +109,29 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp keys.push(`curve25519:${client.getDeviceCurve25519Key()}`); } body.append('device_keys', keys.join(', ')); - body.append('cross_signing_key', client.getCrossSigningId()); + + // add cross-signing status information + const crossSigning = client._crypto._crossSigningInfo; + const secretStorage = client._crypto._secretStorage; + + body.append("cross_signing_key", crossSigning.getId()); + body.append("cross_signing_pk_in_ssss", + String(!!(await crossSigning.isStoredInSecretStorage(secretStorage)))); + body.append("ssss_key_in_account", String(!!(await secretStorage.hasKey()))); + + const pkCache = client.getCrossSigningCacheCallbacks(); + body.append("self_signing_pk_cached", + String(!!(pkCache && await pkCache.getCrossSigningKeyCache("self_signing")))); + body.append("user_signing_pk_cached", + String(!!(pkCache && await pkCache.getCrossSigningKeyCache("user_signing")))); + + const sessionBackupKeyFromCache = await client._crypto.getSessionBackupPrivateKey(); + body.append("session_backup_key_cached", String(!!sessionBackupKeyFromCache)); + body.append("session_backup_key_well_formed", String(sessionBackupKeyFromCache instanceof Uint8Array)); + body.append("cross_signing_supported_by_hs", + String(await client.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"))); + body.append("cross_signing_ready", String(await client.isCrossSigningReady())); + body.append("ssss_key_needs_upgrade", String(await client.secretStorageKeyNeedsUpgrade())); } if (opts.label) { From 0e8bd59d2f2937ce7e43e98c0f4038cb7df35811 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 15:43:34 +0100 Subject: [PATCH 206/319] View Source should target the replacing event rather than the root one Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/context_menus/MessageContextMenu.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 452489aa65..70ab80e6cc 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -130,22 +130,24 @@ export default createReactClass({ }, onViewSourceClick: function() { + const ev = this.props.mxEvent.replacingEvent() || this.props.mxEvent; const ViewSource = sdk.getComponent('structures.ViewSource'); Modal.createTrackedDialog('View Event Source', '', ViewSource, { - roomId: this.props.mxEvent.getRoomId(), - eventId: this.props.mxEvent.getId(), - content: this.props.mxEvent.event, + roomId: ev.getRoomId(), + eventId: ev.getId(), + content: ev.event, }, 'mx_Dialog_viewsource'); this.closeMenu(); }, onViewClearSourceClick: function() { + const ev = this.props.mxEvent.replacingEvent() || this.props.mxEvent; const ViewSource = sdk.getComponent('structures.ViewSource'); Modal.createTrackedDialog('View Clear Event Source', '', ViewSource, { - roomId: this.props.mxEvent.getRoomId(), - eventId: this.props.mxEvent.getId(), + roomId: ev.getRoomId(), + eventId: ev.getId(), // FIXME: _clearEvent is private - content: this.props.mxEvent._clearEvent, + content: ev._clearEvent, }, 'mx_Dialog_viewsource'); this.closeMenu(); }, From f487c2b38cb04202abc5c220ba6f7b652d4a39f2 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 11 May 2020 16:21:08 +0100 Subject: [PATCH 207/319] Fix rageshake with no matrix client We checked for the presence of a matrix client but then went and called a method on it assuming it existed on the line below, so, don't do that. https://github.com/vector-im/riot-web/issues/13624 pointed this out --- src/rageshake/submit-rageshake.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 921f3fbf40..1ef68637cf 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -101,15 +101,15 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp if (client) { body.append('user_id', client.credentials.userId); body.append('device_id', client.deviceId); - } - if (client.isCryptoEnabled()) { - const keys = [`ed25519:${client.getDeviceEd25519Key()}`]; - if (client.getDeviceCurve25519Key) { - keys.push(`curve25519:${client.getDeviceCurve25519Key()}`); + if (client.isCryptoEnabled()) { + const keys = [`ed25519:${client.getDeviceEd25519Key()}`]; + if (client.getDeviceCurve25519Key) { + keys.push(`curve25519:${client.getDeviceCurve25519Key()}`); + } + body.append('device_keys', keys.join(', ')); + body.append('cross_signing_key', client.getCrossSigningId()); } - body.append('device_keys', keys.join(', ')); - body.append('cross_signing_key', client.getCrossSigningId()); } if (opts.label) { From c0061e2f2a879655d62abc2983af96b175c943f5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 16:39:14 +0100 Subject: [PATCH 208/319] Don't try and redact redactions for "Remove recent messages" Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/right_panel/UserInfo.js | 2 +- src/components/views/rooms/MemberInfo.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 61f5a8161a..478dc90418 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -557,7 +557,7 @@ const RedactMessagesButton = ({member}) => { let eventsToRedact = []; while (timeline) { eventsToRedact = timeline.getEvents().reduce((events, event) => { - if (event.getSender() === userId && !event.isRedacted()) { + if (event.getSender() === userId && !event.isRedacted() && !event.isRedaction()) { return events.concat(event); } else { return events; diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index be3e8cf971..6b03000961 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -364,7 +364,7 @@ export default createReactClass({ let eventsToRedact = []; for (const timeline of timelineSet.getTimelines()) { eventsToRedact = timeline.getEvents().reduce((events, event) => { - if (event.getSender() === userId && !event.isRedacted()) { + if (event.getSender() === userId && !event.isRedacted() && !event.isRedaction()) { return events.concat(event); } else { return events; From c2dcb60f0b9257c2a9e8263c1637a9b80eb1ba78 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 20:10:45 +0100 Subject: [PATCH 209/319] Prompt user to specify an alternate server if their chosen one has registration disabled Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/auth/Registration.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index c74f6ed6e3..7818496e71 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -267,6 +267,7 @@ export default createReactClass({ dis.dispatch({action: 'start_login'}); } else { this.setState({ + serverErrorIsFatal: true, // fatal because user cannot continue on this server errorText: _t("Registration has been disabled on this homeserver."), // add empty flows array to get rid of spinner flows: [], From 3bb800bb81bf761c011db4a2fe08d61c325e86a4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 22:04:18 +0100 Subject: [PATCH 210/319] Replace png flags with use of Twemoji Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_Dropdown.scss | 8 +++++++- res/img/flags/AD.png | Bin 2584 -> 0 bytes res/img/flags/AE.png | Bin 1015 -> 0 bytes res/img/flags/AF.png | Bin 2578 -> 0 bytes res/img/flags/AG.png | Bin 4234 -> 0 bytes res/img/flags/AI.png | Bin 4765 -> 0 bytes res/img/flags/AL.png | Bin 3094 -> 0 bytes res/img/flags/AM.png | Bin 654 -> 0 bytes res/img/flags/AO.png | Bin 2449 -> 0 bytes res/img/flags/AQ.png | Bin 3910 -> 0 bytes res/img/flags/AR.png | Bin 1666 -> 0 bytes res/img/flags/AS.png | Bin 3977 -> 0 bytes res/img/flags/AT.png | Bin 655 -> 0 bytes res/img/flags/AU.png | Bin 5229 -> 0 bytes res/img/flags/AW.png | Bin 1650 -> 0 bytes res/img/flags/AX.png | Bin 1844 -> 0 bytes res/img/flags/AZ.png | Bin 1744 -> 0 bytes res/img/flags/BA.png | Bin 3048 -> 0 bytes res/img/flags/BB.png | Bin 2078 -> 0 bytes res/img/flags/BD.png | Bin 2819 -> 0 bytes res/img/flags/BE.png | Bin 558 -> 0 bytes res/img/flags/BF.png | Bin 1596 -> 0 bytes res/img/flags/BG.png | Bin 659 -> 0 bytes res/img/flags/BH.png | Bin 1374 -> 0 bytes res/img/flags/BI.png | Bin 5652 -> 0 bytes res/img/flags/BJ.png | Bin 811 -> 0 bytes res/img/flags/BL.png | Bin 566 -> 0 bytes res/img/flags/BM.png | Bin 5295 -> 0 bytes res/img/flags/BN.png | Bin 5290 -> 0 bytes res/img/flags/BO.png | Bin 668 -> 0 bytes res/img/flags/BQ.png | Bin 672 -> 0 bytes res/img/flags/BR.png | Bin 4852 -> 0 bytes res/img/flags/BS.png | Bin 2291 -> 0 bytes res/img/flags/BT.png | Bin 4879 -> 0 bytes res/img/flags/BV.png | Bin 1695 -> 0 bytes res/img/flags/BW.png | Bin 669 -> 0 bytes res/img/flags/BY.png | Bin 2023 -> 0 bytes res/img/flags/BZ.png | Bin 5281 -> 0 bytes res/img/flags/CA.png | Bin 2246 -> 0 bytes res/img/flags/CC.png | Bin 3728 -> 0 bytes res/img/flags/CD.png | Bin 3704 -> 0 bytes res/img/flags/CF.png | Bin 2655 -> 0 bytes res/img/flags/CG.png | Bin 1381 -> 0 bytes res/img/flags/CH.png | Bin 1500 -> 0 bytes res/img/flags/CI.png | Bin 568 -> 0 bytes res/img/flags/CK.png | Bin 6029 -> 0 bytes res/img/flags/CL.png | Bin 1632 -> 0 bytes res/img/flags/CM.png | Bin 1409 -> 0 bytes res/img/flags/CN.png | Bin 2215 -> 0 bytes res/img/flags/CO.png | Bin 668 -> 0 bytes res/img/flags/CR.png | Bin 785 -> 0 bytes res/img/flags/CU.png | Bin 3023 -> 0 bytes res/img/flags/CV.png | Bin 2695 -> 0 bytes res/img/flags/CW.png | Bin 1756 -> 0 bytes res/img/flags/CX.png | Bin 5152 -> 0 bytes res/img/flags/CY.png | Bin 3540 -> 0 bytes res/img/flags/CZ.png | Bin 1711 -> 0 bytes res/img/flags/DE.png | Bin 568 -> 0 bytes res/img/flags/DJ.png | Bin 3562 -> 0 bytes res/img/flags/DK.png | Bin 1233 -> 0 bytes res/img/flags/DM.png | Bin 2636 -> 0 bytes res/img/flags/DO.png | Bin 1682 -> 0 bytes res/img/flags/DZ.png | Bin 2506 -> 0 bytes res/img/flags/EC.png | Bin 2818 -> 0 bytes res/img/flags/EE.png | Bin 641 -> 0 bytes res/img/flags/EG.png | Bin 1611 -> 0 bytes res/img/flags/EH.png | Bin 2687 -> 0 bytes res/img/flags/ER.png | Bin 4082 -> 0 bytes res/img/flags/ES.png | Bin 2144 -> 0 bytes res/img/flags/ET.png | Bin 3460 -> 0 bytes res/img/flags/FI.png | Bin 1558 -> 0 bytes res/img/flags/FJ.png | Bin 5060 -> 0 bytes res/img/flags/FK.png | Bin 5273 -> 0 bytes res/img/flags/FM.png | Bin 2410 -> 0 bytes res/img/flags/FO.png | Bin 1715 -> 0 bytes res/img/flags/FR.png | Bin 566 -> 0 bytes res/img/flags/GA.png | Bin 661 -> 0 bytes res/img/flags/GB.png | Bin 6309 -> 0 bytes res/img/flags/GD.png | Bin 5753 -> 0 bytes res/img/flags/GE.png | Bin 2583 -> 0 bytes res/img/flags/GF.png | Bin 2342 -> 0 bytes res/img/flags/GG.png | Bin 2777 -> 0 bytes res/img/flags/GH.png | Bin 1864 -> 0 bytes res/img/flags/GI.png | Bin 2750 -> 0 bytes res/img/flags/GL.png | Bin 3101 -> 0 bytes res/img/flags/GM.png | Bin 709 -> 0 bytes res/img/flags/GN.png | Bin 560 -> 0 bytes res/img/flags/GP.png | Bin 5619 -> 0 bytes res/img/flags/GQ.png | Bin 3090 -> 0 bytes res/img/flags/GR.png | Bin 2035 -> 0 bytes res/img/flags/GS.png | Bin 5684 -> 0 bytes res/img/flags/GT.png | Bin 1830 -> 0 bytes res/img/flags/GU.png | Bin 2591 -> 0 bytes res/img/flags/GW.png | Bin 1608 -> 0 bytes res/img/flags/GY.png | Bin 5108 -> 0 bytes res/img/flags/HK.png | Bin 3001 -> 0 bytes res/img/flags/HM.png | Bin 5229 -> 0 bytes res/img/flags/HN.png | Bin 1644 -> 0 bytes res/img/flags/HR.png | Bin 2420 -> 0 bytes res/img/flags/HT.png | Bin 1944 -> 0 bytes res/img/flags/HU.png | Bin 677 -> 0 bytes res/img/flags/ID.png | Bin 579 -> 0 bytes res/img/flags/IE.png | Bin 553 -> 0 bytes res/img/flags/IL.png | Bin 1856 -> 0 bytes res/img/flags/IM.png | Bin 2533 -> 0 bytes res/img/flags/IN.png | Bin 1687 -> 0 bytes res/img/flags/IO.png | Bin 8096 -> 0 bytes res/img/flags/IQ.png | Bin 2119 -> 0 bytes res/img/flags/IR.png | Bin 4018 -> 0 bytes res/img/flags/IS.png | Bin 1483 -> 0 bytes res/img/flags/IT.png | Bin 572 -> 0 bytes res/img/flags/JE.png | Bin 3023 -> 0 bytes res/img/flags/JM.png | Bin 3663 -> 0 bytes res/img/flags/JO.png | Bin 2572 -> 0 bytes res/img/flags/JP.png | Bin 2402 -> 0 bytes res/img/flags/KE.png | Bin 2738 -> 0 bytes res/img/flags/KG.png | Bin 3258 -> 0 bytes res/img/flags/KH.png | Bin 2888 -> 0 bytes res/img/flags/KI.png | Bin 3661 -> 0 bytes res/img/flags/KM.png | Bin 4023 -> 0 bytes res/img/flags/KN.png | Bin 4213 -> 0 bytes res/img/flags/KP.png | Bin 2293 -> 0 bytes res/img/flags/KR.png | Bin 4837 -> 0 bytes res/img/flags/KW.png | Bin 1667 -> 0 bytes res/img/flags/KY.png | Bin 5285 -> 0 bytes res/img/flags/KZ.png | Bin 3466 -> 0 bytes res/img/flags/LA.png | Bin 2119 -> 0 bytes res/img/flags/LB.png | Bin 2537 -> 0 bytes res/img/flags/LC.png | Bin 2445 -> 0 bytes res/img/flags/LI.png | Bin 1759 -> 0 bytes res/img/flags/LK.png | Bin 5077 -> 0 bytes res/img/flags/LR.png | Bin 1903 -> 0 bytes res/img/flags/LS.png | Bin 1848 -> 0 bytes res/img/flags/LT.png | Bin 640 -> 0 bytes res/img/flags/LU.png | Bin 677 -> 0 bytes res/img/flags/LV.png | Bin 641 -> 0 bytes res/img/flags/LY.png | Bin 1273 -> 0 bytes res/img/flags/MA.png | Bin 1449 -> 0 bytes res/img/flags/MC.png | Bin 574 -> 0 bytes res/img/flags/MD.png | Bin 2238 -> 0 bytes res/img/flags/ME.png | Bin 2965 -> 0 bytes res/img/flags/MF.png | Bin 566 -> 0 bytes res/img/flags/MG.png | Bin 823 -> 0 bytes res/img/flags/MH.png | Bin 5594 -> 0 bytes res/img/flags/MK.png | Bin 5066 -> 0 bytes res/img/flags/ML.png | Bin 552 -> 0 bytes res/img/flags/MM.png | Bin 3123 -> 0 bytes res/img/flags/MN.png | Bin 2328 -> 0 bytes res/img/flags/MO.png | Bin 2994 -> 0 bytes res/img/flags/MP.png | Bin 4619 -> 0 bytes res/img/flags/MQ.png | Bin 5810 -> 0 bytes res/img/flags/MR.png | Bin 2897 -> 0 bytes res/img/flags/MS.png | Bin 4967 -> 0 bytes res/img/flags/MT.png | Bin 1324 -> 0 bytes res/img/flags/MU.png | Bin 723 -> 0 bytes res/img/flags/MV.png | Bin 2047 -> 0 bytes res/img/flags/MW.png | Bin 2141 -> 0 bytes res/img/flags/MX.png | Bin 2140 -> 0 bytes res/img/flags/MY.png | Bin 3081 -> 0 bytes res/img/flags/MZ.png | Bin 3367 -> 0 bytes res/img/flags/NA.png | Bin 3679 -> 0 bytes res/img/flags/NC.png | Bin 3254 -> 0 bytes res/img/flags/NE.png | Bin 1660 -> 0 bytes res/img/flags/NF.png | Bin 2520 -> 0 bytes res/img/flags/NG.png | Bin 563 -> 0 bytes res/img/flags/NI.png | Bin 1701 -> 0 bytes res/img/flags/NL.png | Bin 672 -> 0 bytes res/img/flags/NO.png | Bin 1695 -> 0 bytes res/img/flags/NP.png | Bin 4044 -> 0 bytes res/img/flags/NR.png | Bin 1620 -> 0 bytes res/img/flags/NU.png | Bin 3319 -> 0 bytes res/img/flags/NZ.png | Bin 4697 -> 0 bytes res/img/flags/OM.png | Bin 1886 -> 0 bytes res/img/flags/PA.png | Bin 2285 -> 0 bytes res/img/flags/PE.png | Bin 556 -> 0 bytes res/img/flags/PF.png | Bin 2379 -> 0 bytes res/img/flags/PG.png | Bin 4393 -> 0 bytes res/img/flags/PH.png | Bin 3160 -> 0 bytes res/img/flags/PK.png | Bin 3165 -> 0 bytes res/img/flags/PL.png | Bin 567 -> 0 bytes res/img/flags/PM.png | Bin 8583 -> 0 bytes res/img/flags/PN.png | Bin 5945 -> 0 bytes res/img/flags/PR.png | Bin 3673 -> 0 bytes res/img/flags/PS.png | Bin 2147 -> 0 bytes res/img/flags/PT.png | Bin 2617 -> 0 bytes res/img/flags/PW.png | Bin 2714 -> 0 bytes res/img/flags/PY.png | Bin 1519 -> 0 bytes res/img/flags/QA.png | Bin 1564 -> 0 bytes res/img/flags/RE.png | Bin 566 -> 0 bytes res/img/flags/RO.png | Bin 555 -> 0 bytes res/img/flags/RS.png | Bin 3349 -> 0 bytes res/img/flags/RU.png | Bin 662 -> 0 bytes res/img/flags/RW.png | Bin 1695 -> 0 bytes res/img/flags/SA.png | Bin 3750 -> 0 bytes res/img/flags/SB.png | Bin 3424 -> 0 bytes res/img/flags/SC.png | Bin 3704 -> 0 bytes res/img/flags/SD.png | Bin 2103 -> 0 bytes res/img/flags/SE.png | Bin 1278 -> 0 bytes res/img/flags/SG.png | Bin 2210 -> 0 bytes res/img/flags/SH.png | Bin 4615 -> 0 bytes res/img/flags/SI.png | Bin 1613 -> 0 bytes res/img/flags/SJ.png | Bin 1695 -> 0 bytes res/img/flags/SK.png | Bin 2932 -> 0 bytes res/img/flags/SL.png | Bin 676 -> 0 bytes res/img/flags/SM.png | Bin 3009 -> 0 bytes res/img/flags/SN.png | Bin 1530 -> 0 bytes res/img/flags/SO.png | Bin 1958 -> 0 bytes res/img/flags/SR.png | Bin 1942 -> 0 bytes res/img/flags/SS.png | Bin 3072 -> 0 bytes res/img/flags/ST.png | Bin 2945 -> 0 bytes res/img/flags/SV.png | Bin 1666 -> 0 bytes res/img/flags/SX.png | Bin 3485 -> 0 bytes res/img/flags/SY.png | Bin 1195 -> 0 bytes res/img/flags/SZ.png | Bin 4133 -> 0 bytes res/img/flags/TC.png | Bin 4631 -> 0 bytes res/img/flags/TD.png | Bin 567 -> 0 bytes res/img/flags/TF.png | Bin 566 -> 0 bytes res/img/flags/TG.png | Bin 2523 -> 0 bytes res/img/flags/TH.png | Bin 764 -> 0 bytes res/img/flags/TJ.png | Bin 1647 -> 0 bytes res/img/flags/TK.png | Bin 4829 -> 0 bytes res/img/flags/TL.png | Bin 3046 -> 0 bytes res/img/flags/TM.png | Bin 3925 -> 0 bytes res/img/flags/TN.png | Bin 2635 -> 0 bytes res/img/flags/TO.png | Bin 1618 -> 0 bytes res/img/flags/TR.png | Bin 2875 -> 0 bytes res/img/flags/TT.png | Bin 5253 -> 0 bytes res/img/flags/TV.png | Bin 5915 -> 0 bytes res/img/flags/TW.png | Bin 2108 -> 0 bytes res/img/flags/TZ.png | Bin 2289 -> 0 bytes res/img/flags/UA.png | Bin 568 -> 0 bytes res/img/flags/UG.png | Bin 1973 -> 0 bytes res/img/flags/US.png | Bin 2845 -> 0 bytes res/img/flags/UY.png | Bin 2542 -> 0 bytes res/img/flags/UZ.png | Bin 1745 -> 0 bytes res/img/flags/VA.png | Bin 2211 -> 0 bytes res/img/flags/VC.png | Bin 2105 -> 0 bytes res/img/flags/VE.png | Bin 2157 -> 0 bytes res/img/flags/VG.png | Bin 5427 -> 0 bytes res/img/flags/VI.png | Bin 5938 -> 0 bytes res/img/flags/VN.png | Bin 2304 -> 0 bytes res/img/flags/VU.png | Bin 4080 -> 0 bytes res/img/flags/WF.png | Bin 2509 -> 0 bytes res/img/flags/WS.png | Bin 1896 -> 0 bytes res/img/flags/YE.png | Bin 652 -> 0 bytes res/img/flags/YT.png | Bin 5735 -> 0 bytes res/img/flags/ZA.png | Bin 3595 -> 0 bytes res/img/flags/ZM.png | Bin 1787 -> 0 bytes res/img/flags/ZW.png | Bin 2802 -> 0 bytes src/components/views/auth/CountryDropdown.js | 4 ++-- src/{phonenumber.js => phonenumber.ts} | 12 +++++++++++- 251 files changed, 20 insertions(+), 4 deletions(-) delete mode 100644 res/img/flags/AD.png delete mode 100644 res/img/flags/AE.png delete mode 100644 res/img/flags/AF.png delete mode 100644 res/img/flags/AG.png delete mode 100644 res/img/flags/AI.png delete mode 100644 res/img/flags/AL.png delete mode 100644 res/img/flags/AM.png delete mode 100644 res/img/flags/AO.png delete mode 100644 res/img/flags/AQ.png delete mode 100644 res/img/flags/AR.png delete mode 100644 res/img/flags/AS.png delete mode 100644 res/img/flags/AT.png delete mode 100644 res/img/flags/AU.png delete mode 100644 res/img/flags/AW.png delete mode 100644 res/img/flags/AX.png delete mode 100644 res/img/flags/AZ.png delete mode 100644 res/img/flags/BA.png delete mode 100644 res/img/flags/BB.png delete mode 100644 res/img/flags/BD.png delete mode 100644 res/img/flags/BE.png delete mode 100644 res/img/flags/BF.png delete mode 100644 res/img/flags/BG.png delete mode 100644 res/img/flags/BH.png delete mode 100644 res/img/flags/BI.png delete mode 100644 res/img/flags/BJ.png delete mode 100644 res/img/flags/BL.png delete mode 100644 res/img/flags/BM.png delete mode 100644 res/img/flags/BN.png delete mode 100644 res/img/flags/BO.png delete mode 100644 res/img/flags/BQ.png delete mode 100644 res/img/flags/BR.png delete mode 100644 res/img/flags/BS.png delete mode 100644 res/img/flags/BT.png delete mode 100644 res/img/flags/BV.png delete mode 100644 res/img/flags/BW.png delete mode 100644 res/img/flags/BY.png delete mode 100644 res/img/flags/BZ.png delete mode 100644 res/img/flags/CA.png delete mode 100644 res/img/flags/CC.png delete mode 100644 res/img/flags/CD.png delete mode 100644 res/img/flags/CF.png delete mode 100644 res/img/flags/CG.png delete mode 100644 res/img/flags/CH.png delete mode 100644 res/img/flags/CI.png delete mode 100644 res/img/flags/CK.png delete mode 100644 res/img/flags/CL.png delete mode 100644 res/img/flags/CM.png delete mode 100644 res/img/flags/CN.png delete mode 100644 res/img/flags/CO.png delete mode 100644 res/img/flags/CR.png delete mode 100644 res/img/flags/CU.png delete mode 100644 res/img/flags/CV.png delete mode 100644 res/img/flags/CW.png delete mode 100644 res/img/flags/CX.png delete mode 100644 res/img/flags/CY.png delete mode 100644 res/img/flags/CZ.png delete mode 100644 res/img/flags/DE.png delete mode 100644 res/img/flags/DJ.png delete mode 100644 res/img/flags/DK.png delete mode 100644 res/img/flags/DM.png delete mode 100644 res/img/flags/DO.png delete mode 100644 res/img/flags/DZ.png delete mode 100644 res/img/flags/EC.png delete mode 100644 res/img/flags/EE.png delete mode 100644 res/img/flags/EG.png delete mode 100644 res/img/flags/EH.png delete mode 100644 res/img/flags/ER.png delete mode 100644 res/img/flags/ES.png delete mode 100644 res/img/flags/ET.png delete mode 100644 res/img/flags/FI.png delete mode 100644 res/img/flags/FJ.png delete mode 100644 res/img/flags/FK.png delete mode 100644 res/img/flags/FM.png delete mode 100644 res/img/flags/FO.png delete mode 100644 res/img/flags/FR.png delete mode 100644 res/img/flags/GA.png delete mode 100644 res/img/flags/GB.png delete mode 100644 res/img/flags/GD.png delete mode 100644 res/img/flags/GE.png delete mode 100644 res/img/flags/GF.png delete mode 100644 res/img/flags/GG.png delete mode 100644 res/img/flags/GH.png delete mode 100644 res/img/flags/GI.png delete mode 100644 res/img/flags/GL.png delete mode 100644 res/img/flags/GM.png delete mode 100644 res/img/flags/GN.png delete mode 100644 res/img/flags/GP.png delete mode 100644 res/img/flags/GQ.png delete mode 100644 res/img/flags/GR.png delete mode 100644 res/img/flags/GS.png delete mode 100644 res/img/flags/GT.png delete mode 100644 res/img/flags/GU.png delete mode 100644 res/img/flags/GW.png delete mode 100644 res/img/flags/GY.png delete mode 100644 res/img/flags/HK.png delete mode 100644 res/img/flags/HM.png delete mode 100644 res/img/flags/HN.png delete mode 100644 res/img/flags/HR.png delete mode 100644 res/img/flags/HT.png delete mode 100644 res/img/flags/HU.png delete mode 100644 res/img/flags/ID.png delete mode 100644 res/img/flags/IE.png delete mode 100644 res/img/flags/IL.png delete mode 100644 res/img/flags/IM.png delete mode 100644 res/img/flags/IN.png delete mode 100644 res/img/flags/IO.png delete mode 100644 res/img/flags/IQ.png delete mode 100644 res/img/flags/IR.png delete mode 100644 res/img/flags/IS.png delete mode 100644 res/img/flags/IT.png delete mode 100644 res/img/flags/JE.png delete mode 100644 res/img/flags/JM.png delete mode 100644 res/img/flags/JO.png delete mode 100644 res/img/flags/JP.png delete mode 100644 res/img/flags/KE.png delete mode 100644 res/img/flags/KG.png delete mode 100644 res/img/flags/KH.png delete mode 100644 res/img/flags/KI.png delete mode 100644 res/img/flags/KM.png delete mode 100644 res/img/flags/KN.png delete mode 100644 res/img/flags/KP.png delete mode 100644 res/img/flags/KR.png delete mode 100644 res/img/flags/KW.png delete mode 100644 res/img/flags/KY.png delete mode 100644 res/img/flags/KZ.png delete mode 100644 res/img/flags/LA.png delete mode 100644 res/img/flags/LB.png delete mode 100644 res/img/flags/LC.png delete mode 100644 res/img/flags/LI.png delete mode 100644 res/img/flags/LK.png delete mode 100644 res/img/flags/LR.png delete mode 100644 res/img/flags/LS.png delete mode 100644 res/img/flags/LT.png delete mode 100644 res/img/flags/LU.png delete mode 100644 res/img/flags/LV.png delete mode 100644 res/img/flags/LY.png delete mode 100644 res/img/flags/MA.png delete mode 100644 res/img/flags/MC.png delete mode 100644 res/img/flags/MD.png delete mode 100644 res/img/flags/ME.png delete mode 100644 res/img/flags/MF.png delete mode 100644 res/img/flags/MG.png delete mode 100644 res/img/flags/MH.png delete mode 100644 res/img/flags/MK.png delete mode 100644 res/img/flags/ML.png delete mode 100644 res/img/flags/MM.png delete mode 100644 res/img/flags/MN.png delete mode 100644 res/img/flags/MO.png delete mode 100644 res/img/flags/MP.png delete mode 100644 res/img/flags/MQ.png delete mode 100644 res/img/flags/MR.png delete mode 100644 res/img/flags/MS.png delete mode 100644 res/img/flags/MT.png delete mode 100644 res/img/flags/MU.png delete mode 100644 res/img/flags/MV.png delete mode 100644 res/img/flags/MW.png delete mode 100644 res/img/flags/MX.png delete mode 100644 res/img/flags/MY.png delete mode 100644 res/img/flags/MZ.png delete mode 100644 res/img/flags/NA.png delete mode 100644 res/img/flags/NC.png delete mode 100644 res/img/flags/NE.png delete mode 100644 res/img/flags/NF.png delete mode 100644 res/img/flags/NG.png delete mode 100644 res/img/flags/NI.png delete mode 100644 res/img/flags/NL.png delete mode 100644 res/img/flags/NO.png delete mode 100644 res/img/flags/NP.png delete mode 100644 res/img/flags/NR.png delete mode 100644 res/img/flags/NU.png delete mode 100644 res/img/flags/NZ.png delete mode 100644 res/img/flags/OM.png delete mode 100644 res/img/flags/PA.png delete mode 100644 res/img/flags/PE.png delete mode 100644 res/img/flags/PF.png delete mode 100644 res/img/flags/PG.png delete mode 100644 res/img/flags/PH.png delete mode 100644 res/img/flags/PK.png delete mode 100644 res/img/flags/PL.png delete mode 100644 res/img/flags/PM.png delete mode 100644 res/img/flags/PN.png delete mode 100644 res/img/flags/PR.png delete mode 100644 res/img/flags/PS.png delete mode 100644 res/img/flags/PT.png delete mode 100644 res/img/flags/PW.png delete mode 100644 res/img/flags/PY.png delete mode 100644 res/img/flags/QA.png delete mode 100644 res/img/flags/RE.png delete mode 100644 res/img/flags/RO.png delete mode 100644 res/img/flags/RS.png delete mode 100644 res/img/flags/RU.png delete mode 100644 res/img/flags/RW.png delete mode 100644 res/img/flags/SA.png delete mode 100644 res/img/flags/SB.png delete mode 100644 res/img/flags/SC.png delete mode 100644 res/img/flags/SD.png delete mode 100644 res/img/flags/SE.png delete mode 100644 res/img/flags/SG.png delete mode 100644 res/img/flags/SH.png delete mode 100644 res/img/flags/SI.png delete mode 100644 res/img/flags/SJ.png delete mode 100644 res/img/flags/SK.png delete mode 100644 res/img/flags/SL.png delete mode 100644 res/img/flags/SM.png delete mode 100644 res/img/flags/SN.png delete mode 100644 res/img/flags/SO.png delete mode 100644 res/img/flags/SR.png delete mode 100644 res/img/flags/SS.png delete mode 100644 res/img/flags/ST.png delete mode 100644 res/img/flags/SV.png delete mode 100644 res/img/flags/SX.png delete mode 100644 res/img/flags/SY.png delete mode 100644 res/img/flags/SZ.png delete mode 100644 res/img/flags/TC.png delete mode 100644 res/img/flags/TD.png delete mode 100644 res/img/flags/TF.png delete mode 100644 res/img/flags/TG.png delete mode 100644 res/img/flags/TH.png delete mode 100644 res/img/flags/TJ.png delete mode 100644 res/img/flags/TK.png delete mode 100644 res/img/flags/TL.png delete mode 100644 res/img/flags/TM.png delete mode 100644 res/img/flags/TN.png delete mode 100644 res/img/flags/TO.png delete mode 100644 res/img/flags/TR.png delete mode 100644 res/img/flags/TT.png delete mode 100644 res/img/flags/TV.png delete mode 100644 res/img/flags/TW.png delete mode 100644 res/img/flags/TZ.png delete mode 100644 res/img/flags/UA.png delete mode 100644 res/img/flags/UG.png delete mode 100644 res/img/flags/US.png delete mode 100644 res/img/flags/UY.png delete mode 100644 res/img/flags/UZ.png delete mode 100644 res/img/flags/VA.png delete mode 100644 res/img/flags/VC.png delete mode 100644 res/img/flags/VE.png delete mode 100644 res/img/flags/VG.png delete mode 100644 res/img/flags/VI.png delete mode 100644 res/img/flags/VN.png delete mode 100644 res/img/flags/VU.png delete mode 100644 res/img/flags/WF.png delete mode 100644 res/img/flags/WS.png delete mode 100644 res/img/flags/YE.png delete mode 100644 res/img/flags/YT.png delete mode 100644 res/img/flags/ZA.png delete mode 100644 res/img/flags/ZM.png delete mode 100644 res/img/flags/ZW.png rename src/{phonenumber.js => phonenumber.ts} (98%) diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss index dd8511cc42..2a2508c17c 100644 --- a/res/css/views/elements/_Dropdown.scss +++ b/res/css/views/elements/_Dropdown.scss @@ -77,12 +77,18 @@ limitations under the License. white-space: nowrap; } -.mx_Dropdown_option img { +.mx_Dropdown_option img, +.mx_Dropdown_option .mx_Dropdown_option_emoji { margin: 5px; width: 16px; vertical-align: middle; } +.mx_Dropdown_option_emoji { + font-size: $font-16px; + line-height: $font-16px; +} + input.mx_Dropdown_option, input.mx_Dropdown_option:focus { font-weight: normal; diff --git a/res/img/flags/AD.png b/res/img/flags/AD.png deleted file mode 100644 index d5d59645fe695b60380c02374a5d2f1cda4dba54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2584 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 H*ggK=-FTJP diff --git a/res/img/flags/AE.png b/res/img/flags/AE.png deleted file mode 100644 index 05c7418aa4dae20fe103f484d831ae66a6c1c397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1015 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7?_@Ux;TbZ+_Hu(Bb6U&OcV{mAFRpxMzxfQ$fB84Yhiw#E1e`b&;Y9w* zM{T*cx8-KP{mR?f962pDa$3;BzwA;{I;S`Fy>r?{}SgBgR z`AehfjC7_9y(zQL7sqek&1e=Co_pin%|FkcF!b>ERNs}9?_yq?7y0SH8DY0Wd-xwb zV7R+JT712I^Jin*>G}3;r!FpCtsQuwIqj0o%hK|ith;x0DigGpO}nalVewRY<@m|N&)D&<=FUH! z6m7k*Efsg=d%fetjP*H8@K&%`>&VF@9Um6Y%jgYS~X2X zGhpQjuawk$K4yhET+8>o>*{|y`>>bX47oGq&#WDfzE~=57pgve@@a$5c{vF=3|j7+ zg>P~KJ$Y)%gSv}mcY(0>K;t9v=ZDOnFP1K@JsNd&b=BJUF5IOLR~h}wyt7|u!I%0@ z^OZ}*9Q0qXu6Px8I7>ppXp@`RA%BTPma^w7w9gek`hM!;g^kB%MZa3{?oup+-wn=Y z<2JYE&(~gu{Ro+3QMg^_|MRIb)^8Zz^h#I%zW)DL&wtTMesF}VY-j+*e%L=Ym%^v( zuYX4*GazdbOC8gZzK9Kli|eNVGl6P}YeY#(Vo9o1a#1RfVlXl=G}kpS)itsRF*3F? tHMBA@&^9o%GBBt(^wbtbLvDUbW?Cg~4V?318-W@aJYD@<);T3K0RX+YvyK1& diff --git a/res/img/flags/AF.png b/res/img/flags/AF.png deleted file mode 100644 index bc7cef091662f98bb1dfc7abed0152b39f84b3ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2578 zcmZ{mXHe5?7RLW+AP@*5(n}}`3V~3hgp!16kbdbPM2fTXz>;M385-uB9 zGpY8^1=0DwR6*;^}Z=7Pojim?Hc%s9|*ie-W=@UmkFlf-}Jw!hv8^S~NPFf(Lbgo*I0 z$O_v;Z!xcd2nKkYh}n&~s8HS&!M<->TDdLKo{!CDilw>xS@epEariR$;)#!UPnRW3LAfMA!EK~)74pf9W#QD7 zk+E7~Eo$t7idNH>_RdkbxA*mtc=NLHwNT6-|H0?8eZ#RIfZ-Tcd=bZxTgQ#2i?6202VS#AA_h z3%e}P0YzWM*j>j$#5ZVuK>_GvZl5-{)NNiK&tw+~dmyQr2)dbWs(g2`^PCHE$Lo

    _xpY&rcZ6V+a;-OoEJR8lsQRzu-L#?QGn&p?%Pu^s z_TwICej%XOw)HS>mVN#Q zN0G$0C5Itxa>ExAJjvIUQIkm(jZ2Q0-rX9MQ~Qzat*YP<-$no9&Ge^=X9qh zz^uD3ITEaZJ(;3?l^S~_~kG5aFJNf_ihHmYm11OqN6jYH|_AqbEO3N-EfOa zMn`+G85hgqmZM)}xqM@xV7KNz9?L0T)w3nc4eiZb{B!ZV&#mciH~(}+51+z_+QEmv z^SdcJvw-|rSN1d!^&$J5Enm5~J1TMC1AJVp8AbF;aQC$IfttG4&H%DRd_d2Su zlU)|fR+X}CKV4VVXa9qKBj+WO*8oiZ0Ij^bvTt{w@AXN)w=TPVQa^PPj!hiul(*3 zT%3;-=o}uZ%JTzu3esZ@IH7ZiPn{os$PZ<(&k4!UR`b`UQi;QHG8+1k6G=&`I-68aFuM`J(`|Fy?InYQ@WnFB7DG&>d|4=cN2bAXew(XKmPS!_7#793=1REUCqZ?cpi7}Gv8y_@ zejRT;D>3pyU&J)0R(|Ls_nU$yDYd1lKh~4DJ;m#zw$%dd)Ox6~;wF8S{t*~(xzV~W zW(rvSR7cW*@EgaOgg=7d+{o(1I&ScF6R$iic!{aE%IJN>4De-RAfg9+N$@%3fjJ2K z+wmF7wElSW;-2DH{B7X?v_?lu`KraGaa_gg%DVITjfaSY9n-*rdYzEHW02pHGO6zo z{%X06oH%&$iLDkmqkl{uuraaxHg7zk_$(HhEUZrKM8IT;0wH+wvCT0a{QJ`-HeDqt zFIODx8nrLnfB6+BLXQSW8e6qO8Flq*3U#Su#zktp6YBb1htZfSnD2O8Njst4fXs`t zUcQ3Ay4XayD&cDgfs@*jCaWJ8wG-AXye-}A?Jk7GB^48XQnV#JR=6#V#9UjeP+Gq$tSLKl1s&o0}LlIz)W zMsO@(FNb%mk!4wxC6Kczp3?m&2JArDQYyr2b9yziRb*5>thoJ`7D288hl*T&9d$I2 zCTZ*WXl+9>7NZ+croSJ(+l~>?dBtUfc$qME60ls<`gP0bzn0_Q1|<7P7>qHe2d^J4 zF#XZFP(z1M&ugJx7>{5tCIDr$k~#`~38k!IqpX6tq=ZpL%b}GpXmmv9iq8KCNMujn X>yiIoz(&1FVG00(p}9e&9x?tO>&TqW diff --git a/res/img/flags/AG.png b/res/img/flags/AG.png deleted file mode 100644 index d48facad47fc07e12478edeaa44ec8fe3d0028e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4234 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 diff --git a/res/img/flags/AL.png b/res/img/flags/AL.png deleted file mode 100644 index 883835ffb338e1c31e6de929a958839afc2f6e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3094 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 nZ39Cq1A~e~Pi;{&StDnm{r-UW|vF!3@ diff --git a/res/img/flags/AO.png b/res/img/flags/AO.png deleted file mode 100644 index ae68b12c44d52f81b16f811ed1f8220918844081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2449 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 diff --git a/res/img/flags/AR.png b/res/img/flags/AR.png deleted file mode 100644 index 8142adfc8361ed9fda4b9a276f5770f2f24fa088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1666 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 diff --git a/res/img/flags/AT.png b/res/img/flags/AT.png deleted file mode 100644 index e32414bd6acaf0f4a6ec7f9ace8d4e3907b9f144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#Qn3T^vIyZoR#|(d%%4$gz); zlXgc2zEJS1z*_Z8~e4)rWFNY*$b!DS3&2Co0=s4Bs7eqH``=C^+$Vk4@I zV&vxSp2zm;5LbKg?9H!Mf6Vs&xp7z1%*(eIug<=H*=OIrFH(2szKQwI7p)WTBfmrL zICG)?yJI&u{!_d@anhOH^Nw-*f0`ltihK15hZ{o2-^V6(ZcaXzcr0Lsp-38!_woOS zFD0JpSnB*g^Oa&`{q1twUUso1iuHvBb$6p~#zvO{`FVOzE!4xrzwNwkUH!AbwpaXB z<-&iLuatdUx8q@z82^@~df$Q8$zJpH){K7iL-nWObA*Q=e)}3_|0-S-55;rF0|BNC`-Hr@+wYs|W%TigZW}or8cNDbmt4 zbjMJad%xYg)_vC6=h^4%_4|I-j@8zDMn=p`3;+O`%5z2CJB$9iDDm&k**~bycLKkH zYrp~Edosz@OT4=~hxKz^4FCw>0f4YK0D!%F3flkxZx{eEaI^;2tio%gZBV{#!N*KuJ1R! z^T|I*mp7@|a^G_1_*7&}&;JZ;itmutm#NJ8cUMP>RU8|7in&+D2d^$~~ z)sHwjUc*wO@BiCKnJP}PGyMl$nJpaSi{R##e-j0}LACeu9@=F$0g>fNS43k>!GXv3 zh$REqt~Om>BOfz)EXBWAw5hHsRJ#^onej#(3uCA4BAzJtE3JfGXdLAQ#=JDH(~3i@ zA-cxR1(LVGN(@i0E1e%rUc70Ubf)d{p_pqyJWQCSf7v!d?vy&C?zu_0+5GOS?o-G> z%4Phz{dGO9JmU6aL^BV1dxosD!XkVy^%}?hEn*UL8r`p={rgK@kD~mlj`<7rEaJMh zmhW7?(#VgB*4Avjd$v`XhYYXOaCy`j!+3;qiILrT-_s}#)1-KMKtH)WL6BT*$Wo6~=*A>@T(+lS)4UwRjvp_tA-pIG$oL?JL`M)hTreUFd$;%5HYhypDT+!3$ z8S|LA7;M&7wBZz9{tMNi`L!W#rVwK$$t<6(a9u;*I1 zf4#rm%N(Bf<`QE~vwdywKqE~WBVYlB}LS^ z=&P-dZ8+kwQ+j)333+6F~&U!aP_`!urd)HbCF2ChJiSXWU@U;pOE zDOp=Ks_hd?Lss4vyc6i$XIeor(bEzy=@q(#>1L96

    9tx{;j%xi-5bgXB=KgJj5! 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 diff --git a/res/img/flags/AW.png b/res/img/flags/AW.png deleted file mode 100644 index 6ec178847e27da9ec8ab37750d3eac64a9a89099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1650 zcmZ{ke>~H99LK*WENVX@Ik6Java-#{IMp`WZEABd`EiFf+x(bBY%}>abSFO!N1YVX z%87oN9Chb9aB->+ybno}bVA^LRcUpT9n7M_egj-L1L+ z0DxVnBzHCUeQKDtdhPG6DON)>h(IR*fHZrTxb5&*=f0bo%*5|03Y z01W_ROaO2^4*-S{g}=EusV}qx4pT^KsX#6!EDmw-0?n<}*eokca;C)8B%(|8G=p=Y zTy9rwAUY7f_EpzJV&c-o0a*|fkuLdH?QL$_hxnYFZWTO?cmH#m56+zY7H+zO^*-?F z4R%VbXj&s>l)j#t_@bc26q3#l5Cg?KVCZ)NfaTcEdBgH@sT4w)6r|2x=D~-$?v&WG z?h;(h3i6bNWpF)8(z(o5PC{b>pNdA#@5TZ^E#Eg3qmHk|w>GkHvR1$j?DpnLHG zq4aTNgjiLmxyWMM4#|nXz;IY2YuXCw*r{#nSr$bD;kJntQTemlRZbDcB7OmN> zbcAYZ_bwgc!SI#5Ded(YhZGm*OirW9ts4xW+=afS1Q6k++lsUS+NCY0vG)boMdVn%)mUoLIB z2N}Um_TP0bKsN-{ZgVYZ$;=_B9F(Jze&&M!y9`4aT=(Zp+Q&7AWG|x4Xm&DE$H6&t@`rFq9Ykm+42tBYurMagrn^S#~@XZZ9s&9yYSH zX|}W!U%tqG!+Rc$i;j!2+jDF<>`9o-Rj)SMMZw07Hj8H3L#<0^(nn%%;>R8MU2TXs-L`)tpcyp{f*#*&|D%mK01it+3~zddPjN3M|I3RPaZvW z^8q=bgdUhNq1bKuf(Atn*~;kctdZzP5S5)hmi{ip%jOCEnH29 z>GV4f%Gm{?N`7CaVwD`rc1d5|7TF#DTG0SBu*1m)T)dL@YztPSj&b!cC*`;~mTQ$m z(JB=iA2jK?0YBF$O@KVBD|j3s`C@zJPuH2Y_6&}7Feom!$Q9v=n)MtIo3sjl429&o zo5T>D@m~>sFwz;U@7|py{*Z?qj!{Ck(eO?p<`F{ggT;;4=@uU`1YsLY|91htKj&!W zt)&9L8N0hh$D{+k&;w~%@M`TBo~pc1u?(8*zRhK2O3w~!?*1spr$oT7L(=Z+MPOS~K#D(itblYKTX#wlkEv!V^N0cmkE*k%5Q&)w{o9 zb!@vg7`{%Y+5)zV`bIHh81uC07{!8gYW@!31XxAC}-c$E$7*$P_z8yDRF0 z9nj%vnUVGEXcYavFe+h^+?jOG-1h-@X;M`h61>H zjPzeDaPCQ7P8%l$2lxp(ljx`=2iA(OOcAmy#GW%2^y~%INLng;<~iz--q+S~*XJa| za_yb9F$;#XH(T_h<2?pGX~%1Wl&i2$+Rqs2qu++*9p8*ZeV17&E3#z8`ZYTGK>jc? z6OJO)k8zpi)$&l^uJI~B#w~PNY=~Y!jO68?$Tegqc7nB5abz>u?Vl=jTUw`||Kfey zRY9Zr|Fz(gz4;s#pX~w8EgFf&IHJ*_`@{SHBZP%> YLIPv{U(mVam!uW|7qTnq7Ll3!H&WB%l>h($ diff --git a/res/img/flags/AX.png b/res/img/flags/AX.png deleted file mode 100644 index ba269c0453b78330db34c223fd4bf8b4142d12fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1844 zcmZ{lX*3&n7smg@mISFiVjUE<#!fJ#C`KDvrl_b`LKU&rC>;{2v6QJ&MlEAG)f!dQ znzloVk}{FhK4gkPQzfP7LYYqH{qVkL-gD-j=ic94&hz=^df{9pU?>;>K*HV4`3#?y zf9DYqe&tMcRr4VffjxxX40qK>opjcAhlDHqWtVPyp~T_vCI zH~B_QcW10m${cS#E!vxi9DcW%hO?S}ps!H|6-&Zg(#VnVB8^3%HDr*%nVBcp!lFxK zj?00X*mv?wbun+NdhcZ*qa}9oIyt4BgnQA(EVZ>(j^>@KvE{!1;p~CajK+PXf=wNN z+<3&M4a=s_AZ@|wZjEkU-T%Zp-r*BR!yA=(jC>$%ebGDmceosAs(GwX;PM-@QrU$G zij43@_=lS!2L>LU7F)|~D*kddJ7bu*{4r4SRCy40{;nf0v+`TtWPupZ<5~XDp(oeK zcNBKr@up3w$MCH>`rW-slba6K)73(aEzNPgmC)hRy>QGpc6Z9s(o>L@Z}Ug~hr)WI z(ab~Qz_m{N%-mz_YTs$fGo+l~^?xF_N3vZj^85}(7jGlg!V%Y6Ix2BJgYCk=da4dwt ztZs-bRH|c7=Hrd2U{T&zK!$iz7cxLfp4JAcL+z+f)dSW}p?@0oWTo@~auoPgNAVcW zF;HjWbKyxs*hEbsMBS@_MS3f$p6INO@}$K$i*GD(q`YSuT$e@^ceUa78mh(73Zntf zqF=x1vLCmG)0HLEjbxvj!pTLl)FBb8=p?PJOeCEO5`@T?eoi-U6?~;25r5xUkTq5u zJ_-o7pRTaBB6`UvaQMw8jG*eP?&piBUVeOatx`3_MO$gQISjZ=Z zTMK2gDnGk&Wp|k(yzZ;NyfP*jka`&7a+SFrVV#mHQExH$AThSzh%5+j$OD6=i+d}G z+V$V+_Ip@G^D#|{w6S307Y0RvnN}}H%pI?#3oRB4V93d_R0Kn$l?jfR*=kjE3*Net z4{5!Lm2tB&L&7w4dMnBygh1D?=+7f`1t;`HZ;HxRd{%^MqZ4d7~kT?IXW8 z3b%QE4oruK#2@IELlb)NnwF5pePl8v!-?nJHSGBEjD`PXrkmWyEwi{hU-t_Gy#cwQ zR%ZQEQy7CG=L2~A=3^4hiDkKQ!NDUgGsVY2%avlnm>)Go9{l9<{lyA|hUX5$MZIbW zQ=9dkamRD-B7HkGB8UKCydO&Y1EyXetvAP`RogoRE2v085=ku2=0_&5g2T{p?1k~K ze2XQ-JB+y|)@>~t#PzV*z{?q=K9KX>vgwK;;rhGM^=@p!SVsh6g}mGwpH;{bw(gaq z?_R8Rr*h;xiVJ_?V%FFX2VX3j)22GjoBM2c+teI;-xqA9=(p4xyZRr3(tqv-}4qV+oB_QyKvdai~I;*B}IPK5irqTpHMMb@d z_cs_JJUYC6E8q%yqTW7H{Kor-ExG~(-dfvJ-z;&V8#?+7k?_24Ify?6>peJ0DbIU% zmTh%_)9sh9t;HN2#_dpyGGPtW$BA#Y<#Dh8hb-p8;8a1-iQ4wHlF=%9*#^-TnYd!f zQ(Oq&p?^P4rrk^@9J8H|r<3jiu+MykuQY z|5qi++d8;NWgO@J*>U~{Ihy3+mlPJ9M8t$95cvS6XcH?#w1uImwU4P8#=-<+j@Cz; lV9@B4{#E;b7-C|>BEv8Ly8-%BAcb!L?k+gz2geDSe*rDIAzlCg diff --git a/res/img/flags/AZ.png b/res/img/flags/AZ.png deleted file mode 100644 index 2bf3c746e7a2ac58895a7fcc34128a4fc800e334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1744 zcmZ{kc{tnY7RP@?LPFeFiXqYHQ@6!1p|p|_1hEuphG-dDnh;}831Uxzwt740W~Wts zCZ;7sT(^yhrPZO=R4fzQl+sp7?X>pg=H7qqbLV;PdCobXbKdv)okrVj%E z0Pf-L;v?tje-{EG?{B0nRdOhW6TArkASh7Xy9}1^Xqvl^Hvpvm6#&>d0I(x}V$T6U zA_f3Hg#ZAq1ORjy6{7F#eqyZ&k834fT9xen5YkYA$Ae!Qb>|R~Q3KPdoP~-Xwm2CJ5Moabgj9rau zjii(g^OKR3v*0stEM23m-S2wq5Eb=bQWXR)WR2<@&3@dVp(5|P+`i`i(r2?9Xn(_lqZuTCE?ry&AvvH4q6ukEcI?kl>nUysaRj9@W9 zr>{jo1}^-jxbm4H~r4PoDu&t>Qo{;I|5e zo(S|S)o=x&s0a#9Tc2EO`iC8fx8OR}t&EgP*3`-GQhi7uJTI|FaE9F)bm0|rs-4H^ zYs^D0OHhVyKm&tuNz2w z@1yqx7iRiz5=h+(^ar-S74W;`M^?iL>G#|4{;(8bX4Nwh@>t*#`_WZfguHSZQ=AqgvusSR5V$rEu|ED?D#w$2)2D$@Yz18>3Mi`*#}OsX10W z9V$N;{ay?9QRFVIJ=9b1xAd)7;iz7 zW`wHu6XlkwdfIC)$+6P#E)p`NONsFS4*1M84$c-+j1WYqh2a zb0;5vx(CsIeY_L9mmn&qB+nayyOj9K!`b@K$=<71l`jFGnw|H{A3iuXJvP0KKBp_$ zJO!*yzHHs`fHB+U6p72r?86^&ec>EHIsuYl&r$l=Iqkg{y15} zVj$b@iVFoRmT7q&aEYI->_IR>CVZeFGXJni;{(TcbCyM*)9vqU1GTRBn*D^SixT3J z&~X9rH~aU5rn19xoIKTzZ_cztwqNm;=Fc$tzZFH^ zHrUeB?ucYKs9B)4PA5ajdQ!nO`iU?}If+x5wYBk6Ia~jnC>+<=RTQbvf6Yyneszo# zXZRtv-Rt|5U!KV31fIX7lnhz6=4HoDHCU_$k;D4w*~x*2#O)Y_p5GN#ABp{O{`pZZ zDy5-iP&Kk|*{$Fap{^~d-3Ii~AhXPGL^0K5bUBfkSGp%PUNZW*wM!b9Cetj|{n5Wf z*dr^MP}z%ysIMW56{URNctg-WJ#_ZyI-7P!Vz$c8iod+rXo=>j=PS({;mmjDIB>)| z{R@7@{Q5f$ELMyCeM&VFUeWMV?T;PXU04)3r*vX9&x2e`s?o}?ah^S*16yocnz7>1 zHcBk-Fo6lIY;@96cKxvjU~U#TtJu}hf(H(QGYG(;R@(@`x{(4<1gN<(W^HH{)BpT| zXizup+4ImemdjqO{DxCwp{D4yrmVzR^y|*7A|bi^>jA@h9S&dB;mBL4`wm&9!=Im< zpF&;R9SNWY2OKZLR<0d)Pa*@+5HZZLU;qp#7AcNVgES|mNtfUlVN~hX`dNbrlm3On zxYEH#djGY#o7=N-H|F*XKQh(-WSs9ER!$6epp9!yNi?~;8#9Ui%+SlsFdQvDOb);b zV|m6LV`FY*OR+kIv$4ckW6Us?I1GmMdX8~^|S diff --git a/res/img/flags/BA.png b/res/img/flags/BA.png deleted file mode 100644 index 3e3ec3fc76744fb24ecdb688d2fbb9c87ee6dd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3048 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 diff --git a/res/img/flags/BE.png b/res/img/flags/BE.png deleted file mode 100644 index 742ba9231fee59e91e4779ee9ae379c06f809522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#L+eT^vIyZoR#2sORFyaO`9L znJ|{Qb&r@P>3-#kGQW`_x=2`W!DWkvC!$+smvZdxOp89ud4zl8#@|CsiBpLfwqC6 km4QLUp{KSe8glbfGSez?Yv7z8+X%AK)78&qol`;+0FR=%UjP6A diff --git a/res/img/flags/BF.png b/res/img/flags/BF.png deleted file mode 100644 index 17f9f67d2661b3efaa1f5307b3fa49b3184b08c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 zcmZ{kc|6k%9LIl?&5=f)usLcJ31f4FMQt-zM#Z8$uDS22xf7e^EU)O$KG7Syfp80CqV#5M0GP z{4*6G;yV4NrA!RT5S%j(02;6E{7wdoXGDO5t1|#3>i_`l5&(P^uV~8v5QhSQ6+ZyL zFaba%ri69MN_>F$JJ}P&6vr2v_B1hMVjRv=#q|3p*CX)5;zlag(b-n&9avq(L|2V; zaSZ^#`i=w~DRJr(FD!CTkb3XNnn`n1D~}-&ML*8bwmq=h^0|M)0#ddeG9R0cZA0qfE9P;RX|8xZ}tKX`T*fP-sg7HNuhR~fLJhI!Eo3e!cV~F#-~>yTFrfxYjMKS zpiKBqmnEkzHMH9nQ&lu|7rwG>9p>Q5nABJ~>EI(lkeL1!RIjW(| zl(Fk%gm@j{hzOR0=Mb5gYkfOX3U&m^jUbvG0n-J>TEl=dme*<+F@TcEf&X<23?n+j^^a<8fb4ZroB>dnnM=&UfA1IcX z;%{5hBc+dxM>V5Ws(s9O=k|W*N|nV~OO}|rpwyNP4XHBgn@XpYMO&zhExj!DGoMmC zYPK`M8VYqb65bX%KY)QeH!WoX2TTdnAsFq`a7%-+C`nc`-_T6-M3abvFfucEn^JKL znt1S}G&wJqN<7YO=K2t~>Ez%sLC6_6}Y26g=CV%VGEj%=G zc@&;u-FtQ<5#G_v+;bg#MXCS0oYv~gops^~%oc}D zh8v~KFSBdFc467&nrdyB#gk6JtAVZ`eCA9Z)TsbHC z_ycP!R6>2qm8!{Hs!>3i7>+?-Ngobf&`?E>&~;6Ts7=A9zkX=3NU{nN2+Hs`V4iqo z-h;^(a*cFoEsiHl!`aiicP~pIBC$m~4!?zQ7+rimb6L4|Fj;SIuB zr25J4U0_@3%qct3$%GNf8}s{R6*!A=eQ|m1T%(4TPNFA-#T2$h^A?8y&lYPA%_(}7 zQd{B4UAy*~=0@jUk$oLZ@;m&mfATDP9QS04RZyv$`%7o|z6ti7epgk8Tg0DKJJ$A0 zY#=!{2orEVNDROjg*Hc`%#g+wBx4hd85(1X(np~&C{*GLf%Sh3QIx>2;H3XI$dr52 P#RkC9)`d`y_e=j9skOTC diff --git a/res/img/flags/BG.png b/res/img/flags/BG.png deleted file mode 100644 index b01d3ff57b3fc447bb34c257d41842f88d28f05f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#N#8T^vIyZoR#s=*{9NaqMIH z`CyyFifjkBb)U`I5Fyg+Ybc?!=%9w0<3s^iB8J=C=0TRr`_gn3o542hM zcI>?kMVU{U&2M}cN{^Vy!=Lhhy=GqL)1b-Aa(135M|cWoQ`H=O_J^!8;>H@%A+_&;mil_SIEGZ*dV9Ox=Sr!}@sH1+ z?{Kb@5v+R9Uw2~VizF+|svp`gu; zmr@qD^d68{Vl?5%v}Tp2x)c4*j~XoA?VJD4LO|K<+N&M4{ofzYe_y-5{QmEn_n&v3 z{~foz)?T4Sz==Z)j zK}FH=jWOmr)?r_tiT_T#dGAwpYqa9WwbQTVL~{vhe)PZdux;YHb(_xpeQ^Im{L7bY zMptv5va*#jhclez*cVX#`pd?D-?z_bI@T>7aey(7-Rg$7T)_zqqdF$O=qMfc1N&6l zc@FrUJIZsQqyD}3`STx+I~;9#<@6$E{{GL8r6dZj?0Qw@@b#wMhNBJp);xb@*}!jZ z?tFLdLGeG5%RWBbpSyqd;yEl?U-G3MSe^g;N#%L$6=y5C9n0h|&u*++wSrM3Yz+%n zg2c1~D_QE>B0ChNGM>nVF=m#0w7nqVcqCW!wOY6b2zp6J=x!T0b zaWy%R&9l$((;?O3Y45jyA2T+4DI40K=c?gYy#?8)vUkiQ=Ao zOP1GQe(j!PKdxO460X&hzVq^UcemJ~vs)(3G1BL`|Dq%NKJzs9T;IU!2Pb9DmwnBe zg3t+y z;eW=dIfDBGgC|bOFq$Of>lU==q=%P@q-Up^vgXAU71dciOI#)slsqVJ(E2t1<)MRo zMU7jt_Ax~q;pFo#y2pHKSyjW*RUva39!0pbHU5^VW#L*eYtz>a#3E5Ft*_`K)q zJ!gT7GT~|G8KaXPwJm9OSlDRCY<2tnH+P{39>Zxuhbs(^xNN#}Lgm;r>DFIXh+KT6 z=c~AQ6kA=2y3~JQS)*Fw8c~vxSdwa$T$Bo=7>o=I&2J4XsQJv<(cc k3=Ap`J+(#Akei>9nO2Eg1LyqMMxX`;Pgg&ebxsLQ05EQE6#xJL diff --git a/res/img/flags/BI.png b/res/img/flags/BI.png deleted file mode 100644 index 21865ac7202606154f011d3298289d0f094d854d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5652 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 GLH`GzuDJ66 diff --git a/res/img/flags/BJ.png b/res/img/flags/BJ.png deleted file mode 100644 index a7c609143421ba2f6fad3835058166208078c160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 811 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7?`9yT^vIyZoR#|F$ z{8#H*q|tRJzn1Iw|Awhkj~=bxzr*@y=)C6jKP=68-SuQ<i_P+O-fbYkOtFO0M zF>ZK!T$1gBG7nSyUkzo4iQiVoZrzgjui28#>isH~0}8=!8g_?f{78Kem3Xb5tz6ym zxM;!hyDI6M<96|XubgFeu71N3;jS_byPv+t6e3sHbDA-*sWmC71n+w?>w({l+r$PqBSH_4fwP-qU-Ji#3(57jjN`uk}&-F;8>;4=x7z+9To% zPOf;l-X+3Y`c?f5L$0)*CdtJK$271okM|a>y8hTr2?iv8vO3mG6pDH;4@{E`swJ)w zB`Jv|saDBFsX&Us$iUEC*T7WQ$RfnZ*viz<%EUn1z|hLTpyJR|TNDks`6-!cmAEx< T&W~*bYGCkm^>bP0l+XkKP%T3& diff --git a/res/img/flags/BL.png b/res/img/flags/BL.png deleted file mode 100644 index 6d50a0f544ad14e2da315e53fdeb187d3c8781c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 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 G7WF^05A}cm diff --git a/res/img/flags/BN.png b/res/img/flags/BN.png deleted file mode 100644 index bc4da8d9a61313d5370d777f1e3e758971581513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5290 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 X?Eh~de`g(g*#OW~(^IW{U>ElvV(1W5 diff --git a/res/img/flags/BO.png b/res/img/flags/BO.png deleted file mode 100644 index 144b8d32db943675fc1cc9dc41dbaa74d0dd5c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#O=fT^vIyZoR#2=*1i;()!R^ zSkxy~wX1{gpwmIU2#!g-DU2`Q?;Cbms1ENdn&OEs%wldFWHkW-h7j?lpg zg{+_6i9Gx@?|-=bA!`|?`~)`^pk+W{Ah?q$bJnuVS*h39|LRXt@tmact8}{LTYld5 zt658vV%1}gChfhKv7>n7SI3F`&6RBjZ4M{QOEfrdFeClS^{Sg)vm#Ib+QC>YJh8mo z$3EicZuz@W+qrJ+Y4q zbmU6&*||qdD>vkcZZMAZv5k12bww{G0%)syVytj5|F)e)o44%ExT_V@um5}1oT?26 z3$Dzw-L_723vb|_mc?>9T1U5@TwS_+!Ph0P`JV1lb-N?9{H4RYJBsrTBm5?D#+c`s zq@DS%Xk}ucZD43+U{G=BsV$0z-29Zxv`X9>IOoSUf~@p(^>bP0l+XkK^1b;A diff --git a/res/img/flags/BQ.png b/res/img/flags/BQ.png deleted file mode 100644 index 0897943760ff90d0323d3207b9bde50e08f26c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#RCKT^vIyZoR#|(3?3?;`qns zciPtZTuCs9jgB>tGv;Le&*Uh^IytoYpn;{5f>b+CmU$9S}IUez?v5$fEDD#px~VUwtLo5+&H|f1SL2 zZ^7-}MNz)hy+6ZOmRP;rW*L7$PGIvwgW~}+k~Pj4iae9xD(?BZ(QXC%QH85=*O~Xe z+*q18e|F}qu&vu0OB1^%Z@qjq`E6lh?2WRL{{`hMY~THhA+G1AdoT5V zvy$_0J858e{95bD&~Iw2Z*y$|L?^lz=fp?YYH%$-vVVF_Jey6sW!oVc=fu8^|M*Ya zEzxnm^|!QkEuoy_%*TmNmj@bBuC;yT;wSMD7Zu6~x$7Mv7z&O&w7 zV@s&lcv_+MJ}h2bf9lIlXlN~X!rk5#Fze>SWBkCdQ!R0gC`m~yNwrEYN(E93Mh1rF zx(24YMiwDP##W|=Rwf4828LD!1{H^%+M;O4%}>cptHiB=bAD_iD0)0y{an^LB{Ts5 Dxuyo8 diff --git a/res/img/flags/BR.png b/res/img/flags/BR.png deleted file mode 100644 index 02784925925e88d859654c73a595e088f5a122df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4852 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 diff --git a/res/img/flags/BT.png b/res/img/flags/BT.png deleted file mode 100644 index 1f031df071cb791f8baec48dbbcc583b2b2ba036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4879 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 HP2_(8NFwzW diff --git a/res/img/flags/BV.png b/res/img/flags/BV.png deleted file mode 100644 index aafb0f17761442e115d157c6b3ee29b7c6758645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcmZ{kc`zGz8^?bVK|<;#Xe;%uEo((+9E~f7khrR zZn3yHd9Sqe=fsE?zjQ}FWzUG9i0??{J|78KqEtu|lQe?@jGDLju8KI#@!pCwQBt^3mkh%NG*O-sfIqYESRJ2+u{!o~gMRifq z#@G^$+vSv-L^aueLOoGo{W5#=S@E%Q$<-dAlziXGf|HzrkBa?nM%fv*etSrgAUAvO z*&|F6@#I)JSy45`u%WGkLD}%hgrNo-0a;InVIqL2oS}2eRg|&prvjx1IikED4C>S3 zatdM{R*y*{I?!x1flyR=LLczS;~i_u zDFWEVxF;XtZX%!eHED}ecMgqyR%HcKDlff@-ugA|O(R4cJhZuTuY{nWX3;Qc1;$(8 z_f9iRofC9Wzqo>biJ;v|B)f4ic?+H}=vG*ZwtFZmQR zqvz~`@P#Yly0T32NgZ#slRc5bz%2>6ky>Qu+|jqp<+#GODIw7#uNGug1In9rH0qYhk)!ekBp~3kw*0Q~hv(V?>t0;`5JR8p zsrh{?V#oMok_}Q{fAw&mFJvP9;<>YB#|qO1U~#pt8+cn*pj9vMa{~3MDICLIO2x(Nk04(UQeb3(Pi#pOC{@g9@4aZrczlG8Js86rAmwc`3s_Bq>U znn~&I&2rQ#rF*Ee6YzH$Z|TS!9kPqcsH8E?zfS=pz2k7(L6y6v0>P}?JOk7Vt<`tO zLyx4EXx6Vc0>Og)vZ&yaTWaEF^m3I)SW_g;VI@GLc3!;`44$i3?YR!>?G_XqHSN%~ z;TkM=se`yx`F(`r=Fm^s#N60mjTz)EWA!_tfA`w<#9xU2vE;^NbF}1zv&EV4<1ZWA zDk?Mf^gPCCa8A3$?pK2uSvyCAww$gcUTsgWvMK9~UFF;r1e+nob+mTode9GA>hd&> zqbsJxDNwSnA~dkLT!>OF7#g!Wz-^I4>RXSdql^y^mUACIKQ&pGCHA=g&!AvGwp_o? z>B7h$=jMOJz6}^-1`K=u`GSd=pG`ep=WUP|zwJ-fULYQacU(-mvZUwdHcS&-f!*W zCHa*#CrYET`vXce$NQL-hIlW}^@6H@-BEZC|IO14m#>BM50cC2|HvHB9lnABzDWmw zqBpvbmctpjZi4HHLCG5(S@xN@F!CdLbA&y6*gwtxF~;j^8||!n;O3izLPOH`o`o%3 zwXe~7c9_G9{&E!#w0)9~(FlpXV8=vmbgfa&rZb;H;9m-vQKD}~^&)Oj8paH=`t}yj zn@fPWM|G<=Q2Ic)y}Jr~!tAYGqr2)c%5qH=O_J^!8;>H@%A+_%r7#MpzT^vIyZoR#2>wP#tKx#0CxIOGr0I=x5F9$Z-Yu5aZQiyc#yoH&m~ zs=O48=KFr{fBwk=ryczKjdzxqg1iL;0fIf&ihYkQ`Ywl5FWlF;NTX}fgK+zWUzpa0 zEuXA%%kWNlLBPru%e7}R^abjj6Q?aSI2|w}RpX42NSY+q=AH`qv}ZmiMYc?T-MRkF z#2p(J$lPIleamxCfbsX6&V`Bc=jW?0URWl^uQPkg3}Z3zYd7xK#nfE&d%Uml<=V2{ zH;W4s&A+bR{&`=S%=cWg@-y%1^*(&gwLP9Gf4o*!@P1;V>6*6Cmp5mKeM_7MJ)S1={48KYnJbg@qbdIAtt`G`8WY16yTI(b_6iDy*;-IZy7*F%2G=87aC{ra=JC1*`66Y~GCTC*IRdP`(kYX@0Ff`XSFx54( x2r)9YGBva^G0-+Jv@$TLIP}yOMMG|WN@iLmZVjCCV;eyhdb;|#taD0e0s!$+{m=ja diff --git a/res/img/flags/BY.png b/res/img/flags/BY.png deleted file mode 100644 index ce9de9c9c7c03c3291c7a433963ff87df3b22558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2023 zcmZ{lc{JNu8^?c*M2f~TT|%wH(5NEzN{xMOgxVTnS8J7tB~3KesMd5*Gg{P;$XI4j zdrMpUK1xwJ5?d^L)@6z7XD6?uNA^1_16T0YKti0NCeEB`yO10SN%B zJ^+Bq1^_rd_pO5gZ-L(rZDr0Q&-Tn35_k~6Tf0T^=<{!EgqjZWI?!kvj0JQSA_dn% zNIJ)Hc|xX*xrsArd~G}ipFxo6+1$-2gogzGAbC|J{{+3DJT}r$h5Sk1|3Cu#N>`8 z;HhK%+#PIlhVA0syw|cBE=MF@mr9ZrWV(qq#ra|oe>Ya~W zLem|v5Y|fEpmFD<2tk5?U&>JM>T#sMDj<1>$cw9+S8$f@<*----@XPSFV%VoBTfVq zHnbREI3%h9BA7dsn@bC1cZlFGsqN)Y3S{Bi!TxMO>v!M6_lhTl8DT&xt%CNs|HJh`F8vy2oLH(Q=69^)p0W(E-235b2)nl4ho! z(k=4sAoUr(t{1jVS1f_jDX;mu$7+79XYN25=dj($X77wYHF zCZajkRLm>iW*d6ty^mlrt>}=UWY+h9(q=&y9U^~8qBpgEHXr^{J=fajA66F&YgESm zBQ1AmS(@3*K&34?g}F|r_q(eo%uX$+I8_!?1{;UM+oEPnm}{Oy`Pt3IT~@I=D2FXw zBRp=8&At2!Uxy`{qA%VWH&9NvC{jFL<*w|#uAeIa<3w%M!%b-|<+%<1rFBP2V^r~>L)EG6iazDyY@N-@p_*o73kmfaijdekk#CcQ7DQA>YVf^GTQIqq zU|1?x8zyPAlA?|Dda|+lhajtlQ9DKB>pu9WKmPW~U*pK*6h%3=iO@X0*|si1rP7g%4fK9}D$JFD%Mp7?~M!)D}*DFR#%0MxF zO!diF{)$^~YU&Sm@dUgdPEU&zcJ2B~q_KV<_FZtf)15SjvLh?sfx{hl$=~T)T`o(S zOUVnhoeYIV<34g1p=dCP*b!Qmu5BblK(qtb2By9SEl<8$%4@tLy5HM5zL_+W7h4ql zRhEwaEh{TQ{&kOr+2#jSF*M{qKe6J^yQIXZ);nk08wVeT>Szs^TJ0Cj_tm$NovIZ7 zKHLACL9~4i3XsIj^Q$0Ojgc^joRxLh-DJ(jBeqOb5!7vW+rcHS*k^$z{-h|($fF#Vv4qNn1}ue3sVYquB_X-Y znF(%^zgG6CfL1p}n-~kuWvYFgxtzj!xwv<*jmpW3TPf>%j8hq25H5s$pMULs9dV#L z_aQ&WX)ulSR$#JkymVZI^0bIkxqV#qr!OQN*&mR$upEvk*yKBpha8 W{C|M}%`=H70BkJm%qvWNDE|dm)vgBs diff --git a/res/img/flags/BZ.png b/res/img/flags/BZ.png deleted file mode 100644 index 33620c3f3147e9dda64cadfc8a6e43f6a26cfbaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5281 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 Klq(g{*#7`I5(Iew diff --git a/res/img/flags/CA.png b/res/img/flags/CA.png deleted file mode 100644 index 4bbf8b11699889977bf699cfc413f8fb6106538a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2246 zcmZ{lXHb*d7KT5-&?FM2YG}C@P(*_C8bXU0K{`kYAiV^T&^v^#lzXL0RY3*m9+8fO zBS9lYiU}nJEg)dxjSP0I=~j0}B>a z{tgHyYb8&%ma}lo3u%G`faaXz2d*I2Udrv7g$V#eT>yZDWB}M_l@h1`5DEu?Z!Q3! zQ3L=YL8Tq$TC4`=Z8XY&MV5Z*cgC~86LjqsjzyQ>vEipT!b-S8j7>4LEl4KTOz$YK@Nc2IzkdVU-5kvJC~jB6 z`E(stNvDW9IfuobJ_PrsQ5Gj1u?;H8kYN55iNnsYqrAto_e_P{3gQ#3D40iP?DE0! z;NS(pr@GIMheG6X3Wy~sD+C-wE~7w@T3wY%BOq1``0P5vHnIYx{Q01;+ALpJ;v3B? zoYLw%?>^?&M7 zenM*7!3H#q0?5{1rb<&7Jbf8WgcF*4*Yox0L~>4UEqb!AslzpNG}w}4veEaB-)3Oa z!L#*!^6^$olkyb?%`3(?rcX^DEZ0in!2RpkItropNjyxy_L4Q|Zi91(_6!P|73kxJL+u=}Y z*U&L#wApr^=~_r(*S!1Ah5OSlI@et}&b2zczjZ5baCN(d=stB6wdh-DLz2=M{8+xw1L;OT{ z6xEtao@nP8t9XJ)X((tAj__vc&n`v@T#~jLSaWg?jRiG?YZrOgBx*IPdJys=VvSe- zV?mvnu!hq=XQW9J9^T}S<*iY#QGZkZ9NC;!U28cx8jK=|2lXqeYH<{XJI=H9L(^0V zYl|33uA1hWX0ul>0;KN+h|lpxqZs1g4`bdJ)1x-kTyKbSJeHLB1$T^?N(o0|t+7HA zj9LnaD^*OCo#r+}d@T~{JkeMC#M%UoUHzk)b(|7j1?uPR>)3VX@%r4ke40;C{`1!m{ZWyG#8^4L341@7wvM($2Qe%s<+P>O zjTC+cb3;c|9k+CYN}g)xPc2hezsHWqmNop;ze(y2mk4}IW}jnr?)6_gi(E_^0Kt2) zaZvY>k@B1#U2HQbmTi#Kcn7?XiP_qW=@gc$ye{NUYVm*{HT(=mF22g5jEOv>J9oq< zzOOHKI2z7b)K{>vi+iEdLLhu;621D=!xT?mBD-J1nqpI@-eF|%nFE(9fTpMJ3$Da>a6^ z-EGl#dgH`wIr}BTTJC@7+*{(vpDmo_s!_D?(jB_@;B=G!PRnFa(@z&15`nsU4uxCl zpw5+S-t&h}b1FAZb_o}*>@Mx<`l5Z&rO~Iabgr~SFEDo~jcGK}EBUl~W-A?!MPQjc z17)got=p2iTkS(#PWYrg!6u!Or~nVJ`N&?~*_$bgwFB0D%xDUQ8U8I=n0|}f6;s4@ zUsl?70FB53R5nmk&XeEX=;T3IT@$E zQ)uaWbe1WZLDHPnWIZO+;At?Gc|zq)UeX<|^LTX^R7E>=!kFR~;c4S3?2Z}k5)1sO z(Bq~RQct%RFZ7xp>Vi(8opXDDZV^Jl;)zR~%|7w2$tS7WA@`-K}BddBDF}ks$SfmN3Km z)6a((+J(5ghInYW1$(dnT!kyB%E6W8uBusGRn$;c&`^TQ!WA^&@Cd@P_Wu~Lf$lz@ Xk^kSoQ{j}zG62SgrUngqE=hj@W|}Dz diff --git a/res/img/flags/CC.png b/res/img/flags/CC.png deleted file mode 100644 index fd40fc8a783c2223eb26f17ba01cc40851c82a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3728 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 IP_+&F7oFT69RL6T diff --git a/res/img/flags/CD.png b/res/img/flags/CD.png deleted file mode 100644 index 230aacd454fd3c7edd75b5a117b437ba967bab8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3704 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 diff --git a/res/img/flags/CF.png b/res/img/flags/CF.png deleted file mode 100644 index c58ed4f7b2d3948a1e0753d40773de5dc5cd2228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2655 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 Y@QeQc0eG=1i5&pUaMs3ESdXNC18?QJdH?_b diff --git a/res/img/flags/CG.png b/res/img/flags/CG.png deleted file mode 100644 index 6c2441e3e03061a3eefa9c550deaaccd348843d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1381 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_&;mWFt`IEGZ*dV4!ICpcB&z{mfV z&+ls8WREr2J&{9|*|}7_TV>aSDH~myh4y|@Hq?_+Z|f9SQDN!m?mpFeB4P4ookX{t z25|=pDhz!+e14cr%22tS!gcAamL7%-JW0l>;3OJ zaeG)5TLhdqAjGCa9^V=QG(@;sx19SXz4tZ?Q=@}I!kvrmOZPd1hsVZl(@*9L`E%Ox zoQ9OdBg>kEJ_%hN*7DRfk^9-I-+mI#Qhu{4K6c@)13#-CvF>9i=AFM$B;w$tC-I*( z)h;wVs;fC5daY2f zf2Q~tyGZlyOEWLzADs8@fukwc?pN2>1jQfPQU6Fq{lJ^Y%3TLE7AH(w`0gRJS-*dK5_9O3gocgnMj{#P=10T7Iq4o}|FUV~{Kn1e*7i4j z-B`bUlj5uGvk!?1#3q`zhBwZPkI0Jk*!SZRw^{9%)<+AgdjE$_uoL}63fwSe& z_ian2&wPDJ_SGeu_Dz4S*Q8xYzf;!7T>J5PrM=gr6L)2&tqX8F<}BOSzG~U*|8-L; zUaL*4K3J6d<*wwZ+kvOkg-%VjK3G)#WvS|v^oQ)H|6ZIvEnr@&^cy|-+D@H42}ZyE zT|dOBwpd^FCcoO^e78;FK5qBdq}a{q*=Kn&#z3+*)A0YnlrKxK{$ZVb(OmzMJWzU% zS3FQc((pS_w^7zNpmgfdGtH4kzcy)pP3ZJfJo)1EiYv{&_SdiHn*iB+t~6Jwr`DT( zJKEnJdo?=sOKQ}q<;!~Hd$npFp+mv9BtKEiE z)St>O%RaX1Yx~ClE~(^$?N^No<`pf>1U!xO;8Qgx%$#&?;b34c*dS%92 z0o$uZHZ@#}UcYHN@i<}YukvW!1?P8|$@;uoaWdGW+X!UhwFl9+7ynxL@!KuOQsHB( z=19D6`YHTAkmH!qym>;WybPzL_b|#lSd({MHo;7{@*>xvf}_i?|IccDp}qF#L*)cn zjmofGhQD)fpEOkCPw=z7zFot)^2vKQ?vO?Mr8yDVd7|onCX2mW{_?alfJ!md64!{5 zl*E!$tK_0oAjM#0U}&yuV5)0m5n^O)Wol?;VxVncXk}nfapTBfy diff --git a/res/img/flags/CH.png b/res/img/flags/CH.png deleted file mode 100644 index 9fd87167df80850fdb00f8f10a0631b545282cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1500 zcmZ{kc{CJy6vuzIEM+OOgm`5w%OJ|kC^XF2vqV(JUK+BDZAQk>;)x+4YhxQjy=To> z8q0`MGV$y~QPyWm5tArydVjog`s3Ym?)}{5e9!&s-o$gZNMWHvLI40^3lzeELxZ0# zwuckn4%L%6;JspEV*)@;>fRksK2ELZjdHL70Ivc7@fHBzI4$De0E9yTSo8n@nhk(d zaQ;(!IA^fO%L<9$kYihC>9HIL2BTcD9D4lgpD?DqoP#v%qnN; zYYT*lQ`Fc>UK>WjM!M@vI&9TRLeQ(xve{f}~H$PvHv9C;|CX5J4{(pE{-%g){d{8@w>H}QW;=wC zWRgbh)M4W@)s*wBWJ^hdc5YhQWtDlJ)U1bWJ!i^@L9d8o1l0_U89Xsy%w~@87_onu`-}Z4lpW{tFU{x|Z?>Dfswm3_EZ#!PgG3dZLi!8e>BH){i0p}AUyN1`#E$8R zvUYuAE1KN}-&1HVOoaL?m!fmYG%TSfKZmE$;fpeC)GMs+ zOUgW6u|5#Cl5mQb!6gDlvo@896)d-YQjAvtWv8+>7rI%KuCO%}6NXkufF8RjGGm%@ z)cSV74#c)}o-NCk?Xx+sGghL`BuRub2J;@Bv}p4d_ZDyYs7m)MVF5@M(-$0pj!j-U z&C{9L$PFO`?i^x}p35fnY4YEA`*_LRGDY5xkgf0vJ7nJ#dw91=lRvUC9oqI>6G*x) z54FbPc6AvRw$$&|Izt1ya#%p4)97tU(RDMUp7s8)q%EcNdumZZq2f>dn|i-xSYIWD zI+7La7t4kFS?>d{^Yj&RRX5eLWMrn3Be_Ff-K19m<~QgpFGr zr|NQS$yTNZ@Ezxofr(TEsXTx#8+S4DGV3v;Ya?E&W$Lgd&Ngv-`7{{5aII80;PqjV^+MtfFSNnQN<%4eSed|J&qVbI=6W98V#GzTS`dvU;=u*-c# zC#0Znj4SNt<(Q-`LdwWi83()PZgq2^CBJYKly0f`BP2)zGwpnD>4t^r;&vjjf1OX# zfl!MX+)e-O#t{awJMN6eQ9`U-gd3W&Uq#q{+g^+L0Iy{~jEQ;Lqb`0diUxZ>fUWSo z{T2ThCI8@i5A$2K_U5UyP;PW}D%!?}R&!f%?jiNdCP> z=tFPoCb)Y98$00gU2qfy+tkExm bz#t!gKivNd1Pd<5aRk7^%ob5;>Jk4BT0o>6 diff --git a/res/img/flags/CI.png b/res/img/flags/CI.png deleted file mode 100644 index 9741b9b11f0cd0b2b086a59b7864d3d7d1c8582c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#P((T^vIyZoR#2=*8?P(e^Ok zWWhnL*bUN`a;6@VUUG_+Db8_=!0astZz+ZT+H$C=Rp5kX(2|>O&p0NEu(cS-DX_3c zUgN*Nd~V{u#CugLKs$h7f#Ad4yqZg=1fBDZ|FXZ+@R-D5$NAU%`CpVh|19x(cS1&c zq{fmx_r4dawodQ2Gr-j+<)_RKx&^zrx3otHwKHASi}1l^i4 z-&{UC=>5)^-tU)|-O=5)JxIf^dab)=c;&42uX~-nnh&NF)%;zu@8SyPgJ%TJ@K8+L z@BOzT`F=0NKMid)jP5+vj-~rAYzK;{mbgZgq$HN4S|t~y0x1R~14DCN15;fiix4AY tD^o)&69a7nLn{M=ibGFrQ8eV{r(~v8;?}@9KeiEMr>Co*%Q~loCIC~k&}#qy diff --git a/res/img/flags/CK.png b/res/img/flags/CK.png deleted file mode 100644 index 6cca35967c1c69a3023e9f26ee4a7bb2427795be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6029 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 diff --git a/res/img/flags/CR.png b/res/img/flags/CR.png deleted file mode 100644 index b351c67a5300b25bd6f8f1591539a81d2aa28e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 785 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 X`Go&}gD9KA5Ey_Bkz`R}<`MT_XL`?l diff --git a/res/img/flags/CW.png b/res/img/flags/CW.png deleted file mode 100644 index e02cacd3dd9d242efe2c96433d9caea5da6ecb93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1756 zcmZ{lc{tk%8pnT!_f0 z^ij$Ljk=GHYDcPJR4I+COi@Sc70gO}itGE)=29^rL6!td0BFdSIiO04XOzF43jqM)P5}Tr836XgEA}D)L}LJ8 znF0W~LI6;ubK9KHi4RaeM_as@;@Gur|49sKx}9f~n3R9#=j&ENaRX!66Kr6!l1Npf z)9S7X>i{4ru*X}v#!ReEl5e=$AYXi0=Ze;t?G(XWT_(roAKO+0%bN7lDvCr08{Yk1 zF9WCoNIs-SUg~#15sx83{1lXBkB_=8XsdY{oE(a=Mx#he`DC!0;{$YHdpwPGEz1V2 zDfI^tS5`oHeHg%`B^E`|Og)E;2_ydzIsLHhI6?{nlBil)yGH)7v;Qrz`>X8_PM_eF zm5;B!TS-z^l|$J{tMml1UeD9EspoqAdI(4}kmWLVwKTQX7sX5bR)|H9!3F4y&01$| z4vPN<{D~w~rW9to#}_AYHbYjL_&7^N4WRoI(ufPH)A%oCv;Bs3a5fQ^F;J(c*5gfcscr1 zV>Yhh_ukeQ5xLG1n~IHgC2}%MTE1MH%u!Ze>lveFiz$!90O){huG+tV4g zhn2If_$4|3!)^b8e_A266p`JrP!%7QcX4pWo3DW@O@FkR4My;{po*^t7MbX#TD0F}3aiPE`YPF|~KmQIh?Lug6qnEtFX&b0}p;2mS{ z^9DgFCY_F4bGBdN>A-$pvx~KJfmP;@iIzOE+GmRlA_dKym;gMXE(o*q z4}O~LATPXX3`%eIPp3d0ZJ@t3UWZEP>+hROpm*yX?;e2xw??#aKerGL432_!SLTRK zOp}>NcamekhxR(H&Lt4-pNl3jO_T!q{%vupPDPIt9dJ2R*-x*hpbLRB!G(s(*nf zUEWWg^8u{lQuh7F4LeZ`o?bF8mGw~Ov)WR5i>JkeWc~Xi*R|<>K=j9-jAV6s7eCc8 z7uc8b1b2%!+X)r9PoME2^I@?iIN3MOw$+{%dt1>QJ+1L+-Ij>C1%r3q8WPGWg94YA zF{AXd5ZT4)$zism)GMiDzlAi3M4{jT4i;U2hMf|b=!y1TygT$|7o2f#Mv@NY_olq} zQbiTR`mpBc8_d_bRm>lECOq7knZXh0F*MA5GnkNRF}ybWM51$?+0eMqGm-Oo@Pft2 z+VIu=#4{GsS>$@M+)8v&$?!V7JuPZg{qjUt)+icgD)ZwZ1RQC9E0M7M}8 zh=`WxB|_9FQFHz8yL->QbIv@UnP<-T%-flXKML9pVAl6F)h>By$Er;Mm!NRbGI@DP?0@@?gUaw_K<;)=SDkzT%E2Njz;5Wj4FC+Z z_tcaPy{0$c+xsy-8V}3Bv>3{rg1Nba9V3N#dT*#iJJKN#j2%40Kya(53=&Bbn8j1Y ziZf<(8HrPmLuMiL5$cC1JYbcNITQ{SzW!@{t4RLZXgF9da%f}l?Bsa#oB7A}S;c=Z zhe~~&2(;G}{r>JObcX%!U};$0OtIqorbm-`zmhLXvFw4$e=HEOTKr%vV)Illk3wZ^ z^-pyu{<-OBWp)76iNSJ&E}G5s%`}-z&nY!{x8f>~E$C^WAoRMEFd%R>;Bf9tnm&+~ zV$b4mo_zIDM;D#IT<%9U0*KFLE>jbaF>pw_*`<7ond(P$Nww!Jy zZuftK|5&Y_>vjxL@&Cp{j>R%8z-czf)w&jd=hbN-GUFLe20q2-DpV2D{XPu%y^$uccTQ!dFDA0#QTS12Q zR9+npm@EbPQzY>9wVQ9Lpn6MPi?a z)QcMew~X@}PY8?X^V)M{+dEJPe2=U_i+VM{i1dY{i*mf7f5H!*zxCoG<1HkCXcMTb z`Qf?i4b}bp^^H;LB=COF8Iw+}8qHjgnL6kOszE~JoUKf1M#Drm0idz40*jHH-&f0z zw6iTugQn?v<`@hG9AkG~%H_G0Zt==(%9i5;$Z*Z>kwzroxl%7&0&Rz6>Ep9T{PPFD zZ-I%l2LYxGk)XV?jv)#JC8t0bQTQuX7WDMF{6Rr3Rj|%OxCzK|tl2-Mj*_Pbb02rx zPL(>%iRid28;S3?OkxYL5Ni%?cAOjtokgApldqLiZeAT}mmB^DuX%mwOCO4|vhLn& z@ln25VwD`71^smK9ry$#Mpv}1tuMVMk^Kt+r}u;ajrwrTEGH0CKU<;X?O!KcWtFA)9 zG1aLFN2HpZ4|VmH_;g*~yC=`Cu-ehY#{|B}cYGjn_21rZ#Jf-ztc7xG)q8^UE8r!k;c|%jX$?PyjYYrJY5RslH-{?tPx2whm^q zrXdrVQB+v)9--&N?S?7qMhw4<#uF3r+U29#@7%a>KUE_Ikd#@{CT%>AMjIKe0r7)K6XJJ!lCN+}#eQEySyyfCGb zBl+e#ux~L6iTkMG_9&jX^e%xys$*g6!M0bnsSQA%s1hr={DP9eQ5*jlv|l0WIzv0H zaf%Pl&lD5Sb}v_qwTz|v7k|aC>m;;TTA=vbOH=XW6aAQ;%qQtTk;R#vo(ni1P2)eV zHc9W`A7Z4dWj~Pesz2As#aq3uZ+TY-=UPKFC|i=}y5IFrq0x314+0Y>H>TcYRH|1T z?fPCzLX%`VpMjCC;kD@Tz|BNHn*v?g%?IYuPLB^d8iX`ONN3AFY<6B8&(*;Mez<8Yq3V z%5ZQ66=?ffI7bx1b%)jptR-Z*L~GFB`q4BMo#XQ~LP`u%?AcaFt`IeI@agN${>9`s zF6fpsOG>6DVZhNX3${O7HC&?6dF*Sx5dtqc?{cZLWdAckd84^ed;7L|klh)_j?)>xF*14+Wq_du%5oDuQ*yVQZ zQ$D$Dv@S_u#r;?TFLR&yOlomNVZ*}9d3EaZs_-Q9h~H~TR*zf4?1c(s{LGJ@En4lc z7mh76#NIbn+i_ReubSE~;(fuAxrV(ekz$NiGJ3djvtr1odjV{l%AHJub^5G|-75Ec zxH6w^zbGZp)XBi>YPCw9pEbx&Boc~4TnM-{yd+ZS?^^(P7@!cH@gRcPF&R~uyBtZ4 zHWlLIVVLY@nCx5{bwpL)Iw@GA-W#V z@qLMhE)F!!h*w@g?zc+3CCW((l%ZyWzY4fQrXFNWJL|z(#5W^A2hY{5nB3|Nn;w)? zto&+>(#Jj%c{2~FGsFu(#NTTQg1)4Z*F&;|`~}H!v(}pnTV&pFE~hw2D%wn3lSb(+UM&?o^=FvAGgy`{8r<~NldoXAvxo2a)(2RS%=K;q zh(eFJFzFd(xe-;vosR2JJCuPO0^VJ>2jgO|7%&#@0i2Ipo}AE3KJ`KWAg@`z?SQ9$ zwm{o`v-A3QkX+9_n5!(Q1s{+|h8IB0SgB0zIB(3rMM9V0w21O$7U~|7Mc15)hOBoGy5^Z|eAvERd0; zZP~9q%@lF^@fA?PIUrSa5jaJ9;_Nl6q~o*AU85^R>rGkJ#Pi)6>sX3)lV( z9j8nvd-L1KvtotNCp&bIS$n50Kg6HHFskSU3H*Chj^`F-XNSA??u5pqw4eITiqHPl zU#Ph%X}oyE>GEK$67z=`q>J&0aTL2

    6*riVwGcs(@obLoX*CMInA5;g`d(RsKHWJ6O|}VE zgzALMe;6!(3$h$+X(2FEomOGCJoQ3vu}JlK>IJ?lRasq=b@?Dz@gY+s=0G3na~-d6 zt1}bZ=rxRknO}|nL=oKE%r@(F6Nh~lcIqLYWnE!In6YukQYS^^kA`VCWksva0I|hoB z@3jvmi0dD6zc0!+J%1}lm-py z;Ub@qm@r%NM?SuX6Rt>BPX(6TWpzH0{e?DZs&p5WBz%}9j8K({UQi&GYtFk$QNLNn z@A1GMp7!id7-TAM0FTN-VmJHM<7lvHo2*nx`&F)OKd~!$C8z8A!Sg0{IurH+8&BDY zwGe|hZs9@bqvleo@5ICaEzczfJ31EEwij2k=)Z;G#5n4U{Sxw1txvUqnEb9EJ8Z+6M_mzTT)ya68@Aao z-3|W9t{d1-H^h|AH%pnuyaTrG{(P#|*+c0^`?Z@T#0*MFp#@9RIL?XHco#Fo%gDW`Dk zM86aghMUY~?>4y%3D8hGUSartl-lY|J9f=zz&sg3wjTOKlKk*`#!1eqtKE{$_SZ)0 zR?g%W9($NTM(|)8BZz6yYdA+7-5xO>;TgCY@wff33!zY9@-xjFdn)0SVZ)8cy`2Cj ztrfc)$OoDsp)o-Ux&<}(t=Mnj&@C&Lr^Gzzu7-lvP#Sp zk0OLlQ2Q6TMzpwTC>VRrodd-Zjo`XY*$A~p3Cti&c5#&Qs2cFQcQbs2P%KP~|BZ7? zAOorSW(CN-+jxVv_KF#%qtOnrPOK*F+?vb013_~oQ3h*-)YcnPpFBJk`+^=nwDux` zk+}lU6+cw7$CYRSUX%i4pGkEEJP#JqB5NJ>DVhR!RMJ6Ge6Lb?83Jb=Ogk|VQ@ion zI`>P%8p(TY1kaWCnP!$s6O?LYltvFM30(DbVi(?hoN+#SUjA=?c1NwA{h1xdy+ zg0J=AtdT@SFJIYjjb-teSz>ARkxn>B~Lz^Zh@=$>&0QOSZ7VE!vsDgNb*8H&tw zG*kdvTcQiQT0Fqw^9B@N=?F~yD324Qs@Ia#2GpQj^E|7TjO)*$i?X(9Gbq0>63SRb zcLfj~FulM6C!c}8JxqnK?T%T*8D&I1D|oEPDR?z+q~7c_Z(+CEWBaS5Lt+=z{StJ0 z5udmR_3(weN!Ii|XJ=*t@ih%F*DDcb&W}V}?Z~;L+ISkl#Zx5jc?GD9bN!J}2La02 zyC|cN%oJjHHC8qsmR;mwRMvF(rmZGz{~FKyYom<}MCm7iSRr$&gD~V_ZGAdH(n__3 zuXB5vmj6tzv=p5=RPXV5!U^R6wnwxFEdR+v5o|gV1aDKV2vGXh22Qu73sT-^m|5vj zqTh+3*WoHP1%et9N1668=2u1_gI@0K$=N;gItR@ML*G#u%hNWK_=vpnPZ$zLczH6T zv0Q(RN-98t-P!^bFN+9>EU#1KPsQ-~#(R3KH{s zF|hGKekugXaWFhS@A;w@pQz-W+o6WUk%Ef$R3UkUx^YFG-FqWvoI}BWXosGeMK88M z9o;~W&!9HqUo}lgxZ+|3HB`d>&yt?=*(L>5Ed?;X$7Flil`e%yO=X5{Wl<}99^%c6 zHc}I(HXbk?0-hEbm43bWS$~p930J~K3?k0)&QD?s0GO|Vo$bc=vMpko+rHKsSxCGQ z$7U@vrF^OO)-2`ipHueYEajV@j#jq=D3T_u0uE*V?+a9CPa7cse8V`Q5@h+4?DAU1 z=caD#_Qc8!Cuie|y96L1CN3=^CM6;vV<;ghCnYX-TTDnyTuw~Pt7GNv{}4QPeq#UB X`~MeEWSA2!1;9OZJ+(3wY~X(Z<Jrl+fIc0q-I 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 diff --git a/res/img/flags/DE.png b/res/img/flags/DE.png deleted file mode 100644 index 93e269166b550a4a32d7c455171bcbcb0cf33419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 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 diff --git a/res/img/flags/DM.png b/res/img/flags/DM.png deleted file mode 100644 index c3a0e9d102afcb8cfe930bf17f68c7350097040d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2636 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 MX=-ayYvh^qKj3-NhyVZp diff --git a/res/img/flags/DO.png b/res/img/flags/DO.png deleted file mode 100644 index 5c4a004fefe1b0e54c1f5a48159f3c9b3cae1d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 zcmZ{kc~H~W7RP_tpb#-4A`(!73n~gGtW8+*M0N;BBnXO{1lgnz#SkPKc8wxfUmFW5 zLD>`)kSbMUuu@qfNDX^{009&UOGpT1k*)97_fO|d=iNEye(pVYzH?^I-1%NR?B}7Q zjn)PLK*!6|l?>AEuiT&k?)_aa3P8Xk50VZ7z|Y?!S7-?EjtTQ5lK_Bi1^}s<0I&p> zQsn@UfCYdFDgY4j0KnjE{_6lo@Iiy_V-(0y0stb-%k^O3g+7Ip<4Z{}7R@Xqy~3npFy@4um z2<6fr6C2*H`}Xt-?en|QtbByePcGrz>bb8?)Ca#fY*Iq-@9#~CpI>ZF?degg2ZYLs zNwB5k7X9F>0cn^22`%<;xxr-d98@TM{zpfUNhJ!tG;wVypmp|_qI;3wGAl`(adIq`0xCk*>O@ z@0>_%z4$7ZOM>^dB@Wv6PVZG>%S-94wO7ngK5}cxbO9{ec?rF0*4g>WK~j-%vMzt` zR=u<{=8$)E<2HBwP(dh#X={@0Ze3T#UBCO&zL7D+yk7F7<=b()HXN~It{r(^d!bOl zz8|Wf6D?45qUcOk` zA9OsgO6cw_F2Bn+((D;ftRh)@&T@NSOI|~LFDEY~^HVJxM_x1UPQ$s1yF@N0t~~vX zkKAqYXgs-)SnU<-ttM(4nw*MBuw4J*p=jHUJsFS7JKZ>BOqM4BqE7m^g;~1Y@yVy* z(2WO3EL8N&mM}So0gkgT$|5U+l^8pGXb2YTd}~T$9uh`-BAN3W-W5fNymK_srNvBq zgLS>Ivu%P+-f8?H@lt%zfy{8e6XhoSc9?X=46`}fXw)0ajvi;*-Y;|t9BYvrv((hd zhS-d}5XKVA-7uI9*@63ZBYA%#3o8MqiK2f@%6eP+BPY##hm0- zy6C`=5yNZg4*u-GtmkjF!SYmNN)nn(_Z}qhQRBB)?IYu=rlxE1z3}hp0$y}#uGyu( zMnE{nlZn`ctaejdC6{DSQcl`GkwAUSGf3p=o0Q#r#*Rq(TIgR|Zc;;BKAX-XXTex6 zmoVvkCYd(-a!91NAduu;`b8hAjEnyuI2$|mv#$d8Y zA)%}(=an4Y?)mrU)^sMc$bd9{=<$pNrM{HH+b<1vbyrlj|D>x3gKQtI*cnVPdh>s)XR#8 z76l_5k1^=j2-m}3Q$<cH&}k{l_B(UF4gBNP))9|>Mz~7ca~GmppC30I z7Su|A|1g>3)Ohq?k(@$jO;rHo{y_UnbsUwbJ6R`nXoOTZMez|dkK)%JJ2Rek6a9Uw zE;c)y4q!8IiwVIu-fzA;HQig(nc^}DY0-VOhQJ^{KT&G}Kix!rGf~E%2?^*Z`1ZKB z`n}H%Ux7I^1hpB|Z^4E5LIX_augVnL+TXba`HXVMn-2+4=2aVtp-9|6u@?8oP2uv% zqQ9LFbitm_r?gL0so;9IWu#F=|WBa4=5rGJOBUy diff --git a/res/img/flags/DZ.png b/res/img/flags/DZ.png deleted file mode 100644 index 1589d0cc40c5cff4163d2e8b5dd8eac9d320f904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2506 zcmZ{mc{J2*8^?cxF&HY#*uvzMZHfk2Bm2Ij3??c=2@P2?_GK&)PYlTxA$bhZm}D$5 znu+MizC|G_LmtKwGPbgPxk3F9?h^K_iC$lDyD9e=@=02vB;L)IOh zRDYT>dfMH#FSQnTXR?pqzJ^(Gxn#K3SLfG)2{J4I-XygpF4?;LH-ZMvT?T|sU2T}bk3?wNFO{;%lIwW zIOF;*1A=aknQF$Ac4ZW%*cQ$4ug!mm_t?;Cqs^^DE9o1b3hLA~=tVXCsQUfAMQ6X? zTFf|91-B-pcy#mB=BjaEz3{9MP-sgs}wh?%8*2EsSy);F>=v+T(#ed_6C!oPOa zL?c{FRCVz}7V4a=%*keWyrbT8{R3xo&!6S_jzHMDEC=hMIG{PB|F{QPPtU%f(A!QW zx1x`%TP}SayEC|RGu-W+eAU%`Z<`efo#WeetsA>|#`Mp_BTn??j71TOh@OApRwt*y z39nC^oQv`xCVWKo81EF~m80}By}9HU!tOSy_S}w)QSWd+KsNq7;EeYDbxXA9M2+ey z_yt_($f(5-{B%ucgpnUnV|tGl^vA3kjT&gXs(m)+K~woI$Yy;uiKsC+ zv_8_KY5qiAFnGsH6P1!O`Za}2t}MEj%#gdiL;Q*KHyFmYg@MYx5>6%sJX~-Y%g z5zaJiz{mB+#U5f;swp$xZ|<)5SWruZ27}@QGu4F)WGR9l@g@Q|e6j$RY$=b4Nt{l= zDqQ3!n@c}Cv)t=srBk8r1e3c&zkJipmb2kS^f^qbLCesL?SH-#5@TjT}oK<^? z+m}kE8ss__A;ZRtw;WwqF2LMOtOQoo0X1P+?)*&sx;;W@Kv>xi-2u*C$vMjjb6%fCYiNcaRnXB zW`ePV=G_U|W7isVRg>5)gXunRO=-HTomGk4tl+C8-1 z$8%dF%$>=yo=ka7!fQx|cj@%T+eu7`1hsX8Iyl|v_gA_KP~oxEqg-XSvxHJEZ_% za1)ii%UfHx%T*MU-*2NNOQv+Mt}t-Ty9JT*TeBr60%>6Dr&v|BW0eHM*3`GN%FxIH zB1qpv7o3-sxlO6thL3MN3v>&NrmW_y2b$y`&0CJzL>qM|+ExE>XH{;6gVY6+K?v0; zx(v*48eBQ8P=C>QWe$f)9qt$OlS;%L7d|Xk!T0}BZ2FxWcm4DWRL6dRVyQ?S?PR~d zC>G@J^bRuaurdBXGN@d)-7gk;=UOl1DsxshHZFkCJ*#&mC~!S8W@I;(M!2z7TxT2g z40#Zfx)VJLlx@PUt|zic%9&R0q7;YTc=6QTLX6a7!c0B0(V*MJO>qbG#kfr+*kFxE z=ZsyrQB#lg9-CEG)FKb5$pOyNYU(akmu4D>Phw#%j;md0w-M`@K!tDk!7c0DJ%d&SVUJ{)% zE=`l}Ac7&fRgN8Y8_Y4y`Rz@774nDn<$ieDC?%n0OS`)kTEi2 zH30QJEO7Z4v$3sd@OgjC1ET^r?91))?Ro;L`A7i#$UYiO&%lsnb1mAn^5YF9SyM0P zosqo|k_dkJ^eMgFr*rh7H;uDb?x@mD@f=WwfaAAN-u%WD5tk-Og+?w*kGXPXU7_acaBM@#G4I39jT_Rg49$|*FmXk u=xM6yokgBPs_7w-5pNg<{|E#G-tfB_`TqmFrB@T!0l?ba!Hi^rN&Gk9#*7RA diff --git a/res/img/flags/EC.png b/res/img/flags/EC.png deleted file mode 100644 index 4c53dead1c596e1f2e427d3bc4db6dc4385a2d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2818 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 diff --git a/res/img/flags/EH.png b/res/img/flags/EH.png deleted file mode 100644 index 148be93c083da57f183e96c9c3b8c4cd45e0036f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2687 zcmZ{mc{tSV8pnT@F_sx4uPj+p$1Cet!VG4SwFYGggKSwNOLoZ&5%nTjT8y3H&Aum+ zWlEMJqDBl}k|hm|VNjgu{CBQ%o$qyh@6Yqx_w)VxxzjFMnL+ta@B;tU~ zg?QL?X0ol24Q^koB^Cf0GX;KnfY^6AFLN790Ekrp0K#nm*k`v0D*zAy2Y@wq06;zh z0I?9#^GgQo0gvYeGh;T{+B?^ozy@E4xzi0c-T&jwYeu8&1328m(geH!k`mKWl(dVd zv!7kJFvi+NPj5^oxQIl^3~YUjirfMB)yXTZoKyW7PbgJTN_lXVP+}TT=(E#5fo!a4 z)_i4Si=hj4YS-f!AHS?tpt|njdQ}pVogQ;4#WHz+l(>>&65sTx=`&uSBabCD4^z&? zjWCKle5lmDcX8;V$8-Zx2v1V4J6!y~psjX^VRq@avU1YnF)2rC+P`JzGPG{vek19Z zD$(EON&XN0rU1?yn~fnZmE3X3(2Yo3#8kR>lG?iH0~_7JxC6&uzdHK^vQJe{4ve8} zsl_{7qZU(I&>Sv^r+g}qxC-&>*2N!dWd=OEvIe>=TJO8A#tYNlXd)#+^`D?bTmTDI zRe>inu-Js1rV~ph=UKuzfu7OgAt$pw@c7=2a{VBHb5%4=6`L zwxB6pT!zyy&1H%M%kmodY!nfo{C+dL%Hd`OIoFlG-o(i;Kpj zXozSV-~G1^Mx!zI*HnhxJ;c6VsK_J~Qf^HVr!%~z04lAecUxP?O5{?vbrrx(z7|+S zQ^!lhQDKg}3gUi7+#Uo<@_N%zr^RIcodU!}XB2KEv#V@**%R;yl#3eH`k}b;La+C_ zAIc`?y*A&E(O9eJqCMX767Y z5h{7n_Lwjf8Z!0}B^Na)V8f+hG@}+vKx)HJhG;yatDI3oaNyp5T%i_kZy)s0&&Zh_ zRbCNfrCF8sdmp?Qbcs)PO{@35tKql>4nk&q!l+hC@XZH%*7<>gGRP`LGZOf&?6z>L zuzqOy&v#$8s$VBQ@@m8j8ezUsYWPgj<74YxLw{?l)$UU+>-yy-pBXzsSoO^7Gh>UC zvhBoiBdW1=O0(Ixn*|z_@iA(fD#1N_iz&t!>UNhE(W(0!Ire>%#Bc#PjmuXAxwA&# z#iUU^?l9u@$lPZ8I#Vq zsm;nN`Qv2R_PhEfDLLn8(}3pU6_`5w2;sN;)i=dDU(ix&_HvXe$9n0`;^$-_h7zhf zmLx?3aVtT0nL+T6^?hqkJC+}XxPwQy$018@)nfK^E@oX1r3Z#-wrAOsh>6w%{=2jM zhGiSz_R*AO@PjbnInV><;l6k=MlidKh}(zrC|yB+cZlX4$yKevcDP&k+kS|Jk|0NK z_i`Nd@;hz>PHD-_g&TgiDPHew?pbu@oEi2wjE{{o*tg3BjJ)aU5lf1_Y=4(%3f*qDuX>*03 zdxqtc}b`r{_C zac1Tz!E+3*U8wbUNX!M(rSwRn%JPaEqOc^L-SWWb z7LlPlQbjg;LQh{l#XIatDLMyA29*(x?Muw^d@_-Z)s2LpXP7u@10x1m(~+?%xp7o8A+n_t2BLd)52@}L)!Rz<%6UrYjA31qT3qx7uo0J@(wXAl-LUa&EdH}dm73heTU&(o)Xg7Z%ak~dMJt$(`T@SB@vR>Nw@U!eD2>0!T% zIt@Pt)p@;E#73eMZn|YJS`3~OY~mTseL%Yt4@V(-f)L^ykNqc4VYUn}%=GhjjS9Di?KM;4pAjXyN)I0@gD+3~ zkcz<5G;ARV_o9UpwX)#KfLl%$NltSLb^Hi0ee|Bog!YLZ*HUK;b-8Yw4p=`BR?_6C zMB!iZF73%Mhj`HONhc1C+;bweg2}WhrP9QE#`&E@j;>RdM)SSJ3r^| z{~4Hj|4Eh}nuTR4)G+z-WfccV`r3S&rY=Iegu>IF6q%l(lcXNR++oM|S-4AbEHMqd zV8fRgsS!j4YZ0 z6Q{5eieZ5Ao_SBYr1aRcw8B#}tToV7xUao)JW_-dyb)~3*IapeiD#5xD|`D<&;fRj z@|X-FNXfrTTPXfBmBUk)R!kDl4KJ7!_(m@>E=MMwJSY3JJ?~}mnr~nu*|In?;?&NMKYaPW8xHFW3+9$DK8u~WyTe|_{uOTG7=G0w+#Bf? z=FJA63D?k7g`ZW`)U(snLY~!Ne@x174I~^M-S@@tzXCzQSN(lr{(pe4$d$+r02U@z K#&t&SiT?(F(%^>x diff --git a/res/img/flags/ER.png b/res/img/flags/ER.png deleted file mode 100644 index 7cb8441514c3969a8a05c6a861d82f873e9e8881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4082 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 Dr7z{v diff --git a/res/img/flags/ET.png b/res/img/flags/ET.png deleted file mode 100644 index 7b420f02f4d484ee0d02a55cce74514986675130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3460 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 Nz?U54E%pje{}YU1q4EF# diff --git a/res/img/flags/FJ.png b/res/img/flags/FJ.png deleted file mode 100644 index cecc683c9cc928b682c3b48a6534fe2d6c595384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5060 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 bxjQ~`_W%C_&}>`$WdNX~WvE$p8yo&VabZPD diff --git a/res/img/flags/FK.png b/res/img/flags/FK.png deleted file mode 100644 index 6074fea09c8d84381552b99f71aded7cca8cbbc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5273 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 diff --git a/res/img/flags/FO.png b/res/img/flags/FO.png deleted file mode 100644 index d8fd75c63895c5925d6fd6140cc492b8bdfd4b5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 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 diff --git a/res/img/flags/GB.png b/res/img/flags/GB.png deleted file mode 100644 index 589be70063cdc5e26fcb78a79e4d038a2232c438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6309 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 bovrL`y#Id#VU|hItpQM0P?P^AYmWIJ0VKIQ diff --git a/res/img/flags/GD.png b/res/img/flags/GD.png deleted file mode 100644 index babe1e4cc652b87d626e0f87d97168db415f8092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5753 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 diff --git a/res/img/flags/GF.png b/res/img/flags/GF.png deleted file mode 100644 index 98828a5906186b635ef6cbf154eb1fc0b6d380e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2342 zcmZ{mc|6qb7RSG6Fc?PJr)=5xvDQq<*w-`aI8{=Okj#77!i@9smF!R+grYEb9MT zP)^o4!>p&XaO?)k4g~^|GvoRUIw`871al&8 z006hJl_|=JF!gOZ!pUh_{N3h8)CM0%j5Jxv(oMnRz3;7xVEF*23dL7!W2VLDT^@{y z)!nulasBYpqNqdz{Jp*Sr*Xc%bSw_8@<1}?OnZA?W9Zx=n{QEq zu`JJr*`fP)zUMaf>$Lqb+-|+m?xp?MR)O04H_Al|OAOBBp-Vp~dlU0lj$jF$pM%bH znf$6A-QhUI3#ok-ia^W8xw_{n-$m(vzN@!r4!kyt0$xuDNu zs-%=kkUB-f;X62|aNo+BU~f+NGg>6PHvLvI#wbG26EH~-RmZ;Nqu*H}f_04=9Cv?g zCoWJ(Y8i}TCkFlB$>MK2Tz`l9o$d5zhGbB0<{g!eFP29kVL{G!QT_QT_1o*BAY zQ#YUK#&``@H;<0TWk*kTKv5W`v)nF5$=C?2aA4DGGyE{Sml2hAk9Sm4(cZl~m2E8UQm+j> zw@>$n?YJZJ+Km0|q`FDwlDzTS>_o&1`X|G6_~>SV`immCX8Ooc_fpCCwpsy&K-JX+ zl6RdYPW&cP*KRQO$8vePL78?$4*T!7BIh9QAERIpQCiEjN5yYRQzoW;4h3$NCDYAU z3^i2%JC!!A!s^`ix)YRur5dPh@?TaTMn7Df1Ope8ZXk(*buXTDJw>kY$an+p=|2^Wqx$=*F11g}~R z?vLo9?+=U=*rSFp^WAbd9;-9a0*Q*RS_At!*Dm0hjXBLld|f;qg~5-$;0CMAdPFew zFQO;|q#yeG#jOrnwMx6jKB_Acl%twEu$chwwzBouje%D?s)1*lk)9UK48HlLImGj* zPeu{XRdJ$(+{{T?7>(+n;KWyR z-Z^SLOguRSNcuq<)BN^8MK!0ggtsc4QGD335W$q0bPZXFF8|Yyui%K6_LEO?Ymc-T zbw#g;2VMOq+eQ3~%kR9==%h`cRo8@tB}zzZc@> z<7EM7dNlX=OO3@)naFVStn?UMuTSe+?wD)`aYbwMnDnFH;r>uv2|{BdT(V{~wgS7< zv9Y_eN}Ky~YoKbB8vj9l>~i7W3DI_F0D}U3wRolNJ(Bcs3OV|fV@|dEL&j&LYc7_@ zC|E(o5SjURn%A*}4$;f=(EU%rBFNEYY46}^Z?o6<_DrQV=Sx4@VwEQzkxWfU*-sB$ zCAq$!do={P!$jahWP+J^hqAQ$%Tgc(A}^I#Qt%RU`|K$-hUo=u)bumu+lYq!?EPzR zyqMXA(4=Flv`tyQDiuL7lJyli%RFNtqhTpcO1V&|$ij9_B{x?}AI$HRf=Ca&pi=+s zerF{8NO=AGLPfK|>U68GV`BL@QJ}dpERen~AFa!4pMtp?b0W!;ET7z+cr3(E%Mz4?V5o&R1 zYXMu~b2jdr2&J9!h1B=xa-{S*W_=$6rB6J(tH)>FU1zJ-8>c*o&d}cgu%#LN^?=-_ z=Hcao&jVy;Mgp}IPtr3}qqLwjwd0kk?Zb6a+PvoU&~;^B_7=2$%bFnvRUpqzD$j8n zKhOr#!!Qp%_WV7A|2vV(6^}T1KexW##VYx*b_V${Gv_cbe3&=FGsK$(KwArLpsuB- zu6@QyTL+;BN9by)YQYg&T7)-?=l{pxAL!+CJ>vfx!1-6BSq8w$3~lo diff --git a/res/img/flags/GG.png b/res/img/flags/GG.png deleted file mode 100644 index aec8969b28a0153043202d5fb2f85cdac0871725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2777 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 O0N7eOS~Qqp(*F&Sc2V^J diff --git a/res/img/flags/GI.png b/res/img/flags/GI.png deleted file mode 100644 index 9aa58327e359b86469c294a44fbb2db4be5b47fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2750 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 E0Kp*!tpET3 diff --git a/res/img/flags/GL.png b/res/img/flags/GL.png deleted file mode 100644 index cf1645c2b5d42ddce6f72ccf173e4f989c8f00bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3101 zcmZ{mc{J2*8^?b$W6XmISsFB!vgE;NkbN6N){;=RWUN^udo&DDA`!ALBVt0?%D#*g zLX@m!4OzliB4&(vJY z1~<~vu?+pTo*jUE3VeeaA=^6n_=Nea~zd=VV75HRgPJ7NwJHUX;S)$;-(k z1&+tuBUqN7Izw>3T7iMTiKV`SaU>X%B{Fd-Txcsebb$*i(%3h(VahNZ$bCf~`T1gF zsi3(v>);b5VkR$dVg_#gKfGc2;mzCI_YW_;y$srY#3cS9o-t&QFpR)DP+K{Px?e@l+jD20j))yDTM-zAP!4D!N zR-5EZj1LeyrV2}NdcDFxT~9*jm#s)=^8^kvzd5F%#2`1;Dt-Gh9-#Bu`^&TKcYNz> zPWl}V8uy2PxrJ7fCsNXR`-NuUDqZ?AmePFdB0qO0gA{lH)>+Sq}kiM>s40J%-Ua8qxo!3s8;X#`{e2FI$jl#o1E;pqFj+~3|*R* z!2UWm)!(lBPf6z&gphDU87$DaLDeynaQkb%3R*#ESno z>ZOZ6(MFn4RT#J&Ge1lq))*T3?PkaXPIAPY`Ef3IdM95vW#_CU;(OBfXyS{m>2VKc zQn_<}LN>V9rQ14O*zEcGSMLO!tOY)gcD~^y=lpm94qH!e+fomr*!S>pStj41opOIu z%uAHG&jNCj@y0NHmxJ3gPHuc(tiL_EeLXk*v?CZ6jLTP@mI0K?DWtzS4e1NfSCn-p z2vL;OJ+q=vixzS4z_M%h>qddCe-kjlw>BYbQ!oc3`LF&!2E~QfnTRtvY2hh`r_u!5f-T&be>X``GJYu$=u`REH1$C{{SH}BO!{_3 z%Fw8PZr)E}M=l6NrAM$IR+F~$4l?)X@=PS<6_N7$rp2y2Nqi&msy569ncQJZd;*RK zU2Aw$q9aLvOkY`c+{LdI^0*igh#bRCf0{^hM9TIPQW!+T{`Sk}Kgy2lx>$T~UO&f9 zd*0AtG>fIB$k%bl!{U`&lmNf{l7TRZy-WGzv0_2 zi}|MfE%gX<+Ydxan3td0nH%27+ih0dOh+-q&Z$?}KdA2H6Zjda{^9_te(97+6l%5G zlTlJ2t#EyyZweZ3haa|qxCnetJcBtWcfELv!M0lvvlhE{OMr4(nZWhRO;wt>UH9y3 zK>dS}ndckVXo}PV`bd-aiL(WrSpEmKTMaAn>OiAZuh^z5FH-t|^HBUlEG^^y(AdaC z7AsG0xr33444Rc%eyI*@C)0CA~pyyg-5z-SHY5EYxk^dE8 zAd~sjN^`>{kcroKNLXGis;Oj0dx`5-kNkbCQ- zL#JWih|u*ULXVkzn&szaA)8q|d|7HHBLY1neO~1Yn{}loQQ!Z*lJXKd6&F-`+8NLELTQ5RK#&pK6DcqYkCtfM#wg^FiM2oh!xL=Zk*KfW(E0c`6(wQh{ zJE-tOXX^8T{U0tB|KD@v8CUMVbKFRv3Egh^;`ECEqU!34G3vAKJUdF%&Mnk%>WB{N z9;nR5?}a%v*BQ17{a*WavYSTG`qSe`VV!k8dA{j>SQT3}4P-q+odeh-j(m6s`JwOE zTY01VOxa%_DjH@S+}aUM4x%=8<@l`5WN=mEj19s|);s=^nl3uTHgcrNxY~5PY`#J@ zxj5)H3-}X0{Djq<^K0BkP{6X(croIlzHMhunQMj&lUDkY!e5ychnO|UOl+(XO$fT^ zw#Xq^$s}hb{kaY1M3T4jNI*LOU6~q2{SgOEy<3CTuQApb^W#s&Ow6@>mIJSrEZ#y` zVd)CA=^Z4rJIy2_ZIh*HQbQ&ZK3N#}QvrkP9tDGvnf?Mx_aDKTB&4U_Ymo-0>qjks zAO%(}=?H-|!2xMxE5=l*MPC-39lzJm;(PR`O1FO@L}dHz&2LDw7OC}B7ZU{~O&K^5 z{=TPw(82O_jOWWgRr)mfuj3wYFR8uhmhIP*pKxnsdA8iJ9~9f?N^JXx+R*2&(No9^ z?Kr6~4H!4RNQDQ{RLGdK+_hP}9PL?$~J9QJ=k~mbuBW#-e9RmPEn)0;F)k! z`{e@>wQ+rq+74~6%F>EcE$3Y+*7fYeZLiNcmtov4xVZ_?eJkJGkli96yYfWxuZEKb zqjOiaug`F3Y}oA$^0E0hv`5lC$+vWyxr&ulY=l{cpI+HQtX)hufzK5YxRR%5r>K(T zQloX_WRIhc-NwYm_bVc|_7kbUbSli|M|cyDOlR#fj~{a)?r8Ni!#`xQ_1^#TR+eKw zn0HT>*DQF2d`^Lz+)%L{zY6EH_rBs42|kjAY@Zb|itNi|l0hS~pOJIq?KVKcy^%lI zn{VP|<&z*rRP`=<@@*SbbJVgEt+fvHm}2E-c|N9QAxbriPOh)rtTBhCRV-V)_D>Gs zFO#ePIJ0Nk=TjN8m(eC#5@)9)@oVR|I8kk~+v&Ql4{oU;situFseIT1c6skNx10h4 zUY+V&#_um`R$M3x#ceJr4SF1EfXI3vKm7cU?FeZ4g&+s|5cN^c2^E(Dt<`!C40+ds zI>(_yucldFI@>c%4a0*s1)qxFhW7i?BCO*+KiOz>YRhCYU(Rj=57$rH7oC4NTUM0y zjIHo6yhyl#rsOBM#t8213i!a5`G_IYS-A` z$iIp#5xv=eGK7G9?K=b^!b4h|BjJ3Mwbf8w&(ig5vvF?IsrmrM!z^NpM{|cN-!Omm zeP?fCv1)#85+uNfzE6IE^DdjVtA$OVueJ}- z33hPA*!Ej)DZO7Tr_S<_+~urqK>brM6oVx74GvgID_3WN1c5F|gCaLbEj*`@r5{vk z?72fmdr9Pd1I}Kyk-80bwR_n4M29Hje^J!{T%Sc>d@F)DP07)WdUVO1Q=jAnIq`6+ zt*d*=)}cxQ8|9T5BQPl5JCpPMlMqny(US9PYhXG(j- zW?kl0yUNG0%49vId=t20x~e(*yB-UWN6RUr z(26K|6-#*qHAOkK3utMyoEjP(`fgG4zXCqKE*@@o|9^m`z&`3Y02o~~)q9P_MgIry CSHuMX diff --git a/res/img/flags/GM.png b/res/img/flags/GM.png deleted file mode 100644 index ec374fb3c3347398bc3ed3713ded2b8f18095d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#O#Bx;TbZ+bMlUECxf_9e{3ae}H(t6gl zVnM!YoIFvlHT9A6+nY!>%3I zO%F`2^5Nh1rSQYg6ScjJ)2=2LZ79>+Cl>!?-!Tr+s}p2$QX;PPuiu%^X|I{D^}Wl| zGD7!$#D3kv`NDN4UrpE`T3obY=G&XQ=cd0aK6HL zIMAYVAsX_Vc44E_jKUnWCv*WF2{cn*C_qxK2GyxyuA9r5N=lXSr z0~VMKC&i`WBI>l7ym^5_swJ)wB`Jv|saDBFsX&Us$iUEC*T7WQ$RfnZ*viz<%EUn1 mz|hLTpyJR|TNDks`6-!cmAEx<&W~*bS?cNP=d#Wzp$P!a#2OX= diff --git a/res/img/flags/GN.png b/res/img/flags/GN.png deleted file mode 100644 index 46874b4d985d0b62ccae3dadde4eb47aec14a8a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#QU}T^vIyZoR#2=*8?P(e^OE zq%*YZi&?P7O6HeA5geMAmQHZ!+OpI2-6W?yP3#`R{R&2M2i`Qjoz=6nm8EsV8u@+x z*7nBsd%k)A%?APp?L+>|noFkyoy*n#b^nM&a?iu)`H!}Xhg?lCkTc(&Afc71{`Bv0 zx8j$3-spagdNut!|NH4df#0UJZ=Le}tJ)b=Ugt~izLbC7ELW;7`q#i(XUX>IRn>-5 z*X7UOWv;xkYVG#9D@E2F($U}dZ1$u}DVw5X?d`MQWtuc5q;aIRQB1sdtG}}Gy&Kdo z-gb;vU)np?H9vd~6j3d4jVMV;EJ?LWE=mPb3`Pcq=DG%^x<(cuM#fgAhE^s9+6IPJ j1_l*}p4y^l$jwj5OsmALfpdOrBgjrqS3j3^P6tKpd3y zlmVbNndGlE{=b>kR`Zb_00eRa04fpyF8{4in*iV=0svb`0FcQ906LGHRztae2dIsX zhT1>=(}ikV*gp_?XqtNcBl3T1-&tkkUqj%nrKe7?iVvp~<7G4o*#iI?oR*rhk^kJz zJ3oJ;$*HelS2toL3nn|BoZqkuhQhq1mGbHv1wxxeSxRWfp*}ZJmnqcQmbMMpzpU1R65_=_E-9HQ!Esthqv`faA*N zHl%q{OQ#`tf$b(;l||O3mUCgrsIMk39eEzi&O2c{xKmDzhf�KtCKcaXBmRWC^jb z2~w;L;XeL*Stk*+3!dGxbTNSXG)<`pr>SFU+@ ztqPe>KLgK#kNTn#p(5TWi#MMbrv{^%`xrY@B|#5Q7y`$#Wsr=vI-)pKmgv)5$j$f9 z!2xXeI<^w-;lU2xB-_gZ8vHLemwRwUJ(06+#F!^5a_rR&njTel(nc3;|o@CEx z?lx3NG59|3ki9s$vpS-(rjkFn-TJZRem=+?yuLYL9S*- zCig`I@**(~g8igo>b-bBn)605=hKn&N$5k&M}H{x9fqsx8!)5AVXyqNstWp1Kr!tOHeUSni!)17I1XeJZnTgVk=u0!LE_f#&j z2SZNfQm*a5c=i$e6r@#^_%E{rAMaq!GkUGRpxvH*2?fNSFp_-hbBS}Sqd82cZD+Jm z8Mut|NdkCpyIkkqhnJ4sKZ9Q}m!<^=dd=UAwpdOr60rOoe^Vdeqb_qW913`qUf*H7FXqk4Y$S+B+m2J6tq9$YS z!3oG7PS08S<4Lr4R5*l4w##{YYGs(S^)m&VUug4&d^+#LY9fl@CvqPn+S$6caX$^2!mPOHMx{} zxvzA2g+?VZpQ5&2%>Voj%<}$z3-WzgBD>P71pYI{%;9WDvYHhQV1lR_=wp*9Sq=lTXzI_p?9Fg0w#|sDMW$nq!s0on4<)_MymKRPM zJO~zP@>a5x?IA5~6l-fdo;Ke@kaq9Q-N?WC$NszFu`*7KVcK&0uMYELdH_mR_{2+} zk_X@}@fjN4nMduc=Z3r_z9T*-5#c4hWGd+(DTjfF2&Q_Y&-eTBepFC_^wh;j_dU)N zrgCM(e)p{5XQ?yqD3eX9*pc)HI|vNCvJHy6dNmbs=*HY8#!TFoCPAtIS-D(*LlY*L z$HmZUUeR*|`FH^^k$w%uieFRMXWu?ZDOY2KB0xFr-?*g?bhTXiuTz%S*Uv|NJXn93 zbjD}`SBYEP2)%lW`dZet%;Gb=w@%tZ`ES7rL2jhj?)&UO|Ie`_HWQ1rs6q}@Y`_#H z5?P4W&3`M0ka2zvcX7RV+@uM9Pn7j$dduGANxPlWcUJ&Y>_OeHVn87S7H`ht#YQDv z$nK1WxP@ZPA>o47L`A^R)f4CQ_TcLuKHtzxmO&Mu8n2V#^U)~)L~$pS_&7bR;u>2t z9vz~jiVNv`quukXuUt8x(X%bin-;}fRg&4Hdc$Lyhu;B={2G3@R7diMzSiAk$4&|C z=XgMZnqKM+g7kAM&!Wvp*F`>147=qaeaa2^fHz?VQC|9b;&7Vfk^wlY#>;*vd@u>T z{nsXU!NNFN`z{_Fp-M;~^iWn1AGr~DHm`^`X-2m10*xJ=!t|kBaRuZnDO99NMgZWO zU4(jOiUwFPSyCvT%t(S6TZvWrQI&ZEd4wU{hGnL8rgT69S^c*0G`cH6?29~9N;Rjc zET|yZY}P(7+*sABdk0ya5v+~2r&5<5RkMgDr+Kt4Tb4Jgf$orZ%L`WG8QpN!Iuy)Q zO@uby0Wd9;6qv?r!9JxVP1_S%Sk>K^J(8@$m1A{<1qH0mwi`=U%(pue6D+vtXEs9n zLcw7@@*}6ub|~6t)n069%Jc;aE)A|=>|8T25K4#Fw)bNun2lAHIQjSrsAKBA8qe|7 zvVT1YrBMsS_a(M2)SMWI(S>PwOSHn(T(sX{PUhH8Y7{4hHNWL2dE&T?vBsWEcWfO4XaxzQ7Zp6t+ldhy}M0WAl z`{4EF$j9Wm>y8Vk#8zJHzANE-t6#DCN-`-4AbQSx<%XWQmX#d)A9;i_Gv7D>_)g=cdwv zXjmG=Qn8fZH0_7Ego#S>Y9~hRw-(&r5^p}JWgBR`D!4w^X>#P+AFu6;`-2bjPZL1V zjP6d}MUZ?^QJLGfxl<50Mnop?>VyIpOuxLh_8`8v{Nq*tt-CAI)3Ts9m*vxWbJ|mn zSwZWdzDhNMBjN4=>zK|$i^eS?#jihEB=5bFOkZqW>R<|7SU^^V3QX|E^BXNkG-2fp z4pCZP+vxL?%J<$<$COAAb3P^JC2(YG`o@+5UJ@unMIJ{6H9RNGV~RVDAmzBy5+c8w z5W8C$)pd+}Wu91p@xS0KssUSl>Ka_SO~y^@iDbVhtZ;cv{EA9ILC))FNb!>kqqS#` zSv=!T>Ekk?$*#`YA|In>&?!Xsv0tEQBYi$XT|#PFpA5my-m=$PO?U9@ z^+Eb4m7X?Uuc&WqHV_A9AN)A~#jM}L88OrEvVOnJ6=n>yul~k`Tg+-1|4HL{PiuKc zkdktMX=O|JwW-$*8Wq7FBH_a~&K-Z8E-YVvz@9XD8Z2Xc;J~R`dwr6ROFmByPdcjQ ze2-b!T{BbIeUW-l*}KIY@8is~p5X%gJg=4%PASW2ghvO)cfWfC(HcnHaQ;z%IP_t_ zXWGML6!xN|=RUo;r!0Mr+Ag$yc-%cL5xt}oUf5vUZHEPu|49d!9%>ZZ8U&$rOEnur#4;u4yiWSPfLh@}W*ug2)A_4d3>WJx{2Thqo&7$cFq zX%7Hoj0`LARKTxDdK~+HN8yw!BY^{uS{MO5u(Q;3nt_2~gRBRh4kdvMa}sW6iGz@! z5(Nu!aLQdE!SKu$9LEP5HZ8OA+zR>8Bznv_JNKrZ&`CMBL!6)jJ|h$8P|Ar#cSpO+ z+J*$C5BLLT0f{6d3}GLTAE-<|xIiwX=uvT00xYHGkY%e5@5XX; z9PiuX7Ci)iL`MBn>R0A$(n0LOXbtmxEWanPkFDF3uWGet z{pV)TkWn0JK)07%s`in|ArD2_hb6yrh}Cxkt6guaEs43>;ur_;2(vd{VzQA@15b>?wbvN&lm>avOr@`=ep72p zSFW=89Z)hOz!S!I2(b+hqCduIN7E;xQm0GE=U3SsHm3>UFIvwCiQiT|XBCEhD$cd5 z9rydq*&&}j;gtUI;Nb9RESAnDDtEU|%sQlYEGgUMOa+j_?HG7U_k>W288<{b@{wEy z$YNKMlZD?z<)6+o7g6?yj+M|nXJ)ZM5g%x|8MWz%R9zH(Ayh{Pf8{3?aUOUsO&+M| zAQ07+oo}(2I16i36|$9EKkZ-UPV>kwe91vvKjjII!8_n)u8DM-9u@Vtpo+hji}Y;2 z7qRBwoQ>#w(<$Zmx9Ec}uwlY9d?v^REMx>g>xiZn_T{-naNpLAuFW%#c3wYCq+9J^ zZb~vjBYr*qOt$rK|E2;L^EN!e9)xN&3@OUNs&_0bb2|@+EvM1-g4=s#+L5leyC%O{}!Z$Io%FtjXJ1lYQlD7vE4t1Jct2t zd!~2G_bs=79()z{cl};zwa%=x|Z+_piCoVpbm%cGTHz|lT({|_t9;Lqe4a(qL zuyP*D&fwoFy>$0bj6o^0PWVxx_OgZ_L$2V`X;rUu$9BQzkcxm~wT8o21If?!8A^-t zc3N(#mZF>a#jvFYD>kVQQ)@>mw$<1rUnN_|YBtS$lW`1DqpHI>VOH6zBqcf@@7!^G zz}2X>$olANzAX0-Wo_crktS?x-f=#*+-6U{bVbVf>Y-`n+%=lTwIXdY@8Guc=3oGy zu2LqN^3i0HQ>Ayf+Qefgpx{HEtQCoWy0dB%$8@DZEx4bupl1!oJtI;g~Wd~;~x4F~o6cP~^5|uI%6_XLaFY`b|K;*uRh=~7}pYs1F;OhR| Z(LUh+4-n;9p#KE`Ep>ghY87Po{{YiCnsopG diff --git a/res/img/flags/GQ.png b/res/img/flags/GQ.png deleted file mode 100644 index 7fd1015e8beb63cad1471ead7f66ad5fb9083587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3090 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 a_ymxn{=Y%0l$asCJi diff --git a/res/img/flags/GU.png b/res/img/flags/GU.png deleted file mode 100644 index 8923085d5a0db8a2be8b54506ef3f20c70d55380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2591 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 RTM{Dxm>F5)UKrq${{@I~p-}(; diff --git a/res/img/flags/GW.png b/res/img/flags/GW.png deleted file mode 100644 index 20c268ce0697234b88e1223c3254d0a5b635c356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1608 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 T){LvvBLiThZ?0FQOQih^Yq)J7 diff --git a/res/img/flags/HM.png b/res/img/flags/HM.png deleted file mode 100644 index 8d1e143791ff36a8e5bcd8b6c36d875b747d2292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5229 zcmZ{oWmMGN7Ki^ZLwBcu2sjE1gM>5;rF0|BNC`-Hr@+wYs|W%TigZW}or8cNDbmt4 zbjMJad%xYg)_vC6=h^4%_4|I-j@8zDMn=p`3;+O`%5z2CJB$9iDDm&k**~bycLKkH zYrp~Edosz@OT4=~hxKz^4FCw>0f4YK0D!%F3flkxZx{eEaI^;2tio%gZBV{#!N*KuJ1R! z^T|I*mp7@|a^G_1_*7&}&;JZ;itmutm#NJ8cUMP>RU8|7in&+D2d^$~~ z)sHwjUc*wO@BiCKnJP}PGyMl$nJpaSi{R##e-j0}LACeu9@=F$0g>fNS43k>!GXv3 zh$REqt~Om>BOfz)EXBWAw5hHsRJ#^onej#(3uCA4BAzJtE3JfGXdLAQ#=JDH(~3i@ zA-cxR1(LVGN(@i0E1e%rUc70Ubf)d{p_pqyJWQCSf7v!d?vy&C?zu_0+5GOS?o-G> z%4Phz{dGO9JmU6aL^BV1dxosD!XkVy^%}?hEn*UL8r`p={rgK@kD~mlj`<7rEaJMh zmhW7?(#VgB*4Avjd$v`XhYYXOaCy`j!+3;qiILrT-_s}#)1-KMKtH)WL6BT*$Wo6~=*A>@T(+lS)4UwRjvp_tA-pIG$oL?JL`M)hTreUFd$;%5HYhypDT+!3$ z8S|LA7;M&7wBZz9{tMNi`L!W#rVwK$$t<6(a9u;*I1 zf4#rm%N(Bf<`QE~vwdywKqE~WBVYlB}LS^ z=&P-dZ8+kwQ+j)333+6F~&U!aP_`!urd)HbCF2ChJiSXWU@U;pOE zDOp=Ks_hd?Lss4vyc6i$XIeor(bEzy=@q(#>1L96

    9tx{;j%xi-5bgXB=KgJj5! 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 diff --git a/res/img/flags/HN.png b/res/img/flags/HN.png deleted file mode 100644 index 4cf8c3112c5992d0e50b3c41c82adea4ab294d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcmZ{kdpy(oAIHD;o5|fH_u%aHob(MU`Lsbc?1OR|4 ziHP@?(f(U$KxAD!*vgRs9PR4k3IL5amAAs>Wjl;Y^!EXP3{wDLT?Bv)*%NCX08)_v zut)&_Y#9LP(%5Z&jeDGVk!(;%A^8v#Cglxv zZ4d?ljAa0j4<+GU1JXv8MzXvIq73;f>&ebDIn{__uf9~QoiOZLppD1&`BOb;D~q~I z!>^d;59|7WHR+lgI7;20`mla0#BYXOc2(I2)QvJT0T<-Jw!t`N1>b0WL0$T+V{e5% zor`P8da<6Fg{$0Tz7VaabC!)_%J0Q~mpWnHtLH#6K_#RXOFABR)LKt zL0S5Sa{N4yT7fHwRgTvJdN6VzHtz_lC-jTg`zL=Ds^6?tqPSex^$WP^c4k~VxsG{6 zbZ~z8-gKP#CpOgAq`4G(qJ+>lHlIPz$sX}E?qETow26cyE6k^g?VL8viC90>mtR!S zw;Jj|)IA5AJah8jncndPH`QE(#N3`2?>o%5!w+?;ksDCAVE0C~6{WYwh~3Sa*SvzYPd%`Wc>hOi!xmuU`q z@ryQ2pE+aN@GeWx&xf6=z>(@^wF)h6aHL+|-T~kE%XX{GF{aahFFQj0BFAYd(UV_jxU#@k7)0yNFsX1;iDo-@Am`yt;a_cuOfdB?rBHcppLJ3g3cYQ7pqjBOK! zYu4e!>?yY7Cq|-#2U@ypWf>#TJXrQbuSDmCsO;Sv=5TTUE-l)%ldw|a2B3KbuHyfI zzH=6<-C0s(>nbgj&jbHaq}&Wdh1F=sRBP)ZulwQo2@4D_A5Q5{v*XiBtrH^N=TY6U zv2-q(#*M4}E47nU&vi&xA9lVG{EAV!KcH`Blzn^yfApg*(YHL^(!NW=v-FGwq|t~; zKBGdjVD${)T)#DZ7xfhSS|RfWi&=F;+*?>;#nYF6 zh)rule&fDg*{}7yB}P1d7$$1E?wPMcnnTp)3~q{*cf$|7S4c{2JlC=KOhQ*X;}fk> zyY?V&0rse=FoJA05H{sf(pZe*(pIER<%7r?-<|mW5DY)l9q7#o+lK-pqV=gRaC7B% za&O5umpUFNohDG5_a3Xkwtsc`a8KIM0R2$a+F~qGf=(Nq_;y93Ty^0U%y!Nr1dE>E zk1MzyjbXHxwA-q=2H#z{GHF3h9yoo^W$aV;{c?IXw9|cx<=@+{q?h=)aZLI+QRRZ7 zT;mGll1A(3R_mlnXGZ$PW3;H;Ro9>cdYn1f;qxajBpZrSyaT!}&BZx$E}Z!i6Kc6f zFi3!)O)9;HllG{ZYPl>9Ltt6-FMgN(O#aj7wz+dO5#bI5=~sekZ>%`}FIyK7U(iNE zre})>+jz+CvlS=U*GZE_KC$Q3KVs*2w={`MLm9hAg;#@qvs9p@aQE@o#^ER11YNo9 zH^@)pj!3F^9N*eFzssnZ5Op;FSgkoEoWHn+#)d!78?Txkakh^8&d+4_Hq^5%S5t{W zy$KR($($FSLI_TY3{Q!|QqM%m0HBd52P>qV6&e$Ow!zw=u(n7GBnpc}roEcQeJ4mr ajEp^*{_g_C%46qc0)Rv~gn#Tt$^IL{@9K&G diff --git a/res/img/flags/HR.png b/res/img/flags/HR.png deleted file mode 100644 index 413ceb1586820b1b4aa269c906a88d3aa5ef5887..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2420 zcmZ{mdpy(s9>>2MM(&APxetj7nW-s^NUE`zlKWj^Y-Qz|A-4MU3&;JQT$9UC$Xq5$ zMHIQ;nuW||jZiLgcFupl^LU*12Km9uNG!CTJ4?s7VmnaTnm#N}d;O&;Ss26aYvM0AP#PBK-gWq7DGC+yKBJ0{{-; zbDFN6;|(Almo3bAyeBiR5T z+i zhZKKWl0VJP>hHo}#!ey=WBl*acg620k4Ge2+KHp`WgQ|{%!89k+)K+Kx z2|*isuimGBA#`tPAKcF%NIr*t=7e{>T`bD(F?v*;ETQN}J=o@Mgpy2@LfFm5Y+2cO zsiyR?^|XB;JC$DeeorPN`iptnbUMWG=nj=Se;n`HmRI9^o&Is!upuHs7IPM>d-(J6 zN{>S9d1d38oxDJ6I%|!y@9a#$vpdf!JG`K)Bizhze`VIUxOU$a@N?VbubLR{YFrlnz|}RxMHTnIpk)Z+70%-=P*Y*}hN5BdM+qZv~)RS2&M0=i7ge{jRC56l5+uJo}m- z-fRBqZ);LaFxK*T z3tFv3Z(i(}N^0AYbiqSw%xiH9G5zP0BG0DAOgq8hHwAJib>8dKqN$U+7J~Wl?>mb7 z6lfA*t@|6gMj#@5y-W7#LWp$k79m_|VX8J})e!yRMa1@EJ%co9XqpRtn&u#~SeSWm zQ71ohNF5QFpcinf&7-77z-D&{dtZU?%f0*QSHlG2D|(t=)bCoy}w zJp?1rEmbCT&cVi=T$ru$F}xYbN6vpo|AB^aOEi}zR5RLq2_J&GNHhW~;J4{$OGwH3 zuoKzj?)K8gHQxhgVB5t&hUMche((^~T1s?0X!JC}Q=3vTJ$!oa1idJ#)QR6`s%cH( zG=0vv`MLnfwF9$JDyZHUCw-}|PeM>Gd(owW^cPuiXNG}PlE5j_cG+$b-?El9`CGlE zv_Z?*=0|l+QdNb1X+Kn0S#javcl)1NM8amc5LA)NB^SdMROiwd{;QMpIhCSh%IjlA z&hHPwN(z-*TbI6X*uIA8(ijFwF9ix+4kk&x5DAOi>p1Zx$HS^-iv!v@<|aXs{xFY9 zimZqfrEGIYObSgRz1g$*;v3?xZEu%=N>$)0aFD0R)&m64qYPv;EGTB*jd909Wwewc zoq8Hul~k**Xn|z9$-nsUE$lJS)2%WipeWIUs0L6e=9QgWP7((+62WXY;zc5bLdkUZ z3F+$UdfW9-uhKPZty8`8XlGbgw(Y0qFqj>}4q;4lYgnpp`hgCNCuWd;)~!ckyfCUL zmn$x!^wgy57r>&K`d&v+Z|Wc50QUE`WC=Rq3Evgrd}(pX+{3y15>xY1#U+U_7C-7% z`d2L=#dgY}$>^hC_=wi18q7lro*rsZ%3s7!(Ob{)oI5qJ-KaiQw|<6Yz*>ExSRXNR zo6Vf_xKnelsg)6L*fZg`k|O#-Q4tWwOHw&ni_w?n0Q@GkcE2P2?wQ~D?Hu~A1n|Z% z-+EV-930fmi4usq=|gnTpkLV2J4rcv>X?iYvJn`ye}3pmEq8Mf_as$ zSK565_-b>LC<8oHT@5+TF&gQpYL~$vE|^_FK*rUpteeo^OY@kS&Ro6jfXD2NU-MJ$ zFx{R5u2HR;A6T^$BVyt9Rs<`~!r#}7uK`f#)1!51rS#pLEbqs_Ub6B1y-1CsIWubw zM`1ksOZZmo;-#h0#`A95!E5~$ARuQ(I^zS=NIr

    p`1WDFsQN*wO*r#We=_D~b_c z70^^JkZP>-UmJrz%xDaOzrDi|Wl*MgQz{N)+h`t(mO~J*E7xAsEvP;06@?6DCrN=2 zCiVBDpHr1eCwo;k+m9D+N*lH*Ea7Ox1p){fD1sG6*{!LL5Y|(PfUB>xYs}+J4Uy|d z+h6$2P9E@ADvL#OjLnt88_mVQ7dVoR6H5J2Xk*1jr0QN=?k302 ze*I1SS!+Am z-wz0F;U!c`glD$4mAz^I`?c>X{?Yb12a_c{c!c6zAZo$p_Q786!QKX*x4n4)bahUh zKBWdxF9b-pV0p=*q84d%@Y8Y=2m7^rfxC+ E29JSs1poj5 diff --git a/res/img/flags/HT.png b/res/img/flags/HT.png deleted file mode 100644 index 097abeb434461bc2b49bcf88fad320cb147bded1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmZ{lc|6mPAICpq#@w;wTp~viW6mKrQzQ{1#}HCsj#6W6gh*MaM25VAvCo#RmNzaa|Y z^?r3Z=F?JOE%^Z?4VI}?F>1m6obP^#qD5t<#4|Y~7$}&PKC3Nx z3aO3JEy?+wojX}9B=IqapCTH%i0-%+`9iCiCI{$4WNZmum-O)LJtA2_ll5___+mzkygh3A+)^B4ZDca*zPApFWITy?2U%Egsu6#h2b#S zq^Yx{$T>(3;qqLuQ%eeC)9m3*K8+x%V5Jen?FYLmcFS>o>`R_6J+WqQHQuo&A=@xj z1m8%zwoDErfL#LeukN}D8;5o;pxpVU{C1r3#Ai$*-g@%stUF|@io-D~Ctx;>>Y~%( z(~yut)l#TE{pbR;tK324UU`BMvVUE$3eXOFvhTY5SxK{rvDp*!I_wH>P5NEI#JarD ziH9Tnr-R1N=U&jm?P3XomlY4wvR$uFY+vQ-&h*+ayZ*%@rlbk*CN@ zQUQj-#b|WPG-+V8Ab>r8b|ONYi0)>QPEM{F54_R2u@tfD4KZQ;@>2w zmfuh5sKo6yY;6|40emhnZz}2Xq7Lz%qWb|g=)+ur@W;aFL-011t@od0#e} zXRg_CX{k|^bsVG#4+Vw1vhqw?Zm|2u>Us49YxuC;cNL}>tIZ;#qY`cSz%rv z8Kx$DAfIo|`mN5AJ0|kQd`y5Nv5DGH9xQk@An3zd1H+iPVeQFBIUVT6kgV?xz4(Y%3rb-SJ#s@Zq-1`BfP zyV6?gi@u5ZArb0feeab=tsy*8o%2f7$}5YeZid(?b;9z46k6^;y#~vqum7%Gr#EJg z_Scs|@1!sje>LexJl<~XB-=Z*hx<#ccvDeyTwn8`$#e@a?0UJ#A+% z)wX1h0$vl3;L~~Xm!HF~kUo26q>m;kpeIzHMsenDqV9Ur9U6ll3Og z4$#y39c%!+(DZ6Xp1J1NrNPmnN2zTdx?L&_juNB*6^A`;`s^G`O>U}mIBo%#=vrpV zmf{){uyURUiC!>Nr2=slXfqq;J43vFd}VX;FF%}6j*9Yazxm+lrl&TD@z+E3V0>_F z)(^>QC5@i@d^V}OzPllaTG>*9ZkN+~);-0dmIg?!We+s9c>E_$>EYhKdb2(4U(obN`1`$*!TOFj|IUUpsyG)j>K%OwlilU1|G zxb?qV6ZdC*oSiCKp2A-e_O5Qm8~YdQlxvE;eQh;c>Vnm>;gRtF6YmCmcLj8hX*J{S!1Fu`bGty{38N50JITW`X>;&C$tS*w2>%XEtC#I4WWfX jAa1;yHTgpj5_T~-@aDe@poLx}jsUQ;K4bOL0-Nw3KIe8h diff --git a/res/img/flags/HU.png b/res/img/flags/HU.png deleted file mode 100644 index 23499bf63cc9e96bd7e8f87f2d55aea489537046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#OE`x;TbZ+xNtZ#cbOwYMKF`UW=AAEQ{H)oMt+{ws!IE=OulchctiK%+h145y`93*+mkNNp8YXLWSdp=x%@X- z$6Z$Z+M?Fpc~e8D`0{@9377jiPfVz>zG*5hyEMVV;+kLQiG3YCM;GrbteaY1dD*Yi z4`QWr;nC}Q!>*kackh5AKM7B(bLt>Wt~$( F69ABn1xo+` diff --git a/res/img/flags/ID.png b/res/img/flags/ID.png deleted file mode 100644 index 80200657c63a59c61de32747f4e75322f9e3eb9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 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 diff --git a/res/img/flags/IM.png b/res/img/flags/IM.png deleted file mode 100644 index c777acc490b3bf406825f9ff14762c9c0d20e113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2533 zcmZ{mXH?VK7RCRBkWd1Nw4fjzh7mELC?hrWCXj##VTeI`l>h+*#UvnAr3?rTphR>K zMXC}QK|q>_R7s>`kd9KM4%HXmw^?t!z1F_Jd+%9$oo{EI6s(;yIw<+q*&wZzrAlbxDLL_7{_%FB<(DDoN0`mF>ihm)K3p-*0s%GA2b z@~oUFM|q3oOEHu4&LKU6jwlHjB>t^C`d?U68`yjF;-@ZH6Oms3tbUpPsRT5E^0>S_ zYV{6`nCt5&Cce#b9%CGC623ZN=g**xKHzw2(ye=0RAp4yaRgYH7tA)}J~xnnc5fV3UB}?dgAf*& zhEnpeQtDx~ur?x9Obm^?Emp#|!^2)VOaCQ_CY%<{!gQp#NJFaI(!Y4K!S5A;OL?In zo#!&-4{&SVM``A4gus1}yqjT#A@7n@RKk3Od#w&G2s+1Z<|(QjwK&fg(6Cp)I%Mf5&uZ+V}M(ulfWt4wixy$RJP zkE^I+{4|P-=Z+V(B7YW6J1b(2#+Hwpt0jx)vi<9rdPmpbe7V=RM~+VjNqrc{O?qVb zr{BnD9n+cI_h;o~B0fbpE`L>(TXSjBchw+U_w;l>;IqwI4mY_@%bVHlx-R_0@rFvO z5x%HkZ5tfy>lIUSlKBT~Ft-s><7?r&vkXl$GLl(5j*$*sI>czjszCCpu53lTJdmp# zc;N|M5TC_+pK&n^UkMdTTA10Y+CLZPmg{)bVnC-f`a7Lh;d$BiB!#_D>h(btd$gze z`-VYcM>aw8>k-VVx4a_45cW1i|Dm2TzpIay=sD$hl}ZDj82ANsB>Y+~cW$XZ_v2;{ zgN>P{Y1wj%m63Ewx=njI@;00r{o>u+3D`Q}n5qVq?;u{k@oJ7C_>=K(a?LuidMR{o z$lbGICT&Zr36U_6hJD){1rlK|8 z{;ebCs<4&2%ZYu>lf5c$Vbq#qlb^mE-?8xy zSr97?It4zCV`X{L-vKjasAwMMy(U{47BHT?+04*#R+ddUiOkgUwoJ`hFN_&ztG;S5gDe6wY#q9-trZ0(y_&95tLfO9c!={26ZXq zw|uE5FsB}!6!{J_Ti_8Gd}4fiy11uQDVylBv+lt2yssd%QuE9P>6PrQGAsbX=8&KM4svo{7q;gnsz z0;|OlO6O_pr@{v~S9oy(N*yH~AnD`7^M)tQf1oPO1Iw@9v*f}KG0uXbkIH^DISyoE z+G~i}_vG!K#2Jif_UQ^H2kh7_#3CLZwr1oZ{5rd(w>Ar@qvfr-%TQZ%QPGB0=>Jkx)Cfa+Q6Z(M*h| z-Y)xu@4n)=;J_|%t}Z8T*0OooTE!2p8nq_ACikulL+6u}CZfJ{?EdKg-qi35vP*1k5%%391MrZ3&oioy#;wl|xt^kh_I}`?}q?6CuN9S~yu}4>_4iOTu%^ zElYW>HCaCzqptMk3X(>kkg9sDHY2$HcZ)!e(|-UBySNCv-rYgY%A-U!b0K?OA$#k1 zhIw-UXrR@#)zD|vG=96Np{a9LT}KP8idNS_qp!8h>i;Vc9OC8g6aD`Ke1!xWCjeNP L*_oCbyT|(wMu^n0Eu`2 zkTU?lQ2+qQSYea@PSs&u_^+PsDym}1tvO8vjo96EmWqu3)lIHU=5iR~GlWFCJlD#v|+{_!*P1D^QHj7?M*9|yYXv>3H zCLXDJVKsDG#5--eagbV3Uz}51HYg~1U`|3@psl$YthwG@h+n}Y%&v*zPACR3ryDdK zF3xwqm3{1;SGFBjo=_yZ5KDTsbUplk5VEWqNxQr6&MWMViL=C*ZTh)S!Z+p5Oi#%{ zrKP9fV)2~w)9)oOY@>WhBt>Gz1Pr@c4q|P`;_ZF_jyXrVo)eVX_>C&~{2<%~H0W*c zXKL>!xQVvL`j(HtzVqbGk}SeGGGfWN#NH_P{$t?0?}8er|F8S)qQQI-2dh3LAIJ4& z8Nl$Hb{W;=n9#w2_4+^OiUg6^9XK_vMF$OXz@aDF>)MqX_-na{c6gg!HGny1HVX;~ zp3-M@Y%HJXRKs5qOyuH1DOuTCsMYuO2I9Uxe)>7{=SC>u#Mw`g%5xExge_U zRcLhE3b?95H1k2x$K*p5YyIQ!HzOI|Fj3RFIVN?uR4Hy+cEY$Zb}_P((PQ3i7slw2 zS*_2tr0K20vhmzab)-zT^7mvRJUzOq@e`)bW;FF5%AfK3bSkHRT722Rj^KIqQkN0p ztuboA_U2i~Ce2+|28&{T{O(-urJeEGV|3O~XDwviFH7{Dmpa-THzL;v@PUzmkvt-N z*zz9JQ^p-Lijq(fi{WK7sAebcQ67s7`mGiDO^1ecT+qIP5-PesGrm6e!Y?yA)<2&>axGs4H3zOyr9biO{;AJY?dZ*S81#SbZoK8Zeq>jf8yR>#>6 zRNU{uG&@aS4`I$hw)zHh>9a%jk;KTO0=Qn0UeWz5#0BJqDBn!EL@uc)O`|_@ORDi! zSbUqcO@ve=$?ccSbPt8}p0S7hE>8JB2=3$*bf|#rf4%hWm#QGXqWq zK*v``moakZ$jRU}SOMj_Wb#Wi)nto&lXMIx?jA-on<@7k)F?dSNEonHS6-P+UicKx zb~c-O|A$*_a_4wWRU^Z%A++HZpu|l^Ke|quL&lJleJ(Vn_0 z17BRdlkeZ_aO7Gyy@}W+uP?O7n?Z>)3rngbfvNE=g%*ol$Y-NBo~OjEKEAEp+WbB! zG_5OkNxJhvSY<@4AWzYJHG@_7j%bgGHRO9S1cwD!&Qww9e#8Ab(&gf(F?W~x%u$iY zG{DK=CV*wf2&Nbee>v>_HbRbrzAhX(QT7qlDt^dxF>>hAcO?`A zN*yPBKofH<-kT+W_GYy=PB@mv*N}wJwIl?^ir<54=vy_Y`@Yts9@ds*Y#5N_fFIPH z9;)E7gT7b30MO7DwV&Lq@euRZ%{IstkrQX~*h5US`>nqgyxPz9gn8TP2`>9{A8!6H z;!=XrW_`$H%Grr|Y)+Z^4=Qj`8xN=K3l3-Ls-E;O2_CeB17Qh~juG*ZDgXq$wVf5- z#)@E1C2V)Jv3A^nx5QgJ;_>W`x6c1#h+!T$^skivZ_p?S;i?RPmxr%=6`67JZ$6Uk AHUIzs diff --git a/res/img/flags/IO.png b/res/img/flags/IO.png deleted file mode 100644 index 1675d8e7dbe93d314073ed5a52598454712b2c39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8096 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 Bq{{#R diff --git a/res/img/flags/IQ.png b/res/img/flags/IQ.png deleted file mode 100644 index f2c21f7260a8c9b4b132981371f647e949bf9a1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2119 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 Zdbx-H{|4$phZwQ}(9<&3tWn3r{ukaKYK{N^ diff --git a/res/img/flags/IS.png b/res/img/flags/IS.png deleted file mode 100644 index 5ee3e63c5c2b060713eab402c4f7204d1932c6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmZ{kcUaSB5XXOvK#3v{R3IcmC#X z0KldJfP_zGy@fWnA>eYsNS{mYaZtf#4(vCV^Ix zwu)Hh4y`xQ*R=}%v^a9ptSX?lY9?sW=T-#+KJJ=x9+E<9-Q3k z*+ZpD>JNk4htwT967o4={U3!D>#rluJ4kmDGf5?_-J;VwMW@q6r{IGTtn354VqNvp z{Fv_eX2@R9$nNX$EnM01*85%DI8VY8rN2!Lp<158QlbVn~@sf(jZ_YvK;Jdam3!1nHxCWyTaV!>q^0j7C&C> zyg0FaZ7!<=k=93T96?GwKSuclS0|&1h-7W(gNOXv@)Y`X3vIpCvtW1fG41T)vaT*n z1*K)I+~p3q!^O(!6Q+S`N{RRl@{MP2p!Z5L2TvYtzyFy}{O3%f zU_mOiY}GNT!3ge^tSOUIQ^4X4wcHKl7hKv>1v>rds(8h)m8}_`*HfFE-pRRx#@TKQ z+I;>&YVOSf6|ynSoFNv2bL|wQ#yL{3T_ zc~r$O-3(;fYDO0tTJ;ls`2psFFh`khZg-y9U0SB?ZFsbk4yEqv#FOEm9A0KK%vxu^DY`4gR z!O|XCs5#K(^-TguA59f+qr(yFjgdc67*(*nM6$gK8h`%Op+UIZ#DKeJRW7Sx+Q&%T zzTP^da7_=X8F#9O*%)jV*@AVVE6Iv)>uri9H9e9JC^Nqz6Uq2GsEi5o-G@08OX znf_GXxvxUvj*8IX_XOy?O527U%9o()Hp#ZoS|7Xnrhs`Welw-UPLtq62_uCaD>p43 zc;2KL)G>)7`i$#Uz4JIhKBQl>fA&BgrBx2ay2#Dx8TC|R-Zd!7v4EGfU~*;*E+}Vd zz=q|&VOMyrVl6K7bhkgB!+seb(;%)EoLBzHOVmyh#$o56YG3zf3}}LJCWn;^&BgZ? zOw0lvjzQ-~TzzH@ZN2&v-W4gdh4w~iEKtlmGa$*<8gbS<3yZIY%UWjp6n7L}L_@6! zV&$d_kju0Sm9|+t1pArel5P#u`Lo`b#;>zp7fOlz-s?@zI(3e&-~*e38q>`gD4haN z_zA`(<+M-m$bFp~MESus5B<-Di7`sO9@WD F{Q>ydrD*^F diff --git a/res/img/flags/IT.png b/res/img/flags/IT.png deleted file mode 100644 index 53b967be99fa1f77a52054fd8a297ab86c5b0f06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 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 diff --git a/res/img/flags/JO.png b/res/img/flags/JO.png deleted file mode 100644 index 8934db7ecafe170f9a832b2b291c3542eb66d666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2572 zcmZ{mc{J1u8^?cUF=!0gw~$@7VQkkr7=t@;Z57frcCLL=ZrK?ONCa6C3_!e%ER6u5?!mbeS16+wcQ?1S1c19T01!h2fFs5zh6(_;kO1%<4*)tj0Kgxd z_r^w#v0!$?nPC`Yh;Gsv%>Zk#x#LX+@&Ao2KVu4`fQ4FEn!*;KBK#;hVf)BU0AM+` zz!=&8J-MD6X>ac-)ET{*FDT$4V6Ezd^0ZYSy#LvnM}utdaZ1Hi4VC2U4FaS(kewc+#F^!lLOC;W70%J_+cf{`;BV#-Xh6W<(uo?WpFBQZ z{h*IJh}^srwcED2J1uA}$HSIjT>LM5tRu~*?)(x#UiT=Gr@Vh5SX%@U(*1?iwK7+7 zWxp2pTU8H@tr-Gs5@`(F^DfJpL?rGKvqDYC5ua8s$M}Tj>l94Y-IDOFwv;*R($k}< zI)s??WNg&co}8PS9(*qz@`9dLdmnGV%d60JC~c|;Z1YCufF=nUhx#Le?4uUoTy6OW zyzAJJCGVAr?}sYSPiTcUvxivu1I@5+1kc2*@ZWXBXq7m+TVeq2AnCbC!`BnE!G{5!Q@oipgXg@^!$b+<$jGgwSXuws<(a1rJ! z3FqKq#S|CEHaSTpE6(e}+pMF@6+iPc(R=1&*D{r^O|>Vky}5pu*ot4nZ|2xRu$N-j zlj*QIR^|_2Sx7EAeBBIkmtr!HrS-(BKA_xTtB{7E@TL&R@6ucS#Kx6q=`H9_=SjUk z-3-$`oZNC*v<15H=<^t zJt9fqd_XQ3E3NB^@UPw$4Rl~`InbbJf8ziB;E?cC6oij3gRTB#>Uf-OKpR3;X@F2( zoj45*^dH%~Qr2W#6*G;7=l6M;d~wlcUN=-P0EJw>pMIrD{dHhRFRuYO@8$cF4fQSG zW|cyF;G-k=oTx7Q(%_`-qRogx+G*>V5S~Aoph$AId+RI7Y0U8kj1>pBXrs1h2~TRd znd}F7cX&B(HWugdF2Qy->)}0@*RR*HE-7GB+RjyYpR*EYQy6c;Rro!%sWL?yh8j)STd~B6s7gP2rHci*R`T>D~j<0`SJ(w z-B^bWv8x>}T6^xD${FThf4Hmoe2He!VYkFn|9XmPPERU-k7Bjs6rwL^CUZuJIDC1a z^+=GUpVQ)DbzX%3Ltci7wO!8RW}Wk|oee1NXt6rSHm0#{(S!yb)j&8LUrWUqj=+U{ zLCijLK32$8jM!QR>%ELjK@j_>7UgK-+}zm<{JZgC&i#|amXa`&p-K)N?+!#$fC)F( zF|gLaHO%^2u2i5Fm9lW*!s*STIJQepR*k53WLAMQLW=a0q=L@AQ?tuw?D19mkN1Nk zznzUg?b9-%4Z#TB`Y@T{0{({xMa?FGexp6^!jyw3kBHwcEdN|OiaSXAf z3o-3^J$hfZtAgi7Pw<2jce8Q>6JfLU2l~)eZif4yeIEP;KPY;4gqi32)LU2 z2r=OK*ASN^O%O>+6tW$6ta5}OSy8=u8J6K6gz*FrN0|Us9SP;kDkL8TUsPLL%6#>L zYYI1VHX;DHN(y4~b#cnfbq^!xq5`{^`W)ac>IM}O@z*h{;nGe;M;E(@1^~-WAevfN^Q8Ha)T3!Yu(-upA>QlP>js()qujSl}5f_$0Zt!KA zgU7d;?I0JlgN*EYAt!MsEo+6>3{$<%yv>DOcdm`4v+&eqknt)3RvKk-+bVVT_hOVd z`U5y31qq+HgBp5`zm;lV^HGeUzDIKIZ$JqbNtR24VOd2#%I??JUUrEKja9|M-6eSZ z*PlDO5ZeO4t%>F2A9)4x#U?Q#mKmVM@B~R$zV1owv%uG9~i5-%#bcDcZuZ<0)J~vcVRGKP_J>5M3 z6%QLm^Zw7T5wgAI^6J^z(3`yEc*bWW9ctfsvdspC%YWB^b@s%j}AHI&q}?bT2^ t8mc<#NCl*-4ifoy_p<)K3;{tNzFv3!zk#*zMl8bsSeRO2YK-x5{{ec*i(vo& diff --git a/res/img/flags/JP.png b/res/img/flags/JP.png deleted file mode 100644 index 6f92d5236561007f7d1049be4c1e45b1dceab05c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2402 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 diff --git a/res/img/flags/KG.png b/res/img/flags/KG.png deleted file mode 100644 index 56b433c7566a47bd1b7bd635525bf8ba04808896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3258 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 S1#Z+M17L1qZCq}Ii~B!iKkrBY diff --git a/res/img/flags/KH.png b/res/img/flags/KH.png deleted file mode 100644 index e1ddd5f84c1fc14c1be1b3f012bedb3b4e861c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2888 zcmZ{mc{tQ-AI5)XnvrG39Ae6Hj5wNXjhzXD$ePAhmeeGr$T4M?m>Fa@WZ#zxEr`kz zgRzt)p~e!jgt3e*N|_9=&L8jfoJq-~@s-ng0 z?ydmzdE|I}?pTFU*V{q?4Ruv z{O0z2p7y*;=;jVHcQbbm5>6*z4)a6*i(~Dt&dtvMmc=5A^y78eZ=r8JI%ex98J)QL z@tAbmaMhY_P|)IH9+u-@|Aj@khkJ`&R=RS?KSP=JQ>tF_}gl=9M=0y9$8roKX@ zbReIBZ0jsP@)fyR6TJ6Uld1yk=t64-^VQUGv5!(RADjA=;W`{++?+H*e(t&xNkQa9 z3aD7ND1ytsp43M&iX{SbnfSW*>P5~oPA}*<%;MCR74`rxZ&Fk{kL!_XHSk1QWH2IH z6eSxT8t+)F*>5vqESMQ=D(-!X{!OGk1XMEW;#8|hexW@Xz^PYc#CI)axNt8>Rqse1 zurkXT2b*WUOZL%chUfA%p1v>0e;bX|f*DD#gJrPn6*1`XusyW@yd{fPh9(K;38Kz8 zK5eI5H@kclI@|PtS|LpI@N{-x&LOaq%hPnp>D|sAYITy_9Q!2IQOWCf#YN9NReiPk zXHuF(O|2DoUtD1&P@L+ultN%0V%(Zf4kk(3}if zjGyU>KKoQ#QA>E|&4N#KRBZFT%7aU>M)>7 zLu*0kML)EJWHwTncO3HilLlzxhaXRTAIK*pB%GOpYApJo{}g7<(MTLYXazmtcq%%F z|B49k=|Z3v#j}qLAeWfm-R3!)wb!4<9gS)mrQ^_3p^;Gg`?tHrk!Np$h($lTO z{$uZu-;Mr6r?@3GD5tK`ye-OkrbhCz2WoW#gEJ~C9bo2WQ{pTZk@4*ZTUso94^C^~ zhc+nUU+8d8Fp8&*;pmfYc|!fL?md?acom3cPyVH`2C>=BU191L@N3LmuO4AFW#%ar zs593iw+n&0dz_x67U_7J1i$Z@!fl7(t)=@Xg}R)S`cGXmlS~}Vvvr7FmbnC?fyEe3 zQ+qGGraCSYzVG#Y^C>l`xUm&FgI|v?1Ye~Bq8M- zpJh+))0Y>CyJM~3NDYGV*ZGb+sOts|^JDG$U&kwbs`E)so{5?`Yp#hDbDRYdWqqkU z=P@>@GVE7WPk?hK1%e}BJx#&i%bG4u!jLCodq<&|m5X*5UC=0Vi(OqR+{!3yql**X!3ntBRL?b=Zt`ei%lzX8k-Dg3@wNzz%v#1R6fsh!Iq``5dagw{mVpX&}e4 zL@;r44ejmJSic<#O>!u+har zNs0%^Wc7|hh+e1u5AdqJeu>CK7*J_zCdDIn7Wqm`5;EaGt=h(<! zKomKu$=3&yJbg{MSIZP_GdKb#aS36MTx~GU%FpSD7bfdh5kSk&Zyqw98q|;(J2K;`sB|Z4k z3)jRjUs^d8`Xd+xlyds#mbHf=cHWR~ky}pM0!36TRcnvu%uLUW9aL2uVld&&vC-zE#=xEbs-`5_l?`+=bbkb zK~WI}om@ph?BLgwao>S+$pUV1_O7V@q`R}^8>Khu7k!eh+L)gRv}jas+->QJcT;Reks6nu$nB^Gh@M3B&P#XQ{U}rb^ z?U_(*A*Mq7rB5dq(a>%KTrK?|Ns6ljh%*NYqn6?NjnUi$sW>ilF@i*F<@ z1JdKt0N>K3drU~I60KPTIDru-ajHGeRy*G0YKb^PDtvODme(YzFWY??P&+0HynPg+ zX&<`F*5gUm#5<&bX_Fi!4wGBu!ll3C61-);*OR%;XkA~@EwTKAoihoO&da~#CGO!m z{#~r diff --git a/res/img/flags/KI.png b/res/img/flags/KI.png deleted file mode 100644 index 8b7c54bc0fd5cb6776c02147df745705114a3a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3661 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 F|1T6US`7dI diff --git a/res/img/flags/KN.png b/res/img/flags/KN.png deleted file mode 100644 index bc6189bed120b39722e2b809bafd3916a6116fb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4213 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 U0ZpOZBT@kX(>Bzq&~U{32SV%QEC2ui diff --git a/res/img/flags/KP.png b/res/img/flags/KP.png deleted file mode 100644 index c92248b9101fa5a4474c6fef5e011bc16652e5bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2293 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 diff --git a/res/img/flags/KR.png b/res/img/flags/KR.png deleted file mode 100644 index ab1cb94943f8ab9abdf63a26c8b9d96abfeaa545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4837 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 diff --git a/res/img/flags/KZ.png b/res/img/flags/KZ.png deleted file mode 100644 index e10a1255a08b1d59c662f3a0f21bfad58f7e0eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3466 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 diff --git a/res/img/flags/LA.png b/res/img/flags/LA.png deleted file mode 100644 index 6ad67d425584503b532e66ba2cac366a34b38e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2119 zcmZ{ldpy&98^?d!vRTd~hmtvSOU9fU)|^7(E@y?tMoz;TGGbe0Qi>w&rWh)EBI{O^ z!yNKR7(%!mQ!DGvIWni*>wccs^Lm~?p6m6xuJ`x4uGi;!egFGpoN#lL*sZ)9000SR zCwq4x&3>jdR9MH~)f5V`>#U8d4FEjN659$A5%vhYle;SbBxwTx?J@vt2uCzN0K_8! z;7=R?pqT)m5PP@oq?K?14R&#~7g8AOcJ)*t;IU4AWFc{X=VGL7ukZnjb9QxrO^fVT zKJMlvNq0*%;8=_y!E}@rmOcrTFvBv`U$puSo&{H zvsYLS$P*OrV81{&J&+oniSi=^k&ok7pX^`sd&d9PD-k;B~hpm>OUEyK7Xr&#eeNmbXGbNd=j%R(UVQ<~Ewbb|^WrEhPT2L;^i!?j8P z%Q3sgaNg(cDPtWS0qq~pLtc*8jYq%o4n-eGe$mo;L$t~POo!$!#XO;LeC~(uqgRi* z5#c6#k~Wm}TSh_}Gy+(vZ*$trL@go*+#=9YT$w)NCX@DTsFm{V z)bJS5H?R=Tc3{94a%#ZlK%-zUE%4wxsC*+}uB;hS_zV63_SpbQv@P;Gjb)!*9T8X; z1S!`gl>sB2E3)q|Ek4VB0<>epVee5rAnEH67U^?>Ni7$dQX}G00v#k>g5pHq+^1P+ zdxuZ3f+!Bb+^^ZUEWFPq}c#Xz6E z6_^^e3u{V<$0y6c>-MLn4TTY6k@2DCrN zF-M&6r1yrQBK)ONd#Z= z7py40h4I=tADCJPZM`97*bUja<)MgCdfDyAmzz<88X>YwrO)*i%?CAd>) zZ;Uo(*AWQuJ1FTKmCD0U=rZ9^cgC<)gEQBxX)r11b(ipOfu;e;@g%SAVGLMfR8V@5 z#$4vBzZP-Yo-9r0q{t+&@gprpEW^y);;f5wnMj*ilE+qp^WarI9EP@3aX~bx*Hysd zq+h7>>j?74URqPazhX=tOLMKOZJ^NHdj!16$Fe=`+91Uvw@Iwq?#TH3k&0YA zN}{~gb#X~D&TjG3&BIHI(38wfNR_ItQ< zgVN8-W=xQ#fcMex?hOo88r!R|v+J8oA;%=3n;`1rP*SW*I|!BRYdXq`<}S84t+ z%-WC4Q&RY}``@1~Ucnjj3&3T694j`P?yra}LsYvY6m8uNRS{&A4{Fn9jItcRi;(lz zF*k9AON>>+{3ab)D?2O3EKJ?Yf2e((Q}l<1r54p-@WzYWl*;`pu5_guJFKGhZ&9m= zXKgX1_TUUPaOO;=A9W%i!K8|FcH-Q)4dHOJt~Kkj|N!6o5?+V$-YnZH?|R}#9t-lv~Un zfa1PBtOr_;rZ+%vnqATW<|7%XOO&EMkWX(qG<*g;(-6OJGCv>vu5rf`o9se`h?qmA-Q3)4_-HKgsyW@S z6@pzelw&>?XkCYQD>g@QQochD)kgc)-)Ymowpo?(f$}(+JTnka`jUAsW{RP8vdHx{ zOy#@|>Xh8}dDVx4s-HH}$#(ncDsSgmrIl2#|1zk*?dqy!{tnQ_%}Vd38y^#zs#ctX zZyX^gE(DD~7a{~;j5IPgK$;pDTX-6y(56Oc6Qn-U2#rK0wtlky9|19j5FSeT{{nbX R09_~moE_ZkpV;Cq{sq~a$M^sM diff --git a/res/img/flags/LB.png b/res/img/flags/LB.png deleted file mode 100644 index 865df57a42f5044f43d3fe10a850666d612f255f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2537 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 UB<_1B3If0xTPK?eE8nF50Ee7!1poj5 diff --git a/res/img/flags/LI.png b/res/img/flags/LI.png deleted file mode 100644 index 57034d367c4b0548a44aa72be81269870b30b53c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1759 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 diff --git a/res/img/flags/LR.png b/res/img/flags/LR.png deleted file mode 100644 index 46c3b84a92509f9adf6d103e7c273e71044280bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 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 Yf1kMjZ{RC&NrnsnV`PDTY3O$QPau|BA^-pY diff --git a/res/img/flags/LT.png b/res/img/flags/LT.png deleted file mode 100644 index 7740cdc0a09abc9a6a36f2bef086a4d1e5e3a376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#Q-#wsLAL+01oqR+@=|m{ypW+li>R z^M$!r&*ZZMCbNP<-=aEcebzOFj4W4Ku$++1Gx( zE41@?Rta16{y$x>H@=^CA~$rg@r_qEzg|4H5XiezYVK;+{f6gTp=n?G&(_w(+TSnf zFEXAHX*?&9@$oc?ea%G=EPW)|g4+&GDLiLTImu;S?RBTTAlt)t4o>r3{>z9Z?k3Rm z=o@nH{hrlqKN3IZpx(Fq_g+ diff --git a/res/img/flags/LU.png b/res/img/flags/LU.png deleted file mode 100644 index 8f383e674e84347f49327ff69841dadc6401d918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#OE`x;TbZ+l~S*j<3|39$fGgkg?Ku@j}h7sp$>}D|_bD zCJtSx<$JD3vvU_!Km9+uh@*vFZqgiWCZL5t5V7zO_u8%3tT=MmovhA(wmBcH_4}`z zUbxP*)7u^^Udg-udTW$TdJg-c_W?7KHO?4{Jd@xm=4rJ&7V-M(mRBp(Z*LT+d?DL= zsOj&!qVE^Vy#5@~(AjJpIrGG~&l-O^m)^U$BJIzEHB~iP)~ZhHFWt&ocXabl{^&EZ zy}7shIy>%vnq6lzOMZX4~M$2p(c_L|#&+Lo-eNs)J|MDV{v=ipa&%DhzWsI*VfHC(}#)5)y* zv#pR1H=O_J^!8;>H@%A+_%r7#IsYT^vIyZoR#w>+PH<(f;vw zpt^>|1+`5DO-D7J0UwWP?je^J zUdv^l=bSw*&QtXHz*q0xkv|W!RwpX~tpfvx>7Mc~fg-MflQQ@ZU2jt0XgV-s<#~UT z*@+Q)+2@^CMdX-dZGAKEf?Ugf#Tn@w&m@~F+Y;shnREKTrd|JXcJeo!h_@dvbAGF{ zU&C{LOZcHGS^K#O#?jp7pD*9iPMqsyQDt?|%lrE8ui9^?df0mT@0$9itjRb2N%%9q zt?7rlste7}`KiwkndG!-)n1`6?=PR$a5L<p=fS?83{1OU^M^G5&x diff --git a/res/img/flags/LY.png b/res/img/flags/LY.png deleted file mode 100644 index 2884c4c0a9cad4e68c4f07e93d5191e1720e8fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 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 diff --git a/res/img/flags/MD.png b/res/img/flags/MD.png deleted file mode 100644 index 8e54c2b815f714e64a395c206b3e8a814b4107f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 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 XG5_DdQR+rMG5{BiF5wys@JasxgAPW$ diff --git a/res/img/flags/MF.png b/res/img/flags/MF.png deleted file mode 100644 index 6d50a0f544ad14e2da315e53fdeb187d3c8781c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 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 diff --git a/res/img/flags/MK.png b/res/img/flags/MK.png deleted file mode 100644 index 84e2e65e766ba023f5a48903812a5988dba7ce26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5066 zcmZ{obyO36_s6Hi2mwVxVuVuC(mhH6sgVQ80a7A37~L)SMFt`vt;CR;NJ>l@DKb!c zlyrBD8a#ZTe}3op$8*oQ_w|W$|N6wa_niPS(4wJYr2+r|G&~=neot z-=w3dW*UIs!n>ut@2r#Eon`q@mQC&?9G$g>jSg-cSDc(y5|0sy1H^G2 zDJKMtW`%1eu>w2FKf);l1-k;^^o0-NFY$jh?VPPy1it!X-tJh${crbW^WtRiAs@YqA#2=qom!@VyeS4h#^@_%yVd z60EVo1hl(-sbfc4Wziy*2~nbNnew1yu(Ldq3VC$YU<3ORe7wPxi? z@_AG*-Pm%9;fD#`b6oUATP#?;JD+%Hy(+O)Kl$S?S+`7?cpEWyx04ABW?i24*;zt{ zO4Pn%XTndA7CEx;9o0ZeW_pEV7LVJVAty#BsL&M+x_D7VyC(S}V6DpC&6;n#a>7LD zEAz<&_=)U~nnW$W?>Q--_|=@pW2`pTN0}XHSo6ZDhn2$)c`|3_z7q=PKJ!0|HZrpU ze#GZe7`R@r|51eMM|$!nowFSZ{IgBI_O?HqE*3-f(U{XkG4f^TO>@nU#?L%b@p*bx z(TARM@Y9ZltJ`5BF9G4WU+%`wzTHX(A0G$47!#^Hs1)cmOZ8#n?1YB^sR(2r|A=IB z-c)9?ITA#$Nqg#WeRe04tJ))?8VVy(pOp(?n|Gt_g9b?6>`p{$67x{=;C}qk(=89=$GWB0-o@K}A)Hg6WEW?9!^uWM&p9jVuq+R`jWqDmZamU+@b;jPnwrpc>>&{Zk_fSd2dHVs})(g2lVC!Z%~aL?&5tE+9M^Hi1xduqUia8vX@cgtuMyRFA`st9!In@ zp89Z`yt|}Nwd|}MEqr+RRpNMPs0sNYJr@|Oa*D1Ax0hV~Hc6&ips`(B{c&04waF^? zuKI>p0c`wTa{H9Q7!M@;G|l9Dz6UVt%UYW~otU~r%Q&?ZAKTRZQI{`L)znchRqDpc zQ!xxKs(iV&6j|?vz!7J~Cfjj%>f}c1^|-6WcCJ;h=W82l&Xul*gN4&5OY{hK?-mMpG(}7v& z>Rdp3)Tn&M*FSS^Q~Y!qdc)mRD94s+$81$yNuZg`pt)nN{&AOv)U)2`W`=$fr@Iyh zTw*xachKefewhFtj~vG?ACUhO`C&)-=n=v*^sE=DG-n~8V#a>6EOuh9pctg8;(7M& z-3pf($m*zTbN9tac(=Eduwm;SV-das-VyWy?^d>hCo=Fe#;fn69~Agp9?C$zE)10y zp8mYS+08+Si{m!5q4Z@2nUd9E6h6uhhd)}XO`=D*e|b5)5yclIx<+I}=UHJ8Zr8ui zsb7(k>LWi$;e(k<#Vts z+0mYY5~&N9CZ^d6C;!=~iZ^ct9cFXQrb1y8@rJ@Nf#Db#y+Msq1nH0X^i$yvjUxJS zPMUDtL4nQbHB^HacS+1><;ME@y3G9O18pX?y}$Fq+FfLOioVL8!XXWl`Ozb5=0_$L zex0q8*cQ5~Y^tLS@+SQxQso+2HQ5So)XQPrl7zfb-p@{{LI}!R6L)Lb87h}O%h2@SzA23U(sb~;A(^_MT1oQVrS}dpB=6$pa5hC5*tuOZ06alO z)#R{iE1D$f-X&UTe_)6U0SP9v)=F2b?v5LX6B8DiRTs(*IOB$e3T+<^7A;v?4FmN* zM=@p?=xUs$qpEGxE#YqQGJ^-*3o{Yvrz8y#aS3;W+H*vzrs&iCf==CDIrF$a3F1e; z9H)MFK*b-M#oU#c*~DM-zQHpM&@X!PvoxN~x(0^mcClO3pN`(^ zL&t++r1fT;wMDhy%ZXzJCmSbf=i_~uC)WEg+N580OnsOx0-<{aB@j+Ok9IVH6>sNq z+$sY~V7X3tCP)%(SSKSrQ@$sMNl_@!HKKWI13cob3T3Vq2nBnklEJEkKv`UDy7Ku9 zBjpPkA?KC@pOcn_hq(pwC7umx`bXd}Qla=ZBKfbdKCY))S1L)1w@qcA29;lP>mfOfqt9yU*sNA=tc9Vc@W+ zrJ^Ektf=n|F?y-)<&47+OsVAyK2o?cw>|k~p+v*3l~tO0MT9DUPyV;R@~dI9<7@>J zUlj=ycEWPC|uG zx3hNieYPUy+>%WSY4HtKG!tc8)iIlIb8&HrbGh5mo4nbCn8Z8ThB2F?AfURRT6{f{ zWpGTTYay2yNSf{?3{KhC-*UvWjZXI7CQ(gPhh2T)~;lts+XFS)2;GuOs6N++~@ zqeQi)RajGhe=SjShaB|27?^Wv|9k_f@acvBiNh3J>&KKRK`Q#E-SH;fT79Kx^sfsU zU9RRL4Y3}Mra;af+uBqAg8BJ=MGZelsVLIsH_Wi-Eq?P(k6w8j&{(%z{fWk#zg6WH ztVd&FKgR^u#j1K8tlyoYX4^lBho1c*%5EcazV37E>cPc%lKDfwAN0=r{p7TA@*G{) z9MdY|Yj9?|Yb{gcxonmkSMjzvuEz54ZZ??0@0HHGuq`z8LeqsRB_E=Th1mXH84Z@PrDpaLWdT&a_g18fe|dhr`z`Vh;iLIFjz3a z(!;^*u6(s6blwa$MFQ>CxA)y;WrJcU$%n^Oy>%Xqr)Ip%;<_Voztx00ZzCTMG6oi@ zhX)sXkzzM7euRy?er|7EeI?7ec-bxrv47s(H-wW{Si-8w)mX!s^Po)JYZh1H4DRVU z6sP4(xQLLY3*5g4WPMr8C_}~Cr5AorL0WNr#|US|Jt56$KK@J3ZHy*pErU)-&lzZu z`vK1Ni+GrKXHa~zQ~Yx^bUdI(bZwV1ySBY5dK1k&?DZO2D|vE#Beq?FgM#64^k;$TQs!UWk6tpH=hrB?Bj|VPY+5Y(L@kB zr~#T6J&+9YV{zKK72Nl+nLnQKWCxGUEBB}SUt;^z|w%-BC1S4yBO zd9gjbh2M*bJA#DMzavT8u+D@?lrekygjg5sfdl(!qXE00$v@ciPC1WeSD$3VICL2M zvew$){#K@W^hI8|M!FY_$92AI0ZnH&%SZaNSWft!Q(ZTZrcTM_O|elMskya6CF`Gt z*d10E(VLvM_4==|929U1(JSMJv~2y);1=REpS|QuU`;bOMldw^`oaV*l74J6Xp)aB`(qEPLgd9cT^B=4otk9o;g$~9eo`dUsSKnlQLL(AeKQpPpjO0oWoW;%8hznG1 z%-#t;F4K>0rQ<@5HCJU8z6BS$4;#+L3ZBdM^ByNOb$}~+dFx|;iH+Sp>E*j)@eEL| z_rf?`Lc6lkcc$fw2T}Hp>9?bl1X3Gj@7OXsG83o(c@&jw?0eJcw%G}Y^A};uZ z1%+RGohfP)NbyVlNEQ=;Po~=@D|dJJ<3EdhY`86Y9OPO-Sa*-VOaM;xT{jmtf z8S)9&E?^P4sxhaPzTbuC$w)|mu$HQjqF5@@jIc3v*c2w?`;opw&2oNf0yTeQ ze%##^X};~{UCW~*;@c>L6*@z;rRnny`Fzr$g4={%o;*3bX+~#^w_1;x3bUT-F*;zr zMFC8bn$lUqkK-LmNx1PNSjSMi^I*vw8+Pwp$iPPOa5qdyTbbddw?4|H;7=s1pv7jD zUtTgN-f~U7hl69$JyXG#`ed=PRVEte%N#-q@-BU>d&eM0s2U%9V{udR9&4QPH2bn& z5{Fzd&1X%s%N1CRpF5arO7AKrYb7C zl@>l)==0RA@6_2ul6?_y5TkQmV33x@AMqug9uH3U=QDKv3aQxngo90O$U)=Hr%;lo zuS>~v^uJI$(GJ*BigXha%D#4SR_I&w5zb;XCsCUM+A}mzDul04=3ECKG3|`_vlCf6 zP#yQ{V9r1*^Mc(NefAt5o9;qYJ2663W3dP+>9hy(ZC{0$-hqx zkBn&$(HT)~IJ&z6KG4RYLPJ4zkD1A|{OiUMZbX4j^yjM^bhf?v0+9^9u1L~&NMs2e(%YeYASEC9MSV#z>hGoKhFsyP3IhTw9;?7?MPmlABA%! zhU=DSz{B7}+X&O`yX}=zH~hC~lvfO=m;?u=#5!c5!qonJewGZ*tBr}bhET;6uJg{!j(7}zpxbI%xE_f=Mn zlHP%hW@hpp7+~SbVS?ML^lH_cLhoGy0gseh%Enx2K@zc-L*D;WCQ94GL|g%n13$eg zcH>&R*0p#Mk1Y^RFvN2ONAKs?07!^Gk`)n`7LkxMm5@}Bexx8JE+qa)L0mkbeM$NM eCA{=H=O_J^!8;>H@%A+_%r7#PJpT^vIyZoR#2=*8?P(e^OE zELr+QUb1z&$5iWx?nVX0_EW4y9VKN=+?g$^cNK26*)~KTyX4f=r1QG{{pE88#%H4c z3jvJ=0)ws(ciW}}d1*f1DF5sJ5sBoUhu-r~`t#2?f4gj_%)7?KRV%`(>aRxihS-bG z{-dfu2t>7+i$)pxba?pz4+nSUPXa3JO|HEOc>;SagUWUXM*^|?GxjvITns5 z)JjeQ1yoC1BT7;dOH!?pi&B9UgOP!uxvqh!u8~EEk+GGjp_Pe&wt=CQfkDNgr?w~> ba`RI%(<*Um;G7@Z2(r@C)z4*}Q$iB}jbq3l diff --git a/res/img/flags/MM.png b/res/img/flags/MM.png deleted file mode 100644 index 70a03c6b14d65efcaf70611ccaa5ec7415cbcfbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3123 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 W{=a~&*fEAF01S0ab!xN-vHt~gp%(-I diff --git a/res/img/flags/MO.png b/res/img/flags/MO.png deleted file mode 100644 index 3833d683e7cdccf977da589ef5e83ebf1be96f8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2994 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 V17Y5)um=M`MNw0sQqD5`e*ueB;w%6F diff --git a/res/img/flags/MR.png b/res/img/flags/MR.png deleted file mode 100644 index c144de17f7b64a8731fa0d8ebe507fb788251047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2897 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 F{spdsOC$gQ diff --git a/res/img/flags/MS.png b/res/img/flags/MS.png deleted file mode 100644 index 12217070421ffa3e914ce25d1fe09a97428405bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4967 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 diff --git a/res/img/flags/MT.png b/res/img/flags/MT.png deleted file mode 100644 index 7963aa618a42abdd533d93b310cb167fc18e1360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1324 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_&;mP&iNIEGZ*dV4$8XL7jA@sIB- zPkBc>RBm*V)L+|^dBs;oC$Bi4b7p6CpplTTS!!DJH?f_Con5;mPfp=pS0Y(>`kr{1 zVuDzcxO1ww+l@yZXEqurT~I7cn9yVt#+7+qZ^6OT;%+T8qKeECV`Im^ud`{xw@ zn)8HFu|>d%141lvy1T0J_~VZiHc{@syZ_zaaW`-K?X~}=`TOi(-VviW{WPnC058kS zbOwWh$;<|s-}4z~SQ+n?RakiVAJ>D;dvZ#c%<2~MH>B$PN$vP^>D_z&qfTdv`<`Y>E^vPPY~_MiV)&Im8!D%0uxzB1ym&&ll zao^n#v%!WxIRBQ{8uw>*2)*QWQ zx4?O?mmbfYxAO0_nWHCvmCIJt`T1s_KUaCfLN_fpKgVw?e_R(Yan30ZD)v%S`S;4l zcRiCGn;%1bVbI(@kZFGo{M#@^DtE%CM8VZ*>q;0^!k_JZugAD`V`+M{){jeK^1jl| zZ*JTV_kG9me5-oWwQWovuDtOup0BR?)OA6Kse#;EqZ#f$ycf;QvpMkV!In6#U8&DD zRUO}@Unjj{&Vh{&b{j+*|N0tXcf>B+ck|nsuh$hbzdOKv!0@dqU&SOgJ9efYGkQSo znDl(Z(jASD-IiPNW%<4+n$xwHZDziuxs|`eKcm;zTK-PRD8069`T5eYt8TlO%H3EJ z^x?k2Dpu)h8PgBi0E0K}X2e-8hN>MbJkoK=>`Sb=(*Aw5OuKE%VPd@fOKuQvJ*U^5 zX&z}2C(fK~d6rkiz&>4q#q7n}Dt&?F^4C-yn&&A9M*e!Y;Y7N`W_97><-(R0jc#9; zTK&-9oAPqEa$b5{r^ciMK5k6LlALE!R179hB$9Kz_u0zXd-GHfdD3OdAI|@et&d;i znj!@(IaEtrBT7;dOH!?pi&B9UgOP!uxvqh!u8~EEk+GGjp_Pe&wt=CQfkDNgr?w~> ca`RI%(<*Um;G7@Z2-Lvf>FVdQ&MBb@0G+lzivR!s diff --git a/res/img/flags/MU.png b/res/img/flags/MU.png deleted file mode 100644 index d5d4d4008dfb8b9e00c2bb9021bdaff6969f6888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#I(Ex;TbZ+nD*{fOl}?q|<;KCitN{-kElox|nr-Yh^1!Qg-s&+o=5L0*z=ci2mNpI6R%-f90= z#pl1m%rj5BT;CZ!I{*Fl+qB@h{)O@aiyRZDL6BjbRUO|8Pn#n7>x{F1-Po~VXZ9`` zksZrB_rF`gwOX`kYe|3goFCePu`fSywDJbrkeJf;L~xx;qjsUpr!8x`HM#{xl)p{D3lU83(ETPgVR?*h8{NYEmId4>Lu8~6m@u1tP>Xw{>gM)x1h zQ~P(yXz|%z?%PZAQXjT}yb=7YP3&sr677$#o2q5p_pDmX;q5+S?x9PDa_+Ao=I&2J4XsQJv<(cc3=Ap`J+(#Akei>9nO2Eg1LyqMMo@Hmy85}Sb4q9e0CDmjWB>pF diff --git a/res/img/flags/MV.png b/res/img/flags/MV.png deleted file mode 100644 index 0f2ecb43896a924d5f46e5b972a58bfd29d37005..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2047 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 DckS{l diff --git a/res/img/flags/MX.png b/res/img/flags/MX.png deleted file mode 100644 index 096cb1111fa1b35a18c0e60d286a5c37fb5a3ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcmZ{lc{JOJ7RP_~os4}KYqhb2A`!%1l&DyWhDuUOEw$E`L4sOlD5p#@RjS%*r!AeT zSW|mx)l#(+OP>ghrDLrGoxHyD-g)njch9}|bC>h|&=m^Kd?!i|a-BAFLtOWqXOaNfAN5oYCxB&%#FIWIT zlmdWERCx>9oW0=1J3H91$+kn=)-*N*q8xo=*~I>cuVFUB?1C@O31!c>#G@#4R$IX{ zWs5y=cCxefOq|)6B}94BFYAsn`!Q1rr`hf#;NwRBE4j~;xX^84tltlj`KOB3O zc%Rej;rY`s&xnuQ1-rCKhB-Fb&UWrNTZc7fASMvy1E-4 zG(}xw9fnm>6NZxJ4;q7q%3@cD543;zFMm(Toe;DCVeW`lRa%X&j`Xj+YME8XVi51g z56zp-?S3EYT_qEbo0&~_&6cKrQ5BNd@9tCmG`i3au&$y$O%Rd3!Q+EKn*r`kfk=qa z2*1m#k`O9MiRt5iTCyN@DYqoMtKl6ceoL6Qdzv_Y;sq{R-8snWaXe!gIvpR7CJ&1_tzvqWZowzTT;@$*y+5qLgKtBbL=$wqPdm@FxALe;c1(NZz^fsf zrEldPeECr)^?A!FDOHJAyj)_Xg#(alN4t!#yXmKyNlMp*LKW)exK_(@KTa1>V3U^F za+#-8!TH-QE0g;->>bD3J~z7=?%X|v%*#5Gx|Wt?CZ<<_IIGX#8o9TBY0H97eg)Py zE!MrDUUJ~)$FCAWsEJ#8N8ae?nlX$x<2K+`iy*u@SV<;bvuu%ts~+?Rf+)Ql_bmJM z*E#a9s2b^N>%_=T;de7o)T-D^bAw9(B;)SOo4BlUB%N6-!W~AgbMEZoc9Eu@GZXxO)uLO7L}U%N}d!TRS2wK6`+JU>$}&U_$8PdHRyt|1CVtwZ@#E)DL1W>Yp>5oci{CEzn{lb|q&EZc))>>dhg$S3XS}>y~+MHh#UySn`YRZ|_d6*vx#EIdEC$ zNP0%|O~N&-9=cY*^etb;vD-hD6)J+$-chq>$dM<)e2S$YGSahj8AH; zWfB^yp^LonL2I?)j0w_2bpPm7lXj~--kmXY=UBOoU|z1+u5j*xGH5m!?045+;r9&= z4MvT;rn&KAuG4S{u?@daYw?efY~`p<`c|z>soi4Yb|kibZv5gUB*P@JC+-QM?fNy^ z#Z|N$tuaB(t{~#%=<`67sS6D9O;Lk+u1#S|3L%ZL)N#%1ciz7FhvbM-OVD!{;{6kx z1zhK5)lG(v^mPmgw>> zjr6L>{^LD}v50^whwe)qf~eEw(KMZ@_!$+U?To&@J_xAaQ=w`c=^!muQ!AUe}PCz>a&-jC&Sqm2@Ua&H&5#r3q#6GSh3y z$_VYm+wbBFZspJnFJyFlt(Xk0OUvM>1^VrpT?aVb6{>1zee(v=#j|&5X zLHfZL_UHX9UtUD?_)~x9UxI-@+rMlArhIgFJL2!u%l6ZGy}+YA=cxpu68xx}+z~}T zdeMN)juzXLm>LdCsvSiXIq6_OUdS6YYaL`6`}V$g(lM7O_+jwhX!M@5W6VN^Hf_<8 z_W$w2_Pv1c)LX1d?XL%65mS%k3x!Uzh1 m8X%z1#4eh}{|F)?1Fv08`u_rfN`Det065vZ+SS@%)BgtZc-g}M diff --git a/res/img/flags/MY.png b/res/img/flags/MY.png deleted file mode 100644 index 17f18ac51924e8a76856b89a194b741bdbcb9245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3081 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 diff --git a/res/img/flags/MZ.png b/res/img/flags/MZ.png deleted file mode 100644 index 66be6563c63c40bc14a90eae8ec739981d47fe3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3367 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 diff --git a/res/img/flags/NA.png b/res/img/flags/NA.png deleted file mode 100644 index 7ecfd317c71654c146f2a3e1fcc702f96bc6a96e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3679 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 diff --git a/res/img/flags/NE.png b/res/img/flags/NE.png deleted file mode 100644 index d584fa8429e64def9e3d6517b4b215ce237da7ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 zcmZ{kdpr|*AIE=e%VlH=bBJcOIFx2MF?noku9-MEb8I!2Nan#>%cXXaa$Jf-G6$VH zQH!I7BOQw6xFxqHI=QAYxl~R~sU_xpW+FR#zPpUlG)4{c2&O#pzl zmnSJe$#4EH#1>^A8@hK@31~FYmk2;jE_^Kvrrc2xo&ml9r0fBJpALXRdE&nX;1m{s zIR*fDApppP(nkM-%Ey*)9}kj}%8m574**H&!JD6=u> z?&J5n(CTR&2vipwrCZ?ohDf|kvsCY{r?u9j@;p(RG4)KM#bs&5DFLU!d1gtV*^b!t ziP==r^C3<)RT3{N=`D6lB@Ej6{wIynYpwF0&o8GuL~A==Pnh8}jsLSDW#LqAt&>?r zRPTw=dtpe-j?BHGSBkz{b#Qm{Bc<9kGIZUMdt2Y8kqzl$^&4=5umzXlhG6rc05?CY zwXP2iyrL4h;f-Kmh^wFq_;tb60l1D0wl_&wxJbyA6K zc{kM7Ks6Bf z8dk|vv#a@XJ&||x6RM8rv`LvszndgfJo9OlVfs;Dj}FUdm^H5+b~_Xh;QhP|Rn_ZS zrxlqfj%nAC9POZX242fyhCnUCf2em^_qlwSYY(0Ocz+|gh&tI5GaZ8YgPi5Jm$g;l z`X;UpO zHxZy2DZ;p0b~Q?Vb*i2knaeGZcDON8xj_?bET!EqfucHOsaO}*p~%BpRq!#2v+({q zA5ru7zd5{fOKR+#spG{!POy8V?sAE#ybG^!@YYsQlv$Tc7Sri!;R^Cs`|FMvuK8?m zD$0$BSetw=%rAxs+SWFb#~;;H$cH;J2tAdyf(jI}Johsw*k&z=NL}*1sN>2wzOnFN z;^onn*Ut~R9CS>vI0-I2vGIc7o_XyuOk0D0T`qnf*1BmL70|7Z3em4JTWzxHEGsz^ z2^SgkLBT=Uk8`>N%#5RE;I}yqH_PBjJ!5nJ*S3}Z1qvhjE;`lT9Cmm-_mdGV_5oIZ z16EbNvYjyQtiMsUy6NFh%6OHadt&M+R;||)+UEtA&vF}L<5u;=r zd|VFk|4l+4q(E>c&Nqh7(R36lw0S&}`{LW!(v#AFdqYP1553?eTBDz=lvxpW))VD~ z<)%^nnPiiG)kVJv-qQRHgyEHt4^ViZDt`SI#WhlW{>9=3kN@y zAQsfkJYk6b1et1VHNOy4(tCRT)MB7Zc8sH_R0kQ`TKMJct!&D<8}Wmesz(G%#nA^i zzADY(?8F?RR|8*e_V_V?68&V^Smf@Qx;Cs#R!+`*@}dzCo~LXhJ`mbF^)d)Y*#R^G)Hla{hAZMKCdu|ycggsv?_ z+YjVZk7&_HGGZoqW!j0%{Zub+)X-@(dwYwAI&S-03CjplXuqGAt9I#&R51Kt51oI8 zb9);j>*=@<)+R0fP9+-^szSbt7<1ogUGd(G={Mxq?SOb#an<1Eb*%#>JKrWi#B)c! z7;%`(9`(kH&m6riD4F>f-K3UGy(yl~py@TG@30@CbF8W9Phr_ur73l+M6AE4D|3pU zoER9C{)D-`w^1zglunFcld0^;F!nKg1nZa*0Ee|Xun%j$59bhwv&Gxn q;O($hSQ|VRo76h({6B)Y_{f;3#+MB{cU< zg%CM%eCvx!m?Kv+efRtR_xzyjoWuriq~)b(HogAUMhN;Hd*H@d*_v^G;*=EAP?T^=U;qG5 zzm=)66LDs3=6a;l(#if!#&zwGby?X|Ds=obwIu4j5d|xlTO#(G@^Qf@iZa1hMbCwC zt|>}!QipCxiz$2U6wtC|7i*L-BhpER!+Ydrz?3c#UX7 zjq`P1rZpH$Lq^2#dhsI3ykhjKruZNK!53lo2!5`VPA}@%G<58cAoOpcU%4L`TffOV zIT^XE#_y+iv)?S0hl4&6_d<@VEgchnv~PPNI?iiu1npq)I)BB{;YBYa|KqQI;?@}E zO5DVIbCF27`F*g9Qz!|}*(mKco4*~Q@lTQjXU)}kAhXu4V#iz#ze<)hRgDj#+PcnV|IO#+U6y&u7HwcU}MGXiNN{U zTi}ObFmKU`>?VYtA(;ddZLSmh_3L{pnf`YweB5kHu71=}l~^C(@J(`moESwg&#kCF zGG2EGBT4X~Bt0Lt+AyFtr*b=ZK5Q#0RuL^?L4yh(v2U;GO1dqVGPTFs=69Wa^>E=0 z5p^F@UN{fBc9BH=w!9m!#TCzsU?;ht5Rl)!JLkYs(qaa#%})`qt(B(?{cQz5`&Md9 zFd}~AQ~GpJo-t%gJJ9GXB43W|f_Qnp`AJ#z9^`}Qc(cu)OEM_RVhv!tjXY!7SDh_5i1bYT*%_i+-goVs{^N~C^MPYi?`6*E|=Zzarx@@dFR2x z)gom0$Y8Fr?CV45_u2s6x%S(puv6E~Nct5+(hNi@X%0{Bag_Ih<3tYK*I?LZL+ zM_6fTn2uwlbE}~gJ1;+WI2EQ*z7rhHFAe8Ls+dBQ~srRs`mcT0CeF^U7 zm7Q^{t_nJ+o(FeXv(PEaHp$AAtr>y^Q?IxRcX5 z2@ge6_!u`H@ol@&Ok}@z9K^;l^!i+Lwu^p5;kON4Tx zY@)P{HT>Bu97qHk+)C&(j=lI+qh3sMdu2Dhw+S0aSkNeJ#o$D&E5mg)hc%?HKJRF& z$q0}RqU11>7|bOhU7Z?Px(~$Z_PGWROG;-u?`HZuaHIlPG4v#@x$GpAKv+)hR6~(L zf0vRan674bty&|)*EtYX+Aqyzz_B<+zu}vV%-?QTI6t+^Rm=ShEnm!iw)QZRELTaBlLVi^ zSDxI}LWWG#TICfQxsmH%$wBb-Whf$2C^TgCV3#iQyJcR8QK4Xy+HxVa5W9naZMSiy zvTS|xlufKIDsa&9W)^H8p~(SH^dH#Z&2>0AuikFRbz8czC18fX`#d^ply$e2_rh=t zs5$F|TtkK(puk~s_c$%v1KQn<{*l7!AlzfVpC_2S8vBCXFxtRRx)L=zwx&{Oj7zc= zKUaVFZq`0ss9?H=fy9ptaMS*b0*(z~Bz*Olb<%`1t}IjG;p^$C0&~pHKA1MyV(-jbgYP zJ(n)m$W6j*a;ljtrpWI~oI;4ieYyk&PEvKG+bdnWqjNq1yZYy2Z_A)sbwyx2;6N-! zSuw2#`i9owZkpSXZ|}AvTrDx>EZnYO3n9%8fyW>zlbitpm8qQ&^>SwVg3oDbB9*v~ z+pS76Z+DM)c_zu-Z8EQY*dy&fk>TF}QB6+bkPQxyc;hH&!cIBzI5RBH&l~5D@{RIm z15ih*>8K#JRMd5y)HP6AYA8*lGExnNL=wA}4E|#Xi|`8yi2eTt-ZFPG+W=UZ*_l?O Hy^{X{CJl@_ diff --git a/res/img/flags/NG.png b/res/img/flags/NG.png deleted file mode 100644 index 73aee15b3f35f4d032a1998db4d334eb32219315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#Nj2T^vIyZoR!_=*8?P(e^OE z+%?2U@gq|)v%X@J!Yzqyp2_K|F4o!Byb(8VE{RN9%+XZAnQtH-prfR9=v@>mckr=T zyNdZ)ZJN*0@0Fr!@g7#@>&z3XkGK{SVA%LEnfdj75?gN(chIaBPGEDyT* zUqkKqrGKZ7-Fmjy7B2)ROPRy8K$tr#tLc$t``O zu+yu2>Alx)pZ|2(6M!HFmD)cRRypKMQ{B_Mg35>a&A^F^jP? zImDkoriOoi-u@;7^+!Yf2WBogTl32n+Ao1ZswJ)wB`Jv|saDBFsX&Us$iUEC*T7WQ y$RfnZ*viz<%EUn1z|hLTpyJR|TNDks`6-!cmAEx<&W~*bS?cNP=d#Wzp$Pz|O}T*p diff --git a/res/img/flags/NI.png b/res/img/flags/NI.png deleted file mode 100644 index fd044933e4896c68aff43327a8175533e1f716c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmZ{kc{Ce(7RP^4M0i?ii?x>6X+u=fSo2U+v?zU+B0(5c%Tpa{sRSXawN)Q6mcf+q zo-I;qm5|rgsFtRbCZ)0Dsi#WQQA^Ru%$aj$=8w7O-ut=B`TleNxcOe^U1g=!qyYf3 z?rzRLB3l15at;7{q7nH$0N0TK z{7wJ>TLFMdLRG)Ft!N<`=HcorqR4ig9%hOFOK=OgCL-Zqu^IFIgs6ZfxqG@m7bG-P zP)6#$85;mdl({?Od{emVytJzq{WMsgHdeW9L1=UJsaU$(91GKQ^`exdOL=~{y`#93 zm*NR;b}cUS65;0*|ZoFd%h_&l98TlT2`%v&}Cy2kB#6kC)z*~hT1 zhhO6@ryuqk_B`57-g{=Zl6*eMOVP#qKORgQKGO7RH3@rv%0^oso5x;Az~ms$*7$d~ zw0drAmf_B?lu=e;R zMxms`yQqnaZ%xfpqBWaw{A4inHraCXafPA{! zVfYrx(QBo!<@U8VR~_Y+eb%`(mkIiFxmO957Bg7++dZld_#4tW(~}We(9R(H6Gq~< zD)hLJ6LFOz+X_)if^Un6Onm$sO~J4HkTBbq${x+@*P5mU9>yfcwdgVqDRJn>^y;!U zYR$7i6%XV4Um{l2j1N#>?J=p(o40qZS2cGX(1}IpF^wl?VbMor78{_OoC`;2Pn-Dx z387Q1e)qD^pif8bPqUWA!*3n=QuF@8=D9yZY*nq z@6*0I#Noh7EUteR3TF^z9=>8Dn59*9k!2<&cYgJ`mqMOkfV&k%DppG@r`B**?^J12 zsEk2gbmlpf)kK_WYkGU!1R+ctTvM2?KW3F>(m2yDSQ`j?E0 z!2w=2-+JypMf7s9YK>xBjaOp+b}+efeXH9N`u90rsn4F0Myt&wUJK>j(%jPTVr+D7 z?Q;krCIu)Wa%Qeun13la>MkXlz${9X3);!99UkH_nY)O$L=*a#1o?`P2W3^Spu>fe zM*;houBPKaWN&GVV_G!7a9)-_^oGX^gMKbo7G`O;uf&Z}0xjv{2tr|VoyEsng}8En z%B_6e=^g)@HD#!~o%x$d@egWZt3ldzrVLZ2GzguPsY`wLs5%5`<Z#j~Q|ii<9C9-0kE3F<@0Ccbn6RNb z$>rd>pRyY$VS76g9Ua9N$k;u)+jyL(pU@~gx2wUH*cM{0T-%|Ou>%(G$%2!IZWt#%k;wJ0VjmX7KxSK# z;Ze~Os)HdV%m_2T{ITe;OwGosfB!4hdmWgDfF;rbZH_!`Zi(@=L}5=`V6Bj*NDC|ynKB}<`yWAU bd_;8QjsGuz)do{U0^sg)-ns32Le@V3egf=% diff --git a/res/img/flags/NL.png b/res/img/flags/NL.png deleted file mode 100644 index 0897943760ff90d0323d3207b9bde50e08f26c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#RCKT^vIyZoR#|(3?3?;`qns zciPtZTuCs9jgB>tGv;Le&*Uh^IytoYpn;{5f>b+CmU$9S}IUez?v5$fEDD#px~VUwtLo5+&H|f1SL2 zZ^7-}MNz)hy+6ZOmRP;rW*L7$PGIvwgW~}+k~Pj4iae9xD(?BZ(QXC%QH85=*O~Xe z+*q18e|F}qu&vu0OB1^%Z@qjq`E6lh?2WRL{{`hMY~THhA+G1AdoT5V zvy$_0J858e{95bD&~Iw2Z*y$|L?^lz=fp?YYH%$-vVVF_Jey6sW!oVc=fu8^|M*Ya zEzxnm^|!QkEuoy_%*TmNmj@bBuC;yT;wSMD7Zu6~x$7Mv7z&O&w7 zV@s&lcv_+MJ}h2bf9lIlXlN~X!rk5#Fze>SWBkCdQ!R0gC`m~yNwrEYN(E93Mh1rF zx(24YMiwDP##W|=Rwf4828LD!1{H^%+M;O4%}>cptHiB=bAD_iD0)0y{an^LB{Ts5 Dxuyo8 diff --git a/res/img/flags/NO.png b/res/img/flags/NO.png deleted file mode 100644 index aafb0f17761442e115d157c6b3ee29b7c6758645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 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 ZOQ)d!-$0&kjkqxYTIzagl`7E4{{T|%s-6G< diff --git a/res/img/flags/NR.png b/res/img/flags/NR.png deleted file mode 100644 index 58c2afb228aeac0c04d19788d9ffc67a6b0dd8e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1620 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 diff --git a/res/img/flags/PA.png b/res/img/flags/PA.png deleted file mode 100644 index 3515d95d371fc49f62d94d11c8a0f4f41b8941e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2285 zcmZ{lX*kr48pi*InPH?c^x9{PHOVrg?AzEGJCp1?iHa;mk{Megl!%5gmN+;S$u<=! zyX<7oGG$4!Mc%AA)48tm;r(##>$;!cvt0M*C)vizgbOAF0|0=_%+%11NtHk5hA`{& zXnj5tY?t&b^#I`I1I|M)Fmp!xnA%waz%6M2ASM97K66D}27m|*0IYZdfCdEs_(SsE z*lIBk5N~r6LnfKpGiZoqf+NJ#DU3e}LIQ!_6#>pr64a{O4qZ2{9YY&9s@J z9wBmSjT#+77)5sKex2=G^6HIm+f1@Vh&i5GK**udS(py*$Z|^;!h2{Od|{L*PSa>i zu@b=v6oOCGvlu%In!`pocoQ~xQWudQAUs_kwa_p6*0ql$gjGxWczj#GEZp|L;lFW2 zJL=oG*%UpnM+@5kC+Zj3$ee=x4=rcOROPPjKgt;XM5| znPM0^e<9aWY@C>ONd3swuZgi456hf3YhKZf2xa^HK#8@vGWJ1{Sf9;&727}Ggx!u=a9v7oR|tT$fe zUvupnK1~yS_)A(&eQPpx9#OfyR9T9ea%P0x&j3I7Ruv>F>MRdVeWm+fOzvBX((zVI z@0Bw)s0cZn>`K!8X{HmUCajd-KbCR~%lRE8+I8TdgE44%}jDpurtkqyOqt`XEYNtE*oM+d-qCd&K!-l+rEpf zaFX_ip$>9f*tSBy>KYI$9d3pbY|KtIf!(x+Rr!?-+L5aZ};hRi`$a2V%hE7>wHTCQ9ptW>=-TC zY39-!i7S+;7b3@T5^#65{8;ujnI<2wK>Pv%Wl%AY7kTI8v$FC^{D?chnK=6uz5_K0 z&}>T7QatG;cU|Mhs=;@!az!WV0`_<1Z7@$(d!E8smOG2lQ)KO4NH|~lj*~e|C4IdX zJgjbwqEwU))Pl%Qc#DWw+mnwT;{roL&%{EgbAbhZ{ei!u(jAhj1rid^FGV*{*HO9h z6fN`f8*_1&T3?q9HNVc^&y%}{>reOFa^e;?(tOEV>v%oR6yx91p1{ig3NIL-NLF|b z%E61yvaUD(N{VpuY07M!SQUBb0eVe_k|EU}xW`GM2+2y~vLeWE$g=ns>gzO>DojCRYr)4@L8#m7Y$iy7s{{I$GRn-*3dTzTAciYD3xRfoRb!%eT;bv|?@!OG*(yDshE)0%GwkloEKa(bNNILIdDgUbLt}mL-53P) zXuZ-RQPx9y_NOFq06%9|XdN7{SO{h9Y(zd2#^Wp6$4dL?n7cVvE18Y7G^$}zV2(I4 zaGaXG;(`Zv^mA0FNOVQQ)JpvVztI_vj0d7NeV21M63Aukri?ch^8$suhUf@- znk0JgT2O@W{ZG0h@`Pk1=UIGKM0ibVEc6K%^D532} z>yc_&G&|truGy~B7O{VDpnCK7!FSIZrXBpLL=w`Q6eu;V}aAGmxh!b^jx4JgZ_@ouIR@Csjmdj>RH@7iJn*6{X-P zMQOW_oRIR!GQ$bjQ-Ca=lUzDEpviOdm--I{o zKO3uw+G;(X@QScb*Q=9`ZvC>V^kRB!zYc-Nkl;G+F<9epP-QjIkli%8)~CRbeO9$} zqbtz{@%p&?;WwQ1bvsFe9dhs(?Gu|)l>tEa%2wiMFaOkjOweo{YfK@iugT~qcae2)1BXhLXzF(f0)Me^d^#6R?l~I8+wuj6!Z&a*LUC8^WvJE-o9OmChsp? zSz7-vsIzG64QJ zTabk=0*?xD%^pVe9?6wy@_}M#f6uAwsAzz6`P)n4gIicPoOy%~n=*=TbFyI=chj!G zpRfg`>Pd~_bP+8V80C%n?4EoN!yy?zh2;6G>~YvCbE~WZP;r|GHX%uWR9ES&R@D3j zjxm8W;7~{e&W)4-hphXI_=v}07#F=OcKeQZ7Ho@LKcBf{S3aJ$ZkKy&#`GWWRKIAG z=NLSbP%DTj2_0d+eyMOH$8cY-a6b*7P(LOBB@9+o9-}O;q()FWr=g71IFC7t!D?VI iku8hb{|HH=O_J^!8;>H@%A+_%r7#O8JT^vIyZoR#2=*8?P(e^NZ zQC_lxql*svYKK|5xh)%d%|Ec+JK$Wwod19~N9>^5TeGIAKAK8RjY}dgZoKHm$+c;X z{62qc`~N(9zIp(y00Ia7L*>kxOQ!^#tF`~KztixT#Np|7tLP?d5&fA20uW)5+`br>sr- zd#~`T_wNqcp~-hWZ|NVy`x6&s%-R)KXZPY=R!L(*8b?|i#l(BJ`YW5>yFoqSe~*Ff zr=4Sy%;wub5!Djch?11Vl2ohYqEsNoU}Ruuu4`bbYh)2(WNc+>Xk}ucZD43+U{G=B fsV$0z-29Zxv`X9>IOoSUg6#Bk^>bP0l+XkKgh0L{ diff --git a/res/img/flags/PF.png b/res/img/flags/PF.png deleted file mode 100644 index 2f33f2574f00952986b822b406ff60549712cd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2379 zcmZ{mc{J1u8^?c!84QD~MOA7^a}gUUbw0DzgBnb`8E z`*%t}cy(;B_6ZLH-o{qO08o)Cvg;1!&2XZbtrY-7o&o@RJOKRUt?2Ur5Q+eR1vdad zX90jzKyCy60`CC1VPR^*BQLfuvS>UA2behr^XT?ZuKHp=^BTbrb1SUi6j)a3tn#mR zw^jf^2yJd+Y)2jWb2P%vZdk5)Z6)dx5F7gv{53O( zCAcRSML8JX$vGFiax2{ESszJT=C@1#0aB#6Tuu}c*WxD8Iu^4(MveG8%ndtI%bQLs zE6)#UXb+6FQ@2s5YxP0v^Hp^pIbyiKqO0R|vnQ_!3g`#O{Mg*t=j4D(aW#9Qc zeQ-{VIx(_k2!(7IL&y7BN|cg*fjuFuY0l864B6=%`PeOObz!KO}i4G`6Z1EsGN zpBs+`@=xd$1TzzzF^Fw$OzsfoXHywXc;>a6q{j{3u@Rb`;Nf z%?urP&-|nGH8fms0w`q^@yS0-tdL`>_Z1vmqq5CamRZ97;jF9cTWZXnus56mF_Xf6 z>0#4m1|uwQ9#p4TXMp$;!zcRmr>^xEAi{b&GZUeKvJmSM>8 z>->ukCBA+?--dC3mx1B@9}oqd-&fOWuEUgymddeGd<57JKTv7CRM^NyvGS=`v|Fmj zlicnLtGx&4Vyx3cVV0c-J1Dy3yYT`zIO(awPX0~X_UzVU^h}FUQLrg%H85@?E~thJ z+B_E{81&L!i2iE6P;jTG3#gHe?@Dv<2gJKR*8++Cm&hA5Ez$HgD3Cn!h;`Y=`9|w< zno!mo4Ho}BRMBm?HOe83#NVsXxJZIK>)5NuYtcqMTx~k8Mh%x;1hFHM^9;z6?Ap<$ zwP#KUE14y|lLD0)JKuIaCDw)}(eW`VpJx0Q1im)tQx#u+d<3SlK=-gk@O(_r!*EbQ z(m1F5cS2?slO-!yTEeh=S|53Qra1hATmV3&Y9WPlCCQP7DRk2$t6|w7xc(YPn2RVp zgPIPh=0EHy6E-P{W0rViu8AEZOk7v8it8ewn4Jhx&E-doY)HUlC`GhGR%nk(HR z`nl=8SjT4ljF`_eSIz}@_ z;wU>RXyBevZ-n*SQkxpQKCMwbTi6v-j6D7BvI*fRy^)Wv<~kZS z`~e;DGdX;bUm-Z5E_vK02xTPQ0X1V7HG*3C3zgv#rP0R6g|y2Inq(39!IdgH2m5Lq z^6pNfVavZv#&>#ZH4KsAfwxaK*_}+JLsjuHlK4xe%~q9Iak9~8m=WBGvP^Q#&*hHe zx71*J7nW%DXX9P^%_v^W^d~vG>FcuvN~P(2l0zLNVPB7h@%fjFu1EgMum5px&hrh| zYPS)ZSB-NX@3Bw{!8(O_xQBS6i9wz`09pv-ISqu4hL)b4)>*U;60MC;Lm<%z1hsWm f|9=F26px!;5&vHxoOdmTCjiW`)+Xf`x7dFJiOoV> diff --git a/res/img/flags/PG.png b/res/img/flags/PG.png deleted file mode 100644 index c796f587c634102586fa2f81fede56571b727b51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4393 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 QKL`M4EFB3I7UYEg15A>^?*IS* diff --git a/res/img/flags/PK.png b/res/img/flags/PK.png deleted file mode 100644 index 87f4e2f49246e9d96d5bd056ff6c8960cbd9247d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3165 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 UYv7z8+X%AL)78&qol`;+0HOTMdjJ3c diff --git a/res/img/flags/PM.png b/res/img/flags/PM.png deleted file mode 100644 index b74c396d924b2a6ed92ccda1af761bfc26cfccd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8583 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 D84nhx diff --git a/res/img/flags/PN.png b/res/img/flags/PN.png deleted file mode 100644 index e34c62d598f45963cb6e8fa94d45148be7fa9510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5945 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

    Wey9xTIcg$?DSP(GcBClqS8Zw0?g&Gs?c!&_%3 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 G!~O$9Te$fE diff --git a/res/img/flags/PS.png b/res/img/flags/PS.png deleted file mode 100644 index 7a0cceec00db13aa85c8e7acb9ab795f3478aedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2147 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 diff --git a/res/img/flags/PT.png b/res/img/flags/PT.png deleted file mode 100644 index 49e290827c89fb6aaab4b06b34b894009fcd7bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2617 zcmZ{mc{J4PAIG2X7-Jd3T)O7k#}z3{BfBhPH`yk}l2k$xCEJv-j-|$pP*T|mH>rHo(En8Gu+d0H|pI?C?v}_W+P_ z04(|eU~(4#OnA}Lqo(`|gukP`4WInQwPqyoArkIzEQ(LR|HgW#)gb>M6islp6`B#0 z$LOldkrLMU&(sMvmZX^Rm5I=pJ);UeAJ_Vq=M$ANzwRAsfZ`?bdk!G1LUJM>SNjTP zVAZ8{phc9Rjf!a3USb;_mX{F>5#TMPTj}Onw#vWegd=aW)kJN^&O2ZWPc$8l+VMBU zuDo*}rk&-~Zcz05iWd5lHrV;baRb`#qfLrk?!Wr*FU*yBbVShOzt0;WXO^sz&N->& z_66SjrlQ1ZxtvoNdWiC8_ry>~2m=itFK1%2bJS+wwb_@h8Cq5iVQbT# z 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 diff --git a/res/img/flags/QA.png b/res/img/flags/QA.png deleted file mode 100644 index bb091cc88c2ee7548fc207a5bdb851a5d0149343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmZ{kc~sH~5XXO+fVbHpl|`~WBHpj}WCT@Bas zVgLXs+F>!SRQ^2w)Nxn$?cAmHhUik3mZthuT;Ksj8QV1dsLufVnp4>z7}4p)I;zbY zVGk4d9?VAPIxNH4^w?DocR97FG@MVmE5=EW2$sF`UPddayXQuNt}XFLnbF%Z(W+%{ zmp$2`2r2F=L_)XXod4~jR(vh(kI`_m>-NWLkhfP6RYRe5UdaRgv`yQ8nndA3gSy5^ z`merAputov*vtdIikp7obA#Y^gKJiC!mjwZj1r=C-`c7c^@?}vOaLmCpzjqg6KIqX zMCM6ma5f)5ER4Kpe62K|2!c|qN=i4l2cdWv@u*pS)?xOc>D6ZzDuTPHoAD$$kNSp7 zv!4^Qsv(!@hyR>D9h3RNsD)4#c&7U7epPeQ?!y>dpu^xdQZ6*#6omjAjE|l;BhfU? zYHt06L2k;^OR2RbKyFE1&5iVsXl>SoTx`h|6Cc^Au1}0ks5PHUNtH{feCh3O7@M*v zpP||jn-tS!c^=gVuBdoYrM0xfmYm=XUY*+bRk8ca$sSO*)i8}2P?9wmJFToKyz$mp$x8NJKn#s*($daS>^z&D ztH`%H-y%XU-?Xd?;SeR^z5B;~Ww_6KzeM=7MF+V%wt7wohM88uwL$%2hcbulfba;w6naR1s1FhTc$Z6fW&HKlUH5Ylo}qjF$gW}YfA zMXwlL+R-mjQ6!l~S-sga9N&vqt=41s<&eU7$(UD+tz+pqnlvYlU>eyrZ&3`0_fITW zLk_AiByQ}C&>E6S&eCo-j%9V?CSod3I1xhOGUi9pK*6m^{&vF-Y|i}{P|H5ifa!;X zkTB8`R+4 z(!V!^@2hcg9LTYG)iBgAt9IZ@2X^f-$Yjmd)h~SsR8?9Kb|1fE=7!FR(k~ga^%@D0 zxAc&+OeOZA=EyiZWAyB>`K{>#sX}7ucJO50an|UgLY_q1s6cf`?`M39gg@wsmkkpw zUJXc_5Wyy)Y?bGNn$_s?r^&hZhvJd#?e;?}h)%-vLba{q#s+NTv)G>OekvC_r>vJac4z)2zVs=n>Fl~6o9W&7yFj%vyybQOu-I#}l|lZBF@&x{P6-AJb2>g)A6gd* zoW-X+6~#Kdm9##3S4B0m!iSOiwZ-xHGa#p#zGB%nfhHD{9w&_$a5~o`IWOK9BU!95 zG^^32+#L<-mKjDdS4wcRAD6+obq*1p@|sC_W->?bNZUg7&Lqi>WUyTJ zxMSMG9{aV{DDPa2P-Vv}?22-Xo~xo$osa7{;b6%>Z+c~OUn{m7Z%!5;`OgQ!Is283 zZ@3mVe%-V6$bRXk+(*HAPyz!eK`7FhASnQ2xDiqxj?gzYcQrOaA&gL_@ZaD@C^($T g5gq!6;B-XbDRSKZ3*?J^6Qu&c4(EV@~ diff --git a/res/img/flags/RE.png b/res/img/flags/RE.png deleted file mode 100644 index 6d50a0f544ad14e2da315e53fdeb187d3c8781c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#LMOT^vIyZoR#|-pj>NqU~e( zkyycIoumjJqZ@lTPbZm3x(Xc8kUp~I;_VH3aR)VEXouPVTDHYHQZ_R2 zHFc$JGZW|i@dVlc1P;oV%B8(Dmrm(eCjaaHlR3rbUV6{}IbZ(5>(J0zexKQzOB+QN zPw(B%z4CIrr2ab3?XSbltILCy@87d!gX&QYr}X*1O@Fj@t7om&&I~;-1 z9RK$I^719$C;$H39H=O_J^!8;>H@%A+_%r7#O8IT^vIyZoR#|FptTQ;n>IZ z(`UEF%$Ttxt%|egA+N!VPRY2&#g^^{A|_ z(mEFO^+M&J30rEbbzki*v9{>%fB*dF`mg)9ovQu1B;X!Tv99dy_DI8tX65HEpYyXS z<=<>D(J7KI)Vp%&zN)i(okQ1N?>_qV=c1j9FS0bvRGcA6F|kkjZ{YQP(u@#q=>BB! z%QtmAeavSKP(ZcBHKHUXu_Vv>Ka*u7#Ulc8d{kcXd4(>85mR? gdTNWJAvZrIGp!Q02G04hjUX#MUHx3vIVCg!0GwUKT>t<8 diff --git a/res/img/flags/RS.png b/res/img/flags/RS.png deleted file mode 100644 index ebb0f28a7bdf6b76c944ac6808319a7e4cb98945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3349 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 diff --git a/res/img/flags/RU.png b/res/img/flags/RU.png deleted file mode 100644 index 64532ffa58af755f27404820c7be89cbc260bbbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 662 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#LeUT^vIyZoR!>?|s-o=GaH| zuktAcFRtk>oW1(}0Z*1(cJ=LkUEQTIO^&dAF8r&^jir z&^i5}-1Xme*VJ2ne=NA8Dg?9$2p+h6xz1cU?|EgM$U1SUSth=hO?vCT8t4CRQt_Om zQfPbZjqx#wG7$|iM_GG-s(?9DUiSG*7~ls+}ZZI`E&2?oR{|P?kktoZ$Irh#wT6p zTNcwV+`#O4{b^yZan8c)73H?R0(z?tNo_x}D73)4r0>1K`G6Ve8fT2JrO!~S3O@g} zi1~xg%Y`=E^m9DtT7G-{|McqQ*N3M4K6-Y?>#A7_Z^BxywZ_irm+zmoE}hfCJ!*9a z(B{0l&4-sIhloarf7>Zo*yek1QAyO)+y7@hnr0!pamgB+wDT2ke?e`#{>ws+XVaN) znUH{DFn-2fH_iP>b3(-fponUTYeY#(Vo9o1a#1RfVlXl=G}kpS)itsRF*3F?HMBA@ p&^9o%GBBt(^wbtbLvDUbW?Cg~4V?318-W@aJYD@<);T3K0RVE30(<}f diff --git a/res/img/flags/RW.png b/res/img/flags/RW.png deleted file mode 100644 index 64b3cfff04b69bfd82c843aae87f239df697b74a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 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 diff --git a/res/img/flags/SD.png b/res/img/flags/SD.png deleted file mode 100644 index d8711a83d695b5f01815e1733b510fb86e701f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2103 zcmZ{ldpy(a8^^yJHpk7e(d1Ah$L17G{KiHi%VB9KHs_o|YayO(2pvR`^Qn>QFxU-y644QKpGDe?W{002mxvd6g! zcjOBIwop>|LDzAnq^#(31h+mq4P=0>Bj%0L+m9 z0G$T_h{&Q=mlJ{k#Mkj8PC!9yVqee%5R0_;xGW&)f4LND(<>;Tlv7T&&;wpSbTmp>kGgT7D9LFx^(10Jeg&pLh|CG6Hh9GZheIzbOt%^C0c;TX+7AeI3+I zew67bp9P*(Jj45)t+14g^oxA((cVm2E5 zUQk7R7nX&_cDNUiw>43ri9_Oy@ zq&_%b$S)DJ{r$U=0yjB^yXFeN_#Z*kBGi52c@kzv`)fgxlGv=uq?*Zx!cc9#>I!NZD~J%x?aZ08-C_T!$r`#xEY_i92EExI z!cHcHaHv7p>(AgtZsm5wE%LM*TqWX2%Ka7C%!p}TA8~lZUCgIgA|c%$^&y0-3?8xn z#@C>aszdxh)ObMDbfvcQK5ey<_U`C*O;0I_f3Zd@)!HIRL&A)h(7cUI5yD2w}WqZG$I*CzKH%}~ni0nFxn2%=U#Ht*qa6GY>o})A}F6+n6 z?{7+OKz;r2&M#!kdb%h=SL=kNW0qZpQ$A!hrl(Gv6T{gaB1*Ny=zA}U8{NW&VHG~~ zN}+V5eYR}I9rRZ!KIg+RD<)&=KHw_1p{)m1WRKSKSJV&=PWd0NO1!*hxbtbbkL{%= zRR6y4OcmF#gfDF2WCmk(Penfm|5&XX^)Ck^s{cr+SnYa+(1ywKxVv&dwEH#GF-`HKmdmDBD>I&75JqSu!Y^H}H=?x4Dc ztE$4Xh)JuZt!b6@;*9y9nkvz)26Jrz2E2I$Z7%38dudv!QXwtqDgV=Ud*ZWNnH@C> zjuUUsPA!&TgB=v5=Igz)zj7i6FZ`-jm9)RDa!*2w$LV`OP-1Znk{vKu|4ln@s=dHeXw)~BVa zST#Vt$JU_Zw{gbAyvmx9##ks%wFnaXtyQg zqSwU7BrF_eshC#xkfd*{oe~KgxBd>zyz&>g1b-{c3v-1{ zV}AM;pwBJnOG*kHd~f>O8*(#)lU3S8#|N^rFwzd85}4I}vjVKO4Ijkp(>y;5OJ2Cv z{tG}AMvsB)LVMF{%aD^;eHF#djOWnDZ`nz$xf_-VUYy~GSmL(;6M7rb5fWVBp8(3_ zvz7sjhuwm58RO&hS8iM*o#yH2zdsKx6DYQ%{dUu2$Y<|xebJO2JULu}_spidN()ie zXX9mnIm-+}vP-;l$^nBwlOBk4U4t0rSfc{wgQiq4dz!yG;H)~YH~Ml|X9&dvs($QW&Eh&Dm#q72a}R7}T|myU;s|p;&HV$q{M#! DldQAM diff --git a/res/img/flags/SE.png b/res/img/flags/SE.png deleted file mode 100644 index 81880931f392086201cb9faf68efda479bcf8df5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1278 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7?|IBx;TbZ+ULJC~qNF5JIB}b_r%codrzLui4!LHkrW7n*_P|L% zGgLWGbh2wsc3AJlB_GnnryRV(=a;nn^SbWuerhM5aB^18jIrH+w$-?}{qW!Y#rG|r z-(z$Q6hWX&jx|NAD+7yetKv6gNwzvJNLUO{IQ&qxXA2$^{LknCH{Q8`02!9%Zf+G#ATK3 z4?Q~Wt=zwd@ma(5&ktNTY>qJ$j{d&>BFn)G0r~lR?`CgFKJ_f%po}wXF^}jO!w`ex z2#yeUx@OMhLvM`5E%?f={YhHic=E$CT_(v-A`BdjFD6FaF7JFJc}wHyXFsMHiobPc z)TY@VXM7|2+xhUd(&`mgW(%=S=5vYa2ng7F(}r>CNrU?(ayxRL@8FxGbY9|vxuS0N zvTe);Y0oR-HvjTrxFqAXgaJKHwUUrUoM)}zlxs7K^O!!X}vqjDOd@jtMAzCGU-`$&{_tN&= zo|16svN!L|UynM37VerAojY&0&A`c&k5V3HvuT zKeH;hlA_7rI?eO)|0z4!@7y~u@5b8uyURZs-}k?|+(7R3<3hQHeIINYtdGgeP55@f zai!Twy?|xHKK7Ab2X>Sj{(Et5kA^5}dvriApGTunEPSA4LfAW)U;H8T@RnM2Pt6S`yXc=f=dD53#vtnuAq%Sd> z_PzVKtvfYr@8Xm=nLwp03tz5JyZ4{Bt9-hC`Mkzy()S#;GHg51uDAT_W%YZvF3i)I zA+vM2`<0m!nx^mQi}E~w{3P?%6sL~ucAXl6t4wy9TqqTtkz@5~0sn!%8E5=-^SSnH z-uN>w+s{T>Gb=jqTN0j#N zThY4Z(##d2djc;7%%A7}?T2jW?O%(4ff%#Dg_&pJ^nyF?SQ0KU6<^pd{kG_ue1cZj zA`Lk5YW~5#pn1~OUw6&xfMtPdiEBhjN@7W>RdP`(kYX@0Ff`XSFx54(2r)9YGBva^ qG0-+Jv@$TLIP}yOMMG|WN@iLmZVjCCV;g}Q7(8A5T-G@yGywqTS~f@k diff --git a/res/img/flags/SG.png b/res/img/flags/SG.png deleted file mode 100644 index 6f00e57923a5c9f0c58fa482d3ba6a27eaf514b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2210 zcmaKtcR1T?8^?cwsMVOY+tfKnQ6p-PYGQlMQj}7Ai@noILQ81XJoYMTw5nU||9P(P99Ac>n-Mv=U|o0K#AZu;v5+YB>PF z7g*4KQ-k&ab}`b|p^>ITZ9JL==0F465E`9+<+iWZ812FoYG|U%^o>!NPhMQ;*8MG7 zCCyL=aVzpOK7#@vD}3(wQoE;*n<#PjLUQ_ zzHA0+qBleKH=>HacB*@hu_l#@{~PnX^Ih!XlK&`uVulszE&5A+=tWn*H3p?ST0MX5 zLp9JMEQ>yTZuQLp9j)UH>k=_nDMs?<{9k4RfT8OG8k6=|L- zcTS^#e29WVK+9Hlbq%@6ccEYX1Nz=oh6^N&c5P}dRF7Y>@j5i4;7h?V!ZFBodqfrL z5*PkymZ__t_zsg>T#&u7-QIZ)eW~kGAwV)mEJ6p@(q{~x@0n`Vd%2U5d5JTJ@R&J} zI2BBf8%XYD!)Vz2X;%o2C&{E0hIFsBtmQY}_OiU^w?1nIbvhymO=iVq%`URWs{l%no6$ z(nSqnK2bZEUr)Fp7W1_VVUGHiESr5XKB>%5*YZN_4{8?kj3#4N>j%8FlWEaf!8Qwj zZ>jRZK9f@9lPI;=m1;u@+q*oeW>C5i+0P!udQ?rl+aPNj$|F}QPdu!>cHqX5-K*3R z68m#0g0E9mgs5P$Ge$q~phc|029DHPtKU0?p0}0BO~9!51?6&Mk>6E*MAwy{$wkf^ z!}i6ih|$L=N9P}fe0zzG*~c95Fpy9{YM`6ZS6RhMjoWNfz8j= zwG*cpS8D0&uUMiFUbY;va_KJ1RSJ99CZstg6x2xAch%;@IJ%tGj+Y_u!p-dts>Gq^ zwo{fRqCZzJXT)`TQ(JxXAson;10b_FISDbvXd$nP{in{%@Y5NZ>irC`{@T zQ1N(NV#gc$W$LY>BUW?IZhaR5ukFfp92aaXFIjJv-8k5jk0*->sqkX$;;qkvm<0Z?GoSwFR(Gau0V(nlbn^KAdMG zQY9_JRBt(=oYy)!OCluh21+pZA%;~$&>XDE7q!)h8pt|+P;kJAtS??W?1gRrq5nIh zq-A?y2AAYE(w?HZB-79}xP_i70A`!@Up|T0ipWW@H^t((P&(k$`HkcE$mcCd;>hQSsNwfRzJC9 z4{Wx&t`2myDUx!8Gq~OWjf$637|`Q&szD|oN^i4oEMA-N%qE*815Dlt0E;Q>cPpWy<>2 zN^#saWP@9UW$n9P!EummYLNSHLm_aK67}g5Fl;zcq_~>t&4;NN_exAt(NYl?Oi$ZXU#dx-3cZ6>>w zuUK})V(f)kXZK@$LMo4HlkWvsk9=*+@9&1vY?Rq>2c!c)Cy`6KB52bJlONa#&K>nQ zlz{R-V)uHgZ)I}c*oeJoykZKH)p;Y+{o0sML&yYYIcK&**S(|3?3Hw^{ z@R>2bNC*qZiSww!ajoK}^rnZ2WadnwtUKMD+Z7ZYyO1^9!t6~8{$Q>U z(sk-_$a)sH>?}InJlMXWSpzGWO|IM>q)wxfkGh<@{AF9dwvqQ7<`t={bCeg}oV$n1 zg^x@iH6k+q$=9&+t`*$)xMlB;HOsu0&q5lgBHVlYe_)(3#zhIofAK%q59Zaq$@6dQ zq@(GRZMq{I!K}Tsef>wM?(I-F=TLVw*I;)VfNL;0WoekA^fi@R*W}d{<I()Ir`AOqaIJ)-`%fw|ZLOEUn5x~4j{T28Tl11DPo>Hq)$ diff --git a/res/img/flags/SH.png b/res/img/flags/SH.png deleted file mode 100644 index 055dde68bc14c17434eb2759857b8818fbaeae42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4615 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 diff --git a/res/img/flags/SI.png b/res/img/flags/SI.png deleted file mode 100644 index 96359834069bdbbf4ddfacbc677565d5baf73c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1613 zcmZ{kdpOez7{`CJS-I^Qat)DOj$CFtG`6)c!!r|$CT4AzS#qC|a@?xv!km(4(wUG; z9pn~s7b=lNq@;35oES+dx;U%y&-=cg_ws!Ieb0D$xG2eM%L4$Q9kAzh`+13(-C0NyeHz+MOd z8c|o8y|B^)G?3&%kW#93r;#Y)NeneW0J2c^vxt{d5T%ap8+2Fi51chWKd z$YR|H4&DjllBXO`AC_k4%I0wmTaZJPL8HRuFO%q!XcJgl`T|wKAO_sHrJYjXq{(W+4uHjTgU#nCicVF zf@1~8ms(PaOwaxrcU9svPW==`J0N?wy7z}%4b0RUkE@==g;4)~sFsm%O-wqpv2Ymk$;+#F+78q)85Ms+~74}_%Cq4CXo{VZiUMhDeF zAR+n_m8Q5I3wMIL?S>fsY80YsJXX} zVFaCJQ!Y_B@EgH%y<*_O{ybg_=_+IF4o}@AboJ()oQG-IIFo+)vy)B~p?v5!mKLUS z8a}4ARVY`SIn>R<-aO68=eB$;QP$cOLA$CnX43zXaXU>eBUFv@dWRxB$G|eRVPD9G zSU;g7ve^*SH%Dz#6|3ooMub}vxQcnN$F9?LakuU#TEX+lv(q~I;+2jQ-Nb2<|Ni+= z#A<%2DA09g^|JLxwQgKAA5}TFP6c@!b+^t+G1&KIwL3cXjWtp`04LUUa;h+5r@Pb zU-Zje<06KFCPP*-Gj5c?#b)KZ81k(x2%dkVCE`t8Wa8_Ild(HkWP8lEeV9dg@JkiR z=izxK>S1kH&HBfXv(WDF1fchY|;p?r(h1`@A+pcEgW! zJ_OGlFbnr=YOQ=>3+f?KJtWJM^a1pr3KhobrK771(_px@sCqrCv;rNSaw5+w&?=*F zT#mX&{O-u-_9_hHZC-fnpn#t$VD0tK-nu?D9$%T2ZfJ=u3p36LC5!deumUxcWWbVu z65Xp$7#OQ=PPGZ@l6w!}+(0!1{FDfmr8l*%yXFYnz+M2{UEClwgqG)#=f@z`r%(C5iWvN|@)C72C9Jm$+_m^xPpIvyV!m z#iq3*zT@ZCUqzbQG!sfZqM<1E$hkJ{gAL=ggULigq}gWug^kotMa71=;44EmW{sTS zx)-X6Rtx@xUSZrzec@Rcr(2IXOz&<#&CzOgqD{rA6+bRo$IkB1k(rABey&Xs9)t@D zPla$5!cz58_eXg?1N%hQUFMV^&Sg^jRg|zjYQeoSlj=O*p0BZM<5cqW^un5 b!Xtw@A; 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 F2>^841hN1C diff --git a/res/img/flags/SM.png b/res/img/flags/SM.png deleted file mode 100644 index 1af1ca284fdcff936c14d6f4a59e427d026789c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3009 zcmZ{mS5TAP8il_U0wJOI9;8Z3Fai>4DAEKGP>LXt5)`CJGxUURLs3zw38GklNKphr zRf^J8Kt(|O5h{nxy( zgE=x-U2p)XAKn%Z02Q|oyXV;s?kI0d2U`G$Rs;ZYG5~BJtjN;<5P<=JSpopy9s+JjBv9?0|&-dMUu9@8G~5Ze?rE{*z5o1gk9J6t@Tf zoaI(#cqh{E{BVGi)1-9A@?urmdC^qRFAar69S5vd>FFHx#Yy<jj{j$BRB*I4b@>6kDa21m33p724PF%5L8wjlZ(n{i3_+&P?(0{;S-& zk>6cj6)tM`OM;&sjp#72JCu3z+`dmv0>N%>Kzq2+95*S6!VmxI{-I0H_TQt-XcEA` zu_uHfX(=yV07;?a%hp9K=Zt{gIl+Y4m!71RbaxFdV@}WO7nF0NBL94hDa7n_$5`AE zU++S0y>JpA)^hGq!id;ix>-%7QM+N8s8o1U>S&gy^L*Kd#96~Z9#@&5ujnAY2{R<- zDrLo|Xtid4vi{scj`LO9en*4&<}UdU@0uBpuSyfB1kdvcGNpJec9rv$R7hs1%KDpuDfwIwR89Qmx_tz zv4OVzm@%Dq?lmDG!_9F>XtBEz6;xps`=Wj@#HG7k`)Lr4b3T#3Sjpz=x8F>3@dA{3 zi&dSL1r9!ChpTb^rkb(K@kVU1Cu&t7eWw5SJ33apw@BIgaV5`y!#C?un01Y^6U-xi zwUZ@DHg;!)$@Z-lh(%5w-w3ro;cHlhSK}*cJ&R)gI#dg&JsKzNrKS?MCHIq``P4iv z85M013}=5LUX6^6EJS#6`6`ty+;5~IR!h=FKlN)&d=r@9$*0UBOR9)2MKo#I>~->W zPnnS@D|=^BAChqdgU#;KALnv-2=hf~*s3nFr==2o7mXlKOjV+tvhWYqjHUvm*%_TW zvD#XEZu6WHLd)vMWH@HNgc-i~_EF~R?`#>DX-dvF9g~RJN27*aAJi8>vp>GR3qJV{ z#Hz@+XoZQKv}d(y6QT`6Y?plcx0IFFjJ33mk&U~dT5Bj4n!-hp6Xsc$Pn-BfuD{;) z2?};FLu~FiO6WCQ7P(h^Zi(T-UG}}L=OUG3Dj+P7xs#|*@?QVdV(-Tz#W#_>Lh$?+ zhfYtcSXE5^Wi}OIgrJWpmM-P`#nbNX zCEU1TJoL6mRJtJV1~%iVfy<(Q(3UskdoQFlx*Yg=SOx$EWrDKJjXI>pKnkC&vsRwd zWDdEd)Wi1z@}71onG(#$xgGhxE?kZE^Whs0#SD|vyfYW!?*8wfB9QWFAaLEq;KkHM?KYXpZND_JM%ykzk=tsrRIIpvb%Kd#> z8juNVYPR7XK~h{>vqn`?qsQnWb}NG_0#%Jih%nXa;ezAdPT z>R`(M%JQtA{|7->!E$3u6V>@dHqydVUuhbNsc<$ov@P4RG7ksy5_!o{Ckj)(x)Ql&%d1n8>k&*TN~t&$E#nmQrcb8;n%|W@c^19}=?yN!@eK0) z9&uCMG~Y>`LZ@7F-=L+t(x{~|F1>7{@uSF0*!uTDZbj^L>KVJv!K6WgO&JyZIw@Az zybOpq9yK)c)VTM;%f$)~$wTAYOlgpXRp8|~3j+MgivUV5k~d7>1szTtmJxl}$L!qk z%9@HspZs8G4WxTjGw$Gx`iyjsh;)B{Bpvtwx#rmSgc=W?Rdm*Oiv(wkFvZ6XOAZUU z%`>&}W1lH;u(rg;r(rg2x=VqoXEgcdOiyg#1!UD4|9SEU9`e|R6>utmw!JeeV=h z0Bn}?&4&o+pN?)1lX&2)#}YjVfp4no)Cty2PMA(OLK2v3P~F(GxndgPaH4RZ!5d8t z9HO+*Y;NvP|K=W#{xo=2ox%)#amQ{H#6}h5X}rz3GvwTRDG*?F2<59GT27Be`{s(s zj^u~@2$6dqwlJ6>I35(lZ+H7@Xq8&>eit@=YEWmnK*CQiE02Bo*@cqLq!(d-N=n#2 zuRLs}$J2fcXp>sY>>r$Ac*sDDgATQPW#e9d9l=nANTzk^()s79@{E%a;#%oc|6BEzCM^FZ1j zneih-o3^tU$mw=LML@&9c3>dsb8`&wtB}U*bMQ9Cx*pe%xai|rX~OoiNMdYl&3J_}t(-`2;+ zT^U&tyP+NVJmWHc^qk<IdLW=!Lxs4okQmt@7UAU;VVvMn{rhN_hoPRX~ zlE>)qP>7)A2_udn4Xf^Piov??7Oupgl6l<#u+SApo|fRKFhUczi;W2!M(olGRo%RV zf3JliURRC>>AD+O%40k|=5g$m93p@OoG8|RM^g|i5am`1n3hlDrOF>>>GM>c!->J& zPoiMWGx>OrpFI>-XVg|OHWNCI(C5^L@%wAYXo`}RVF;mg|AFewl@ji9u%odX8ZFyS zsM)3eq|zrQ>w`ZQZh5#7dTt22V2jv>y4_bFd5_g+NacT7QakalqIggnkJ{`5{^3Rs z?8AL~4(hBzxVcNX&-rj)oOh`20e~YIO&xWNmim!nPDijfElu1}j4DPGhry8EP8$3x c5E$%pkr?&=18}MbKL5-+2|*#&#Wx-z_3xaE+|>&$=txN#6u*u-`XfoJOEUXDV7BH~R7P(3F1~()IvsHy9gcB};7|#= z!3QzHj+=G$7zAXaM^Yr8ilnroRO!DJc<3{)HA?7ZFM{ct>D0;`XYnadM#ECQRqFsb z)7Xdg^o=O>EjcVEadnB8|DJr}T6jU(_kq(}6)~p1McA!iyXR|#1YHag(V;UhSxC>2 zkyk`XqZz?j#+@=EPC~XOmKrt|8+TnIkQGlwyA*~tRioy0w-d6i-(RY0JJVxw$q=(+ zoe3BCuEbXhPvthe)PAt7JNjU9VjCAs`VD(?o{L1?-Ml5uwBwQ07Vr3ePV!Thcx>Kt zdUKYFFm#ni_rGD)zwaID16ufbx5Wc@^C%jOyYc+F#d@C9KOHf$%GWXx5r1%mvp%|H+e25#TecVa& zG;>Wg*NstUkUK^{a^dKRVODcNV!+WeS7yyq2ZvCV-Q~#f5Rl`p-jTO6GA7!j7*o|< z7$>li3sm;K-!~+WcH8YeM!p+28IC8I)pZ%=GynMu_OG-?Zlp1mc|Svq5yM2;C{rC$ z&%!Om5iPCzy+(Shr8wlZN=Glc@$^qdd}I)^RlDTLOo?P!sNE)wK4!Ao)KSuQ{sfrN z-j9K;`SjwQ9#&s!nyS@FoGdc+y4e0;=1PFo1^(htm(xb)poBG1O7i+dvi(w#C3Vl5 z^M+WsCq7k;4f_2|bM{f+(*!3*8LEl$37%24ZLay18ghqgU-SA*@0y3ko!+Y=e?DwN zW1JehHCdte(W<6ZZI;=jVzqV4vxiqd-AJres(R%}Qs(Y&&_WS+FJSVh0_Rtmf^}!NF)z%)9>;d@(VaF2 z=3quPT7M3vc%7^=nrpf>Mgqk|Agt(wU)IH2P`Z6F7I$UP?BUEal2b|fO>=~L{)g>W zEZZ$Gz3C2pgH|2O4-+k_P6O#?nDAv7g=Hduhm^Yr(3_!KR7cgoCH@hFx|oA<;Li3% zn_*-m`UHQPyNzFa8r}8;LouOLL8WD-^b=)a2{zQf2+NKN9A5d-lN93r!ofH&9<_7smO7%7>?6YPPVaTD>s;?2?|t3(^Ld{8xxWA0e|+x@d%U?2ObP}7fRLpH z&Vft4pLK+vd$LCBi?{#k{dtHH6?KYy<*`S!6o6pwR-970QUlkw6ryad<4rN zw3VeD6IQsw`<6Hp$Cy8tCP`Nuon`53D~-|7H9gCBAxA)uY%YL)B@TB#&zR#;er${b z``q|LH7CuGiBoG8Nv*EGF(OI7fp>qF3;8C```D7GMmml?q(eg4Tgm!|@VWXrI57M+ zx(w&0|GG8RM{|M{hABm_#RqETYA+NXOtZX~A4XhODptN(`ftL|vVxOmRLj&J4c+D4QnWx9KNdd4=Ea~2Yp=B-tnig~S(s#TyeF5X@ycq<|X zaNb=9UY{UJrRKTvWflZ}B9mgaPaABAs_G& z#S2_AdsYa&05fPCTJ+(hnC1;5+V7nh2;GbmSfq)e;kY>e_)?9mv0cxa5`|<9eo64y z1so>Wyj!$dB){8Hh6;?MOzcKsXi&=Z5Ih{zJkuL@CiYl^Rc>nqhqpP)Ri&rxx>M*l z%^uv~6?uB@h{VLa&PP6_oJ<;Xn5dECxenOVrP(}Bd_?pJqI`nQ#WmCLF-s#KsyRxM zAkH}Kl}cFwB@!Jw33w_|CbdMpy{&+Qj6q##--CnF%@#kOSAOv@;&ty)P3Lu1p`r!^ z1X18l!f#^*`kMsAhd?4Uofn!%_)7~>`K=fd(FWo^EvLRMRQOBf=LPU>X20nvxs#|dE`}p!vx9y}uwLQw>Vf8~HOm$nnPWSWF1~6;!9%v) zb}s#n&!;%Fy4Lh!->AO%+y23}%c?@MckHx#=d9}aMrF#SpLf$qYxRvbm9stD+hbRo z5|3cOVvE0i#b^~rE%kIJY^B8Hr`hn!Fpp5>@IyvJ`ilK=6x;T!!_8eyhk)Z|D4+Gn zEz=eex1CC!oo#n7O)Kda3b&D8MSre-PR!~&i$=< zdSAdZw09M^wFlQbMkCrsk?4`7aWx)E4uY|BMh^r#!rt&itnrK63J}k_^ zRz=Z*wJ?cy2HTJgEuGOitRXgu#g+_|b2q8@^jegXLrlzgwYFa_bPS8cBChkc%g*o4 zszhjvjnNnVZW&Hi59n8r2kX5EsA}~{_WipqrgAR`jy>ryFt%`)JC-M43B48Tu|}-d zA{p5ZPU+Tm#(+Ys>soZWcYEE!#pCXpgd&2NhiPT&CPlo}7>A^9Vh_Oes|UBqe7m49 zi#-?ra}7zgrug(s^C_b@2|_T{phkysI(_t=-S_VS9gkWDup{5qpQFRpExg^D+Xx#K znfD%Muie;9um8Lj_i582;iYvxRR;$Zrd|nr&SXRof#OO8Wx$&qNQjy#WrnduMAWIzRDdil*<_N;}>g-D^zX_lSy~kyNFy1INjp$ze^go*HRvJ?EN4sYi&q zO36mSG1-@~buB#ekJ-ah1@bQj z^@ly_y0W}?h?{h>|4=xl6H9-Hm?o+&^N3uoKi!des%F$Lb;)x z2VYsAO>RN*Q&yI=fQT7y?+H@blucd%wWws^sB`;|>K5mhyb-t9j83ZliOp9s;wL-c z;_!qCwPioK%h`ut^uDDSM>;QL-4?{9e1elST~DUOdk6N67`x9APD_<(k^_Eg9aY2= zP+C&vdzy@c$INZ!9>|ZQc>V|CAD{jQ`YqPYLrE9^_5Yu{Al!QQln0!wTpE9Rg1fU6 zBTZc*{e2<>Fn-|yTmV`~l)gGrS6%BDM=foPE()WAR70XLNMuaMXM_I{kV5^5fwBKz U0Da;~;R*mtQ#`KnEaBRJ0G45cFaQ7m diff --git a/res/img/flags/SR.png b/res/img/flags/SR.png deleted file mode 100644 index b072dda835cee73f1c890ba76614664c78aa8c24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 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�=$Co5EvpO`aoR}e=I%dm|_8f6)aj<8VNybDn&%~~8gh{v6^ zdWy#a(WnhWZiE!K`;)|L2AnLf@{9Zf;3$JHH7_|f;~Dygz^Sn`N#~C^hi=9!mKj{V z9T)`pE>|VpMQuX3V*A2@b4K@j1?B3;Eg5?SKg^{$<8QtyoWA~&qw8#SsiqCGj@(GNQ>gR%^m=^8ZmN^a&@XF4_@&Z3`*1|lyw}diLKf01R}P(!jw0l)OSZ~|Gzd-k=N%P>&-H=O_J^!8;>H@%A+_%r7?@{yx;TbZ+sbvW@lG z-Q}!Hrv!OvLWr2eW7djOy_N=P3T|)qGhG;>q9 zey()wo&#?iUj55Rlv~_d*(3JMFlxqeAm?#KWd5|-$Is|)f9%J&zt8r~jtyVz|BAm+ z&D%d)bAfF2n#AL+tZ`K(&z04SWb!ipAL03@qrkrN#P)=;O_RmpkR|u_&CA>5 z8WsP-XUlSzH5upI&YhL~eDsOC<(tJeeD61KYU|XxZu2<#p)lG#yz#2`r&mpnSC@r% zvq&ZVzCK4#bI#u9udn8Ju)IpHzCK4NGQN0ELV3uNw{Ol)Db-BgcluM`nUDVSJi~9i zHQ(myby@s<-M%f~E^InAgJaKj3zP6AU%H+9!}InW|C)cg_+`}pXOinTbl!gX;@C3& zikUxkWa@TRIv?LQ&22{A(hsW_Wp(@)So^z1l%QP0mm zla4DM@8-*#z?OO9AM4VIt1q##HAixleO#N(Tw739_;i=QvOt%}_9;gmZjC&@KBkbZ zDxCkzSNn;Tdt;{FZ@8bS@?yUY3ul_C|Gnv7%j=Gu5uUhM_P*ATv~Nu!p7Zx`?>S#&)^syvpE=_L8{a=HESv^s z+bgwJEJ*s2cs%|Pr~0AJ0wwmwcP2YnO_EMOuRB&dO+9kz8n3Y4f2wl|d-u40HN4+% z`P;)Jb=jFImbTGPPq(ZW3N8C$e-1V2g3|Hh)W84hFYJ^Jhh_*+)_6MUKLcw~!Oscq zd-{PHSGB}7q9i4;B-JXpC>2OC7#SFv>l&Eq8d-!G8C#heTA3JV8yH#{7*rg3YKx*F bH$NpatrE8e&iS#8Kn)C@u6{1-oD!M<6V4Q% diff --git a/res/img/flags/SZ.png b/res/img/flags/SZ.png deleted file mode 100644 index 2182f4ff9330ebefcb10ab7f31a4ad77b114ab6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4133 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 tA{|EN%rAz<- diff --git a/res/img/flags/TC.png b/res/img/flags/TC.png deleted file mode 100644 index 3e3e19d4b3cd6794aa2d0f88df3e5d12b263aec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4631 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 diff --git a/res/img/flags/TF.png b/res/img/flags/TF.png deleted file mode 100644 index 6d50a0f544ad14e2da315e53fdeb187d3c8781c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#LMOT^vIyZoR#|-pj>NqU~e( zkyycIoumjJqZ@lTPbZm3x(Xc8kUp~I;_VH3aR)VEXouPVTDHYHQZ_R2 zHFc$JGZW|i@dVlc1P;oV%B8(Dmrm(eCjaaHlR3rbUV6{}IbZ(5>(J0zexKQzOB+QN zPw(B%z4CIrr2ab3?XSbltILCy@87d!gX&QYr}X*1O@Fj@t7om&&I~;-1 z9RK$I^719$C;$H399Mu6yqPX&4QEm-O_XRtQ;t_?JSc(Cq7@p35iEz42>tX6I6`;B>@{NAg z_KsqVqSlR>gSCOT<s5(1a z<{O<#wME)P&7JKpldNS$KbYGZP-R*PZZSRq69u$JiRayAw>n?J{E!c8#xak7$vlXw z)=CnDR@?p6kN+*~%W8j`B+Rk?yAz20Bz+NBAGvl+mKxV8`EKK|FA1sc`K7sUc@&aO zQE$DX)5{L(PXI3N{y|I8vaYdPWMoIVVO%N$T6FMJrfN>Lx$U>vKx(6gk~q)wOlU_B z2q2i9b%2a6$OsiOz-nkjYQEH{2(5N^> zko1y1e!JBgX%Akt57oOV zqGk3mWm^YePr$-TR5%?75MmgBVP?YjD5?X_D6oF!6pN1sgZN%UZ*u$F+D2WO)5@?o%~GWyTe_xC2f&d@QG<|NNV z45{aCDsMM6>e{YI16#9z9v7^W6em>PwLg`?tQIqPgnim9Q8zfdj9_LriydP`uH0Al zrz#M?WE+NIdj9NrJA;gOd1BgW8n~THikJX9i3FubVUVSDR`BT=FzoLAMFq0ul1ku9 zoBzyJx7>_I*owZ`n5O!)CyMeM7cff{;`ce{rb>3059_|qIVkNTZ&#n~XfJE2x?jR3 zB=}9OW6HmfFYL?J)VgI5k9|`~t)1Z_CM&(1g1TI*y>+>JELE1kpI)KfXtaCs=&2%u z$X^icGZr};e~T=eu0*Ivv8)J{lCvg`WwEf4)=^EcYQZ#kbltOdOv>j{*|0c>mgij_ z`MCwP>x#$HHxP*!QGkl!FIzKXlD6ILqjJ*jWe@$qNGhVr0Vx7LGT@YO3 z=t@;-2pkhFz<*V8zwB{}_cyLsl}PTW=mH0_W{UX{V0o2`r_p*u$5#Qe%E=B zZbBu>H|TXqV+zR!^BOncE@?|n<0im+lw8PN=tSZP)m`cP)=t_Nlq&HqsY2Srgp2c(KdRxbR(PmmyGUIS!h@TlT?$; z+#b=uMQkepZgBKmP+y$fuXlvn?v0BY>vqo~rBE)_Ud#k`l2k~vRyZb{CVWx01+Dr zkn{!D@K>bYoY>Fa3dYok@s8v1B-{PP9Fe;L9f0z!f={eOeNA6^uW0a%;c Kn>CsEr2Pl{GJ_NV diff --git a/res/img/flags/TH.png b/res/img/flags/TH.png deleted file mode 100644 index 0c884c329e1e463255364f44f2c4ba4703e567d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#LrBx;TbZ+^X(-~Ie|8;+$6*2MnlS7Y|U)^2QTs`YSwP4sX<&!U~BdqEKUKjN*X1Hu*y{z2l z{^41*r(++@a}#`i@1lTv=R(c5)2fA7_i#qfxM#T2Ks`%5&VI-8K!?~hr;~~jZ$2q1 z$p)FG-Nn7J{>9wM+}X=-xodu=nASnesa~+;j5(J?m+l-UM#%D?+zFTE2VAv~xqz<7L$~$M)WN@S4MW z%e=kCznm@ZR@4>Esh;!T^^9pZCq3D*_mlj?Z(aR8ufBCfZ!Mpr@!f=LhM;BO_r8;@ zH)p>*nlq_diZv#-YmthY__g!f%WrGG%bZf6%MJ9ho=~q%!TCiE6Ky?imE8a6bws}4 zi6O{oe--C2=7++ffWcuwEpx4Z4O8kDk3~R1)e_f;l9a@fRIB8oR3OD*WMF8nYhbEt yWD#OyY-MU_Wn!RhU}$AvP;uy~EsBQR{FKbJO57Sa=f^gJto3yDb6Mw<&;$S#pf&se diff --git a/res/img/flags/TJ.png b/res/img/flags/TJ.png deleted file mode 100644 index 3c9026fa0f0c4f00dfdbf89162b8c5725949070e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1647 zcmZ{kX*k>I8i(J6AhEPFqLkE@mZnG}2>zC;T7uBiNHs-C(N3KPQ9+q85!IH1V{{y< zV;NmthoX{Z#;&-i*jh?0RZ+E8ijFG5IRBY%{czsvd7k@u-}m}`z0?2U830s}hs$xs)iLR402_N+t7Ub!CvqT9Bow~UMt=0q%{YB22N*m{%}_d|bTIe1 z>wCjJ30-TkIE%}_hjlkcoSl@k3fo%P48)v)8|aC&u8 zpZacZlEAxfd1fhowx=)tleDLx2;q7P`*l@3u;OuQ1Bv-wp5^Lv!x*T@=aKK=QiL_* zj2*lVEf9L?zUPSfCfE;t#`o>_pRSH`)2Jvy2ei$1(DVF@@&*iFKq^O>wkRyKXvUW` z)=nu`PxK6be@h3`rX1I?sG|3?lIZC(isOh8LO`4Ti2OcT#wyfek9UWV9>i+-Rp<8w zAE{-8#O8f-X~YACe8a-OIJM9;% zlC+JADHBPt>E0rQodXj|-DaG1=;HjxSGT%!GdpH$(B_Z)-<)&GDr*}Zd_1GeXJw+x z5gp#YL9dNpuk+nD4n1I+!kC9ByDz8HSa$0oZo{GAGmQr;2HSWrGw6`QsbqQtsqYyz@u zWJs1UF!HfwI+kv@=036i;&bf;d*?49*)b@POUPv z`g{(HYC49`jLlHkr3_X!E*~t`!atZ#dNiHB`nV%uXB@x8JB8h-6hfjie_jx`g-EAV z)Gd)iJ>O2BC~_+i9~D)~wFSIP^1U9u7UN%-)I`uNlcv=wsJwE_CPZ2hhaLOZlA17` zj}Ek4Exj@~Jo+#i&W=8`zni(U(EP4oFdcF0Y*jWocFZrf01DOP(6AJo{9B8EUDo6) zy}})3OPN>py;gi+(7dJ!M@Qi#!(6r!{IBxYd#YZtRm@$R&F>R zb5y?6)LmkKV>+y_Pgm~+5 zAF}$3&nQwqZ{saWLL2l|bs(%`lbeH26P>CMak{$`v7UtP5+V0|1++2wn9yxr{1=FRPmj#%m0sap;!lA=4;#iQFVh#CQLV(I3<%? zKA1TlSM7jmVKln;xPacMU9=N*(qHoZV%EdC(%20^tua%4!OJQ@;BKM$5QrX|Ly_k@ zF#wYi!HBMPY~Sv%ZS}q>dcAm1@7GP+A25xe{qQ6a5G{vXb>7zO4Eb%TUQRr5ehJM+ zu$(x>iVNr#H!;5qs`Bq5!%plDg%bScHf)6W2uSydVYqdQ-kouF`FAV9shXxGq3;7= z!-N=IV`^dUt!4{8?foxHnt6n2r!Klt8`zy!5QW$H+GkkT&5|AEi(N-439JeMEZ;+1 zS0*>?Jof?=dgTHPKqi@6n~|){$TkeJ1!QFoS&~dh<`9W=wROhft3X6lSop<+{~th? Roa4g*;Nj}yQt8Y}`5!=o(?0+J diff --git a/res/img/flags/TK.png b/res/img/flags/TK.png deleted file mode 100644 index fd605749ea4d64fa780d884cf3659f6c522090b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4829 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%0AaWpm7*#@osy30QgpYCl^%t;aT2j zN^Ha5khD^U{lbGUn$l0}dK4^4m2?!F{yR?W+AhLp51VpyWoUQZo7k_JwpDuFhQ&HQ zvP@T?>YJdORaAinMBr7tAX&}4xq)DmS9lt3*Q2=Q4W_N&_R~0M!Zq+=cXSP`z48l< zchu?Q0?Zg%*?V#Me>HaZ0y=5=9eraO({#0B^80IA_&<8+@1)@9>vRP`T2kt^xFkYc zTFyjTMgbwEa7$8DQc6KmGWgq)^8Yb-p&z+9hy4Er@;sa9D+8ddsi#q)W*_q}U)oDU diff --git a/res/img/flags/TN.png b/res/img/flags/TN.png deleted file mode 100644 index 21c4b98be71f6876be9b7aa3506430f7670e2ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2635 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 IJwn{S0f(l+jQ{`u diff --git a/res/img/flags/TO.png b/res/img/flags/TO.png deleted file mode 100644 index c828206e35c89ba78ab8ff0ccc1ccaa8639221bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1618 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 AI{*Lx diff --git a/res/img/flags/TT.png b/res/img/flags/TT.png deleted file mode 100644 index 66d698334bdbd74bc80d180e73d585fdd0ae41ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5253 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 diff --git a/res/img/flags/TV.png b/res/img/flags/TV.png deleted file mode 100644 index 7a127f51ae3b4a7b80a468b6b5c4ad95a79d1cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5915 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 diff --git a/res/img/flags/TZ.png b/res/img/flags/TZ.png deleted file mode 100644 index 7949f65d8aed43e1db20399e2f20311258cdedad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2289 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 diff --git a/res/img/flags/US.png b/res/img/flags/US.png deleted file mode 100644 index c3a245b767982dac3198f5005ab285b82946b212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2845 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 diff --git a/res/img/flags/UZ.png b/res/img/flags/UZ.png deleted file mode 100644 index 643b6ae0cf6112a4145592ea3ca7fdfbf498d057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1745 zcmZ{kc{CgN7RP^NQLzOj6eHSG^l3CAXk(9ECB>krGbJI6ncABYd!#7|hT2A}s+Ov0 zD;3r1Lse3$wY8m6dsQt(mqG2~nU|UW=AHBIx%YnVa=z!>zb?;{?4p1;fB*m}xVbud zOKARAAmNfc@wTa40_czSBzpiF^5k}DFiDRNcJ(F!kf;v;ivz%pWW-tk-~twaPgDR1 zR{%gom$i6VNfz*+lP-=DN^IMqHBAE9XxB66C8Yix%jbx%B!vvajpQWr0j7;IHPrG+ zSponibaS-#VUB$rN%HjZ)fTQSHMjO2LR**-Z%@31L-@QQ!63B{?@`-#RX)(;Y6$*z zrFw4e5M{$Vv7q>b4dP)=U0*{o^-5iD-5%${^9P?yz?^T+JQxeyXF^8QCjGu@vm{M$dAGd9m}4cFr%8A zxz0$%l@_Kvy}@K`1Tyt%;BG~{?p^g}#HX~_rM0inQ%crO?Q*Vja^OoDXIx6I>0?6~fdCAH~G{jAs9#)Yp zDiBdFKkEvgL5F3SpBz^hZSHonSj!w=;+}cahD_GgQ0poLeRS>DgWejbLJh?#uU+&c zxNL!i=pW10(oIqevve#o%oGJz2R7d7m~yFp-)N&a=KQ-$k#H6@)Ah_5@*@8z@LnJ( zP5B>`Rf>z>`?GI8f+u8adSt_bEEkxuDO%L^z1CYwS?rznRslrh9|{D#{F*3;auCnr8g)i==gU}}@>nu;;ujrfoEO_jJ5%)Ddb} zU{-JC0^fF{OhX3Ozm*%XEY2eZUT=!sP%c0lbo=~V8TRw_Y7xYzC&(PcFlOY0+38Xx zyPYFKn!B-&z=&wAmn0Pp*;2O2m#2~+dT?Y05IS?$(Bdur!1S=)80+S%84Hn1!d$y= z9(z_TB{)gv()8)i_q8%1^*lW*X*Wo{Hoc#PsWmb^cQ5@xy6lb36=I~L@1s)f=)QmB z-nH!G>gTu`9temJ?7%Up%NI^>+Ca4sMj6970BJnbG~sT_vU+xvy7?*X#r7tas%uVN zEG^vLh{M>f)P_sPSB=uIQ$ah~YLSsw6`R>(`dwG+wyn7_wQG`rH2 zt&wGy+N=D@-ftO^P?2y%C5oMYD#ruDPuFGY&=u;x9hq`=VRH?##iE6m$d4>_B99`) zd|fm7ha#SX{NaA;nJv%3eefj=ag`wqCICs4BU<8iq9{WHnYI8dl zqYGWVv+PKNMLa%k94ECJqBke>+X;eCk2(+pnFwcy>Tl{MLbBrbh@1C0osBS1k)x^& zoIeD8C-}wTCPW?Sq*E~Yyyobg6eRX(xcRmIP`S9=o)g9;y>qc=shsZp*24?z`d$?O zf_!xqM&9s>A(r&}W6?|RpXQ!kx{KM}6l3SADiA~6(0jCjwWaksYHiH}e~+V@5wxiT zO=I}MwOB!;kN*Wqhcv>^%;3k>@y3hSYhrT~hDNSEr#EF=mSgqt^q`j$)Y{u+jXFKg zH6mi{M5VfaYzD1uNoKpGfN`3g$ipu_qg`)A^Iv>&OkIk`R#clqa)<9ldUI(PR>)T=AQk0zNZ$Klh7*NBr!hhZ z!LcC{036oD0)sWf;Ewy?ObKQt1U%LVYeK+cnNR1e{~?HoqW=_{@c#v}H_oO@1i;OS K?0AnzW&anj(EgSH diff --git a/res/img/flags/VA.png b/res/img/flags/VA.png deleted file mode 100644 index 63a13c0e81272ede252bd979f5f5df7b091dd44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2211 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 T!4h{0PXJis?66NP2}yqg8uHSq diff --git a/res/img/flags/VE.png b/res/img/flags/VE.png deleted file mode 100644 index e75e17c9f0406ce7b4656d693174a523a6af2f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2157 zcmZ{lX*ApG7Ki^yBrzq%V=9^sXpf;WYfyp|HI*NiT2o^WqJK$ z2iy~u1)EFuHdyz#@x`%Q?gb+%Z&tSwr0s-~?s%VxPH``)XslSESX7^Ld9olr@~*Pf z!V~lHd`(mIkpIP~`R_F~i~nqri}tX6N!XY!rY*7&pNBB9HEt>;j5_iJA|en7Pa30Yb$@yAaT4TO(-QAD#sPQIX{a3D9S`~&T2BqLhALMx7@zrI z;XitxzW0TzpH@Jw+-3y*c%~iCME0A!*Z1AXihdZ87nHS{Rb}?*o&H`J|9H4a(PY9H zue~k7fY$z1enebk?eLyJq3|*@d2$(aC-LvGtpfn{d}VEI9S^%3$91h zVE}X+&v#mQiO25X2yrIZU?2;Umxx@sct88)uVj@`Hp_*m?K_<=!V$g#SEB;jr%lxl zV~cvGx=G>Akz*Tu)83yBQG>7+RThW)B!^W=eeSTn!lzOyGFaBIT!s+ZtK@KUK58yu z=9fim9&$%*M|`eq&YuWD=U&ZkR>U7PeHS);VQWKmf>6G^Vc&1uHcx#8s;-c;?3Jma zXkME!wFW9(KR}r!M#U$({1H}d3MQ8~?2}9Ukex)vYcPp1z=Hp$QVEX74bcX^( zpIU|7P8rqynxZ?tQXT_0@xNG_!$k+ZUHJGMQ+HdLiCxX`v1QTloz<0_bCYNu1c!P-qG4hPYazcCWa{?-$mk=17eDQBJmey-CeS%sxNU2JLZD3vx-rvUk|v zq1=w>3A$$(FgP1K8-uzR2LqKxk#s622c0t|zy($IGIa8pnhxaEK(PjjZ0w6(A&t$S z8{GE|<6GH6bU2r(luWa(Zge2zky3WdPG0q0yT>U~T zVCiV9*GPF5XDQPcJ{&5pz^4455)k<4Z{OuR^3A6Cd9ra@r%K5QHfkz^nQzG z%mNK&?Z7s%MpBxOUopr#w5TQ2n`U%P@0CmQ)bLM`LQZH)QsbI^4x}g-`nYrJ)+5ZP zI{W-^xrdQuEuoR}*CU*3plq1{#BC?BK7Ex`Y8f##`y?O||9ne=1F$1<8${MI#lId% zk~&-_jxVVG8js2*UIrD6GB2S@f8K!`W#pcR9L)%*Oz}N5GaEq3d7`88CAUX4<4>ho zVqmGtIbp(i{)6K8=KPzx#e1C5h?~FfpYm(^{Av{#3UP9oY96X8TeO0w-7t1-hn~!D z1ZvYcg#afNnx+1u{2x!JNy8IQG$6D9X&%MOwGV@r%8Zji-_Vev&`LC?=9&w9KC*>m z-QHfs-&5`!YCq9q=nI%{?v$*}q8MZ47?Ue#2w|7b&bYRu{tC!=hlY6Gm;& zt1|M62)zzuNvwf~Q;P6sISJQ!##1TGu0Agn z8G^@t@?8d5#^C8x8|uj0h&5Ube21J9J{ilif@}v$hy~?TulV>$?@EbFyXs&7V(}=< ztDfiZd6M#b^(L*B4!DO*!J55~hT?#F?;NPy+A&QKd%ufrV+|20^pVP-*6zGxgf>jq zKZ*(DdDM-(XdS-?Mm@-YW1mUCHab|H-^EQtQN1wakzh}c2(Ow5IZQ3bmT zmiJ#FSG?F?c0DqJ>-gN5A z4+UMKPteHI%zpMUm?XHSAXOQrZDo3R7qZ$dEwbwuMQa6X$&1-RY6t8}T;!`Aj>=h4 zQ0Qrjyh>u z>N%eVARGxithY!QEEK&CKf{HEe5Vf;FT9?y@9YRiF-sj4B(otJ;S-UV)&cmonHJy{ z=Cg@Gf4i(}OPfoD72b-?+g{3?+&ARToU0f_h@l&P)|0*{|Bq_~=3(;u={;_~dml{q zu6zAWW&*KU?7&0Z3WU;z2eSm~Rg1!TM-d580T}-q0RjMeXkBA%w4t`1iMyUY#!wey pfYwCoV$kTgPOkZX1+Ik=g9GFLe?X+nCrJ~YREwO07#zW~aG%ZUI0 diff --git a/res/img/flags/VG.png b/res/img/flags/VG.png deleted file mode 100644 index 46f93cad1ec1b088f474e004c924e00157c9969c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5427 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 diff --git a/res/img/flags/VI.png b/res/img/flags/VI.png deleted file mode 100644 index 8c849a733e369c9b9d61964899fd7cad8659090c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5938 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 diff --git a/res/img/flags/VN.png b/res/img/flags/VN.png deleted file mode 100644 index 6ea2122f9d1dd9e5aefef30ba4c28c5b943ca5e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmZ{mX;jjS7RCP{Y8VzyWs-`QQpzEaG&L1)!ZC++QA9`JHq2+TRb$;S5PqLO}um07)xLGbbT+ z|66b|VV@dnx+?_aGSQ9*0JUj*w<)5+9qDQ5WCs9IssKP^0>DqJ9(~ z`2cV*prF;!P-uvG*pSSG6zVV2ws;|+0hZ3eLc0H5YgCgF;UFGjWoIt_QS|UZ92!B6 zT@_wdt;~qzi1#aZq65fdiv9S->9)w4$gIV5CR7e2Q{2rY`GRrXG()lpd!H9L8>TrX zCGMdq%lW92T?)HFAj*3@C^SiwQZT?-wBejP zcM4Z{Y5XWAL^;t@8V;DGJb~&IA12MGEHeO1DO!3Xp?_!F|Dz zoHyT6@Ld+eMUnC_s%fzbh%O4PBk@S3qe3G*u(gw-n5eg4u0hz}054&xa6^RK>@hL!7f6u(?h9e)vA#bW6;%Z3 z>DvRy!0^7n!HAxw|+8=e>M`-dqVD_5`_I_ zNalAUPf5A5NQ~+@t{Tn0-`t3%mUX}yzVSg(Y_(@)@s~SNf9@n4KOvHIOYWYCodDVG z`qSXgpL=Ey74GI>$vTL7a>-Ccq>`DXd%Qk8<&~!HQRS5OTr+QJdBowZ9JBP@u&RT3 z#NGL@tU3wCAi2=4*pD@ceN7`>2wjGR2ERa~BpHJZdaDtF(?1cyNVXY9;1YE_(%tY? zkmE6cBDt*gh6p>WIuuN}K1Cn1sZLwl$*jy^B6{HqQ0INxrR(9J;7q%LM?S9N8PEg^ zPks3hckZhX6UOy_Ku;y>=N|Mj8t|GpR=Y>TchLNsSas{82HSCP02H~wE)VAAn$EX4 zXMJN{U%EV)ZBMri>Ck#jG*n(|j)7%Yq~rQxDwSKjgMI9M_UvwP()SZ#(1DBvH*QJSP<-w_$2k>fe2juQu>7i@-o?!N1}35i_8Y+>U#)e=m{r#w&V0`4EjQ)W zH$iMvd`O;KyppawLu+Y=VO0~5O`CB{^zw#yj{$d5P80>Yr5BR!T*dJ~q228fFez}aM)ZHS^wxqBho^Q~uxz?kdA7KerICcfl0S9;Zk8eqCUBs~L1 zH-M%sT;g-e-gy#KTT*X0Ax&WwuZPFi`RjGfdv^7~ZldFar$Wa~1C$D+=Gsn+(l zsVOVRuBni9&KM(p93$twsN-C{{_wrqHtL&RbE2E?t8)>8C%8IkMO}w5^BBqnarUBa zuk}d8uN!!TDya8ldC@jJ#qZ?_Rt`KyANApoST3)_`U9?nKbEO8{v|+Xe()M!-~Cz0 zCpG$m;uRai)w{sPq}q&xE#r}tC!RHu*tckt`6Re2=*h&Ha23d;c2J>;dk9raTHR>w zf-J`2N5d#$mDp-W3>LXCW?j2HXr zfmj;w?#A9x{f~1gitbF^0w*xdV?lO~j^=Af(o#j_*6O2iyE>2OZoY0|Nth*rZ__*) zndQhwDT5xU*-|-4I3(2d=G3ieSIx>;R!6E>P$SmV7L+-3?ddfU=9a z=2p41z;Mp9Rao;D>GZ_FmW9!?lMii@aewJnP%gsW)MzF8o z4`n6Y-UU+6{@_}edQS+yfukYj=R>?GA>Ia_LEb_D+8FF9O^lAFwjNmMIEhim mU=1*si02DN{}Z_8@8x?b^8W{*MHlJ90AOW)#;nT3o$((KF%y*l diff --git a/res/img/flags/VU.png b/res/img/flags/VU.png deleted file mode 100644 index bad3ba4d46e6b5983023a6897f243374d13fd598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4080 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 diff --git a/res/img/flags/WF.png b/res/img/flags/WF.png deleted file mode 100644 index d94359dcc403087d1c34a19bc5960553d4215e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2509 zcmZ{mS5(tm7RLXOkkAPrHz*yI5=BE$N0M({ z^>4!~n(-KAZOu9*Trgd6}6?*PCq>xno603k>Kn8O1A z`Y`~&1E>vGwO9=Z!NgFHMV5Z!8e>`D3NW&}#UlP+Uh&rLXBE(3V^e+THx6;Qih`JB z^fCZ&HW}+-EyJ0Mxsk!gK1p=wgt<%ogF_W^2V6B7CnGN-4H1jCjUx{eOax6&K783! z(5@fMR4Kai2>nv4M``jC_w@WIfb5aQ)HFJs&ie#er~1orb-LO z-}}kv{nf15+}NzS9rH_VJ8U_RL-@ay7J-d&y1W0kq7>)%48+9z-h5dMO)A}}8Xm_! z(au$KigsXd$v8r?;WIQh9AoB>UlP8PL!pgZMGi#r;5XBSF6s4Wt_X5wTb~x~vhxU`rQx570IlAkm`Mg3_yIYfDp3vdweUm9a}0?pE5&v@ ztAA+%x?$O0{EHYg(j5k9HVcD@^y@bk9buHdYlgA|*BNBgL&MF_n>Iw*7&ECBf?gRT zp;;0l|3dLk#l*B);*dmCsxic8RA1o78=;jRjv$TB zQ%+5>Y@Hqx$`csr5oRx1!b47WmDp4s{OHK|p|V>_hFiR?hrj<5h*4a+Xqbp@i!{^v9XhF(Qp&2mdoZ1GZGaZu42pH z-JbhKRfkWcue${)aHz{Ij zZoW-k`tX;*f<);^cF=%8vo71ZM;23^+1`s1I6>GqtfA*Q_4SS4DA7xa|auAJ|_ z?67klrXqV7nI@1<&5XSMjFcHzeI-T*=DT35s@B=|vSj55F-oek{$k+72g!TY%l^WS zYKx7rI+S&aThR8{Z`f;%q*BCzobL?o*R&uZ0Xo7Gjbc-<8Mn9>_tt5#I23qxKedbK zD%SB*7I7+lL{sO$NAe*d>>t&b(DW~^s^*6h5@d^Wic-Y;+xmNnt<{a|nPzmEg(bn1 zq72=to#`6IZOkeup#TyMewAl;HwjKUJ-^fm=8JnT&>=O;GhW%sF3N>P-w!tD~XLDwSREmjd4{HV==nd2A)Ow_n4}iHivEeW)To2b6TR)*9ee@^HkR!OlLC0(E(1 zHV96gTCQlKV;n}52fl>_TxvY$`MZ45ArIw0`rbTMb3f_>Z$LvwGBC0rB@4B8I^$F-{$$Gaw^)o*F*m`9JA z{c45Vez{ddx~Lc9ek62+mi>$+<`f3yVl-9-04Pb4kn1{OBpeUc4jaRoR{$V-SsmMe1 z6aDDR-9ZRI6ZD&}(s91@V=)S9)3n@wiL3qF0knwD)ntFwUYR||EP9hpIRYGcc+0}! ziMiWS8Fhkj>k|`?8)-R5o6LCT*%tR5fm)l63;B8cNi(MiL^{*wBTqrr{IfH{ugm4x zi~2}me%%uZeC(;i9Nk79f7G7!GLy5-JSBOhlWp^ga&vR^iSY9HOS2l2c~64eZ3Q?} zm|k{6V7>F7xjvu6S8P$XQU~*UJR14al0OJL-;NMIFoQ{_&+o#C)+zWdHd}y@9G$S}IMAk3n`g%rWH6ZTPn{Iih}awwh#y_t zK`+E`E}>Biw(lnfQXlv<;+6qHEMgZUyD*f5*d8kvj0;LNmgjKM_@dMJ9=ofP^Zmv#Zqaw z&{M$vJI5hA$}qRU6uRH*ev)iv)*dLNt|#dT_-JvqG+F|Pzy;{+V90?<3l?&cWI`wi zugW<>kK=d;!@;Gx`W(T17M$t~1!eI7D}y^t(n{4503|DH|Dt3CnYIFA%XbFToU|RU zKKPL>rt5O-tlrF51P0&?ARi4=n#KMsG)BiD9>-loUT!@h`U20#`|n*_IO2J*eNfuQ z_#aKle>?)t7+T?&TjB3mUz^jx`nJKY&cSYImmoJ502ESLO$m8X38ij{QbAu-Mqfal nK`Nt>$ndu5OaBq@^>_7jzy1FMTu&TGtN>uFZ>IN37a#XeEC_yv diff --git a/res/img/flags/WS.png b/res/img/flags/WS.png deleted file mode 100644 index f8b80e5ba9b9fe5406e44779270b460cf1103c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmZ{ldpr~R8^^!fY`Kjlm*iURblL3W)-bY@@sp*whUS_}Wyy)wFvP*+Qu$e@xg?=b zyxO7MCP&dxh)~nnmcwx=!*Rb%zx~dCySD;#9a3yrZJff)^rZ}z4Zk`LV0CsXm&EVv`l%~7{Yzvbh# z{uv!&_K;QXYo2eTbt!kXkDu80$I_VX+DEKhM$q2xpVPmmuL;+-#7W$df_B|MhaUW6 zGM{I^b=CS#P6iE&kO4ZCkn6WG;|2q!^@o>T7eW=ziUMFS*2YTZak7rI{d!Zjf&&m#b;|-JqFqs5VqPv$U5`uFa7h;n}eoqoO>UbspWa;Bw30m2+&GX&aIw zD{A7(mgrl*7^%@m0J$nAMkI1CrLsIv41iXft5VU#Kz_B;K3f zUmOZin3~C4jwA4euq_{*F2!;Z-zb++qTM6C!8rcNF9tFu*zj5tKw9sALXz%Ydv86J z{-lIuyOYFN!wz7pG0EEZ)_%oYt_t2U@w=X0b8wD>KkQ5WX{|VOfF1 zq2E14XC1T-+(s>XwYPe&GZ#kTYPlvdOLX1W-O%VC4J?!f?$_z9w&0Wb?2`;GS;&wxZCn@2?mo0}Jlv>vk`uU-;=0^E;GTVR8H#G)6Dq^2cyx*-*Z2lY1u2j{i$EMKf zq*qDE)z)Xp{$hoNNfmKBU5CD~g3T*A3laJm#;5RVzpSv`bL^d-Beopd+)9T92 _ z@W8su5SMqvF{5~@c0;vi?r*(!(A_aFKOy@r&)$rJRQS~tb=HUdmTh~Lx|C(25{apg z?|xxj72e6WT(ujdnJxVIDF*kkBW=WfQdYQy>#_qkGnvaALSGr|eg^D4On{PeI`F}D zPNP^8v}M)-{oNotESH*gzEFc;VVr6<=Zh{knCZQwK=+<(D=CI=t!XE%)XJs$;W~YV z78n1r(j|Vrq?%0*30$S;D^B=5W33aYeakx*nzTeU|zt4k2O(_1bEI&BG(0 z33CU-=-BhBd*+)L*Q7yp_UPtEw5h5v1e$rK;^i@lQ5;`u`_P*sug|bNp}m#gda!dp z3@$M3_i{SJ@c=FfjE?^alW0@_S6A?8YMHoUN)Yv zGM&)^I7h-QKQxTs+_8+z)AJCtf5Nrsq;S0_?lZcKh@!J8a)tjYS6;r`+N&%K3E98|~Y_db~JdD$SDcGdsP^ZbG2|IqvBd zyU#~y#zfJb+u>3g$$U~HhMIQYWXf4xXKFBr9E_6xiCUYDgCCj#<*Su-Rf*7gmj7W8 zkPxZeVO3}Q_J&V4C8r*z1r#$33ftzo@!2$X65KOw$iv$K`Q{QiJT z?)i3}SYt^Yn=U$adXMDSF^D7h#DxaMh1rC}hDiX-(HP4^=%a_st;ptBo1++;AJArK lj13x{&^c-Qo!~-DXk_@+|1Xd!4M>p)0FiLg>9Hdv^*;+PN|*ou diff --git a/res/img/flags/YE.png b/res/img/flags/YE.png deleted file mode 100644 index 8b9bbd894287185442024a68bb649179c4d5e309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^W*{uU1|;uX-8K(Mv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3F27;f?yX%1z zXMsm#F_2CG;}6+R=Yb6N5>H=O_J^!8;>H@%A+_%r7#OQPT^vIyZoR#=(Tmwp;Mm8= z#lBpIO^m0N@7`n;{KT}(H}|D>#O>&3nl-Hxl(ycTy1e(!+_J8nSJ-U1wI}+9sqjqx z`+t_Unv8MH(X(x$j6h3(AY@0Wy++p}jjm-E^GwVfmC0}H^?y`mcRgP=|8?HVkG#fhx)&wRB_0!i8tt3_Vjj%?`@PX`cPu1`7`*l| z{Hocy%J*sGH=u}WiEBhjN@7W>RdP`(kYX@0Ff`XSFx54(2r)9YGBva^G0-+Jv@$TL hIP}yOMMG|WN@iLmZVjCCV;ezsdb;|#taD0e0syWm{80b^ diff --git a/res/img/flags/YT.png b/res/img/flags/YT.png deleted file mode 100644 index 328879361e55f4d681b310181a772c9c8a1f37fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5735 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 Z>k#<=HxT4lMgR>UHKkXIRr0SR{{xsjNj3lg diff --git a/res/img/flags/ZA.png b/res/img/flags/ZA.png deleted file mode 100644 index 7f0a52d3b2408b0facabc7bd6462be3002926b28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3595 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 diff --git a/res/img/flags/ZM.png b/res/img/flags/ZM.png deleted file mode 100644 index 87adc3afaa254cff5938f9ef55d49cb7d8c83e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmb7_e>~Is9>>3R>#qCHz4wp%$9+9M@Avcl- zU)NL@004czV?HM}bp9F!TQzxffM2G;mh)Z#UI5ULzio{O*7O#nVsf!CkA@npU|U%l=unQGp=ucQub7YZmS_qH z%`dazEc zMMZ&n@12ujp8RZ^J9~C`!VR*3UH4w8;tVUF6!nEwihWEGIzvAulftE1s-67i$rBah z%A&F1?om0y;TOjq{^oVGa%GKb&naQBs6y)0hVn+lulxM|ecoq4SEUtAU*+&b8$V6y zmwuJ$#^Lgo^)WBT>P@G*I*6LI2HV0A<`zGi=EJ+};=#Sq-rug+B;(1(7h<*`PHGLN z7>vq-D*91@^?Hp8)M+6{%E29wUvv5EOp=;KNR}b(r!JAFC>L zKbEgqJg6-J2xcv#J5SfxLl*q2u>4*!kMv#tm#AmTH@=ieQj*6l$Lg9bKlxuR&*8&T z3E4a$4{UX$*Zg8B=5B4&U>iGR{=E#cYy9Q5Fs4q4t(mL&Td6epuw!YVMB78vd%Guq zO)j>zdwA-}^0~Voew>vY!V_KNa$tnrNr&92OreRX?M(s5s{TWy*3|J-xg}*NYdJjm zLsKt@xDKv-(^(mAJ$q5LX!(L&m^78+DIZt~e(EvRr@3q}AIBm?aUoLm5J?C1YOjfF zEXB|oHM#Mwoj4l-D{&)Gw$#<3~S$BiW?nETu!VP9x} z9zM{=V9Bfsd4hOwu4{Y3{-LsVVByz!AWMIHcERclf$mGqv1JIPXY>_XGfo98r?~!Z zW#!D&PzK_Z^4i0Yk&T#}7EHm<*-m(KQ{q3C=N(AX_?yiNtC{>kPm{~x6>}q#HGK}T zT^ujpEv5 zW+dOgreB&Ac2qqs`hyEoMN?PUf~zh5SV!ZRXIe~9!dDLvEx%3Lqn5I2SQj@YGjX0K z6z!)=?e5D=ku$FkUhiDiIk*k}F=}+NJyxW}eUu>k+w&N~SxTtj>KcExNKm*|yi5-N zroRxslTUflP)|2bkR{+(Tr+E-`Q!4eX4?hSN_J0T9(s{f-PJR(_8|~0Yo`YaYE(uw z#5ujCmji!#*U?tzmsg*xtKx_7 zS_mxBqply?_^ogf+IS_g*78}{L>@BpzU#)Ao-R)8lBV_Ua&2v>mjNQLSUl0KA~Vd+ zlXrtIfm`;tz4%m6Iy<@PsC+)JAD550wx(FWp7|My%{6MX#+FVHLd)BBTyC6LO+qM0 zN3I8_le`yEM)&ZF$Ar1T$kPXSrW~zWyZ;a7E^5T0S3Z3If4r~zo`F<9TwC8;bx7003-eriOMjs{Kw* z2HHA5*-}IU-5otkJpicBU_EiCr=3M_nc7(bK!g+k;1U7gm{!7V06+*F0JhKofXD*? zKL4lfwwkmH29K*IhBVT2WY7^y1GB%WV-St#e{#=9pG4a*2Af$LF)q^!@hQs)+DGrw z+Lp}>_3W{;l-Y3S>llHa{l&KRc~gcvUFZ;*zwX!N(ZOY6f-gYJm@qpY%%V7=0VN3v!vVoH}QB8P

    S zoSp%7Vk(l&;Eni_RFbwkdcgVzv=8ZO4yEI8rfl7wW0dQbO;-`rZMFK^P{Xh(R;8@1 z%OcAU@;RRtT^Gwg(4N5tsfejAvLWHtlSDd^)IRlHisp%n8&fk2jHQSUnY$CI(!$jg z>5hsd+R0pW)gId8wf|E6wEQwdcbG$HH?-|y>*abv5U)gu_ zTGK^(#rmtACNl=u?e$?22RLKxbYMsuXbT!^1eIBR17&_Luq>Zwnw2~daqhbJtRUaf zAy~yCuY)Eex+2v>cK|1xX_}Z!uWF`RpsAN)e?zd{AkHTn43`)8Ff)zaSfhMySeAJ+ z`#qa}(nsy`BOM&U_xj+dvR*!cnt55Y^sQHFoK(m!m4c+&(3Zza9E(@`E~&BxM=8{T z;5Od$IUf6pxQUw)!aZMOR)%3F2|}N?mwH4|pTt9l+(<-@kLh6-Tj@)U@yDrty@bxj z3~k6nP3pP@tFBj2wSMy}FUz#(z%!^z*S)!}7!DtQ4q`mLvVT^t(bW>^!ZIQF@!Fg0 z9hTMn%~L7q`0tUv?N(;^r>xHt7NZ0UOpG-T1~{>Q8*fxUJ`f%6xN4KTF6Q|GdGXAP z)8S$-9= zshcm^tI37Ewq6PF{F2K*F;F23@~pG^C3p|L77$`I-YtDfxTELxW_gnguA}@MUP|#@ zN;!z`{yGXK<#ZgDKTEu5%?LYRpLETkh0j-$Irjc?&b?wf3~Y#j7*mNVZ_n3e@X}!{ z0uVNY(OBYK|LXgDDom|Mcl6~^mtc01` z^*=aQCVUkBWOa|YROK*oUEew8r%~frl-T8Y|H#rKK7H;Mrzkb=QqJs6$-xJfA#<`< ze7wD9<@z_cK=1yBcn>Nyx3rvY^7|1*axSSQANKl>E0cX#o7R?odWs(IvO0{)g2xA| zrW@o-pi&H`y7is1nM|*j!vZRgnP0yT)AB+wT^4cI3yhTsK0l8PR#I`=ScsZ}f6#L7 z%pXo3UgL2@cT5l_W}z!7x44#C+wKKbaYPB!$)l%T>k#sTBQTt!pIY8`obEj7u*oTA zmS`9jayvWB1trCUfo@CpkCjCC-G0b<6vWjxU%(Q8`FnA;{SwcL{_@Mnrw55c92Wd* zp{~i0kvO_-G5ycHWwo)sshn$~BOUro?lsUo3l*gX$NNSCVCp zZg3`$r>QYT1u0}kUNl+)B;o3NW0O8d#|5Ge1yidzEYz{_+`c!5l`;}@{z zuCF?nD{>#6VX8i;QKDuJEuY)iQV~T-j--cSF(Cp?V<{s}-TZ6PZAY_E{MY>kJjL_% z6k%^+SUmFwSG5*?ay;P?bIATeG4b-g1PM&hus9K((jZi5-T1gRk!U3C=b8_yhK<$< ztbsw#YM)sbv!7#VZvRZ?x&P(HAi<#NQF@1>3vdGYt@>mvFcr|@wF*DrY91eq5) zy*Qjjt-xMWQ636GVhzjygou~L}y1O2!C#s>5^e5?)*^BN}%etVy8#R z`lzPZ_kV3c1$1&3;|RX1RTXU|7L#e^ta&dKX78SMZbU_r;qI$Xu2~Te-4_h=G0+XF z?9nmSbUXj)qptHFFGp3-eCjkm6y$P>A9#kXbtFir#A_e6c-adJlZ) ztS7zQ?OWY4FTFuboRlDZNo#!Ll1_J#`G^PQ&>*Lv##n06A%*{f>j{8aD+%N2bUHpu z$%|PZX22{VGUcfqft*7ti0#T>12fO-Nxi!%ZpweotsqI88f@lI8eCH74k8D*#2NK7 zlI9rKd)}A4k-ml0LngS<{&Mmsl`tG7q|!Oqx2v7~b8s78i7iiNs&xIw72)B9Fqb^9VIge*+mtO9b*(} zkP+pm>_eb06r`emiN1*qn3`D2vV761h9449)Y4zW`7Z5=45;qux~q_*`JgPjFtx_FkTX;l8+B!|C|A_hD*-9X7&0){a>Jjtv zbUmCkZT^!CHbMn^x(8zrw*oOV07`I0bp^Ppf|7>4k}^V75upN?hbtoBaBSbI)_)m% b{XD&HhyQ;AbFoVt%>bAgSsB*qqvQV#KZ+Yf diff --git a/src/components/views/auth/CountryDropdown.js b/src/components/views/auth/CountryDropdown.js index 14a974668b..37b1967c48 100644 --- a/src/components/views/auth/CountryDropdown.js +++ b/src/components/views/auth/CountryDropdown.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import * as sdk from '../../../index'; -import { COUNTRIES } from '../../../phonenumber'; +import {COUNTRIES, getEmojiFlag} from '../../../phonenumber'; import SdkConfig from "../../../SdkConfig"; import { _t } from "../../../languageHandler"; @@ -80,7 +80,7 @@ export default class CountryDropdown extends React.Component { } _flagImgForIso2(iso2) { - return ; + return

    ; } _getShortOption(iso2) { diff --git a/src/phonenumber.js b/src/phonenumber.ts similarity index 98% rename from src/phonenumber.js rename to src/phonenumber.ts index 3b7e4ba4f1..5806bfae00 100644 --- a/src/phonenumber.js +++ b/src/phonenumber.ts @@ -25,10 +25,20 @@ const PHONE_NUMBER_REGEXP = /^[0-9 -.]+$/; * a national-format number. * @return True if the number could be a valid phone number, otherwise false. */ -export function looksValid(phoneNumber) { +export function looksValid(phoneNumber: string) { return PHONE_NUMBER_REGEXP.test(phoneNumber); } +// Regional Indicator Symbol Letter A +const UNICODE_BASE = 127462 - 'A'.charCodeAt(0); +// Country code should be exactly 2 uppercase characters +const COUNTRY_CODE_REGEX = /^[A-Z]{2}$/; + +export const getEmojiFlag = (countryCode: string) => { + if (!COUNTRY_CODE_REGEX.test(countryCode)) return ''; + return String.fromCodePoint(...countryCode.split('').map(l => UNICODE_BASE + l.charCodeAt(0))); +}; + export const COUNTRIES = [ { "iso2": "GB", From 1a713119d869da930ff8c352b07f4160d96d6e3b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 May 2020 22:04:37 +0100 Subject: [PATCH 211/319] Add Kosovo as it is understood by google's libphonenumber Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/phonenumber.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/phonenumber.ts b/src/phonenumber.ts index 5806bfae00..fd189f8d39 100644 --- a/src/phonenumber.ts +++ b/src/phonenumber.ts @@ -635,6 +635,11 @@ export const COUNTRIES = [ "name": "Kiribati", "prefix": "686", }, + { + "iso2": "XK", + "name": "Kosovo", + "prefix": "383", + }, { "iso2": "KW", "name": "Kuwait", From 3fa13d7de3eb2b22fd665a87a10f78e91f40c73e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 May 2020 10:23:53 +0100 Subject: [PATCH 212/319] Add comment for the regex Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index 3fa6c0d7ee..133a2708dc 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -995,6 +995,7 @@ export const Commands = [ args: " ", runFn: function(_, args) { if (args) { + // matches the first whitespace delimited group and then the rest of the string const matches = args.match(/^(\S+?)(?: +(.*))?$/s); if (matches) { const [userId, msg] = matches.slice(1); From 99aeb8388db698ecdd3db80e1ace3fb4e0e41af8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 May 2020 10:29:06 +0100 Subject: [PATCH 213/319] Update src/phonenumber.ts Co-authored-by: Travis Ralston --- src/phonenumber.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/phonenumber.ts b/src/phonenumber.ts index fd189f8d39..6dd44a3c12 100644 --- a/src/phonenumber.ts +++ b/src/phonenumber.ts @@ -36,6 +36,7 @@ const COUNTRY_CODE_REGEX = /^[A-Z]{2}$/; export const getEmojiFlag = (countryCode: string) => { if (!COUNTRY_CODE_REGEX.test(countryCode)) return ''; + // Rip the country code out of the emoji and use that return String.fromCodePoint(...countryCode.split('').map(l => UNICODE_BASE + l.charCodeAt(0))); }; From 7c9a9b223acfb225e800b6fb878e5d917077a561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Mon, 11 May 2020 17:01:36 +0000 Subject: [PATCH 214/319] Translated using Weblate (Czech) Currently translated at 93.5% (2154 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 4de5084106..d08ac6c0f5 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2237,5 +2237,14 @@ "Waiting for you to accept on your other session…": "Čekáme na vaše přijetí v druhé relaci…", "Almost there! Is your other session showing the same shield?": "Téměř hotovo! Je vaše druhá relace také ověřená?", "Almost there! Is %(displayName)s showing the same shield?": "Téměř hotovo! Je relace %(displayName)s také ověřená?", - "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Ověřili jste %(deviceName)s (%(deviceId)s)!" + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Ověřili jste %(deviceName)s (%(deviceId)s)!", + "If you cancel now, you won't complete your operation.": "Pokud teď akci stornujete, nebudete jí moci dokončit.", + "Review where you’re logged in": "Zobrazit kde jste přihlášení", + "New login. Was this you?": "Nové přihlášní. Jste to vy?", + "%(name)s is requesting verification": "%(name)s žádá o ověření", + "Failed to set topic": "Nepovedlo se nastavit téma", + "Command failed": "Příkaz selhal", + "Could not find user in room": "Nepovedlo se najít uživatele v místnosti", + "Please supply a widget URL or embed code": "Zadejte prosím URL widgetu nebo jeho kód", + "Send a bug report with logs": "Zaslat hlášení o chybě" } From 49375436480f04c6df0395b2199a4afe7226b282 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Mon, 11 May 2020 16:11:46 +0000 Subject: [PATCH 215/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2303 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 5e63974d12..4d270260fc 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -489,7 +489,7 @@ "Skip": "Preterpasi", "An error occurred: %(error_string)s": "Okazis eraro: %(error_string)s", "This will be your account name on the homeserver, or you can pick a different server.": "Tio ĉi estos la nomo de via konto sur la hejmservilo , aŭ vi povas elekti alian servilon.", - "Blacklist": "Malpermesi legadon de ĉifritaj mesaĝoj", + "Blacklist": "Malpermesi malĉifradon", "Unverify": "Malkontroli", "If you already have a Matrix account you can log in instead.": "Se vi jam havas Matrix-konton, vi povas saluti anstataŭe.", "Private Chat": "Privata babilo", @@ -664,7 +664,7 @@ "File to import": "Enportota dosiero", "Import": "Enporti", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Forigo de fenestraĵo efektiviĝos por ĉiuj uzantoj en ĉi tiu ĉambro. Ĉu vi certe volas ĝin forigi?", - "Unblacklist": "Repermesi legadon de ĉifritaj mesaĝoj", + "Unblacklist": "Repermesi malĉifradon", "none": "neniu", "The version of Riot.im": "Tiu ĉi versio de Riot.im", "Your language of choice": "Via preferata lingvo", @@ -883,7 +883,7 @@ "Language and region": "Lingvo kaj regiono", "Theme": "Haŭto", "General": "Ĝenerala", - "In reply to ": "Respondante al ", + "In reply to ": "Responde al ", "Share Message": "Diskonigi", "Whether or not you're logged in (we don't record your username)": "Ĉu vi salutis aŭ ne (ni ne registras vian uzantonomon)", "You do not have permission to start a conference call in this room": "Vi ne havas permeson komenci grupvokon en ĉi tiu ĉambro", From dba98e17da693b4c4a4277059fed1cb6b905542e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 11 May 2020 19:30:04 +0000 Subject: [PATCH 216/319] Translated using Weblate (Estonian) Currently translated at 44.5% (1024 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 71 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index e2d4e93e43..95096a080d 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -238,7 +238,7 @@ "Remove %(name)s from the directory?": "Eemalda %(name)s kataloogist?", "Remove from Directory": "Eemalda kataloogist", "remove %(name)s from the directory.": "eemalda %(name)s kataloogist.", - "You seem to be uploading files, are you sure you want to quit?": "Tundub, et sa parasjagu laed faile üles, kas sa kindlasti soovid väljuda?", + "You seem to be uploading files, are you sure you want to quit?": "Tundub, et sa parasjagu laed faile üles. Kas sa kindlasti soovid väljuda?", "Failed to set direct chat tag": "Otsevestluse sildi lisamine ei õnnestunud", "Failed to remove tag %(tagName)s from room": "Sildi %(tagName)s eemaldamine jututoast ebaõnnestus", "Calls": "Kõned", @@ -543,7 +543,7 @@ "Start a conversation with someone using their name, username (like ) or email address.": "Alusta vestlust kasutades teise osapoole nime, kasutajanime (näiteks ) või e-posti aadressi.", "Go": "Mine", "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Sinu sõnumit ei saadetud, kuna see koduserver on saavutanud igakuise aktiivsete kasutajate piiri. Teenuse kasutamiseks palun võta ühendust serveri haldajaga.", - "Add room": "LIsa jututuba", + "Add room": "Lisa jututuba", "%(senderName)s invited %(targetName)s.": "%(senderName)s kutsus vestlema kasutajat %(targetName)s.", "%(targetName)s joined the room.": "%(targetName)s liitus jututoaga.", "%(senderName)s answered the call.": "%(senderName)s vastas kõnele.", @@ -961,5 +961,70 @@ "Previous/next room or DM": "Eelmine/järgmine otsevestlus või jututuba", "Toggle the top left menu": "Lülita ülemine vasak menüü sisse/välja", "Activate selected button": "Aktiveeri valitud nupp", - "Toggle right panel": "Lülita parem paan sisse/välja" + "Toggle right panel": "Lülita parem paan sisse/välja", + "%(count)s of your messages have not been sent.|other": "Mõned sinu sõnumid on saatmata.", + "%(count)s of your messages have not been sent.|one": "Sinu sõnum on saatmata.", + "You seem to be in a call, are you sure you want to quit?": "Tundub, et sul parasjagu on kõne pooleli. Kas sa kindlasti soovid väljuda?", + "Unknown room %(roomId)s": "Tundmatu jututuba %(roomId)s", + "Room": "Jututuba", + "Failed to reject invite": "Kutse tagasilükkamine ei õnnestunud", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Üritasin laadida teatud hetke selle jututoa ajajoonelt, kuid sul ei ole õigusi selle sõnumi nägemiseks.", + "Failed to load timeline position": "Asukoha laadimine ajajoonel ei õnnestunud", + " (1/%(totalCount)s)": " (1/%(totalCount)s)", + "Guest": "Külaline", + "Uploading %(filename)s and %(count)s others|other": "Laen üles %(filename)s ning %(count)s muud faili", + "Uploading %(filename)s and %(count)s others|zero": "Laen üles %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Laen üles %(filename)s ning veel %(count)s faili", + "Verify this login": "Verifitseeri see sisselogimissessioon", + "Session verified": "Sessioon on verifitseeritud", + "Failed to send email": "E-kirja saatmine ebaõnnestus", + "The email address linked to your account must be entered.": "Sa pead sisestama oma kontoga seotud e-posti aadressi.", + "A new password must be entered.": "Palun sisesta uus salasõna.", + "New passwords must match each other.": "Uued salasõnad peavad omavahel klappima.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Salasõna muutmine tühistab kõik läbiva krüptimise võtmed sinu kõikides sessioonides ning seega muutub kogu sinu vestluste ajalugu loetamatuks. Palun kindlasti kas sea üles võtmete varundamine või ekspordi mõnest muust sessioonist jututubade võtmed enne senise salasõna tühistamist.", + "Your Matrix account on %(serverName)s": "Sinu Matrix'i konto serveris %(serverName)s", + "Your Matrix account on ": "Sinu Matrix'i kasutajakonto serveris ", + "This homeserver does not support login using email address.": "See koduserver ei võimalda e-posti aadressi kasutamist sisselogimisel.", + "Please contact your service administrator to continue using this service.": "Jätkamaks selle teenuse kasutamist palun võta ühendust oma teenuse haldajaga.", + "This account has been deactivated.": "See kasutajakonto on deaktiveeritud.", + "Incorrect username and/or password.": "Vigane kasutajanimi ja/või salasõna.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Sa kasutad sisselogimiseks serverit %(hs)s, mitte aga matrix.org'i.", + "Failed to perform homeserver discovery": "Koduserveri leidmine ebaõnnestus", + "The phone number entered looks invalid": "Sisestatud telefoninumber tundub vigane", + "This homeserver doesn't offer any login flows which are supported by this client.": "See koduserver ei paku ühtegi sisselogimislahendust, mida see klient toetab.", + "Error: Problem communicating with the given homeserver.": "Viga: Suhtlusel koduserveriga tekkis probleem.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Kui aadressiribal on HTTPS-aadress, siis HTTP-protokolli kasutades ei saa ühendust koduserveriga. Palun pruugi HTTPS-protokolli või luba brauseris ebaturvaliste skriptide kasutamine.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Ei sa ühendust koduserveriga. Palun kontrolli, et sinu koduserveri SSL sertifikaat oleks usaldusväärne ning mõni brauseri lisamoodul ei blokeeri päringuid.", + "Syncing...": "Sünkroniseerin...", + "Signing In...": "Login sisse...", + "Create account": "Loo kasutajakonto", + "Failed to fetch avatar URL": "Ei õnnestunud laadida profiilipildi ehk avatari aadressi", + "Upload an avatar:": "Lae üles profiilipilt ehk avatar:", + "Unable to query for supported registration methods.": "Ei õnnestunud pärida toetatud registreerimismeetodite loendit.", + "Registration has been disabled on this homeserver.": "Väline registreerimine ei ole selles koduserveris kasutusel.", + "This server does not support authentication with a phone number.": "See server ei toeta autentimist telefoninumbri alusel.", + "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Sinu uus kasutajakonto (%(newAccountId)s) on registreeritud, kuid sa jube oled sisse loginud teise kasutajakontoga (%(loggedInUserId)s).", + "Continue with previous account": "Jätka senise konto kasutamist", + "Log in to your new account.": "Logi sisse oma uuele kasutajakontole.", + "Registration Successful": "Registreerimine õnnestus", + "Create your account": "Loo endale konto", + "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Kinnita oma isikusamasust verifitseerides seda sisselogimissessiooni mõnest oma muust sessioonist. Sellega tagad ka ligipääsu krüptitud sõnumitele.", + "This requires the latest Riot on your other devices:": "Selleks on sul vaja muudes seadmetes kõige uuemat Riot'i versiooni:", + "You're signed out": "Sa oled loginud välja", + "Clear personal data": "Kustuta privaatsed andmed", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Hoiatus: Sinu privaatsed andmed (sealhulgas krüptimisvõtmed) on jätkuvalt salvestatud selles sessioonis. Eemalda nad, kui oled lõpetanud selle sessiooni kasutamise või soovid sisse logida muu kasutajakontoga.", + "Commands": "Käsud", + "Results from DuckDuckGo": "Otsingutulemused DuckDuckGo saidist", + "DuckDuckGo Results": "DuckDuckGo otsingutulemused", + "Emoji": "Emoji", + "Notify the whole room": "Teavita kogu jututuba", + "Users": "Kasutajad", + "unknown device": "tundmatu seade", + "NOT verified": "EI OLE verifitseeritud", + "verified": "verifitseeritud", + "Verification": "Verifitseerimine", + "Ed25519 fingerprint": "Ed25519 sõrmejälg", + "User ID": "Kasutajatunnus", + "Algorithm": "Algoritm", + "unencrypted": "krüptimata" } From 1f603090bee9e19b8bd6c7d853e4f6c61280713a Mon Sep 17 00:00:00 2001 From: Samu Voutilainen Date: Tue, 12 May 2020 04:38:12 +0000 Subject: [PATCH 217/319] Translated using Weblate (Finnish) Currently translated at 90.7% (2088 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 8135462d60..e8eef891be 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2157,5 +2157,15 @@ "Syncing...": "Synkronoidaan...", "Signing In...": "Kirjaudutaan sisään...", "If you've joined lots of rooms, this might take a while": "Jos olet liittynyt moniin huoneisiin, tässä voi kestää hetken", - "Use your other device to continue…": "Jatka toisella laitteellasi…" + "Use your other device to continue…": "Jatka toisella laitteellasi…", + "Click the button below to confirm adding this email address.": "Klikkaa alapuolella olevaa painiketta lisätäksesi tämän sähköpostiosoitteen.", + "Click the button below to confirm adding this phone number.": "Klikkaa alapuolella olevaa painiketta lisätäksesi tämän puhelinnumeron.", + "If you cancel now, you won't complete your operation.": "Jos peruutat, toimintoa ei suoriteta loppuun.", + "Review where you’re logged in": "Tarkasta missä olet sisäänkirjautuneena", + "New login. Was this you?": "Uusi sisäänkirjautuminen. Olitko se sinä?", + "%(name)s is requesting verification": "%(name)s pyytää varmennusta", + "Sends a message as html, without interpreting it as markdown": "Lähettää viestin HTML-muodossa, tulkitsematta sitä Markdowniksi", + "Please supply a widget URL or embed code": "Anna sovelman osoite tai upotettava koodinpätkä", + "You signed in to a new session without verifying it:": "Olet kirjautunut uuteen istuntoon varmentamatta sitä:", + "Verify your other session using one of the options below.": "Varmenna toinen istuntosi käyttämällä yhtä seuraavista tavoista." } From ca30cf7ac9a38452ed79972fa536d968959fadbf Mon Sep 17 00:00:00 2001 From: Iria_kuro Date: Mon, 11 May 2020 11:10:34 +0000 Subject: [PATCH 218/319] Translated using Weblate (Korean) Currently translated at 76.1% (1752 of 2303 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ko/ --- src/i18n/strings/ko.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 4271864216..cb8fb17da3 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -523,7 +523,7 @@ "Invite to this room": "이 방에 초대", "You cannot delete this message. (%(code)s)": "이 메시지를 삭제할 수 없습니다. (%(code)s)", "Thursday": "목요일", - "I understand the risks and wish to continue": "위험을 인지하고 계속하고 싶습니다", + "I understand the risks and wish to continue": "위험하다는 것을 이해했으며 계속하고 싶습니다", "Back": "돌아가기", "Failed to change settings": "설정 변경 실패", "Show message in desktop notification": "컴퓨터 알림에서 내용 보이기", @@ -1799,5 +1799,7 @@ "Session already verified!": "이미 검증된 세션입니다!", "WARNING: Session already verified, but keys do NOT MATCH!": "경고: 이미 검증된 세션이지만 키가 일치하지 않습니다!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "경고: 키 검증 실패! 제공된 키인 \"%(fingerprint)s\"가 사용자 %(userId)s와 %(deviceId)s 세션의 서명 키인 \"%(fprint)s\"와 일치하지 않습니다. 이는 통신이 탈취되고 있는 중일 수도 있다는 뜻입니다!", - "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "사용자 %(userId)s의 세션 %(deviceId)s에서 받은 서명 키와 당신이 제공한 서명 키가 일치합니다. 세션이 검증되었습니다." + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "사용자 %(userId)s의 세션 %(deviceId)s에서 받은 서명 키와 당신이 제공한 서명 키가 일치합니다. 세션이 검증되었습니다.", + "Show more": "더 보기", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 변경한다면 방의 암호화 키를 내보낸 후 다시 가져오지 않는 이상 모든 종단간 암호화 키는 초기화 될 것이고, 암호화된 대화 내역은 읽을 수 없게 될 것입니다. 이 문제는 추후에 개선될 것입니다." } From 3e3d537fecb3a989a120ca9372795dc594278970 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 May 2020 10:51:27 +0100 Subject: [PATCH 219/319] Fix topic dialog not supporting escape as it didn't have a "Close" Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index bd7e60e2f4..0ea068d389 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -365,6 +365,7 @@ export const Commands = [ Modal.createTrackedDialog('Slash Commands', 'Topic', InfoDialog, { title: room.name, description:
    , + hasCloseButton: true, }); return success(); }, From 7fe40a04701bdd0163359bd02f5cd786b4ed6cfc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 May 2020 10:55:46 +0100 Subject: [PATCH 220/319] Default to public room when creating room from room directory Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MatrixChat.tsx | 6 +++--- src/components/structures/RoomDirectory.js | 5 ++++- src/components/views/dialogs/CreateRoomDialog.js | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 3929711406..e553057acb 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -623,7 +623,7 @@ export default class MatrixChat extends React.PureComponent { break; } case 'view_create_room': - this.createRoom(); + this.createRoom(payload.public); break; case 'view_create_group': { const CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog"); @@ -1012,9 +1012,9 @@ export default class MatrixChat extends React.PureComponent { }).close; } - private async createRoom() { + private async createRoom(defaultPublic = false) { const CreateRoomDialog = sdk.getComponent('dialogs.CreateRoomDialog'); - const modal = Modal.createTrackedDialog('Create Room', '', CreateRoomDialog); + const modal = Modal.createTrackedDialog('Create Room', '', CreateRoomDialog, { defaultPublic }); const [shouldCreate, opts] = await modal.finished; if (shouldCreate) { diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 0b07c10c8a..86353cd532 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -367,7 +367,10 @@ export default createReactClass({ onCreateRoomClick: function(room) { this.props.onFinished(); - dis.dispatch({action: 'view_create_room'}); + dis.dispatch({ + action: 'view_create_room', + public: true, + }); }, showRoomAlias: function(alias, autoJoin=false) { diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 74e006354b..fb08afa5f7 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -30,12 +30,13 @@ export default createReactClass({ displayName: 'CreateRoomDialog', propTypes: { onFinished: PropTypes.func.isRequired, + defaultPublic: PropTypes.bool, }, getInitialState() { const config = SdkConfig.get(); return { - isPublic: false, + isPublic: this.props.defaultPublic || false, isEncrypted: true, name: "", topic: "", From 5c0920da425a13e5b7d72461baab383266d61a0a Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 May 2020 11:05:30 +0100 Subject: [PATCH 221/319] Avoid soft crash if unknown device in verification Rageshakes from the wild indicate that device was null here which implies that we somehow did not know about the device when verifiying it? Log and null-check to avoid a soft crash. --- .../views/right_panel/EncryptionPanel.js | 5 +-- .../views/right_panel/VerificationPanel.js | 32 ++++++++++++++----- .../views/verification/VerificationShowSas.js | 7 ++-- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index bc580c767b..e9f94729fa 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -45,9 +45,6 @@ const EncryptionPanel = (props) => { } }, [verificationRequest]); - const deviceId = request && request.channel.deviceId; - const device = MatrixClientPeg.get().getStoredDevice(MatrixClientPeg.get().getUserId(), deviceId); - useEffect(() => { async function awaitPromise() { setRequesting(true); @@ -143,7 +140,7 @@ const EncryptionPanel = (props) => { key={request.channel.transactionId} inDialog={layout === "dialog"} phase={phase} - device={device} /> + /> ); } }; diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 67efd29d27..ff3700e143 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -17,6 +17,7 @@ limitations under the License. import React from "react"; import PropTypes from "prop-types"; +import {MatrixClientPeg} from "../../../MatrixClientPeg"; import * as sdk from '../../../index'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {SCAN_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @@ -161,6 +162,11 @@ export default class VerificationPanel extends React.PureComponent { this.state.reciprocateQREvent.cancel(); }; + _getDevice() { + const deviceId = this.props.request && this.props.request.channel.deviceId; + return MatrixClientPeg.get().getStoredDevice(MatrixClientPeg.get().getUserId(), deviceId); + } + renderQRReciprocatePhase() { const {member, request} = this.props; let Button; @@ -217,16 +223,26 @@ export default class VerificationPanel extends React.PureComponent { } } - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - const description = request.isSelfVerification ? - _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", { - deviceName: this.props.device.getDisplayName(), - deviceId: this.props.device.deviceId, - }): - _t("You've successfully verified %(displayName)s!", { + let description; + if (request.isSelfVerification) { + const device = this._getDevice(); + if (!device) { + // This shouldn't happen, although rageshake would indicate that it is: log a warn + // and leave the message slightly broken (avoid adding a translatable string for a + // case that shouldn't be happening). + console.warn("Verified device we don't know about: " + this.props.request.channel.deviceId); + } + description = _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", { + deviceName: device ? device.getDisplayName() : '', + deviceId: this.props.request.channel.deviceId, + }); + } else { + description = _t("You've successfully verified %(displayName)s!", { displayName: member.displayName || member.name || member.userId, }); + } + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); return (

    {_t("Verified")}

    @@ -297,12 +313,12 @@ export default class VerificationPanel extends React.PureComponent { const emojis = this.state.sasEvent ? : ; return

    {_t("Compare emoji")}

    diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index edf860c4c2..251c8ca04f 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -30,6 +30,7 @@ export default class VerificationShowSas extends React.Component { static propTypes = { pending: PropTypes.bool, displayName: PropTypes.string, // required if pending is true + device: PropTypes.object, onDone: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, sas: PropTypes.object.isRequired, @@ -116,9 +117,11 @@ export default class VerificationShowSas extends React.Component { let text; if (this.state.pending) { if (this.props.isSelf) { + // device shouldn't be null in this situation but it seems like it can be, so show + // slightly broken text rather than soft-crashing (we've already logged in VerificationPanel). text = _t("Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", { - deviceName: this.props.device.getDisplayName(), - deviceId: this.props.device.deviceId, + deviceName: this.props.device ? this.props.device.getDisplayName() : '', + deviceId: this.props.device ? this.props.device.deviceId : '', }); } else { const {displayName} = this.props; From 3c5c7f56f3f4fffa08a17ee53402abc49250b1d6 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 May 2020 11:14:05 +0100 Subject: [PATCH 222/319] Adjust comment --- src/components/views/right_panel/VerificationPanel.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index ff3700e143..76507d8d4f 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -227,9 +227,9 @@ export default class VerificationPanel extends React.PureComponent { if (request.isSelfVerification) { const device = this._getDevice(); if (!device) { - // This shouldn't happen, although rageshake would indicate that it is: log a warn - // and leave the message slightly broken (avoid adding a translatable string for a - // case that shouldn't be happening). + // This can happen if the device is logged out while we're still showing verification + // UI for it. + // Leave the message slightly broken for this edge case (avoid adding a translatable string) console.warn("Verified device we don't know about: " + this.props.request.channel.deviceId); } description = _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", { From ae2645b69ba5ec7b7a5dea0561021e5ee9da5741 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 May 2020 12:42:16 +0100 Subject: [PATCH 223/319] Provide separate translatable for case where we have no device --- .../views/right_panel/VerificationPanel.js | 11 ++++++----- .../views/verification/VerificationShowSas.js | 16 ++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 76507d8d4f..6bb2d3646b 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -229,13 +229,14 @@ export default class VerificationPanel extends React.PureComponent { if (!device) { // This can happen if the device is logged out while we're still showing verification // UI for it. - // Leave the message slightly broken for this edge case (avoid adding a translatable string) console.warn("Verified device we don't know about: " + this.props.request.channel.deviceId); + description = _t("You've successfully verified your device!"); + } else { + description = _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", { + deviceName: device ? device.getDisplayName() : '', + deviceId: this.props.request.channel.deviceId, + }); } - description = _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", { - deviceName: device ? device.getDisplayName() : '', - deviceId: this.props.request.channel.deviceId, - }); } else { description = _t("You've successfully verified %(displayName)s!", { displayName: member.displayName || member.name || member.userId, diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 251c8ca04f..09374b91af 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -117,12 +117,16 @@ export default class VerificationShowSas extends React.Component { let text; if (this.state.pending) { if (this.props.isSelf) { - // device shouldn't be null in this situation but it seems like it can be, so show - // slightly broken text rather than soft-crashing (we've already logged in VerificationPanel). - text = _t("Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", { - deviceName: this.props.device ? this.props.device.getDisplayName() : '', - deviceId: this.props.device ? this.props.device.deviceId : '', - }); + // device shouldn't be null in this situation but it can be, eg. if the device is + // logged out during verification + if (this.props.device) { + text = _t("Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", { + deviceName: this.props.device ? this.props.device.getDisplayName() : '', + deviceId: this.props.device ? this.props.device.deviceId : '', + }); + } else { + text = _t("Waiting for your other session to verify…"); + } } else { const {displayName} = this.props; text = _t("Waiting for %(displayName)s to verify…", {displayName}); From 8a1b38163583d4bfe0d36510e83cecfc23fc7533 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 12 May 2020 14:29:11 +0200 Subject: [PATCH 224/319] remove UI for upgrading 4S to sym enc --- src/DeviceListener.js | 8 ------- .../views/settings/CrossSigningPanel.js | 8 ------- .../views/toasts/SetupEncryptionToast.js | 24 ------------------- 3 files changed, 40 deletions(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index d2ba8219db..27caba971e 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -225,14 +225,6 @@ export default class DeviceListener { }); } } - } else if (await cli.secretStorageKeyNeedsUpgrade()) { - ToastStore.sharedInstance().addOrReplaceToast({ - key: THIS_DEVICE_TOAST_KEY, - title: _t("Encryption upgrade available"), - icon: "verification_warning", - props: {kind: 'upgrade_ssss'}, - component: sdk.getComponent("toasts.SetupEncryptionToast"), - }); } else { // cross-signing is ready, and we don't need to upgrade encryption ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY); diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index cb04d2a018..c2c16615be 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -36,7 +36,6 @@ export default class CrossSigningPanel extends React.PureComponent { userSigningPrivateKeyCached: false, sessionBackupKeyCached: false, secretStorageKeyInAccount: false, - secretStorageKeyNeedsUpgrade: null, }; } @@ -88,7 +87,6 @@ export default class CrossSigningPanel extends React.PureComponent { const homeserverSupportsCrossSigning = await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"); const crossSigningReady = await cli.isCrossSigningReady(); - const secretStorageKeyNeedsUpgrade = await cli.secretStorageKeyNeedsUpgrade(); this.setState({ crossSigningPublicKeysOnDevice, @@ -100,7 +98,6 @@ export default class CrossSigningPanel extends React.PureComponent { secretStorageKeyInAccount, homeserverSupportsCrossSigning, crossSigningReady, - secretStorageKeyNeedsUpgrade, }); } @@ -150,7 +147,6 @@ export default class CrossSigningPanel extends React.PureComponent { secretStorageKeyInAccount, homeserverSupportsCrossSigning, crossSigningReady, - secretStorageKeyNeedsUpgrade, } = this.state; let errorSection; @@ -259,10 +255,6 @@ export default class CrossSigningPanel extends React.PureComponent { {_t("Homeserver feature support:")} {homeserverSupportsCrossSigning ? _t("exists") : _t("not found")} - - {_t("Secret Storage key format:")} - {secretStorageKeyNeedsUpgrade ? _t("outdated") : _t("up to date")} - {errorSection} diff --git a/src/components/views/toasts/SetupEncryptionToast.js b/src/components/views/toasts/SetupEncryptionToast.js index 75fd55378c..b5510e85b6 100644 --- a/src/components/views/toasts/SetupEncryptionToast.js +++ b/src/components/views/toasts/SetupEncryptionToast.js @@ -17,7 +17,6 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import Modal from '../../../Modal'; -import { MatrixClientPeg } from '../../../MatrixClientPeg'; import * as sdk from "../../../index"; import { _t } from '../../../languageHandler'; import DeviceListener from '../../../DeviceListener'; @@ -31,7 +30,6 @@ export default class SetupEncryptionToast extends React.PureComponent { 'set_up_encryption', 'verify_this_session', 'upgrade_encryption', - 'upgrade_ssss', ]).isRequired, }; @@ -39,24 +37,6 @@ export default class SetupEncryptionToast extends React.PureComponent { DeviceListener.sharedInstance().dismissEncryptionSetup(); }; - async _waitForCompletion() { - if (this.props.kind === 'upgrade_ssss') { - return new Promise(resolve => { - const recheck = async () => { - const needsUpgrade = await MatrixClientPeg.get().secretStorageKeyNeedsUpgrade(); - if (!needsUpgrade) { - MatrixClientPeg.get().removeListener('accountData', recheck); - resolve(); - } - }; - MatrixClientPeg.get().on('accountData', recheck); - recheck(); - }); - } else { - return; - } - } - _onSetupClick = async () => { if (this.props.kind === "verify_this_session") { Modal.createTrackedDialog('Verify session', 'Verify session', SetupEncryptionDialog, @@ -68,7 +48,6 @@ export default class SetupEncryptionToast extends React.PureComponent { ); try { await accessSecretStorage(); - await this._waitForCompletion(); } finally { modal.close(); } @@ -82,8 +61,6 @@ export default class SetupEncryptionToast extends React.PureComponent { return _t('Verify yourself & others to keep your chats safe'); case 'verify_this_session': return _t('Other users may not trust it'); - case 'upgrade_ssss': - return _t('Update your secure storage'); } } @@ -92,7 +69,6 @@ export default class SetupEncryptionToast extends React.PureComponent { case 'set_up_encryption': return _t('Set up'); case 'upgrade_encryption': - case 'upgrade_ssss': return _t('Upgrade'); case 'verify_this_session': return _t('Verify'); From b3c641184ba5b66706b808fa34088e91cd1b4d90 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 12 May 2020 14:54:49 +0200 Subject: [PATCH 225/319] remove obsolete strings --- src/i18n/strings/en_EN.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a24b2bde73..1d86947177 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -566,7 +566,6 @@ "Review": "Review", "Verify yourself & others to keep your chats safe": "Verify yourself & others to keep your chats safe", "Other users may not trust it": "Other users may not trust it", - "Update your secure storage": "Update your secure storage", "Set up": "Set up", "Upgrade": "Upgrade", "Verify": "Verify", @@ -618,9 +617,6 @@ "in account data": "in account data", "Homeserver feature support:": "Homeserver feature support:", "exists": "exists", - "Secret Storage key format:": "Secret Storage key format:", - "outdated": "outdated", - "up to date": "up to date", "Your homeserver does not support session management.": "Your homeserver does not support session management.", "Unable to load session list": "Unable to load session list", "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Confirm deleting these sessions by using Single Sign On to prove your identity.", From a000be2b018d8f250f32530e5447962d52ed055c Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 May 2020 14:03:40 +0100 Subject: [PATCH 226/319] i18n --- src/i18n/strings/en_EN.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 27b4252f77..72cb0e20d8 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -492,6 +492,7 @@ "Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.", "Unable to find a supported verification method.": "Unable to find a supported verification method.", "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", + "Waiting for your other session to verify…": "Waiting for your other session to verify…", "Waiting for %(displayName)s to verify…": "Waiting for %(displayName)s to verify…", "Cancelling…": "Cancelling…", "They match": "They match", @@ -1278,6 +1279,7 @@ "Yes": "Yes", "Verify all users in a room to ensure it's secure.": "Verify all users in a room to ensure it's secure.", "In encrypted rooms, verify all users to ensure it’s secure.": "In encrypted rooms, verify all users to ensure it’s secure.", + "You've successfully verified your device!": "You've successfully verified your device!", "You've successfully verified %(deviceName)s (%(deviceId)s)!": "You've successfully verified %(deviceName)s (%(deviceId)s)!", "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", "Verified": "Verified", From 03b10e7226e819ba869b622a08601e7243f4981d Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 May 2020 15:21:44 +0100 Subject: [PATCH 227/319] Fix sign in / up links on previewed rooms They errored because the out-of-band data was assumed to be non-null, but that's only present for 3rd party invites. --- src/components/views/rooms/RoomPreviewBar.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index 85c41f30ec..fe7c57d811 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -266,9 +266,9 @@ export default createReactClass({ params: { email: this.props.invitedEmail, signurl: this.props.signUrl, - room_name: this.props.oobData.room_name, - room_avatar_url: this.props.oobData.avatarUrl, - inviter_name: this.props.oobData.inviterName, + room_name: this.props.oobData ? this.props.oobData.room_name : null, + room_avatar_url: this.props.oobData ? this.props.oobData.avatarUrl : null, + inviter_name: this.props.oobData ? this.props.oobData.inviterName : null, } }; }, From 004f75f289e1a9343400f57e44a1d42198fc1f45 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 May 2020 16:16:47 +0100 Subject: [PATCH 228/319] Rename `trash (custom).svg` as electron doesn't like serving files with spaces Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/messages/_RedactedBody.scss | 2 +- .../feather-customised/{trash (custom).svg => trash.custom.svg} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename res/img/feather-customised/{trash (custom).svg => trash.custom.svg} (100%) diff --git a/res/css/views/messages/_RedactedBody.scss b/res/css/views/messages/_RedactedBody.scss index 9ba35d7297..e4ab0c0835 100644 --- a/res/css/views/messages/_RedactedBody.scss +++ b/res/css/views/messages/_RedactedBody.scss @@ -24,7 +24,7 @@ limitations under the License. height: 14px; width: 14px; background-color: $muted-fg-color; - mask-image: url('$(res)/img/feather-customised/trash (custom).svg'); + mask-image: url('$(res)/img/feather-customised/trash.custom.svg'); mask-repeat: no-repeat; mask-position: center; mask-size: contain; diff --git a/res/img/feather-customised/trash (custom).svg b/res/img/feather-customised/trash.custom.svg similarity index 100% rename from res/img/feather-customised/trash (custom).svg rename to res/img/feather-customised/trash.custom.svg From c0632d01956bfc39fa2aac3b7618550b47272ccb Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 12 May 2020 17:17:17 -0600 Subject: [PATCH 229/319] Acquire a new session before enacting deactivation Fixes https://github.com/vector-im/riot-web/issues/13645 Every time the checkbox value changes we acquire a new session now. This avoids us asking the server to change its direction partway through the request. This causes a bit of UI jerk as the dialog goes from auth -> loading -> auth, however it's better than the alternative of reworking the entire UIA structure to support the `authData` dict changing. Originally this commit consisted of a `disabled` flag on the `InteractiveAuth` component which carried through to the stage's component, however it turns out that stack doesn't respect changes to the `authData` prop, which means the session ID we eventually send down is wrong (`erase: false` instead of the one with `erase: true`). Therefore, we do some logic to ensure we remount `InteractiveAuth` completely. Further work in this area is described in https://github.com/vector-im/riot-web/issues/13646 --- .../views/dialogs/DeactivateAccountDialog.js | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index b269ec2fdb..d84042011d 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -34,6 +34,7 @@ export default class DeactivateAccountDialog extends React.Component { shouldErase: false, errStr: null, authData: null, // for UIA + authEnabled: true, // see usages for information // A few strings that are passed to InteractiveAuth for design or are displayed // next to the InteractiveAuth component. @@ -42,21 +43,7 @@ export default class DeactivateAccountDialog extends React.Component { continueKind: null, }; - MatrixClientPeg.get().deactivateAccount(null, false).then(r => { - // If we got here, oops. The server didn't require any auth. - // Our application lifecycle will catch the error and do the logout bits. - // We'll try to log something in an vain attempt to record what happened (storage - // is also obliterated on logout). - console.warn("User's account got deactivated without confirmation: Server had no auth"); - this.setState({errStr: _t("Server did not require any authentication")}); - }).catch(e => { - if (e && e.httpStatus === 401 && e.data) { - // Valid UIA response - this.setState({authData: e.data}); - } else { - this.setState({errStr: _t("Server did not return valid authentication information.")}); - } - }); + this._initAuth(/* shouldErase= */false); } _onStagePhaseChange = (stage, phase) => { @@ -124,13 +111,40 @@ export default class DeactivateAccountDialog extends React.Component { _onEraseFieldChange = (ev) => { this.setState({ shouldErase: ev.target.checked, + + // Disable the auth form because we're going to have to reinitialize the auth + // information. We do this because we can't modify the parameters in the UIA + // session, and the user will have selected something which changes the request. + // Therefore, we throw away the last auth session and try a new one. + authEnabled: false, }); + + // As mentioned above, set up for auth again to get updated UIA session info + this._initAuth(/* shouldErase= */ev.target.checked); }; _onCancel() { this.props.onFinished(false); } + _initAuth(shouldErase) { + MatrixClientPeg.get().deactivateAccount(null, shouldErase).then(r => { + // If we got here, oops. The server didn't require any auth. + // Our application lifecycle will catch the error and do the logout bits. + // We'll try to log something in an vain attempt to record what happened (storage + // is also obliterated on logout). + console.warn("User's account got deactivated without confirmation: Server had no auth"); + this.setState({errStr: _t("Server did not require any authentication")}); + }).catch(e => { + if (e && e.httpStatus === 401 && e.data) { + // Valid UIA response + this.setState({authData: e.data, authEnabled: true}); + } else { + this.setState({errStr: _t("Server did not return valid authentication information.")}); + } + }); + }; + render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); @@ -142,7 +156,7 @@ export default class DeactivateAccountDialog extends React.Component { } let auth =
    {_t("Loading...")}
    ; - if (this.state.authData) { + if (this.state.authData && this.state.authEnabled) { auth = (
    {this.state.bodyText} From 5e86dc2d60cf0a3b9bbfef6baabc23aafb2cccb6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 12 May 2020 17:20:11 -0600 Subject: [PATCH 230/319] Update i18n strings --- src/i18n/strings/en_EN.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b2fe409aa5..30e033bb43 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1589,13 +1589,13 @@ "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. ": "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. ", "Incompatible Database": "Incompatible Database", "Continue With Encryption Disabled": "Continue With Encryption Disabled", - "Server did not require any authentication": "Server did not require any authentication", - "Server did not return valid authentication information.": "Server did not return valid authentication information.", "Confirm your account deactivation by using Single Sign On to prove your identity.": "Confirm your account deactivation by using Single Sign On to prove your identity.", "Are you sure you want to deactivate your account? This is irreversible.": "Are you sure you want to deactivate your account? This is irreversible.", "Confirm account deactivation": "Confirm account deactivation", "To continue, please enter your password:": "To continue, please enter your password:", "There was a problem communicating with the server. Please try again.": "There was a problem communicating with the server. Please try again.", + "Server did not require any authentication": "Server did not require any authentication", + "Server did not return valid authentication information.": "Server did not return valid authentication information.", "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. This action is irreversible.": "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. This action is irreversible.", "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.", "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.": "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.", From 6d90a9d1a31170e497609eee9519ffd12ceff0af Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 12 May 2020 17:20:26 -0600 Subject: [PATCH 231/319] Appease the linter --- src/components/views/dialogs/DeactivateAccountDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index d84042011d..ffef2a30c7 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -143,7 +143,7 @@ export default class DeactivateAccountDialog extends React.Component { this.setState({errStr: _t("Server did not return valid authentication information.")}); } }); - }; + } render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); From 5029c3f1434b33fe8b4aae825f5f3e03d4425dc0 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 13 May 2020 02:16:43 +0100 Subject: [PATCH 232/319] Implement IRC draggable display name width --- res/css/views/rooms/_IRCLayout.scss | 23 +++-- src/components/structures/MessagePanel.js | 7 ++ src/components/structures/ScrollPanel.js | 6 ++ src/components/views/elements/Draggable.tsx | 84 ++++++++++++++++++ .../views/elements/ErrorBoundary.js | 2 +- .../elements/IRCTimelineProfileResizer.tsx | 86 +++++++++++++++++++ src/settings/Settings.js | 7 ++ 7 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 src/components/views/elements/Draggable.tsx create mode 100644 src/components/views/elements/IRCTimelineProfileResizer.tsx diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 301f712ffb..159cfc0aad 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -14,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -$name-width: 70px; $icon-width: 14px; $timestamp-width: 45px; $right-padding: 5px; $irc-line-height: $font-18px; .mx_IRCLayout { + --name-width: 70px; line-height: $irc-line-height !important; @@ -48,7 +48,7 @@ $irc-line-height: $font-18px; > .mx_SenderProfile { order: 2; flex-shrink: 0; - width: $name-width; + width: var(--name-width); text-overflow: ellipsis; text-align: right; display: flex; @@ -122,7 +122,7 @@ $irc-line-height: $font-18px; .mx_EventTile_emote { > .mx_EventTile_avatar { - margin-left: calc($name-width + $icon-width + $right-padding); + margin-left: calc(var(--name-width) + $icon-width + $right-padding); } } @@ -132,7 +132,7 @@ $irc-line-height: $font-18px; .mx_EventListSummary { > .mx_EventTile_line { - padding-left: calc($name-width + $icon-width + $timestamp-width + 3 * $right-padding); // 15 px of padding + padding-left: calc(var(--name-width) + $icon-width + $timestamp-width + 3 * $right-padding); // 15 px of padding } .mx_EventListSummary_avatars { @@ -143,12 +143,12 @@ $irc-line-height: $font-18px; .mx_EventTile.mx_EventTile_info { .mx_EventTile_avatar { - left: calc($name-width + 10px + $icon-width); + left: calc(var(--name-width) + 10px + $icon-width); top: 0; } .mx_EventTile_line { - left: calc($name-width + 10px + $icon-width); + left: calc(var(--name-width) + 10px + $icon-width); } .mx_TextualEvent { @@ -198,7 +198,16 @@ $irc-line-height: $font-18px; margin: 0; .mx_SenderProfile { width: unset; - max-width: $name-width; + max-width: var(--name-width); } } + + .mx_ProfileResizer { + position: absolute; + height: 100%; + width: 15px; + left: calc(80px + var(--name-width)); + cursor: col-resize; + z-index: 100; + } } diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index f46df0175a..1c10efb346 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -29,6 +29,7 @@ import SettingsStore from '../../settings/SettingsStore'; import {_t} from "../../languageHandler"; import {haveTileForEvent} from "../views/rooms/EventTile"; import {textForEvent} from "../../TextForEvent"; +import IRCTimelineProfileResizer from "../views/elements/IRCTimelineProfileResizer"; const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes const continuedTypes = ['m.sticker', 'm.room.message']; @@ -819,6 +820,11 @@ export default class MessagePanel extends React.Component { ); } + let ircResizer = null; + if (this.state.useIRCLayout) { + ircResizer = ; + } + return ( { topSpinner } { this._getEventTiles() } diff --git a/src/components/structures/ScrollPanel.js b/src/components/structures/ScrollPanel.js index 4f44c1a169..cb0114b243 100644 --- a/src/components/structures/ScrollPanel.js +++ b/src/components/structures/ScrollPanel.js @@ -144,6 +144,11 @@ export default createReactClass({ /* resizeNotifier: ResizeNotifier to know when middle column has changed size */ resizeNotifier: PropTypes.object, + + /* fixedChildren: allows for children to be passed which are rendered outside + * of the wrapper + */ + fixedChildren: PropTypes.node, }, getDefaultProps: function() { @@ -881,6 +886,7 @@ export default createReactClass({ return ( + { this.props.fixedChildren }
      { this.props.children } diff --git a/src/components/views/elements/Draggable.tsx b/src/components/views/elements/Draggable.tsx new file mode 100644 index 0000000000..98f86fd524 --- /dev/null +++ b/src/components/views/elements/Draggable.tsx @@ -0,0 +1,84 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; + +interface IProps { + className: string, + dragFunc: (currentLocation: ILocationState, event: MouseEvent) => ILocationState, + onMouseUp: (event: MouseEvent) => void, +} + +interface IState { + onMouseMove: (event: MouseEvent) => void, + onMouseUp: (event: MouseEvent) => void, + location: ILocationState, +} + +export interface ILocationState { + currentX: number, + currentY: number, +} + +export default class Draggable extends React.Component { + + constructor(props: IProps) { + super(props); + + this.state = { + onMouseMove: this.onMouseMove.bind(this), + onMouseUp: this.onMouseUp.bind(this), + location: { + currentX: 0, + currentY: 0, + }, + }; + } + + private onMouseDown = (event: MouseEvent): void => { + this.setState({ + location: { + currentX: event.clientX, + currentY: event.clientY, + }, + }); + + document.addEventListener("mousemove", this.state.onMouseMove); + document.addEventListener("mouseup", this.state.onMouseUp); + console.log("Mouse down") + } + + private onMouseUp = (event: MouseEvent): void => { + document.removeEventListener("mousemove", this.state.onMouseMove); + document.removeEventListener("mouseup", this.state.onMouseUp); + this.props.onMouseUp(event); + console.log("Mouse up") + } + + private onMouseMove(event: MouseEvent): void { + console.log("Mouse Move") + const newLocation = this.props.dragFunc(this.state.location, event); + + this.setState({ + location: newLocation, + }); + } + + render() { + return
      + } + +} \ No newline at end of file diff --git a/src/components/views/elements/ErrorBoundary.js b/src/components/views/elements/ErrorBoundary.js index a043b350ab..1abd11f838 100644 --- a/src/components/views/elements/ErrorBoundary.js +++ b/src/components/views/elements/ErrorBoundary.js @@ -73,7 +73,7 @@ export default class ErrorBoundary extends React.PureComponent { if (this.state.error) { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const newIssueUrl = "https://github.com/vector-im/riot-web/issues/new"; - return
      + return

      {_t("Something went wrong!")}

      {_t( diff --git a/src/components/views/elements/IRCTimelineProfileResizer.tsx b/src/components/views/elements/IRCTimelineProfileResizer.tsx new file mode 100644 index 0000000000..80a86b2005 --- /dev/null +++ b/src/components/views/elements/IRCTimelineProfileResizer.tsx @@ -0,0 +1,86 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; +import Draggable, {ILocationState} from './Draggable'; + +interface IProps { + // Current room + roomId: string, + minWidth: number, + maxWidth: number, +}; + +interface IState { + width: number, + IRCLayoutRoot: HTMLElement, +}; + +export default class IRCTimelineProfileResizer extends React.Component { + constructor(props: IProps) { + super(props); + + this.state = { + width: SettingsStore.getValue("ircDisplayNameWidth", this.props.roomId), + IRCLayoutRoot: null, + } + }; + + componentDidMount() { + this.setState({ + IRCLayoutRoot: document.querySelector(".mx_IRCLayout") as HTMLElement, + }, () => this.updateCSSWidth(this.state.width)) + } + + private dragFunc = (location: ILocationState, event: React.MouseEvent): ILocationState => { + const offset = event.clientX - location.currentX; + const newWidth = this.state.width + offset; + + console.log({offset}) + // If we're trying to go smaller than min width, don't. + if (this.state.width <= this.props.minWidth && offset <= 0) { + return location; + } + + if (this.state.width >= this.props.maxWidth && offset >= 0) { + return location; + } + + this.setState({ + width: newWidth, + }); + + this.updateCSSWidth.bind(this)(newWidth); + + return { + currentX: event.clientX, + currentY: location.currentY, + } + } + + private updateCSSWidth(newWidth: number) { + this.state.IRCLayoutRoot.style.setProperty("--name-width", newWidth + "px"); + } + + private onMoueUp(event: MouseEvent) { + SettingsStore.setValue("ircDisplayNameWidth", this.props.roomId, SettingLevel.ROOM_DEVICE, this.state.width); + } + + render() { + return + } +}; \ No newline at end of file diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 032b0ee906..6d741ba3a5 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -531,4 +531,11 @@ export const SETTINGS = { MatrixClient.prototype.setCryptoTrustCrossSignedDevices, true, ), }, + "ircDisplayNameWidth": { + // We specifically want to have room-device > device so that users may set a device default + // with a per-room override. + supportedLevels: ['room-device', 'device'], + displayName: _td("IRC display name width"), + default: 80, + }, }; From d8b6b7b976607d697125b4bdfa5c30b2912edf1c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 May 2020 06:24:04 +0100 Subject: [PATCH 233/319] Pass screenAfterLogin through SSO in the callback url Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/BasePlatform.js | 14 ++++++-------- src/components/structures/MatrixChat.tsx | 9 ++++++++- src/components/structures/auth/Login.js | 7 +++++-- src/components/structures/auth/SoftLogout.js | 4 +++- src/components/views/auth/Welcome.js | 3 ++- src/components/views/elements/SSOButton.js | 5 +++-- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/BasePlatform.js b/src/BasePlatform.js index 7214031586..8a950dc2e3 100644 --- a/src/BasePlatform.js +++ b/src/BasePlatform.js @@ -167,13 +167,9 @@ export default class BasePlatform { setLanguage(preferredLangs: string[]) {} - getSSOCallbackUrl(hsUrl: string, isUrl: string): URL { + getSSOCallbackUrl(hsUrl: string, isUrl: string, fragmentAfterLogin: string): URL { const url = new URL(window.location.href); - // XXX: at this point, the fragment will always be #/login, which is no - // use to anyone. Ideally, we would get the intended fragment from - // MatrixChat.screenAfterLogin so that you could follow #/room links etc - // through an SSO login. - url.hash = ""; + url.hash = fragmentAfterLogin || ""; url.searchParams.set("homeserver", hsUrl); url.searchParams.set("identityServer", isUrl); return url; @@ -183,9 +179,11 @@ export default class BasePlatform { * Begin Single Sign On flows. * @param {MatrixClient} mxClient the matrix client using which we should start the flow * @param {"sso"|"cas"} loginType the type of SSO it is, CAS/SSO. + * @param {string} fragmentAfterLogin the hash to pass to the app during sso callback. */ - startSingleSignOn(mxClient: MatrixClient, loginType: "sso"|"cas") { - const callbackUrl = this.getSSOCallbackUrl(mxClient.getHomeserverUrl(), mxClient.getIdentityServerUrl()); + startSingleSignOn(mxClient: MatrixClient, loginType: "sso" | "cas", fragmentAfterLogin: string) { + const callbackUrl = this.getSSOCallbackUrl(mxClient.getHomeserverUrl(), mxClient.getIdentityServerUrl(), + fragmentAfterLogin); window.location.href = mxClient.getSsoLoginUrl(callbackUrl.toString(), loginType); // redirect to SSO } diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 3929711406..8ff8abb190 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1973,6 +1973,11 @@ export default class MatrixChat extends React.PureComponent { render() { // console.log(`Rendering MatrixChat with view ${this.state.view}`); + let fragmentAfterLogin = ""; + if (this.props.initialScreenAfterLogin) { + fragmentAfterLogin = `/${this.props.initialScreenAfterLogin.screen}`; + } + let view; if (this.state.view === Views.LOADING) { @@ -2052,7 +2057,7 @@ export default class MatrixChat extends React.PureComponent { } } else if (this.state.view === Views.WELCOME) { const Welcome = sdk.getComponent('auth.Welcome'); - view = ; + view = ; } else if (this.state.view === Views.REGISTER) { const Registration = sdk.getComponent('structures.auth.Registration'); view = ( @@ -2091,6 +2096,7 @@ export default class MatrixChat extends React.PureComponent { defaultDeviceDisplayName={this.props.defaultDeviceDisplayName} onForgotPasswordClick={this.onForgotPasswordClick} onServerConfigChange={this.onServerConfigChange} + fragmentAfterLogin={fragmentAfterLogin} {...this.getServerProperties()} /> ); @@ -2100,6 +2106,7 @@ export default class MatrixChat extends React.PureComponent { ); } else { diff --git a/src/components/structures/auth/Login.js b/src/components/structures/auth/Login.js index 5d3cb69417..e65a223bd6 100644 --- a/src/components/structures/auth/Login.js +++ b/src/components/structures/auth/Login.js @@ -355,7 +355,8 @@ export default createReactClass({ ev.preventDefault(); ev.stopPropagation(); const ssoKind = step === 'm.login.sso' ? 'sso' : 'cas'; - PlatformPeg.get().startSingleSignOn(this._loginLogic.createTemporaryClient(), ssoKind); + PlatformPeg.get().startSingleSignOn(this._loginLogic.createTemporaryClient(), ssoKind, + this.props.fragmentAfterLogin); } else { // Don't intercept - just go through to the register page this.onRegisterClick(ev); @@ -628,7 +629,9 @@ export default createReactClass({ + loginType={loginType} + fragmentAfterLogin={this.props.fragmentAfterLogin} + />

      ); }, diff --git a/src/components/structures/auth/SoftLogout.js b/src/components/structures/auth/SoftLogout.js index 08ab7e8a61..ede1041f8a 100644 --- a/src/components/structures/auth/SoftLogout.js +++ b/src/components/structures/auth/SoftLogout.js @@ -244,7 +244,9 @@ export default class SoftLogout extends React.Component {

      {introText}

      + loginType={this.state.loginView === LOGIN_VIEW.CAS ? "cas" : "sso"} + fragmentAfterLogin={this.props.fragmentAfterLogin} + />
      ); } diff --git a/src/components/views/auth/Welcome.js b/src/components/views/auth/Welcome.js index 7cbcf65d3c..91ba368f70 100644 --- a/src/components/views/auth/Welcome.js +++ b/src/components/views/auth/Welcome.js @@ -45,7 +45,8 @@ export default class Welcome extends React.PureComponent { idBaseUrl: isUrl, }); const plaf = PlatformPeg.get(); - const callbackUrl = plaf.getSSOCallbackUrl(tmpClient.getHomeserverUrl(), tmpClient.getIdentityServerUrl()); + const callbackUrl = plaf.getSSOCallbackUrl(tmpClient.getHomeserverUrl(), tmpClient.getIdentityServerUrl(), + this.props.fragmentAfterLogin); return ( diff --git a/src/components/views/elements/SSOButton.js b/src/components/views/elements/SSOButton.js index 3e0757924b..1126ae3cd7 100644 --- a/src/components/views/elements/SSOButton.js +++ b/src/components/views/elements/SSOButton.js @@ -21,9 +21,9 @@ import PlatformPeg from "../../../PlatformPeg"; import AccessibleButton from "./AccessibleButton"; import {_t} from "../../../languageHandler"; -const SSOButton = ({matrixClient, loginType, ...props}) => { +const SSOButton = ({matrixClient, loginType, fragmentAfterLogin, ...props}) => { const onClick = () => { - PlatformPeg.get().startSingleSignOn(matrixClient, loginType); + PlatformPeg.get().startSingleSignOn(matrixClient, loginType, fragmentAfterLogin); }; return ( @@ -36,6 +36,7 @@ const SSOButton = ({matrixClient, loginType, ...props}) => { SSOButton.propTypes = { matrixClient: PropTypes.object.isRequired, // does not use context as may use a temporary client loginType: PropTypes.oneOf(["sso", "cas"]), // defaults to "sso" in base-apis + fragmentAfterLogin: PropTypes.string, }; export default SSOButton; From 52e3c97f8c9a2032fe92b2b4bb5fc68c0f6957b5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Wed, 13 May 2020 06:36:14 +0100 Subject: [PATCH 234/319] Revert "ImageView make clicking off it easier" --- res/css/views/elements/_ImageView.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index 983ef074f2..0a4ed2a194 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -37,7 +37,7 @@ limitations under the License. order: 2; /* min-width hack needed for FF */ min-width: 0px; - max-height: 90%; + height: 90%; flex: 15 15 0; display: flex; align-items: center; From 73a6fed1e32594bd7fad4c98684bbc76cbd44978 Mon Sep 17 00:00:00 2001 From: tleydxdy Date: Tue, 12 May 2020 23:11:03 +0000 Subject: [PATCH 235/319] Translated using Weblate (Chinese (Simplified)) Currently translated at 61.7% (1424 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 4eff773d1c..dc3cc6d176 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -1443,5 +1443,30 @@ "Verifies a user, session, and pubkey tuple": "验证用户、会话和公钥元组", "Unknown (user, session) pair:": "未知(用户、会话)对:", "Session already verified!": "会话已验证!", - "WARNING: Session already verified, but keys do NOT MATCH!": "警告:会话已验证,但密钥不匹配!" + "WARNING: Session already verified, but keys do NOT MATCH!": "警告:会话已验证,但密钥不匹配!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 的会话 %(deviceId)s 的签名密钥为 %(fprint)s,与提供的密钥 %(fingerprint)s 不符。这可能表示您的通讯已被截获!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "您提供的签名密钥与您从 %(userId)s 的会话 %(deviceId)s 获取的一致。该会话被标为已验证。", + "Sends the given message coloured as a rainbow": "以彩虹色发送给定消息", + "Sends the given emote coloured as a rainbow": "以彩虹色发送给定表情符号", + "Displays list of commands with usages and descriptions": "显示指令清单与其描述和用法", + "Displays information about a user": "显示关于用户的信息", + "Send a bug report with logs": "发送带日志的错误报告", + "Opens chat with the given user": "与指定用户发起聊天", + "Sends a message to the given user": "向指定用户发消息", + "%(senderName)s made no change.": "%(senderName)s 未做出变更。", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s 将聊天室名称从 %(oldRoomName)s 改为 %(newRoomName)s。", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s 为此聊天室添加备用地址 %(addresses)s。", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s 为此聊天室添加了备用地址 %(addresses)s。", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s 为此聊天室移除了备用地址 %(addresses)s。", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s 为此聊天室移除了备用地址 %(addresses)s。", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s 更改了此聊天室的备用地址。", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s 更改了此聊天室的主地址与备用地址。", + "%(senderName)s changed the addresses for this room.": "%(senderName)s 更改了此聊天室的地址。", + "%(senderName)s placed a voice call.": "%(senderName)s 发起了语音通话。", + "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s 发起了语音通话。(此浏览器不支持)", + "%(senderName)s placed a video call.": "%(senderName)s 发起了视频通话。", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s 发起了视频通话。(此浏览器不支持)", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s 移除了禁止匹配 %(glob)s 的用户的规则", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s 移除了禁止匹配 %(glob)s 的服务器的规则", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s 移除了禁止匹配 %(glob)s 的规则" } From 52dec0cc8d871f271f7433036007d015e59f1eb8 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 13 May 2020 03:42:53 +0000 Subject: [PATCH 236/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2307 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index ba8ffa0fcb..257b245e1c 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2421,5 +2421,9 @@ "Verify your other session using one of the options below.": "使用下方的其中一個選項來驗證您其他的工作階段。", "Invite someone using their name, username (like ), email address or share this room.": "使用某人的名字、使用者名稱(如 )、電子郵件地址或分享此聊天室來邀請他們。", "Message deleted": "訊息已刪除", - "Message deleted by %(name)s": "訊息已被 %(name)s 刪除" + "Message deleted by %(name)s": "訊息已被 %(name)s 刪除", + "Opens chat with the given user": "開啟與指定使用者的聊天", + "Sends a message to the given user": "傳送訊息給指定的使用者", + "Waiting for your other session to verify…": "正在等待您的其他工作階段進行驗證……", + "You've successfully verified your device!": "您已成功驗證您的裝置!" } From 42eb36d6287d0bc0c3ffd3e51f3292b83c9cd397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Tue, 12 May 2020 17:30:23 +0000 Subject: [PATCH 237/319] Translated using Weblate (Czech) Currently translated at 95.2% (2197 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 45 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index d08ac6c0f5..3b018204c0 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2246,5 +2246,48 @@ "Command failed": "Příkaz selhal", "Could not find user in room": "Nepovedlo se najít uživatele v místnosti", "Please supply a widget URL or embed code": "Zadejte prosím URL widgetu nebo jeho kód", - "Send a bug report with logs": "Zaslat hlášení o chybě" + "Send a bug report with logs": "Zaslat hlášení o chybě", + "You signed in to a new session without verifying it:": "Přihlásili jste se do nové relace, ale neoveřili jste ji:", + "Verify your other session using one of the options below.": "Ověřte ostatní relací jedním z následujících způsobů.", + "Enable cross-signing to verify per-user instead of per-session": "Povolit cross-signing - ověřování uživatelů místo oveřování jednotlivých relací", + "Keep recovery passphrase in memory for this session": "V této relaci si heslo pro obnovení zálohy zapamatovat", + "Click the button below to confirm deleting these sessions.|other": "Zmáčknutím tlačítka potvrdíte smazání těchto relací.", + "Click the button below to confirm deleting these sessions.|one": "Zmáčknutím tlačítka potvrdíte smazání této relace.", + "Delete sessions|other": "Smazat relace", + "Delete sessions|one": "Smazat relaci", + "Where you’re logged in": "Kde jste přihlášení", + "You've successfully verified your device!": "Úspěšně jste ověřili vaše zařízení!", + "Start verification again from the notification.": "Začít proces ověření znovu pomocí notifikace.", + "Start verification again from their profile.": "Začít proces ověření znovu z jejich profilu.", + "Verification timed out.": "Ověření vypršelo.", + "You cancelled verification on your other session.": "Na druhé relace jste proces ověření zrušili.", + "%(displayName)s cancelled verification.": "%(displayName)s zrušil/a proces ověření.", + "You cancelled verification.": "Zrušili jste proces ověření.", + "Message deleted": "Zpráva smazána", + "Message deleted by %(name)s": "Zpráva smazána uživatelem %(name)s", + "Can't load this message": "Tuto zprávu nelze načíst", + "Submit logs": "Odeslat záznamy o chybě", + "Looks good": "To vypadá dobře", + "Can't find this server or its room list": "Server nebo jeho seznam místností se nepovedlo nalézt", + "All rooms": "Všechny místnosti", + "Your server": "Váš server", + "Are you sure you want to remove %(serverName)s": "Opravdu chcete odstranit %(serverName)s", + "Remove server": "Odstranit server", + "Matrix": "Matrix", + "Add a new server": "Přidat nový server", + "Enter the name of a new server you want to explore.": "Zadejte jméno serveru, který si chcete prohlédnout.", + "Server name": "Jméno serveru", + "Add a new server...": "Přidat nový server...", + "%(networkName)s rooms": "místnosti v %(networkName)s", + "Matrix rooms": "místnosti na Matrixu", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Připomínka: Váš prohlížeč není oficiálně podporován, tak se může Riot chovat nepředvídatelně.", + "Enable end-to-end encryption": "Povolit E2E šifrování", + "You can’t disable this later. Bridges & most bots won’t work yet.": "Už to v budoucnu nepůjde vypnout. Většina botů a propojení zatím nefunguje.", + "Server did not require any authentication": "Server nevyžadoval žádné ověření", + "Server did not return valid authentication information.": "Server neposkytl platné informace o ověření.", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Potvrďte deaktivaci účtu použtím Jednotného přihlášení.", + "Are you sure you want to deactivate your account? This is irreversible.": "Opravdu chcete deaktivovat účet? Je to nevratné.", + "Confirm account deactivation": "Potvrďte deaktivaci účtu", + "There was a problem communicating with the server. Please try again.": "Došlo k potížím při komunikaci se serverem. Zkuste to prosím znovu.", + "Start a conversation with someone using their name, username (like ) or email address.": "Začněte s někým konverzovat za pomocí jména, přihlašovacího jména (jako ) nebo emailu." } From 1cfdf7e56fc3b2f3a4efc8867c8906d3731541b4 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Tue, 12 May 2020 17:22:31 +0000 Subject: [PATCH 238/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2307 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 4d270260fc..9e8641a6e9 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -70,7 +70,7 @@ "Unable to create widget.": "Ne povas krei fenestraĵon.", "Failed to send request.": "Malsukcesis sendi peton.", "This room is not recognised.": "Ĉi tiu ĉambro ne estas rekonita.", - "Power level must be positive integer.": "Nivelo de potenco devas esti entjero pozitiva.", + "Power level must be positive integer.": "Povnivelo devas esti entjero pozitiva.", "You are not in this room.": "Vi ne estas en tiu ĉi ĉambro.", "You do not have permission to do that in this room.": "Vi ne havas permeson fari tion en tiu ĉambro.", "Missing room_id in request": "En peto mankas room_id", @@ -122,7 +122,7 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s videbligis estontan historion de la ĉambro al nekonata (%(visibility)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s al %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ŝanĝis la povnivelon de %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", "%(widgetName)s widget modified by %(senderName)s": "Fenestraĵon %(widgetName)s ŝanĝis %(senderName)s", "%(widgetName)s widget added by %(senderName)s": "Fenestraĵon %(widgetName)s aldonis %(senderName)s", @@ -212,8 +212,8 @@ "Failed to ban user": "Malsukcesis forbari uzanton", "Failed to mute user": "Malsukcesis silentigi uzanton", "Failed to toggle moderator status": "Malsukcesis baskuligi estrecon", - "Failed to change power level": "Malsukcesis ŝanĝi nivelon de potenco", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tiun ĉi ŝanĝon vi ne povos fareblos, ĉar vi donas al la uzanto la saman nivelon de potenco, kiun havas vi mem.", + "Failed to change power level": "Malsukcesis ŝanĝi povnivelon", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tiun ĉi ŝanĝon vi ne povos malfari, ĉar vi donas al la uzanto la saman povnivelon, kiun havas vi mem.", "Are you sure?": "Ĉu vi certas?", "Unignore": "Reatenti", "Ignore": "Malatenti", @@ -233,7 +233,7 @@ "and %(count)s others...|one": "kaj unu alia…", "Invited": "Invititaj", "Filter room members": "Filtri ĉambranojn", - "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (potenco je %(powerLevelNumber)s)", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (povnivelo je %(powerLevelNumber)s)", "Attachment": "Aldonaĵo", "Hangup": "Fini vokon", "Voice call": "Voĉvoko", @@ -275,7 +275,7 @@ "Search": "Serĉi", "Community Invites": "Komunumaj invitoj", "Invites": "Invitoj", - "Favourites": "Ŝatataj", + "Favourites": "Elstarigitaj", "Rooms": "Ĉambroj", "Low priority": "Malpli gravaj", "Historical": "Estintaj", @@ -291,7 +291,7 @@ "Banned users": "Forbaritaj uzantoj", "This room is not accessible by remote Matrix servers": "Ĉi tiu ĉambro ne atingeblas por foraj serviloj de Matrix", "Leave room": "Eliri ĉambron", - "Favourite": "Ŝatata", + "Favourite": "Elstarigi", "Guests cannot join this room even if explicitly invited.": "Gastoj ne povas aliĝi ĉi tiun ĉambron eĉ kun malimplica invito.", "Click here to fix": "Klaku ĉi tie por riparo", "Who can access this room?": "Kiu povas aliri ĉi tiun ĉambron?", @@ -509,7 +509,7 @@ "Failed to remove the room from the summary of %(groupId)s": "Malsukcesis forigi la ĉambron de la superrigardo de %(groupId)s", "The room '%(roomName)s' could not be removed from the summary.": "Ĉambro ;%(roomName)s' ne forigeblas de la superrigardo.", "Add users to the community summary": "Aldoni uzantojn al la komunuma superrigardo", - "Who would you like to add to this summary?": "Kiun vi ŝatus aldoni al tiu ĉi superrigardo?", + "Who would you like to add to this summary?": "Kiun vi volas aldoni al tiu ĉi superrigardo?", "Failed to add the following users to the summary of %(groupId)s:": "Malsukcesis aldoni la jenajn uzantojn al la superrigardo de %(groupId)s:", "Add a User": "Aldoni uzanton", "Failed to remove a user from the summary of %(groupId)s": "Malsukcesis forigi uzanton de la superrigardo de %(groupId)s", @@ -550,7 +550,7 @@ "Connectivity to the server has been lost.": "Konekto al la servilo perdiĝis.", "Sent messages will be stored until your connection has returned.": "Senditaj mesaĝoj konserviĝos ĝis via konekto refunkcios.", "Active call": "Aktiva voko", - "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Neniu alia ĉeestas! Ĉu vi ŝatus inviti aliajnĉesigi avertadon pri la malplena ĉambro?", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Neniu alia ĉeestas! Ĉu vi volas inviti aliajnĉesigi avertadon pri la malplena ĉambro?", "You seem to be uploading files, are you sure you want to quit?": "Ŝajne vi alŝutas dosierojn nun; ĉu vi tamen volas foriri?", "You seem to be in a call, are you sure you want to quit?": "Ŝajne vi vokas nun; ĉu vi tamen volas foriri?", "Search failed": "Serĉo malsukcesis", @@ -621,7 +621,7 @@ "This server does not support authentication with a phone number.": "Ĉi tiu servilo ne subtenas aŭtentikigon per telefona numero.", "Displays action": "Montras agon", "Bans user with given id": "Forbaras uzanton kun la donita identigilo", - "Define the power level of a user": "Difini la potencan nivelon de uzanto", + "Define the power level of a user": "Difini la povnivelon de uzanto", "Deops user with given id": "Senestrigas uzanton kun donita identigilo", "Invites user with given id to current room": "Invitas uzanton per identigilo al la nuna ĉambro", "Joins room with given alias": "Aliĝas al ĉambro per kromnomo", @@ -1477,7 +1477,7 @@ "Demote yourself?": "Ĉu malrangaltigi vin mem?", "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Vi ne povos malfari tiun ŝanĝon, ĉar vi malrangaltigas vin mem; se vi estas la lasta povohava uzanto en la ĉambro, estos neeble vian povon rehavi.", "Demote": "Malrangaltigi", - "Power level": "Povonivelo", + "Power level": "Povnivelo", "Use two-way text verification": "Uzi duflankan tekstan kontrolon", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Gradaltigo de ĉi tiu ĉambro bezonas fermi ĝin, kaj krei novan por anstataŭi ĝin. Por plejbonigi sperton de la ĉambranoj, ni:", "Invalid homeserver discovery response": "Nevalida eltrova respondo de hejmservilo", @@ -1571,10 +1571,10 @@ "Always show the window menu bar": "Ĉiam montri la fenestran menubreton", "Upgrade the room": "Gradaltigi la ĉambron", "Enable room encryption": "Ŝalti ĉifradon de la ĉambro", - "Error changing power level requirement": "Eraris ŝanĝo de postulo de potenconivelo", - "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "Eraris ŝanĝo de la postuloj de la ĉambro pri potenconivelo. Certigu, ke vi havas sufiĉajn permesojn, kaj reprovu.", - "Error changing power level": "Eraris ŝanĝo de potenconivelo", - "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Eraris ŝanĝo de potenconivelo de la uzanto. Certigu, ke vi havas sufiĉajn permesojn, kaj reprovu.", + "Error changing power level requirement": "Eraris ŝanĝo de postulo de povnivelo", + "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "Eraris ŝanĝo de la postuloj de la ĉambro pri povnivelo. Certigu, ke vi havas sufiĉajn permesojn, kaj reprovu.", + "Error changing power level": "Eraris ŝanĝo de povnivelo", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Eraris ŝanĝo de povnivelo de la uzanto. Certigu, ke vi havas sufiĉajn permesojn, kaj reprovu.", "Remove %(email)s?": "Ĉu forigi %(email)s?", "Remove %(phone)s?": "Ĉu forigi %(phone)s?", "No recent messages by %(user)s found": "Neniuj freŝaj mesaĝoj de %(user)s troviĝis", @@ -1965,7 +1965,7 @@ "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Uzu kunigilon (%(serverName)s) por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Uzu kunigilon por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", "Manage integrations": "Administri kunigojn", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Kunigiloj ricevas agordajn datumojn, kaj povas modifi fenestraĵojn, sendi invitojn al ĉambroj, kaj vianome agordi nivelojn de potenco.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Kunigiloj ricevas agordajn datumojn, kaj povas modifi fenestraĵojn, sendi invitojn al ĉambroj, kaj vianome agordi povnivelojn.", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Via pasvorto sukcese ŝanĝiĝis. Vi ne ricevados pasivajn sciigojn en aliaj salutaĵoj, ĝis vi ilin resalutos", "Error downloading theme information.": "Eraris elŝuto de informoj pri haŭto.", "Theme added!": "Haŭto aldoniĝis!", @@ -2396,5 +2396,9 @@ "Cancel replying to a message": "Nuligi respondon al mesaĝo", "Invite someone using their name, username (like ), email address or share this room.": "Invitu iun per ĝia nomo, uzantonomo (kiel ), retpoŝtadreso, aŭ kunhavigu la ĉambron.", "Message deleted": "Mesaĝo foriĝis", - "Message deleted by %(name)s": "Mesaĝon forigis %(name)s" + "Message deleted by %(name)s": "Mesaĝon forigis %(name)s", + "Opens chat with the given user": "Malfermas babilon kun la uzanto", + "Sends a message to the given user": "Sendas mesaĝon al la uzanto", + "Waiting for your other session to verify…": "Atendante kontrolon de via alia salutaĵo…", + "You've successfully verified your device!": "Vi sukcese kontrolis vian aparaton!" } From cad0f38d4d147e88ecfb5d2dc26d33c98e22740f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 12 May 2020 21:37:12 +0000 Subject: [PATCH 239/319] Translated using Weblate (Estonian) Currently translated at 45.0% (1037 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 95096a080d..cda3a5e76d 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1026,5 +1026,18 @@ "Ed25519 fingerprint": "Ed25519 sõrmejälg", "User ID": "Kasutajatunnus", "Algorithm": "Algoritm", - "unencrypted": "krüptimata" + "unencrypted": "krüptimata", + "Terms and Conditions": "Kasutustingimused", + "Logout": "Logi välja", + "Your Communities": "Sinu kogukonnad", + "Error whilst fetching joined communities": "Viga nende kogukondade laadimisel, millega sa oled liitunud", + "You have no visible notifications": "Sul ei ole nähtavaid teavitusi", + "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot'il ei õnnestunud koduserverist laadida toetatud protokollide loendit. Toetamaks kolmandate osapoolte võrke võib koduserver olla liiga vana.", + "Riot failed to get the public room list.": "Riot'il ei õnnestunud laadida avalike jututubade loendit.", + "The homeserver may be unavailable or overloaded.": "Koduserver pole kas saadaval või on üle koormatud.", + "Room not found": "Jututuba ei leidunud", + "Preview": "Eelvaade", + "View": "Näita", + "Message not sent due to unknown sessions being present": "Sõnum on saatmata, sest jutuoas on tundmatud sessioonid", + "You can't send any messages until you review and agree to our terms and conditions.": "Sa ei saa saata ühtego sõnumit enne, kui oled läbi lugenud ja nõustunud meie kasutustingimustega." } From be61968dcaa3b1f0b30581a98e8dbfd55738fcbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 13 May 2020 07:19:39 +0000 Subject: [PATCH 240/319] Translated using Weblate (French) Currently translated at 100.0% (2307 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 1756ff57ad..7546385bf6 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2422,5 +2422,9 @@ "Verify your other session using one of the options below.": "Vérifiez votre autre session en utilisant une des options ci-dessous.", "Invite someone using their name, username (like ), email address or share this room.": "Invitez quelqu’un en utilisant leur nom, leur nom d’utilisateur (comme ), leur adresse e-mail ou partagez ce salon.", "Message deleted": "Message supprimé", - "Message deleted by %(name)s": "Message supprimé par %(name)s" + "Message deleted by %(name)s": "Message supprimé par %(name)s", + "Opens chat with the given user": "Ouvre une discussion avec l’utilisateur fourni", + "Sends a message to the given user": "Envoie un message à l’utilisateur fourni", + "Waiting for your other session to verify…": "En attente de la vérification depuis votre autre session…", + "You've successfully verified your device!": "Vous avez bien vérifié votre appareil !" } From d11923e2e3d3f4189d8848349f0ec1073ea8f91e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 May 2020 10:38:32 +0100 Subject: [PATCH 241/319] Add new keyboard shortcuts for jump to unread and upload file Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/accessibility/KeyboardShortcuts.tsx | 41 +++++++++++++++---- src/components/structures/RoomView.js | 14 ++++++- src/components/views/rooms/MessageComposer.js | 13 +++++- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/accessibility/KeyboardShortcuts.tsx b/src/accessibility/KeyboardShortcuts.tsx index bcbf3d6810..f527ab4a14 100644 --- a/src/accessibility/KeyboardShortcuts.tsx +++ b/src/accessibility/KeyboardShortcuts.tsx @@ -34,6 +34,7 @@ export enum Categories { CALLS = "Calls", COMPOSER = "Composer", ROOM_LIST = "Room List", + ROOM = "Room", AUTOCOMPLETE = "Autocomplete", } @@ -142,6 +143,34 @@ const shortcuts: Record = { }, ], + [Categories.ROOM]: [ + { + keybinds: [{ + key: Key.PAGE_UP, + }, { + key: Key.PAGE_DOWN, + }], + description: _td("Scroll up/down in the timeline"), + }, { + keybinds: [{ + key: Key.ESCAPE, + }], + description: _td("Dismiss read marker and jump to bottom"), + }, { + keybinds: [{ + modifiers: [Modifiers.SHIFT], + key: Key.PAGE_UP, + }], + description: _td("Jump to oldest unread message"), + }, { + keybinds: [{ + modifiers: [CMD_OR_CTRL, Modifiers.SHIFT], + key: Key.U, + }], + description: _td("Upload a file"), + } + ], + [Categories.ROOM_LIST]: [ { keybinds: [{ @@ -181,13 +210,6 @@ const shortcuts: Record = { [Categories.NAVIGATION]: [ { - keybinds: [{ - key: Key.PAGE_UP, - }, { - key: Key.PAGE_DOWN, - }], - description: _td("Scroll up/down in the timeline"), - }, { keybinds: [{ modifiers: [Modifiers.ALT, Modifiers.SHIFT], key: Key.ARROW_UP, @@ -257,10 +279,11 @@ const shortcuts: Record = { const categoryOrder = [ Categories.COMPOSER, - Categories.CALLS, - Categories.ROOM_LIST, Categories.AUTOCOMPLETE, + Categories.ROOM, + Categories.ROOM_LIST, Categories.NAVIGATION, + Categories.CALLS, ]; interface IModal { diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index f53929df4a..e413c33efa 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -41,7 +41,7 @@ import * as ObjectUtils from '../../ObjectUtils'; import * as Rooms from '../../Rooms'; import eventSearch from '../../Searching'; -import {isOnlyCtrlOrCmdKeyEvent, Key} from '../../Keyboard'; +import {isOnlyCtrlOrCmdIgnoreShiftKeyEvent, isOnlyCtrlOrCmdKeyEvent, Key} from '../../Keyboard'; import MainSplit from './MainSplit'; import RightPanel from './RightPanel'; @@ -588,6 +588,18 @@ export default createReactClass({ handled = true; } break; + case Key.PAGE_UP: + if (!ev.altKey && !ev.ctrlKey && ev.shiftKey && !ev.metaKey) { + this.jumpToReadMarker(); + handled = true; + } + break; + case Key.U.toUpperCase(): + if (isOnlyCtrlOrCmdIgnoreShiftKeyEvent(ev) && ev.shiftKey) { + dis.dispatch({ action: "upload_file" }) + handled = true; + } + break; } if (handled) { diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 4749742a7d..1142e91057 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -114,8 +114,19 @@ class UploadButton extends React.Component { this.onUploadFileInputChange = this.onUploadFileInputChange.bind(this); this._uploadInput = createRef(); + this._dispatcherRef = dis.register(this.onAction); } + componentWillUnmount() { + dis.unregister(this._dispatcherRef); + } + + onAction = payload => { + if (payload.action === "upload_file") { + this.onUploadClick(); + } + }; + onUploadClick(ev) { if (MatrixClientPeg.get().isGuest()) { dis.dispatch({action: 'require_registration'}); @@ -128,7 +139,7 @@ class UploadButton extends React.Component { if (ev.target.files.length === 0) return; // take a copy so we can safely reset the value of the form control - // (Note it is a FileList: we can't use slice or sesnible iteration). + // (Note it is a FileList: we can't use slice or sensible iteration). const tfiles = []; for (let i = 0; i < ev.target.files.length; ++i) { tfiles.push(ev.target.files[i]); From 0e05e6db86467c730b853c8f8d7009f2a28d8e85 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 May 2020 10:40:23 +0100 Subject: [PATCH 242/319] i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/en_EN.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b2fe409aa5..d469103897 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2284,13 +2284,16 @@ "Cancel replying to a message": "Cancel replying to a message", "Toggle microphone mute": "Toggle microphone mute", "Toggle video on/off": "Toggle video on/off", + "Scroll up/down in the timeline": "Scroll up/down in the timeline", + "Dismiss read marker and jump to bottom": "Dismiss read marker and jump to bottom", + "Jump to oldest unread message": "Jump to oldest unread message", + "Upload a file": "Upload a file", "Jump to room search": "Jump to room search", "Navigate up/down in the room list": "Navigate up/down in the room list", "Select room from the room list": "Select room from the room list", "Collapse room list section": "Collapse room list section", "Expand room list section": "Expand room list section", "Clear room list filter field": "Clear room list filter field", - "Scroll up/down in the timeline": "Scroll up/down in the timeline", "Previous/next unread room or DM": "Previous/next unread room or DM", "Previous/next room or DM": "Previous/next room or DM", "Toggle the top left menu": "Toggle the top left menu", From d68b50feb6adbd751cb92bbb8705e76ab5e70b59 Mon Sep 17 00:00:00 2001 From: chagai95 <31655082+chagai95@users.noreply.github.com> Date: Wed, 13 May 2020 11:49:26 +0200 Subject: [PATCH 243/319] Updated link and added:Yarn two is not yet used. the link was broken and there was no mention of the version of yarn being used. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69aafeb724..ad886a9cb0 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Development Ensure you have the latest LTS version of Node.js installed. Using `yarn` instead of `npm` is recommended. Please see the Yarn [install -guide](https://yarnpkg.com/docs/install/) if you do not have it already. +guide](https://classic.yarnpkg.com/en/docs/install) to "Yarn 1" if you do not have it already. This project has not yet been migrated to Yarn 2, so please ensure yarn --version shows a version from the 1.x series. `matrix-react-sdk` depends on `matrix-js-sdk`. To make use of changes in the latter and to ensure tests run against the develop branch of `matrix-js-sdk`, From cda691e3596cbab3967967a06ab36877106791e0 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 13 May 2020 11:29:11 +0100 Subject: [PATCH 244/319] Tweak Yarn docs link post-review --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ad886a9cb0..5f5da9a40d 100644 --- a/README.md +++ b/README.md @@ -133,8 +133,10 @@ Development Ensure you have the latest LTS version of Node.js installed. -Using `yarn` instead of `npm` is recommended. Please see the Yarn [install -guide](https://classic.yarnpkg.com/en/docs/install) to "Yarn 1" if you do not have it already. This project has not yet been migrated to Yarn 2, so please ensure yarn --version shows a version from the 1.x series. +Using `yarn` instead of `npm` is recommended. Please see the Yarn 1 [install +guide](https://classic.yarnpkg.com/docs/install) if you do not have it +already. This project has not yet been migrated to Yarn 2, so please ensure +`yarn --version` shows a version from the 1.x series. `matrix-react-sdk` depends on `matrix-js-sdk`. To make use of changes in the latter and to ensure tests run against the develop branch of `matrix-js-sdk`, From 51f59c6c327873bd796eab6bdd91f20c854a66a1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 May 2020 11:40:56 +0100 Subject: [PATCH 245/319] UserView, show Welcome page in the mid panel instead of empty space Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/UserView.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/structures/UserView.js b/src/components/structures/UserView.js index 493cc136d1..694592af88 100644 --- a/src/components/structures/UserView.js +++ b/src/components/structures/UserView.js @@ -22,6 +22,7 @@ import {MatrixClientPeg} from "../../MatrixClientPeg"; import * as sdk from "../../index"; import Modal from '../../Modal'; import { _t } from '../../languageHandler'; +import HomePage from "./HomePage"; export default class UserView extends React.Component { static get propTypes() { @@ -79,7 +80,7 @@ export default class UserView extends React.Component { const RightPanel = sdk.getComponent('structures.RightPanel'); const MainSplit = sdk.getComponent('structures.MainSplit'); const panel = ; - return (
      ); + return (); } else { return (
      ); } From 92824411e82015d1d2e81ccba3af70002cc48522 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 May 2020 12:33:10 +0100 Subject: [PATCH 246/319] Fix persistent widgets on desktop / http WidgetMessaging needs the URL of the widget that gets rendered into the iframe because that's where the postmessages will be coming from. Fixes https://github.com/vector-im/riot-web/issues/13369 --- src/components/views/elements/AppTile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 6a5dfc97e0..ae5fe9a35c 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -430,7 +430,7 @@ export default class AppTile extends React.Component { // is used for is to determine the origin we're talking to, and therefore we don't need the // fully templated URL. const widgetMessaging = new WidgetMessaging( - this.props.app.id, this.props.app.url, this.props.userWidget, this._appFrame.current.contentWindow); + this.props.app.id, this._getRenderedUrl(), this.props.userWidget, this._appFrame.current.contentWindow); ActiveWidgetStore.setWidgetMessaging(this.props.app.id, widgetMessaging); widgetMessaging.getCapabilities().then((requestedCapabilities) => { console.log(`Widget ${this.props.app.id} requested capabilities: ` + requestedCapabilities); From 3f04f5163a963b9193199abb340719061ae0e921 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 13 May 2020 14:04:46 +0100 Subject: [PATCH 247/319] Implement more nitpicks - fix avatar inital aligment - right align names - set flair height to avatar's - fix conditions for resizing to be more stable --- res/css/views/rooms/_IRCLayout.scss | 13 ++++++++++++- .../views/elements/IRCTimelineProfileResizer.tsx | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 159cfc0aad..8d48c72f8a 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -54,6 +54,7 @@ $irc-line-height: $font-18px; display: flex; align-items: center; overflow: visible; + justify-content: flex-end; } .mx_EventTile_line, .mx_EventTile_reply { @@ -79,7 +80,7 @@ $irc-line-height: $font-18px; height: $font-14px !important; width: $font-14px !important; font-size: $font-10px !important; - line-height: $font-14px !important; + line-height: $font-15px !important; } } @@ -188,6 +189,10 @@ $irc-line-height: $font-18px; } } + .mx_SenderProfile:hover { + justify-content: flex-start; + } + .mx_SenderProfile_hover:hover { overflow: visible; width: auto; @@ -210,4 +215,10 @@ $irc-line-height: $font-18px; cursor: col-resize; z-index: 100; } + + // Need to use important to override the js provided height and width values. + .mx_Flair > img { + height: $font-14px !important; + width: $font-14px !important; + } } diff --git a/src/components/views/elements/IRCTimelineProfileResizer.tsx b/src/components/views/elements/IRCTimelineProfileResizer.tsx index 80a86b2005..44ceeb9b7b 100644 --- a/src/components/views/elements/IRCTimelineProfileResizer.tsx +++ b/src/components/views/elements/IRCTimelineProfileResizer.tsx @@ -52,11 +52,11 @@ export default class IRCTimelineProfileResizer extends React.Component= this.props.maxWidth && offset >= 0) { + if (newWidth > this.props.maxWidth) { return location; } From 312b616d7701e9b9f8460d210bc22a07c1253be9 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 13 May 2020 14:11:16 +0100 Subject: [PATCH 248/319] fix i18n --- src/i18n/strings/en_EN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ca62eb44fa..37b9c1dfc8 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -453,6 +453,7 @@ "Keep recovery passphrase in memory for this session": "Keep recovery passphrase in memory for this session", "How fast should messages be downloaded.": "How fast should messages be downloaded.", "Manually verify all remote sessions": "Manually verify all remote sessions", + "IRC display name width": "IRC display name width", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", "Uploading report": "Uploading report", From 50107ebe47784372b04a995a44064833d5531133 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 May 2020 16:10:40 +0100 Subject: [PATCH 249/319] Re-fix OpenID requests from widgets https://github.com/matrix-org/matrix-react-sdk/pull/4591 reverted https://github.com/matrix-org/matrix-react-sdk/pull/4459. We need to pass both URLs as we need both the wURL (for the widget's 'identity' ie. OpenID) and the URL that's actually in the iframe (for the messaging). --- src/WidgetMessaging.js | 21 +++++++++++++++------ src/components/views/elements/AppTile.js | 12 ++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/WidgetMessaging.js b/src/WidgetMessaging.js index 5f877bd48a..3b3926b724 100644 --- a/src/WidgetMessaging.js +++ b/src/WidgetMessaging.js @@ -41,9 +41,18 @@ if (!global.mxToWidgetMessaging) { const OUTBOUND_API_NAME = 'toWidget'; export default class WidgetMessaging { - constructor(widgetId, widgetUrl, isUserWidget, target) { + /** + * @param {string} widgetId The widget's ID + * @param {string} wurl The raw URL of the widget as in the event (the 'wURL') + * @param {string} renderedUrl The url used in the widget's iframe (either similar to the wURL + * or a different URL of the clients choosing if it is using its own impl). + * @param {bool} isUserWidget If true, the widget is a user widget, otherwise it's a room widget + * @param {object} target Where widget messages should be sent (eg. the iframe object) + */ + constructor(widgetId, wurl, renderedUrl, isUserWidget, target) { this.widgetId = widgetId; - this.widgetUrl = widgetUrl; + this.wurl = wurl; + this.renderedUrl = renderedUrl; this.isUserWidget = isUserWidget; this.target = target; this.fromWidget = global.mxFromWidgetMessaging; @@ -128,19 +137,19 @@ export default class WidgetMessaging { } start() { - this.fromWidget.addEndpoint(this.widgetId, this.widgetUrl); + this.fromWidget.addEndpoint(this.widgetId, this.renderedUrl); this.fromWidget.addListener("get_openid", this._onOpenIdRequest); } stop() { - this.fromWidget.removeEndpoint(this.widgetId, this.widgetUrl); + this.fromWidget.removeEndpoint(this.widgetId, this.renderedUrl); this.fromWidget.removeListener("get_openid", this._onOpenIdRequest); } async _onOpenIdRequest(ev, rawEv) { if (ev.widgetId !== this.widgetId) return; // not interesting - const widgetSecurityKey = WidgetUtils.getWidgetSecurityKey(this.widgetId, this.widgetUrl, this.isUserWidget); + const widgetSecurityKey = WidgetUtils.getWidgetSecurityKey(this.widgetId, this.wurl, this.isUserWidget); const settings = SettingsStore.getValue("widgetOpenIDPermissions"); if (settings.deny && settings.deny.includes(widgetSecurityKey)) { @@ -161,7 +170,7 @@ export default class WidgetMessaging { // Actually ask for permission to send the user's data Modal.createTrackedDialog("OpenID widget permissions", '', WidgetOpenIDPermissionsDialog, { - widgetUrl: this.widgetUrl, + widgetUrl: this.wurl, widgetId: this.widgetId, isUserWidget: this.isUserWidget, diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index ae5fe9a35c..80db1718f6 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -424,13 +424,13 @@ export default class AppTile extends React.Component { _setupWidgetMessaging() { // FIXME: There's probably no reason to do this here: it should probably be done entirely // in ActiveWidgetStore. - - // We use the app's URL over the rendered URL so that anything the widget does which could - // lead to requesting a "security key" will pass accordingly. The only other thing this URL - // is used for is to determine the origin we're talking to, and therefore we don't need the - // fully templated URL. const widgetMessaging = new WidgetMessaging( - this.props.app.id, this._getRenderedUrl(), this.props.userWidget, this._appFrame.current.contentWindow); + this.props.app.id, + this.props.app.url, + this._getRenderedUrl(), + this.props.userWidget, + this._appFrame.current.contentWindow, + ); ActiveWidgetStore.setWidgetMessaging(this.props.app.id, widgetMessaging); widgetMessaging.getCapabilities().then((requestedCapabilities) => { console.log(`Widget ${this.props.app.id} requested capabilities: ` + requestedCapabilities); From 5c2abcf1a4b7bd9cbc35dd6c297073db56eb8a52 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 13 May 2020 17:05:37 +0100 Subject: [PATCH 250/319] Show username on continuations --- res/css/views/rooms/_IRCLayout.scss | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 8d48c72f8a..f2a616f9c9 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -157,16 +157,6 @@ $irc-line-height: $font-18px; } } - .mx_EventTile_continuation:not(.mx_EventTile_info) { - > .mx_EventTile_avatar { - visibility: hidden; - } - - > .mx_SenderProfile { - visibility: hidden; - } - } - // Suppress highlight thing from the normal Layout. .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line, .mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line, From 226e4b297a7c79923b0466b2a82ff2c91d87d5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Wed, 13 May 2020 18:22:38 +0000 Subject: [PATCH 251/319] Translated using Weblate (Czech) Currently translated at 95.4% (2201 of 2307 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3b018204c0..181a692b73 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2289,5 +2289,9 @@ "Are you sure you want to deactivate your account? This is irreversible.": "Opravdu chcete deaktivovat účet? Je to nevratné.", "Confirm account deactivation": "Potvrďte deaktivaci účtu", "There was a problem communicating with the server. Please try again.": "Došlo k potížím při komunikaci se serverem. Zkuste to prosím znovu.", - "Start a conversation with someone using their name, username (like ) or email address.": "Začněte s někým konverzovat za pomocí jména, přihlašovacího jména (jako ) nebo emailu." + "Start a conversation with someone using their name, username (like ) or email address.": "Začněte s někým konverzovat za pomocí jména, přihlašovacího jména (jako ) nebo emailu.", + "Opens chat with the given user": "Otevře konverzaci s tímto uživatelem", + "Sends a message to the given user": "Pošle zprávu danému uživateli", + "Waiting for your other session to verify…": "Čekáme na ověření od vaší druhé relace…", + "Verify all your sessions to ensure your account & messages are safe": "Ověřte všechny své relace, abyste zaručili, že jsou vaše zprávy a účet bezpečné" } From fa83df4bde7b317737a27a8cb24d2b44aa633750 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 13 May 2020 21:07:29 -0600 Subject: [PATCH 252/319] Convert dispatcher to TypeScript and replace async usage with new class Due to TypeScript and flux's types being annoying and highly typesafe, we need an AsyncActionPayload which intentionally doesn't use the 'action' property. This looks a bit awkward, though for the rare cases we do actually fire async actions it should be fine enough. The call signature changes slightly for async events, therefore this commit also updates its usages for async events. The `fire()` function is to be used in a future commit. Remove biased comment --- package.json | 1 + src/actions/RoomListActions.js | 145 ----------------- src/actions/RoomListActions.ts | 151 ++++++++++++++++++ src/actions/TagOrderActions.js | 109 ------------- src/actions/TagOrderActions.ts | 112 +++++++++++++ .../{actionCreators.js => actionCreators.ts} | 14 +- src/dispatcher.js | 58 ------- src/dispatcher.ts | 121 ++++++++++++++ tsconfig.json | 3 +- yarn.lock | 21 +++ 10 files changed, 417 insertions(+), 318 deletions(-) delete mode 100644 src/actions/RoomListActions.js create mode 100644 src/actions/RoomListActions.ts delete mode 100644 src/actions/TagOrderActions.js create mode 100644 src/actions/TagOrderActions.ts rename src/actions/{actionCreators.js => actionCreators.ts} (80%) delete mode 100644 src/dispatcher.js create mode 100644 src/dispatcher.ts diff --git a/package.json b/package.json index 92d228a812..2258d5e3b6 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,7 @@ "@babel/register": "^7.7.4", "@peculiar/webcrypto": "^1.0.22", "@types/classnames": "^2.2.10", + "@types/flux": "^3.1.9", "@types/modernizr": "^3.5.3", "@types/react": "16.9", "babel-eslint": "^10.0.3", diff --git a/src/actions/RoomListActions.js b/src/actions/RoomListActions.js deleted file mode 100644 index 10a3848dda..0000000000 --- a/src/actions/RoomListActions.js +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright 2018 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { asyncAction } from './actionCreators'; -import RoomListStore, {TAG_DM} from '../stores/RoomListStore'; -import Modal from '../Modal'; -import * as Rooms from '../Rooms'; -import { _t } from '../languageHandler'; -import * as sdk from '../index'; - -const RoomListActions = {}; - -/** - * Creates an action thunk that will do an asynchronous request to - * tag room. - * - * @param {MatrixClient} matrixClient the matrix client to set the - * account data on. - * @param {Room} room the room to tag. - * @param {string} oldTag the tag to remove (unless oldTag ==== newTag) - * @param {string} newTag the tag with which to tag the room. - * @param {?number} oldIndex the previous position of the room in the - * list of rooms. - * @param {?number} newIndex the new position of the room in the list - * of rooms. - * @returns {function} an action thunk. - * @see asyncAction - */ -RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex, newIndex) { - let metaData = null; - - // Is the tag ordered manually? - if (newTag && !newTag.match(/^(m\.lowpriority|im\.vector\.fake\.(invite|recent|direct|archived))$/)) { - const lists = RoomListStore.getRoomLists(); - const newList = [...lists[newTag]]; - - newList.sort((a, b) => a.tags[newTag].order - b.tags[newTag].order); - - // If the room was moved "down" (increasing index) in the same list we - // need to use the orders of the tiles with indices shifted by +1 - const offset = ( - newTag === oldTag && oldIndex < newIndex - ) ? 1 : 0; - - const indexBefore = offset + newIndex - 1; - const indexAfter = offset + newIndex; - - const prevOrder = indexBefore <= 0 ? - 0 : newList[indexBefore].tags[newTag].order; - const nextOrder = indexAfter >= newList.length ? - 1 : newList[indexAfter].tags[newTag].order; - - metaData = { - order: (prevOrder + nextOrder) / 2.0, - }; - } - - return asyncAction('RoomListActions.tagRoom', () => { - const promises = []; - const roomId = room.roomId; - - // Evil hack to get DMs behaving - if ((oldTag === undefined && newTag === TAG_DM) || - (oldTag === TAG_DM && newTag === undefined) - ) { - return Rooms.guessAndSetDMRoom( - room, newTag === TAG_DM, - ).catch((err) => { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - console.error("Failed to set direct chat tag " + err); - Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, { - title: _t('Failed to set direct chat tag'), - description: ((err && err.message) ? err.message : _t('Operation failed')), - }); - }); - } - - const hasChangedSubLists = oldTag !== newTag; - - // More evilness: We will still be dealing with moving to favourites/low prio, - // but we avoid ever doing a request with TAG_DM. - // - // if we moved lists, remove the old tag - if (oldTag && oldTag !== TAG_DM && - hasChangedSubLists - ) { - const promiseToDelete = matrixClient.deleteRoomTag( - roomId, oldTag, - ).catch(function(err) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - console.error("Failed to remove tag " + oldTag + " from room: " + err); - Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, { - title: _t('Failed to remove tag %(tagName)s from room', {tagName: oldTag}), - description: ((err && err.message) ? err.message : _t('Operation failed')), - }); - }); - - promises.push(promiseToDelete); - } - - // if we moved lists or the ordering changed, add the new tag - if (newTag && newTag !== TAG_DM && - (hasChangedSubLists || metaData) - ) { - // metaData is the body of the PUT to set the tag, so it must - // at least be an empty object. - metaData = metaData || {}; - - const promiseToAdd = matrixClient.setRoomTag(roomId, newTag, metaData).catch(function(err) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - console.error("Failed to add tag " + newTag + " to room: " + err); - Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, { - title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}), - description: ((err && err.message) ? err.message : _t('Operation failed')), - }); - - throw err; - }); - - promises.push(promiseToAdd); - } - - return Promise.all(promises); - }, () => { - // For an optimistic update - return { - room, oldTag, newTag, metaData, - }; - }); -}; - -export default RoomListActions; diff --git a/src/actions/RoomListActions.ts b/src/actions/RoomListActions.ts new file mode 100644 index 0000000000..8ad3ad0781 --- /dev/null +++ b/src/actions/RoomListActions.ts @@ -0,0 +1,151 @@ +/* +Copyright 2018 New Vector Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { asyncAction } from './actionCreators'; +import RoomListStore, { TAG_DM } from '../stores/RoomListStore'; +import Modal from '../Modal'; +import * as Rooms from '../Rooms'; +import { _t } from '../languageHandler'; +import * as sdk from '../index'; +import { MatrixClient } from "matrix-js-sdk/src/client"; +import { Room } from "matrix-js-sdk/src/models/room"; +import { AsyncActionPayload } from "../dispatcher"; + +export default class RoomListActions { + /** + * Creates an action thunk that will do an asynchronous request to + * tag room. + * + * @param {MatrixClient} matrixClient the matrix client to set the + * account data on. + * @param {Room} room the room to tag. + * @param {string} oldTag the tag to remove (unless oldTag ==== newTag) + * @param {string} newTag the tag with which to tag the room. + * @param {?number} oldIndex the previous position of the room in the + * list of rooms. + * @param {?number} newIndex the new position of the room in the list + * of rooms. + * @returns {AsyncActionPayload} an async action payload + * @see asyncAction + */ + public static tagRoom( + matrixClient: MatrixClient, room: Room, + oldTag: string, newTag: string, + oldIndex: number | null, newIndex: number | null, + ): AsyncActionPayload { + let metaData = null; + + // Is the tag ordered manually? + if (newTag && !newTag.match(/^(m\.lowpriority|im\.vector\.fake\.(invite|recent|direct|archived))$/)) { + const lists = RoomListStore.getRoomLists(); + const newList = [...lists[newTag]]; + + newList.sort((a, b) => a.tags[newTag].order - b.tags[newTag].order); + + // If the room was moved "down" (increasing index) in the same list we + // need to use the orders of the tiles with indices shifted by +1 + const offset = ( + newTag === oldTag && oldIndex < newIndex + ) ? 1 : 0; + + const indexBefore = offset + newIndex - 1; + const indexAfter = offset + newIndex; + + const prevOrder = indexBefore <= 0 ? + 0 : newList[indexBefore].tags[newTag].order; + const nextOrder = indexAfter >= newList.length ? + 1 : newList[indexAfter].tags[newTag].order; + + metaData = { + order: (prevOrder + nextOrder) / 2.0, + }; + } + + return asyncAction('RoomListActions.tagRoom', () => { + const promises = []; + const roomId = room.roomId; + + // Evil hack to get DMs behaving + if ((oldTag === undefined && newTag === TAG_DM) || + (oldTag === TAG_DM && newTag === undefined) + ) { + return Rooms.guessAndSetDMRoom( + room, newTag === TAG_DM, + ).catch((err) => { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Failed to set direct chat tag " + err); + Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, { + title: _t('Failed to set direct chat tag'), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + }); + } + + const hasChangedSubLists = oldTag !== newTag; + + // More evilness: We will still be dealing with moving to favourites/low prio, + // but we avoid ever doing a request with TAG_DM. + // + // if we moved lists, remove the old tag + if (oldTag && oldTag !== TAG_DM && + hasChangedSubLists + ) { + const promiseToDelete = matrixClient.deleteRoomTag( + roomId, oldTag, + ).catch(function (err) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Failed to remove tag " + oldTag + " from room: " + err); + Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, { + title: _t('Failed to remove tag %(tagName)s from room', {tagName: oldTag}), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + }); + + promises.push(promiseToDelete); + } + + // if we moved lists or the ordering changed, add the new tag + if (newTag && newTag !== TAG_DM && + (hasChangedSubLists || metaData) + ) { + // metaData is the body of the PUT to set the tag, so it must + // at least be an empty object. + metaData = metaData || {}; + + const promiseToAdd = matrixClient.setRoomTag(roomId, newTag, metaData).catch(function (err) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Failed to add tag " + newTag + " to room: " + err); + Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, { + title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}), + description: ((err && err.message) ? err.message : _t('Operation failed')), + }); + + throw err; + }); + + promises.push(promiseToAdd); + } + + return Promise.all(promises); + }, () => { + // For an optimistic update + return { + room, oldTag, newTag, metaData, + }; + }); + } +} diff --git a/src/actions/TagOrderActions.js b/src/actions/TagOrderActions.js deleted file mode 100644 index a257ff16d8..0000000000 --- a/src/actions/TagOrderActions.js +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright 2017 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import Analytics from '../Analytics'; -import { asyncAction } from './actionCreators'; -import TagOrderStore from '../stores/TagOrderStore'; - -const TagOrderActions = {}; - -/** - * Creates an action thunk that will do an asynchronous request to - * move a tag in TagOrderStore to destinationIx. - * - * @param {MatrixClient} matrixClient the matrix client to set the - * account data on. - * @param {string} tag the tag to move. - * @param {number} destinationIx the new position of the tag. - * @returns {function} an action thunk that will dispatch actions - * indicating the status of the request. - * @see asyncAction - */ -TagOrderActions.moveTag = function(matrixClient, tag, destinationIx) { - // Only commit tags if the state is ready, i.e. not null - let tags = TagOrderStore.getOrderedTags(); - let removedTags = TagOrderStore.getRemovedTagsAccountData() || []; - if (!tags) { - return; - } - - tags = tags.filter((t) => t !== tag); - tags = [...tags.slice(0, destinationIx), tag, ...tags.slice(destinationIx)]; - - removedTags = removedTags.filter((t) => t !== tag); - - const storeId = TagOrderStore.getStoreId(); - - return asyncAction('TagOrderActions.moveTag', () => { - Analytics.trackEvent('TagOrderActions', 'commitTagOrdering'); - return matrixClient.setAccountData( - 'im.vector.web.tag_ordering', - {tags, removedTags, _storeId: storeId}, - ); - }, () => { - // For an optimistic update - return {tags, removedTags}; - }); -}; - -/** - * Creates an action thunk that will do an asynchronous request to - * label a tag as removed in im.vector.web.tag_ordering account data. - * - * The reason this is implemented with new state `removedTags` is that - * we incrementally and initially populate `tags` with groups that - * have been joined. If we remove a group from `tags`, it will just - * get added (as it looks like a group we've recently joined). - * - * NB: If we ever support adding of tags (which is planned), we should - * take special care to remove the tag from `removedTags` when we add - * it. - * - * @param {MatrixClient} matrixClient the matrix client to set the - * account data on. - * @param {string} tag the tag to remove. - * @returns {function} an action thunk that will dispatch actions - * indicating the status of the request. - * @see asyncAction - */ -TagOrderActions.removeTag = function(matrixClient, tag) { - // Don't change tags, just removedTags - const tags = TagOrderStore.getOrderedTags(); - const removedTags = TagOrderStore.getRemovedTagsAccountData() || []; - - if (removedTags.includes(tag)) { - // Return a thunk that doesn't do anything, we don't even need - // an asynchronous action here, the tag is already removed. - return () => {}; - } - - removedTags.push(tag); - - const storeId = TagOrderStore.getStoreId(); - - return asyncAction('TagOrderActions.removeTag', () => { - Analytics.trackEvent('TagOrderActions', 'removeTag'); - return matrixClient.setAccountData( - 'im.vector.web.tag_ordering', - {tags, removedTags, _storeId: storeId}, - ); - }, () => { - // For an optimistic update - return {removedTags}; - }); -}; - -export default TagOrderActions; diff --git a/src/actions/TagOrderActions.ts b/src/actions/TagOrderActions.ts new file mode 100644 index 0000000000..57dd0b8793 --- /dev/null +++ b/src/actions/TagOrderActions.ts @@ -0,0 +1,112 @@ +/* +Copyright 2017 New Vector Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import Analytics from '../Analytics'; +import { asyncAction } from './actionCreators'; +import TagOrderStore from '../stores/TagOrderStore'; +import { AsyncActionPayload } from "../dispatcher"; +import { MatrixClient } from "matrix-js-sdk/src/client"; + +export default class TagOrderActions { + + /** + * Creates an action thunk that will do an asynchronous request to + * move a tag in TagOrderStore to destinationIx. + * + * @param {MatrixClient} matrixClient the matrix client to set the + * account data on. + * @param {string} tag the tag to move. + * @param {number} destinationIx the new position of the tag. + * @returns {AsyncActionPayload} an async action payload that will + * dispatch actions indicating the status of the request. + * @see asyncAction + */ + public static moveTag(matrixClient: MatrixClient, tag: string, destinationIx: number): AsyncActionPayload { + // Only commit tags if the state is ready, i.e. not null + let tags = TagOrderStore.getOrderedTags(); + let removedTags = TagOrderStore.getRemovedTagsAccountData() || []; + if (!tags) { + return; + } + + tags = tags.filter((t) => t !== tag); + tags = [...tags.slice(0, destinationIx), tag, ...tags.slice(destinationIx)]; + + removedTags = removedTags.filter((t) => t !== tag); + + const storeId = TagOrderStore.getStoreId(); + + return asyncAction('TagOrderActions.moveTag', () => { + Analytics.trackEvent('TagOrderActions', 'commitTagOrdering'); + return matrixClient.setAccountData( + 'im.vector.web.tag_ordering', + {tags, removedTags, _storeId: storeId}, + ); + }, () => { + // For an optimistic update + return {tags, removedTags}; + }); + }; + + /** + * Creates an action thunk that will do an asynchronous request to + * label a tag as removed in im.vector.web.tag_ordering account data. + * + * The reason this is implemented with new state `removedTags` is that + * we incrementally and initially populate `tags` with groups that + * have been joined. If we remove a group from `tags`, it will just + * get added (as it looks like a group we've recently joined). + * + * NB: If we ever support adding of tags (which is planned), we should + * take special care to remove the tag from `removedTags` when we add + * it. + * + * @param {MatrixClient} matrixClient the matrix client to set the + * account data on. + * @param {string} tag the tag to remove. + * @returns {function} an async action payload that will dispatch + * actions indicating the status of the request. + * @see asyncAction + */ + public static removeTag(matrixClient: MatrixClient, tag: string): AsyncActionPayload { + // Don't change tags, just removedTags + const tags = TagOrderStore.getOrderedTags(); + const removedTags = TagOrderStore.getRemovedTagsAccountData() || []; + + if (removedTags.includes(tag)) { + // Return a thunk that doesn't do anything, we don't even need + // an asynchronous action here, the tag is already removed. + return () => { + }; + } + + removedTags.push(tag); + + const storeId = TagOrderStore.getStoreId(); + + return asyncAction('TagOrderActions.removeTag', () => { + Analytics.trackEvent('TagOrderActions', 'removeTag'); + return matrixClient.setAccountData( + 'im.vector.web.tag_ordering', + {tags, removedTags, _storeId: storeId}, + ); + }, () => { + // For an optimistic update + return {removedTags}; + }); + } +} diff --git a/src/actions/actionCreators.js b/src/actions/actionCreators.ts similarity index 80% rename from src/actions/actionCreators.js rename to src/actions/actionCreators.ts index 967ce609e7..3a0132a969 100644 --- a/src/actions/actionCreators.js +++ b/src/actions/actionCreators.ts @@ -1,5 +1,6 @@ /* Copyright 2017 New Vector Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { AsyncActionPayload } from "../dispatcher"; + /** * Create an action thunk that will dispatch actions indicating the current * status of the Promise returned by fn. @@ -25,9 +28,9 @@ limitations under the License. * @param {function?} pendingFn a function that returns an object to assign * to the `request` key of the ${id}.pending * payload. - * @returns {function} an action thunk - a function that uses its single - * argument as a dispatch function to dispatch the - * following actions: + * @returns {AsyncActionPayload} an async action payload. Includes a function + * that uses its single argument as a dispatch function + * to dispatch the following actions: * `${id}.pending` and either * `${id}.success` or * `${id}.failure`. @@ -41,8 +44,8 @@ limitations under the License. * result is the result of the promise returned by * `fn`. */ -export function asyncAction(id, fn, pendingFn) { - return (dispatch) => { +export function asyncAction(id: string, fn: () => Promise, pendingFn: () => any): AsyncActionPayload { + const helper = (dispatch) => { dispatch({ action: id + '.pending', request: @@ -54,4 +57,5 @@ export function asyncAction(id, fn, pendingFn) { dispatch({action: id + '.failure', err}); }); }; + return new AsyncActionPayload(helper); } diff --git a/src/dispatcher.js b/src/dispatcher.js deleted file mode 100644 index 5dfaa11345..0000000000 --- a/src/dispatcher.js +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -'use strict'; - -import flux from "flux"; - -class MatrixDispatcher extends flux.Dispatcher { - /** - * @param {Object|function} payload Required. The payload to dispatch. - * If an Object, must contain at least an 'action' key. - * If a function, must have the signature (dispatch) => {...}. - * @param {boolean=} sync Optional. Pass true to dispatch - * synchronously. This is useful for anything triggering - * an operation that the browser requires user interaction - * for. - */ - dispatch(payload, sync) { - // Allow for asynchronous dispatching by accepting payloads that have the - // type `function (dispatch) {...}` - if (typeof payload === 'function') { - payload((action) => { - this.dispatch(action, sync); - }); - return; - } - - if (sync) { - super.dispatch(payload); - } else { - // Unless the caller explicitly asked for us to dispatch synchronously, - // we always set a timeout to do this: The flux dispatcher complains - // if you dispatch from within a dispatch, so rather than action - // handlers having to worry about not calling anything that might - // then dispatch, we just do dispatches asynchronously. - setTimeout(super.dispatch.bind(this, payload), 0); - } - } -} - -if (global.mxDispatcher === undefined) { - global.mxDispatcher = new MatrixDispatcher(); -} -export default global.mxDispatcher; diff --git a/src/dispatcher.ts b/src/dispatcher.ts new file mode 100644 index 0000000000..fce99df055 --- /dev/null +++ b/src/dispatcher.ts @@ -0,0 +1,121 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd +Copyright 2017 New Vector Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { Dispatcher } from "flux"; + +export enum Action { + // TODO: Populate with actual actions +} + +// Dispatcher actions also extend into any arbitrary string, so support that. +export type DispatcherAction = Action | string; + +/** + * The base dispatch type exposed by our dispatcher. + */ +export interface ActionPayload { + [property: string]: any; // effectively makes this 'extends Object' + action: DispatcherAction; +} + +/** + * The function the dispatcher calls when ready for an AsyncActionPayload. The + * single argument is used to start a dispatch. First the dispatcher calls the + * outer function, then when the called function is ready it calls the cb + * function to issue the dispatch. It may call the callback repeatedly if needed. + */ +export type AsyncActionFn = (cb: (action: ActionPayload) => void) => void; + +/** + * An async version of ActionPayload + */ +export class AsyncActionPayload implements ActionPayload { + /** + * The function the dispatcher should call. + */ + public readonly fn: AsyncActionFn; + + /** + * @deprecated Not used on AsyncActionPayload. + */ + public get action(): DispatcherAction { + return "NOT_USED"; + } + + /** + * Create a new AsyncActionPayload with the given ready function. + * @param {AsyncActionFn} readyFn The function to be called when the + * dispatcher is ready. + */ + public constructor(readyFn: AsyncActionFn) { + this.fn = readyFn; + } +} + +/** + * A dispatcher for ActionPayloads (the default within the SDK). + */ +export class MatrixDispatcher extends Dispatcher { + /** + * Dispatches an event on the dispatcher's event bus. + * @param {ActionPayload} payload Required. The payload to dispatch. + * @param {boolean=false} sync Optional. Pass true to dispatch + * synchronously. This is useful for anything triggering + * an operation that the browser requires user interaction + * for. Default false (async). + */ + dispatch(payload: ActionPayload, sync = false) { + if (payload instanceof AsyncActionPayload) { + payload.fn((action: ActionPayload) => { + this.dispatch(action, sync); + }); + return; + } + + if (sync) { + super.dispatch(payload); + } else { + // Unless the caller explicitly asked for us to dispatch synchronously, + // we always set a timeout to do this: The flux dispatcher complains + // if you dispatch from within a dispatch, so rather than action + // handlers having to worry about not calling anything that might + // then dispatch, we just do dispatches asynchronously. + setTimeout(super.dispatch.bind(this, payload), 0); + } + } + + /** + * Shorthand for dispatch({action: Action.WHATEVER}, sync). No additional + * properties can be included with this version. + * @param {Action} action The action to dispatch. + * @param {boolean=false} sync Whether the dispatch should be sync or not. + * @see dispatch(action: ActionPayload, sync: boolean) + */ + fire(action: Action, sync = false) { + this.dispatch({action}, sync); + } +} + +export const defaultDispatcher = new MatrixDispatcher(); + +const anyGlobal = global; +if (!anyGlobal.mxDispatcher) { + anyGlobal.mxDispatcher = defaultDispatcher; +} + +export default defaultDispatcher; diff --git a/tsconfig.json b/tsconfig.json index b87f640734..8a01ca335e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "jsx": "react", "types": [ "node", - "react" + "react", + "flux" ] }, "include": [ diff --git a/yarn.lock b/yarn.lock index 520e976b17..99a9d07c7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1218,6 +1218,19 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/fbemitter@*": + version "2.0.32" + resolved "https://registry.yarnpkg.com/@types/fbemitter/-/fbemitter-2.0.32.tgz#8ed204da0f54e9c8eaec31b1eec91e25132d082c" + integrity sha1-jtIE2g9U6cjq7DGx7skeJRMtCCw= + +"@types/flux@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@types/flux/-/flux-3.1.9.tgz#ddfc9641ee2e2e6cb6cd730c6a48ef82e2076711" + integrity sha512-bSbDf4tTuN9wn3LTGPnH9wnSSLtR5rV7UPWFpM00NJ1pSTBwCzeZG07XsZ9lBkxwngrqjDtM97PLt5IuIdCQUA== + dependencies: + "@types/fbemitter" "*" + "@types/react" "*" + "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -1272,6 +1285,14 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== +"@types/react@*": + version "16.9.35" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" + integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/react@16.9": version "16.9.32" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" From 90a898d03ff5e6da0a436136de167ee1547297c5 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 13 May 2020 20:41:41 -0600 Subject: [PATCH 253/319] Move dispatcher into a subdirectory We're expecting to have a whole bunch of types for the dispatched payloads, so pull the thing into a directory we can throw them in. --- src/BasePlatform.js | 2 +- src/CallHandler.js | 2 +- src/ContentMessages.js | 2 +- src/FromWidgetPostMessageApi.js | 2 +- src/Lifecycle.js | 2 +- src/Modal.js | 2 +- src/Notifier.js | 2 +- src/Presence.js | 2 +- src/Registration.js | 2 +- src/Resend.js | 2 +- src/ScalarMessaging.js | 2 +- src/SlashCommands.tsx | 2 +- src/UserActivity.js | 2 +- src/actions/MatrixActionCreators.js | 2 +- src/actions/RoomListActions.ts | 2 +- src/actions/TagOrderActions.ts | 2 +- src/actions/actionCreators.ts | 2 +- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 2 +- .../views/dialogs/keybackup/NewRecoveryMethodDialog.js | 2 +- .../views/dialogs/keybackup/RecoveryMethodRemovedDialog.js | 2 +- src/components/structures/CustomRoomTagPanel.js | 2 +- src/components/structures/EmbeddedPage.js | 2 +- src/components/structures/GroupView.js | 2 +- src/components/structures/HomePage.tsx | 2 +- src/components/structures/LeftPanel.js | 2 +- src/components/structures/LoggedInView.tsx | 2 +- src/components/structures/MatrixChat.tsx | 2 +- src/components/structures/MyGroups.js | 2 +- src/components/structures/RightPanel.js | 2 +- src/components/structures/RoomDirectory.js | 2 +- src/components/structures/RoomStatusBar.js | 2 +- src/components/structures/RoomSubList.js | 2 +- src/components/structures/RoomView.js | 2 +- src/components/structures/SearchBox.js | 2 +- src/components/structures/TagPanel.js | 2 +- src/components/structures/TagPanelButtons.js | 2 +- src/components/structures/TimelinePanel.js | 2 +- src/components/structures/TopLeftMenuButton.js | 2 +- src/components/structures/UploadBar.js | 2 +- src/components/structures/auth/Registration.js | 2 +- src/components/structures/auth/SoftLogout.js | 2 +- src/components/views/avatars/MemberAvatar.js | 2 +- src/components/views/context_menus/MessageContextMenu.js | 2 +- src/components/views/context_menus/RoomTileContextMenu.js | 2 +- src/components/views/context_menus/TagTileContextMenu.js | 2 +- src/components/views/context_menus/TopLeftMenu.js | 2 +- src/components/views/dialogs/AddressPickerDialog.js | 2 +- src/components/views/dialogs/CreateGroupDialog.js | 2 +- src/components/views/dialogs/CryptoStoreTooNewDialog.js | 2 +- src/components/views/dialogs/DeviceVerifyDialog.js | 2 +- src/components/views/dialogs/IntegrationsDisabledDialog.js | 2 +- src/components/views/dialogs/InviteDialog.js | 2 +- src/components/views/dialogs/LogoutDialog.js | 2 +- src/components/views/dialogs/RoomSettingsDialog.js | 2 +- src/components/views/elements/ActionButton.js | 2 +- src/components/views/elements/AppTile.js | 2 +- src/components/views/elements/Flair.js | 2 +- src/components/views/elements/PersistedElement.js | 2 +- src/components/views/elements/Pill.js | 2 +- src/components/views/elements/ReplyThread.js | 2 +- src/components/views/elements/TagTile.js | 2 +- src/components/views/elements/Tooltip.js | 2 +- src/components/views/globals/CookieBar.js | 2 +- src/components/views/groups/GroupInviteTile.js | 2 +- src/components/views/groups/GroupMemberInfo.js | 2 +- src/components/views/groups/GroupMemberList.js | 2 +- src/components/views/groups/GroupMemberTile.js | 2 +- src/components/views/groups/GroupRoomInfo.js | 2 +- src/components/views/groups/GroupRoomTile.js | 2 +- src/components/views/groups/GroupTile.js | 2 +- src/components/views/messages/MKeyVerificationRequest.js | 2 +- src/components/views/messages/MessageActionBar.js | 2 +- src/components/views/messages/RoomCreate.js | 2 +- src/components/views/messages/TextualBody.js | 2 +- src/components/views/right_panel/HeaderButtons.js | 2 +- src/components/views/right_panel/UserInfo.js | 2 +- src/components/views/room_settings/ColorSettings.js | 2 +- src/components/views/room_settings/UrlPreviewSettings.js | 2 +- src/components/views/rooms/AppsDrawer.js | 2 +- src/components/views/rooms/AuxPanel.js | 2 +- src/components/views/rooms/EditMessageComposer.js | 2 +- src/components/views/rooms/EventTile.js | 2 +- src/components/views/rooms/ForwardMessage.js | 2 +- src/components/views/rooms/MemberInfo.js | 2 +- src/components/views/rooms/MemberList.js | 2 +- src/components/views/rooms/MemberTile.js | 2 +- src/components/views/rooms/MessageComposer.js | 2 +- src/components/views/rooms/PinnedEventTile.js | 2 +- src/components/views/rooms/ReplyPreview.js | 2 +- src/components/views/rooms/RoomBreadcrumbs.js | 2 +- src/components/views/rooms/RoomDetailList.js | 2 +- src/components/views/rooms/RoomList.js | 2 +- src/components/views/rooms/RoomPreviewBar.js | 2 +- src/components/views/rooms/RoomTile.js | 2 +- src/components/views/rooms/SendMessageComposer.js | 2 +- src/components/views/rooms/Stickerpicker.js | 2 +- src/components/views/rooms/ThirdPartyMemberInfo.js | 2 +- src/components/views/settings/ChangePassword.js | 2 +- src/components/views/settings/EnableNotificationsButton.js | 2 +- src/components/views/settings/IntegrationManager.js | 2 +- src/components/views/settings/SetIdServer.js | 2 +- .../views/settings/tabs/room/AdvancedRoomSettingsTab.js | 2 +- .../views/settings/tabs/room/GeneralRoomSettingsTab.js | 2 +- .../views/settings/tabs/user/GeneralUserSettingsTab.js | 2 +- .../views/settings/tabs/user/SecurityUserSettingsTab.js | 2 +- src/components/views/toasts/BulkUnverifiedSessionsToast.js | 2 +- src/components/views/toasts/VerificationRequestToast.js | 2 +- src/components/views/voip/CallPreview.js | 2 +- src/components/views/voip/CallView.js | 2 +- src/components/views/voip/IncomingCallBox.js | 2 +- src/components/views/voip/VideoView.js | 2 +- src/createRoom.js | 2 +- src/cryptodevices.js | 2 +- src/{ => dispatcher}/dispatcher.ts | 0 src/mjolnir/Mjolnir.js | 2 +- src/settings/SettingsStore.js | 2 +- src/settings/controllers/CustomStatusController.js | 2 +- src/stores/CustomRoomTagStore.js | 2 +- src/stores/GroupStore.js | 2 +- src/stores/LifecycleStore.js | 2 +- src/stores/RightPanelStore.js | 2 +- src/stores/RoomListStore.js | 2 +- src/stores/RoomViewStore.js | 2 +- src/stores/SessionStore.js | 2 +- src/stores/TagOrderStore.js | 2 +- src/theme.js | 2 +- src/utils/WidgetUtils.js | 2 +- src/verification.js | 2 +- test/components/views/rooms/RoomList-test.js | 2 +- test/test-utils.js | 2 +- 130 files changed, 129 insertions(+), 129 deletions(-) rename src/{ => dispatcher}/dispatcher.ts (100%) diff --git a/src/BasePlatform.js b/src/BasePlatform.js index 7214031586..46bd9150df 100644 --- a/src/BasePlatform.js +++ b/src/BasePlatform.js @@ -20,7 +20,7 @@ limitations under the License. */ import {MatrixClient} from "matrix-js-sdk"; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import BaseEventIndexManager from './indexing/BaseEventIndexManager'; /** diff --git a/src/CallHandler.js b/src/CallHandler.js index 2bfe10850a..c95ed16eb3 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -59,7 +59,7 @@ import Modal from './Modal'; import * as sdk from './index'; import { _t } from './languageHandler'; import Matrix from 'matrix-js-sdk'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; import WidgetUtils from './utils/WidgetUtils'; import WidgetEchoStore from './stores/WidgetEchoStore'; diff --git a/src/ContentMessages.js b/src/ContentMessages.js index 34379c029b..4f5a1a1220 100644 --- a/src/ContentMessages.js +++ b/src/ContentMessages.js @@ -18,7 +18,7 @@ limitations under the License. 'use strict'; import extend from './extend'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import {MatrixClientPeg} from './MatrixClientPeg'; import * as sdk from './index'; import { _t } from './languageHandler'; diff --git a/src/FromWidgetPostMessageApi.js b/src/FromWidgetPostMessageApi.js index c9793d40f7..102afa6bf1 100644 --- a/src/FromWidgetPostMessageApi.js +++ b/src/FromWidgetPostMessageApi.js @@ -17,7 +17,7 @@ limitations under the License. */ import URL from 'url'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import WidgetMessagingEndpoint from './WidgetMessagingEndpoint'; import ActiveWidgetStore from './stores/ActiveWidgetStore'; import {MatrixClientPeg} from "./MatrixClientPeg"; diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 1baa6c8e0c..22c5d48317 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -26,7 +26,7 @@ import Analytics from './Analytics'; import Notifier from './Notifier'; import UserActivity from './UserActivity'; import Presence from './Presence'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import DMRoomMap from './utils/DMRoomMap'; import Modal from './Modal'; import * as sdk from './index'; diff --git a/src/Modal.js b/src/Modal.js index de441740f1..9b9f190d58 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import ReactDOM from 'react-dom'; import Analytics from './Analytics'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import {defer} from './utils/promise'; import AsyncWrapper from './AsyncWrapper'; diff --git a/src/Notifier.js b/src/Notifier.js index ec92840998..2ffa92452b 100644 --- a/src/Notifier.js +++ b/src/Notifier.js @@ -21,7 +21,7 @@ import PlatformPeg from './PlatformPeg'; import * as TextForEvent from './TextForEvent'; import Analytics from './Analytics'; import * as Avatar from './Avatar'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import * as sdk from './index'; import { _t } from './languageHandler'; import Modal from './Modal'; diff --git a/src/Presence.js b/src/Presence.js index 2fc13a090b..42bca35f96 100644 --- a/src/Presence.js +++ b/src/Presence.js @@ -17,7 +17,7 @@ limitations under the License. */ import {MatrixClientPeg} from "./MatrixClientPeg"; -import dis from "./dispatcher"; +import dis from "./dispatcher/dispatcher"; import Timer from './utils/Timer'; // Time in ms after that a user is considered as unavailable/away diff --git a/src/Registration.js b/src/Registration.js index ca162bac03..32c3d9cc35 100644 --- a/src/Registration.js +++ b/src/Registration.js @@ -20,7 +20,7 @@ limitations under the License. * registration code. */ -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import * as sdk from './index'; import Modal from './Modal'; import { _t } from './languageHandler'; diff --git a/src/Resend.js b/src/Resend.js index 6d6c18cf27..f5f24bffa5 100644 --- a/src/Resend.js +++ b/src/Resend.js @@ -16,7 +16,7 @@ limitations under the License. */ import {MatrixClientPeg} from './MatrixClientPeg'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import { EventStatus } from 'matrix-js-sdk'; export default class Resend { diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 9731e42825..315c2d86f4 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -238,7 +238,7 @@ Example: import {MatrixClientPeg} from './MatrixClientPeg'; import { MatrixEvent } from 'matrix-js-sdk'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import WidgetUtils from './utils/WidgetUtils'; import RoomViewStore from './stores/RoomViewStore'; import { _t } from './languageHandler'; diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index fbb9e2eb0e..fd157b2b4c 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -21,7 +21,7 @@ limitations under the License. import * as React from 'react'; import {MatrixClientPeg} from './MatrixClientPeg'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import * as sdk from './index'; import {_t, _td} from './languageHandler'; import Modal from './Modal'; diff --git a/src/UserActivity.js b/src/UserActivity.js index 0d1b4d0cc0..0174aebaf5 100644 --- a/src/UserActivity.js +++ b/src/UserActivity.js @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import Timer from './utils/Timer'; // important these are larger than the timeouts of timers diff --git a/src/actions/MatrixActionCreators.js b/src/actions/MatrixActionCreators.js index c89ec44435..93a4fcf07c 100644 --- a/src/actions/MatrixActionCreators.js +++ b/src/actions/MatrixActionCreators.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; // TODO: migrate from sync_state to MatrixActions.sync so that more js-sdk events // become dispatches in the same place. diff --git a/src/actions/RoomListActions.ts b/src/actions/RoomListActions.ts index 8ad3ad0781..0cdd3a86d8 100644 --- a/src/actions/RoomListActions.ts +++ b/src/actions/RoomListActions.ts @@ -23,7 +23,7 @@ import { _t } from '../languageHandler'; import * as sdk from '../index'; import { MatrixClient } from "matrix-js-sdk/src/client"; import { Room } from "matrix-js-sdk/src/models/room"; -import { AsyncActionPayload } from "../dispatcher"; +import { AsyncActionPayload } from "../dispatcher/dispatcher"; export default class RoomListActions { /** diff --git a/src/actions/TagOrderActions.ts b/src/actions/TagOrderActions.ts index 57dd0b8793..fa86e3a6b1 100644 --- a/src/actions/TagOrderActions.ts +++ b/src/actions/TagOrderActions.ts @@ -18,7 +18,7 @@ limitations under the License. import Analytics from '../Analytics'; import { asyncAction } from './actionCreators'; import TagOrderStore from '../stores/TagOrderStore'; -import { AsyncActionPayload } from "../dispatcher"; +import { AsyncActionPayload } from "../dispatcher/dispatcher"; import { MatrixClient } from "matrix-js-sdk/src/client"; export default class TagOrderActions { diff --git a/src/actions/actionCreators.ts b/src/actions/actionCreators.ts index 3a0132a969..78525a9509 100644 --- a/src/actions/actionCreators.ts +++ b/src/actions/actionCreators.ts @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { AsyncActionPayload } from "../dispatcher"; +import { AsyncActionPayload } from "../dispatcher/dispatcher"; /** * Create an action thunk that will dispatch actions indicating the current diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 120b086ef6..8af0bf278e 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import * as sdk from '../../../../index'; import PropTypes from 'prop-types'; -import dis from "../../../../dispatcher"; +import dis from "../../../../dispatcher/dispatcher"; import { _t } from '../../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; diff --git a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js index 9e2264a960..f00f2d9c3c 100644 --- a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js +++ b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js @@ -19,7 +19,7 @@ import React from "react"; import PropTypes from "prop-types"; import * as sdk from "../../../../index"; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; -import dis from "../../../../dispatcher"; +import dis from "../../../../dispatcher/dispatcher"; import { _t } from "../../../../languageHandler"; import Modal from "../../../../Modal"; diff --git a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js index c5222dafd5..722334cd70 100644 --- a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js +++ b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js @@ -18,7 +18,7 @@ limitations under the License. import React from "react"; import PropTypes from "prop-types"; import * as sdk from "../../../../index"; -import dis from "../../../../dispatcher"; +import dis from "../../../../dispatcher/dispatcher"; import { _t } from "../../../../languageHandler"; import Modal from "../../../../Modal"; diff --git a/src/components/structures/CustomRoomTagPanel.js b/src/components/structures/CustomRoomTagPanel.js index 6e392ea505..2753d5c4da 100644 --- a/src/components/structures/CustomRoomTagPanel.js +++ b/src/components/structures/CustomRoomTagPanel.js @@ -18,7 +18,7 @@ import React from 'react'; import CustomRoomTagStore from '../../stores/CustomRoomTagStore'; import AutoHideScrollbar from './AutoHideScrollbar'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import classNames from 'classnames'; import * as FormattingUtils from '../../utils/FormattingUtils'; diff --git a/src/components/structures/EmbeddedPage.js b/src/components/structures/EmbeddedPage.js index 0aababf030..49ba3d1227 100644 --- a/src/components/structures/EmbeddedPage.js +++ b/src/components/structures/EmbeddedPage.js @@ -23,7 +23,7 @@ import PropTypes from 'prop-types'; import request from 'browser-request'; import { _t } from '../../languageHandler'; import sanitizeHtml from 'sanitize-html'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import classnames from 'classnames'; import MatrixClientContext from "../../contexts/MatrixClientContext"; diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index 3b32e5c907..1311d6e4f6 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -21,7 +21,7 @@ import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import { getHostingLink } from '../../utils/HostingLink'; import { sanitizedHtmlNode } from '../../HtmlUtils'; import { _t, _td } from '../../languageHandler'; diff --git a/src/components/structures/HomePage.tsx b/src/components/structures/HomePage.tsx index ddf9cd6d00..ff8d35a114 100644 --- a/src/components/structures/HomePage.tsx +++ b/src/components/structures/HomePage.tsx @@ -21,7 +21,7 @@ import { getHomePageUrl } from "../../utils/pages"; import { _t } from "../../languageHandler"; import SdkConfig from "../../SdkConfig"; import * as sdk from "../../index"; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; const onClickSendDm = () => dis.dispatch({action: 'view_create_chat'}); const onClickExplore = () => dis.dispatch({action: 'view_room_directory'}); diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index a9cd12199b..adba858fa3 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Key } from '../../Keyboard'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import * as VectorConferenceHandler from '../../VectorConferenceHandler'; import SettingsStore from '../../settings/SettingsStore'; import {_t} from "../../languageHandler"; diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 9de2aac8e9..e2aa523b8c 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -27,7 +27,7 @@ import PageTypes from '../../PageTypes'; import CallMediaHandler from '../../CallMediaHandler'; import { fixupColorFonts } from '../../utils/FontManager'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import sessionStore from '../../stores/SessionStore'; import {MatrixClientPeg, MatrixClientCreds} from '../../MatrixClientPeg'; import SettingsStore from "../../settings/SettingsStore"; diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index e553057acb..973d301420 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -34,7 +34,7 @@ import {MatrixClientPeg} from "../../MatrixClientPeg"; import PlatformPeg from "../../PlatformPeg"; import SdkConfig from "../../SdkConfig"; import * as RoomListSorter from "../../RoomListSorter"; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; import Notifier from '../../Notifier'; import Modal from "../../Modal"; diff --git a/src/components/structures/MyGroups.js b/src/components/structures/MyGroups.js index f179cab6ad..e2a3d6e71f 100644 --- a/src/components/structures/MyGroups.js +++ b/src/components/structures/MyGroups.js @@ -19,7 +19,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import * as sdk from '../../index'; import { _t } from '../../languageHandler'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import AccessibleButton from '../views/elements/AccessibleButton'; import MatrixClientContext from "../../contexts/MatrixClientContext"; import AutoHideScrollbar from "./AutoHideScrollbar"; diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 34652098b3..c6c330a202 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -22,7 +22,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import RateLimitedFunc from '../../ratelimitedfunc'; import { showGroupInviteDialog, showGroupAddRoomDialog } from '../../GroupAddressPicker'; import GroupStore from '../../stores/GroupStore'; diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 86353cd532..eb784a1083 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -20,7 +20,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import {MatrixClientPeg} from "../../MatrixClientPeg"; import * as sdk from "../../index"; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; import Modal from "../../Modal"; import { linkifyAndSanitizeHtml } from '../../HtmlUtils'; import PropTypes from 'prop-types'; diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 639f38a119..ae628fd06a 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -25,7 +25,7 @@ import * as sdk from '../../index'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import Resend from '../../Resend'; import * as cryptodevices from '../../cryptodevices'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import {messageForResourceLimitError, messageForSendError} from '../../utils/ErrorUtils'; const STATUS_BAR_HIDDEN = 0; diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 4e8e51c3cc..d1abacd2d8 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -20,7 +20,7 @@ limitations under the License. import React, {createRef} from 'react'; import classNames from 'classnames'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import * as Unread from '../../Unread'; import * as RoomNotifs from '../../RoomNotifs'; import * as FormattingUtils from '../../utils/FormattingUtils'; diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index f53929df4a..fc98758bda 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -34,7 +34,7 @@ import ContentMessages from '../../ContentMessages'; import Modal from '../../Modal'; import * as sdk from '../../index'; import CallHandler from '../../CallHandler'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import Tinter from '../../Tinter'; import rate_limited_func from '../../ratelimitedfunc'; import * as ObjectUtils from '../../ObjectUtils'; diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js index 0f3f8a6be9..7e9d290bce 100644 --- a/src/components/structures/SearchBox.js +++ b/src/components/structures/SearchBox.js @@ -19,7 +19,7 @@ import React, {createRef} from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import { Key } from '../../Keyboard'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import { throttle } from 'lodash'; import AccessibleButton from '../../components/views/elements/AccessibleButton'; import classNames from 'classnames'; diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 6642cce098..713ed004b0 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -22,7 +22,7 @@ import TagOrderStore from '../../stores/TagOrderStore'; import GroupActions from '../../actions/GroupActions'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import { _t } from '../../languageHandler'; import { Droppable } from 'react-beautiful-dnd'; diff --git a/src/components/structures/TagPanelButtons.js b/src/components/structures/TagPanelButtons.js index 93a596baa3..4b00da3cbf 100644 --- a/src/components/structures/TagPanelButtons.js +++ b/src/components/structures/TagPanelButtons.js @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import createReactClass from 'create-react-class'; import * as sdk from '../../index'; -import dis from '../../dispatcher'; +import dis from '../../dispatcher/dispatcher'; import Modal from '../../Modal'; import { _t } from '../../languageHandler'; diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 6a08cd78eb..da1369c45f 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -29,7 +29,7 @@ import {MatrixClientPeg} from "../../MatrixClientPeg"; import * as ObjectUtils from "../../ObjectUtils"; import UserActivity from "../../UserActivity"; import Modal from "../../Modal"; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; import * as sdk from "../../index"; import { Key } from '../../Keyboard'; import Timer from '../../utils/Timer'; diff --git a/src/components/structures/TopLeftMenuButton.js b/src/components/structures/TopLeftMenuButton.js index ebd7aaae89..234dc661f9 100644 --- a/src/components/structures/TopLeftMenuButton.js +++ b/src/components/structures/TopLeftMenuButton.js @@ -22,7 +22,7 @@ import BaseAvatar from '../views/avatars/BaseAvatar'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import * as Avatar from '../../Avatar'; import { _t } from '../../languageHandler'; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; import {ContextMenu, ContextMenuButton} from "./ContextMenu"; const AVATAR_SIZE = 28; diff --git a/src/components/structures/UploadBar.js b/src/components/structures/UploadBar.js index 1aec63f04e..421d1d79a7 100644 --- a/src/components/structures/UploadBar.js +++ b/src/components/structures/UploadBar.js @@ -19,7 +19,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import ContentMessages from '../../ContentMessages'; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; import filesize from "filesize"; import { _t } from '../../languageHandler'; diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index 7818496e71..a30a13aceb 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -32,7 +32,7 @@ import * as Lifecycle from '../../../Lifecycle'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import AuthPage from "../../views/auth/AuthPage"; import Login from "../../../Login"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; // Phases // Show controls to configure server details diff --git a/src/components/structures/auth/SoftLogout.js b/src/components/structures/auth/SoftLogout.js index 08ab7e8a61..7c25767291 100644 --- a/src/components/structures/auth/SoftLogout.js +++ b/src/components/structures/auth/SoftLogout.js @@ -18,7 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import {_t} from '../../../languageHandler'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import * as Lifecycle from '../../../Lifecycle'; import Modal from '../../../Modal'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; diff --git a/src/components/views/avatars/MemberAvatar.js b/src/components/views/avatars/MemberAvatar.js index 826aa5fddf..89314cfef7 100644 --- a/src/components/views/avatars/MemberAvatar.js +++ b/src/components/views/avatars/MemberAvatar.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as Avatar from '../../../Avatar'; import * as sdk from "../../../index"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; export default createReactClass({ displayName: 'MemberAvatar', diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 70ab80e6cc..2c835e6967 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -23,7 +23,7 @@ import createReactClass from 'create-react-class'; import {EventStatus} from 'matrix-js-sdk'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; diff --git a/src/components/views/context_menus/RoomTileContextMenu.js b/src/components/views/context_menus/RoomTileContextMenu.js index d281656bbe..b08cf3be60 100644 --- a/src/components/views/context_menus/RoomTileContextMenu.js +++ b/src/components/views/context_menus/RoomTileContextMenu.js @@ -24,7 +24,7 @@ import classNames from 'classnames'; import * as sdk from '../../../index'; import { _t, _td } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import DMRoomMap from '../../../utils/DMRoomMap'; import * as Rooms from '../../../Rooms'; import * as RoomNotifs from '../../../RoomNotifs'; diff --git a/src/components/views/context_menus/TagTileContextMenu.js b/src/components/views/context_menus/TagTileContextMenu.js index 7313a278cc..ff1a7f1b14 100644 --- a/src/components/views/context_menus/TagTileContextMenu.js +++ b/src/components/views/context_menus/TagTileContextMenu.js @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import TagOrderActions from '../../../actions/TagOrderActions'; import * as sdk from '../../../index'; import {MenuItem} from "../../structures/ContextMenu"; diff --git a/src/components/views/context_menus/TopLeftMenu.js b/src/components/views/context_menus/TopLeftMenu.js index 4448ecd041..3ec857be2f 100644 --- a/src/components/views/context_menus/TopLeftMenu.js +++ b/src/components/views/context_menus/TopLeftMenu.js @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import LogoutDialog from "../dialogs/LogoutDialog"; import Modal from "../../../Modal"; diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index 451ec9cfde..41a819c005 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -24,7 +24,7 @@ import createReactClass from 'create-react-class'; import { _t, _td } from '../../../languageHandler'; import * as sdk from '../../../index'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { addressTypes, getAddressType } from '../../../UserAddress.js'; import GroupStore from '../../../stores/GroupStore'; import * as Email from '../../../email'; diff --git a/src/components/views/dialogs/CreateGroupDialog.js b/src/components/views/dialogs/CreateGroupDialog.js index d465ef26a2..10285ccee0 100644 --- a/src/components/views/dialogs/CreateGroupDialog.js +++ b/src/components/views/dialogs/CreateGroupDialog.js @@ -18,7 +18,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; diff --git a/src/components/views/dialogs/CryptoStoreTooNewDialog.js b/src/components/views/dialogs/CryptoStoreTooNewDialog.js index 11e202b0cc..081e84696c 100644 --- a/src/components/views/dialogs/CryptoStoreTooNewDialog.js +++ b/src/components/views/dialogs/CryptoStoreTooNewDialog.js @@ -16,7 +16,7 @@ limitations under the License. import React from 'react'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index a3f9430476..51f905d542 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -25,7 +25,7 @@ import * as FormattingUtils from '../../../utils/FormattingUtils'; import { _t } from '../../../languageHandler'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {ensureDMExists} from "../../../createRoom"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import SettingsStore from '../../../settings/SettingsStore'; import {SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; import VerificationQREmojiOptions from "../verification/VerificationQREmojiOptions"; diff --git a/src/components/views/dialogs/IntegrationsDisabledDialog.js b/src/components/views/dialogs/IntegrationsDisabledDialog.js index 1ca638f0ab..2677963281 100644 --- a/src/components/views/dialogs/IntegrationsDisabledDialog.js +++ b/src/components/views/dialogs/IntegrationsDisabledDialog.js @@ -18,7 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import {_t} from "../../../languageHandler"; import * as sdk from "../../../index"; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; export default class IntegrationsDisabledDialog extends React.Component { static propTypes = { diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 7cbbf8ba64..e62c417a70 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -27,7 +27,7 @@ import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; import * as Email from "../../../email"; import {getDefaultIdentityServerUrl, useDefaultIdentityServer} from "../../../utils/IdentityServerUtils"; import {abbreviateUrl} from "../../../utils/UrlUtils"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import IdentityAuthClient from "../../../IdentityAuthClient"; import Modal from "../../../Modal"; import {humanizeTime} from "../../../utils/humanize"; diff --git a/src/components/views/dialogs/LogoutDialog.js b/src/components/views/dialogs/LogoutDialog.js index 23a6692b39..930acaa0b8 100644 --- a/src/components/views/dialogs/LogoutDialog.js +++ b/src/components/views/dialogs/LogoutDialog.js @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import Modal from '../../../Modal'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; diff --git a/src/components/views/dialogs/RoomSettingsDialog.js b/src/components/views/dialogs/RoomSettingsDialog.js index c5f807b23c..c2b98cd9f3 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.js +++ b/src/components/views/dialogs/RoomSettingsDialog.js @@ -27,7 +27,7 @@ import NotificationSettingsTab from "../settings/tabs/room/NotificationSettingsT import BridgeSettingsTab from "../settings/tabs/room/BridgeSettingsTab"; import * as sdk from "../../../index"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import SettingsStore from "../../../settings/SettingsStore"; export default class RoomSettingsDialog extends React.Component { diff --git a/src/components/views/elements/ActionButton.js b/src/components/views/elements/ActionButton.js index d2277bd69a..7536d66653 100644 --- a/src/components/views/elements/ActionButton.js +++ b/src/components/views/elements/ActionButton.js @@ -18,7 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import AccessibleButton from './AccessibleButton'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import * as sdk from '../../../index'; import Analytics from '../../../Analytics'; diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 80db1718f6..527436b0e4 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -31,7 +31,7 @@ import AppPermission from './AppPermission'; import AppWarning from './AppWarning'; import MessageSpinner from './MessageSpinner'; import WidgetUtils from '../../../utils/WidgetUtils'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import ActiveWidgetStore from '../../../stores/ActiveWidgetStore'; import classNames from 'classnames'; import {IntegrationManagers} from "../../../integrations/IntegrationManagers"; diff --git a/src/components/views/elements/Flair.js b/src/components/views/elements/Flair.js index bc657e9e91..0f06904b68 100644 --- a/src/components/views/elements/Flair.js +++ b/src/components/views/elements/Flair.js @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import FlairStore from '../../../stores/FlairStore'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index 53f2501f19..7f9bfdebf4 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import ResizeObserver from 'resize-observer-polyfill'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; // Shamelessly ripped off Modal.js. There's probably a better way // of doing reusable widgets like dialog boxes & menus where we go and diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 1df12738c5..3e4ddb99e8 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import classNames from 'classnames'; import { Room, RoomMember } from 'matrix-js-sdk'; import PropTypes from 'prop-types'; diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index eae2d13f8a..8d3a7307b9 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -19,7 +19,7 @@ import React from 'react'; import * as sdk from '../../../index'; import {_t} from '../../../languageHandler'; import PropTypes from 'prop-types'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import {wantsDateSeparator} from '../../../DateUtils'; import {MatrixEvent} from 'matrix-js-sdk'; import {makeUserPermalink, RoomPermalinkCreator} from "../../../utils/permalinks/Permalinks"; diff --git a/src/components/views/elements/TagTile.js b/src/components/views/elements/TagTile.js index d8983ac2ea..1af681dadc 100644 --- a/src/components/views/elements/TagTile.js +++ b/src/components/views/elements/TagTile.js @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import classNames from 'classnames'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { isOnlyCtrlOrCmdIgnoreShiftKeyEvent } from '../../../Keyboard'; import * as FormattingUtils from '../../../utils/FormattingUtils'; diff --git a/src/components/views/elements/Tooltip.js b/src/components/views/elements/Tooltip.js index fd845d9db3..4807ade3db 100644 --- a/src/components/views/elements/Tooltip.js +++ b/src/components/views/elements/Tooltip.js @@ -22,7 +22,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import classNames from 'classnames'; const MIN_TOOLTIP_HEIGHT = 25; diff --git a/src/components/views/globals/CookieBar.js b/src/components/views/globals/CookieBar.js index 8774e4f1fa..bf264686d0 100644 --- a/src/components/views/globals/CookieBar.js +++ b/src/components/views/globals/CookieBar.js @@ -16,7 +16,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; import Analytics from '../../../Analytics'; diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 91c930525d..bc5334f2de 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -20,7 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import {_t} from '../../../languageHandler'; import classNames from 'classnames'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; diff --git a/src/components/views/groups/GroupMemberInfo.js b/src/components/views/groups/GroupMemberInfo.js index 9f5660386b..0d08771676 100644 --- a/src/components/views/groups/GroupMemberInfo.js +++ b/src/components/views/groups/GroupMemberInfo.js @@ -19,7 +19,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import Modal from '../../../Modal'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; diff --git a/src/components/views/groups/GroupMemberList.js b/src/components/views/groups/GroupMemberList.js index ca374d1309..b42e325a89 100644 --- a/src/components/views/groups/GroupMemberList.js +++ b/src/components/views/groups/GroupMemberList.js @@ -19,7 +19,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import GroupStore from '../../../stores/GroupStore'; import PropTypes from 'prop-types'; import { showGroupInviteDialog } from '../../../GroupAddressPicker'; diff --git a/src/components/views/groups/GroupMemberTile.js b/src/components/views/groups/GroupMemberTile.js index f99d5c768c..05e3f6ac2a 100644 --- a/src/components/views/groups/GroupMemberTile.js +++ b/src/components/views/groups/GroupMemberTile.js @@ -20,7 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { GroupMemberType } from '../../../groups'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; diff --git a/src/components/views/groups/GroupRoomInfo.js b/src/components/views/groups/GroupRoomInfo.js index 3a20de7eca..8c9b39675e 100644 --- a/src/components/views/groups/GroupRoomInfo.js +++ b/src/components/views/groups/GroupRoomInfo.js @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import Modal from '../../../Modal'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; diff --git a/src/components/views/groups/GroupRoomTile.js b/src/components/views/groups/GroupRoomTile.js index 94d143b263..fd6969a49a 100644 --- a/src/components/views/groups/GroupRoomTile.js +++ b/src/components/views/groups/GroupRoomTile.js @@ -18,7 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { GroupRoomType } from '../../../groups'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; diff --git a/src/components/views/groups/GroupTile.js b/src/components/views/groups/GroupTile.js index b845a83c2a..44ce69ee39 100644 --- a/src/components/views/groups/GroupTile.js +++ b/src/components/views/groups/GroupTile.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import { Draggable, Droppable } from 'react-beautiful-dnd'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import FlairStore from '../../../stores/FlairStore'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; diff --git a/src/components/views/messages/MKeyVerificationRequest.js b/src/components/views/messages/MKeyVerificationRequest.js index f49ae1b6b1..a5b1ae26bb 100644 --- a/src/components/views/messages/MKeyVerificationRequest.js +++ b/src/components/views/messages/MKeyVerificationRequest.js @@ -21,7 +21,7 @@ import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import {getNameForEventRoom, userLabelForEventRoom} from '../../../utils/KeyVerificationStateObserver'; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; export default class MKeyVerificationRequest extends React.Component { diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index 0cde90e417..48b9c58cb8 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import Modal from '../../../Modal'; import {aboveLeftOf, ContextMenu, ContextMenuButton, useContextMenu} from '../../structures/ContextMenu'; import { isContentActionable, canEditContent } from '../../../utils/EventUtils'; diff --git a/src/components/views/messages/RoomCreate.js b/src/components/views/messages/RoomCreate.js index b5749ced97..95bc460636 100644 --- a/src/components/views/messages/RoomCreate.js +++ b/src/components/views/messages/RoomCreate.js @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; import { _t } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 882e331675..c762b95f83 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -25,7 +25,7 @@ import * as HtmlUtils from '../../../HtmlUtils'; import {formatDate} from '../../../DateUtils'; import * as sdk from '../../../index'; import Modal from '../../../Modal'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import * as ContextMenu from '../../structures/ContextMenu'; import SettingsStore from "../../../settings/SettingsStore"; diff --git a/src/components/views/right_panel/HeaderButtons.js b/src/components/views/right_panel/HeaderButtons.js index 03b03218ee..1c66fe5828 100644 --- a/src/components/views/right_panel/HeaderButtons.js +++ b/src/components/views/right_panel/HeaderButtons.js @@ -19,7 +19,7 @@ limitations under the License. */ import React from 'react'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import RightPanelStore from "../../../stores/RightPanelStore"; export const HEADER_KIND_ROOM = "room"; diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 478dc90418..daf1a9490d 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -21,7 +21,7 @@ import React, {useCallback, useMemo, useState, useEffect, useContext} from 'reac import PropTypes from 'prop-types'; import classNames from 'classnames'; import {Group, RoomMember, User} from 'matrix-js-sdk'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import Modal from '../../../Modal'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; diff --git a/src/components/views/room_settings/ColorSettings.js b/src/components/views/room_settings/ColorSettings.js index 1e06da0cd8..1d26e956ab 100644 --- a/src/components/views/room_settings/ColorSettings.js +++ b/src/components/views/room_settings/ColorSettings.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import Tinter from '../../../Tinter'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; const ROOM_COLORS = [ diff --git a/src/components/views/room_settings/UrlPreviewSettings.js b/src/components/views/room_settings/UrlPreviewSettings.js index 5de355ebd7..16dffd857b 100644 --- a/src/components/views/room_settings/UrlPreviewSettings.js +++ b/src/components/views/room_settings/UrlPreviewSettings.js @@ -23,7 +23,7 @@ import createReactClass from 'create-react-class'; import * as sdk from "../../../index"; import { _t, _td } from '../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index b64eb33435..06dfffad30 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -21,7 +21,7 @@ import createReactClass from 'create-react-class'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import AppTile from '../elements/AppTile'; import Modal from '../../../Modal'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import * as sdk from '../../../index'; import * as ScalarMessaging from '../../../ScalarMessaging'; import { _t } from '../../../languageHandler'; diff --git a/src/components/views/rooms/AuxPanel.js b/src/components/views/rooms/AuxPanel.js index e102b0dba4..d6a3b156d5 100644 --- a/src/components/views/rooms/AuxPanel.js +++ b/src/components/views/rooms/AuxPanel.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import * as sdk from '../../../index'; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import * as ObjectUtils from '../../../ObjectUtils'; import AppsDrawer from './AppsDrawer'; import { _t } from '../../../languageHandler'; diff --git a/src/components/views/rooms/EditMessageComposer.js b/src/components/views/rooms/EditMessageComposer.js index 8353940c90..88ed76f118 100644 --- a/src/components/views/rooms/EditMessageComposer.js +++ b/src/components/views/rooms/EditMessageComposer.js @@ -18,7 +18,7 @@ import React from 'react'; import * as sdk from '../../../index'; import {_t} from '../../../languageHandler'; import PropTypes from 'prop-types'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import EditorModel from '../../../editor/model'; import {getCaretOffsetAndText} from '../../../editor/dom'; import {htmlSerializeIfNeeded, textSerialize, containsEmote, stripEmoteCommand} from '../../../editor/serialize'; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 33ee8a0f63..91fcacf0e5 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -25,7 +25,7 @@ import classNames from "classnames"; import { _t, _td } from '../../../languageHandler'; import * as TextForEvent from "../../../TextForEvent"; import * as sdk from "../../../index"; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import SettingsStore from "../../../settings/SettingsStore"; import {EventStatus} from 'matrix-js-sdk'; import {formatTime} from "../../../DateUtils"; diff --git a/src/components/views/rooms/ForwardMessage.js b/src/components/views/rooms/ForwardMessage.js index a3c00598a7..03ca32c5e6 100644 --- a/src/components/views/rooms/ForwardMessage.js +++ b/src/components/views/rooms/ForwardMessage.js @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import { _t } from '../../../languageHandler'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import {Key} from '../../../Keyboard'; diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 6b03000961..5d8e03a050 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -31,7 +31,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import classNames from 'classnames'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import Modal from '../../../Modal'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; diff --git a/src/components/views/rooms/MemberList.js b/src/components/views/rooms/MemberList.js index 3779d461bb..e2d7e3f8e0 100644 --- a/src/components/views/rooms/MemberList.js +++ b/src/components/views/rooms/MemberList.js @@ -20,7 +20,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import AutoHideScrollbar from "../../structures/AutoHideScrollbar"; import {isValid3pidInvite} from "../../../RoomInvite"; import rate_limited_func from "../../../ratelimitedfunc"; diff --git a/src/components/views/rooms/MemberTile.js b/src/components/views/rooms/MemberTile.js index 1c609afcaa..6842e27ed3 100644 --- a/src/components/views/rooms/MemberTile.js +++ b/src/components/views/rooms/MemberTile.js @@ -20,7 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as sdk from "../../../index"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import { _t } from '../../../languageHandler'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 4749742a7d..c05fe3d3a2 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -20,7 +20,7 @@ import { _t } from '../../../languageHandler'; import CallHandler from '../../../CallHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import RoomViewStore from '../../../stores/RoomViewStore'; import Stickerpicker from './Stickerpicker'; import { makeRoomPermalink } from '../../../utils/permalinks/Permalinks'; diff --git a/src/components/views/rooms/PinnedEventTile.js b/src/components/views/rooms/PinnedEventTile.js index 28fc8fc338..924385d226 100644 --- a/src/components/views/rooms/PinnedEventTile.js +++ b/src/components/views/rooms/PinnedEventTile.js @@ -18,7 +18,7 @@ import React from "react"; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import AccessibleButton from "../elements/AccessibleButton"; import MessageEvent from "../messages/MessageEvent"; import MemberAvatar from "../avatars/MemberAvatar"; diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index b28494c65a..e7cd2b4c0d 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -15,7 +15,7 @@ limitations under the License. */ import React from 'react'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import RoomViewStore from '../../../stores/RoomViewStore'; diff --git a/src/components/views/rooms/RoomBreadcrumbs.js b/src/components/views/rooms/RoomBreadcrumbs.js index 86c0d7ca96..fe443d720f 100644 --- a/src/components/views/rooms/RoomBreadcrumbs.js +++ b/src/components/views/rooms/RoomBreadcrumbs.js @@ -15,7 +15,7 @@ limitations under the License. */ import React, {createRef} from "react"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import AccessibleButton from '../elements/AccessibleButton'; diff --git a/src/components/views/rooms/RoomDetailList.js b/src/components/views/rooms/RoomDetailList.js index db7b86da4f..5b45cfc29a 100644 --- a/src/components/views/rooms/RoomDetailList.js +++ b/src/components/views/rooms/RoomDetailList.js @@ -15,7 +15,7 @@ limitations under the License. */ import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import React from 'react'; import { _t } from '../../../languageHandler'; import PropTypes from 'prop-types'; diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 289a89a206..1c59a5d8d0 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -35,7 +35,7 @@ import GroupStore from '../../../stores/GroupStore'; import RoomSubList from '../../structures/RoomSubList'; import ResizeHandle from '../elements/ResizeHandle'; import CallHandler from "../../../CallHandler"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import * as sdk from "../../../index"; import * as Receipt from "../../../utils/Receipt"; import {Resizer} from '../../../resizer'; diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index fe7c57d811..30e6ae9c58 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import classNames from 'classnames'; import { _t } from '../../../languageHandler'; import IdentityAuthClient from '../../../IdentityAuthClient'; diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 6a23fe309b..44e5ae7643 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -21,7 +21,7 @@ import React, {createRef} from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import classNames from 'classnames'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import DMRoomMap from '../../../utils/DMRoomMap'; import * as sdk from '../../../index'; diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 233bb110be..5ea979a8ef 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -16,7 +16,7 @@ limitations under the License. */ import React from 'react'; import PropTypes from 'prop-types'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import EditorModel from '../../../editor/model'; import { htmlSerializeIfNeeded, diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index 9d91ab04b3..fc6e80fc61 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -18,7 +18,7 @@ import {_t, _td} from '../../../languageHandler'; import AppTile from '../elements/AppTile'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import AccessibleButton from '../elements/AccessibleButton'; import WidgetUtils from '../../../utils/WidgetUtils'; import ActiveWidgetStore from '../../../stores/ActiveWidgetStore'; diff --git a/src/components/views/rooms/ThirdPartyMemberInfo.js b/src/components/views/rooms/ThirdPartyMemberInfo.js index 3e6ed16aa4..3a7042ebd2 100644 --- a/src/components/views/rooms/ThirdPartyMemberInfo.js +++ b/src/components/views/rooms/ThirdPartyMemberInfo.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {MatrixEvent} from "matrix-js-sdk"; import {_t} from "../../../languageHandler"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import * as sdk from "../../../index"; import Modal from "../../../Modal"; import {isValid3pidInvite} from "../../../RoomInvite"; diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 7c88573e9c..c7eccf2145 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -20,7 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import AccessibleButton from '../elements/AccessibleButton'; import { _t } from '../../../languageHandler'; import * as sdk from "../../../index"; diff --git a/src/components/views/settings/EnableNotificationsButton.js b/src/components/views/settings/EnableNotificationsButton.js index 9ca591f30e..e4b348dfbd 100644 --- a/src/components/views/settings/EnableNotificationsButton.js +++ b/src/components/views/settings/EnableNotificationsButton.js @@ -17,7 +17,7 @@ limitations under the License. import React from "react"; import createReactClass from 'create-react-class'; import Notifier from "../../../Notifier"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import { _t } from '../../../languageHandler'; export default createReactClass({ diff --git a/src/components/views/settings/IntegrationManager.js b/src/components/views/settings/IntegrationManager.js index a5150e3777..fd6a62d73a 100644 --- a/src/components/views/settings/IntegrationManager.js +++ b/src/components/views/settings/IntegrationManager.js @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import {Key} from "../../../Keyboard"; export default class IntegrationManager extends React.Component { diff --git a/src/components/views/settings/SetIdServer.js b/src/components/views/settings/SetIdServer.js index cb37271452..23e72e2352 100644 --- a/src/components/views/settings/SetIdServer.js +++ b/src/components/views/settings/SetIdServer.js @@ -21,7 +21,7 @@ import {_t} from "../../../languageHandler"; import * as sdk from '../../../index'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import Modal from '../../../Modal'; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import { getThreepidsWithBindStatus } from '../../../boundThreepids'; import IdentityAuthClient from "../../../IdentityAuthClient"; import {abbreviateUrl, unabbreviateUrl} from "../../../utils/UrlUtils"; diff --git a/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.js b/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.js index 9ee9c8d130..f57d5d3798 100644 --- a/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.js +++ b/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.js @@ -21,7 +21,7 @@ import {MatrixClientPeg} from "../../../../../MatrixClientPeg"; import * as sdk from "../../../../.."; import AccessibleButton from "../../../elements/AccessibleButton"; import Modal from "../../../../../Modal"; -import dis from "../../../../../dispatcher"; +import dis from "../../../../../dispatcher/dispatcher"; export default class AdvancedRoomSettingsTab extends React.Component { static propTypes = { diff --git a/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.js b/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.js index 99882ae400..1f12396413 100644 --- a/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.js +++ b/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.js @@ -20,7 +20,7 @@ import {_t} from "../../../../../languageHandler"; import RoomProfileSettings from "../../../room_settings/RoomProfileSettings"; import * as sdk from "../../../../.."; import AccessibleButton from "../../../elements/AccessibleButton"; -import dis from "../../../../../dispatcher"; +import dis from "../../../../../dispatcher/dispatcher"; import MatrixClientContext from "../../../../../contexts/MatrixClientContext"; export default class GeneralRoomSettingsTab extends React.Component { diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index 867982ad2b..216bffc3ed 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -32,7 +32,7 @@ import PlatformPeg from "../../../../../PlatformPeg"; import {MatrixClientPeg} from "../../../../../MatrixClientPeg"; import * as sdk from "../../../../.."; import Modal from "../../../../../Modal"; -import dis from "../../../../../dispatcher"; +import dis from "../../../../../dispatcher/dispatcher"; import {Service, startTermsFlow} from "../../../../../Terms"; import {SERVICE_TYPES} from "matrix-js-sdk"; import IdentityAuthClient from "../../../../../IdentityAuthClient"; diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js index 5dd6475e6e..bed057f03d 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js @@ -25,7 +25,7 @@ import Analytics from "../../../../../Analytics"; import Modal from "../../../../../Modal"; import * as sdk from "../../../../.."; import {sleep} from "../../../../../utils/promise"; -import dis from "../../../../../dispatcher"; +import dis from "../../../../../dispatcher/dispatcher"; export class IgnoredUser extends React.Component { static propTypes = { diff --git a/src/components/views/toasts/BulkUnverifiedSessionsToast.js b/src/components/views/toasts/BulkUnverifiedSessionsToast.js index 0c40e56858..99ff529c35 100644 --- a/src/components/views/toasts/BulkUnverifiedSessionsToast.js +++ b/src/components/views/toasts/BulkUnverifiedSessionsToast.js @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import DeviceListener from '../../../DeviceListener'; import FormButton from '../elements/FormButton'; diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 6447e87627..421dd7bea1 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -21,7 +21,7 @@ import { _t } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; import {userLabelForEventRoom} from "../../../utils/KeyVerificationStateObserver"; -import dis from "../../../dispatcher"; +import dis from "../../../dispatcher/dispatcher"; import ToastStore from "../../../stores/ToastStore"; import Modal from "../../../Modal"; diff --git a/src/components/views/voip/CallPreview.js b/src/components/views/voip/CallPreview.js index 049dd8a3c6..c465170950 100644 --- a/src/components/views/voip/CallPreview.js +++ b/src/components/views/voip/CallPreview.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import RoomViewStore from '../../../stores/RoomViewStore'; import CallHandler from '../../../CallHandler'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import * as sdk from '../../../index'; export default createReactClass({ diff --git a/src/components/views/voip/CallView.js b/src/components/views/voip/CallView.js index 4a5f3923e2..a0a566dfac 100644 --- a/src/components/views/voip/CallView.js +++ b/src/components/views/voip/CallView.js @@ -17,7 +17,7 @@ limitations under the License. import React, {createRef} from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import CallHandler from '../../../CallHandler'; import * as sdk from '../../../index'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; diff --git a/src/components/views/voip/IncomingCallBox.js b/src/components/views/voip/IncomingCallBox.js index 53e829b784..bf28fa0157 100644 --- a/src/components/views/voip/IncomingCallBox.js +++ b/src/components/views/voip/IncomingCallBox.js @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; diff --git a/src/components/views/voip/VideoView.js b/src/components/views/voip/VideoView.js index 51be6db81d..a51ab70da9 100644 --- a/src/components/views/voip/VideoView.js +++ b/src/components/views/voip/VideoView.js @@ -22,7 +22,7 @@ import createReactClass from 'create-react-class'; import classNames from 'classnames'; import * as sdk from '../../../index'; -import dis from '../../../dispatcher'; +import dis from '../../../dispatcher/dispatcher'; import SettingsStore from "../../../settings/SettingsStore"; diff --git a/src/createRoom.js b/src/createRoom.js index a39d2c2216..18fc787e1c 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -19,7 +19,7 @@ import {MatrixClientPeg} from './MatrixClientPeg'; import Modal from './Modal'; import * as sdk from './index'; import { _t } from './languageHandler'; -import dis from "./dispatcher"; +import dis from "./dispatcher/dispatcher"; import * as Rooms from "./Rooms"; import DMRoomMap from "./utils/DMRoomMap"; import {getAddressType} from "./UserAddress"; diff --git a/src/cryptodevices.js b/src/cryptodevices.js index f56a80e1e4..86b97364f9 100644 --- a/src/cryptodevices.js +++ b/src/cryptodevices.js @@ -16,7 +16,7 @@ limitations under the License. import Resend from './Resend'; import * as sdk from './index'; -import dis from './dispatcher'; +import dis from './dispatcher/dispatcher'; import Modal from './Modal'; import { _t } from './languageHandler'; diff --git a/src/dispatcher.ts b/src/dispatcher/dispatcher.ts similarity index 100% rename from src/dispatcher.ts rename to src/dispatcher/dispatcher.ts diff --git a/src/mjolnir/Mjolnir.js b/src/mjolnir/Mjolnir.js index 5836ffd57a..9876cb1f7f 100644 --- a/src/mjolnir/Mjolnir.js +++ b/src/mjolnir/Mjolnir.js @@ -18,7 +18,7 @@ import {MatrixClientPeg} from "../MatrixClientPeg"; import {ALL_RULE_TYPES, BanList} from "./BanList"; import SettingsStore, {SettingLevel} from "../settings/SettingsStore"; import {_t} from "../languageHandler"; -import dis from "../dispatcher"; +import dis from "../dispatcher/dispatcher"; // TODO: Move this and related files to the js-sdk or something once finalized. diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js index 0122916bc3..36111dd46f 100644 --- a/src/settings/SettingsStore.js +++ b/src/settings/SettingsStore.js @@ -24,7 +24,7 @@ import RoomSettingsHandler from "./handlers/RoomSettingsHandler"; import ConfigSettingsHandler from "./handlers/ConfigSettingsHandler"; import {_t} from '../languageHandler'; import SdkConfig from "../SdkConfig"; -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import {SETTINGS} from "./Settings"; import LocalEchoWrapper from "./handlers/LocalEchoWrapper"; import {WatchManager} from "./WatchManager"; diff --git a/src/settings/controllers/CustomStatusController.js b/src/settings/controllers/CustomStatusController.js index 0fc6619d92..031387bb6a 100644 --- a/src/settings/controllers/CustomStatusController.js +++ b/src/settings/controllers/CustomStatusController.js @@ -15,7 +15,7 @@ limitations under the License. */ import SettingController from "./SettingController"; -import dis from "../../dispatcher"; +import dis from "../../dispatcher/dispatcher"; export default class CustomStatusController extends SettingController { onChange(level, roomId, newValue) { diff --git a/src/stores/CustomRoomTagStore.js b/src/stores/CustomRoomTagStore.js index 909282c085..c67868e2c6 100644 --- a/src/stores/CustomRoomTagStore.js +++ b/src/stores/CustomRoomTagStore.js @@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import * as RoomNotifs from '../RoomNotifs'; import RoomListStore from './RoomListStore'; import EventEmitter from 'events'; diff --git a/src/stores/GroupStore.js b/src/stores/GroupStore.js index 78a144f755..d4097184a1 100644 --- a/src/stores/GroupStore.js +++ b/src/stores/GroupStore.js @@ -18,7 +18,7 @@ import EventEmitter from 'events'; import { groupMemberFromApiObject, groupRoomFromApiObject } from '../groups'; import FlairStore from './FlairStore'; import {MatrixClientPeg} from '../MatrixClientPeg'; -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; function parseMembersResponse(response) { return response.chunk.map((apiMember) => groupMemberFromApiObject(apiMember)); diff --git a/src/stores/LifecycleStore.js b/src/stores/LifecycleStore.js index 904f29f7b3..a12bac7dd6 100644 --- a/src/stores/LifecycleStore.js +++ b/src/stores/LifecycleStore.js @@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import {Store} from 'flux/utils'; const INITIAL_STATE = { diff --git a/src/stores/RightPanelStore.js b/src/stores/RightPanelStore.js index 3a5605ba3f..a73f3befbb 100644 --- a/src/stores/RightPanelStore.js +++ b/src/stores/RightPanelStore.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import {pendingVerificationRequestForUser} from '../verification'; import {Store} from 'flux/utils'; import SettingsStore, {SettingLevel} from "../settings/SettingsStore"; diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 89edc9a8ef..d7b6759195 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ import {Store} from 'flux/utils'; -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import DMRoomMap from '../utils/DMRoomMap'; import * as Unread from '../Unread'; import SettingsStore from "../settings/SettingsStore"; diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index 841734dfb7..3d82d086d7 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import {Store} from 'flux/utils'; import {MatrixClientPeg} from '../MatrixClientPeg'; import * as sdk from '../index'; diff --git a/src/stores/SessionStore.js b/src/stores/SessionStore.js index f38bc046d0..096811940c 100644 --- a/src/stores/SessionStore.js +++ b/src/stores/SessionStore.js @@ -14,7 +14,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import {Store} from 'flux/utils'; const INITIAL_STATE = { diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index c05728e497..2acf531d86 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ import {Store} from 'flux/utils'; -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import GroupStore from './GroupStore'; import Analytics from '../Analytics'; import * as RoomNotifs from "../RoomNotifs"; diff --git a/src/theme.js b/src/theme.js index 2ccce81a8d..1da39d50fa 100644 --- a/src/theme.js +++ b/src/theme.js @@ -19,7 +19,7 @@ import {_t} from "./languageHandler"; export const DEFAULT_THEME = "light"; import Tinter from "./Tinter"; -import dis from "./dispatcher"; +import dis from "./dispatcher/dispatcher"; import SettingsStore, {SettingLevel} from "./settings/SettingsStore"; import ThemeController from "./settings/controllers/ThemeController"; diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index ad4c02887e..35e23f0429 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -18,7 +18,7 @@ limitations under the License. import {MatrixClientPeg} from '../MatrixClientPeg'; import SdkConfig from "../SdkConfig"; -import dis from '../dispatcher'; +import dis from '../dispatcher/dispatcher'; import * as url from "url"; import WidgetEchoStore from '../stores/WidgetEchoStore'; diff --git a/src/verification.js b/src/verification.js index f488b2ebeb..289ac9544b 100644 --- a/src/verification.js +++ b/src/verification.js @@ -15,7 +15,7 @@ limitations under the License. */ import {MatrixClientPeg} from './MatrixClientPeg'; -import dis from "./dispatcher"; +import dis from "./dispatcher/dispatcher"; import Modal from './Modal'; import * as sdk from './index'; import { _t } from './languageHandler'; diff --git a/test/components/views/rooms/RoomList-test.js b/test/components/views/rooms/RoomList-test.js index 8dc4647920..235ed61016 100644 --- a/test/components/views/rooms/RoomList-test.js +++ b/test/components/views/rooms/RoomList-test.js @@ -9,7 +9,7 @@ import {MatrixClientPeg} from '../../../../src/MatrixClientPeg'; import sdk from '../../../skinned-sdk'; import { DragDropContext } from 'react-beautiful-dnd'; -import dis from '../../../../src/dispatcher'; +import dis from '../../../../src/dispatcher/dispatcher'; import DMRoomMap from '../../../../src/utils/DMRoomMap.js'; import GroupStore from '../../../../src/stores/GroupStore.js'; diff --git a/test/test-utils.js b/test/test-utils.js index d7aa9d5de9..2d7c1bd62c 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -2,7 +2,7 @@ import React from 'react'; import {MatrixClientPeg as peg} from '../src/MatrixClientPeg'; -import dis from '../src/dispatcher'; +import dis from '../src/dispatcher/dispatcher'; import {makeType} from "../src/utils/TypeUtils"; import {ValidatedServerConfig} from "../src/utils/AutoDiscoveryUtils"; import ShallowRenderer from 'react-test-renderer/shallow'; From 8c72c27da9afe371e15f2f010d61fe4608c788c1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 13 May 2020 20:46:00 -0600 Subject: [PATCH 254/319] Break out actions and payloads to their own files The definitions take up a lot of space which makes it hard to see the dispatcher class, so break them out. --- src/actions/RoomListActions.ts | 2 +- src/actions/TagOrderActions.ts | 2 +- src/actions/actionCreators.ts | 2 +- src/dispatcher/actions.ts | 23 +++++++++++++ src/dispatcher/dispatcher.ts | 51 ++--------------------------- src/dispatcher/payloads.ts | 59 ++++++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 52 deletions(-) create mode 100644 src/dispatcher/actions.ts create mode 100644 src/dispatcher/payloads.ts diff --git a/src/actions/RoomListActions.ts b/src/actions/RoomListActions.ts index 0cdd3a86d8..eb9831ec47 100644 --- a/src/actions/RoomListActions.ts +++ b/src/actions/RoomListActions.ts @@ -23,7 +23,7 @@ import { _t } from '../languageHandler'; import * as sdk from '../index'; import { MatrixClient } from "matrix-js-sdk/src/client"; import { Room } from "matrix-js-sdk/src/models/room"; -import { AsyncActionPayload } from "../dispatcher/dispatcher"; +import { AsyncActionPayload } from "../dispatcher/payloads"; export default class RoomListActions { /** diff --git a/src/actions/TagOrderActions.ts b/src/actions/TagOrderActions.ts index fa86e3a6b1..fa95ea1037 100644 --- a/src/actions/TagOrderActions.ts +++ b/src/actions/TagOrderActions.ts @@ -18,7 +18,7 @@ limitations under the License. import Analytics from '../Analytics'; import { asyncAction } from './actionCreators'; import TagOrderStore from '../stores/TagOrderStore'; -import { AsyncActionPayload } from "../dispatcher/dispatcher"; +import { AsyncActionPayload } from "../dispatcher/payloads"; import { MatrixClient } from "matrix-js-sdk/src/client"; export default class TagOrderActions { diff --git a/src/actions/actionCreators.ts b/src/actions/actionCreators.ts index 78525a9509..d84868a141 100644 --- a/src/actions/actionCreators.ts +++ b/src/actions/actionCreators.ts @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { AsyncActionPayload } from "../dispatcher/dispatcher"; +import { AsyncActionPayload } from "../dispatcher/payloads"; /** * Create an action thunk that will dispatch actions indicating the current diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts new file mode 100644 index 0000000000..ff1650e4e5 --- /dev/null +++ b/src/dispatcher/actions.ts @@ -0,0 +1,23 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Dispatcher actions also extend into any arbitrary string, so support that. +export type DispatcherAction = Action | string; + +export enum Action { + // TODO: Populate with actual actions +} + diff --git a/src/dispatcher/dispatcher.ts b/src/dispatcher/dispatcher.ts index fce99df055..6ef165c485 100644 --- a/src/dispatcher/dispatcher.ts +++ b/src/dispatcher/dispatcher.ts @@ -17,55 +17,8 @@ limitations under the License. */ import { Dispatcher } from "flux"; - -export enum Action { - // TODO: Populate with actual actions -} - -// Dispatcher actions also extend into any arbitrary string, so support that. -export type DispatcherAction = Action | string; - -/** - * The base dispatch type exposed by our dispatcher. - */ -export interface ActionPayload { - [property: string]: any; // effectively makes this 'extends Object' - action: DispatcherAction; -} - -/** - * The function the dispatcher calls when ready for an AsyncActionPayload. The - * single argument is used to start a dispatch. First the dispatcher calls the - * outer function, then when the called function is ready it calls the cb - * function to issue the dispatch. It may call the callback repeatedly if needed. - */ -export type AsyncActionFn = (cb: (action: ActionPayload) => void) => void; - -/** - * An async version of ActionPayload - */ -export class AsyncActionPayload implements ActionPayload { - /** - * The function the dispatcher should call. - */ - public readonly fn: AsyncActionFn; - - /** - * @deprecated Not used on AsyncActionPayload. - */ - public get action(): DispatcherAction { - return "NOT_USED"; - } - - /** - * Create a new AsyncActionPayload with the given ready function. - * @param {AsyncActionFn} readyFn The function to be called when the - * dispatcher is ready. - */ - public constructor(readyFn: AsyncActionFn) { - this.fn = readyFn; - } -} +import { Action } from "./actions"; +import { ActionPayload, AsyncActionPayload } from "./payloads"; /** * A dispatcher for ActionPayloads (the default within the SDK). diff --git a/src/dispatcher/payloads.ts b/src/dispatcher/payloads.ts new file mode 100644 index 0000000000..fa45b30623 --- /dev/null +++ b/src/dispatcher/payloads.ts @@ -0,0 +1,59 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { DispatcherAction } from "./actions"; + +/** + * The base dispatch type exposed by our dispatcher. + */ +export interface ActionPayload { + [property: string]: any; // effectively makes this 'extends Object' + action: DispatcherAction; +} + +/** + * The function the dispatcher calls when ready for an AsyncActionPayload. The + * single argument is used to start a dispatch. First the dispatcher calls the + * outer function, then when the called function is ready it calls the cb + * function to issue the dispatch. It may call the callback repeatedly if needed. + */ +export type AsyncActionFn = (cb: (action: ActionPayload) => void) => void; + +/** + * An async version of ActionPayload + */ +export class AsyncActionPayload implements ActionPayload { + /** + * The function the dispatcher should call. + */ + public readonly fn: AsyncActionFn; + + /** + * @deprecated Not used on AsyncActionPayload. + */ + public get action(): DispatcherAction { + return "NOT_USED"; + } + + /** + * Create a new AsyncActionPayload with the given ready function. + * @param {AsyncActionFn} readyFn The function to be called when the + * dispatcher is ready. + */ + public constructor(readyFn: AsyncActionFn) { + this.fn = readyFn; + } +} From a3b4c2dfa02d1ae5ee959eaaa59e6544a0cea6d1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 13 May 2020 20:48:49 -0600 Subject: [PATCH 255/319] Convert more async actions to AsyncActionPayload --- src/actions/GroupActions.js | 34 ---------------------------------- src/actions/GroupActions.ts | 34 ++++++++++++++++++++++++++++++++++ src/actions/TagOrderActions.ts | 3 +-- src/actions/actionCreators.ts | 5 ++--- 4 files changed, 37 insertions(+), 39 deletions(-) delete mode 100644 src/actions/GroupActions.js create mode 100644 src/actions/GroupActions.ts diff --git a/src/actions/GroupActions.js b/src/actions/GroupActions.js deleted file mode 100644 index 006c2da5b8..0000000000 --- a/src/actions/GroupActions.js +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2017 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { asyncAction } from './actionCreators'; - -const GroupActions = {}; - -/** - * Creates an action thunk that will do an asynchronous request to fetch - * the groups to which a user is joined. - * - * @param {MatrixClient} matrixClient the matrix client to query. - * @returns {function} an action thunk that will dispatch actions - * indicating the status of the request. - * @see asyncAction - */ -GroupActions.fetchJoinedGroups = function(matrixClient) { - return asyncAction('GroupActions.fetchJoinedGroups', () => matrixClient.getJoinedGroups()); -}; - -export default GroupActions; diff --git a/src/actions/GroupActions.ts b/src/actions/GroupActions.ts new file mode 100644 index 0000000000..81470d1221 --- /dev/null +++ b/src/actions/GroupActions.ts @@ -0,0 +1,34 @@ +/* +Copyright 2017 New Vector Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { asyncAction } from './actionCreators'; +import { AsyncActionPayload } from "../dispatcher/payloads"; +import { MatrixClient } from "matrix-js-sdk/src/client"; + +export default class GroupActions { + /** + * Creates an action thunk that will do an asynchronous request to fetch + * the groups to which a user is joined. + * + * @param {MatrixClient} matrixClient the matrix client to query. + * @returns {AsyncActionPayload} An async action payload. + * @see asyncAction + */ + public static fetchJoinedGroups(matrixClient: MatrixClient): AsyncActionPayload { + return asyncAction('GroupActions.fetchJoinedGroups', () => matrixClient.getJoinedGroups(), null); + } +} diff --git a/src/actions/TagOrderActions.ts b/src/actions/TagOrderActions.ts index fa95ea1037..bf1820d5d1 100644 --- a/src/actions/TagOrderActions.ts +++ b/src/actions/TagOrderActions.ts @@ -90,8 +90,7 @@ export default class TagOrderActions { if (removedTags.includes(tag)) { // Return a thunk that doesn't do anything, we don't even need // an asynchronous action here, the tag is already removed. - return () => { - }; + return new AsyncActionPayload(() => {}); } removedTags.push(tag); diff --git a/src/actions/actionCreators.ts b/src/actions/actionCreators.ts index d84868a141..c789e3cd07 100644 --- a/src/actions/actionCreators.ts +++ b/src/actions/actionCreators.ts @@ -44,12 +44,11 @@ import { AsyncActionPayload } from "../dispatcher/payloads"; * result is the result of the promise returned by * `fn`. */ -export function asyncAction(id: string, fn: () => Promise, pendingFn: () => any): AsyncActionPayload { +export function asyncAction(id: string, fn: () => Promise, pendingFn: () => any | null): AsyncActionPayload { const helper = (dispatch) => { dispatch({ action: id + '.pending', - request: - typeof pendingFn === 'function' ? pendingFn() : undefined, + request: typeof pendingFn === 'function' ? pendingFn() : undefined, }); fn().then((result) => { dispatch({action: id + '.success', result}); From a5f3318f3bec7d66c20a862669c3c1b938b362a6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 13 May 2020 21:03:12 -0600 Subject: [PATCH 256/319] Convert view_user dispatch to prove the conversion works This is a relatively obvious dispatch action that doesn't require a lot of complicated type definitions, so should be a good candidate to prove the thing works. If for some reason the thing stops working, we've done something wrong. This also adds a bit of generic types to the dispatch call so we don't confuse the tsx parser by using `dis.dispatch({...})` as it thinks that's supposed to be a component. We still get type safety, and the thing remains happy with the generics approach. --- src/SlashCommands.tsx | 8 +++-- src/components/structures/MatrixChat.tsx | 26 ++++++++--------- src/components/structures/RightPanel.js | 5 ++-- src/components/views/avatars/MemberAvatar.js | 5 ++-- src/components/views/elements/Pill.js | 3 +- .../views/groups/GroupMemberInfo.js | 5 ++-- .../views/right_panel/GroupHeaderButtons.js | 6 ++-- .../views/right_panel/RoomHeaderButtons.js | 6 ++-- src/components/views/right_panel/UserInfo.js | 3 +- src/components/views/rooms/MemberInfo.js | 3 +- src/components/views/rooms/MemberTile.js | 3 +- src/dispatcher/actions.ts | 14 +++++++++ src/dispatcher/dispatcher.ts | 2 +- src/dispatcher/payloads/ViewUserPayload.ts | 29 +++++++++++++++++++ 14 files changed, 88 insertions(+), 30 deletions(-) create mode 100644 src/dispatcher/payloads/ViewUserPayload.ts diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index fd157b2b4c..d81da80e8d 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -41,6 +41,8 @@ import { parseFragment as parseHtml } from "parse5"; import sendBugReport from "./rageshake/submit-rageshake"; import SdkConfig from "./SdkConfig"; import { ensureDMExists } from "./createRoom"; +import { ViewUserPayload } from "./dispatcher/payloads/ViewUserPayload"; +import { Action } from "./dispatcher/actions"; // XXX: workaround for https://github.com/microsoft/TypeScript/issues/31816 interface HTMLInputEvent extends Event { @@ -943,8 +945,10 @@ export const Commands = [ } const member = MatrixClientPeg.get().getRoom(roomId).getMember(userId); - dis.dispatch({ - action: 'view_user', + dis.dispatch({ + action: Action.ViewUser, + // XXX: We should be using a real member object and not assuming what the + // receiver wants. member: member || {userId}, }); return success(); diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 973d301420..d368b2c23a 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -17,12 +17,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, {createRef} from 'react'; -import {InvalidStoreError} from "matrix-js-sdk/src/errors"; -import {RoomMember} from "matrix-js-sdk/src/models/room-member"; -import {MatrixEvent} from "matrix-js-sdk/src/models/event"; +import React, { createRef } from 'react'; +import { InvalidStoreError } from "matrix-js-sdk/src/errors"; +import { RoomMember } from "matrix-js-sdk/src/models/room-member"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { isCryptoAvailable } from 'matrix-js-sdk/src/crypto'; - // focus-visible is a Polyfill for the :focus-visible CSS pseudo-attribute used by _AccessibleButton.scss import 'focus-visible'; // what-input helps improve keyboard accessibility @@ -30,7 +29,7 @@ import 'what-input'; import Analytics from "../../Analytics"; import { DecryptionFailureTracker } from "../../DecryptionFailureTracker"; -import {MatrixClientPeg} from "../../MatrixClientPeg"; +import { MatrixClientPeg } from "../../MatrixClientPeg"; import PlatformPeg from "../../PlatformPeg"; import SdkConfig from "../../SdkConfig"; import * as RoomListSorter from "../../RoomListSorter"; @@ -40,7 +39,7 @@ import Notifier from '../../Notifier'; import Modal from "../../Modal"; import Tinter from "../../Tinter"; import * as sdk from '../../index'; -import { showStartChatInviteDialog, showRoomInviteDialog } from '../../RoomInvite'; +import { showRoomInviteDialog, showStartChatInviteDialog } from '../../RoomInvite'; import * as Rooms from '../../Rooms'; import linkifyMatrix from "../../linkify-matrix"; import * as Lifecycle from '../../Lifecycle'; @@ -52,21 +51,22 @@ import { getHomePageUrl } from '../../utils/pages'; import createRoom from "../../createRoom"; import KeyRequestHandler from '../../KeyRequestHandler'; import { _t, getCurrentLanguage } from '../../languageHandler'; -import SettingsStore, {SettingLevel} from "../../settings/SettingsStore"; +import SettingsStore, { SettingLevel } from "../../settings/SettingsStore"; import ThemeController from "../../settings/controllers/ThemeController"; import { startAnyRegistrationFlow } from "../../Registration.js"; import { messageForSyncError } from '../../utils/ErrorUtils'; import ResizeNotifier from "../../utils/ResizeNotifier"; -import { ValidatedServerConfig } from "../../utils/AutoDiscoveryUtils"; -import AutoDiscoveryUtils from "../../utils/AutoDiscoveryUtils"; +import AutoDiscoveryUtils, { ValidatedServerConfig } from "../../utils/AutoDiscoveryUtils"; import DMRoomMap from '../../utils/DMRoomMap'; import { countRoomsWithNotif } from '../../RoomNotifs'; import { ThemeWatcher } from "../../theme"; import { storeRoomAliasInCache } from '../../RoomAliasCache'; -import {defer, IDeferred} from "../../utils/promise"; +import { defer, IDeferred } from "../../utils/promise"; import ToastStore from "../../stores/ToastStore"; import * as StorageManager from "../../utils/StorageManager"; import type LoggedInViewType from "./LoggedInView"; +import { ViewUserPayload } from "../../dispatcher/payloads/ViewUserPayload"; +import { Action } from "../../dispatcher/actions"; /** constants for MatrixChat.state.view */ export enum Views { @@ -1755,8 +1755,8 @@ export default class MatrixChat extends React.PureComponent { const member = new RoomMember(null, userId); if (!member) { return; } - dis.dispatch({ - action: 'view_user', + dis.dispatch({ + action: Action.ViewUser, member: member, }); } diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index c6c330a202..56cc92a8f8 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -30,6 +30,7 @@ import SettingsStore from "../../settings/SettingsStore"; import {RIGHT_PANEL_PHASES, RIGHT_PANEL_PHASES_NO_ARGS} from "../../stores/RightPanelStorePhases"; import RightPanelStore from "../../stores/RightPanelStore"; import MatrixClientContext from "../../contexts/MatrixClientContext"; +import {Action} from "../../dispatcher/actions"; export default class RightPanel extends React.Component { static get propTypes() { @@ -237,7 +238,7 @@ export default class RightPanel extends React.Component { // within a room, so go back to the member panel if we were in the encryption panel, // or the member list if we were in the member panel... phew. dis.dispatch({ - action: "view_user", + action: Action.ViewUser, member: this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel ? this.state.member : null, }); @@ -266,7 +267,7 @@ export default class RightPanel extends React.Component { if (SettingsStore.getValue("feature_cross_signing")) { const onClose = () => { dis.dispatch({ - action: "view_user", + action: Action.ViewUser, member: null, }); }; diff --git a/src/components/views/avatars/MemberAvatar.js b/src/components/views/avatars/MemberAvatar.js index 89314cfef7..d28d80e62a 100644 --- a/src/components/views/avatars/MemberAvatar.js +++ b/src/components/views/avatars/MemberAvatar.js @@ -21,6 +21,7 @@ import createReactClass from 'create-react-class'; import * as Avatar from '../../../Avatar'; import * as sdk from "../../../index"; import dis from "../../../dispatcher/dispatcher"; +import {Action} from "../../../dispatcher/actions"; export default createReactClass({ displayName: 'MemberAvatar', @@ -33,7 +34,7 @@ export default createReactClass({ resizeMethod: PropTypes.string, // The onClick to give the avatar onClick: PropTypes.func, - // Whether the onClick of the avatar should be overriden to dispatch 'view_user' + // Whether the onClick of the avatar should be overriden to dispatch `Action.ViewUser` viewUserOnClick: PropTypes.bool, title: PropTypes.string, }, @@ -85,7 +86,7 @@ export default createReactClass({ if (viewUserOnClick) { onClick = () => { dis.dispatch({ - action: 'view_user', + action: Action.ViewUser, member: this.props.member, }); }; diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 3e4ddb99e8..03a1aeed85 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -26,6 +26,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg'; import FlairStore from "../../../stores/FlairStore"; import {getPrimaryPermalinkEntity} from "../../../utils/permalinks/Permalinks"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import {Action} from "../../../dispatcher/actions"; // For URLs of matrix.to links in the timeline which have been reformatted by // HttpUtils transformTags to relative links. This excludes event URLs (with `[^\/]*`) @@ -191,7 +192,7 @@ const Pill = createReactClass({ onUserPillClicked: function() { dis.dispatch({ - action: 'view_user', + action: Action.ViewUser, member: this.state.member, }); }, diff --git a/src/components/views/groups/GroupMemberInfo.js b/src/components/views/groups/GroupMemberInfo.js index 0d08771676..2582cab573 100644 --- a/src/components/views/groups/GroupMemberInfo.js +++ b/src/components/views/groups/GroupMemberInfo.js @@ -28,6 +28,7 @@ import GroupStore from '../../../stores/GroupStore'; import AccessibleButton from '../elements/AccessibleButton'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import AutoHideScrollbar from "../../structures/AutoHideScrollbar"; +import {Action} from "../../../dispatcher/actions"; export default createReactClass({ displayName: 'GroupMemberInfo', @@ -103,7 +104,7 @@ export default createReactClass({ ).then(() => { // return to the user list dis.dispatch({ - action: "view_user", + action: Action.ViewUser, member: null, }); }).catch((e) => { @@ -124,7 +125,7 @@ export default createReactClass({ _onCancel: function(e) { // Go back to the user list dis.dispatch({ - action: "view_user", + action: Action.ViewUser, member: null, }); }, diff --git a/src/components/views/right_panel/GroupHeaderButtons.js b/src/components/views/right_panel/GroupHeaderButtons.js index f164b6c578..33d9325433 100644 --- a/src/components/views/right_panel/GroupHeaderButtons.js +++ b/src/components/views/right_panel/GroupHeaderButtons.js @@ -23,6 +23,8 @@ import { _t } from '../../../languageHandler'; import HeaderButton from './HeaderButton'; import HeaderButtons, {HEADER_KIND_GROUP} from './HeaderButtons'; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; +import {Action} from "../../../dispatcher/actions"; +import {ActionPayload} from "../../../dispatcher/payloads"; const GROUP_PHASES = [ RIGHT_PANEL_PHASES.GroupMemberInfo, @@ -40,10 +42,10 @@ export default class GroupHeaderButtons extends HeaderButtons { this._onRoomsClicked = this._onRoomsClicked.bind(this); } - onAction(payload) { + onAction(payload: ActionPayload) { super.onAction(payload); - if (payload.action === "view_user") { + if (payload.action === Action.ViewUser) { if (payload.member) { this.setPhase(RIGHT_PANEL_PHASES.RoomMemberInfo, {member: payload.member}); } else { diff --git a/src/components/views/right_panel/RoomHeaderButtons.js b/src/components/views/right_panel/RoomHeaderButtons.js index bad89e2dbe..838727981d 100644 --- a/src/components/views/right_panel/RoomHeaderButtons.js +++ b/src/components/views/right_panel/RoomHeaderButtons.js @@ -23,6 +23,8 @@ import { _t } from '../../../languageHandler'; import HeaderButton from './HeaderButton'; import HeaderButtons, {HEADER_KIND_ROOM} from './HeaderButtons'; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; +import {Action} from "../../../dispatcher/actions"; +import {ActionPayload} from "../../../dispatcher/payloads"; const MEMBER_PHASES = [ RIGHT_PANEL_PHASES.RoomMemberList, @@ -39,9 +41,9 @@ export default class RoomHeaderButtons extends HeaderButtons { this._onNotificationsClicked = this._onNotificationsClicked.bind(this); } - onAction(payload) { + onAction(payload: ActionPayload) { super.onAction(payload); - if (payload.action === "view_user") { + if (payload.action === Action.ViewUser) { if (payload.member) { this.setPhase(RIGHT_PANEL_PHASES.RoomMemberInfo, {member: payload.member}); } else { diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index daf1a9490d..0392746c94 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -44,6 +44,7 @@ import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; import EncryptionPanel from "./EncryptionPanel"; import { useAsyncMemo } from '../../../hooks/useAsyncMemo'; import { verifyUser, legacyVerifyUser, verifyDevice } from '../../../verification'; +import {Action} from "../../../dispatcher/actions"; const _disambiguateDevices = (devices) => { const names = Object.create(null); @@ -841,7 +842,7 @@ const GroupAdminToolsSection = ({children, groupId, groupMember, startUpdating, cli.removeUserFromGroup(groupId, groupMember.userId).then(() => { // return to the user list dis.dispatch({ - action: "view_user", + action: Action.ViewUser, member: null, }); }).catch((e) => { diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 5d8e03a050..ed6c4ad748 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -48,6 +48,7 @@ import E2EIcon from "./E2EIcon"; import AutoHideScrollbar from "../../structures/AutoHideScrollbar"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import {Action} from "../../../dispatcher/actions"; export default createReactClass({ displayName: 'MemberInfo', @@ -724,7 +725,7 @@ export default createReactClass({ onCancel: function(e) { dis.dispatch({ - action: "view_user", + action: Action.ViewUser, member: null, }); }, diff --git a/src/components/views/rooms/MemberTile.js b/src/components/views/rooms/MemberTile.js index 6842e27ed3..2d290564c3 100644 --- a/src/components/views/rooms/MemberTile.js +++ b/src/components/views/rooms/MemberTile.js @@ -23,6 +23,7 @@ import * as sdk from "../../../index"; import dis from "../../../dispatcher/dispatcher"; import { _t } from '../../../languageHandler'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; +import {Action} from "../../../dispatcher/actions"; export default createReactClass({ displayName: 'MemberTile', @@ -185,7 +186,7 @@ export default createReactClass({ onClick: function(e) { dis.dispatch({ - action: 'view_user', + action: Action.ViewUser, member: this.props.member, }); }, diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index ff1650e4e5..880e7e62cd 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -19,5 +19,19 @@ export type DispatcherAction = Action | string; export enum Action { // TODO: Populate with actual actions + // This is lazily generated as it also includes fixing a bunch of references. Work + // that we don't really want to take on in a giant chunk. We should always define + // new actions here, and ideally when we touch existing ones we take some time to + // define them correctly. + + // When defining a new action, please use lower_scored_case with an optional class + // name prefix. For example, `RoomListStore.view_room` or `view_user_settings`. + // New definitions should also receive an accompanying interface in the payloads + // directory. + + /** + * View a user's profile. Should be used with a ViewUserPayload. + */ + ViewUser = "view_user", } diff --git a/src/dispatcher/dispatcher.ts b/src/dispatcher/dispatcher.ts index 6ef165c485..8330e5cd19 100644 --- a/src/dispatcher/dispatcher.ts +++ b/src/dispatcher/dispatcher.ts @@ -32,7 +32,7 @@ export class MatrixDispatcher extends Dispatcher { * an operation that the browser requires user interaction * for. Default false (async). */ - dispatch(payload: ActionPayload, sync = false) { + dispatch(payload: T, sync = false) { if (payload instanceof AsyncActionPayload) { payload.fn((action: ActionPayload) => { this.dispatch(action, sync); diff --git a/src/dispatcher/payloads/ViewUserPayload.ts b/src/dispatcher/payloads/ViewUserPayload.ts new file mode 100644 index 0000000000..ed602d4e24 --- /dev/null +++ b/src/dispatcher/payloads/ViewUserPayload.ts @@ -0,0 +1,29 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { RoomMember } from "matrix-js-sdk/src/models/room-member"; +import { ActionPayload } from "../payloads"; +import { Action } from "../actions"; + +export interface ViewUserPayload extends ActionPayload { + action: Action.ViewUser, + + /** + * The member to view. May be null or falsy to indicate that no member + * should be shown (hide whichever relevant components). + */ + member?: RoomMember; +} From e4835c4b03f7f3bb1451f75a613a90a5d3b53ce9 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 13 May 2020 21:07:19 -0600 Subject: [PATCH 257/319] Demonstrate dis.fire() with view_user_settings Like a5f3318f3bec7d66c20a862669c3c1b938b362a6, this proves that the new dispatcher conversion works for fire-and-forget style dispatches too. This is another obvious-if-broken and generally safe conversion to make. Other actions which can be dispatched this way have been excluded for reasons mentioned in the Action enum's comments. --- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 3 ++- .../views/dialogs/keybackup/NewRecoveryMethodDialog.js | 3 ++- .../dialogs/keybackup/RecoveryMethodRemovedDialog.js | 3 ++- src/components/structures/MatrixChat.tsx | 8 +++----- src/components/views/context_menus/TopLeftMenu.js | 3 ++- src/components/views/dialogs/AddressPickerDialog.js | 3 ++- .../views/dialogs/IntegrationsDisabledDialog.js | 3 ++- src/components/views/dialogs/InviteDialog.js | 3 ++- src/components/views/room_settings/UrlPreviewSettings.js | 3 ++- src/dispatcher/actions.ts | 5 +++++ 10 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 8af0bf278e..ec4b88f759 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -22,6 +22,7 @@ import { _t } from '../../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; +import {Action} from "../../../../dispatcher/actions"; /* * Allows the user to disable the Event Index. @@ -47,7 +48,7 @@ export default class DisableEventIndexDialog extends React.Component { await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, false); await EventIndexPeg.deleteEventIndex(); this.props.onFinished(); - dis.dispatch({ action: 'view_user_settings' }); + dis.fire(Action.ViewUserSettings); } render() { diff --git a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js index f00f2d9c3c..74552a5c08 100644 --- a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js +++ b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js @@ -22,6 +22,7 @@ import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import dis from "../../../../dispatcher/dispatcher"; import { _t } from "../../../../languageHandler"; import Modal from "../../../../Modal"; +import {Action} from "../../../../dispatcher/actions"; export default class NewRecoveryMethodDialog extends React.PureComponent { static propTypes = { @@ -36,7 +37,7 @@ export default class NewRecoveryMethodDialog extends React.PureComponent { onGoToSettingsClick = () => { this.props.onFinished(); - dis.dispatch({ action: 'view_user_settings' }); + dis.fire(Action.ViewUserSettings); } onSetupClick = async () => { diff --git a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js index 722334cd70..cda353e717 100644 --- a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js +++ b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js @@ -21,6 +21,7 @@ import * as sdk from "../../../../index"; import dis from "../../../../dispatcher/dispatcher"; import { _t } from "../../../../languageHandler"; import Modal from "../../../../Modal"; +import {Action} from "../../../../dispatcher/actions"; export default class RecoveryMethodRemovedDialog extends React.PureComponent { static propTypes = { @@ -29,7 +30,7 @@ export default class RecoveryMethodRemovedDialog extends React.PureComponent { onGoToSettingsClick = () => { this.props.onFinished(); - dis.dispatch({ action: 'view_user_settings' }); + dis.fire(Action.ViewUserSettings); } onSetupClick = () => { diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index d368b2c23a..cf0388c490 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -107,7 +107,7 @@ export enum Views { // re-dispatched. NOTE: some actions are non-trivial and would require // re-factoring to be included in this list in future. const ONBOARDING_FLOW_STARTERS = [ - 'view_user_settings', + Action.ViewUserSettings, 'view_create_chat', 'view_create_room', 'view_create_group', @@ -613,7 +613,7 @@ export default class MatrixChat extends React.PureComponent { case 'view_indexed_room': this.viewIndexedRoom(payload.roomIndex); break; - case 'view_user_settings': { + case Action.ViewUserSettings: { const UserSettingsDialog = sdk.getComponent("dialogs.UserSettingsDialog"); Modal.createTrackedDialog('User settings', '', UserSettingsDialog, {}, /*className=*/null, /*isPriority=*/false, /*isStatic=*/true); @@ -1621,9 +1621,7 @@ export default class MatrixChat extends React.PureComponent { action: 'view_create_room', }); } else if (screen === 'settings') { - dis.dispatch({ - action: 'view_user_settings', - }); + dis.fire(Action.ViewUserSettings); } else if (screen === 'welcome') { dis.dispatch({ action: 'view_welcome_page', diff --git a/src/components/views/context_menus/TopLeftMenu.js b/src/components/views/context_menus/TopLeftMenu.js index 3ec857be2f..ec99c63724 100644 --- a/src/components/views/context_menus/TopLeftMenu.js +++ b/src/components/views/context_menus/TopLeftMenu.js @@ -27,6 +27,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {MenuItem} from "../../structures/ContextMenu"; import * as sdk from "../../../index"; import {getHomePageUrl} from "../../../utils/pages"; +import {Action} from "../../../dispatcher/actions"; export default class TopLeftMenu extends React.Component { static propTypes = { @@ -134,7 +135,7 @@ export default class TopLeftMenu extends React.Component { } openSettings() { - dis.dispatch({action: 'view_user_settings'}); + dis.fire(Action.ViewUserSettings); this.closeMenu(); } diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index 41a819c005..8ddd89dc65 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -33,6 +33,7 @@ import { getDefaultIdentityServerUrl, useDefaultIdentityServer } from '../../../ import { abbreviateUrl } from '../../../utils/UrlUtils'; import {sleep} from "../../../utils/promise"; import {Key} from "../../../Keyboard"; +import {Action} from "../../../dispatcher/actions"; const TRUNCATE_QUERY_LIST = 40; const QUERY_USER_DIRECTORY_DEBOUNCE_MS = 200; @@ -615,7 +616,7 @@ export default createReactClass({ onManageSettingsClick(e) { e.preventDefault(); - dis.dispatch({ action: 'view_user_settings' }); + dis.fire(Action.ViewUserSettings); this.onCancel(); }, diff --git a/src/components/views/dialogs/IntegrationsDisabledDialog.js b/src/components/views/dialogs/IntegrationsDisabledDialog.js index 2677963281..7c996fbeab 100644 --- a/src/components/views/dialogs/IntegrationsDisabledDialog.js +++ b/src/components/views/dialogs/IntegrationsDisabledDialog.js @@ -19,6 +19,7 @@ import PropTypes from 'prop-types'; import {_t} from "../../../languageHandler"; import * as sdk from "../../../index"; import dis from '../../../dispatcher/dispatcher'; +import {Action} from "../../../dispatcher/actions"; export default class IntegrationsDisabledDialog extends React.Component { static propTypes = { @@ -31,7 +32,7 @@ export default class IntegrationsDisabledDialog extends React.Component { _onOpenSettingsClick = () => { this.props.onFinished(); - dis.dispatch({action: "view_user_settings"}); + dis.fire(Action.ViewUserSettings); }; render() { diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index e62c417a70..1e624f7545 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -36,6 +36,7 @@ import {inviteMultipleToRoom} from "../../../RoomInvite"; import SettingsStore from '../../../settings/SettingsStore'; import RoomListStore, {TAG_DM} from "../../../stores/RoomListStore"; import {Key} from "../../../Keyboard"; +import {Action} from "../../../dispatcher/actions"; export const KIND_DM = "dm"; export const KIND_INVITE = "invite"; @@ -902,7 +903,7 @@ export default class InviteDialog extends React.PureComponent { _onManageSettingsClick = (e) => { e.preventDefault(); - dis.dispatch({ action: 'view_user_settings' }); + dis.fire(Action.ViewUserSettings); this.props.onFinished(); }; diff --git a/src/components/views/room_settings/UrlPreviewSettings.js b/src/components/views/room_settings/UrlPreviewSettings.js index 16dffd857b..cd00e5048c 100644 --- a/src/components/views/room_settings/UrlPreviewSettings.js +++ b/src/components/views/room_settings/UrlPreviewSettings.js @@ -25,6 +25,7 @@ import { _t, _td } from '../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import dis from "../../../dispatcher/dispatcher"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; +import {Action} from "../../../dispatcher/actions"; export default createReactClass({ @@ -37,7 +38,7 @@ export default createReactClass({ _onClickUserSettings: (e) => { e.preventDefault(); e.stopPropagation(); - dis.dispatch({action: 'view_user_settings'}); + dis.fire(Action.ViewUserSettings); }, render: function() { diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index 880e7e62cd..a2f9c3efe3 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -33,5 +33,10 @@ export enum Action { * View a user's profile. Should be used with a ViewUserPayload. */ ViewUser = "view_user", + + /** + * Open the user settings. No additional payload information required. + */ + ViewUserSettings = "view_user_settings", } From 62fee732429fde3e2656dd7e3943c3ada6736507 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 14 May 2020 03:15:43 +0000 Subject: [PATCH 258/319] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2312 of 2312 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 257b245e1c..0ca6cfc586 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2425,5 +2425,10 @@ "Opens chat with the given user": "開啟與指定使用者的聊天", "Sends a message to the given user": "傳送訊息給指定的使用者", "Waiting for your other session to verify…": "正在等待您的其他工作階段進行驗證……", - "You've successfully verified your device!": "您已成功驗證您的裝置!" + "You've successfully verified your device!": "您已成功驗證您的裝置!", + "To continue, use Single Sign On to prove your identity.": "要繼續,使用單一登入系統來證明您的身份。", + "Confirm to continue": "確認以繼續", + "Click the button below to confirm your identity.": "點擊下方按鈕以確認您的身份。", + "Confirm encryption setup": "確認加密設定", + "Click the button below to confirm setting up encryption.": "點擊下方按鈕以確認設定加密。" } From 5672ff577bb635574d086a4572599dbc8839ac02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 14 May 2020 07:00:39 +0000 Subject: [PATCH 259/319] Translated using Weblate (Estonian) Currently translated at 46.7% (1080 of 2312 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 45 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index cda3a5e76d..88301258a5 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1039,5 +1039,48 @@ "Preview": "Eelvaade", "View": "Näita", "Message not sent due to unknown sessions being present": "Sõnum on saatmata, sest jutuoas on tundmatud sessioonid", - "You can't send any messages until you review and agree to our terms and conditions.": "Sa ei saa saata ühtego sõnumit enne, kui oled läbi lugenud ja nõustunud meie kasutustingimustega." + "You can't send any messages until you review and agree to our terms and conditions.": "Sa ei saa saata ühtego sõnumit enne, kui oled läbi lugenud ja nõustunud meie kasutustingimustega.", + "Couldn't load page": "Lehe laadimine ei õnnestunud", + "You must register to use this functionality": "Selle funktsionaalsuse kasutamiseks pead sa registreeruma", + "

      HTML for your community's page

      \n

      \n Use the long description to introduce new members to the community, or distribute\n some important links\n

      \n

      \n You can even use 'img' tags\n

      \n": "

      Sinu kogukonna lehe HTML'i näidis - see on pealkiri

      \n

      \n Tutvustamaks uutele liikmetele kogukonda, kasuta seda pikka kirjeldust\n või jaga olulist teavet viidetena\n

      \n

      \n Pildite lisaminseks võid sa isegi kasutada img-märgendit\n

      \n", + "Add to summary": "Lisa kokkuvõtte lehele", + "Add a Room": "Lisa jututuba", + "The room '%(roomName)s' could not be removed from the summary.": "Valitud %(roomName)s jututoa eemaldamine koondinfost ei õnnestunud.", + "Add users to the community summary": "Lisa kasutajad kogukonna kokkuvõtte lehele", + "Who would you like to add to this summary?": "Keda sa sooviksid lisada siia kokkuvõtte lehele?", + "Failed to add the following users to the summary of %(groupId)s:": "Järgnevate kasutajate lisamine %(groupId)s kogukonna koondinfo lehele ei õnnestunud:", + "Add a User": "Lisa kasutaja", + "The user '%(displayName)s' could not be removed from the summary.": "Kasutaja %(displayName)s eemaldamine koondinfo lehelt ei õnnestunud.", + "Failed to upload image": "Pildi üleslaadimine ei õnnestunud", + "Failed to update community": "Kogukonna uuendamine ei õnnestunud", + "Unable to accept invite": "Ei saanud kutset vastu võtta", + "Unable to join community": "Ei õnnetunud liituda kogukonnaga", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Sa oled selle kogukonna haldur. Sa ei saa uuesti liituda ilma kutseta mõnelt teiselt administraatori õigustes liikmelt.", + "Leave Community": "Lahku kogukonnast", + "Leave %(groupName)s?": "Lahku %(groupName)s kogukonnast?", + "Unable to leave community": "Kogukonnast lahkumine ei õnnestunud", + "Community Settings": "Kogukonna seadistused", + "Want more than a community? Get your own server": "Soovid enamat kui kogukond? Pane üles oma server", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Oma kogukonnas tehtud nime ja avatari muudatused ei pruugi teistele näha olla kuni 30 minuti jooksul.", + "Featured Users:": "Esiletõstetud kasutajad:", + "%(inviter)s has invited you to join this community": "%(inviter)s on kutsunud sind kogukonna liikmeks", + "Join this community": "Liitu selle kogukonnaga", + "Leave this community": "Lahku sellest kogukonnast", + "You are an administrator of this community": "Sa oled selle kogukonna haldur", + "You are a member of this community": "Sa oled kogukonna liige", + "Who can join this community?": "Kes võib liituda selle kogukonnaga?", + "Everyone": "Kes iganes soovib", + "Your community hasn't got a Long Description, a HTML page to show to community members.
      Click here to open settings and give it one!": "Sinu kogukonnal on puudu pikk kirjeldus, mis pole muud kui lihtne HTML-leht, mida kuvatakse liikmetele.
      Klõpsi siia ja loo selline leht!", + "Long Description (HTML)": "Pikk kirjeldus (HTML)", + "Upload avatar": "Lae üles profiilipilt ehk avatar", + "Description": "Kirjeldus", + "Community %(groupId)s not found": "%(groupId)s kogukonda ei leidunud", + "This homeserver does not support communities": "See koduserver ei toeta kogukondade funktsionaalsust", + "Failed to load %(groupId)s": "%(groupId)s kogukonna laadimine ei õnnestunud", + "Welcome to %(appName)s": "Tere tulemast %(appName)s kasutajaks", + "Liberate your communication": "Vabasta oma suhtlus", + "Send a Direct Message": "Saada otsesõnum", + "Are you sure you want to leave the room '%(roomName)s'?": "Kas oled kindel, et soovid lahkuda jututoast '%(roomName)s'?", + "Unknown error": "Teadmata viga", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Selleka et jätkata koduserveri %(homeserverDomain)s kasutamist sa pead üle vaatama ja nõustuma meie kasutamistingimustega." } From 1af2bdbc0ec7cddaa45edc131da66f24269d5724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Thu, 14 May 2020 06:10:18 +0000 Subject: [PATCH 260/319] Translated using Weblate (French) Currently translated at 100.0% (2312 of 2312 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 7546385bf6..3fac2168a2 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2426,5 +2426,10 @@ "Opens chat with the given user": "Ouvre une discussion avec l’utilisateur fourni", "Sends a message to the given user": "Envoie un message à l’utilisateur fourni", "Waiting for your other session to verify…": "En attente de la vérification depuis votre autre session…", - "You've successfully verified your device!": "Vous avez bien vérifié votre appareil !" + "You've successfully verified your device!": "Vous avez bien vérifié votre appareil !", + "To continue, use Single Sign On to prove your identity.": "Pour continuer, utilisez l’authentification unique pour prouver votre identité.", + "Confirm to continue": "Confirmer pour continuer", + "Click the button below to confirm your identity.": "Cliquez sur le bouton ci-dessous pour confirmer votre identité.", + "Confirm encryption setup": "Confirmer la configuration du chiffrement", + "Click the button below to confirm setting up encryption.": "Cliquez sur le bouton ci-dessous pour confirmer la configuration du chiffrement." } From 9869ae4672c55679c8bee62f6505db5aeeec05ca Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Thu, 14 May 2020 07:32:33 +0000 Subject: [PATCH 261/319] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 57.6% (1332 of 2312 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 147584ed00..59182a0249 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1341,5 +1341,6 @@ "You're done!": "Du har gjort alt klart!", "Enter a recovery passphrase...": "Skriv inn en gjenopprettingspassfrase …", "Please enter your recovery passphrase a second time to confirm.": "Skriv inn gjenopprettingspassfrasen din en andre gang for å bekrefte.", - "Repeat your recovery passphrase...": "Gjenta gjenopprettingspassfrasen din …" + "Repeat your recovery passphrase...": "Gjenta gjenopprettingspassfrasen din …", + "Other users may not trust it": "Andre brukere kan kanskje mistro den" } From d1c6f3099c0fbcbb8e2d94f19660a99d8a378c2b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 11:20:06 +0100 Subject: [PATCH 262/319] move styling to QRCode scss Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 1 + res/css/views/dialogs/_ShareDialog.scss | 6 ------ res/css/views/elements/_QRCode.scss | 21 +++++++++++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 res/css/views/elements/_QRCode.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 428a28ac3a..c05e2cabc6 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -108,6 +108,7 @@ @import "./views/elements/_ManageIntegsButton.scss"; @import "./views/elements/_PowerSelector.scss"; @import "./views/elements/_ProgressBar.scss"; +@import "./views/elements/_QRCode.scss"; @import "./views/elements/_ReplyThread.scss"; @import "./views/elements/_ResizeHandle.scss"; @import "./views/elements/_RichText.scss"; diff --git a/res/css/views/dialogs/_ShareDialog.scss b/res/css/views/dialogs/_ShareDialog.scss index 3c984bbd1b..e08469ec6d 100644 --- a/res/css/views/dialogs/_ShareDialog.scss +++ b/res/css/views/dialogs/_ShareDialog.scss @@ -67,12 +67,6 @@ limitations under the License. height: 256px; width: 256px; margin-right: 64px; - - img { - width: 100%; - height: 100%; - border-radius: 8px; - } } .mx_ShareDialog_social_container { diff --git a/res/css/views/elements/_QRCode.scss b/res/css/views/elements/_QRCode.scss new file mode 100644 index 0000000000..96d9114b54 --- /dev/null +++ b/res/css/views/elements/_QRCode.scss @@ -0,0 +1,21 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_QRCode { + img { + border-radius: 8px; + } +} From 4c7d7032755f7a3e144efe696e5e60279b876fdf Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 11:20:27 +0100 Subject: [PATCH 263/319] Reuse QRCode for VerificationQRCode and specify widths Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ShareDialog.tsx | 2 +- src/components/views/elements/QRCode.tsx | 9 ++--- .../elements/crypto/VerificationQRCode.js | 36 ++++--------------- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/src/components/views/dialogs/ShareDialog.tsx b/src/components/views/dialogs/ShareDialog.tsx index 3924fd42ec..271f754fd2 100644 --- a/src/components/views/dialogs/ShareDialog.tsx +++ b/src/components/views/dialogs/ShareDialog.tsx @@ -221,7 +221,7 @@ export default class ShareDialog extends React.PureComponent {
      - +
      { socials.map((social) => ( diff --git a/src/components/views/elements/QRCode.tsx b/src/components/views/elements/QRCode.tsx index 9c867058c0..f70ab48fa3 100644 --- a/src/components/views/elements/QRCode.tsx +++ b/src/components/views/elements/QRCode.tsx @@ -16,19 +16,21 @@ limitations under the License. import * as React from "react"; import {toDataURL, QRCodeSegment, QRCodeToDataURLOptions} from "qrcode"; +import classNames from "classnames"; import {_t} from "../../../languageHandler"; import Spinner from "./Spinner"; interface IProps extends QRCodeToDataURLOptions { data: string | QRCodeSegment[]; + className?: string; } const defaultOptions: QRCodeToDataURLOptions = { errorCorrectionLevel: 'L', // we want it as trivial-looking as possible }; -const QRCode: React.FC = ({data, ...options}) => { +const QRCode: React.FC = ({data, className, ...options}) => { const [dataUri, setUri] = React.useState(null); React.useEffect(() => { let cancelled = false; @@ -39,10 +41,9 @@ const QRCode: React.FC = ({data, ...options}) => { return () => { cancelled = true; }; - }, [data, options]); + }, [JSON.stringify(data), options]); - - return
      + return
      { dataUri ? {_t("QR : }
      ; }; diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index 08cd0c772e..3bbfb004c6 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -17,8 +17,7 @@ limitations under the License. import React from "react"; import PropTypes from "prop-types"; import {replaceableComponent} from "../../../../utils/replaceableComponent"; -import Spinner from "../Spinner"; -import * as QRCode from "qrcode"; +import QRCode from "../QRCode"; @replaceableComponent("views.elements.crypto.VerificationQRCode") export default class VerificationQRCode extends React.PureComponent { @@ -26,33 +25,12 @@ export default class VerificationQRCode extends React.PureComponent { qrCodeData: PropTypes.object.isRequired, }; - constructor(props) { - super(props); - this.state = { - dataUri: null, - }; - this.generateQrCode(); - } - - componentDidUpdate(prevProps): void { - if (JSON.stringify(this.props) === JSON.stringify(prevProps)) return; // No prop change - - this.generateQRCode(); - } - - async generateQrCode() { - // Now actually assemble the QR code's data URI - const uri = await QRCode.toDataURL([{data: this.props.qrCodeData.buffer, mode: 'byte'}], { - errorCorrectionLevel: 'L', // we want it as trivial-looking as possible - }); - this.setState({dataUri: uri}); - } - render() { - if (!this.state.dataUri) { - return
      ; - } - - return ; + return ( + + ); } } From edba204408483ad41db5abaeb04768e945a233a5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 13:04:30 +0100 Subject: [PATCH 264/319] accept and linkify local domains like those from mDNS Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index ee9f703136..77c62ce84d 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -44,7 +44,7 @@ function matrixLinkify(linkify) { const S_HASH = S_START.jump(TT.POUND); const S_HASH_NAME = new linkify.parser.State(); const S_HASH_NAME_COLON = new linkify.parser.State(); - const S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State(); + const S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State(ROOMALIAS); const S_HASH_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_ROOMALIAS = new linkify.parser.State(ROOMALIAS); const S_ROOMALIAS_COLON = new linkify.parser.State(); @@ -92,7 +92,7 @@ function matrixLinkify(linkify) { const S_AT = S_START.jump(TT.AT); const S_AT_NAME = new linkify.parser.State(); const S_AT_NAME_COLON = new linkify.parser.State(); - const S_AT_NAME_COLON_DOMAIN = new linkify.parser.State(); + const S_AT_NAME_COLON_DOMAIN = new linkify.parser.State(USERID); const S_AT_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_USERID = new linkify.parser.State(USERID); const S_USERID_COLON = new linkify.parser.State(); @@ -138,7 +138,7 @@ function matrixLinkify(linkify) { const S_PLUS = S_START.jump(TT.PLUS); const S_PLUS_NAME = new linkify.parser.State(); const S_PLUS_NAME_COLON = new linkify.parser.State(); - const S_PLUS_NAME_COLON_DOMAIN = new linkify.parser.State(); + const S_PLUS_NAME_COLON_DOMAIN = new linkify.parser.State(GROUPID); const S_PLUS_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_GROUPID = new linkify.parser.State(GROUPID); const S_GROUPID_COLON = new linkify.parser.State(); From 822b4b4fff2260a3be35c8afc0f54065f8d15298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Thu, 14 May 2020 10:50:35 +0000 Subject: [PATCH 265/319] Translated using Weblate (Czech) Currently translated at 95.2% (2198 of 2308 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 181a692b73..ddd5e5521b 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2293,5 +2293,6 @@ "Opens chat with the given user": "Otevře konverzaci s tímto uživatelem", "Sends a message to the given user": "Pošle zprávu danému uživateli", "Waiting for your other session to verify…": "Čekáme na ověření od vaší druhé relace…", - "Verify all your sessions to ensure your account & messages are safe": "Ověřte všechny své relace, abyste zaručili, že jsou vaše zprávy a účet bezpečné" + "Verify all your sessions to ensure your account & messages are safe": "Ověřte všechny své relace, abyste zaručili, že jsou vaše zprávy a účet bezpečné", + "Verify the new login accessing your account: %(name)s": "Ověřte nové přihlášení na váš účet: %(name)s" } From 72e5e2e4b9f61be669532b38f56b169ccfbd8866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 14 May 2020 08:22:14 +0000 Subject: [PATCH 266/319] Translated using Weblate (Estonian) Currently translated at 46.8% (1079 of 2308 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 88301258a5..948055c35a 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -6,7 +6,7 @@ "Failed to verify email address: make sure you clicked the link in the email": "E-posti aadressi kontrollimine ei õnnestunud: palun vaata, et sa kindlasti klõpsisid saabunud kirjas olnud viidet", "The platform you're on": "Sinu kasutatav arvutisüsteem", "The version of Riot": "Riot'i versioon", - "Whether or not you're logged in (we don't record your username)": "Kas sa oled sisseloginud või mitte (me ei salvesta sinu kasutajanime)", + "Whether or not you're logged in (we don't record your username)": "Kas sa oled sisseloginud või mitte (me ei salvesta sinu kasutajanime)", "Your language of choice": "Sinu keelevalik", "Your homeserver's URL": "Sinu koduserveri aadress", "e.g. ": "näiteks ", From 91134601f6317fee286bfd94b560614de5b6e4d1 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 14 May 2020 10:23:04 +0000 Subject: [PATCH 267/319] Translated using Weblate (Italian) Currently translated at 100.0% (2308 of 2308 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d891a06687..e79db1b061 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2417,5 +2417,14 @@ "Verify your other session using one of the options below.": "Verifica la tua altra sessione usando una delle opzioni sotto.", "Invite someone using their name, username (like ), email address or share this room.": "Invita qualcuno usando il suo nome, nome utente (come ), indirizzo email o condividi questa stanza.", "Message deleted": "Messaggio eliminato", - "Message deleted by %(name)s": "Messaggio eliminato da %(name)s" + "Message deleted by %(name)s": "Messaggio eliminato da %(name)s", + "Opens chat with the given user": "Apre una chat con l'utente specificato", + "Sends a message to the given user": "Invia un messaggio all'utente specificato", + "Waiting for your other session to verify…": "In attesa che la tua altra sessione verifichi…", + "You've successfully verified your device!": "Hai verificato correttamente il tuo dispositivo!", + "To continue, use Single Sign On to prove your identity.": "Per continuare, usa Single Sign On per provare la tua identità.", + "Confirm to continue": "Conferma per continuare", + "Click the button below to confirm your identity.": "Clicca il pulsante sotto per confermare la tua identità.", + "Confirm encryption setup": "Conferma impostazione cifratura", + "Click the button below to confirm setting up encryption.": "Clicca il pulsante sotto per confermare l'impostazione della cifratura." } From e241da3af0d153d6b20b8de2d85c66f306419ffa Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 15:35:38 +0100 Subject: [PATCH 268/319] Fix diff wrong route offsets because of skipping a node insert Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/utils/MessageDiffUtils.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/utils/MessageDiffUtils.js b/src/utils/MessageDiffUtils.js index de0d8fdc89..7398173fdd 100644 --- a/src/utils/MessageDiffUtils.js +++ b/src/utils/MessageDiffUtils.js @@ -77,8 +77,6 @@ function findRefNodes(root, route, isAddition) { const end = isAddition ? route.length - 1 : route.length; for (let i = 0; i < end; ++i) { refParentNode = refNode; - // Lists don't have appropriate child nodes we can use. - if (!refNode.childNodes[route[i]]) continue; refNode = refNode.childNodes[route[i]]; } return {refNode, refParentNode}; @@ -190,10 +188,11 @@ function renderDifferenceInDOM(originalRootNode, diff, diffMathPatch) { break; } case "addTextElement": { - if (diff.value !== "\n") { - const insNode = wrapInsertion(stringAsTextNode(diff.value)); - insertBefore(refParentNode, refNode, insNode); - } + // XXX: sometimes diffDOM says insert a newline when there shouldn't be one + // but we must insert the node anyway so that we don't break the route child IDs. + // See https://github.com/fiduswriter/diffDOM/issues/100 + const insNode = wrapInsertion(stringAsTextNode(diff.value !== "\n" ? diff.value : "")); + insertBefore(refParentNode, refNode, insNode); break; } // e.g. when changing a the href of a link, From d8003df24c660d0ed895f99c21eda24abaf4d13e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 14 May 2020 16:22:30 +0100 Subject: [PATCH 269/319] Upgrade matrix-js-sdk to 6.1.0-rc.1 --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 92d228a812..e77b7b26b8 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "is-ip": "^2.0.0", "linkifyjs": "^2.1.6", "lodash": "^4.17.14", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "6.1.0-rc.1", "minimist": "^1.2.0", "pako": "^1.0.5", "parse5": "^5.1.1", diff --git a/yarn.lock b/yarn.lock index 520e976b17..d05c444470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5720,9 +5720,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "6.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/f120533fadb309ac5dc8b2bcb6882e784ba93f18" +matrix-js-sdk@6.1.0-rc.1: + version "6.1.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-6.1.0-rc.1.tgz#521d5683d10e49bb437b2457d1f0c6696fc7a4e3" + integrity sha512-q3XScyroUwY3qTBglRgE1lldfrLlSML5nU4gJzXrEwn2gGpR1P4IU8aT8EcumyOmeZhrrysS2UEE9fWgUmhkBw== dependencies: "@babel/runtime" "^7.8.3" another-json "^0.2.0" From 4a7487aa20d0abffb7b242a399e1bd4f39a33a28 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 14 May 2020 16:30:17 +0100 Subject: [PATCH 270/319] Prepare changelog for v2.6.0-rc.1 --- CHANGELOG.md | 262 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0706e20085..c34bfba87b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,265 @@ +Changes in [2.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.6.0-rc.1) (2020-05-14) +============================================================================================================= +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.5.0...v2.6.0-rc.1) + + * Upgrade to JS SDK 6.1.0-rc.1 + * Update from Weblate + [\#4596](https://github.com/matrix-org/matrix-react-sdk/pull/4596) + * Fix message edits dialog being wrong and sometimes crashing + [\#4595](https://github.com/matrix-org/matrix-react-sdk/pull/4595) + * Acquire a new session before enacting deactivation + [\#4584](https://github.com/matrix-org/matrix-react-sdk/pull/4584) + * Remove UI for upgrading 4S to symmetric encryption + [\#4581](https://github.com/matrix-org/matrix-react-sdk/pull/4581) + * Add copy to SSO prompts during cross-signing setup + [\#4555](https://github.com/matrix-org/matrix-react-sdk/pull/4555) + * Re-fix OpenID requests from widgets + [\#4592](https://github.com/matrix-org/matrix-react-sdk/pull/4592) + * Fix persistent widgets on desktop / http + [\#4591](https://github.com/matrix-org/matrix-react-sdk/pull/4591) + * Updated link and added:Yarn two is not yet used. + [\#4589](https://github.com/matrix-org/matrix-react-sdk/pull/4589) + * Fix topic dialog not supporting escape as it didn't have a "Close" + [\#4578](https://github.com/matrix-org/matrix-react-sdk/pull/4578) + * Default to public room when creating room from room directory + [\#4579](https://github.com/matrix-org/matrix-react-sdk/pull/4579) + * Replace png flags and add Kosovo to country code dropdown + [\#4576](https://github.com/matrix-org/matrix-react-sdk/pull/4576) + * Rename `trash (custom).svg` as electron doesn't like paths with spaces + [\#4583](https://github.com/matrix-org/matrix-react-sdk/pull/4583) + * Fix sign in / up links on previewed rooms + [\#4582](https://github.com/matrix-org/matrix-react-sdk/pull/4582) + * Avoid soft crash if unknown device in verification + [\#4580](https://github.com/matrix-org/matrix-react-sdk/pull/4580) + * Add slash commands /query and /msg to match IRC + [\#4568](https://github.com/matrix-org/matrix-react-sdk/pull/4568) + * Send cross-signing debug booleans over rageshake + [\#4570](https://github.com/matrix-org/matrix-react-sdk/pull/4570) + * Prompt user to specify an alternate server if theirs has registration off + [\#4575](https://github.com/matrix-org/matrix-react-sdk/pull/4575) + * Don't try and redact redactions for "Remove recent messages" + [\#4573](https://github.com/matrix-org/matrix-react-sdk/pull/4573) + * View Source should target the replacing event rather than the root one + [\#4571](https://github.com/matrix-org/matrix-react-sdk/pull/4571) + * Fix passphrase reset in key backup restore dialog + [\#4569](https://github.com/matrix-org/matrix-react-sdk/pull/4569) + * Ensure key backup gets dealt with correctly during secret storage reset + [\#4556](https://github.com/matrix-org/matrix-react-sdk/pull/4556) + * Fix crash for broken invites + [\#4565](https://github.com/matrix-org/matrix-react-sdk/pull/4565) + * Fix rageshake with no matrix client + [\#4572](https://github.com/matrix-org/matrix-react-sdk/pull/4572) + * Update from Weblate + [\#4567](https://github.com/matrix-org/matrix-react-sdk/pull/4567) + * Bring back UnknownBody for UISIs + [\#4564](https://github.com/matrix-org/matrix-react-sdk/pull/4564) + * clear tag panel selection if the community selected is left + [\#4559](https://github.com/matrix-org/matrix-react-sdk/pull/4559) + * Close ImageView when redacting + [\#4560](https://github.com/matrix-org/matrix-react-sdk/pull/4560) + * Redesign redactions + [\#4484](https://github.com/matrix-org/matrix-react-sdk/pull/4484) + * Don't try to reload profile information when closing the user panel + [\#4547](https://github.com/matrix-org/matrix-react-sdk/pull/4547) + * Fix right panel hiding when viewing room member + [\#4558](https://github.com/matrix-org/matrix-react-sdk/pull/4558) + * Don't erase password confirm on registration error + [\#4540](https://github.com/matrix-org/matrix-react-sdk/pull/4540) + * Add a loading state for email addresses/phone numbers in settings + [\#4557](https://github.com/matrix-org/matrix-react-sdk/pull/4557) + * set the meta tag for theme-color to the same theme css background + [\#4554](https://github.com/matrix-org/matrix-react-sdk/pull/4554) + * Update Invite Dialog copy to include email addresses + [\#4497](https://github.com/matrix-org/matrix-react-sdk/pull/4497) + * Fix slider toggle regression. + [\#4546](https://github.com/matrix-org/matrix-react-sdk/pull/4546) + * Fix a crash where a name could unexpectedly be an empty list + [\#4552](https://github.com/matrix-org/matrix-react-sdk/pull/4552) + * Solves communities can be dragged from context menu + [\#4492](https://github.com/matrix-org/matrix-react-sdk/pull/4492) + * Remove prefixes for composer avatar urls + [\#4553](https://github.com/matrix-org/matrix-react-sdk/pull/4553) + * Fix reply RR spacing getting doubled + [\#4541](https://github.com/matrix-org/matrix-react-sdk/pull/4541) + * Differentiate copy for own untrusted device dialog + [\#4549](https://github.com/matrix-org/matrix-react-sdk/pull/4549) + * EventIndex: Reduce the logging the event index is producing. + [\#4548](https://github.com/matrix-org/matrix-react-sdk/pull/4548) + * Increase rageshake size limit to 5mb + [\#4543](https://github.com/matrix-org/matrix-react-sdk/pull/4543) + * Update from Weblate + [\#4542](https://github.com/matrix-org/matrix-react-sdk/pull/4542) + * Guard against race when waiting for cross-signing to be ready + [\#4539](https://github.com/matrix-org/matrix-react-sdk/pull/4539) + * Wait for user to be verified in e2e setup + [\#4537](https://github.com/matrix-org/matrix-react-sdk/pull/4537) + * Convert MatrixChat to a TypeScript class + [\#4462](https://github.com/matrix-org/matrix-react-sdk/pull/4462) + * Mark room as read when escape is pressed + [\#4271](https://github.com/matrix-org/matrix-react-sdk/pull/4271) + * Only show key backup reminder when confirmed by server to be missing + [\#4534](https://github.com/matrix-org/matrix-react-sdk/pull/4534) + * Add device name to unverified session toast + [\#4535](https://github.com/matrix-org/matrix-react-sdk/pull/4535) + * Show progress when loading keys + [\#4507](https://github.com/matrix-org/matrix-react-sdk/pull/4507) + * Fix device verification toasts not disappearing + [\#4532](https://github.com/matrix-org/matrix-react-sdk/pull/4532) + * Update toast copy again + [\#4529](https://github.com/matrix-org/matrix-react-sdk/pull/4529) + * Re-apply theme after login + [\#4518](https://github.com/matrix-org/matrix-react-sdk/pull/4518) + * Reduce maximum width of toasts & allow multiple lines + [\#4525](https://github.com/matrix-org/matrix-react-sdk/pull/4525) + * Treat sessions that are there when we log in as old + [\#4524](https://github.com/matrix-org/matrix-react-sdk/pull/4524) + * Allow resetting storage from the access dialog + [\#4521](https://github.com/matrix-org/matrix-react-sdk/pull/4521) + * Update (bulk) unverified device toast copy + [\#4522](https://github.com/matrix-org/matrix-react-sdk/pull/4522) + * Make new device toasts appear above review toasts + [\#4519](https://github.com/matrix-org/matrix-react-sdk/pull/4519) + * Separate toasts for existing & new device verification + [\#4511](https://github.com/matrix-org/matrix-react-sdk/pull/4511) + * Slightly darker toggle off bg color + [\#4477](https://github.com/matrix-org/matrix-react-sdk/pull/4477) + * Fix pill vertical align + [\#4514](https://github.com/matrix-org/matrix-react-sdk/pull/4514) + * Fix set up encryption toast to use "set up" as action + [\#4502](https://github.com/matrix-org/matrix-react-sdk/pull/4502) + * Don't enable e2ee when inviting a 3pid + [\#4509](https://github.com/matrix-org/matrix-react-sdk/pull/4509) + * Fix internal link styling in Security Settings + [\#4510](https://github.com/matrix-org/matrix-react-sdk/pull/4510) + * Small custom theming fixes + [\#4508](https://github.com/matrix-org/matrix-react-sdk/pull/4508) + * Fix scaling issues + [\#4355](https://github.com/matrix-org/matrix-react-sdk/pull/4355) + * Aggregate device verify toasts + [\#4506](https://github.com/matrix-org/matrix-react-sdk/pull/4506) + * Support setting username and avatar colors in custom themes + [\#4503](https://github.com/matrix-org/matrix-react-sdk/pull/4503) + * only clear on continuations where the clear isn't done by SenderProfile + [\#4501](https://github.com/matrix-org/matrix-react-sdk/pull/4501) + * cap width of editable item list item to leave space for its X button + [\#4495](https://github.com/matrix-org/matrix-react-sdk/pull/4495) + * Add a link from settings / devices to your user profile + [\#4498](https://github.com/matrix-org/matrix-react-sdk/pull/4498) + * Update from Weblate + [\#4496](https://github.com/matrix-org/matrix-react-sdk/pull/4496) + * Make icon change in SetupEncryptionDialog + [\#4485](https://github.com/matrix-org/matrix-react-sdk/pull/4485) + * Remove invite only padlocks feature flag + [\#4487](https://github.com/matrix-org/matrix-react-sdk/pull/4487) + * Fix incorrect toast if security setup skipped + [\#4486](https://github.com/matrix-org/matrix-react-sdk/pull/4486) + * Revert "Update emojibase for fixed emoji codepoints and Emoji 13 support" + [\#4482](https://github.com/matrix-org/matrix-react-sdk/pull/4482) + * Fix widget URL templating (again) + [\#4481](https://github.com/matrix-org/matrix-react-sdk/pull/4481) + * Fix recovery link on login verification flow + [\#4479](https://github.com/matrix-org/matrix-react-sdk/pull/4479) + * Make avatars in pills occupy the entire space using cropping + [\#4476](https://github.com/matrix-org/matrix-react-sdk/pull/4476) + * Use WidgetType more often to avoid breaking new sticker pickers + [\#4458](https://github.com/matrix-org/matrix-react-sdk/pull/4458) + * Update logging for unmanaged widgets, and add TODO comments for other areas + [\#4460](https://github.com/matrix-org/matrix-react-sdk/pull/4460) + * Fix OpenID requests from widgets + [\#4459](https://github.com/matrix-org/matrix-react-sdk/pull/4459) + * Take encrypted message search out of labs + [\#4467](https://github.com/matrix-org/matrix-react-sdk/pull/4467) + * Fix BigEmoji for replies + [\#4475](https://github.com/matrix-org/matrix-react-sdk/pull/4475) + * Update login security copy and design to match Figma + [\#4472](https://github.com/matrix-org/matrix-react-sdk/pull/4472) + * Fix i18n of SSO UIA copy in Deactivate Account Dialog + [\#4471](https://github.com/matrix-org/matrix-react-sdk/pull/4471) + * Assert type of domNode as HTMLElement to fix build + [\#4470](https://github.com/matrix-org/matrix-react-sdk/pull/4470) + * Unignored in settings + [\#4466](https://github.com/matrix-org/matrix-react-sdk/pull/4466) + * Skip auth flow test for signing upload when password present + [\#4464](https://github.com/matrix-org/matrix-react-sdk/pull/4464) + * If user cannot set email during registration don't tell them to + [\#4461](https://github.com/matrix-org/matrix-react-sdk/pull/4461) + * Fix post-ts autocomplete, it is not null + [\#4463](https://github.com/matrix-org/matrix-react-sdk/pull/4463) + * Convert autocomplete stuff to TypeScript + [\#4452](https://github.com/matrix-org/matrix-react-sdk/pull/4452) + * Add a back button to the devtools verifications panel + [\#4455](https://github.com/matrix-org/matrix-react-sdk/pull/4455) + * Fix: wait until cross-signing keys are fetched to show verify button + [\#4456](https://github.com/matrix-org/matrix-react-sdk/pull/4456) + * Handle load error in create secret storage dialog + [\#4451](https://github.com/matrix-org/matrix-react-sdk/pull/4451) + * Allow iframes and Jitsi URLs in /addwidget + [\#4382](https://github.com/matrix-org/matrix-react-sdk/pull/4382) + * Support m.jitsi-typed widgets as Jitsi widgets + [\#4379](https://github.com/matrix-org/matrix-react-sdk/pull/4379) + * Don't recheck DeviceListener until after initial sync is finished + [\#4450](https://github.com/matrix-org/matrix-react-sdk/pull/4450) + * Fix CSS class in ButtonPlaceholder + [\#4449](https://github.com/matrix-org/matrix-react-sdk/pull/4449) + * Password Login make sure tab takes user to password field + [\#4441](https://github.com/matrix-org/matrix-react-sdk/pull/4441) + * Network Dropdown fix things not scrolling properly + [\#4439](https://github.com/matrix-org/matrix-react-sdk/pull/4439) + * ImageView make clicking off it easier + [\#4448](https://github.com/matrix-org/matrix-react-sdk/pull/4448) + * Add slash command to send a rageshake + [\#4443](https://github.com/matrix-org/matrix-react-sdk/pull/4443) + * EventIndex: Filter out events that don't have a propper content value. + [\#4446](https://github.com/matrix-org/matrix-react-sdk/pull/4446) + * Revert "Fix Filepanel scroll position state lost when room is changed" + [\#4445](https://github.com/matrix-org/matrix-react-sdk/pull/4445) + * Update seshat copy to remove trailing full stop + [\#4442](https://github.com/matrix-org/matrix-react-sdk/pull/4442) + * Fix Filepanel scroll position state lost when room is changed + [\#4388](https://github.com/matrix-org/matrix-react-sdk/pull/4388) + * Fix end-to-end tests for end-to-end encryption verification + [\#4436](https://github.com/matrix-org/matrix-react-sdk/pull/4436) + * Don't explode if the e2e test directory exists when crashing + [\#4437](https://github.com/matrix-org/matrix-react-sdk/pull/4437) + * Bump https-proxy-agent from 2.2.1 to 2.2.4 in /test/end-to-end-tests + [\#4430](https://github.com/matrix-org/matrix-react-sdk/pull/4430) + * Minor updates to e2e test instructions on Windows + [\#4432](https://github.com/matrix-org/matrix-react-sdk/pull/4432) + * Fix typo + [\#4435](https://github.com/matrix-org/matrix-react-sdk/pull/4435) + * Catch errors sooner so users can recover more easily + [\#4122](https://github.com/matrix-org/matrix-react-sdk/pull/4122) + * Rageshake: remind user of unsupported browser and send modernizr report + [\#4381](https://github.com/matrix-org/matrix-react-sdk/pull/4381) + * Design tweaks for DM Room Tiles + [\#4338](https://github.com/matrix-org/matrix-react-sdk/pull/4338) + * Don't break spills over multiple lines, ellipsis them at max-1-line + [\#4434](https://github.com/matrix-org/matrix-react-sdk/pull/4434) + * Turn the end-to-end tests back on and fix the lazy-loading tests + [\#4433](https://github.com/matrix-org/matrix-react-sdk/pull/4433) + * Fix key backup debug panel + [\#4431](https://github.com/matrix-org/matrix-react-sdk/pull/4431) + * Convert cross-signing feature flag to setting + [\#4416](https://github.com/matrix-org/matrix-react-sdk/pull/4416) + * Make RoomPublishSetting import-skinnable + [\#4428](https://github.com/matrix-org/matrix-react-sdk/pull/4428) + * Iterate cross-signing copy + [\#4425](https://github.com/matrix-org/matrix-react-sdk/pull/4425) + * Fix: ensure twemoji font is loaded when showing SAS emojis + [\#4422](https://github.com/matrix-org/matrix-react-sdk/pull/4422) + * Revert "Fix: load Twemoji before login so complete security gets the right + emojis during SAS" + [\#4421](https://github.com/matrix-org/matrix-react-sdk/pull/4421) + * Fix: load Twemoji before login so complete security gets the right emojis + during SAS + [\#4419](https://github.com/matrix-org/matrix-react-sdk/pull/4419) + * consolidate and fix copy to clipboard + [\#4410](https://github.com/matrix-org/matrix-react-sdk/pull/4410) + * Fix Message Context Menu options not displaying: block + [\#4418](https://github.com/matrix-org/matrix-react-sdk/pull/4418) + * Fix pills being broken by unescaped characters + [\#4411](https://github.com/matrix-org/matrix-react-sdk/pull/4411) + Changes in [2.5.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.5.0) (2020-05-05) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.5.0-rc.6...v2.5.0) From 81174b5f55a04971d02c6dbf09457ec59aeee61d Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 14 May 2020 16:30:17 +0100 Subject: [PATCH 271/319] v2.6.0-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e77b7b26b8..8338a91bf7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "2.5.0", + "version": "2.6.0-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From cae28b48d6ed5de74e676e2a216637f5e73619d7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 14 May 2020 09:43:34 -0600 Subject: [PATCH 272/319] Remove debugging that causes email addresses to load forever This was left in by accident for https://github.com/matrix-org/matrix-react-sdk/pull/4557 --- .../views/settings/tabs/user/GeneralUserSettingsTab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index 867982ad2b..0f82ce3a32 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -348,7 +348,7 @@ export default class GeneralUserSettingsTab extends React.Component { // For newer homeservers with separate 3PID add and bind methods (MSC2290), // there is no such concern, so we can always show the HS account 3PIDs. if (this.state.haveIdServer || this.state.serverSupportsSeparateAddAndBind === true) { - const emails = this.state.loading3pids || true + const emails = this.state.loading3pids ? : Date: Thu, 14 May 2020 09:43:34 -0600 Subject: [PATCH 273/319] Remove debugging that causes email addresses to load forever This was left in by accident for https://github.com/matrix-org/matrix-react-sdk/pull/4557 --- .../views/settings/tabs/user/GeneralUserSettingsTab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index 867982ad2b..0f82ce3a32 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -348,7 +348,7 @@ export default class GeneralUserSettingsTab extends React.Component { // For newer homeservers with separate 3PID add and bind methods (MSC2290), // there is no such concern, so we can always show the HS account 3PIDs. if (this.state.haveIdServer || this.state.serverSupportsSeparateAddAndBind === true) { - const emails = this.state.loading3pids || true + const emails = this.state.loading3pids ? : Date: Thu, 14 May 2020 15:57:39 +0000 Subject: [PATCH 274/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2308 of 2308 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 9e8641a6e9..11239303f8 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -172,7 +172,7 @@ "New passwords don't match": "Novaj pasvortoj ne akordas", "Passwords can't be empty": "Pasvortoj ne povas esti malplenaj", "Continue": "Daŭrigi", - "Export E2E room keys": "Elporti ĝiscele ĉifrajn ŝlosilojn de la ĉambro", + "Export E2E room keys": "Elporti tutvoje ĉifrajn ŝlosilojn de la ĉambro", "Do you want to set an email address?": "Ĉu vi volas agordi retpoŝtadreson?", "Current password": "Nuna pasvorto", "Password": "Pasvorto", @@ -538,8 +538,8 @@ "Are you sure you want to leave the room '%(roomName)s'?": "Ĉu vi certe volas forlasi la ĉambron '%(roomName)s'?", "Failed to leave room": "Malsukcesis forlasi la ĉambron", "Signed Out": "Adiaŭinta", - "Old cryptography data detected": "Malnovaj kriptografiaj datumoj troviĝis", - "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Datumoj el malnova versio de Riot troviĝis. Ĉi tio malfunkciigos ĝiscelan ĉifradon en la malnova versio. Ĝiscele ĉifritaj mesaĝoj interŝanĝitaj freŝtempe per la malnova versio eble ne malĉifreblos. Tio povas kaŭzi malsukceson ankaŭ al mesaĝoj interŝanĝitaj kun tiu ĉi versio. Se vin trafos problemoj, adiaŭu kaj resalutu. Por reteni mesaĝan historion, elportu kaj reenportu viajn ŝlosilojn.", + "Old cryptography data detected": "Malnovaj datumoj de ĉifroteĥnikaro troviĝis", + "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Datumoj el malnova versio de Riot troviĝis. Ĉi tio malfunkciigos tutvojan ĉifradon en la malnova versio. Tutvoje ĉifritaj mesaĝoj interŝanĝitaj freŝtempe per la malnova versio eble ne malĉifreblos. Tio povas kaŭzi malsukceson ankaŭ al mesaĝoj interŝanĝitaj kun tiu ĉi versio. Se vin trafos problemoj, adiaŭu kaj resalutu. Por reteni mesaĝan historion, elportu kaj reenportu viajn ŝlosilojn.", "Logout": "Adiaŭi", "Your Communities": "Viaj komunumoj", "Error whilst fetching joined communities": "Akirado de viaj komunumoj eraris", @@ -576,8 +576,8 @@ "Success": "Sukceso", "Unable to remove contact information": "Ne povas forigi kontaktajn informojn", "": "", - "Import E2E room keys": "Enporti ĝiscele ĉifrajn ĉambrajn ŝlosilojn", - "Cryptography": "Kriptografio", + "Import E2E room keys": "Enporti tutvoje ĉifrajn ĉambrajn ŝlosilojn", + "Cryptography": "Ĉifroteĥnikaro", "Analytics": "Analizo", "Riot collects anonymous analytics to allow us to improve the application.": "Riot kolektas sennomaj analizajn datumojn por helpi plibonigadon de la programo.", "Labs": "Eksperimentaj funkcioj", @@ -981,7 +981,7 @@ "Room version": "Ĉambra versio", "Room version:": "Ĉambra versio:", "Developer options": "Programistaj elektebloj", - "Room Addresses": "Ĉambra adresoj", + "Room Addresses": "Adresoj de ĉambro", "Change room avatar": "Ŝanĝi profilbildon de ĉambro", "Change room name": "Ŝanĝi nomon de ĉambro", "Change main address for the room": "Ŝanĝi ĉefan adreson de la ĉambro", @@ -2400,5 +2400,10 @@ "Opens chat with the given user": "Malfermas babilon kun la uzanto", "Sends a message to the given user": "Sendas mesaĝon al la uzanto", "Waiting for your other session to verify…": "Atendante kontrolon de via alia salutaĵo…", - "You've successfully verified your device!": "Vi sukcese kontrolis vian aparaton!" + "You've successfully verified your device!": "Vi sukcese kontrolis vian aparaton!", + "To continue, use Single Sign On to prove your identity.": "Por daŭrigi, pruvu vian identecon per ununura saluto.", + "Confirm to continue": "Konfirmu por daŭrigi", + "Click the button below to confirm your identity.": "Klaku sube la butonon por konfirmi vian identecon.", + "Confirm encryption setup": "Konfirmi agordon de ĉifrado", + "Click the button below to confirm setting up encryption.": "Klaku sube la butonon por konfirmi agordon de ĉifrado." } From e96fa6db33f1817bc368f3c9a75e70a666ec9f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 14 May 2020 16:30:32 +0000 Subject: [PATCH 275/319] Translated using Weblate (Estonian) Currently translated at 46.9% (1082 of 2308 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 948055c35a..b6e4830bf7 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1082,5 +1082,8 @@ "Send a Direct Message": "Saada otsesõnum", "Are you sure you want to leave the room '%(roomName)s'?": "Kas oled kindel, et soovid lahkuda jututoast '%(roomName)s'?", "Unknown error": "Teadmata viga", - "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Selleka et jätkata koduserveri %(homeserverDomain)s kasutamist sa pead üle vaatama ja nõustuma meie kasutamistingimustega." + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Selleka et jätkata koduserveri %(homeserverDomain)s kasutamist sa pead üle vaatama ja nõustuma meie kasutamistingimustega.", + "Permissions": "Õigused", + "Select the roles required to change various parts of the room": "Vali rollid, mis on vajalikud jututoa eri osade muutmiseks", + "Enable encryption?": "Kas võtame krüptimise kasutusele?" } From 9c04188ceb6ee66d492e79b5323f84f3f2ab4b93 Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Thu, 14 May 2020 16:21:20 +0000 Subject: [PATCH 276/319] Translated using Weblate (German) Currently translated at 99.7% (2300 of 2308 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 7fdaf20e40..a7b7da4146 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2365,5 +2365,8 @@ "Activate selected button": "Ausgewählten Button aktivieren", "Toggle right panel": "Rechtes Panel ein-/ausblenden", "Toggle this dialog": "Diesen Dialog ein-/ausblenden", - "Move autocomplete selection up/down": "Auto-Vervollständigung nach oben/unten verschieben" + "Move autocomplete selection up/down": "Auto-Vervollständigung nach oben/unten verschieben", + "Opens chat with the given user": "Öffnet einen Chat mit diesem Benutzer", + "Sends a message to the given user": "Sendet diesem Benutzer eine Nachricht", + "Waiting for your other session to verify…": "Warte auf die Verifikation deiner anderen Sitzungen…" } From f35a8bffc93f91ce11a513070b7cd9feb28a4f04 Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Thu, 14 May 2020 16:32:26 +0000 Subject: [PATCH 277/319] Translated using Weblate (German) Currently translated at 100.0% (2309 of 2309 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a7b7da4146..1166e7710a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1794,7 +1794,7 @@ "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser E-Mail-Adresse mit „Single Sign-On“, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Bestätige das Hinzfugen der Email-Addresse", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser Telefonnumer, indem du deine Identität mittels Single Sign-On nachweist.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser Telefonnummer, indem du deine Identität mittels „Single Sign-On“ nachweist.", "Click the button below to confirm adding this phone number.": "Betätige unten die Schaltfläche um das Hinzufügen dieser Telefonnummer zu bestätigen.", "If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.", "%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an", @@ -2368,5 +2368,12 @@ "Move autocomplete selection up/down": "Auto-Vervollständigung nach oben/unten verschieben", "Opens chat with the given user": "Öffnet einen Chat mit diesem Benutzer", "Sends a message to the given user": "Sendet diesem Benutzer eine Nachricht", - "Waiting for your other session to verify…": "Warte auf die Verifikation deiner anderen Sitzungen…" + "Waiting for your other session to verify…": "Warte auf die Verifikation deiner anderen Sitzungen…", + "You've successfully verified your device!": "Du hast dein Gerät erfolgreich verifiziert!", + "QR Code": "QR-Code", + "To continue, use Single Sign On to prove your identity.": "Zum Fortfahren, nutze Single Sign On um deine Identität zu bestätigen.", + "Confirm to continue": "Bestätige um fortzufahren", + "Click the button below to confirm your identity.": "Klicke den Button unten um deine Identität zu bestätigen.", + "Confirm encryption setup": "Bestätige die Einrichtung der Verschlüsselung", + "Click the button below to confirm setting up encryption.": "Klick die Schaltfläche unten um die Einstellungen der Verschlüsselung zu bestätigen." } From 77df85b0ac2774d42b842c323c2f16822762cca3 Mon Sep 17 00:00:00 2001 From: Tentarial Date: Thu, 14 May 2020 16:36:58 +0000 Subject: [PATCH 278/319] Translated using Weblate (German) Currently translated at 100.0% (2309 of 2309 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1166e7710a..3600cb5148 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1029,7 +1029,7 @@ "Please review and accept all of the homeserver's policies": "Bitte prüfen und akzeptieren Sie alle Richtlinien des Heimservers", "Failed to load group members": "Konnte Gruppenmitglieder nicht laden", "That doesn't look like a valid email address": "Sieht nicht nach einer validen E-Mail-Adresse aus", - "Unable to load commit detail: %(msg)s": "Konnte Commit-Details nicht laden: %(msg)s", + "Unable to load commit detail: %(msg)s": "Konnte Commit-Details nicht laden: %(msg)", "Checking...": "Überprüfe...", "Unable to load backup status": "Konnte Backupstatus nicht laden", "Failed to decrypt %(failedCount)s sessions!": "Konnte %(failedCount)s Sitzungen nicht entschlüsseln!", From 09a4af49f35f750ecb66021e35c0540ec227d018 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 18:49:55 +0100 Subject: [PATCH 279/319] Consolidate zxcvbn progress bars into a component and add dynamic colour Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 1 + res/css/views/auth/_AuthBody.scss | 18 ------- .../views/elements/_ZxcvbnProgressBar.scss | 52 +++++++++++++++++++ .../keybackup/CreateKeyBackupDialog.js | 3 +- .../CreateSecretStorageDialog.js | 3 +- src/components/views/auth/RegistrationForm.js | 7 +-- .../views/elements/ZxcvbnProgressBar.tsx | 30 +++++++++++ 7 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 res/css/views/elements/_ZxcvbnProgressBar.scss create mode 100644 src/components/views/elements/ZxcvbnProgressBar.tsx diff --git a/res/css/_components.scss b/res/css/_components.scss index 428a28ac3a..671e156585 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -120,6 +120,7 @@ @import "./views/elements/_Tooltip.scss"; @import "./views/elements/_TooltipButton.scss"; @import "./views/elements/_Validation.scss"; +@import "./views/elements/_ZxcvbnProgressBar.scss"; @import "./views/emojipicker/_EmojiPicker.scss"; @import "./views/globals/_MatrixToolbar.scss"; @import "./views/groups/_GroupPublicityToggle.scss"; diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index 4b2d6b1bf1..f4967ce202 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -148,25 +148,7 @@ limitations under the License. } .mx_AuthBody_passwordScore { - width: 100%; - appearance: none; height: 4px; - border: 0; - border-radius: 2px; position: absolute; top: -12px; - - &::-moz-progress-bar { - border-radius: 2px; - background-color: $accent-color; - } - - &::-webkit-progress-bar, - &::-webkit-progress-value { - border-radius: 2px; - } - - &::-webkit-progress-value { - background-color: $accent-color; - } } diff --git a/res/css/views/elements/_ZxcvbnProgressBar.scss b/res/css/views/elements/_ZxcvbnProgressBar.scss new file mode 100644 index 0000000000..f7786348db --- /dev/null +++ b/res/css/views/elements/_ZxcvbnProgressBar.scss @@ -0,0 +1,52 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +$PassphraseStrengthHigh: $accent-color; +$PassphraseStrengthMedium: $username-variant5-color; +$PassphraseStrengthLow: $notice-primary-color; + +@define-mixin ProgressBarColour $colour { + color: $colour; + &::-moz-progress-bar { + background-color: $colour; + } + &::-webkit-progress-value { + background-color: $colour; + } +} + +progress.mx_ZxcvbnProgressBar { + appearance: none; + width: 100%; + border: 0; + + border-radius: 2px; + &::-moz-progress-bar { + border-radius: 2px; + } + &::-webkit-progress-bar, + &::-webkit-progress-value { + border-radius: 2px; + } + + @mixin ProgressBarColour $PassphraseStrengthLow; + &[value="2"], &[value="3"] { + @mixin ProgressBarColour $PassphraseStrengthMedium; + } + &[value="4"] { + @mixin ProgressBarColour $PassphraseStrengthHigh; + } +} diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index e4e39400f6..df2a81263d 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -26,6 +26,7 @@ import { accessSecretStorage } from '../../../../CrossSigningManager'; import SettingsStore from '../../../../settings/SettingsStore'; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; import {copyNode} from "../../../../utils/strings"; +import ZxcvbnProgressBar from "../../../../components/views/elements/ZxcvbnProgressBar"; const PHASE_PASSPHRASE = 0; const PHASE_PASSPHRASE_CONFIRM = 1; @@ -276,7 +277,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
      ; } strengthMeter =
      - +
      ; } diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index c24623e30e..4c1faa3e6a 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -26,6 +26,7 @@ import Modal from '../../../../Modal'; import { promptForBackupPassphrase } from '../../../../CrossSigningManager'; import {copyNode} from "../../../../utils/strings"; import {SSOAuthEntry} from "../../../../components/views/auth/InteractiveAuthEntryComponents"; +import ZxcvbnProgressBar from "../../../../components/views/elements/ZxcvbnProgressBar"; const PHASE_LOADING = 0; const PHASE_LOADERROR = 1; @@ -529,7 +530,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
      ; } strengthMeter =
      - +
      ; } diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 2a79bb8588..663e30d44d 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -29,6 +29,7 @@ import SdkConfig from '../../../SdkConfig'; import { SAFE_LOCALPART_REGEX } from '../../../Registration'; import withValidation from '../elements/Validation'; import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; +import ZxcvbnProgressBar from "../elements/ZxcvbnProgressBar"; const FIELD_EMAIL = 'field_email'; const FIELD_PHONE_NUMBER = 'field_phone_number'; @@ -274,11 +275,7 @@ export default createReactClass({ description: function() { const complexity = this.state.passwordComplexity; const score = complexity ? complexity.score : 0; - return ; + return ; }, rules: [ { diff --git a/src/components/views/elements/ZxcvbnProgressBar.tsx b/src/components/views/elements/ZxcvbnProgressBar.tsx new file mode 100644 index 0000000000..339149b400 --- /dev/null +++ b/src/components/views/elements/ZxcvbnProgressBar.tsx @@ -0,0 +1,30 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; +import classNames from "classnames"; + +interface IProps { + value: 0 | 1 | 2 | 3 | 4; + className?: string; +} + +const ZxcvbnProgressBar: React.FC = ({value, className}) => { + const classes = classNames("mx_ZxcvbnProgressBar", className); + return ; +}; + +export default ZxcvbnProgressBar; From 7ef456230479abd914f6aafbd54716007ad0a14f Mon Sep 17 00:00:00 2001 From: Tirifto Date: Thu, 14 May 2020 16:39:20 +0000 Subject: [PATCH 280/319] Translated using Weblate (Esperanto) Currently translated at 100.0% (2309 of 2309 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 11239303f8..6b3881339b 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -177,7 +177,7 @@ "Current password": "Nuna pasvorto", "Password": "Pasvorto", "New Password": "Nova pasvorto", - "Confirm password": "Konfirmi pasvorton", + "Confirm password": "Konfirmu pasvorton", "Change Password": "Ŝanĝi pasvorton", "Authentication": "Aŭtentikigo", "Device ID": "Aparata identigilo", @@ -298,7 +298,7 @@ "Only people who have been invited": "Nur invititaj uzantoj", "Anyone who knows the room's link, apart from guests": "Iu ajn kun la ligilo, krom gastoj", "Anyone who knows the room's link, including guests": "Iu ajn kun la ligilo, inkluzive gastojn", - "Publish this room to the public in %(domain)s's room directory?": "Ĉu publikigi ĉi tiun ĉambron al la publika ĉambrujo de %(domain)s?", + "Publish this room to the public in %(domain)s's room directory?": "Ĉu publikigi ĉi tiun ĉambron al la publika listo de ĉambroj de %(domain)s?", "Who can read history?": "Kiu povas legi la historion?", "Anyone": "Iu ajn", "Members only (since the point in time of selecting this option)": "Nur ĉambranoj (ekde ĉi tiu elekto)", @@ -441,7 +441,7 @@ "collapse": "maletendi", "expand": "etendi", "Custom level": "Propra nivelo", - "Room directory": "Ĉambra dosierujo", + "Room directory": "Listo de ĉambroj", "Username not available": "Uzantonomo ne disponeblas", "Username invalid: %(errMessage)s": "Uzantonomo ne validas: %(errMessage)s", "Username available": "Uzantonomo disponeblas", @@ -732,7 +732,7 @@ "No update available.": "Neniuj ĝisdatigoj haveblas.", "Resend": "Resendi", "Collecting app version information": "Kolektante informon pri versio de la aplikaĵo", - "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la ujo?", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la listo de ĉambroj?", "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto", "Invite to this community": "Inviti al tiu ĉi komunumo", "Messages containing keywords": "Mesaĝoj enhavantaj ŝlosilovortojn", @@ -1485,7 +1485,7 @@ "Homeserver URL does not appear to be a valid Matrix homeserver": "URL por hejmservilo ŝajne ne ligas al valida hejmservilo de Matrix", "Invalid identity server discovery response": "Nevalida eltrova respondo de identiga servilo", "Identity server URL does not appear to be a valid identity server": "URL por identiga servilo ŝajne ne ligas al valida identiga servilo", - "Sign in with single sign-on": "Salutu per ununura saluto", + "Sign in with single sign-on": "Saluti per ununura saluto", "Failed to re-authenticate due to a homeserver problem": "Malsukcesis reaŭtentikigi pro hejmservila problemo", "Failed to re-authenticate": "Malsukcesis reaŭtentikigi", "Enter your password to sign in and regain access to your account.": "Enigu vian pasvorton por saluti kaj rehavi aliron al via konto.", @@ -2405,5 +2405,6 @@ "Confirm to continue": "Konfirmu por daŭrigi", "Click the button below to confirm your identity.": "Klaku sube la butonon por konfirmi vian identecon.", "Confirm encryption setup": "Konfirmi agordon de ĉifrado", - "Click the button below to confirm setting up encryption.": "Klaku sube la butonon por konfirmi agordon de ĉifrado." + "Click the button below to confirm setting up encryption.": "Klaku sube la butonon por konfirmi agordon de ĉifrado.", + "QR Code": "Rapidresponda kodo" } From 2565f751839c65ac506c8d2e524030c2bfba1d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 14 May 2020 16:34:16 +0000 Subject: [PATCH 281/319] Translated using Weblate (Estonian) Currently translated at 48.2% (1113 of 2309 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index b6e4830bf7..2ab308b469 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1085,5 +1085,36 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Selleka et jätkata koduserveri %(homeserverDomain)s kasutamist sa pead üle vaatama ja nõustuma meie kasutamistingimustega.", "Permissions": "Õigused", "Select the roles required to change various parts of the room": "Vali rollid, mis on vajalikud jututoa eri osade muutmiseks", - "Enable encryption?": "Kas võtame krüptimise kasutusele?" + "Enable encryption?": "Kas võtame krüptimise kasutusele?", + "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. Learn more about encryption.": "Kui kord juba kasutusele võetud, siis krüptimist enam hiljem ära lõpetada ei saa. Krüptitud sõnumeid ei saa lugeda ei vaheapealses veebiliikluses ega serveris ja vaid jututoa liikmed saavad neid lugeda. Krüptimise kasutusele võtmine takistada nii robotite kui sõnumisildade tööd. Lisateave krüptimise kohta.", + "Guests cannot join this room even if explicitly invited.": "Külalised ei saa selle jututoaga liituda ka siis, kui neid on otseselt kutsutud.", + "Click here to fix": "Parandamiseks klõpsi siia", + "Server error": "Serveri viga", + "Command error": "Käsu viga", + "Server unavailable, overloaded, or something else went wrong.": "Kas server pole saadaval, on üle koormatud või midagi muud läks viltu.", + "Unknown Command": "Tundmatu käsk", + "Unrecognised command: %(commandText)s": "Tundmatu käsk: %(commandText)s", + "Send as message": "Saada sõnumina", + "Failed to connect to integration manager": "Ühendus integratsioonihalduriga ei õnnestunud", + "You don't currently have any stickerpacks enabled": "Sul pole ühtegi kleepsupakki kasutusel", + "Add some now": "Lisa nüüd mõned", + "Stickerpack": "Kleepsupakk", + "Hide Stickers": "Peida kleepsud", + "Show Stickers": "Näita kleepse", + "Failed to revoke invite": "Kutse tühistamine ei õnnestunud", + "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Kutse tühistamine ei õnnestunud. Serveri töös võib olla ajutine tõrge või sul pole piisavalt õigusi kutse tühistamiseks.", + "Revoke invite": "Tühista kutse", + "Invited by %(sender)s": "Kutsutud %(sender)s poolt", + "Jump to first unread message.": "Mine esimese lugemata sõnumi juurde.", + "Mark all as read": "Märgi kõik loetuks", + "Error updating main address": "Viga põhiaadressi uuendamisel", + "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Jututoa põhiaadressi uuendamisel tekkis viga. See kas pole serveris lubatud või tekkis mingi ajutine viga.", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Jututoa lisaaadressi uuendamisel tekkis viga. See kas pole serveris lubatud või tekkis mingi ajutine viga.", + "Error creating alias": "Viga aliase loomisel", + "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "Aliase loomisel tekkis viga. See kas pole serveris lubatud või tekkis mingi ajutine viga.", + "You don't have permission to delete the alias.": "Sul pole õigusi aliase kustutamiseks.", + "There was an error removing that alias. It may no longer exist or a temporary error occurred.": "Selle aliase eemaldamisel tekkis viga. Teda kas pole enam olemas või tekkis mingi ajutine viga.", + "Error removing alias": "Viga aliase eemaldamisel", + "Main address": "Põhiaadress", + "not specified": "määratlemata" } From 13922a71d3fd15f44a0d10e4fcd6a232081c8f14 Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Thu, 14 May 2020 16:48:38 +0000 Subject: [PATCH 282/319] Translated using Weblate (German) Currently translated at 100.0% (2309 of 2309 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3600cb5148..1166e7710a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1029,7 +1029,7 @@ "Please review and accept all of the homeserver's policies": "Bitte prüfen und akzeptieren Sie alle Richtlinien des Heimservers", "Failed to load group members": "Konnte Gruppenmitglieder nicht laden", "That doesn't look like a valid email address": "Sieht nicht nach einer validen E-Mail-Adresse aus", - "Unable to load commit detail: %(msg)s": "Konnte Commit-Details nicht laden: %(msg)", + "Unable to load commit detail: %(msg)s": "Konnte Commit-Details nicht laden: %(msg)s", "Checking...": "Überprüfe...", "Unable to load backup status": "Konnte Backupstatus nicht laden", "Failed to decrypt %(failedCount)s sessions!": "Konnte %(failedCount)s Sitzungen nicht entschlüsseln!", From 93a608a6446c6717a8b88d9f47ac71a096da0c20 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 19:31:40 +0100 Subject: [PATCH 283/319] flatten out passwordSafe as it was a derived state value Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/auth/RegistrationForm.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 663e30d44d..4e2860c0cf 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -79,7 +79,6 @@ export default createReactClass({ password: this.props.defaultPassword || "", passwordConfirm: this.props.defaultPassword || "", passwordComplexity: null, - passwordSafe: false, }; }, @@ -291,22 +290,21 @@ export default createReactClass({ } const { scorePassword } = await import('../../../utils/PasswordScorer'); const complexity = scorePassword(value); - const safe = complexity.score >= PASSWORD_MIN_SCORE; - const allowUnsafe = SdkConfig.get()["dangerously_allow_unsafe_and_insecure_passwords"]; this.setState({ passwordComplexity: complexity, - passwordSafe: safe, }); + const safe = complexity.score >= PASSWORD_MIN_SCORE; + const allowUnsafe = SdkConfig.get()["dangerously_allow_unsafe_and_insecure_passwords"]; return allowUnsafe || safe; }, valid: function() { // Unsafe passwords that are valid are only possible through a // configuration flag. We'll print some helper text to signal // to the user that their password is allowed, but unsafe. - if (!this.state.passwordSafe) { - return _t("Password is allowed, but unsafe"); + if (this.state.passwordComplexity.score >= PASSWORD_MIN_SCORE) { + return _t("Nice, strong password!"); } - return _t("Nice, strong password!"); + return _t("Password is allowed, but unsafe"); }, invalid: function() { const complexity = this.state.passwordComplexity; From 8dd561d28a8a1fc39663a0bc138ac7e317e5f03b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 19:33:17 +0100 Subject: [PATCH 284/319] Convert Validation to TypeScript Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../{Validation.js => Validation.tsx} | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) rename src/components/views/elements/{Validation.js => Validation.tsx} (87%) diff --git a/src/components/views/elements/Validation.js b/src/components/views/elements/Validation.tsx similarity index 87% rename from src/components/views/elements/Validation.js rename to src/components/views/elements/Validation.tsx index 2be526a3c3..09d6ec12f7 100644 --- a/src/components/views/elements/Validation.js +++ b/src/components/views/elements/Validation.tsx @@ -1,5 +1,6 @@ /* Copyright 2019 New Vector Ltd +Copyright 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,11 +16,34 @@ limitations under the License. */ /* eslint-disable babel/no-invalid-this */ +import React from "react"; +import classNames from "classnames"; -import classNames from 'classnames'; +type Data = Pick; + +interface IRule { + key: string; + final?: boolean; + skip?(this: T, data: Data): boolean; + test(this: T, data: Data): boolean | Promise; + valid?(this: T): string; + invalid?(this: T): string; +} + +interface IArgs { + rules: IRule[]; + description(): React.ReactChild; +} + +interface IValidateArgs { + value: string; + focused: boolean; + allowEmpty: boolean; +} /** * Creates a validation function from a set of rules describing what to validate. + * Generic T is the "this" type passed to the rule methods * * @param {Function} description * Function that returns a string summary of the kind of value that will @@ -37,8 +61,8 @@ import classNames from 'classnames'; * A validation function that takes in the current input value and returns * the overall validity and a feedback UI that can be rendered for more detail. */ -export default function withValidation({ description, rules }) { - return async function onValidate({ value, focused, allowEmpty = true }) { +export default function withValidation({ description, rules }: IArgs) { + return async function onValidate({ value, focused, allowEmpty = true }: IValidateArgs) { if (!value && allowEmpty) { return { valid: null, From eb6796bd0eef258bbd278b247e3fd6d773efd6fe Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 19:53:09 +0100 Subject: [PATCH 285/319] Migrate PasswordScorer to TypeScript Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/utils/{PasswordScorer.js => PasswordScorer.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/utils/{PasswordScorer.js => PasswordScorer.ts} (98%) diff --git a/src/utils/PasswordScorer.js b/src/utils/PasswordScorer.ts similarity index 98% rename from src/utils/PasswordScorer.js rename to src/utils/PasswordScorer.ts index 9d89942bf5..d8f3b0fb96 100644 --- a/src/utils/PasswordScorer.js +++ b/src/utils/PasswordScorer.ts @@ -63,7 +63,7 @@ _td("Short keyboard patterns are easy to guess"); * @param {string} password Password to score * @returns {object} Score result with `score` and `feedback` properties */ -export function scorePassword(password) { +export function scorePassword(password: string) { if (password.length === 0) return null; const userInputs = ZXCVBN_USER_INPUTS.slice(); From cf3c4d9e5f53a387a60cad742b6304b7c39f5b14 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 20:19:15 +0100 Subject: [PATCH 286/319] Extract Password field from Registration into a reusable component Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 1 + res/css/_components.scss | 1 + res/css/views/auth/_AuthBody.scss | 6 - .../_PassphraseField.scss} | 7 +- src/components/views/auth/PassphraseField.tsx | 121 ++++++++++++++++++ src/components/views/auth/RegistrationForm.js | 63 +-------- src/components/views/elements/Validation.tsx | 13 +- yarn.lock | 5 + 8 files changed, 148 insertions(+), 69 deletions(-) rename res/css/views/{elements/_ZxcvbnProgressBar.scss => auth/_PassphraseField.scss} (92%) create mode 100644 src/components/views/auth/PassphraseField.tsx diff --git a/package.json b/package.json index 92d228a812..797b57d306 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ "@types/classnames": "^2.2.10", "@types/modernizr": "^3.5.3", "@types/react": "16.9", + "@types/zxcvbn": "^4.4.0", "babel-eslint": "^10.0.3", "babel-jest": "^24.9.0", "chokidar": "^3.3.1", diff --git a/res/css/_components.scss b/res/css/_components.scss index 671e156585..b871045fa1 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -41,6 +41,7 @@ @import "./views/auth/_CountryDropdown.scss"; @import "./views/auth/_InteractiveAuthEntryComponents.scss"; @import "./views/auth/_LanguageSelector.scss"; +@import "./views/auth/_PassphraseField.scss"; @import "./views/auth/_ServerConfig.scss"; @import "./views/auth/_ServerTypeSelector.scss"; @import "./views/auth/_Welcome.scss"; diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index f4967ce202..120da4c4f1 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -146,9 +146,3 @@ limitations under the License. .mx_AuthBody_spinner { margin: 1em 0; } - -.mx_AuthBody_passwordScore { - height: 4px; - position: absolute; - top: -12px; -} diff --git a/res/css/views/elements/_ZxcvbnProgressBar.scss b/res/css/views/auth/_PassphraseField.scss similarity index 92% rename from res/css/views/elements/_ZxcvbnProgressBar.scss rename to res/css/views/auth/_PassphraseField.scss index f7786348db..d810198213 100644 --- a/res/css/views/elements/_ZxcvbnProgressBar.scss +++ b/res/css/views/auth/_PassphraseField.scss @@ -18,6 +18,8 @@ $PassphraseStrengthHigh: $accent-color; $PassphraseStrengthMedium: $username-variant5-color; $PassphraseStrengthLow: $notice-primary-color; +.mx_PassphraseField {} + @define-mixin ProgressBarColour $colour { color: $colour; &::-moz-progress-bar { @@ -28,10 +30,13 @@ $PassphraseStrengthLow: $notice-primary-color; } } -progress.mx_ZxcvbnProgressBar { +progress.mx_PassphraseField_progress { appearance: none; width: 100%; border: 0; + height: 4px; + position: absolute; + top: -12px; border-radius: 2px; &::-moz-progress-bar { diff --git a/src/components/views/auth/PassphraseField.tsx b/src/components/views/auth/PassphraseField.tsx new file mode 100644 index 0000000000..425921cd7c --- /dev/null +++ b/src/components/views/auth/PassphraseField.tsx @@ -0,0 +1,121 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React, {PureComponent, RefCallback, RefObject} from "react"; +import classNames from "classnames"; +import zxcvbn from "zxcvbn"; + +import SdkConfig from "../../../SdkConfig"; +import withValidation, {IFieldState, IValidationResult} from "../elements/Validation"; +import {_t, _td} from "../../../languageHandler"; +import Field from "../elements/Field"; + +interface IProps { + id?: string; + className?: string; + minScore: 0 | 1 | 2 | 3 | 4; + value: string; + fieldRef: RefCallback | RefObject; + + label?: string; + labelEnterPassword?: string; + labelStrongPassword?: string; + labelAllowedButUnsafe?: string; + + onChange(ev: KeyboardEvent); + onValidate(result: IValidationResult); +} + +interface IState { + complexity: zxcvbn.ZXCVBNResult; +} + +class PassphraseField extends PureComponent { + static defaultProps = { + label: _td("Password"), + labelEnterPassword: _td("Enter password"), + labelStrongPassword: _td("Nice, strong password!"), + labelAllowedButUnsafe: _td("Password is allowed, but unsafe"), + }; + + public readonly validate = withValidation({ + description: function() { + const complexity = this.state.complexity; + const score = complexity ? complexity.score : 0; + return ; + }, + rules: [ + { + key: "required", + test: ({ value, allowEmpty }) => allowEmpty || !!value, + invalid: () => _t(this.props.labelEnterPassword), + }, + { + key: "complexity", + test: async function({ value }) { + if (!value) { + return false; + } + const { scorePassword } = await import('../../../utils/PasswordScorer'); + const complexity = scorePassword(value); + this.setState({ complexity }); + const safe = complexity.score >= this.props.minScore; + const allowUnsafe = SdkConfig.get()["dangerously_allow_unsafe_and_insecure_passwords"]; + return allowUnsafe || safe; + }, + valid: function() { + // Unsafe passwords that are valid are only possible through a + // configuration flag. We'll print some helper text to signal + // to the user that their password is allowed, but unsafe. + if (this.state.complexity.score >= this.props.minScore) { + return _t(this.props.labelStrongPassword); + } + return _t(this.props.labelAllowedButUnsafe); + }, + invalid: function() { + const complexity = this.state.complexity; + if (!complexity) { + return null; + } + const { feedback } = complexity; + return feedback.warning || feedback.suggestions[0] || _t("Keep going..."); + }, + }, + ], + }); + + onValidate = async (fieldState: IFieldState) => { + const result = await this.validate(fieldState); + this.props.onValidate(result); + return result; + }; + + render() { + return + } +} + +export default PassphraseField; diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 4e2860c0cf..7bbd15d8d3 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -29,7 +29,7 @@ import SdkConfig from '../../../SdkConfig'; import { SAFE_LOCALPART_REGEX } from '../../../Registration'; import withValidation from '../elements/Validation'; import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; -import ZxcvbnProgressBar from "../elements/ZxcvbnProgressBar"; +import PassphraseField from "./PassphraseField"; const FIELD_EMAIL = 'field_email'; const FIELD_PHONE_NUMBER = 'field_phone_number'; @@ -264,60 +264,10 @@ export default createReactClass({ }); }, - async onPasswordValidate(fieldState) { - const result = await this.validatePasswordRules(fieldState); + onPasswordValidate(result) { this.markFieldValid(FIELD_PASSWORD, result.valid); - return result; }, - validatePasswordRules: withValidation({ - description: function() { - const complexity = this.state.passwordComplexity; - const score = complexity ? complexity.score : 0; - return ; - }, - rules: [ - { - key: "required", - test: ({ value, allowEmpty }) => allowEmpty || !!value, - invalid: () => _t("Enter password"), - }, - { - key: "complexity", - test: async function({ value }) { - if (!value) { - return false; - } - const { scorePassword } = await import('../../../utils/PasswordScorer'); - const complexity = scorePassword(value); - this.setState({ - passwordComplexity: complexity, - }); - const safe = complexity.score >= PASSWORD_MIN_SCORE; - const allowUnsafe = SdkConfig.get()["dangerously_allow_unsafe_and_insecure_passwords"]; - return allowUnsafe || safe; - }, - valid: function() { - // Unsafe passwords that are valid are only possible through a - // configuration flag. We'll print some helper text to signal - // to the user that their password is allowed, but unsafe. - if (this.state.passwordComplexity.score >= PASSWORD_MIN_SCORE) { - return _t("Nice, strong password!"); - } - return _t("Password is allowed, but unsafe"); - }, - invalid: function() { - const complexity = this.state.passwordComplexity; - if (!complexity) { - return null; - } - const { feedback } = complexity; - return feedback.warning || feedback.suggestions[0] || _t("Keep going..."); - }, - }, - ], - }), - onPasswordConfirmChange(ev) { this.setState({ passwordConfirm: ev.target.value, @@ -479,13 +429,10 @@ export default createReactClass({ }, renderPassword() { - const Field = sdk.getComponent('elements.Field'); - return this[FIELD_PASSWORD] = field} - type="password" - autoComplete="new-password" - label={_t("Password")} + fieldRef={field => this[FIELD_PASSWORD] = field} + minScore={PASSWORD_MIN_SCORE} value={this.state.password} onChange={this.onPasswordChange} onValidate={this.onPasswordValidate} diff --git a/src/components/views/elements/Validation.tsx b/src/components/views/elements/Validation.tsx index 09d6ec12f7..50544c9f51 100644 --- a/src/components/views/elements/Validation.tsx +++ b/src/components/views/elements/Validation.tsx @@ -19,7 +19,7 @@ limitations under the License. import React from "react"; import classNames from "classnames"; -type Data = Pick; +type Data = Pick; interface IRule { key: string; @@ -32,15 +32,20 @@ interface IRule { interface IArgs { rules: IRule[]; - description(): React.ReactChild; + description(this: T): React.ReactChild; } -interface IValidateArgs { +export interface IFieldState { value: string; focused: boolean; allowEmpty: boolean; } +export interface IValidationResult { + valid?: boolean; + feedback?: React.ReactChild; +} + /** * Creates a validation function from a set of rules describing what to validate. * Generic T is the "this" type passed to the rule methods @@ -62,7 +67,7 @@ interface IValidateArgs { * the overall validity and a feedback UI that can be rendered for more detail. */ export default function withValidation({ description, rules }: IArgs) { - return async function onValidate({ value, focused, allowEmpty = true }: IValidateArgs) { + return async function onValidate({ value, focused, allowEmpty = true }: IFieldState): Promise { if (!value && allowEmpty) { return { valid: null, diff --git a/yarn.lock b/yarn.lock index 520e976b17..b2c703c0d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1318,6 +1318,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/zxcvbn@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.0.tgz#fbc1d941cc6d9d37d18405c513ba6b294f89b609" + integrity sha512-GQLOT+SN20a+AI51y3fAimhyTF4Y0RG+YP3gf91OibIZ7CJmPFgoZi+ZR5a+vRbS01LbQosITWum4ATmJ1Z6Pg== + "@typescript-eslint/experimental-utils@^2.5.0": version "2.27.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a" From 865495dd695293fa5c8cc9ee17bb24dfdc66d097 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 May 2020 20:33:50 +0100 Subject: [PATCH 287/319] replace zxcvbn field in CreateSecretStorageDialog with PassphraseField Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../_CreateSecretStorageDialog.scss | 11 -- .../CreateSecretStorageDialog.js | 106 +++++------------- src/components/views/auth/PassphraseField.tsx | 6 +- 3 files changed, 36 insertions(+), 87 deletions(-) diff --git a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss index a9ebd54b31..63e5a3de09 100644 --- a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss +++ b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss @@ -68,17 +68,6 @@ limitations under the License. margin-top: 0px; } -.mx_CreateSecretStorageDialog_passPhraseHelp { - flex: 1; - height: 64px; - margin-left: 20px; - font-size: 80%; -} - -.mx_CreateSecretStorageDialog_passPhraseHelp progress { - width: 100%; -} - .mx_CreateSecretStorageDialog_passPhraseMatch { width: 200px; margin-left: 20px; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 4c1faa3e6a..b77c71d08c 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -15,18 +15,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; +import React, {createRef} from 'react'; import PropTypes from 'prop-types'; import * as sdk from '../../../../index'; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; -import { scorePassword } from '../../../../utils/PasswordScorer'; import FileSaver from 'file-saver'; -import { _t } from '../../../../languageHandler'; +import {_t, _td} from '../../../../languageHandler'; import Modal from '../../../../Modal'; import { promptForBackupPassphrase } from '../../../../CrossSigningManager'; import {copyNode} from "../../../../utils/strings"; import {SSOAuthEntry} from "../../../../components/views/auth/InteractiveAuthEntryComponents"; -import ZxcvbnProgressBar from "../../../../components/views/elements/ZxcvbnProgressBar"; +import PassphraseField from "../../../../components/views/auth/PassphraseField"; const PHASE_LOADING = 0; const PHASE_LOADERROR = 1; @@ -40,7 +39,6 @@ const PHASE_DONE = 8; const PHASE_CONFIRM_SKIP = 9; const PASSWORD_MIN_SCORE = 4; // So secure, many characters, much complex, wow, etc, etc. -const PASSPHRASE_FEEDBACK_DELAY = 500; // How long after keystroke to offer passphrase feedback, ms. /* * Walks the user through the process of creating a passphrase to guard Secure @@ -69,10 +67,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent { this.state = { phase: PHASE_LOADING, passPhrase: '', + passPhraseValid: false, passPhraseConfirm: '', copied: false, downloaded: false, - zxcvbnResult: null, backupInfo: null, backupSigStatus: null, // does the server offer a UI auth flow with just m.login.password @@ -84,6 +82,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { useKeyBackup: true, }; + this._passphraseField = createRef(); + this._fetchBackupInfo(); if (this.state.accountPassword) { // If we have an account password in memory, let's simplify and @@ -365,22 +365,16 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _onPassPhraseNextClick = async (e) => { e.preventDefault(); + if (!this._passphraseField.current) return; // unmounting - // If we're waiting for the timeout before updating the result at this point, - // skip ahead and do it now, otherwise we'll deny the attempt to proceed - // even if the user entered a valid passphrase - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - this._setZxcvbnResultTimeout = null; - await new Promise((resolve) => { - this.setState({ - zxcvbnResult: scorePassword(this.state.passPhrase), - }, resolve); - }); - } - if (this._passPhraseIsValid()) { - this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); + await this._passphraseField.current.validate({ allowEmpty: false }); + if (!this._passphraseField.current.state.valid) { + this._passphraseField.current.focus(); + this._passphraseField.current.validate({ allowEmpty: false, focused: true }); + return; } + + this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); }; _onPassPhraseConfirmNextClick = async (e) => { @@ -400,9 +394,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _onSetAgainClick = () => { this.setState({ passPhrase: '', + passPhraseValid: false, passPhraseConfirm: '', phase: PHASE_PASSPHRASE, - zxcvbnResult: null, }); } @@ -412,23 +406,16 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } + _onPassPhraseValidate = (result) => { + this.setState({ + passPhraseValid: result.valid, + }); + }; + _onPassPhraseChange = (e) => { this.setState({ passPhrase: e.target.value, }); - - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - } - this._setZxcvbnResultTimeout = setTimeout(() => { - this._setZxcvbnResultTimeout = null; - this.setState({ - // precompute this and keep it in state: zxcvbn is fast but - // we use it in a couple of different places so no point recomputing - // it unnecessarily. - zxcvbnResult: scorePassword(this.state.passPhrase), - }); - }, PASSPHRASE_FEEDBACK_DELAY); } _onPassPhraseConfirmChange = (e) => { @@ -437,10 +424,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } - _passPhraseIsValid() { - return this.state.zxcvbnResult && this.state.zxcvbnResult.score >= PASSWORD_MIN_SCORE; - } - _onAccountPasswordChange = (e) => { this.setState({ accountPassword: e.target.value, @@ -503,37 +486,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _renderPhasePassPhrase() { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - const Field = sdk.getComponent('views.elements.Field'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const LabelledToggleSwitch = sdk.getComponent('views.elements.LabelledToggleSwitch'); - let strengthMeter; - let helpText; - if (this.state.zxcvbnResult) { - if (this.state.zxcvbnResult.score >= PASSWORD_MIN_SCORE) { - helpText = _t("Great! This recovery passphrase looks strong enough."); - } else { - // We take the warning from zxcvbn or failing that, the first - // suggestion. In practice The first is generally the most relevant - // and it's probably better to present the user with one thing to - // improve about their password than a whole collection - it can - // spit out a warning and multiple suggestions which starts getting - // very information-dense. - const suggestion = ( - this.state.zxcvbnResult.feedback.warning || - this.state.zxcvbnResult.feedback.suggestions[0] - ); - const suggestionBlock =
      {suggestion || _t("Keep going...")}
      ; - - helpText =
      - {suggestionBlock} -
      ; - } - strengthMeter =
      - -
      ; - } - return

      {_t( "Set a recovery passphrase to secure encrypted information and recover it if you log out. " + @@ -541,19 +496,20 @@ export default class CreateSecretStorageDialog extends React.PureComponent { )}

      - -
      - {strengthMeter} - {helpText} -
      .": "Mitte midagi ei kuvata? Kõik Matrix'i kliendid ei toeta veel interaktiivset verifitseerimist. .", + "Waiting for %(userId)s to confirm...": "Ootan kinnitust kasutajalt %(userId)s…", + "Skip": "Jäta vahele", + "Token incorrect": "Vigane tunnusluba" } From 7c5842c208fe08b9e48964214663a447216bc928 Mon Sep 17 00:00:00 2001 From: Xose M Date: Sun, 17 May 2020 09:37:45 +0000 Subject: [PATCH 305/319] Translated using Weblate (Galician) Currently translated at 40.0% (925 of 2312 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 346dda09f2..3328292be0 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -698,9 +698,9 @@ "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", "Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala", "Key request sent.": "Petición de chave enviada.", - "Flair": "Aura", - "Showing flair for these communities:": "Mostrar a aura para estas comunidades:", - "Display your community flair in rooms configured to show it.": "Mostrar a aura da súa comunidade nas salas configuradas para que a mostren.", + "Flair": "Popularidade", + "Showing flair for these communities:": "Mostrar a popularidade destas comunidades:", + "Display your community flair in rooms configured to show it.": "Mostrar a popularidade da túa comunidade nas salas configuradas para que a mostren.", "Did you know: you can use communities to filter your Riot.im experience!": "Sabía que pode utilizar as comunidades para mellorar a súa experiencia con Riot.im!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Para establecer un filtro, arrastre un avatar da comunidade sobre o panel de filtros na parte esquerda da pantalla. Pode pulsar nun avatar no panel de filtrado en calquera momento para ver só salas e xente asociada a esa comunidade.", "Deops user with given id": "Degradar o usuario con esa ID", @@ -822,7 +822,7 @@ "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.": "Os informes de depuración conteñen datos de utilización do aplicativo como o seu nome de usuario, os IDs ou alcumes de salas e grupos que vostede visitou e os nomes de usuarios doutras usuarias. Non conteñen mensaxes.", "Unhide Preview": "Desagochar a vista previa", "Unable to join network": "Non se puido conectar a rede", - "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode que os configurase nun cliente diferente de Riot. Non pode establecelos desde Riot pero aínda así aplicaranse", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode que os configurases nun cliente diferente de Riot. Non podes establecelos desde Riot pero aínda así aplicaranse", "Sorry, your browser is not able to run Riot.": "Desculpe, o seu navegador non pode executar Riot.", "Uploaded on %(date)s by %(user)s": "Subido a %(date)s por %(user)s", "Messages in group chats": "Mensaxes en grupos de chat", @@ -919,5 +919,23 @@ "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "A súa mensaxe non foi enviada porque este servidor acadou o Límite Mensual de Usuaria Activa. Por favor contacte coa administración do servizo para continuar utilizando o servizo.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "A súa mensaxe non foi enviada porque o servidor superou o límite de recursos. Por favor contacte coa administración do servizo para continuar utilizando o servizo.", "Legal": "Legal", - "Please contact your service administrator to continue using this service.": "Por favor contacte coa administración do servizo para continuar utilizando o servizo." + "Please contact your service administrator to continue using this service.": "Por favor contacte coa administración do servizo para continuar utilizando o servizo.", + "Use Single Sign On to continue": "Usar Single Sign On para continuar", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirma que queres engadir este email usando Single Sign On como proba de identidade.", + "Single Sign On": "Single Sign On", + "Confirm adding email": "Confirma novo email", + "Click the button below to confirm adding this email address.": "Preme no botón inferior para confirmar que queres engadir o email.", + "Confirm": "Confirmar", + "Add Email Address": "Engadir email", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirma que queres engadir este teléfono usando Single Sign On como proba de identidade.", + "Confirm adding phone number": "Confirma a adición do teléfono", + "Click the button below to confirm adding this phone number.": "Preme no botón inferior para confirmar que engades este número.", + "Add Phone Number": "Engadir novo Número", + "The version of Riot": "A versión de Riot", + "Whether or not you're logged in (we don't record your username)": "Se estás conectada ou non (non rexistramos o teu nome de usuaria)", + "Whether you're using Riot on a device where touch is the primary input mechanism": "Se estás conectada utilizando Riot nun dispositivo maiormente táctil", + "Whether you're using Riot as an installed Progressive Web App": "Se estás a usar Riot como unha Progressive Web App instalada", + "Your user agent": "User Agent do navegador", + "The information being sent to us to help make Riot better includes:": "Información que nos envías para mellorar Riot inclúe:", + "Please install Chrome, Firefox, or Safari for the best experience.": "Instala Chrome, Firefox, ou Safari para ter unha mellor experiencia." } From 5ea4cc1c5b209b5ea8b3401ea3cabf80a20da11a Mon Sep 17 00:00:00 2001 From: yuuki-san Date: Mon, 18 May 2020 08:31:13 +0000 Subject: [PATCH 306/319] Translated using Weblate (Slovak) Currently translated at 62.3% (1441 of 2312 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index fbecaa4845..e85732ed82 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -628,7 +628,7 @@ "Export room keys": "Exportovať kľúče miestností", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Tento proces vás prevedie exportom kľúčov určených na dešifrovanie správ, ktoré ste dostali v šifrovaných miestnostiach do lokálneho súboru. Tieto kľúče zo súboru môžete neskôr importovať do iného Matrix klienta, aby ste v ňom mohli dešifrovať vaše šifrované správy.", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Tento súbor umožní komukoľvek, k to má ku nemu prístup dešifrovať všetky vami viditeľné šifrované správy, mali by ste teda byť opatrní a tento súbor si bezpečne uchovať. Aby bolo toto pre vás jednoduchšie, nižšie zadajte heslo, ktorým budú údaje v súbore zašifrované. Importovať údaje zo súboru bude možné len po zadaní tohoto istého hesla.", - "Enter passphrase": "Zadajte heslo", + "Enter passphrase": "Zadajte (dlhé) heslo", "Confirm passphrase": "Potvrďte heslo", "Export": "Exportovať", "Import room keys": "Importovať kľúče miestností", @@ -1519,5 +1519,17 @@ "Whether you're using Riot on a device where touch is the primary input mechanism": "Či používate Riot na zariadení, ktorého hlavným vstupným mechanizmom je dotyk (mobil, tablet,...)", "Whether you're using Riot as an installed Progressive Web App": "Či používate Riot ako nainštalovanú Progresívnu Webovú Aplikáciu", "Your user agent": "Identifikátor vášho prehliadača", - "The information being sent to us to help make Riot better includes:": "Informácie, ktoré nám posielate, aby sme zlepšili Riot, zahŕňajú:" + "The information being sent to us to help make Riot better includes:": "Informácie, ktoré nám posielate, aby sme zlepšili Riot, zahŕňajú:", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V miestnosti je neznáma relácia: pokiaľ budete pokračovať bez jej overenia, bude schopná odpočúvať váš hovor.", + "Review Sessions": "Overiť reláciu", + "If you cancel now, you won't complete verifying the other user.": "Pokiaľ teraz proces zrušíte, nedokončíte overenie druhého používateľa.", + "If you cancel now, you won't complete verifying your other session.": "Pokiaľ teraz proces zrušíte, nedokončíte overenie vašej druhej relácie.", + "If you cancel now, you won't complete your operation.": "Pokiaľ teraz proces zrušíte, nedokončíte ho.", + "Cancel entering passphrase?": "Zrušiť zadávanie (dlhého) hesla.", + "Setting up keys": "Príprava kľúčov", + "Verify this session": "Overiť túto reláciu", + "Keep recovery passphrase in memory for this session": "Ponechať (dlhé) heslo pre obnovu zálohy v pamäti pre túto reláciu", + "Enter recovery passphrase": "Zadajte (dlhé) heslo pre obnovu zálohy", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Nemožno sa dostať do tajného úložiska. Prosím, overte, že ste zadali správne (dlhé) heslo pre obnovu zálohy.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Získajte prístup k vašej zabezpečenej histórií správ a vašemu krížom-podpísanej identite na potvrdenie iných relácií zadaním vášho (dlhého) hesla na obnovu zálohy." } From b6ac8cb28d92822ea1cf128fd46b687113e1a74d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Wed, 13 May 2020 06:36:14 +0100 Subject: [PATCH 307/319] Revert "ImageView make clicking off it easier" (cherry picked from commit 52e3c97f8c9a2032fe92b2b4bb5fc68c0f6957b5) --- res/css/views/elements/_ImageView.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index 983ef074f2..0a4ed2a194 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -37,7 +37,7 @@ limitations under the License. order: 2; /* min-width hack needed for FF */ min-width: 0px; - max-height: 90%; + height: 90%; flex: 15 15 0; display: flex; align-items: center; From a864643d98197ae6bc3bf34c8ee3da4c4a94a013 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 May 2020 10:37:02 +0100 Subject: [PATCH 308/319] Label the create room button something better than "Add room" Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomList.js | 1 + src/i18n/strings/en_EN.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 289a89a206..c46b946b5c 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -785,6 +785,7 @@ export default createReactClass({ label: _t('Rooms'), incomingCall: incomingCallIfTaggedAs('im.vector.fake.recent'), onAddRoom: () => {dis.dispatch({action: 'view_create_room'});}, + addRoomLabel: _t("Create room"), }, ]; const tagSubLists = Object.keys(this.state.lists) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f16a0d7755..c9ac768b3e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1113,6 +1113,7 @@ "Direct Messages": "Direct Messages", "Start chat": "Start chat", "Rooms": "Rooms", + "Create room": "Create room", "Low priority": "Low priority", "Historical": "Historical", "System Alerts": "System Alerts", From 17f535e5f878337854b7599ca8da2b3e8528c81b Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Mon, 18 May 2020 16:37:10 +0100 Subject: [PATCH 309/319] Fix review problems - removed superfluous position and classes - fixed compact view - fixed event list summary avatar and text overlap - fixed a problem where the mention list refuses to load. --- res/css/views/rooms/_EventTile.scss | 79 ------------------ res/css/views/rooms/_GroupLayout.scss | 82 ++++++++++++++++++- res/css/views/rooms/_IRCLayout.scss | 4 +- src/components/structures/MessagePanel.js | 2 +- .../views/elements/ErrorBoundary.js | 2 +- .../elements/IRCTimelineProfileResizer.tsx | 4 +- src/components/views/rooms/EventTile.js | 2 - 7 files changed, 88 insertions(+), 87 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index b9a41c4310..c278f813d0 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -37,7 +37,6 @@ limitations under the License. } .mx_EventTile_avatar { - position: absolute; top: 14px; left: 8px; cursor: pointer; @@ -576,84 +575,6 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { /* end of overrides */ -.mx_MatrixChat_useCompactLayout { - .mx_EventTile { - padding-top: 4px; - } - - .mx_EventTile.mx_EventTile_info { - // same as the padding for non-compact .mx_EventTile.mx_EventTile_info - padding-top: 0px; - font-size: $font-13px; - .mx_EventTile_line, .mx_EventTile_reply { - line-height: $font-20px; - } - .mx_EventTile_avatar { - top: 4px; - } - } - - .mx_EventTile .mx_SenderProfile { - font-size: $font-13px; - } - - .mx_EventTile.mx_EventTile_emote { - // add a bit more space for emotes so that avatars don't collide - padding-top: 8px; - .mx_EventTile_avatar { - top: 2px; - } - .mx_EventTile_line, .mx_EventTile_reply { - padding-top: 0px; - padding-bottom: 1px; - } - } - - .mx_EventTile.mx_EventTile_emote.mx_EventTile_continuation { - padding-top: 0; - .mx_EventTile_line, .mx_EventTile_reply { - padding-top: 0px; - padding-bottom: 0px; - } - } - - .mx_EventTile_line, .mx_EventTile_reply { - padding-top: 0px; - padding-bottom: 0px; - } - - .mx_EventTile_avatar { - top: 2px; - } - - .mx_EventTile_e2eIcon { - top: 3px; - } - - .mx_EventTile_readAvatars { - top: 27px; - } - - .mx_EventTile_continuation .mx_EventTile_readAvatars, - .mx_EventTile_emote .mx_EventTile_readAvatars { - top: 5px; - } - - .mx_EventTile_info .mx_EventTile_readAvatars { - top: 4px; - } - - .mx_RoomView_MessageList h2 { - margin-top: 6px; - } - - .mx_EventTile_content .markdown-body { - p, ul, ol, dl, blockquote, pre, table { - margin-bottom: 4px; // 1/4 of the non-compact margin-bottom - } - } -} - .mx_EventTile_tileError { color: red; text-align: center; diff --git a/res/css/views/rooms/_GroupLayout.scss b/res/css/views/rooms/_GroupLayout.scss index 6528d6c6cd..bfe463ed49 100644 --- a/res/css/views/rooms/_GroupLayout.scss +++ b/res/css/views/rooms/_GroupLayout.scss @@ -47,6 +47,86 @@ $left-gutter: 65px; } .mx_EventTile_info .mx_EventTile_line { - padding-left: 83px; + padding-left: calc($left-gutter + 18px); } } + +/* Compact layout overrides */ + +.mx_MatrixChat_useCompactLayout { + .mx_EventTile { + padding-top: 4px; + } + + .mx_EventTile.mx_EventTile_info { + // same as the padding for non-compact .mx_EventTile.mx_EventTile_info + padding-top: 0px; + font-size: $font-13px; + .mx_EventTile_line, .mx_EventTile_reply { + line-height: $font-20px; + } + .mx_EventTile_avatar { + top: 4px; + } + } + + .mx_EventTile .mx_SenderProfile { + font-size: $font-13px; + } + + .mx_EventTile.mx_EventTile_emote { + // add a bit more space for emotes so that avatars don't collide + padding-top: 8px; + .mx_EventTile_avatar { + top: 2px; + } + .mx_EventTile_line, .mx_EventTile_reply { + padding-top: 0px; + padding-bottom: 1px; + } + } + + .mx_EventTile.mx_EventTile_emote.mx_EventTile_continuation { + padding-top: 0; + .mx_EventTile_line, .mx_EventTile_reply { + padding-top: 0px; + padding-bottom: 0px; + } + } + + .mx_EventTile_line, .mx_EventTile_reply { + padding-top: 0px; + padding-bottom: 0px; + } + + .mx_EventTile_avatar { + top: 2px; + } + + .mx_EventTile_e2eIcon { + top: 3px; + } + + .mx_EventTile_readAvatars { + top: 27px; + } + + .mx_EventTile_continuation .mx_EventTile_readAvatars, + .mx_EventTile_emote .mx_EventTile_readAvatars { + top: 5px; + } + + .mx_EventTile_info .mx_EventTile_readAvatars { + top: 4px; + } + + .mx_RoomView_MessageList h2 { + margin-top: 6px; + } + + .mx_EventTile_content .markdown-body { + p, ul, ol, dl, blockquote, pre, table { + margin-bottom: 4px; // 1/4 of the non-compact margin-bottom + } + } +} \ No newline at end of file diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index f2a616f9c9..5f88473c5f 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -138,7 +138,7 @@ $irc-line-height: $font-18px; .mx_EventListSummary_avatars { padding: 0; - margin: 0; + margin: 0 9px 0 0; } } @@ -185,7 +185,7 @@ $irc-line-height: $font-18px; .mx_SenderProfile_hover:hover { overflow: visible; - width: auto; + width: max(auto, 100%); z-index: 10; } diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 1c10efb346..f875467e4f 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -822,7 +822,7 @@ export default class MessagePanel extends React.Component { let ircResizer = null; if (this.state.useIRCLayout) { - ircResizer = ; + ircResizer = ; } return ( diff --git a/src/components/views/elements/ErrorBoundary.js b/src/components/views/elements/ErrorBoundary.js index 1abd11f838..a043b350ab 100644 --- a/src/components/views/elements/ErrorBoundary.js +++ b/src/components/views/elements/ErrorBoundary.js @@ -73,7 +73,7 @@ export default class ErrorBoundary extends React.PureComponent { if (this.state.error) { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const newIssueUrl = "https://github.com/vector-im/riot-web/issues/new"; - return
      + return

      {_t("Something went wrong!")}

      {_t( diff --git a/src/components/views/elements/IRCTimelineProfileResizer.tsx b/src/components/views/elements/IRCTimelineProfileResizer.tsx index 44ceeb9b7b..596d46bf36 100644 --- a/src/components/views/elements/IRCTimelineProfileResizer.tsx +++ b/src/components/views/elements/IRCTimelineProfileResizer.tsx @@ -77,7 +77,9 @@ export default class IRCTimelineProfileResizer extends React.Component Date: Mon, 18 May 2020 16:43:47 +0100 Subject: [PATCH 310/319] lint --- res/css/views/rooms/_GroupLayout.scss | 2 +- src/components/structures/MessagePanel.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_GroupLayout.scss b/res/css/views/rooms/_GroupLayout.scss index bfe463ed49..40440f7d49 100644 --- a/res/css/views/rooms/_GroupLayout.scss +++ b/res/css/views/rooms/_GroupLayout.scss @@ -129,4 +129,4 @@ $left-gutter: 65px; margin-bottom: 4px; // 1/4 of the non-compact margin-bottom } } -} \ No newline at end of file +} diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index f875467e4f..b3f9b40ada 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -822,7 +822,11 @@ export default class MessagePanel extends React.Component { let ircResizer = null; if (this.state.useIRCLayout) { - ircResizer = ; + ircResizer = ; } return ( From 4deeef5fca9afcaf35d3c76f20ea84c8ac4808aa Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Mon, 18 May 2020 16:57:00 +0100 Subject: [PATCH 311/319] Remove ability to remove avatars --- src/components/structures/MessagePanel.js | 13 ------------- src/components/views/elements/ReplyThread.js | 7 ++----- src/components/views/rooms/EventTile.js | 6 +----- src/settings/Settings.js | 6 ------ 4 files changed, 3 insertions(+), 29 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index b3f9b40ada..404e950d7f 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -174,11 +174,6 @@ export default class MessagePanel extends React.Component { SettingsStore.watchSetting("showTypingNotifications", null, this.onShowTypingNotificationsChange); this._layoutWatcherRef = SettingsStore.watchSetting("feature_irc_ui", null, this.onLayoutChange); - this._displayAvatarsWatcherRef = SettingsStore.watchSetting( - "feature_no_timeline_avatars", - null, - this.onDisplayAvatarsChange, - ); } componentDidMount() { @@ -189,7 +184,6 @@ export default class MessagePanel extends React.Component { this._isMounted = false; SettingsStore.unwatchSetting(this._showTypingNotificationsWatcherRef); SettingsStore.unwatchSetting(this._layoutWatcherRef); - SettingsStore.unwatchSetting(this._displayAvatarsWatcherRef); } componentDidUpdate(prevProps, prevState) { @@ -214,12 +208,6 @@ export default class MessagePanel extends React.Component { }); } - onDisplayAvatarsChange = () => { - this.setState({ - displayAvatars: SettingsStore.getValue("feature_no_timeline_avatars"), - }); - } - /* get the DOM node representing the given event */ getNodeForEventId(eventId) { if (!this.eventNodes) { @@ -622,7 +610,6 @@ export default class MessagePanel extends React.Component { getRelationsForEvent={this.props.getRelationsForEvent} showReactions={this.props.showReactions} useIRCLayout={this.state.useIRCLayout} - displayAvatars={this.state.displayAvatars} /> , diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 6bfda5dd94..04e31d6490 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -39,8 +39,6 @@ export default class ReplyThread extends React.Component { permalinkCreator: PropTypes.instanceOf(RoomPermalinkCreator).isRequired, // Specifies which layout to use. useIRCLayout: PropTypes.bool, - // Specifies whether to display avatars. - displayAvatars: PropTypes.bool, }; static contextType = MatrixClientContext; @@ -180,7 +178,7 @@ export default class ReplyThread extends React.Component { }; } - static makeThread(parentEv, onHeightChanged, permalinkCreator, ref, useIRCLayout, displayAvatars) { + static makeThread(parentEv, onHeightChanged, permalinkCreator, ref, useIRCLayout) { if (!ReplyThread.getParentEventId(parentEv)) { return

      ; } @@ -190,7 +188,7 @@ export default class ReplyThread extends React.Component { ref={ref} permalinkCreator={permalinkCreator} useIRCLayout={useIRCLayout} - displayAvatars={displayAvatars} />; + />; } componentDidMount() { @@ -342,7 +340,6 @@ export default class ReplyThread extends React.Component { isRedacted={ev.isRedacted()} isTwelveHour={SettingsStore.getValue("showTwelveHourTimestamps")} useIRCLayout={this.props.useIRCLayout} - displayAvatars={this.props.displayAvatars} /> ; }); diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 4ff3a5ccfc..1cb632b2e8 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -209,9 +209,6 @@ export default createReactClass({ // whether to use the irc layout useIRCLayout: PropTypes.bool, - - // whether to display avatars - displayAvatars: PropTypes.bool, }, getDefaultProps: function() { @@ -714,7 +711,7 @@ export default createReactClass({ needsSenderProfile = true; } - if (this.props.mxEvent.sender && avatarSize && this.props.displayAvatars) { + if (this.props.mxEvent.sender && avatarSize) { avatar = (
      Date: Mon, 18 May 2020 17:06:54 +0100 Subject: [PATCH 312/319] Appease i18n --- src/i18n/strings/en_EN.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 37b9c1dfc8..12838968f7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -406,7 +406,6 @@ "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", "Support adding custom themes": "Support adding custom themes", "Use IRC layout": "Use IRC layout", - "Display user avatars on messages": "Display user avatars on messages", "Enable cross-signing to verify per-user instead of per-session": "Enable cross-signing to verify per-user instead of per-session", "Show info about bridges in room settings": "Show info about bridges in room settings", "Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing", From 7bb7f30b8f4ca9c8bd3d02e69ff2928317626fa9 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Mon, 18 May 2020 22:02:22 +0100 Subject: [PATCH 313/319] missed one --- src/components/structures/MessagePanel.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 404e950d7f..cac04d84f1 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -119,7 +119,6 @@ export default class MessagePanel extends React.Component { ghostReadMarkers: [], showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), useIRCLayout: SettingsStore.getValue("feature_irc_ui"), - displayAvatars: SettingsStore.getValue("feature_no_timeline_avatars"), }; // opaque readreceipt info for each userId; used by ReadReceiptMarker From 406839e89a43a559e6529c32998e40f8d5a77f21 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 19 May 2020 11:13:57 +0100 Subject: [PATCH 314/319] Upgrade matrix-js-sdk to 6.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 8338a91bf7..99e0399d8e 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "is-ip": "^2.0.0", "linkifyjs": "^2.1.6", "lodash": "^4.17.14", - "matrix-js-sdk": "6.1.0-rc.1", + "matrix-js-sdk": "6.1.0", "minimist": "^1.2.0", "pako": "^1.0.5", "parse5": "^5.1.1", diff --git a/yarn.lock b/yarn.lock index d05c444470..0edea5433e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5720,10 +5720,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -matrix-js-sdk@6.1.0-rc.1: - version "6.1.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-6.1.0-rc.1.tgz#521d5683d10e49bb437b2457d1f0c6696fc7a4e3" - integrity sha512-q3XScyroUwY3qTBglRgE1lldfrLlSML5nU4gJzXrEwn2gGpR1P4IU8aT8EcumyOmeZhrrysS2UEE9fWgUmhkBw== +matrix-js-sdk@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-6.1.0.tgz#c28ad67c113c4aa9c8bce409c7ba550170bdc2ee" + integrity sha512-N+vCgxWORvhh7AGyWZlU5Z2brojbbnHnWlMkBF6JjWe6a+pfpjmRKp5/jeQpOz6yfe56sIQvU7ikBZl3JjlMiw== dependencies: "@babel/runtime" "^7.8.3" another-json "^0.2.0" From bc8a53a7d797a513bf0fb2c000fd63cc7e90f4a8 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 19 May 2020 11:21:59 +0100 Subject: [PATCH 315/319] Prepare changelog for v2.6.0 --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c34bfba87b..7901062b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +Changes in [2.6.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.6.0) (2020-05-19) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.6.0-rc.1...v2.6.0) + + * Upgrade to JS SDK 6.1.0 + * Revert "ImageView make clicking off it easier" + [\#4602](https://github.com/matrix-org/matrix-react-sdk/pull/4602) + * Remove debugging that causes email addresses to load forever (to release) + [\#4598](https://github.com/matrix-org/matrix-react-sdk/pull/4598) + Changes in [2.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.6.0-rc.1) (2020-05-14) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.5.0...v2.6.0-rc.1) From 26e6447be5331614668b0d0e3ae516a0988ef9bc Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 19 May 2020 11:22:00 +0100 Subject: [PATCH 316/319] v2.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99e0399d8e..28f3d1633c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "2.6.0-rc.1", + "version": "2.6.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 833eccf5cd901d04ddfcc06a7f95e2e2ebe6f5d5 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 19 May 2020 11:25:07 +0100 Subject: [PATCH 317/319] Reset matrix-js-sdk back to develop branch --- package.json | 2 +- yarn.lock | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 3bdda8a583..7c008d5ccc 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "is-ip": "^2.0.0", "linkifyjs": "^2.1.6", "lodash": "^4.17.14", - "matrix-js-sdk": "6.1.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "minimist": "^1.2.0", "pako": "^1.0.5", "parse5": "^5.1.1", diff --git a/yarn.lock b/yarn.lock index b7e5017fd7..93118dab22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1285,6 +1285,13 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== +"@types/qrcode@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.3.4.tgz#984d97bb72caa558d470158701081ccb712f616b" + integrity sha512-aILE5yvKaqQXlY0YPMEYwK/KwdD43fwQTyagj0ffBBTQj8h//085Zp8LUrOnZ9FT69x64f5UgDo0EueY4BPAdg== + dependencies: + "@types/node" "*" + "@types/react@*": version "16.9.35" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" @@ -1293,13 +1300,6 @@ "@types/prop-types" "*" csstype "^2.2.0" -"@types/qrcode@^1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.3.4.tgz#984d97bb72caa558d470158701081ccb712f616b" - integrity sha512-aILE5yvKaqQXlY0YPMEYwK/KwdD43fwQTyagj0ffBBTQj8h//085Zp8LUrOnZ9FT69x64f5UgDo0EueY4BPAdg== - dependencies: - "@types/node" "*" - "@types/react@16.9": version "16.9.32" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" @@ -5753,10 +5753,9 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -matrix-js-sdk@6.1.0: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "6.1.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-6.1.0.tgz#c28ad67c113c4aa9c8bce409c7ba550170bdc2ee" - integrity sha512-N+vCgxWORvhh7AGyWZlU5Z2brojbbnHnWlMkBF6JjWe6a+pfpjmRKp5/jeQpOz6yfe56sIQvU7ikBZl3JjlMiw== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/e3c6a0e1a08a3812ba988e60eb5a2a013bb27404" dependencies: "@babel/runtime" "^7.8.3" another-json "^0.2.0" From 4bf2e5fd8eaafe22533e5e3a02752a9d2251d129 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 19 May 2020 15:40:26 +0100 Subject: [PATCH 318/319] Remove SSSS key upgrade check from rageshake This code doesn't exist anymore as the SSSS symmetric upgrade stuff has been removed. Fixes https://github.com/vector-im/riot-web/issues/13715 --- src/rageshake/submit-rageshake.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index e5027e0d37..9f9d7898cb 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -133,7 +133,6 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp body.append("cross_signing_supported_by_hs", String(await client.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"))); body.append("cross_signing_ready", String(await client.isCrossSigningReady())); - body.append("ssss_key_needs_upgrade", String(await client.secretStorageKeyNeedsUpgrade())); } } From 286828b3bb8a3556726c625be4b6034c1e83d87b Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Tue, 19 May 2020 16:15:13 +0100 Subject: [PATCH 319/319] Disable irc mode in notifiactions panel --- src/components/structures/MessagePanel.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index cac04d84f1..93e4668f66 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -110,15 +110,16 @@ export default class MessagePanel extends React.Component { showReactions: PropTypes.bool, }; - constructor() { - super(); + // Force props to be loaded for useIRCLayout + constructor(props) { + super(props); this.state = { // previous positions the read marker has been in, so we can // display 'ghost' read markers that are animating away ghostReadMarkers: [], showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), - useIRCLayout: SettingsStore.getValue("feature_irc_ui"), + useIRCLayout: this.useIRCLayout(SettingsStore.getValue("feature_irc_ui")), }; // opaque readreceipt info for each userId; used by ReadReceiptMarker @@ -203,10 +204,15 @@ export default class MessagePanel extends React.Component { onLayoutChange = () => { this.setState({ - useIRCLayout: SettingsStore.getValue("feature_irc_ui"), + useIRCLayout: this.useIRCLayout(SettingsStore.getValue("feature_irc_ui")), }); } + useIRCLayout(ircLayoutSelected) { + // if room is null we are not in a normal room list + return ircLayoutSelected && this.props.room; + } + /* get the DOM node representing the given event */ getNodeForEventId(eventId) { if (!this.eventNodes) {