Merge branch 'develop' into bwindels/redesign
commit
91ec96c8d3
|
@ -34,5 +34,5 @@ ln -s $REACT_SDK_DIR/$RIOT_WEB_DIR riot/riot-web
|
|||
# PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh
|
||||
# CHROME_PATH=$(which google-chrome-stable) ./run.sh
|
||||
./install.sh
|
||||
./run.sh
|
||||
./run.sh --travis
|
||||
popd
|
||||
|
|
163
CHANGELOG.md
163
CHANGELOG.md
|
@ -1,3 +1,166 @@
|
|||
Changes in [0.13.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.4) (2018-09-10)
|
||||
=====================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.4-rc.1...v0.13.4)
|
||||
|
||||
* No changes since rc.1
|
||||
|
||||
Changes in [0.13.4-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.4-rc.1) (2018-09-07)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.3...v0.13.4-rc.1)
|
||||
|
||||
* Error on splash screen if sync is failing
|
||||
[\#2155](https://github.com/matrix-org/matrix-react-sdk/pull/2155)
|
||||
* Do full registration if HS doesn't support ILAG
|
||||
[\#2150](https://github.com/matrix-org/matrix-react-sdk/pull/2150)
|
||||
* Re-apply "Don't rely on room members to query power levels"
|
||||
[\#2152](https://github.com/matrix-org/matrix-react-sdk/pull/2152)
|
||||
* s/DidMount/WillMount/ in MessageComposerInput
|
||||
[\#2151](https://github.com/matrix-org/matrix-react-sdk/pull/2151)
|
||||
* Revert "Don't rely on room members to query power levels"
|
||||
[\#2149](https://github.com/matrix-org/matrix-react-sdk/pull/2149)
|
||||
* Don't rely on room members to query power levels
|
||||
[\#2145](https://github.com/matrix-org/matrix-react-sdk/pull/2145)
|
||||
* Correctly mark email as optional
|
||||
[\#2148](https://github.com/matrix-org/matrix-react-sdk/pull/2148)
|
||||
* guests trying to join communities should fire the ILAG flow.
|
||||
[\#2059](https://github.com/matrix-org/matrix-react-sdk/pull/2059)
|
||||
* Fix DM avatars, part 3
|
||||
[\#2146](https://github.com/matrix-org/matrix-react-sdk/pull/2146)
|
||||
* Fix: show spinner again while recovering from connection error
|
||||
[\#2143](https://github.com/matrix-org/matrix-react-sdk/pull/2143)
|
||||
* Fix: infinite spinner on trying to create welcomeUserId room without consent
|
||||
[\#2147](https://github.com/matrix-org/matrix-react-sdk/pull/2147)
|
||||
* Show spinner in member list while loading members
|
||||
[\#2139](https://github.com/matrix-org/matrix-react-sdk/pull/2139)
|
||||
* Slash command to discard megolm session
|
||||
[\#2140](https://github.com/matrix-org/matrix-react-sdk/pull/2140)
|
||||
|
||||
Changes in [0.13.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.3) (2018-09-03)
|
||||
=====================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.3-rc.2...v0.13.3)
|
||||
|
||||
* No changes since rc.2
|
||||
|
||||
Changes in [0.13.3-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.3-rc.2) (2018-08-31)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.3-rc.1...v0.13.3-rc.2)
|
||||
|
||||
* Update js-sdk to fix exception
|
||||
|
||||
Changes in [0.13.3-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.3-rc.1) (2018-08-30)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.2...v0.13.3-rc.1)
|
||||
|
||||
* Fix DM avatar
|
||||
[\#2141](https://github.com/matrix-org/matrix-react-sdk/pull/2141)
|
||||
* Update from Weblate.
|
||||
[\#2142](https://github.com/matrix-org/matrix-react-sdk/pull/2142)
|
||||
* Support m.room.tombstone events
|
||||
[\#2124](https://github.com/matrix-org/matrix-react-sdk/pull/2124)
|
||||
* Support room creation events
|
||||
[\#2123](https://github.com/matrix-org/matrix-react-sdk/pull/2123)
|
||||
* Support for room upgrades
|
||||
[\#2122](https://github.com/matrix-org/matrix-react-sdk/pull/2122)
|
||||
* Fix: dont show 1:1 avatar for rooms +2 members but only <=2 members loaded
|
||||
[\#2137](https://github.com/matrix-org/matrix-react-sdk/pull/2137)
|
||||
* Render terms & conditions in settings
|
||||
[\#2136](https://github.com/matrix-org/matrix-react-sdk/pull/2136)
|
||||
* Don't crash if the value of a room tag is null
|
||||
[\#2133](https://github.com/matrix-org/matrix-react-sdk/pull/2133)
|
||||
* Add stub for getVisibleRooms()
|
||||
[\#2134](https://github.com/matrix-org/matrix-react-sdk/pull/2134)
|
||||
* Fix LL crash trying to render own avatar in composer when member isn't
|
||||
available yet
|
||||
[\#2132](https://github.com/matrix-org/matrix-react-sdk/pull/2132)
|
||||
* Support M_INCOMPATIBLE_ROOM_VERSION
|
||||
[\#2125](https://github.com/matrix-org/matrix-react-sdk/pull/2125)
|
||||
* Hide replaced rooms
|
||||
[\#2127](https://github.com/matrix-org/matrix-react-sdk/pull/2127)
|
||||
* Fix CPU spin on joining large room
|
||||
[\#2128](https://github.com/matrix-org/matrix-react-sdk/pull/2128)
|
||||
* Change format of server usage limit message
|
||||
[\#2131](https://github.com/matrix-org/matrix-react-sdk/pull/2131)
|
||||
* Re-apply "Fix showing peek preview while LL members are loading""
|
||||
[\#2130](https://github.com/matrix-org/matrix-react-sdk/pull/2130)
|
||||
* Revert "Fix showing peek preview while LL members are loading"
|
||||
[\#2129](https://github.com/matrix-org/matrix-react-sdk/pull/2129)
|
||||
* Fix showing peek preview while LL members are loading
|
||||
[\#2126](https://github.com/matrix-org/matrix-react-sdk/pull/2126)
|
||||
* Destroy non-persistent widgets when switching room
|
||||
[\#2098](https://github.com/matrix-org/matrix-react-sdk/pull/2098)
|
||||
* Lazy loading of room members
|
||||
[\#2118](https://github.com/matrix-org/matrix-react-sdk/pull/2118)
|
||||
* Lazy loading: feature toggle
|
||||
[\#2115](https://github.com/matrix-org/matrix-react-sdk/pull/2115)
|
||||
* Lazy loading: cleanup
|
||||
[\#2116](https://github.com/matrix-org/matrix-react-sdk/pull/2116)
|
||||
* Lazy loading: fix end-to-end encryption rooms
|
||||
[\#2113](https://github.com/matrix-org/matrix-react-sdk/pull/2113)
|
||||
* Lazy loading: Lazy load members while backpaginating
|
||||
[\#2104](https://github.com/matrix-org/matrix-react-sdk/pull/2104)
|
||||
* Lazy loading: don't assume we have our own member available
|
||||
[\#2102](https://github.com/matrix-org/matrix-react-sdk/pull/2102)
|
||||
* Lazy load room members - Part I
|
||||
[\#2072](https://github.com/matrix-org/matrix-react-sdk/pull/2072)
|
||||
|
||||
Changes in [0.13.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.2) (2018-08-23)
|
||||
=====================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.1...v0.13.2)
|
||||
|
||||
* Don't crash if the value of a room tag is null
|
||||
[\#2135](https://github.com/matrix-org/matrix-react-sdk/pull/2135)
|
||||
|
||||
Changes in [0.13.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.1) (2018-08-20)
|
||||
=====================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.1-rc.1...v0.13.1)
|
||||
|
||||
* No changes since rc.1
|
||||
|
||||
Changes in [0.13.1-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.1-rc.1) (2018-08-16)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.0...v0.13.1-rc.1)
|
||||
|
||||
* Update from Weblate.
|
||||
[\#2121](https://github.com/matrix-org/matrix-react-sdk/pull/2121)
|
||||
* Shift to M_RESOURCE_LIMIT_EXCEEDED errors
|
||||
[\#2120](https://github.com/matrix-org/matrix-react-sdk/pull/2120)
|
||||
* Fix RoomSettings test
|
||||
[\#2119](https://github.com/matrix-org/matrix-react-sdk/pull/2119)
|
||||
* Show room version number in room settings
|
||||
[\#2117](https://github.com/matrix-org/matrix-react-sdk/pull/2117)
|
||||
* Warning bar for MAU limit hit
|
||||
[\#2114](https://github.com/matrix-org/matrix-react-sdk/pull/2114)
|
||||
* Recognise server notices room(s)
|
||||
[\#2112](https://github.com/matrix-org/matrix-react-sdk/pull/2112)
|
||||
* Update room tags behaviour to match spec more
|
||||
[\#2111](https://github.com/matrix-org/matrix-react-sdk/pull/2111)
|
||||
* while logging out ignore `Session.logged_out` as it is intentional
|
||||
[\#2058](https://github.com/matrix-org/matrix-react-sdk/pull/2058)
|
||||
* Don't show 'connection lost' bar on MAU error
|
||||
[\#2110](https://github.com/matrix-org/matrix-react-sdk/pull/2110)
|
||||
* Support MAU error on sync
|
||||
[\#2108](https://github.com/matrix-org/matrix-react-sdk/pull/2108)
|
||||
* Support active user limit on message send
|
||||
[\#2106](https://github.com/matrix-org/matrix-react-sdk/pull/2106)
|
||||
* Run end to end tests as part of Travis build
|
||||
[\#2091](https://github.com/matrix-org/matrix-react-sdk/pull/2091)
|
||||
* Remove package-lock.json for now
|
||||
[\#2097](https://github.com/matrix-org/matrix-react-sdk/pull/2097)
|
||||
* Support montly active user limit error on /login
|
||||
[\#2103](https://github.com/matrix-org/matrix-react-sdk/pull/2103)
|
||||
* Unpin sanitize-html
|
||||
[\#2105](https://github.com/matrix-org/matrix-react-sdk/pull/2105)
|
||||
* Pin sanitize-html to 0.18.2
|
||||
[\#2101](https://github.com/matrix-org/matrix-react-sdk/pull/2101)
|
||||
* Make clicking on side panels close settings (mk 3)
|
||||
[\#2096](https://github.com/matrix-org/matrix-react-sdk/pull/2096)
|
||||
* Fix persistent element location not updating
|
||||
[\#2092](https://github.com/matrix-org/matrix-react-sdk/pull/2092)
|
||||
* fix Devtools input autofocus && state traversal when len === 1 && key=""
|
||||
[\#2090](https://github.com/matrix-org/matrix-react-sdk/pull/2090)
|
||||
* allow autocompleting Emoji by common aliases, e.g :+1: to :thumbsup:
|
||||
[\#2085](https://github.com/matrix-org/matrix-react-sdk/pull/2085)
|
||||
|
||||
Changes in [0.13.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.13.0) (2018-07-30)
|
||||
=====================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.13.0-rc.2...v0.13.0)
|
||||
|
|
23
README.md
23
README.md
|
@ -11,16 +11,8 @@ a 'skin'. A skin provides:
|
|||
* The containing application
|
||||
* Zero or more 'modules' containing non-UI functionality
|
||||
|
||||
**WARNING: As of July 2016, the skinning abstraction is broken due to rapid
|
||||
development of `matrix-react-sdk` to meet the needs of Riot (codenamed Vector), the first app
|
||||
to be built on top of the SDK** (https://github.com/vector-im/riot-web).
|
||||
Right now `matrix-react-sdk` depends on some functionality from `riot-web`
|
||||
(e.g. CSS), and `matrix-react-sdk` contains some Riot specific behaviour
|
||||
(grep for 'vector'). This layering will be fixed asap once Riot development
|
||||
has stabilised, but for now we do not advise trying to create new skins for
|
||||
matrix-react-sdk until the layers are clearly separated again.
|
||||
|
||||
In the interim, `vector-im/riot-web` and `matrix-org/matrix-react-sdk` should
|
||||
As of Aug 2018, the only skin that exists is `vector-im/riot-web`; it and
|
||||
`matrix-org/matrix-react-sdk` should effectively
|
||||
be considered as a single project (for instance, matrix-react-sdk bugs
|
||||
are currently filed against vector-im/riot-web rather than this project).
|
||||
|
||||
|
@ -48,15 +40,14 @@ https://github.com/matrix-org/synapse/tree/master/CONTRIBUTING.rst
|
|||
Please follow the Matrix JS/React code style as per:
|
||||
https://github.com/matrix-org/matrix-react-sdk/blob/master/code_style.md
|
||||
|
||||
Whilst the layering separation between matrix-react-sdk and Riot is broken
|
||||
(as of July 2016), code should be committed as follows:
|
||||
Code should be committed as follows:
|
||||
* All new components: https://github.com/matrix-org/matrix-react-sdk/tree/master/src/components
|
||||
* Riot-specific components: https://github.com/vector-im/riot-web/tree/master/src/components
|
||||
* In practice, `matrix-react-sdk` is still evolving so fast that the maintenance
|
||||
burden of customising and overriding these components for Riot can seriously
|
||||
impede development. So right now, there should be very few (if any) customisations for Riot.
|
||||
* CSS for Matrix SDK components: https://github.com/vector-im/riot-web/tree/master/src/skins/vector/css/matrix-react-sdk
|
||||
* CSS for Riot-specific overrides and components: https://github.com/vector-im/riot-web/tree/master/src/skins/vector/css/riot-web
|
||||
* CSS: https://github.com/vector-im/riot-web/tree/master/src/skins/vector/css/matrix-react-sdk
|
||||
* Theme specific CSS & resources: https://github.com/matrix-org/matrix-react-sdk/tree/master/res/themes
|
||||
|
||||
React components in matrix-react-sdk are come in two different flavours:
|
||||
'structures' and 'views'. Structures are stateful components which handle the
|
||||
|
@ -84,6 +75,7 @@ practices that anyone working with the SDK needs to be be aware of and uphold:
|
|||
|
||||
* Per-view CSS is optional - it could choose to inherit all its styling from
|
||||
the context of the rest of the app, although this is unusual for any but
|
||||
* Theme specific CSS & resources: https://github.com/matrix-org/matrix-react-sdk/tree/master/res/themes
|
||||
structural components (lacking presentation logic) and the simplest view
|
||||
components.
|
||||
|
||||
|
@ -139,8 +131,7 @@ for now.
|
|||
OUTDATED: To Create Your Own Skin
|
||||
=================================
|
||||
|
||||
**This is ALL LIES currently, as skinning is currently broken - see the WARNING
|
||||
section at the top of this readme.**
|
||||
**This is ALL LIES currently, and needs to be updated**
|
||||
|
||||
Skins are modules are exported from such a package in the `lib` directory.
|
||||
`lib/skins` contains one directory per-skin, named after the skin, and the
|
||||
|
|
12
package.json
12
package.json
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "matrix-react-sdk",
|
||||
"version": "0.13.0",
|
||||
"version": "0.13.4",
|
||||
"description": "SDK for matrix.org using React",
|
||||
"author": "matrix.org",
|
||||
"repository": {
|
||||
|
@ -73,7 +73,7 @@
|
|||
"linkifyjs": "^2.1.6",
|
||||
"lodash": "^4.13.1",
|
||||
"lolex": "2.3.2",
|
||||
"matrix-js-sdk": "0.10.7",
|
||||
"matrix-js-sdk": "0.11.0",
|
||||
"optimist": "^0.6.1",
|
||||
"pako": "^1.0.5",
|
||||
"prop-types": "^15.5.8",
|
||||
|
@ -85,15 +85,15 @@
|
|||
"react-dom": "^15.6.0",
|
||||
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
|
||||
"resize-observer-polyfill": "^1.5.0",
|
||||
"sanitize-html": "^1.18.4",
|
||||
"slate": "0.34.7",
|
||||
"slate-react": "^0.12.4",
|
||||
"slate-html-serializer": "^0.6.1",
|
||||
"slate-md-serializer": "matrix-org/slate-md-serializer#f7c4ad3",
|
||||
"sanitize-html": "^1.18.4",
|
||||
"slate-react": "^0.12.4",
|
||||
"text-encoding-utf-8": "^1.0.1",
|
||||
"url": "^0.11.0",
|
||||
"velocity-vector": "vector-im/velocity#059e3b2",
|
||||
"whatwg-fetch": "^1.0.0"
|
||||
"whatwg-fetch": "^1.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-cli": "^6.5.2",
|
||||
|
@ -133,7 +133,7 @@
|
|||
"matrix-mock-request": "^1.2.1",
|
||||
"matrix-react-test-utils": "^0.1.1",
|
||||
"mocha": "^5.0.5",
|
||||
"parallelshell": "^3.0.2",
|
||||
"parallelshell": "3.0.1",
|
||||
"react-addons-test-utils": "^15.4.0",
|
||||
"require-json": "0.0.1",
|
||||
"rimraf": "^2.4.3",
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
@import "./views/dialogs/_EncryptedEventDialog.scss";
|
||||
@import "./views/dialogs/_GroupAddressPicker.scss";
|
||||
@import "./views/dialogs/_QuestionDialog.scss";
|
||||
@import "./views/dialogs/_RoomUpgradeDialog.scss";
|
||||
@import "./views/dialogs/_SetEmailDialog.scss";
|
||||
@import "./views/dialogs/_SetMxIdDialog.scss";
|
||||
@import "./views/dialogs/_SetPasswordDialog.scss";
|
||||
|
@ -67,6 +68,7 @@
|
|||
@import "./views/groups/_GroupUserSettings.scss";
|
||||
@import "./views/login/_InteractiveAuthEntryComponents.scss";
|
||||
@import "./views/login/_ServerConfig.scss";
|
||||
@import "./views/messages/_CreateEvent.scss";
|
||||
@import "./views/messages/_DateSeparator.scss";
|
||||
@import "./views/messages/_MEmoteBody.scss";
|
||||
@import "./views/messages/_MFileBody.scss";
|
||||
|
@ -99,6 +101,7 @@
|
|||
@import "./views/rooms/_RoomSettings.scss";
|
||||
@import "./views/rooms/_RoomTile.scss";
|
||||
@import "./views/rooms/_RoomTooltip.scss";
|
||||
@import "./views/rooms/_RoomUpgradeWarningBar.scss";
|
||||
@import "./views/rooms/_SearchBar.scss";
|
||||
@import "./views/rooms/_SearchableEntityList.scss";
|
||||
@import "./views/rooms/_Stickers.scss";
|
||||
|
|
|
@ -56,6 +56,18 @@ limitations under the License.
|
|||
flex: 1;
|
||||
}
|
||||
|
||||
.mx_MatrixChat_syncError {
|
||||
color: $accent-fg-color;
|
||||
background-color: $warning-bg-color;
|
||||
border-radius: 5px;
|
||||
display: table;
|
||||
padding: 30px;
|
||||
position: absolute;
|
||||
top: 100px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.mx_MatrixChat .mx_LeftPanel {
|
||||
order: 1;
|
||||
background-color: $secondary-accent-color;
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
.mx_RoomUpgradeDialog {
|
||||
padding-right: 70px;
|
||||
}
|
|
@ -28,6 +28,12 @@ limitations under the License.
|
|||
margin-top: -2px;
|
||||
}
|
||||
|
||||
.mx_MatrixToolbar_info {
|
||||
padding-left: 16px;
|
||||
padding-right: 8px;
|
||||
background-color: $info-bg-color;
|
||||
}
|
||||
|
||||
.mx_MatrixToolbar_error {
|
||||
padding-left: 16px;
|
||||
padding-right: 8px;
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
.mx_CreateEvent {
|
||||
background-color: $info-plinth-bg-color;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.mx_CreateEvent_image {
|
||||
float: left;
|
||||
padding-right: 20px;
|
||||
width: 72px;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.mx_CreateEvent_header {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mx_CreateEvent_link {
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
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.
|
||||
|
@ -21,6 +22,29 @@ limitations under the License.
|
|||
position: relative;
|
||||
}
|
||||
|
||||
.mx_MessageComposer_replaced_wrapper {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.mx_MessageComposer_replaced_valign {
|
||||
height: 60px;
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.mx_MessageComposer_roomReplaced_icon {
|
||||
float: left;
|
||||
margin-right: 20px;
|
||||
margin-top: 5px;
|
||||
width: 31px;
|
||||
height: 31px;
|
||||
}
|
||||
|
||||
.mx_MessageComposer_roomReplaced_header {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mx_MessageComposer_autocomplete_wrapper {
|
||||
position: relative;
|
||||
height: 0;
|
||||
|
|
|
@ -20,6 +20,7 @@ limitations under the License.
|
|||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.mx_RoomSettings_upgradeButton,
|
||||
.mx_RoomSettings_leaveButton,
|
||||
.mx_RoomSettings_unbanButton {
|
||||
@mixin mx_DialogButton;
|
||||
|
@ -27,11 +28,16 @@ limitations under the License.
|
|||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.mx_RoomSettings_upgradeButton,
|
||||
.mx_RoomSettings_leaveButton:hover,
|
||||
.mx_RoomSettings_unbanButton:hover {
|
||||
@mixin mx_DialogButton_hover;
|
||||
}
|
||||
|
||||
.mx_RoomSettings_upgradeButton.danger {
|
||||
@mixin mx_DialogButton_danger;
|
||||
}
|
||||
|
||||
.mx_RoomSettings_integrationsButton_error {
|
||||
position: relative;
|
||||
cursor: not-allowed;
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
.mx_RoomUpgradeWarningBar {
|
||||
text-align: center;
|
||||
height: 176px;
|
||||
background-color: $event-selected-color;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
background-color: $preview-bar-bg-color;
|
||||
-webkit-align-items: center;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.mx_RoomUpgradeWarningBar_header {
|
||||
color: $warning-color;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mx_RoomUpgradeWarningBar_body {
|
||||
color: $warning-color;
|
||||
}
|
||||
|
||||
.mx_RoomUpgradeWarningBar_upgradelink {
|
||||
color: $warning-color;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.mx_RoomUpgradeWarningBar_small {
|
||||
color: $greyed-fg-color;
|
||||
font-size: 70%;
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="72" height="34" viewBox="0 0 72 34" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1 7.26087V1H28.7889V7.26087M1 7.26087V33H28.7889V7.26087M1 7.26087H28.7889M4.16583 4.13043H16.8291" stroke="#454545" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path d="M43.2109 7.26087V1H70.9999V7.26087M43.2109 7.26087V33H70.9999V7.26087M43.2109 7.26087H70.9999M46.3768 4.13043H59.0401" stroke="#454545" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path d="M27.03 28.8262C34.2226 28.8262 36.0207 26.343 36.0207 25.1014V16.0996C36.0207 12.1264 43.6283 11.3401 47.432 11.4436" stroke="black" stroke-width="2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 623 B |
|
@ -0,0 +1,13 @@
|
|||
<svg width="31" height="31" viewBox="0 0 31 31" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="31" height="31" fill="black" fill-opacity="0"/>
|
||||
<circle cx="15.5" cy="15.5" r="15.5" fill="#A2A2A2"/>
|
||||
<path d="M22.8553 15.5C22.8553 19.5622 19.5622 22.8553 15.5 22.8553C11.4378 22.8553 8.14474 19.5622 8.14474 15.5C8.14474 11.4378 11.4378 8.14474 15.5 8.14474C19.5622 8.14474 22.8553 11.4378 22.8553 15.5ZM15.5 24.25C20.3325 24.25 24.25 20.3325 24.25 15.5C24.25 10.6675 20.3325 6.75 15.5 6.75C10.6675 6.75 6.75 10.6675 6.75 15.5C6.75 20.3325 10.6675 24.25 15.5 24.25Z" fill="white" stroke="white" stroke-width="0.5"/>
|
||||
<rect x="16.2666" y="30.5032" width="1.5" height="29.4046" transform="rotate(179.987 16.2666 30.5032)" fill="#A2A2A2"/>
|
||||
<rect x="8.89404" y="28.8434" width="1.5" height="29.6593" transform="rotate(-149.607 8.89404 28.8434)" fill="#A2A2A2"/>
|
||||
<rect x="2.87988" y="24.495" width="1.5" height="30.0747" transform="rotate(-121.597 2.87988 24.495)" fill="#A2A2A2"/>
|
||||
<rect x="2.16284" y="23.3413" width="1.5" height="29.6434" transform="rotate(-116.581 2.16284 23.3413)" fill="#A2A2A2"/>
|
||||
<rect x="1.55176" y="22.1343" width="1.5" height="29.5016" transform="rotate(-111.584 1.55176 22.1343)" fill="#A2A2A2"/>
|
||||
<path d="M9.5 17L7.5 20L5.5 17L9.5 17Z" fill="white" stroke="white"/>
|
||||
<path d="M21.5 15L23.5 12L25.5 15H21.5Z" fill="white" stroke="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -20,6 +20,7 @@ $focus-brightness: 200%;
|
|||
// red warning colour
|
||||
$warning-color: #ff0064;
|
||||
$warning-bg-color: #DF2A8B;
|
||||
$info-bg-color: #2A9EDF;
|
||||
|
||||
// groups
|
||||
$info-plinth-bg-color: #454545;
|
||||
|
|
|
@ -29,6 +29,7 @@ $focus-brightness: 125%;
|
|||
$warning-color: #ff0064;
|
||||
// background colour for warnings
|
||||
$warning-bg-color: #DF2A8B;
|
||||
$info-bg-color: #2A9EDF;
|
||||
$mention-user-pill-bg-color: #ff0064;
|
||||
$other-user-pill-bg-color: rgba(0, 0, 0, 0.1);
|
||||
|
||||
|
@ -180,6 +181,10 @@ $progressbar-color: #000;
|
|||
outline: none;
|
||||
}
|
||||
|
||||
@define-mixin mx_DialogButton_danger {
|
||||
background-color: $warning-color;
|
||||
}
|
||||
|
||||
@define-mixin mx_DialogButton_hover {
|
||||
}
|
||||
|
||||
|
|
|
@ -143,7 +143,7 @@ function getTranslationsJs(file) {
|
|||
// Validate tag replacements
|
||||
if (node.arguments.length > 2) {
|
||||
const tagMap = node.arguments[2];
|
||||
for (const prop of tagMap.properties) {
|
||||
for (const prop of tagMap.properties || []) {
|
||||
if (prop.key.type === 'Literal') {
|
||||
const tag = prop.key.value;
|
||||
// RegExp same as in src/languageHandler.js
|
||||
|
|
|
@ -386,6 +386,8 @@ function _persistCredentialsToLocalStorage(credentials) {
|
|||
console.log(`Session persisted for ${credentials.userId}`);
|
||||
}
|
||||
|
||||
let _isLoggingOut = false;
|
||||
|
||||
/**
|
||||
* Logs the current session out and transitions to the logged-out state
|
||||
*/
|
||||
|
@ -405,6 +407,7 @@ export function logout() {
|
|||
return;
|
||||
}
|
||||
|
||||
_isLoggingOut = true;
|
||||
MatrixClientPeg.get().logout().then(onLoggedOut,
|
||||
(err) => {
|
||||
// Just throwing an error here is going to be very unhelpful
|
||||
|
@ -420,6 +423,10 @@ export function logout() {
|
|||
).done();
|
||||
}
|
||||
|
||||
export function isLoggingOut() {
|
||||
return _isLoggingOut;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the matrix client and all other react-sdk services that
|
||||
* listen for events while a session is logged in.
|
||||
|
@ -451,6 +458,7 @@ async function startMatrixClient() {
|
|||
* storage. Used after a session has been logged out.
|
||||
*/
|
||||
export function onLoggedOut() {
|
||||
_isLoggingOut = false;
|
||||
stopMatrixClient();
|
||||
_clearStorage().done();
|
||||
dis.dispatch({action: 'on_logged_out'});
|
||||
|
|
|
@ -99,6 +99,10 @@ class MatrixClientPeg {
|
|||
// the react sdk doesn't work without this, so don't allow
|
||||
opts.pendingEventOrdering = "detached";
|
||||
|
||||
if (SettingsStore.isFeatureEnabled('feature_lazyloading')) {
|
||||
opts.lazyLoadMembers = true;
|
||||
}
|
||||
|
||||
try {
|
||||
const promise = this.matrixClient.store.startup();
|
||||
console.log(`MatrixClientPeg: waiting for MatrixClient store to initialise`);
|
||||
|
@ -115,7 +119,7 @@ class MatrixClientPeg {
|
|||
MatrixActionCreators.start(this.matrixClient);
|
||||
|
||||
console.log(`MatrixClientPeg: really starting MatrixClient`);
|
||||
this.get().startClient(opts);
|
||||
await this.get().startClient(opts);
|
||||
console.log(`MatrixClientPeg: MatrixClient started`);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Utility code for registering with a homeserver
|
||||
* Note that this is currently *not* used by the actual
|
||||
* registration code.
|
||||
*/
|
||||
|
||||
import dis from './dispatcher';
|
||||
import sdk from './index';
|
||||
import MatrixClientPeg from './MatrixClientPeg';
|
||||
import Modal from './Modal';
|
||||
import { _t } from './languageHandler';
|
||||
|
||||
/**
|
||||
* Starts either the ILAG or full registration flow, depending
|
||||
* on what the HS supports
|
||||
*
|
||||
* @param {object} options
|
||||
* @param {bool} options.go_home_on_cancel If true, goes to
|
||||
* the hame page if the user cancels the action
|
||||
*/
|
||||
export async function startAnyRegistrationFlow(options) {
|
||||
if (options === undefined) options = {};
|
||||
const flows = await _getRegistrationFlows();
|
||||
// look for an ILAG compatible flow. We define this as one
|
||||
// which has only dummy or recaptcha flows. In practice it
|
||||
// would support any stage InteractiveAuth supports, just not
|
||||
// ones like email & msisdn which require the user to supply
|
||||
// the relevant details in advance. We err on the side of
|
||||
// caution though.
|
||||
const hasIlagFlow = flows.some((flow) => {
|
||||
return flow.stages.every((stage) => {
|
||||
return ['m.login.dummy', 'm.login.recaptcha'].includes(stage);
|
||||
});
|
||||
});
|
||||
|
||||
if (hasIlagFlow) {
|
||||
dis.dispatch({
|
||||
action: 'view_set_mxid',
|
||||
go_home_on_cancel: options.go_home_on_cancel,
|
||||
});
|
||||
} else {
|
||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||
Modal.createTrackedDialog('Registration required', '', QuestionDialog, {
|
||||
title: _t("Registration Required"),
|
||||
description: _t("You need to register to do this. Would you like to register now?"),
|
||||
button: _t("Register"),
|
||||
onFinished: (proceed) => {
|
||||
if (proceed) {
|
||||
dis.dispatch({action: 'start_registration'});
|
||||
} else if (options.go_home_on_cancel) {
|
||||
dis.dispatch({action: 'view_home_page'});
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function _getRegistrationFlows() {
|
||||
try {
|
||||
await MatrixClientPeg.get().register(
|
||||
null,
|
||||
null,
|
||||
undefined,
|
||||
{},
|
||||
{},
|
||||
);
|
||||
console.log("Register request succeeded when it should have returned 401!");
|
||||
} catch (e) {
|
||||
if (e.httpStatus === 401) {
|
||||
return e.data.flows;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
throw new Error("Register request succeeded when it should have returned 401!");
|
||||
}
|
||||
|
|
@ -194,8 +194,7 @@ function _getDirectMessageRooms(addr) {
|
|||
const rooms = dmRooms.filter((dmRoom) => {
|
||||
const room = MatrixClientPeg.get().getRoom(dmRoom);
|
||||
if (room) {
|
||||
const me = room.getMember(MatrixClientPeg.get().credentials.userId);
|
||||
return me && me.membership == 'join';
|
||||
return room.getMyMembership() === 'join';
|
||||
}
|
||||
});
|
||||
return rooms;
|
||||
|
|
54
src/Rooms.js
54
src/Rooms.js
|
@ -31,27 +31,27 @@ export function getDisplayAliasForRoom(room) {
|
|||
* If the room contains only two members including the logged-in user,
|
||||
* return the other one. Otherwise, return null.
|
||||
*/
|
||||
export function getOnlyOtherMember(room, me) {
|
||||
const joinedMembers = room.getJoinedMembers();
|
||||
export function getOnlyOtherMember(room, myUserId) {
|
||||
|
||||
if (joinedMembers.length === 2) {
|
||||
return joinedMembers.filter(function(m) {
|
||||
return m.userId !== me.userId;
|
||||
if (room.currentState.getJoinedMemberCount() === 2) {
|
||||
return room.getJoinedMembers().filter(function(m) {
|
||||
return m.userId !== myUserId;
|
||||
})[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function _isConfCallRoom(room, me, conferenceHandler) {
|
||||
function _isConfCallRoom(room, myUserId, conferenceHandler) {
|
||||
if (!conferenceHandler) return false;
|
||||
|
||||
if (me.membership != "join") {
|
||||
const myMembership = room.getMyMembership();
|
||||
if (myMembership != "join") {
|
||||
return false;
|
||||
}
|
||||
|
||||
const otherMember = getOnlyOtherMember(room, me);
|
||||
if (otherMember === null) {
|
||||
const otherMember = getOnlyOtherMember(room, myUserId);
|
||||
if (!otherMember) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -68,29 +68,31 @@ const isConfCallRoomCache = {
|
|||
// $roomId: bool
|
||||
};
|
||||
|
||||
export function isConfCallRoom(room, me, conferenceHandler) {
|
||||
export function isConfCallRoom(room, myUserId, conferenceHandler) {
|
||||
if (isConfCallRoomCache[room.roomId] !== undefined) {
|
||||
return isConfCallRoomCache[room.roomId];
|
||||
}
|
||||
|
||||
const result = _isConfCallRoom(room, me, conferenceHandler);
|
||||
const result = _isConfCallRoom(room, myUserId, conferenceHandler);
|
||||
|
||||
isConfCallRoomCache[room.roomId] = result;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function looksLikeDirectMessageRoom(room, me) {
|
||||
if (me.membership == "join" || me.membership === "ban" ||
|
||||
(me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) {
|
||||
export function looksLikeDirectMessageRoom(room, myUserId) {
|
||||
const myMembership = room.getMyMembership();
|
||||
const me = room.getMember(myUserId);
|
||||
|
||||
if (myMembership == "join" || myMembership === "ban" || (me && me.isKicked())) {
|
||||
// Used to split rooms via tags
|
||||
const tagNames = Object.keys(room.tags);
|
||||
// Used for 1:1 direct chats
|
||||
const members = room.currentState.getMembers();
|
||||
|
||||
// Show 1:1 chats in seperate "Direct Messages" section as long as they haven't
|
||||
// been moved to a different tag section
|
||||
if (members.length === 2 && !tagNames.length) {
|
||||
const totalMemberCount = room.currentState.getJoinedMemberCount() +
|
||||
room.currentState.getInvitedMemberCount();
|
||||
if (totalMemberCount === 2 && !tagNames.length) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -100,10 +102,10 @@ export function looksLikeDirectMessageRoom(room, me) {
|
|||
export function guessAndSetDMRoom(room, isDirect) {
|
||||
let newTarget;
|
||||
if (isDirect) {
|
||||
const guessedTarget = guessDMRoomTarget(
|
||||
room, room.getMember(MatrixClientPeg.get().credentials.userId),
|
||||
const guessedUserId = guessDMRoomTargetId(
|
||||
room, MatrixClientPeg.get().getUserId()
|
||||
);
|
||||
newTarget = guessedTarget.userId;
|
||||
newTarget = guessedUserId;
|
||||
} else {
|
||||
newTarget = null;
|
||||
}
|
||||
|
@ -159,15 +161,15 @@ export function setDMRoom(roomId, userId) {
|
|||
* Given a room, estimate which of its members is likely to
|
||||
* be the target if the room were a DM room and return that user.
|
||||
*/
|
||||
export function guessDMRoomTarget(room, me) {
|
||||
function guessDMRoomTargetId(room, myUserId) {
|
||||
let oldestTs;
|
||||
let oldestUser;
|
||||
|
||||
// Pick the joined user who's been here longest (and isn't us),
|
||||
for (const user of room.getJoinedMembers()) {
|
||||
if (user.userId == me.userId) continue;
|
||||
if (user.userId == myUserId) continue;
|
||||
|
||||
if (oldestTs === undefined || user.events.member.getTs() < oldestTs) {
|
||||
if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) {
|
||||
oldestUser = user;
|
||||
oldestTs = user.events.member.getTs();
|
||||
}
|
||||
|
@ -176,14 +178,14 @@ export function guessDMRoomTarget(room, me) {
|
|||
|
||||
// if there are no joined members other than us, use the oldest member
|
||||
for (const user of room.currentState.getMembers()) {
|
||||
if (user.userId == me.userId) continue;
|
||||
if (user.userId == myUserId) continue;
|
||||
|
||||
if (oldestTs === undefined || user.events.member.getTs() < oldestTs) {
|
||||
if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) {
|
||||
oldestUser = user;
|
||||
oldestTs = user.events.member.getTs();
|
||||
}
|
||||
}
|
||||
|
||||
if (oldestUser === undefined) return me;
|
||||
if (oldestUser === undefined) return myUserId;
|
||||
return oldestUser;
|
||||
}
|
||||
|
|
|
@ -480,7 +480,7 @@ function getMembershipCount(event, roomId) {
|
|||
sendError(event, _t('This room is not recognised.'));
|
||||
return;
|
||||
}
|
||||
const count = room.getJoinedMembers().length;
|
||||
const count = room.getJoinedMemberCount();
|
||||
sendResponse(event, count);
|
||||
}
|
||||
|
||||
|
@ -497,12 +497,11 @@ function canSendEvent(event, roomId) {
|
|||
sendError(event, _t('This room is not recognised.'));
|
||||
return;
|
||||
}
|
||||
const me = client.credentials.userId;
|
||||
const member = room.getMember(me);
|
||||
if (!member || member.membership !== "join") {
|
||||
if (room.getMyMembership() !== "join") {
|
||||
sendError(event, _t('You are not in this room.'));
|
||||
return;
|
||||
}
|
||||
const me = client.credentials.userId;
|
||||
|
||||
let canSend = false;
|
||||
if (isState) {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
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.
|
||||
|
@ -470,6 +471,19 @@ export const CommandMap = {
|
|||
description: _td('Displays action'),
|
||||
hideCompletionAfterSpace: true,
|
||||
}),
|
||||
|
||||
discardsession: new Command({
|
||||
name: 'discardsession',
|
||||
description: _td('Forces the current outbound group session in an encrypted room to be discarded'),
|
||||
runFn: function(roomId) {
|
||||
try {
|
||||
MatrixClientPeg.get().forceDiscardSession(roomId);
|
||||
} catch (e) {
|
||||
return reject(e.message);
|
||||
}
|
||||
return success();
|
||||
},
|
||||
}),
|
||||
};
|
||||
/* eslint-enable babel/no-invalid-this */
|
||||
|
||||
|
@ -477,6 +491,7 @@ export const CommandMap = {
|
|||
// helpful aliases
|
||||
const aliases = {
|
||||
j: "join",
|
||||
newballsplease: "discardsession",
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -198,6 +198,66 @@ function textForMessageEvent(ev) {
|
|||
return message;
|
||||
}
|
||||
|
||||
function textForRoomAliasesEvent(ev) {
|
||||
// An alternative implementation of this as a first-class event can be found at
|
||||
// https://github.com/matrix-org/matrix-react-sdk/blob/dc7212ec2bd12e1917233ed7153b3e0ef529a135/src/components/views/messages/RoomAliasesEvent.js
|
||||
// This feels a bit overkill though, and it's not clear the i18n really needs it
|
||||
// so instead it's landing as a simple textual event.
|
||||
|
||||
const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
|
||||
const oldAliases = ev.getPrevContent().aliases || [];
|
||||
const newAliases = ev.getContent().aliases || [];
|
||||
|
||||
const addedAliases = newAliases.filter((x) => !oldAliases.includes(x));
|
||||
const removedAliases = oldAliases.filter((x) => !newAliases.includes(x));
|
||||
|
||||
if (!addedAliases.length && !removedAliases.length) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (addedAliases.length && !removedAliases.length) {
|
||||
return _t('%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.', {
|
||||
senderName: senderName,
|
||||
count: addedAliases.length,
|
||||
addedAddresses: addedAliases.join(', '),
|
||||
});
|
||||
} else if (!addedAliases.length && removedAliases.length) {
|
||||
return _t('%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.', {
|
||||
senderName: senderName,
|
||||
count: removedAliases.length,
|
||||
removedAddresses: removedAliases.join(', '),
|
||||
});
|
||||
} else {
|
||||
const args = {
|
||||
senderName: senderName,
|
||||
addedAddresses: addedAliases.join(', '),
|
||||
removedAddresses: removedAliases.join(', '),
|
||||
};
|
||||
return _t(
|
||||
'%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.',
|
||||
args,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function textForCanonicalAliasEvent(ev) {
|
||||
const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
|
||||
const oldAlias = ev.getPrevContent().alias;
|
||||
const newAlias = ev.getContent().alias;
|
||||
|
||||
if (newAlias) {
|
||||
return _t('%(senderName)s set the main address for this room to %(address)s.', {
|
||||
senderName: senderName,
|
||||
address: ev.getContent().alias,
|
||||
});
|
||||
}
|
||||
else if (oldAlias) {
|
||||
return _t('%(senderName)s removed the main address for this room.', {
|
||||
senderName: senderName,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function textForCallAnswerEvent(event) {
|
||||
const senderName = event.sender ? event.sender.name : _t('Someone');
|
||||
const supported = MatrixClientPeg.get().supportsVoip() ? '' : _t('(not supported by this browser)');
|
||||
|
@ -359,6 +419,8 @@ const handlers = {
|
|||
};
|
||||
|
||||
const stateHandlers = {
|
||||
'm.room.aliases': textForRoomAliasesEvent,
|
||||
'm.room.canonical_alias': textForCanonicalAliasEvent,
|
||||
'm.room.name': textForRoomNameEvent,
|
||||
'm.room.topic': textForTopicEvent,
|
||||
'm.room.member': textForMemberEvent,
|
||||
|
|
|
@ -72,7 +72,7 @@ ConferenceCall.prototype._getConferenceUserRoom = function() {
|
|||
for (var i = 0; i < rooms.length; i++) {
|
||||
var confUser = rooms[i].getMember(this.confUserId);
|
||||
if (confUser && confUser.membership === "join" &&
|
||||
rooms[i].getJoinedMembers().length === 2) {
|
||||
rooms[i].getJoinedMemberCount() === 2) {
|
||||
confRoom = rooms[i];
|
||||
break;
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ ConferenceCall.prototype._getConferenceUserRoom = function() {
|
|||
preset: "private_chat",
|
||||
invite: [this.confUserId]
|
||||
}).then(function(res) {
|
||||
return new Room(res.room_id);
|
||||
return new Room(res.room_id, null, client.getUserId());
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -144,23 +144,25 @@ function createRoomTimelineAction(matrixClient, timelineEvent, room, toStartOfTi
|
|||
/**
|
||||
* @typedef RoomMembershipAction
|
||||
* @type {Object}
|
||||
* @property {string} action 'MatrixActions.RoomMember.membership'.
|
||||
* @property {RoomMember} member the member whose membership was updated.
|
||||
* @property {string} action 'MatrixActions.Room.myMembership'.
|
||||
* @property {Room} room to room for which the self-membership changed.
|
||||
* @property {string} membership the new membership
|
||||
* @property {string} oldMembership the previous membership, can be null.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a MatrixActions.RoomMember.membership action that represents
|
||||
* a MatrixClient `RoomMember.membership` matrix event, emitted when a
|
||||
* member's membership is updated.
|
||||
* Create a MatrixActions.Room.myMembership action that represents
|
||||
* a MatrixClient `Room.myMembership` event for the syncing user,
|
||||
* emitted when the syncing user's membership is updated for a room.
|
||||
*
|
||||
* @param {MatrixClient} matrixClient the matrix client.
|
||||
* @param {MatrixEvent} membershipEvent the m.room.member event.
|
||||
* @param {RoomMember} member the member whose membership was updated.
|
||||
* @param {string} oldMembership the member's previous membership.
|
||||
* @returns {RoomMembershipAction} an action of type `MatrixActions.RoomMember.membership`.
|
||||
* @param {Room} room to room for which the self-membership changed.
|
||||
* @param {string} membership the new membership
|
||||
* @param {string} oldMembership the previous membership, can be null.
|
||||
* @returns {RoomMembershipAction} an action of type `MatrixActions.Room.myMembership`.
|
||||
*/
|
||||
function createRoomMembershipAction(matrixClient, membershipEvent, member, oldMembership) {
|
||||
return { action: 'MatrixActions.RoomMember.membership', member };
|
||||
function createSelfMembershipAction(matrixClient, room, membership, oldMembership) {
|
||||
return { action: 'MatrixActions.Room.myMembership', room, membership, oldMembership};
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -202,7 +204,7 @@ export default {
|
|||
this._addMatrixClientListener(matrixClient, 'Room', createRoomAction);
|
||||
this._addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction);
|
||||
this._addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction);
|
||||
this._addMatrixClientListener(matrixClient, 'RoomMember.membership', createRoomMembershipAction);
|
||||
this._addMatrixClientListener(matrixClient, 'Room.myMembership', createSelfMembershipAction);
|
||||
this._addMatrixClientListener(matrixClient, 'Event.decrypted', createEventDecryptedAction);
|
||||
},
|
||||
|
||||
|
@ -217,7 +219,10 @@ export default {
|
|||
*/
|
||||
_addMatrixClientListener(matrixClient, eventName, actionCreator) {
|
||||
const listener = (...args) => {
|
||||
dis.dispatch(actionCreator(matrixClient, ...args), true);
|
||||
const payload = actionCreator(matrixClient, ...args);
|
||||
if (payload) {
|
||||
dis.dispatch(payload, true);
|
||||
}
|
||||
};
|
||||
matrixClient.on(eventName, listener);
|
||||
this._matrixClientListenersStop.push(() => {
|
||||
|
|
|
@ -480,7 +480,7 @@ export default React.createClass({
|
|||
group_id: groupId,
|
||||
},
|
||||
});
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
willDoOnboarding = true;
|
||||
}
|
||||
this.setState({
|
||||
|
@ -723,6 +723,11 @@ export default React.createClass({
|
|||
},
|
||||
|
||||
_onJoinClick: async function() {
|
||||
if (this._matrixClient.isGuest()) {
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
|
||||
this.setState({membershipBusy: true});
|
||||
|
||||
// Wait 500ms to prevent flashing. Do this before sending a request otherwise we risk the
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
Copyright 2017 Vector Creations Ltd
|
||||
Copyright 2017 New Vector Ltd
|
||||
Copyright 2017, 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.
|
||||
|
@ -30,10 +30,16 @@ import dis from '../../dispatcher';
|
|||
import sessionStore from '../../stores/SessionStore';
|
||||
import MatrixClientPeg from '../../MatrixClientPeg';
|
||||
import SettingsStore from "../../settings/SettingsStore";
|
||||
import RoomListStore from "../../stores/RoomListStore";
|
||||
|
||||
import TagOrderActions from '../../actions/TagOrderActions';
|
||||
import RoomListActions from '../../actions/RoomListActions';
|
||||
|
||||
// We need to fetch each pinned message individually (if we don't already have it)
|
||||
// so each pinned message may trigger a request. Limit the number per room for sanity.
|
||||
// NB. this is just for server notices rather than pinned messages in general.
|
||||
const MAX_PINNED_NOTICES_PER_ROOM = 2;
|
||||
|
||||
/**
|
||||
* This is what our MatrixChat shows when we are logged in. The precise view is
|
||||
* determined by the page_type property.
|
||||
|
@ -80,6 +86,8 @@ const LoggedInView = React.createClass({
|
|||
return {
|
||||
// use compact timeline view
|
||||
useCompactLayout: SettingsStore.getValue('useCompactLayout'),
|
||||
// any currently active server notice events
|
||||
serverNoticeEvents: [],
|
||||
};
|
||||
},
|
||||
|
||||
|
@ -97,13 +105,18 @@ const LoggedInView = React.createClass({
|
|||
);
|
||||
this._setStateFromSessionStore();
|
||||
|
||||
this._updateServerNoticeEvents();
|
||||
|
||||
this._matrixClient.on("accountData", this.onAccountData);
|
||||
this._matrixClient.on("sync", this.onSync);
|
||||
this._matrixClient.on("RoomState.events", this.onRoomStateEvents);
|
||||
},
|
||||
|
||||
componentWillUnmount: function() {
|
||||
document.removeEventListener('keydown', this._onKeyDown);
|
||||
this._matrixClient.removeListener("accountData", this.onAccountData);
|
||||
this._matrixClient.removeListener("sync", this.onSync);
|
||||
this._matrixClient.removeListener("RoomState.events", this.onRoomStateEvents);
|
||||
if (this._sessionStoreToken) {
|
||||
this._sessionStoreToken.remove();
|
||||
}
|
||||
|
@ -144,7 +157,9 @@ const LoggedInView = React.createClass({
|
|||
},
|
||||
|
||||
onSync: function(syncState, oldSyncState, data) {
|
||||
if (syncState === oldSyncState) return;
|
||||
const oldErrCode = this.state.syncErrorData && this.state.syncErrorData.error && this.state.syncErrorData.error.errcode;
|
||||
const newErrCode = data && data.error && data.error.errcode;
|
||||
if (syncState === oldSyncState && oldErrCode === newErrCode) return;
|
||||
|
||||
if (syncState === 'ERROR') {
|
||||
this.setState({
|
||||
|
@ -155,8 +170,42 @@ const LoggedInView = React.createClass({
|
|||
syncErrorData: null,
|
||||
});
|
||||
}
|
||||
|
||||
if (oldSyncState === 'PREPARED' && syncState === 'SYNCING') {
|
||||
this._updateServerNoticeEvents();
|
||||
}
|
||||
},
|
||||
|
||||
onRoomStateEvents: function(ev, state) {
|
||||
const roomLists = RoomListStore.getRoomLists();
|
||||
if (roomLists['m.server_notice'] && roomLists['m.server_notice'].some(r => r.roomId === ev.getRoomId())) {
|
||||
this._updateServerNoticeEvents();
|
||||
}
|
||||
},
|
||||
|
||||
_updateServerNoticeEvents: async function() {
|
||||
const roomLists = RoomListStore.getRoomLists();
|
||||
if (!roomLists['m.server_notice']) return [];
|
||||
|
||||
const pinnedEvents = [];
|
||||
for (const room of roomLists['m.server_notice']) {
|
||||
const pinStateEvent = room.currentState.getStateEvents("m.room.pinned_events", "");
|
||||
|
||||
if (!pinStateEvent || !pinStateEvent.getContent().pinned) continue;
|
||||
|
||||
const pinnedEventIds = pinStateEvent.getContent().pinned.slice(0, MAX_PINNED_NOTICES_PER_ROOM);
|
||||
for (const eventId of pinnedEventIds) {
|
||||
const timeline = await this._matrixClient.getEventTimeline(room.getUnfilteredTimelineSet(), eventId, 0);
|
||||
const ev = timeline.getEvents().find(ev => ev.getId() === eventId);
|
||||
if (ev) pinnedEvents.push(ev);
|
||||
}
|
||||
}
|
||||
this.setState({
|
||||
serverNoticeEvents: pinnedEvents,
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
_onKeyDown: function(ev) {
|
||||
/*
|
||||
// Remove this for now as ctrl+alt = alt-gr so this breaks keyboards which rely on alt-gr for numbers
|
||||
|
@ -384,10 +433,25 @@ const LoggedInView = React.createClass({
|
|||
break;
|
||||
}
|
||||
|
||||
const usageLimitEvent = this.state.serverNoticeEvents.find((e) => {
|
||||
return (
|
||||
e && e.getType() === 'm.room.message' &&
|
||||
e.getContent()['server_notice_type'] === 'm.server_notice.usage_limit_reached'
|
||||
);
|
||||
});
|
||||
|
||||
let topBar;
|
||||
const isGuest = this.props.matrixClient.isGuest();
|
||||
if (this.state.syncErrorData && this.state.syncErrorData.error.errcode === 'M_MAU_LIMIT_EXCEEDED') {
|
||||
topBar = <ServerLimitBar />;
|
||||
if (this.state.syncErrorData && this.state.syncErrorData.error.errcode === 'M_RESOURCE_LIMIT_EXCEEDED') {
|
||||
topBar = <ServerLimitBar kind='hard'
|
||||
adminContact={this.state.syncErrorData.error.data.admin_contact}
|
||||
limitType={this.state.syncErrorData.error.data.limit_type}
|
||||
/>;
|
||||
} else if (usageLimitEvent) {
|
||||
topBar = <ServerLimitBar kind='soft'
|
||||
adminContact={usageLimitEvent.getContent().admin_contact}
|
||||
limitType={usageLimitEvent.getContent().limit_type}
|
||||
/>;
|
||||
} else if (this.props.showCookieBar &&
|
||||
this.props.config.piwik
|
||||
) {
|
||||
|
|
|
@ -45,6 +45,8 @@ import createRoom from "../../createRoom";
|
|||
import KeyRequestHandler from '../../KeyRequestHandler';
|
||||
import { _t, getCurrentLanguage } from '../../languageHandler';
|
||||
import SettingsStore, {SettingLevel} from "../../settings/SettingsStore";
|
||||
import { startAnyRegistrationFlow } from "../../Registration.js";
|
||||
import { messageForSyncError } from '../../utils/ErrorUtils';
|
||||
|
||||
/** constants for MatrixChat.state.view */
|
||||
const VIEWS = {
|
||||
|
@ -178,6 +180,8 @@ export default React.createClass({
|
|||
// When showing Modal dialogs we need to set aria-hidden on the root app element
|
||||
// and disable it when there are no dialogs
|
||||
hideToSRUsers: false,
|
||||
|
||||
syncError: null, // If the current syncing status is ERROR, the error object, otherwise null.
|
||||
};
|
||||
return s;
|
||||
},
|
||||
|
@ -471,7 +475,7 @@ export default React.createClass({
|
|||
action: 'do_after_sync_prepared',
|
||||
deferred_action: payload,
|
||||
});
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -479,7 +483,11 @@ export default React.createClass({
|
|||
case 'logout':
|
||||
Lifecycle.logout();
|
||||
break;
|
||||
case 'require_registration':
|
||||
startAnyRegistrationFlow(payload);
|
||||
break;
|
||||
case 'start_registration':
|
||||
// This starts the full registration flow
|
||||
this._startRegistration(payload.params || {});
|
||||
break;
|
||||
case 'start_login':
|
||||
|
@ -945,7 +953,7 @@ export default React.createClass({
|
|||
});
|
||||
}
|
||||
dis.dispatch({
|
||||
action: 'view_set_mxid',
|
||||
action: 'require_registration',
|
||||
// If the set_mxid dialog is cancelled, view /home because if the browser
|
||||
// was pointing at /user/@someone:domain?action=chat, the URL needs to be
|
||||
// reset so that they can revisit /user/.. // (and trigger
|
||||
|
@ -1132,7 +1140,7 @@ export default React.createClass({
|
|||
*
|
||||
* @param {string} teamToken
|
||||
*/
|
||||
_onLoggedIn: function(teamToken) {
|
||||
_onLoggedIn: async function(teamToken) {
|
||||
this.setState({
|
||||
view: VIEWS.LOGGED_IN,
|
||||
});
|
||||
|
@ -1145,12 +1153,17 @@ export default React.createClass({
|
|||
this._is_registered = false;
|
||||
|
||||
if (this.props.config.welcomeUserId && getCurrentLanguage().startsWith("en")) {
|
||||
createRoom({
|
||||
const roomId = await createRoom({
|
||||
dmUserId: this.props.config.welcomeUserId,
|
||||
// Only view the welcome user if we're NOT looking at a room
|
||||
andView: !this.state.currentRoomId,
|
||||
});
|
||||
return;
|
||||
// if successful, return because we're already
|
||||
// viewing the welcomeUserId room
|
||||
// else, if failed, fall through to view_home_page
|
||||
if (roomId) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// The user has just logged in after registering
|
||||
dis.dispatch({action: 'view_home_page'});
|
||||
|
@ -1232,13 +1245,20 @@ export default React.createClass({
|
|||
return self._loggedInView.child.canResetTimelineInRoom(roomId);
|
||||
});
|
||||
|
||||
cli.on('sync', function(state, prevState) {
|
||||
cli.on('sync', function(state, prevState, data) {
|
||||
// LifecycleStore and others cannot directly subscribe to matrix client for
|
||||
// events because flux only allows store state changes during flux dispatches.
|
||||
// So dispatch directly from here. Ideally we'd use a SyncStateStore that
|
||||
// would do this dispatch and expose the sync state itself (by listening to
|
||||
// its own dispatch).
|
||||
dis.dispatch({action: 'sync_state', prevState, state});
|
||||
|
||||
if (state === "ERROR") {
|
||||
self.setState({syncError: data.error});
|
||||
} else if (self.state.syncError) {
|
||||
self.setState({syncError: null});
|
||||
}
|
||||
|
||||
self.updateStatusIndicator(state, prevState);
|
||||
if (state === "SYNCING" && prevState === "SYNCING") {
|
||||
return;
|
||||
|
@ -1262,6 +1282,7 @@ export default React.createClass({
|
|||
}, true);
|
||||
});
|
||||
cli.on('Session.logged_out', function(call) {
|
||||
if (Lifecycle.isLoggingOut()) return;
|
||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||
Modal.createTrackedDialog('Signed out', '', ErrorDialog, {
|
||||
title: _t('Signed Out'),
|
||||
|
@ -1417,7 +1438,7 @@ export default React.createClass({
|
|||
} else if (screen == 'start') {
|
||||
this.showScreen('home');
|
||||
dis.dispatch({
|
||||
action: 'view_set_mxid',
|
||||
action: 'require_registration',
|
||||
});
|
||||
} else if (screen == 'directory') {
|
||||
dis.dispatch({
|
||||
|
@ -1733,8 +1754,15 @@ export default React.createClass({
|
|||
} else {
|
||||
// we think we are logged in, but are still waiting for the /sync to complete
|
||||
const Spinner = sdk.getComponent('elements.Spinner');
|
||||
let errorBox;
|
||||
if (this.state.syncError) {
|
||||
errorBox = <div className="mx_MatrixChat_syncError">
|
||||
{messageForSyncError(this.state.syncError)}
|
||||
</div>;
|
||||
}
|
||||
return (
|
||||
<div className="mx_MatrixChat_splash">
|
||||
{errorBox}
|
||||
<Spinner />
|
||||
<a href="#" className="mx_MatrixChat_splashButtons" onClick={this.onLogoutClick}>
|
||||
{ _t('Logout') }
|
||||
|
|
|
@ -160,7 +160,7 @@ module.exports = React.createClass({
|
|||
|
||||
onInviteButtonClick: function() {
|
||||
if (this.context.matrixClient.isGuest()) {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -186,6 +186,9 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
onRoomStateMember: function(ev, state, member) {
|
||||
if (member.roomId !== this.props.roomId) {
|
||||
return;
|
||||
}
|
||||
// redraw the badge on the membership list
|
||||
if (this.state.phase === this.Phase.RoomMemberList && member.roomId === this.props.roomId) {
|
||||
this._delayedUpdate();
|
||||
|
@ -280,7 +283,7 @@ module.exports = React.createClass({
|
|||
const room = cli.getRoom(this.props.roomId);
|
||||
let isUserInRoom;
|
||||
if (room) {
|
||||
const numMembers = room.getJoinedMembers().length;
|
||||
const numMembers = room.getJoinedMemberCount();
|
||||
membersTitle = _t('%(count)s Members', { count: numMembers });
|
||||
membersBadge = <div title={membersTitle}>{ formatCount(numMembers) }</div>;
|
||||
isUserInRoom = room.hasMembershipState(this.context.matrixClient.credentials.userId, 'join');
|
||||
|
|
|
@ -354,7 +354,7 @@ module.exports = React.createClass({
|
|||
// to the directory.
|
||||
if (MatrixClientPeg.get().isGuest()) {
|
||||
if (!room.world_readable && !room.guest_can_join) {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
Copyright 2017 New Vector Ltd
|
||||
Copyright 2017, 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.
|
||||
|
@ -18,7 +18,7 @@ limitations under the License.
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import Matrix from 'matrix-js-sdk';
|
||||
import { _t } from '../../languageHandler';
|
||||
import { _t, _td } from '../../languageHandler';
|
||||
import sdk from '../../index';
|
||||
import WhoIsTyping from '../../WhoIsTyping';
|
||||
import MatrixClientPeg from '../../MatrixClientPeg';
|
||||
|
@ -26,6 +26,7 @@ import MemberAvatar from '../views/avatars/MemberAvatar';
|
|||
import Resend from '../../Resend';
|
||||
import * as cryptodevices from '../../cryptodevices';
|
||||
import dis from '../../dispatcher';
|
||||
import { messageForResourceLimitError } from '../../utils/ErrorUtils';
|
||||
|
||||
const STATUS_BAR_HIDDEN = 0;
|
||||
const STATUS_BAR_EXPANDED = 1;
|
||||
|
@ -107,6 +108,7 @@ module.exports = React.createClass({
|
|||
getInitialState: function() {
|
||||
return {
|
||||
syncState: MatrixClientPeg.get().getSyncState(),
|
||||
syncStateData: MatrixClientPeg.get().getSyncStateData(),
|
||||
usersTyping: WhoIsTyping.usersTypingApartFromMe(this.props.room),
|
||||
unsentMessages: getUnsentMessages(this.props.room),
|
||||
};
|
||||
|
@ -134,12 +136,13 @@ module.exports = React.createClass({
|
|||
}
|
||||
},
|
||||
|
||||
onSyncStateChange: function(state, prevState) {
|
||||
onSyncStateChange: function(state, prevState, data) {
|
||||
if (state === "SYNCING" && prevState === "SYNCING") {
|
||||
return;
|
||||
}
|
||||
this.setState({
|
||||
syncState: state,
|
||||
syncStateData: data,
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -191,7 +194,7 @@ module.exports = React.createClass({
|
|||
// changed - so we use '0' to indicate normal size, and other values to
|
||||
// indicate other sizes.
|
||||
_getSize: function() {
|
||||
if (this.state.syncState === "ERROR" ||
|
||||
if (this._shouldShowConnectionError() ||
|
||||
(this.state.usersTyping.length > 0) ||
|
||||
this.props.numUnreadMessages ||
|
||||
!this.props.atEndOfLiveTimeline ||
|
||||
|
@ -238,7 +241,7 @@ module.exports = React.createClass({
|
|||
);
|
||||
}
|
||||
|
||||
if (this.state.syncState === "ERROR") {
|
||||
if (this._shouldShowConnectionError()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -285,6 +288,21 @@ module.exports = React.createClass({
|
|||
return avatars;
|
||||
},
|
||||
|
||||
_shouldShowConnectionError: function() {
|
||||
// no conn bar trumps unread count since you can't get unread messages
|
||||
// without a connection! (technically may already have some but meh)
|
||||
// It also trumps the "some not sent" msg since you can't resend without
|
||||
// a connection!
|
||||
// There's one situation in which we don't show this 'no connection' bar, and that's
|
||||
// if it's a resource limit exceeded error: those are shown in the top bar.
|
||||
const errorIsMauError = Boolean(
|
||||
this.state.syncStateData &&
|
||||
this.state.syncStateData.error &&
|
||||
this.state.syncStateData.error.errcode === 'M_RESOURCE_LIMIT_EXCEEDED'
|
||||
);
|
||||
return this.state.syncState === "ERROR" && !errorIsMauError;
|
||||
},
|
||||
|
||||
_getUnsentMessageContent: function() {
|
||||
const unsentMessages = this.state.unsentMessages;
|
||||
if (!unsentMessages.length) return null;
|
||||
|
@ -309,13 +327,13 @@ module.exports = React.createClass({
|
|||
);
|
||||
} else {
|
||||
let consentError = null;
|
||||
let mauError = null;
|
||||
let resourceLimitError = null;
|
||||
for (const m of unsentMessages) {
|
||||
if (m.error && m.error.errcode === 'M_CONSENT_NOT_GIVEN') {
|
||||
consentError = m.error;
|
||||
break;
|
||||
} else if (m.error && m.error.errcode === 'M_MAU_LIMIT_EXCEEDED') {
|
||||
mauError = m.error;
|
||||
} else if (m.error && m.error.errcode === 'M_RESOURCE_LIMIT_EXCEEDED') {
|
||||
resourceLimitError = m.error;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -331,8 +349,19 @@ module.exports = React.createClass({
|
|||
</a>,
|
||||
},
|
||||
);
|
||||
} else if (mauError) {
|
||||
title = _t("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.");
|
||||
} else if (resourceLimitError) {
|
||||
title = messageForResourceLimitError(
|
||||
resourceLimitError.data.limit_type,
|
||||
resourceLimitError.data.admin_contact, {
|
||||
'monthly_active_user': _td(
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. " +
|
||||
"Please <a>contact your service administrator</a> to continue using the service.",
|
||||
),
|
||||
'': _td(
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. " +
|
||||
"Please <a>contact your service administrator</a> to continue using the service.",
|
||||
),
|
||||
});
|
||||
} else if (
|
||||
unsentMessages.length === 1 &&
|
||||
unsentMessages[0].error &&
|
||||
|
@ -372,11 +401,7 @@ module.exports = React.createClass({
|
|||
_getContent: function() {
|
||||
const EmojiText = sdk.getComponent('elements.EmojiText');
|
||||
|
||||
// no conn bar trumps unread count since you can't get unread messages
|
||||
// without a connection! (technically may already have some but meh)
|
||||
// It also trumps the "some not sent" msg since you can't resend without
|
||||
// a connection!
|
||||
if (this.state.syncState === "ERROR") {
|
||||
if (this._shouldShowConnectionError()) {
|
||||
return (
|
||||
<div className="mx_RoomStatusBar_connectionLostBar">
|
||||
<img src="img/warning.svg" width="24" height="23" title="/!\ " alt="/!\ " />
|
||||
|
|
|
@ -91,13 +91,16 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
getInitialState: function() {
|
||||
const llMembers = MatrixClientPeg.get().hasLazyLoadMembersEnabled();
|
||||
return {
|
||||
room: null,
|
||||
roomId: null,
|
||||
roomLoading: true,
|
||||
peekLoading: false,
|
||||
shouldPeek: true,
|
||||
|
||||
// used to trigger a rerender in TimelinePanel once the members are loaded,
|
||||
// so RR are rendered again (now with the members available), ...
|
||||
membersLoaded: !llMembers,
|
||||
// The event to be scrolled to initially
|
||||
initialEventId: null,
|
||||
// The offset in pixels from the event with which to scroll vertically
|
||||
|
@ -148,7 +151,7 @@ module.exports = React.createClass({
|
|||
MatrixClientPeg.get().on("Room.name", this.onRoomName);
|
||||
MatrixClientPeg.get().on("Room.accountData", this.onRoomAccountData);
|
||||
MatrixClientPeg.get().on("RoomState.members", this.onRoomStateMember);
|
||||
MatrixClientPeg.get().on("RoomMember.membership", this.onRoomMemberMembership);
|
||||
MatrixClientPeg.get().on("Room.myMembership", this.onMyMembership);
|
||||
MatrixClientPeg.get().on("accountData", this.onAccountData);
|
||||
|
||||
// Start listening for RoomViewStore updates
|
||||
|
@ -309,6 +312,8 @@ module.exports = React.createClass({
|
|||
}
|
||||
});
|
||||
} else if (room) {
|
||||
//viewing a previously joined room, try to lazy load members
|
||||
|
||||
// Stop peeking because we have joined this room previously
|
||||
MatrixClientPeg.get().stopPeeking();
|
||||
this.setState({isPeeking: false});
|
||||
|
@ -351,7 +356,7 @@ module.exports = React.createClass({
|
|||
// XXX: EVIL HACK to autofocus inviting on empty rooms.
|
||||
// We use the setTimeout to avoid racing with focus_composer.
|
||||
if (this.state.room &&
|
||||
this.state.room.getJoinedMembers().length == 1 &&
|
||||
this.state.room.getJoinedMemberCount() == 1 &&
|
||||
this.state.room.getLiveTimeline() &&
|
||||
this.state.room.getLiveTimeline().getEvents() &&
|
||||
this.state.room.getLiveTimeline().getEvents().length <= 6) {
|
||||
|
@ -410,8 +415,8 @@ module.exports = React.createClass({
|
|||
MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
|
||||
MatrixClientPeg.get().removeListener("Room.name", this.onRoomName);
|
||||
MatrixClientPeg.get().removeListener("Room.accountData", this.onRoomAccountData);
|
||||
MatrixClientPeg.get().removeListener("Room.myMembership", this.onMyMembership);
|
||||
MatrixClientPeg.get().removeListener("RoomState.members", this.onRoomStateMember);
|
||||
MatrixClientPeg.get().removeListener("RoomMember.membership", this.onRoomMemberMembership);
|
||||
MatrixClientPeg.get().removeListener("accountData", this.onAccountData);
|
||||
}
|
||||
|
||||
|
@ -580,6 +585,27 @@ module.exports = React.createClass({
|
|||
this._warnAboutEncryption(room);
|
||||
this._calculatePeekRules(room);
|
||||
this._updatePreviewUrlVisibility(room);
|
||||
this._loadMembersIfJoined(room);
|
||||
},
|
||||
|
||||
_loadMembersIfJoined: async function(room) {
|
||||
// lazy load members if enabled
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (cli.hasLazyLoadMembersEnabled()) {
|
||||
if (room && room.getMyMembership() === 'join') {
|
||||
try {
|
||||
await room.loadMembersIfNeeded();
|
||||
if (!this.unmounted) {
|
||||
this.setState({membersLoaded: true});
|
||||
}
|
||||
} catch (err) {
|
||||
const errorMessage = `Fetching room members for ${room.roomId} failed.` +
|
||||
" Room members will appear incomplete.";
|
||||
console.error(errorMessage);
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_warnAboutEncryption: function(room) {
|
||||
|
@ -689,12 +715,12 @@ module.exports = React.createClass({
|
|||
}
|
||||
|
||||
this._updateRoomMembers();
|
||||
this._checkIfAlone(this.state.room);
|
||||
},
|
||||
|
||||
onRoomMemberMembership: function(ev, member, oldMembership) {
|
||||
if (member.userId == MatrixClientPeg.get().credentials.userId) {
|
||||
onMyMembership: function(room, membership, oldMembership) {
|
||||
if (room.roomId === this.state.roomId) {
|
||||
this.forceUpdate();
|
||||
this._loadMembersIfJoined(room);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -705,6 +731,7 @@ module.exports = React.createClass({
|
|||
// refresh the conf call notification state
|
||||
this._updateConfCallNotification();
|
||||
this._updateDMState();
|
||||
this._checkIfAlone(this.state.room);
|
||||
}, 500),
|
||||
|
||||
_checkIfAlone: function(room) {
|
||||
|
@ -717,8 +744,8 @@ module.exports = React.createClass({
|
|||
return;
|
||||
}
|
||||
|
||||
const joinedMembers = room.currentState.getMembers().filter((m) => m.membership === "join" || m.membership === "invite");
|
||||
this.setState({isAlone: joinedMembers.length === 1});
|
||||
const joinedOrInvitedMemberCount = room.getJoinedMemberCount() + room.getInvitedMemberCount();
|
||||
this.setState({isAlone: joinedOrInvitedMemberCount === 1});
|
||||
},
|
||||
|
||||
_updateConfCallNotification: function() {
|
||||
|
@ -746,40 +773,13 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
_updateDMState() {
|
||||
const me = this.state.room.getMember(MatrixClientPeg.get().credentials.userId);
|
||||
if (!me || me.membership !== "join") {
|
||||
const room = this.state.room;
|
||||
if (room.getMyMembership() != "join") {
|
||||
return;
|
||||
}
|
||||
|
||||
// The user may have accepted an invite with is_direct set
|
||||
if (me.events.member.getPrevContent().membership === "invite" &&
|
||||
me.events.member.getPrevContent().is_direct
|
||||
) {
|
||||
// This is a DM with the sender of the invite event (which we assume
|
||||
// preceded the join event)
|
||||
Rooms.setDMRoom(
|
||||
this.state.room.roomId,
|
||||
me.events.member.getUnsigned().prev_sender,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const invitedMembers = this.state.room.getMembersWithMembership("invite");
|
||||
const joinedMembers = this.state.room.getMembersWithMembership("join");
|
||||
|
||||
// There must be one invited member and one joined member
|
||||
if (invitedMembers.length !== 1 || joinedMembers.length !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The user may have sent an invite with is_direct sent
|
||||
const other = invitedMembers[0];
|
||||
if (other &&
|
||||
other.membership === "invite" &&
|
||||
other.events.member.getContent().is_direct
|
||||
) {
|
||||
Rooms.setDMRoom(this.state.room.roomId, other.userId);
|
||||
return;
|
||||
const dmInviter = room.getDMInviter();
|
||||
if (dmInviter) {
|
||||
Rooms.setDMRoom(room.roomId, dmInviter);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -930,7 +930,7 @@ module.exports = React.createClass({
|
|||
dis.dispatch({action: 'focus_composer'});
|
||||
|
||||
if (MatrixClientPeg.get().isGuest()) {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -961,7 +961,7 @@ module.exports = React.createClass({
|
|||
|
||||
injectSticker: function(url, info, text) {
|
||||
if (MatrixClientPeg.get().isGuest()) {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1476,6 +1476,7 @@ module.exports = React.createClass({
|
|||
const RoomPreviewBar = sdk.getComponent("rooms.RoomPreviewBar");
|
||||
const Loader = sdk.getComponent("elements.Spinner");
|
||||
const TimelinePanel = sdk.getComponent("structures.TimelinePanel");
|
||||
const RoomUpgradeWarningBar = sdk.getComponent("rooms.RoomUpgradeWarningBar");
|
||||
|
||||
if (!this.state.room) {
|
||||
if (this.state.roomLoading || this.state.peekLoading) {
|
||||
|
@ -1522,9 +1523,8 @@ module.exports = React.createClass({
|
|||
}
|
||||
}
|
||||
|
||||
const myUserId = MatrixClientPeg.get().credentials.userId;
|
||||
const myMember = this.state.room.getMember(myUserId);
|
||||
if (myMember && myMember.membership == 'invite') {
|
||||
const myMembership = this.state.room.getMyMembership();
|
||||
if (myMembership == 'invite') {
|
||||
if (this.state.joining || this.state.rejecting) {
|
||||
return (
|
||||
<div className="mx_RoomView">
|
||||
|
@ -1532,6 +1532,8 @@ module.exports = React.createClass({
|
|||
</div>
|
||||
);
|
||||
} else {
|
||||
const myUserId = MatrixClientPeg.get().credentials.userId;
|
||||
const myMember = this.state.room.getMember(myUserId);
|
||||
const inviteEvent = myMember.events.member;
|
||||
var inviterName = inviteEvent.sender ? inviteEvent.sender.name : inviteEvent.getSender();
|
||||
|
||||
|
@ -1601,6 +1603,11 @@ module.exports = React.createClass({
|
|||
/>;
|
||||
}
|
||||
|
||||
const showRoomUpgradeBar = (
|
||||
this.state.room.shouldUpgradeToVersion() &&
|
||||
this.state.room.userMayUpgradeRoom(MatrixClientPeg.get().credentials.userId)
|
||||
);
|
||||
|
||||
let aux = null;
|
||||
let hideCancel = false;
|
||||
if (this.state.editingRoomSettings) {
|
||||
|
@ -1612,10 +1619,13 @@ module.exports = React.createClass({
|
|||
} else if (this.state.searching) {
|
||||
hideCancel = true; // has own cancel
|
||||
aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress} onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch} />;
|
||||
} else if (showRoomUpgradeBar) {
|
||||
aux = <RoomUpgradeWarningBar room={this.state.room} />;
|
||||
hideCancel = true;
|
||||
} else if (this.state.showingPinned) {
|
||||
hideCancel = true; // has own cancel
|
||||
aux = <PinnedEventsPanel room={this.state.room} onCancelClick={this.onPinnedClick} />;
|
||||
} else if (!myMember || myMember.membership !== "join") {
|
||||
} else if (myMembership !== "join") {
|
||||
// We do have a room object for this room, but we're not currently in it.
|
||||
// We may have a 3rd party invite to it.
|
||||
var inviterName = undefined;
|
||||
|
@ -1657,7 +1667,7 @@ module.exports = React.createClass({
|
|||
let messageComposer, searchInfo;
|
||||
const canSpeak = (
|
||||
// joined and not showing search results
|
||||
myMember && (myMember.membership == 'join') && !this.state.searchResults
|
||||
myMembership == 'join' && !this.state.searchResults
|
||||
);
|
||||
if (canSpeak) {
|
||||
messageComposer =
|
||||
|
@ -1758,6 +1768,7 @@ module.exports = React.createClass({
|
|||
onReadMarkerUpdated={this._updateTopUnreadMessagesBar}
|
||||
showUrlPreview = {this.state.showUrlPreview}
|
||||
className="mx_RoomView_messagePanel"
|
||||
membersLoaded={this.state.membersLoaded}
|
||||
/>);
|
||||
|
||||
let topUnreadMessagesBar = null;
|
||||
|
@ -1792,15 +1803,15 @@ module.exports = React.createClass({
|
|||
oobData={this.props.oobData}
|
||||
editing={this.state.editingRoomSettings}
|
||||
saving={this.state.uploadingRoomSettings}
|
||||
inRoom={myMember && myMember.membership === 'join'}
|
||||
inRoom={myMembership === 'join'}
|
||||
collapsedRhs={this.props.collapsedRhs}
|
||||
onSearchClick={this.onSearchClick}
|
||||
onSettingsClick={this.onSettingsClick}
|
||||
onPinnedClick={this.onPinnedClick}
|
||||
onSaveClick={this.onSettingsSaveClick}
|
||||
onCancelClick={(aux && !hideCancel) ? this.onCancelClick : null}
|
||||
onForgetClick={(myMember && myMember.membership === "leave") ? this.onForgetClick : null}
|
||||
onLeaveClick={(myMember && myMember.membership === "join") ? this.onLeaveClick : null}
|
||||
onForgetClick={(myMembership === "leave") ? this.onForgetClick : null}
|
||||
onLeaveClick={(myMembership === "join") ? this.onLeaveClick : null}
|
||||
/>
|
||||
{ auxPanel }
|
||||
<div className={fadableSectionClasses}>
|
||||
|
|
|
@ -76,7 +76,7 @@ const TagPanel = React.createClass({
|
|||
|
||||
_onClientSync(syncState, prevState) {
|
||||
// Consider the client reconnected if there is no error with syncing.
|
||||
// This means the state could be RECONNECTING, SYNCING or PREPARED.
|
||||
// This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP.
|
||||
const reconnected = syncState !== "ERROR" && prevState !== syncState;
|
||||
if (reconnected) {
|
||||
// Load joined groups
|
||||
|
|
|
@ -1146,10 +1146,11 @@ var TimelinePanel = React.createClass({
|
|||
// of paginating our way through the entire history of the room.
|
||||
const stickyBottom = !this._timelineWindow.canPaginate(EventTimeline.FORWARDS);
|
||||
|
||||
// If the state is PREPARED, we're still waiting for the js-sdk to sync with
|
||||
// If the state is PREPARED or CATCHUP, we're still waiting for the js-sdk to sync with
|
||||
// the HS and fetch the latest events, so we are effectively forward paginating.
|
||||
const forwardPaginating = (
|
||||
this.state.forwardPaginating || this.state.clientSyncState == 'PREPARED'
|
||||
this.state.forwardPaginating ||
|
||||
['PREPARED', 'CATCHUP'].includes(this.state.clientSyncState)
|
||||
);
|
||||
return (
|
||||
<MessagePanel ref="messagePanel"
|
||||
|
|
|
@ -845,8 +845,16 @@ module.exports = React.createClass({
|
|||
SettingsStore.getLabsFeatures().forEach((featureId) => {
|
||||
// TODO: this ought to be a separate component so that we don't need
|
||||
// to rebind the onChange each time we render
|
||||
const onChange = (e) => {
|
||||
SettingsStore.setFeatureEnabled(featureId, e.target.checked);
|
||||
const onChange = async (e) => {
|
||||
const checked = e.target.checked;
|
||||
if (featureId === "feature_lazyloading") {
|
||||
const confirmed = await this._onLazyLoadChanging(checked);
|
||||
if (!confirmed) {
|
||||
e.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
await SettingsStore.setFeatureEnabled(featureId, checked);
|
||||
this.forceUpdate();
|
||||
};
|
||||
|
||||
|
@ -856,7 +864,7 @@ module.exports = React.createClass({
|
|||
type="checkbox"
|
||||
id={featureId}
|
||||
name={featureId}
|
||||
defaultChecked={SettingsStore.isFeatureEnabled(featureId)}
|
||||
checked={SettingsStore.isFeatureEnabled(featureId)}
|
||||
onChange={onChange}
|
||||
/>
|
||||
<label htmlFor={featureId}>{ SettingsStore.getDisplayName(featureId) }</label>
|
||||
|
@ -879,6 +887,30 @@ module.exports = React.createClass({
|
|||
);
|
||||
},
|
||||
|
||||
_onLazyLoadChanging: async function(enabling) {
|
||||
// don't prevent turning LL off when not supported
|
||||
if (enabling) {
|
||||
const supported = await MatrixClientPeg.get().doesServerSupportLazyLoading();
|
||||
if (!supported) {
|
||||
await new Promise((resolve) => {
|
||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||
Modal.createDialog(QuestionDialog, {
|
||||
title: _t("Lazy loading members not supported"),
|
||||
description:
|
||||
<div>
|
||||
{ _t("Lazy loading is not supported by your " +
|
||||
"current homeserver.") }
|
||||
</div>,
|
||||
button: _t("OK"),
|
||||
onFinished: resolve,
|
||||
});
|
||||
});
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
_renderDeactivateAccount: function() {
|
||||
return <div>
|
||||
<h3>{ _t("Deactivate Account") }</h3>
|
||||
|
@ -890,6 +922,25 @@ module.exports = React.createClass({
|
|||
</div>;
|
||||
},
|
||||
|
||||
_renderTermsAndConditionsLinks: function() {
|
||||
if (SdkConfig.get().terms_and_conditions_links) {
|
||||
const tncLinks = [];
|
||||
for (const tncEntry of SdkConfig.get().terms_and_conditions_links) {
|
||||
tncLinks.push(<div key={tncEntry.url}>
|
||||
<a href={tncEntry.url} rel="noopener" target="_blank">{tncEntry.text}</a>
|
||||
</div>);
|
||||
}
|
||||
return <div>
|
||||
<h3>{ _t("Legal") }</h3>
|
||||
<div className="mx_UserSettings_section">
|
||||
{tncLinks}
|
||||
</div>
|
||||
</div>;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
_renderClearCache: function() {
|
||||
return <div>
|
||||
<h3>{ _t("Clear Cache") }</h3>
|
||||
|
@ -1376,6 +1427,8 @@ module.exports = React.createClass({
|
|||
|
||||
{ this._renderDeactivateAccount() }
|
||||
|
||||
{ this._renderTermsAndConditionsLinks() }
|
||||
|
||||
</GeminiScrollbarWrapper>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -20,11 +20,12 @@ limitations under the License.
|
|||
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { _t } from '../../../languageHandler';
|
||||
import { _t, _td } from '../../../languageHandler';
|
||||
import sdk from '../../../index';
|
||||
import Login from '../../../Login';
|
||||
import SdkConfig from '../../../SdkConfig';
|
||||
import SettingsStore from "../../../settings/SettingsStore";
|
||||
import { messageForResourceLimitError } from '../../../utils/ErrorUtils';
|
||||
|
||||
// For validating phone numbers without country codes
|
||||
const PHONE_NUMBER_REGEX = /^[0-9()\-\s]*$/;
|
||||
|
@ -121,13 +122,28 @@ module.exports = React.createClass({
|
|||
const usingEmail = username.indexOf("@") > 0;
|
||||
if (error.httpStatus === 400 && usingEmail) {
|
||||
errorText = _t('This Home Server does not support login using email address.');
|
||||
} else if (error.errcode == 'M_MAU_LIMIT_EXCEEDED') {
|
||||
} else if (error.errcode == 'M_RESOURCE_LIMIT_EXCEEDED') {
|
||||
const errorTop = messageForResourceLimitError(
|
||||
error.data.limit_type,
|
||||
error.data.admin_contact, {
|
||||
'monthly_active_user': _td(
|
||||
"This homeserver has hit its Monthly Active User limit.",
|
||||
),
|
||||
'': _td(
|
||||
"This homeserver has exceeded one of its resource limits.",
|
||||
),
|
||||
});
|
||||
const errorDetail = messageForResourceLimitError(
|
||||
error.data.limit_type,
|
||||
error.data.admin_contact, {
|
||||
'': _td(
|
||||
"Please <a>contact your service administrator</a> to continue using this service.",
|
||||
),
|
||||
});
|
||||
errorText = (
|
||||
<div>
|
||||
<div>{ _t('This homeserver has hit its Monthly Active User limit') }</div>
|
||||
<div className="mx_Login_smallError">
|
||||
{ _t('Please contact your service administrator to continue using this service.') }
|
||||
</div>
|
||||
<div>{errorTop}</div>
|
||||
<div className="mx_Login_smallError">{errorDetail}</div>
|
||||
</div>
|
||||
);
|
||||
} else if (error.httpStatus === 401 || error.httpStatus === 403) {
|
||||
|
|
|
@ -26,9 +26,10 @@ import sdk from '../../../index';
|
|||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||
import RegistrationForm from '../../views/login/RegistrationForm';
|
||||
import RtsClient from '../../../RtsClient';
|
||||
import { _t } from '../../../languageHandler';
|
||||
import { _t, _td } from '../../../languageHandler';
|
||||
import SdkConfig from '../../../SdkConfig';
|
||||
import SettingsStore from "../../../settings/SettingsStore";
|
||||
import { messageForResourceLimitError } from '../../../utils/ErrorUtils';
|
||||
|
||||
const MIN_PASSWORD_LENGTH = 6;
|
||||
|
||||
|
@ -92,6 +93,7 @@ module.exports = React.createClass({
|
|||
doingUIAuth: Boolean(this.props.sessionId),
|
||||
hsUrl: this.props.customHsUrl,
|
||||
isUrl: this.props.customIsUrl,
|
||||
flows: null,
|
||||
};
|
||||
},
|
||||
|
||||
|
@ -144,11 +146,27 @@ module.exports = React.createClass({
|
|||
});
|
||||
},
|
||||
|
||||
_replaceClient: function() {
|
||||
_replaceClient: async function() {
|
||||
this._matrixClient = Matrix.createClient({
|
||||
baseUrl: this.state.hsUrl,
|
||||
idBaseUrl: this.state.isUrl,
|
||||
});
|
||||
try {
|
||||
await this._makeRegisterRequest({});
|
||||
// This should never succeed since we specified an empty
|
||||
// auth object.
|
||||
console.log("Expecting 401 from register request but got success!");
|
||||
} catch (e) {
|
||||
if (e.httpStatus === 401) {
|
||||
this.setState({
|
||||
flows: e.data.flows,
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
errorText: _t("Unable to query for supported registration methods"),
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onFormSubmit: function(formVals) {
|
||||
|
@ -164,10 +182,27 @@ module.exports = React.createClass({
|
|||
if (!success) {
|
||||
let msg = response.message || response.toString();
|
||||
// can we give a better error message?
|
||||
if (response.errcode == 'M_MAU_LIMIT_EXCEEDED') {
|
||||
if (response.errcode == 'M_RESOURCE_LIMIT_EXCEEDED') {
|
||||
const errorTop = messageForResourceLimitError(
|
||||
response.data.limit_type,
|
||||
response.data.admin_contact, {
|
||||
'monthly_active_user': _td(
|
||||
"This homeserver has hit its Monthly Active User limit.",
|
||||
),
|
||||
'': _td(
|
||||
"This homeserver has exceeded one of its resource limits.",
|
||||
),
|
||||
});
|
||||
const errorDetail = messageForResourceLimitError(
|
||||
response.data.limit_type,
|
||||
response.data.admin_contact, {
|
||||
'': _td(
|
||||
"Please <a>contact your service administrator</a> to continue using this service.",
|
||||
),
|
||||
});
|
||||
msg = <div>
|
||||
<p>{_t("This homeserver has hit its Monthly Active User limit")}</p>
|
||||
<p>{_t("Please contact your service administrator to continue using this service.")}</p>
|
||||
<p>{errorTop}</p>
|
||||
<p>{errorDetail}</p>
|
||||
</div>;
|
||||
} else if (response.required_stages && response.required_stages.indexOf('m.login.msisdn') > -1) {
|
||||
let msisdnAvailable = false;
|
||||
|
@ -360,7 +395,7 @@ module.exports = React.createClass({
|
|||
poll={true}
|
||||
/>
|
||||
);
|
||||
} else if (this.state.busy || this.state.teamServerBusy) {
|
||||
} else if (this.state.busy || this.state.teamServerBusy || !this.state.flows) {
|
||||
registerBody = <Spinner />;
|
||||
} else {
|
||||
let serverConfigSection;
|
||||
|
@ -390,6 +425,7 @@ module.exports = React.createClass({
|
|||
onError={this.onFormValidationFailed}
|
||||
onRegisterClick={this.onFormSubmit}
|
||||
onTeamSelected={this.onTeamSelected}
|
||||
flows={this.state.flows}
|
||||
/>
|
||||
{ serverConfigSection }
|
||||
</div>
|
||||
|
|
|
@ -87,7 +87,7 @@ module.exports = React.createClass({
|
|||
if (this.unmounted) return;
|
||||
|
||||
// Consider the client reconnected if there is no error with syncing.
|
||||
// This means the state could be RECONNECTING, SYNCING or PREPARED.
|
||||
// This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP.
|
||||
const reconnected = syncState !== "ERROR" && prevState !== syncState;
|
||||
if (reconnected &&
|
||||
// Did we fall back?
|
||||
|
|
|
@ -19,6 +19,7 @@ import {ContentRepo} from "matrix-js-sdk";
|
|||
import MatrixClientPeg from "../../../MatrixClientPeg";
|
||||
import Modal from '../../../Modal';
|
||||
import sdk from "../../../index";
|
||||
import DMRoomMap from '../../../utils/DMRoomMap';
|
||||
|
||||
module.exports = React.createClass({
|
||||
displayName: 'RoomAvatar',
|
||||
|
@ -107,58 +108,29 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
getOneToOneAvatar: function(props) {
|
||||
if (!props.room) return null;
|
||||
|
||||
const mlist = props.room.currentState.members;
|
||||
const userIds = [];
|
||||
const leftUserIds = [];
|
||||
// for .. in optimisation to return early if there are >2 keys
|
||||
for (const uid in mlist) {
|
||||
if (mlist.hasOwnProperty(uid)) {
|
||||
if (["join", "invite"].includes(mlist[uid].membership)) {
|
||||
userIds.push(uid);
|
||||
} else {
|
||||
leftUserIds.push(uid);
|
||||
}
|
||||
}
|
||||
if (userIds.length > 2) {
|
||||
return null;
|
||||
}
|
||||
const room = props.room;
|
||||
if (!room) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (userIds.length == 2) {
|
||||
let theOtherGuy = null;
|
||||
if (mlist[userIds[0]].userId == MatrixClientPeg.get().credentials.userId) {
|
||||
theOtherGuy = mlist[userIds[1]];
|
||||
} else {
|
||||
theOtherGuy = mlist[userIds[0]];
|
||||
}
|
||||
return theOtherGuy.getAvatarUrl(
|
||||
MatrixClientPeg.get().getHomeserverUrl(),
|
||||
Math.floor(props.width * window.devicePixelRatio),
|
||||
Math.floor(props.height * window.devicePixelRatio),
|
||||
props.resizeMethod,
|
||||
false,
|
||||
);
|
||||
} else if (userIds.length == 1) {
|
||||
// The other 1-1 user left, leaving just the current user, so show the left user's avatar
|
||||
if (leftUserIds.length === 1) {
|
||||
return mlist[leftUserIds[0]].getAvatarUrl(
|
||||
MatrixClientPeg.get().getHomeserverUrl(),
|
||||
props.width, props.height, props.resizeMethod,
|
||||
false,
|
||||
);
|
||||
}
|
||||
return mlist[userIds[0]].getAvatarUrl(
|
||||
MatrixClientPeg.get().getHomeserverUrl(),
|
||||
Math.floor(props.width * window.devicePixelRatio),
|
||||
Math.floor(props.height * window.devicePixelRatio),
|
||||
props.resizeMethod,
|
||||
false,
|
||||
);
|
||||
let otherMember = null;
|
||||
const otherUserId = DMRoomMap.shared().getUserIdForRoomId(room.roomId);
|
||||
if (otherUserId) {
|
||||
otherMember = room.getMember(otherUserId);
|
||||
} else {
|
||||
return null;
|
||||
// if the room is not marked as a 1:1, but only has max 2 members
|
||||
// then still try to show any avatar (pref. other member)
|
||||
otherMember = room.getAvatarFallbackMember();
|
||||
}
|
||||
if (otherMember) {
|
||||
return otherMember.getAvatarUrl(
|
||||
MatrixClientPeg.get().getHomeserverUrl(),
|
||||
Math.floor(props.width * window.devicePixelRatio),
|
||||
Math.floor(props.height * window.devicePixelRatio),
|
||||
props.resizeMethod,
|
||||
false,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
onRoomAvatarClick: function() {
|
||||
|
|
|
@ -346,20 +346,18 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
render: function() {
|
||||
const myMember = this.props.room.getMember(
|
||||
MatrixClientPeg.get().credentials.userId,
|
||||
);
|
||||
const myMembership = this.props.room.getMyMembership();
|
||||
|
||||
// Can't set notif level or tags on non-join rooms
|
||||
if (myMember.membership !== 'join') {
|
||||
return this._renderLeaveMenu(myMember.membership);
|
||||
if (myMembership !== 'join') {
|
||||
return this._renderLeaveMenu(myMembership);
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
{ this._renderNotifMenu() }
|
||||
<hr className="mx_RoomTileContextMenu_separator" />
|
||||
{ this._renderLeaveMenu(myMember.membership) }
|
||||
{ this._renderLeaveMenu(myMembership) }
|
||||
<hr className="mx_RoomTileContextMenu_separator" />
|
||||
{ this._renderRoomTagMenu() }
|
||||
</div>
|
||||
|
|
|
@ -54,8 +54,8 @@ export default class ChatCreateOrReuseDialog extends React.Component {
|
|||
for (const roomId of dmRooms) {
|
||||
const room = client.getRoom(roomId);
|
||||
if (room) {
|
||||
const me = room.getMember(client.credentials.userId);
|
||||
const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === "invite";
|
||||
const isInvite = room.getMyMembership() === "invite";
|
||||
const highlight = room.getUnreadNotificationCount('highlight') > 0 || isInvite;
|
||||
tiles.push(
|
||||
<RoomTile key={room.roomId} room={room}
|
||||
transparent={true}
|
||||
|
@ -63,7 +63,7 @@ export default class ChatCreateOrReuseDialog extends React.Component {
|
|||
selected={false}
|
||||
unread={Unread.doesRoomHaveUnreadMessages(room)}
|
||||
highlight={highlight}
|
||||
isInvite={me.membership === "invite"}
|
||||
isInvite={isInvite}
|
||||
onClick={this.onRoomTileClick}
|
||||
/>,
|
||||
);
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
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 React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import sdk from '../../../index';
|
||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||
import Modal from '../../../Modal';
|
||||
import { _t } from '../../../languageHandler';
|
||||
|
||||
export default React.createClass({
|
||||
displayName: 'RoomUpgradeDialog',
|
||||
|
||||
propTypes: {
|
||||
room: PropTypes.object.isRequired,
|
||||
onFinished: PropTypes.func.isRequired,
|
||||
},
|
||||
|
||||
componentWillMount: function() {
|
||||
this._targetVersion = this.props.room.shouldUpgradeToVersion();
|
||||
},
|
||||
|
||||
getInitialState: function() {
|
||||
return {
|
||||
busy: false,
|
||||
};
|
||||
},
|
||||
|
||||
_onCancelClick: function() {
|
||||
this.props.onFinished(false);
|
||||
},
|
||||
|
||||
_onUpgradeClick: function() {
|
||||
this.setState({busy: true});
|
||||
MatrixClientPeg.get().upgradeRoom(this.props.room.roomId, this._targetVersion).catch((err) => {
|
||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||
Modal.createTrackedDialog('Failed to upgrade room', '', ErrorDialog, {
|
||||
title: _t("Failed to upgrade room"),
|
||||
description: ((err && err.message) ? err.message : _t("The room upgrade could not be completed")),
|
||||
});
|
||||
}).finally(() => {
|
||||
this.setState({busy: false});
|
||||
});
|
||||
},
|
||||
|
||||
render: function() {
|
||||
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
||||
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
|
||||
const Spinner = sdk.getComponent('views.elements.Spinner');
|
||||
|
||||
let buttons;
|
||||
if (this.state.busy) {
|
||||
buttons = <Spinner />;
|
||||
} else {
|
||||
buttons = <DialogButtons
|
||||
primaryButton={_t(
|
||||
'Upgrade this room to version %(version)s',
|
||||
{version: this._targetVersion},
|
||||
)}
|
||||
primaryButtonClass="danger"
|
||||
hasCancel={true}
|
||||
onPrimaryButtonClick={this._onUpgradeClick}
|
||||
focus={this.props.focus}
|
||||
onCancel={this._onCancelClick}
|
||||
/>;
|
||||
}
|
||||
|
||||
return (
|
||||
<BaseDialog className="mx_RoomUpgradeDialog"
|
||||
onFinished={this.onCancelled}
|
||||
title={_t("Upgrade Room Version")}
|
||||
contentId='mx_Dialog_content'
|
||||
onFinished={this.props.onFinished}
|
||||
hasCancel={true}
|
||||
>
|
||||
<p>
|
||||
{_t(
|
||||
"Upgrading this room requires closing down the current " +
|
||||
"instance of the room and creating a new room it its place. " +
|
||||
"To give room members the best possible experience, we will:",
|
||||
)}
|
||||
</p>
|
||||
<ol>
|
||||
<li>{_t("Create a new room with the same name, description and avatar")}</li>
|
||||
<li>{_t("Update any local room aliases to point to the new room")}</li>
|
||||
<li>{_t("Stop users from speaking in the old version of the room, and post a message advising users to move to the new room")}</li>
|
||||
<li>{_t("Put a link back to the old room at the start of the new room so people can see old messages")}</li>
|
||||
</ol>
|
||||
{buttons}
|
||||
</BaseDialog>
|
||||
);
|
||||
},
|
||||
});
|
|
@ -161,6 +161,8 @@ export default class AppTile extends React.Component {
|
|||
// if it's not remaining on screen, get rid of the PersistedElement container
|
||||
if (!ActiveWidgetStore.getWidgetPersistence(this.props.id)) {
|
||||
ActiveWidgetStore.destroyPersistentWidget();
|
||||
const PersistedElement = sdk.getComponent("elements.PersistedElement");
|
||||
PersistedElement.destroyElement(this._persistKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -437,6 +439,8 @@ export default class AppTile extends React.Component {
|
|||
|
||||
// Force the widget to be non-persistent
|
||||
ActiveWidgetStore.destroyPersistentWidget();
|
||||
const PersistedElement = sdk.getComponent("elements.PersistedElement");
|
||||
PersistedElement.destroyElement(this._persistKey);
|
||||
}
|
||||
|
||||
formatAppTileName() {
|
||||
|
|
|
@ -187,6 +187,9 @@ const Pill = React.createClass({
|
|||
getContent: () => {
|
||||
return {avatar_url: resp.avatar_url};
|
||||
},
|
||||
getDirectionalContent: function() {
|
||||
return this.getContent();
|
||||
},
|
||||
};
|
||||
this.setState({member});
|
||||
}).catch((err) => {
|
||||
|
|
|
@ -15,15 +15,82 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import { _t } from '../../../languageHandler';
|
||||
import PropTypes from 'prop-types';
|
||||
import classNames from 'classnames';
|
||||
import { _td } from '../../../languageHandler';
|
||||
import { messageForResourceLimitError } from '../../../utils/ErrorUtils';
|
||||
|
||||
export default React.createClass({
|
||||
propTypes: {
|
||||
// 'hard' if the logged in user has been locked out, 'soft' if they haven't
|
||||
kind: PropTypes.string,
|
||||
adminContact: PropTypes.string,
|
||||
// The type of limit that has been hit.
|
||||
limitType: PropTypes.string.isRequired,
|
||||
},
|
||||
|
||||
getDefaultProps: function() {
|
||||
return {
|
||||
kind: 'hard',
|
||||
};
|
||||
},
|
||||
|
||||
render: function() {
|
||||
const toolbarClasses = "mx_MatrixToolbar mx_MatrixToolbar_error";
|
||||
const toolbarClasses = {
|
||||
'mx_MatrixToolbar': true,
|
||||
};
|
||||
|
||||
let adminContact;
|
||||
let limitError;
|
||||
if (this.props.kind === 'hard') {
|
||||
toolbarClasses['mx_MatrixToolbar_error'] = true;
|
||||
|
||||
adminContact = messageForResourceLimitError(
|
||||
this.props.limitType,
|
||||
this.props.adminContact,
|
||||
{
|
||||
'': _td("Please <a>contact your service administrator</a> to continue using the service."),
|
||||
},
|
||||
);
|
||||
limitError = messageForResourceLimitError(
|
||||
this.props.limitType,
|
||||
this.props.adminContact,
|
||||
{
|
||||
'monthly_active_user': _td("This homeserver has hit its Monthly Active User limit."),
|
||||
'': _td("This homeserver has exceeded one of its resource limits."),
|
||||
},
|
||||
);
|
||||
} else {
|
||||
toolbarClasses['mx_MatrixToolbar_info'] = true;
|
||||
adminContact = messageForResourceLimitError(
|
||||
this.props.limitType,
|
||||
this.props.adminContact,
|
||||
{
|
||||
'': _td("Please <a>contact your service administrator</a> to get this limit increased."),
|
||||
},
|
||||
);
|
||||
limitError = messageForResourceLimitError(
|
||||
this.props.limitType,
|
||||
this.props.adminContact,
|
||||
{
|
||||
'monthly_active_user': _td(
|
||||
"This homeserver has hit its Monthly Active User limit so " +
|
||||
"<b>some users will not be able to log in</b>.",
|
||||
),
|
||||
'': _td(
|
||||
"This homeserver has exceeded one of its resource limits so " +
|
||||
"<b>some users will not be able to log in</b>.",
|
||||
),
|
||||
},
|
||||
{'b': sub => <b>{sub}</b>},
|
||||
);
|
||||
}
|
||||
return (
|
||||
<div className={toolbarClasses}>
|
||||
<div className={classNames(toolbarClasses)}>
|
||||
<div className="mx_MatrixToolbar_content">
|
||||
{ _t("This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.") }
|
||||
{limitError}
|
||||
{' '}
|
||||
{adminContact}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
Copyright 2017 Vector Creations Ltd
|
||||
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.
|
||||
|
@ -49,7 +50,7 @@ module.exports = React.createClass({
|
|||
teamsConfig: PropTypes.shape({
|
||||
// Email address to request new teams
|
||||
supportEmail: PropTypes.string,
|
||||
teams: PropTypes.arrayOf(React.PropTypes.shape({
|
||||
teams: PropTypes.arrayOf(PropTypes.shape({
|
||||
// The displayed name of the team
|
||||
"name": PropTypes.string,
|
||||
// The domain of team email addresses
|
||||
|
@ -60,6 +61,7 @@ module.exports = React.createClass({
|
|||
minPasswordLength: PropTypes.number,
|
||||
onError: PropTypes.func,
|
||||
onRegisterClick: PropTypes.func.isRequired, // onRegisterClick(Object) => ?Promise
|
||||
flows: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
},
|
||||
|
||||
getDefaultProps: function() {
|
||||
|
@ -273,12 +275,18 @@ module.exports = React.createClass({
|
|||
});
|
||||
},
|
||||
|
||||
_authStepIsRequired(step) {
|
||||
// A step is required if no flow exists which does not include that step
|
||||
// (Notwithstanding setups like either email or msisdn being required)
|
||||
return !this.props.flows.some((flow) => {
|
||||
return !flow.stages.includes(step);
|
||||
});
|
||||
},
|
||||
|
||||
render: function() {
|
||||
const self = this;
|
||||
|
||||
const theme = SettingsStore.getValue("theme");
|
||||
// FIXME: remove hardcoded Status team tweaks at some point
|
||||
const emailPlaceholder = theme === 'status' ? _t("Email address") : _t("Email address (optional)");
|
||||
const emailPlaceholder = this._authStepIsRequired('m.login.email.identity') ? _t("Email address") : _t("Email address (optional)");
|
||||
|
||||
const emailSection = (
|
||||
<div>
|
||||
|
@ -315,6 +323,7 @@ module.exports = React.createClass({
|
|||
const CountryDropdown = sdk.getComponent('views.login.CountryDropdown');
|
||||
let phoneSection;
|
||||
if (!SdkConfig.get().disable_3pid_login) {
|
||||
const phonePlaceholder = this._authStepIsRequired('m.login.msisdn') ? _t("Mobile phone number") : _t("Mobile phone number (optional)");
|
||||
phoneSection = (
|
||||
<div className="mx_Login_phoneSection">
|
||||
<CountryDropdown ref="phone_country" onOptionChange={this._onPhoneCountryChange}
|
||||
|
@ -324,7 +333,7 @@ module.exports = React.createClass({
|
|||
showPrefix={true}
|
||||
/>
|
||||
<input type="text" ref="phoneNumber"
|
||||
placeholder={_t("Mobile phone number (optional)")}
|
||||
placeholder={phonePlaceholder}
|
||||
defaultValue={this.props.defaultPhoneNumber}
|
||||
className={this._classForField(
|
||||
FIELD_PHONE_NUMBER,
|
||||
|
|
|
@ -76,7 +76,7 @@ export default class MImageBody extends React.Component {
|
|||
onClientSync(syncState, prevState) {
|
||||
if (this.unmounted) return;
|
||||
// Consider the client reconnected if there is no error with syncing.
|
||||
// This means the state could be RECONNECTING, SYNCING or PREPARED.
|
||||
// This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP.
|
||||
const reconnected = syncState !== "ERROR" && prevState !== syncState;
|
||||
if (reconnected && this.state.imgError) {
|
||||
// Load the image again
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
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 React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import dis from '../../../dispatcher';
|
||||
import { makeEventPermalink } from '../../../matrix-to';
|
||||
import { _t } from '../../../languageHandler';
|
||||
|
||||
module.exports = React.createClass({
|
||||
displayName: 'RoomCreate',
|
||||
|
||||
propTypes: {
|
||||
/* the MatrixEvent to show */
|
||||
mxEvent: PropTypes.object.isRequired,
|
||||
},
|
||||
|
||||
_onLinkClicked: function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
const predecessor = this.props.mxEvent.getContent()['predecessor'];
|
||||
|
||||
dis.dispatch({
|
||||
action: 'view_room',
|
||||
event_id: predecessor['event_id'],
|
||||
highlighted: true,
|
||||
room_id: predecessor['room_id'],
|
||||
});
|
||||
},
|
||||
|
||||
render: function() {
|
||||
const predecessor = this.props.mxEvent.getContent()['predecessor'];
|
||||
if (predecessor === undefined) {
|
||||
return <div />; // We should never have been instaniated in this case
|
||||
}
|
||||
return <div className="mx_CreateEvent">
|
||||
<img className="mx_CreateEvent_image" src="img/room-continuation.svg" />
|
||||
<div className="mx_CreateEvent_header">
|
||||
{_t("This room is a continuation of another conversation.")}
|
||||
</div>
|
||||
<a className="mx_CreateEvent_link"
|
||||
href={makeEventPermalink(predecessor['room_id'], predecessor['event_id'])}
|
||||
onClick={this._onLinkClicked}
|
||||
>
|
||||
{_t("Click here to see older messages.")}
|
||||
</a>
|
||||
</div>;
|
||||
},
|
||||
});
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
Copyright 2016 OpenMarket Ltd
|
||||
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.
|
||||
|
@ -97,18 +98,19 @@ module.exports = React.createClass({
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// save new canonical alias
|
||||
let oldCanonicalAlias = null;
|
||||
if (this.props.canonicalAliasEvent) {
|
||||
oldCanonicalAlias = this.props.canonicalAliasEvent.getContent().alias;
|
||||
}
|
||||
if (oldCanonicalAlias !== this.state.canonicalAlias) {
|
||||
|
||||
let newCanonicalAlias = this.state.canonicalAlias;
|
||||
|
||||
if (this.props.canSetCanonicalAlias && oldCanonicalAlias !== newCanonicalAlias) {
|
||||
console.log("AliasSettings: Updating canonical alias");
|
||||
promises = [Promise.all(promises).then(
|
||||
MatrixClientPeg.get().sendStateEvent(
|
||||
this.props.roomId, "m.room.canonical_alias", {
|
||||
alias: this.state.canonicalAlias,
|
||||
alias: newCanonicalAlias,
|
||||
}, "",
|
||||
),
|
||||
)];
|
||||
|
@ -145,6 +147,7 @@ module.exports = React.createClass({
|
|||
if (!alias || alias.length === 0) return; // ignore attempts to create blank aliases
|
||||
|
||||
const localDomain = MatrixClientPeg.get().getDomain();
|
||||
if (!alias.includes(':')) alias += ':' + localDomain;
|
||||
if (this.isAliasValid(alias) && alias.endsWith(localDomain)) {
|
||||
this.state.domainToAliases[localDomain] = this.state.domainToAliases[localDomain] || [];
|
||||
this.state.domainToAliases[localDomain].push(alias);
|
||||
|
@ -161,11 +164,18 @@ module.exports = React.createClass({
|
|||
description: _t('\'%(alias)s\' is not a valid format for an alias', { alias: alias }),
|
||||
});
|
||||
}
|
||||
|
||||
if (!this.props.canonicalAlias) {
|
||||
this.setState({
|
||||
canonicalAlias: alias
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onLocalAliasChanged: function(alias, index) {
|
||||
if (alias === "") return; // hit the delete button to delete please
|
||||
const localDomain = MatrixClientPeg.get().getDomain();
|
||||
if (!alias.includes(':')) alias += ':' + localDomain;
|
||||
if (this.isAliasValid(alias) && alias.endsWith(localDomain)) {
|
||||
this.state.domainToAliases[localDomain][index] = alias;
|
||||
} else {
|
||||
|
@ -184,10 +194,15 @@ module.exports = React.createClass({
|
|||
// promptly setState anyway, it's just about acceptable. The alternative
|
||||
// would be to arbitrarily deepcopy to a temp variable and then setState
|
||||
// that, but why bother when we can cut this corner.
|
||||
this.state.domainToAliases[localDomain].splice(index, 1);
|
||||
const alias = this.state.domainToAliases[localDomain].splice(index, 1);
|
||||
this.setState({
|
||||
domainToAliases: this.state.domainToAliases,
|
||||
});
|
||||
if (this.props.canonicalAlias === alias) {
|
||||
this.setState({
|
||||
canonicalAlias: null,
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onCanonicalAliasChange: function(event) {
|
||||
|
@ -204,12 +219,14 @@ module.exports = React.createClass({
|
|||
|
||||
let canonical_alias_section;
|
||||
if (this.props.canSetCanonicalAlias) {
|
||||
let found = false;
|
||||
canonical_alias_section = (
|
||||
<select onChange={this.onCanonicalAliasChange} defaultValue={this.state.canonicalAlias}>
|
||||
<select onChange={this.onCanonicalAliasChange} value={this.state.canonicalAlias}>
|
||||
<option value="" key="unset">{ _t('not specified') }</option>
|
||||
{
|
||||
Object.keys(self.state.domainToAliases).map(function(domain, i) {
|
||||
return self.state.domainToAliases[domain].map(function(alias, j) {
|
||||
Object.keys(self.state.domainToAliases).map((domain, i) => {
|
||||
return self.state.domainToAliases[domain].map((alias, j) => {
|
||||
if (alias === this.state.canonicalAlias) found = true;
|
||||
return (
|
||||
<option value={alias} key={i + "_" + j}>
|
||||
{ alias }
|
||||
|
@ -218,6 +235,12 @@ module.exports = React.createClass({
|
|||
});
|
||||
})
|
||||
}
|
||||
{
|
||||
found || !this.stateCanonicalAlias ? '' :
|
||||
<option value={ this.state.canonicalAlias } key='arbitrary'>
|
||||
{ this.state.canonicalAlias }
|
||||
</option>
|
||||
}
|
||||
</select>
|
||||
);
|
||||
} else {
|
||||
|
|
|
@ -90,7 +90,7 @@ module.exports = React.createClass({
|
|||
secondary_color: this.state.secondary_color,
|
||||
}).catch(function(err) {
|
||||
if (err.errcode === 'M_GUEST_ACCESS_FORBIDDEN') {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -47,6 +47,10 @@ const eventTileTypes = {
|
|||
};
|
||||
|
||||
const stateEventTileTypes = {
|
||||
'm.room.aliases': 'messages.TextualEvent',
|
||||
// 'm.room.aliases': 'messages.RoomAliasesEvent', // too complex
|
||||
'm.room.canonical_alias': 'messages.TextualEvent',
|
||||
'm.room.create': 'messages.RoomCreate',
|
||||
'm.room.member': 'messages.TextualEvent',
|
||||
'm.room.name': 'messages.TextualEvent',
|
||||
'm.room.avatar': 'messages.RoomAvatarEvent',
|
||||
|
@ -57,7 +61,6 @@ const stateEventTileTypes = {
|
|||
'm.room.power_levels': 'messages.TextualEvent',
|
||||
'm.room.pinned_events': 'messages.TextualEvent',
|
||||
'm.room.server_acl': 'messages.TextualEvent',
|
||||
|
||||
'im.vector.modular.widgets': 'messages.TextualEvent',
|
||||
};
|
||||
|
||||
|
@ -483,7 +486,9 @@ module.exports = withMatrixClient(React.createClass({
|
|||
const eventType = this.props.mxEvent.getType();
|
||||
|
||||
// Info messages are basically information about commands processed on a room
|
||||
const isInfoMessage = (eventType !== 'm.room.message' && eventType !== 'm.sticker');
|
||||
const isInfoMessage = (
|
||||
eventType !== 'm.room.message' && eventType !== 'm.sticker' && eventType != 'm.room.create'
|
||||
);
|
||||
|
||||
const tileHandler = getHandlerTile(this.props.mxEvent);
|
||||
// This shouldn't happen: the caller should check we support this type
|
||||
|
@ -535,6 +540,9 @@ module.exports = withMatrixClient(React.createClass({
|
|||
if (this.props.tileShape === "notif") {
|
||||
avatarSize = 24;
|
||||
needsSenderProfile = true;
|
||||
} else if (tileHandler === 'messages.RoomCreate') {
|
||||
avatarSize = 0;
|
||||
needsSenderProfile = false;
|
||||
} else if (isInfoMessage) {
|
||||
// a small avatar, with no sender profile, for
|
||||
// joins/parts/etc
|
||||
|
@ -745,6 +753,8 @@ module.exports.haveTileForEvent = function(e) {
|
|||
if (handler === undefined) return false;
|
||||
if (handler === 'messages.TextualEvent') {
|
||||
return TextForEvent.textForEvent(e) !== '';
|
||||
} else if (handler === 'messages.RoomCreate') {
|
||||
return Boolean(e.getContent()['predecessor']);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -429,7 +429,7 @@ module.exports = withMatrixClient(React.createClass({
|
|||
console.log("Mod toggle success");
|
||||
}, function(err) {
|
||||
if (err.errcode === 'M_GUEST_ACCESS_FORBIDDEN') {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
} else {
|
||||
console.error("Toggle moderator error:" + err);
|
||||
Modal.createTrackedDialog('Failed to toggle moderator status', '', ErrorDialog, {
|
||||
|
@ -598,7 +598,7 @@ module.exports = withMatrixClient(React.createClass({
|
|||
|
||||
onMemberAvatarClick: function() {
|
||||
const member = this.props.member;
|
||||
const avatarUrl = member.user ? member.user.avatarUrl : member.events.member.getContent().avatar_url;
|
||||
const avatarUrl = member.getMxcAvatarUrl();
|
||||
if (!avatarUrl) return;
|
||||
|
||||
const httpUrl = this.props.matrixClient.mxcUrlToHttp(avatarUrl);
|
||||
|
@ -774,15 +774,15 @@ module.exports = withMatrixClient(React.createClass({
|
|||
for (const roomId of dmRooms) {
|
||||
const room = this.props.matrixClient.getRoom(roomId);
|
||||
if (room) {
|
||||
const me = room.getMember(this.props.matrixClient.credentials.userId);
|
||||
|
||||
const myMembership = room.getMyMembership();
|
||||
// not a DM room if we have are not joined
|
||||
if (!me.membership || me.membership !== 'join') continue;
|
||||
// not a DM room if they are not joined
|
||||
if (myMembership !== 'join') continue;
|
||||
|
||||
const them = this.props.member;
|
||||
// not a DM room if they are not joined
|
||||
if (!them.membership || them.membership !== 'join') continue;
|
||||
|
||||
const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === 'invite';
|
||||
const highlight = room.getUnreadNotificationCount('highlight') > 0;
|
||||
|
||||
tiles.push(
|
||||
<RoomTile key={room.roomId} room={room}
|
||||
|
@ -791,7 +791,7 @@ module.exports = withMatrixClient(React.createClass({
|
|||
selected={false}
|
||||
unread={Unread.doesRoomHaveUnreadMessages(room)}
|
||||
highlight={highlight}
|
||||
isInvite={me.membership === "invite"}
|
||||
isInvite={false}
|
||||
onClick={this.onRoomTileClick}
|
||||
/>,
|
||||
);
|
||||
|
|
|
@ -32,10 +32,93 @@ module.exports = React.createClass({
|
|||
displayName: 'MemberList',
|
||||
|
||||
getInitialState: function() {
|
||||
this.memberDict = this.getMemberDict();
|
||||
const members = this.roomMembers();
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (cli.hasLazyLoadMembersEnabled()) {
|
||||
// show an empty list
|
||||
return this._getMembersState([]);
|
||||
} else {
|
||||
return this._getMembersState(this.roomMembers());
|
||||
}
|
||||
},
|
||||
|
||||
componentWillMount: function() {
|
||||
this._mounted = true;
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (cli.hasLazyLoadMembersEnabled()) {
|
||||
this._showMembersAccordingToMembershipWithLL();
|
||||
cli.on("Room.myMembership", this.onMyMembership);
|
||||
} else {
|
||||
this._listenForMembersChanges();
|
||||
}
|
||||
cli.on("Room", this.onRoom); // invites & joining after peek
|
||||
const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"];
|
||||
const hsUrl = MatrixClientPeg.get().baseUrl;
|
||||
this._showPresence = true;
|
||||
if (enablePresenceByHsUrl && enablePresenceByHsUrl[hsUrl] !== undefined) {
|
||||
this._showPresence = enablePresenceByHsUrl[hsUrl];
|
||||
}
|
||||
},
|
||||
|
||||
_listenForMembersChanges: function() {
|
||||
const cli = MatrixClientPeg.get();
|
||||
cli.on("RoomState.members", this.onRoomStateMember);
|
||||
cli.on("RoomMember.name", this.onRoomMemberName);
|
||||
cli.on("RoomState.events", this.onRoomStateEvent);
|
||||
// We listen for changes to the lastPresenceTs which is essentially
|
||||
// listening for all presence events (we display most of not all of
|
||||
// the information contained in presence events).
|
||||
cli.on("User.lastPresenceTs", this.onUserLastPresenceTs);
|
||||
// cli.on("Room.timeline", this.onRoomTimeline);
|
||||
},
|
||||
|
||||
componentWillUnmount: function() {
|
||||
this._mounted = false;
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (cli) {
|
||||
cli.removeListener("RoomState.members", this.onRoomStateMember);
|
||||
cli.removeListener("RoomMember.name", this.onRoomMemberName);
|
||||
cli.removeListener("Room.myMembership", this.onMyMembership);
|
||||
cli.removeListener("RoomState.events", this.onRoomStateEvent);
|
||||
cli.removeListener("Room", this.onRoom);
|
||||
cli.removeListener("User.lastPresenceTs", this.onUserLastPresenceTs);
|
||||
}
|
||||
|
||||
// cancel any pending calls to the rate_limited_funcs
|
||||
this._updateList.cancelPendingCall();
|
||||
},
|
||||
|
||||
/**
|
||||
* If lazy loading is enabled, either:
|
||||
* show a spinner and load the members if the user is joined,
|
||||
* or show the members available so far if the user is invited
|
||||
*/
|
||||
_showMembersAccordingToMembershipWithLL: async function() {
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (cli.hasLazyLoadMembersEnabled()) {
|
||||
const cli = MatrixClientPeg.get();
|
||||
const room = cli.getRoom(this.props.roomId);
|
||||
const membership = room && room.getMyMembership();
|
||||
if (membership === "join") {
|
||||
this.setState({loading: true});
|
||||
try {
|
||||
await room.loadMembersIfNeeded();
|
||||
} catch (ex) {/* already logged in RoomView */}
|
||||
if (this._mounted) {
|
||||
this.setState(this._getMembersState(this.roomMembers()));
|
||||
this._listenForMembersChanges();
|
||||
}
|
||||
} else if (membership === "invite") {
|
||||
// show the members we've got when invited
|
||||
this.setState(this._getMembersState(this.roomMembers()));
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_getMembersState: function(members) {
|
||||
// set the state after determining _showPresence to make sure it's
|
||||
// taken into account while rerendering
|
||||
return {
|
||||
loading: false,
|
||||
members: members,
|
||||
filteredJoinedMembers: this._filterMembers(members, 'join'),
|
||||
filteredInvitedMembers: this._filterMembers(members, 'invite'),
|
||||
|
@ -48,70 +131,6 @@ module.exports = React.createClass({
|
|||
};
|
||||
},
|
||||
|
||||
componentWillMount: function() {
|
||||
const cli = MatrixClientPeg.get();
|
||||
cli.on("RoomState.members", this.onRoomStateMember);
|
||||
cli.on("RoomMember.name", this.onRoomMemberName);
|
||||
cli.on("RoomState.events", this.onRoomStateEvent);
|
||||
cli.on("Room", this.onRoom); // invites
|
||||
// We listen for changes to the lastPresenceTs which is essentially
|
||||
// listening for all presence events (we display most of not all of
|
||||
// the information contained in presence events).
|
||||
cli.on("User.lastPresenceTs", this.onUserLastPresenceTs);
|
||||
// cli.on("Room.timeline", this.onRoomTimeline);
|
||||
|
||||
const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"];
|
||||
const hsUrl = MatrixClientPeg.get().baseUrl;
|
||||
|
||||
this._showPresence = true;
|
||||
if (enablePresenceByHsUrl && enablePresenceByHsUrl[hsUrl] !== undefined) {
|
||||
this._showPresence = enablePresenceByHsUrl[hsUrl];
|
||||
}
|
||||
},
|
||||
|
||||
componentWillUnmount: function() {
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (cli) {
|
||||
cli.removeListener("RoomState.members", this.onRoomStateMember);
|
||||
cli.removeListener("RoomMember.name", this.onRoomMemberName);
|
||||
cli.removeListener("RoomState.events", this.onRoomStateEvent);
|
||||
cli.removeListener("Room", this.onRoom);
|
||||
cli.removeListener("User.lastPresenceTs", this.onUserLastPresenceTs);
|
||||
// cli.removeListener("Room.timeline", this.onRoomTimeline);
|
||||
}
|
||||
|
||||
// cancel any pending calls to the rate_limited_funcs
|
||||
this._updateList.cancelPendingCall();
|
||||
},
|
||||
|
||||
/*
|
||||
onRoomTimeline: function(ev, room, toStartOfTimeline, removed, data) {
|
||||
// ignore anything but real-time updates at the end of the room:
|
||||
// updates from pagination will happen when the paginate completes.
|
||||
if (toStartOfTimeline || !data || !data.liveEvent) return;
|
||||
|
||||
// treat any activity from a user as implicit presence to update the
|
||||
// ordering of the list whenever someone says something.
|
||||
// Except right now we're not tiebreaking "active now" users in this way
|
||||
// so don't bother for now.
|
||||
if (ev.getSender()) {
|
||||
// console.log("implicit presence from " + ev.getSender());
|
||||
|
||||
var tile = this.refs[ev.getSender()];
|
||||
if (tile) {
|
||||
// work around a race where you might have a room member object
|
||||
// before the user object exists. XXX: why does this ever happen?
|
||||
var all_members = room.currentState.members;
|
||||
var userId = ev.getSender();
|
||||
if (all_members[userId].user === null) {
|
||||
all_members[userId].user = MatrixClientPeg.get().getUser(userId);
|
||||
}
|
||||
this._updateList(); // reorder the membership list
|
||||
}
|
||||
}
|
||||
},
|
||||
*/
|
||||
|
||||
onUserLastPresenceTs(event, user) {
|
||||
// Attach a SINGLE listener for global presence changes then locate the
|
||||
// member tile and re-render it. This is more efficient than every tile
|
||||
|
@ -130,28 +149,40 @@ module.exports = React.createClass({
|
|||
// We listen for room events because when we accept an invite
|
||||
// we need to wait till the room is fully populated with state
|
||||
// before refreshing the member list else we get a stale list.
|
||||
this._updateList();
|
||||
this._showMembersAccordingToMembershipWithLL();
|
||||
},
|
||||
|
||||
onMyMembership: function(room, membership, oldMembership) {
|
||||
if (room.roomId === this.props.roomId && membership === "join") {
|
||||
this._showMembersAccordingToMembershipWithLL();
|
||||
}
|
||||
},
|
||||
|
||||
onRoomStateMember: function(ev, state, member) {
|
||||
if (member.roomId !== this.props.roomId) {
|
||||
return;
|
||||
}
|
||||
this._updateList();
|
||||
},
|
||||
|
||||
onRoomMemberName: function(ev, member) {
|
||||
if (member.roomId !== this.props.roomId) {
|
||||
return;
|
||||
}
|
||||
this._updateList();
|
||||
},
|
||||
|
||||
onRoomStateEvent: function(event, state) {
|
||||
if (event.getType() === "m.room.third_party_invite") {
|
||||
if (event.getRoomId() === this.props.roomId &&
|
||||
event.getType() === "m.room.third_party_invite") {
|
||||
this._updateList();
|
||||
}
|
||||
},
|
||||
|
||||
_updateList: new rate_limited_func(function() {
|
||||
// console.log("Updating memberlist");
|
||||
this.memberDict = this.getMemberDict();
|
||||
|
||||
const newState = {
|
||||
loading: false,
|
||||
members: this.roomMembers(),
|
||||
};
|
||||
newState.filteredJoinedMembers = this._filterMembers(newState.members, 'join', this.state.searchQuery);
|
||||
|
@ -159,50 +190,43 @@ module.exports = React.createClass({
|
|||
this.setState(newState);
|
||||
}, 500),
|
||||
|
||||
getMemberDict: function() {
|
||||
if (!this.props.roomId) return {};
|
||||
getMembersWithUser: function() {
|
||||
if (!this.props.roomId) return [];
|
||||
const cli = MatrixClientPeg.get();
|
||||
const room = cli.getRoom(this.props.roomId);
|
||||
if (!room) return {};
|
||||
if (!room) return [];
|
||||
|
||||
const all_members = room.currentState.members;
|
||||
const allMembers = Object.values(room.currentState.members);
|
||||
|
||||
Object.keys(all_members).map(function(userId) {
|
||||
allMembers.forEach(function(member) {
|
||||
// work around a race where you might have a room member object
|
||||
// before the user object exists. This may or may not cause
|
||||
// https://github.com/vector-im/vector-web/issues/186
|
||||
if (all_members[userId].user === null) {
|
||||
all_members[userId].user = MatrixClientPeg.get().getUser(userId);
|
||||
if (member.user === null) {
|
||||
member.user = cli.getUser(member.userId);
|
||||
}
|
||||
|
||||
// XXX: this user may have no lastPresenceTs value!
|
||||
// the right solution here is to fix the race rather than leave it as 0
|
||||
});
|
||||
|
||||
return all_members;
|
||||
return allMembers;
|
||||
},
|
||||
|
||||
roomMembers: function() {
|
||||
const all_members = this.memberDict || {};
|
||||
const all_user_ids = Object.keys(all_members);
|
||||
const ConferenceHandler = CallHandler.getConferenceHandler();
|
||||
|
||||
all_user_ids.sort(this.memberSort);
|
||||
|
||||
const to_display = [];
|
||||
let count = 0;
|
||||
for (let i = 0; i < all_user_ids.length; ++i) {
|
||||
const user_id = all_user_ids[i];
|
||||
const m = all_members[user_id];
|
||||
|
||||
if (m.membership === 'join' || m.membership === 'invite') {
|
||||
if ((ConferenceHandler && !ConferenceHandler.isConferenceUser(user_id)) || !ConferenceHandler) {
|
||||
to_display.push(user_id);
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
return to_display;
|
||||
const allMembers = this.getMembersWithUser();
|
||||
const filteredAndSortedMembers = allMembers.filter((m) => {
|
||||
return (
|
||||
m.membership === 'join' || m.membership === 'invite'
|
||||
) && (
|
||||
!ConferenceHandler ||
|
||||
(ConferenceHandler && !ConferenceHandler.isConferenceUser(m.userId))
|
||||
);
|
||||
});
|
||||
filteredAndSortedMembers.sort(this.memberSort);
|
||||
return filteredAndSortedMembers;
|
||||
},
|
||||
|
||||
_createOverflowTileJoined: function(overflowCount, totalCount) {
|
||||
|
@ -249,14 +273,12 @@ module.exports = React.createClass({
|
|||
// returns negative if a comes before b,
|
||||
// returns 0 if a and b are equivalent in ordering
|
||||
// returns positive if a comes after b.
|
||||
memberSort: function(userIdA, userIdB) {
|
||||
memberSort: function(memberA, memberB) {
|
||||
// order by last active, with "active now" first.
|
||||
// ...and then by power
|
||||
// ...and then alphabetically.
|
||||
// We could tiebreak instead by "last recently spoken in this room" if we wanted to.
|
||||
|
||||
const memberA = this.memberDict[userIdA];
|
||||
const memberB = this.memberDict[userIdB];
|
||||
const userA = memberA.user;
|
||||
const userB = memberB.user;
|
||||
|
||||
|
@ -306,9 +328,7 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
_filterMembers: function(members, membership, query) {
|
||||
return members.filter((userId) => {
|
||||
const m = this.memberDict[userId];
|
||||
|
||||
return members.filter((m) => {
|
||||
if (query) {
|
||||
query = query.toLowerCase();
|
||||
const matchesName = m.name.toLowerCase().indexOf(query) !== -1;
|
||||
|
@ -350,10 +370,9 @@ module.exports = React.createClass({
|
|||
_makeMemberTiles: function(members, membership) {
|
||||
const MemberTile = sdk.getComponent("rooms.MemberTile");
|
||||
|
||||
const memberList = members.map((userId) => {
|
||||
const m = this.memberDict[userId];
|
||||
const memberList = members.map((m) => {
|
||||
return (
|
||||
<MemberTile key={userId} member={m} ref={userId} showPresence={this._showPresence} />
|
||||
<MemberTile key={m.userId} member={m} ref={m.userId} showPresence={this._showPresence} />
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -393,6 +412,11 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
render: function() {
|
||||
if (this.state.loading) {
|
||||
const Spinner = sdk.getComponent("elements.Spinner");
|
||||
return <div className="mx_MemberList"><Spinner /></div>;
|
||||
}
|
||||
|
||||
const TruncatedList = sdk.getComponent("elements.TruncatedList");
|
||||
const GeminiScrollbarWrapper = sdk.getComponent("elements.GeminiScrollbarWrapper");
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
Copyright 2017 New Vector Ltd
|
||||
Copyright 2017, 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.
|
||||
|
@ -25,6 +25,7 @@ import dis from '../../../dispatcher';
|
|||
import RoomViewStore from '../../../stores/RoomViewStore';
|
||||
import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore";
|
||||
import Stickerpicker from './Stickerpicker';
|
||||
import { makeRoomPermalink } from '../../../matrix-to';
|
||||
|
||||
const formatButtonList = [
|
||||
_td("bold"),
|
||||
|
@ -51,7 +52,9 @@ export default class MessageComposer extends React.Component {
|
|||
this.onToggleMarkdownClicked = this.onToggleMarkdownClicked.bind(this);
|
||||
this.onInputStateChanged = this.onInputStateChanged.bind(this);
|
||||
this.onEvent = this.onEvent.bind(this);
|
||||
this._onRoomStateEvents = this._onRoomStateEvents.bind(this);
|
||||
this._onRoomViewStoreUpdate = this._onRoomViewStoreUpdate.bind(this);
|
||||
this._onTombstoneClick = this._onTombstoneClick.bind(this);
|
||||
|
||||
this.state = {
|
||||
inputState: {
|
||||
|
@ -61,6 +64,7 @@ export default class MessageComposer extends React.Component {
|
|||
},
|
||||
showFormatting: SettingsStore.getValue('MessageComposer.showFormatting'),
|
||||
isQuoting: Boolean(RoomViewStore.getQuotingEvent()),
|
||||
tombstone: this._getRoomTombstone(),
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -70,12 +74,31 @@ export default class MessageComposer extends React.Component {
|
|||
// marked as encrypted.
|
||||
// XXX: fragile as all hell - fixme somehow, perhaps with a dedicated Room.encryption event or something.
|
||||
MatrixClientPeg.get().on("event", this.onEvent);
|
||||
MatrixClientPeg.get().on("RoomState.events", this._onRoomStateEvents);
|
||||
this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate);
|
||||
this._waitForOwnMember();
|
||||
}
|
||||
|
||||
_waitForOwnMember() {
|
||||
// if we have the member already, do that
|
||||
const me = this.props.room.getMember(MatrixClientPeg.get().getUserId());
|
||||
if (me) {
|
||||
this.setState({me});
|
||||
return;
|
||||
}
|
||||
// Otherwise, wait for member loading to finish and then update the member for the avatar.
|
||||
// The members should already be loading, and loadMembersIfNeeded
|
||||
// will return the promise for the existing operation
|
||||
this.props.room.loadMembersIfNeeded().then(() => {
|
||||
const me = this.props.room.getMember(MatrixClientPeg.get().getUserId());
|
||||
this.setState({me});
|
||||
});
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (MatrixClientPeg.get()) {
|
||||
MatrixClientPeg.get().removeListener("event", this.onEvent);
|
||||
MatrixClientPeg.get().removeListener("RoomState.events", this._onRoomStateEvents);
|
||||
}
|
||||
if (this._roomStoreToken) {
|
||||
this._roomStoreToken.remove();
|
||||
|
@ -88,6 +111,18 @@ export default class MessageComposer extends React.Component {
|
|||
this.forceUpdate();
|
||||
}
|
||||
|
||||
_onRoomStateEvents(ev, state) {
|
||||
if (ev.getRoomId() !== this.props.room.roomId) return;
|
||||
|
||||
if (ev.getType() === 'm.room.tombstone') {
|
||||
this.setState({tombstone: this._getRoomTombstone()});
|
||||
}
|
||||
}
|
||||
|
||||
_getRoomTombstone() {
|
||||
return this.props.room.currentState.getStateEvents('m.room.tombstone', '');
|
||||
}
|
||||
|
||||
_onRoomViewStoreUpdate() {
|
||||
const isQuoting = Boolean(RoomViewStore.getQuotingEvent());
|
||||
if (this.state.isQuoting === isQuoting) return;
|
||||
|
@ -96,7 +131,7 @@ export default class MessageComposer extends React.Component {
|
|||
|
||||
onUploadClick(ev) {
|
||||
if (MatrixClientPeg.get().isGuest()) {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -207,8 +242,18 @@ export default class MessageComposer extends React.Component {
|
|||
this.messageComposerInput.enableRichtext(!this.state.inputState.isRichTextEnabled);
|
||||
}
|
||||
|
||||
_onTombstoneClick(ev) {
|
||||
ev.preventDefault();
|
||||
|
||||
const replacementRoomId = this.state.tombstone.getContent()['replacement_room'];
|
||||
dis.dispatch({
|
||||
action: 'view_room',
|
||||
highlighted: true,
|
||||
room_id: replacementRoomId,
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
const me = this.props.room.getMember(MatrixClientPeg.get().credentials.userId);
|
||||
const uploadInputStyle = {display: 'none'};
|
||||
const MemberAvatar = sdk.getComponent('avatars.MemberAvatar');
|
||||
const TintableSvg = sdk.getComponent("elements.TintableSvg");
|
||||
|
@ -216,11 +261,13 @@ export default class MessageComposer extends React.Component {
|
|||
|
||||
const controls = [];
|
||||
|
||||
controls.push(
|
||||
<div key="controls_avatar" className="mx_MessageComposer_avatar">
|
||||
<MemberAvatar member={me} width={24} height={24} />
|
||||
</div>,
|
||||
);
|
||||
if (this.state.me) {
|
||||
controls.push(
|
||||
<div key="controls_avatar" className="mx_MessageComposer_avatar">
|
||||
<MemberAvatar member={this.state.me} width={24} height={24} />
|
||||
</div>,
|
||||
);
|
||||
}
|
||||
|
||||
let e2eImg, e2eTitle, e2eClass;
|
||||
const roomIsEncrypted = MatrixClientPeg.get().isRoomEncrypted(this.props.room.roomId);
|
||||
|
@ -262,8 +309,8 @@ export default class MessageComposer extends React.Component {
|
|||
</div>;
|
||||
}
|
||||
|
||||
const canSendMessages = this.props.room.currentState.maySendMessage(
|
||||
MatrixClientPeg.get().credentials.userId);
|
||||
const canSendMessages = !this.state.tombstone &&
|
||||
this.props.room.maySendMessage();
|
||||
|
||||
if (canSendMessages) {
|
||||
// This also currently includes the call buttons. Really we should
|
||||
|
@ -322,6 +369,24 @@ export default class MessageComposer extends React.Component {
|
|||
callButton,
|
||||
videoCallButton,
|
||||
);
|
||||
} else if (this.state.tombstone) {
|
||||
const replacementRoomId = this.state.tombstone.getContent()['replacement_room'];
|
||||
|
||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||
controls.push(<div className="mx_MessageComposer_replaced_wrapper">
|
||||
<div className="mx_MessageComposer_replaced_valign">
|
||||
<img className="mx_MessageComposer_roomReplaced_icon" src="img/room_replaced.svg" />
|
||||
<span className="mx_MessageComposer_roomReplaced_header">
|
||||
{_t("This room has been replaced and is no longer active.")}
|
||||
</span><br />
|
||||
<a href={makeRoomPermalink(replacementRoomId)}
|
||||
className="mx_MessageComposer_roomReplaced_link"
|
||||
onClick={this._onTombstoneClick}
|
||||
>
|
||||
{_t("The conversation continues here.")}
|
||||
</a>
|
||||
</div>
|
||||
</div>);
|
||||
} else {
|
||||
controls.push(
|
||||
<div key="controls_error" className="mx_MessageComposer_noperm_error">
|
||||
|
|
|
@ -336,7 +336,7 @@ export default class MessageComposerInput extends React.Component {
|
|||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
componentWillMount() {
|
||||
this.dispatcherRef = dis.register(this.onAction);
|
||||
this.historyManager = new ComposerHistoryManager(this.props.room.roomId, 'mx_slate_composer_history_');
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
Copyright 2017 Vector Creations Ltd
|
||||
Copyright 2017, 2018 Vector Creations Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -35,7 +35,12 @@ import RoomListStore from '../../../stores/RoomListStore';
|
|||
import GroupStore from '../../../stores/GroupStore';
|
||||
|
||||
const HIDE_CONFERENCE_CHANS = true;
|
||||
const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority)|im\.vector\.fake\.(invite|recent|direct|archived))$/;
|
||||
const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/;
|
||||
|
||||
function labelForTagName(tagName) {
|
||||
if (tagName.startsWith('u.')) return tagName.slice(2);
|
||||
return tagName;
|
||||
}
|
||||
|
||||
function phraseForSection(section) {
|
||||
switch (section) {
|
||||
|
@ -92,7 +97,7 @@ module.exports = React.createClass({
|
|||
};
|
||||
// All rooms that should be kept in the room list when filtering.
|
||||
// By default, show all rooms.
|
||||
this._visibleRooms = MatrixClientPeg.get().getRooms();
|
||||
this._visibleRooms = MatrixClientPeg.get().getVisibleRooms();
|
||||
|
||||
// Listen to updates to group data. RoomList cares about members and rooms in order
|
||||
// to filter the room list when group tags are selected.
|
||||
|
@ -297,7 +302,7 @@ module.exports = React.createClass({
|
|||
this._visibleRooms = Array.from(roomSet);
|
||||
} else {
|
||||
// Show all rooms
|
||||
this._visibleRooms = MatrixClientPeg.get().getRooms();
|
||||
this._visibleRooms = MatrixClientPeg.get().getVisibleRooms();
|
||||
}
|
||||
this._delayedRefreshRoomList();
|
||||
},
|
||||
|
@ -342,8 +347,8 @@ module.exports = React.createClass({
|
|||
if (!taggedRoom) {
|
||||
return;
|
||||
}
|
||||
const me = taggedRoom.getMember(MatrixClientPeg.get().credentials.userId);
|
||||
if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, me, this.props.ConferenceHandler)) {
|
||||
const myUserId = MatrixClientPeg.get().getUserId();
|
||||
if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, myUserId, this.props.ConferenceHandler)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -446,6 +451,8 @@ module.exports = React.createClass({
|
|||
}
|
||||
}
|
||||
|
||||
if (!this.stickies) return;
|
||||
|
||||
const self = this;
|
||||
let scrollStuckOffset = 0;
|
||||
// Scroll to the passed in position, i.e. a header was clicked and in a scroll to state
|
||||
|
@ -692,7 +699,7 @@ module.exports = React.createClass({
|
|||
if (!tagName.match(STANDARD_TAGS_REGEX)) {
|
||||
return <RoomSubList list={self.state.lists[tagName]}
|
||||
key={tagName}
|
||||
label={tagName}
|
||||
label={labelForTagName(tagName)}
|
||||
tagName={tagName}
|
||||
emptyContent={this._getEmptyContent(tagName)}
|
||||
editable={true}
|
||||
|
@ -739,6 +746,18 @@ module.exports = React.createClass({
|
|||
searchFilter={self.props.searchFilter}
|
||||
onShowMoreRooms={self.onShowMoreRooms}
|
||||
showEmpty={showEmpty} />
|
||||
|
||||
<RoomSubList list={self.state.lists['m.server_notice']}
|
||||
label={_t('System Alerts')}
|
||||
tagName="m.lowpriority"
|
||||
editable={false}
|
||||
order="recent"
|
||||
incomingCall={self.state.incomingCall}
|
||||
collapsed={self.props.collapsed}
|
||||
searchFilter={self.props.searchFilter}
|
||||
onHeaderClick={self.onSubListHeaderClick}
|
||||
onShowMoreRooms={self.onShowMoreRooms}
|
||||
showEmpty={false} />
|
||||
</div>
|
||||
</GeminiScrollbarWrapper>
|
||||
);
|
||||
|
|
|
@ -98,15 +98,11 @@ module.exports = React.createClass({
|
|||
</div>);
|
||||
}
|
||||
|
||||
const myMember = this.props.room ? this.props.room.currentState.members[
|
||||
MatrixClientPeg.get().credentials.userId
|
||||
] : null;
|
||||
const kicked = (
|
||||
myMember &&
|
||||
myMember.membership == 'leave' &&
|
||||
myMember.events.member.getSender() != MatrixClientPeg.get().credentials.userId
|
||||
);
|
||||
const banned = myMember && myMember.membership == 'ban';
|
||||
const myMember = this.props.room ?
|
||||
this.props.room.getMember(MatrixClientPeg.get().getUserId()) :
|
||||
null;
|
||||
const kicked = myMember && myMember.isKicked();
|
||||
const banned = myMember && myMember && myMember.membership == 'ban';
|
||||
|
||||
if (this.props.inviterName) {
|
||||
let emailMatchBlock;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
Copyright 2015, 2016 OpenMarket Ltd
|
||||
Copyright 2017 Vector Creations Ltd
|
||||
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.
|
||||
|
@ -571,6 +572,11 @@ module.exports = React.createClass({
|
|||
});
|
||||
},
|
||||
|
||||
_onRoomUpgradeClick: function() {
|
||||
const RoomUpgradeDialog = sdk.getComponent('dialogs.RoomUpgradeDialog');
|
||||
Modal.createTrackedDialog('Upgrade Room Version', '', RoomUpgradeDialog, {room: this.props.room});
|
||||
},
|
||||
|
||||
_onRoomMemberMembership: function() {
|
||||
// Update, since our banned user list may have changed
|
||||
this.forceUpdate();
|
||||
|
@ -793,15 +799,15 @@ module.exports = React.createClass({
|
|||
}
|
||||
|
||||
let leaveButton = null;
|
||||
const myMember = this.props.room.getMember(myUserId);
|
||||
if (myMember) {
|
||||
if (myMember.membership === "join") {
|
||||
const myMemberShip = this.props.room.getMyMembership();
|
||||
if (myMemberShip) {
|
||||
if (myMemberShip === "join") {
|
||||
leaveButton = (
|
||||
<AccessibleButton className="mx_RoomSettings_leaveButton" onClick={this.onLeaveClick}>
|
||||
{ _t('Leave room') }
|
||||
</AccessibleButton>
|
||||
);
|
||||
} else if (myMember.membership === "leave") {
|
||||
} else if (myMemberShip === "leave") {
|
||||
leaveButton = (
|
||||
<AccessibleButton className="mx_RoomSettings_leaveButton" onClick={this.onForgetClick}>
|
||||
{ _t('Forget room') }
|
||||
|
@ -929,6 +935,13 @@ module.exports = React.createClass({
|
|||
);
|
||||
});
|
||||
|
||||
let roomUpgradeButton = null;
|
||||
if (this.props.room.shouldUpgradeToVersion() && this.props.room.userMayUpgradeRoom(myUserId)) {
|
||||
roomUpgradeButton = <AccessibleButton className="mx_RoomSettings_upgradeButton danger" onClick={this._onRoomUpgradeClick}>
|
||||
{ _t("Upgrade room to version %(ver)s", {ver: this.props.room.shouldUpgradeToVersion()}) }
|
||||
</AccessibleButton>;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mx_RoomSettings">
|
||||
|
||||
|
@ -1039,7 +1052,9 @@ module.exports = React.createClass({
|
|||
|
||||
<h3>{ _t('Advanced') }</h3>
|
||||
<div className="mx_RoomSettings_settings">
|
||||
{ _t('This room\'s internal ID is') } <code>{ this.props.room.roomId }</code>
|
||||
{ _t('Internal room ID: ') } <code>{ this.props.room.roomId }</code><br />
|
||||
{ _t('Room version number: ') } <code>{ this.props.room.getVersion() }</code><br />
|
||||
{ roomUpgradeButton }
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -243,9 +243,7 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
render: function() {
|
||||
const myUserId = MatrixClientPeg.get().credentials.userId;
|
||||
const me = this.props.room.currentState.members[myUserId];
|
||||
|
||||
const isInvite = this.props.room.getMyMembership() === "invite";
|
||||
const notificationCount = this.state.notificationCount;
|
||||
// var highlightCount = this.props.room.getUnreadNotificationCount("highlight");
|
||||
|
||||
|
@ -259,7 +257,7 @@ module.exports = React.createClass({
|
|||
'mx_RoomTile_unread': this.props.unread,
|
||||
'mx_RoomTile_unreadNotify': notifBadges,
|
||||
'mx_RoomTile_highlight': mentionBadges,
|
||||
'mx_RoomTile_invited': (me && me.membership === 'invite'),
|
||||
'mx_RoomTile_invited': isInvite,
|
||||
'mx_RoomTile_menuDisplayed': this.state.menuDisplayed,
|
||||
'mx_RoomTile_noBadges': !badges,
|
||||
'mx_RoomTile_transparent': this.props.transparent,
|
||||
|
@ -275,6 +273,7 @@ module.exports = React.createClass({
|
|||
});
|
||||
|
||||
let name = this.state.roomName;
|
||||
if (name == undefined || name == null) name = '';
|
||||
name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon
|
||||
|
||||
let badgeContent;
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
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 React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import sdk from '../../../index';
|
||||
import Modal from '../../../Modal';
|
||||
|
||||
import { _t } from '../../../languageHandler';
|
||||
|
||||
module.exports = React.createClass({
|
||||
displayName: 'RoomUpgradeWarningBar',
|
||||
|
||||
propTypes: {
|
||||
room: PropTypes.object.isRequired,
|
||||
},
|
||||
|
||||
onUpgradeClick: function() {
|
||||
const RoomUpgradeDialog = sdk.getComponent('dialogs.RoomUpgradeDialog');
|
||||
Modal.createTrackedDialog('Upgrade Room Version', '', RoomUpgradeDialog, {room: this.props.room});
|
||||
},
|
||||
|
||||
render: function() {
|
||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||
return (
|
||||
<div className="mx_RoomUpgradeWarningBar">
|
||||
<div className="mx_RoomUpgradeWarningBar_header">
|
||||
{_t("There is a known vulnerability affecting this room.")}
|
||||
</div>
|
||||
<div className="mx_RoomUpgradeWarningBar_body">
|
||||
{_t("This room version is vulnerable to malicious modification of room state.")}
|
||||
</div>
|
||||
<p className="mx_RoomUpgradeWarningBar_upgradelink">
|
||||
<AccessibleButton onClick={this.onUpgradeClick}>
|
||||
{_t("Click here to upgrade to the latest room version and ensure room integrity is protected.")}
|
||||
</AccessibleButton>
|
||||
</p>
|
||||
<div className="mx_RoomUpgradeWarningBar_small">
|
||||
{_t("Only room administrators will see this warning")}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
});
|
|
@ -26,6 +26,15 @@ import dis from '../../../dispatcher';
|
|||
|
||||
import SettingsStore from "../../../settings/SettingsStore";
|
||||
|
||||
function getFullScreenElement() {
|
||||
return (
|
||||
document.fullscreenElement ||
|
||||
document.mozFullScreenElement ||
|
||||
document.webkitFullscreenElement ||
|
||||
document.msFullscreenElement
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = React.createClass({
|
||||
displayName: 'VideoView',
|
||||
|
||||
|
@ -88,7 +97,7 @@ module.exports = React.createClass({
|
|||
element.msRequestFullscreen
|
||||
);
|
||||
requestMethod.call(element);
|
||||
} else {
|
||||
} else if (getFullScreenElement()) {
|
||||
const exitMethod = (
|
||||
document.exitFullscreen ||
|
||||
document.mozCancelFullScreen ||
|
||||
|
@ -108,10 +117,7 @@ module.exports = React.createClass({
|
|||
const VideoFeed = sdk.getComponent('voip.VideoFeed');
|
||||
|
||||
// if we're fullscreen, we don't want to set a maxHeight on the video element.
|
||||
const fullscreenElement = (document.fullscreenElement ||
|
||||
document.mozFullScreenElement ||
|
||||
document.webkitFullscreenElement);
|
||||
const maxVideoHeight = fullscreenElement ? null : this.props.maxHeight;
|
||||
const maxVideoHeight = getFullScreenElement() ? null : this.props.maxHeight;
|
||||
const localVideoFeedClasses = classNames("mx_VideoView_localVideoFeed",
|
||||
{ "mx_VideoView_localVideoFeed_flipped":
|
||||
SettingsStore.getValue('VideoView.flipVideoHorizontally'),
|
||||
|
|
|
@ -42,7 +42,7 @@ function createRoom(opts) {
|
|||
|
||||
const client = MatrixClientPeg.get();
|
||||
if (client.isGuest()) {
|
||||
dis.dispatch({action: 'view_set_mxid'});
|
||||
dis.dispatch({action: 'require_registration'});
|
||||
return Promise.resolve(null);
|
||||
}
|
||||
|
||||
|
|
|
@ -43,27 +43,26 @@ export function markAllDevicesKnown(matrixClient, devices) {
|
|||
* @return {Promise} A promise which resolves to a map userId->deviceId->{@link
|
||||
* module:crypto~DeviceInfo|DeviceInfo}.
|
||||
*/
|
||||
export function getUnknownDevicesForRoom(matrixClient, room) {
|
||||
const roomMembers = room.getEncryptionTargetMembers().map((m) => {
|
||||
export async function getUnknownDevicesForRoom(matrixClient, room) {
|
||||
const roomMembers = await room.getEncryptionTargetMembers().map((m) => {
|
||||
return m.userId;
|
||||
});
|
||||
return matrixClient.downloadKeys(roomMembers, false).then((devices) => {
|
||||
const unknownDevices = {};
|
||||
// This is all devices in this room, so find the unknown ones.
|
||||
Object.keys(devices).forEach((userId) => {
|
||||
Object.keys(devices[userId]).map((deviceId) => {
|
||||
const device = devices[userId][deviceId];
|
||||
const devices = await matrixClient.downloadKeys(roomMembers, false);
|
||||
const unknownDevices = {};
|
||||
// This is all devices in this room, so find the unknown ones.
|
||||
Object.keys(devices).forEach((userId) => {
|
||||
Object.keys(devices[userId]).map((deviceId) => {
|
||||
const device = devices[userId][deviceId];
|
||||
|
||||
if (device.isUnverified() && !device.isKnown()) {
|
||||
if (unknownDevices[userId] === undefined) {
|
||||
unknownDevices[userId] = {};
|
||||
}
|
||||
unknownDevices[userId][deviceId] = device;
|
||||
if (device.isUnverified() && !device.isKnown()) {
|
||||
if (unknownDevices[userId] === undefined) {
|
||||
unknownDevices[userId] = {};
|
||||
}
|
||||
});
|
||||
unknownDevices[userId][deviceId] = device;
|
||||
}
|
||||
});
|
||||
return unknownDevices;
|
||||
});
|
||||
return unknownDevices;
|
||||
}
|
||||
|
||||
function focusComposer() {
|
||||
|
|
|
@ -1211,5 +1211,50 @@
|
|||
"Demote": "Понижение",
|
||||
"This event could not be displayed": "Това събитие не може да бъде показано",
|
||||
"A conference call could not be started because the intgrations server is not available": "Не може да бъде започнат конферентен разговор, защото сървърът с интеграции не е достъпен",
|
||||
"Permission Required": "Необходимо е разрешение"
|
||||
"Permission Required": "Необходимо е разрешение",
|
||||
"A call is currently being placed!": "В момента се осъществява разговор!",
|
||||
"You do not have permission to start a conference call in this room": "Нямате достъп да започнете конферентен разговор в тази стая",
|
||||
"Show empty room list headings": "Показване на заглавия за празни стаи",
|
||||
"deleted": "изтрито",
|
||||
"underlined": "подчертано",
|
||||
"inline-code": "код",
|
||||
"block-quote": "цитат",
|
||||
"bulleted-list": "списък (с тирета)",
|
||||
"numbered-list": "номериран списък",
|
||||
"Failed to remove widget": "Неуспешно премахване на приспособление",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Възникна грешка при премахването на приспособлението от стаята",
|
||||
"This homeserver has hit its Monthly Active User limit": "Този сървър достигна своя лимит за активни потребители на месец",
|
||||
"Please contact your service administrator to continue using this service.": "Моля, свържете се с администратора на услугата за да продължите да я използвате.",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Този сървър достигна лимита си за активни потребители на месец. Моля, свържете се с администратора на услугата, за да продължите да я използвате.",
|
||||
"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.": "Съобщението Ви не бе изпратено, защото този сървър достигна лимита си за активни потребители на месец. Моля, свържете се с администратора на услугата, за да продължите да я използвате.",
|
||||
"System Alerts": "Системни уведомления",
|
||||
"Internal room ID: ": "Вътрешен идентификатор на стаята: ",
|
||||
"Room version number: ": "Версия на стаята: ",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "Този сървър достигна лимита си за активни потребители на месец. Моля, <a>свържете се с администратора на услугата</a>, за да продължите да я използвате.",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "Този сървър достигна лимита си за активни потребители на месец и някои потребители няма да успеят да влязат в профила си. Моля, <a>свържете се с администратора на услугата</a> за да се увеличи този лимит.",
|
||||
"There is a known vulnerability affecting this room.": "Има пропуск в сигурността засягащ тази стая.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Тази версия на стаята е уязвима към злонамерена модификация на състоянието й.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Кликнете тук за да обновите стаята до последна версия и подсигурите сигурността й.",
|
||||
"Only room administrators will see this warning": "Само администратори на стаята виждат това предупреждение",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Моля, <a>свържете се с администратора на услугата</a> за да продължите да я използвате.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Този сървър е достигнал лимита си за активни потребители на месец.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Този сървър е надвишил някой от лимитите си.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Моля, <a>свържете се с администратора на услугата</a> за да се увеличи този лимит.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Този сървър е достигнал своя лимит за потребители на месец, така че <b>някои потребители не биха успели да влязат</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Този сървър е достигнал някой от лимите си, така че <b>някои потребители не биха успели да влязат</b>.",
|
||||
"Upgrade Room Version": "Обнови версията на стаята",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Обновяването на тази стая изисква затваряне на текущата и създаване на нова на нейно място. За да подсигурим най-доброто изживяване на потребителите, ще:",
|
||||
"Create a new room with the same name, description and avatar": "Създадем нова стая със същото име, описание и снимка",
|
||||
"Update any local room aliases to point to the new room": "Обновим всички локални адреси на стаята да сочат към новата",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Забраним комуникацията на потребителите в старата стая и публикуваме съобщение насочващо ги към новата",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Поставим връзка в новата стая, водещо обратно към старата, за да може хората да виждат старите съобщения",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Съобщението Ви не бе изпратено, защото този сървър е достигнал лимита си за потребители на месец. Моля, <a>свържете се с администратора на услугата</a> за да продължите да я използвате.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Съобщението Ви не бе изпратено, защото този сървър е някой от лимитите си. Моля, <a>свържете се с администратора на услугата</a> за да продължите да я използвате.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Моля, <a>свържете се с администратора на услугата</a> за да продължите да я използвате.",
|
||||
"Increase performance by only loading room members on first view": "Повишаване на бързодействието чрез отложено зареждане на членовете в стаите",
|
||||
"Lazy loading members not supported": "Отложеното зареждане на членове не се поддържа",
|
||||
"Lazy loading is not supported by your current homeserver.": "Отложеното зареждане не се поддържа от текущия сървър.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Съжаляваме, вашият сървър е прекалено стар за да участва в тази стая.",
|
||||
"Please contact your homeserver administrator.": "Моля, свържете се се със сървърния администратор.",
|
||||
"Legal": "Юридически"
|
||||
}
|
||||
|
|
|
@ -1080,5 +1080,171 @@
|
|||
"The platform you're on": "Platforma na které jsi",
|
||||
"The version of Riot.im": "Verze Riot.im",
|
||||
"Whether or not you're logged in (we don't record your user name)": "Jestli jsi, nebo nejsi přihlášen (tvou přezdívku neukládáme)",
|
||||
"Your language of choice": "Tvá jazyková volba"
|
||||
"Your language of choice": "Tvá jazyková volba",
|
||||
"Which officially provided instance you are using, if any": "Přes kterou oficiální podporovanou instanci Riot.im jste pripojeni (jestli nehostujete Riot sami)",
|
||||
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Jestli při psaní zpráv používáte rozbalenou lištu formátování textu",
|
||||
"Your homeserver's URL": "URL vámi používaného domovského serveru",
|
||||
"Your identity server's URL": "URL Vámi používaného serveru totožností",
|
||||
"e.g. %(exampleValue)s": "např. %(exampleValue)s",
|
||||
"Every page you use in the app": "Každou stránku v aplikaci, kterou navštívíte",
|
||||
"e.g. <CurrentPageURL>": "např. <CurrentPageURL>",
|
||||
"Your User Agent": "Řetězec User Agent Vašeho zařízení",
|
||||
"Your device resolution": "Rozlišení obrazovky Vašeho zařízení",
|
||||
"The information being sent to us to help make Riot.im better includes:": "S cílem vylepšovat aplikaci Riot.im shromažďujeme následující údaje:",
|
||||
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "V případě, že se na stránce vyskytují identifikační údaje, jako například název místnosti, ID uživatele, místnosti a nebo skupiny, jsou tyto údaje před odesláním na server odstraněny.",
|
||||
"A conference call could not be started because the intgrations server is not available": "Není možné uskutečnit konferenční hovor, integrační server není k dispozici",
|
||||
"Call in Progress": "Probíhající hovor",
|
||||
"A call is currently being placed!": "Právě probíhá jiný hovor!",
|
||||
"A call is already in progress!": "Jeden hovor už probíhá!",
|
||||
"Permission Required": "Vyžaduje oprávnění",
|
||||
"You do not have permission to start a conference call in this room": "Nemáte oprávnění v této místnosti začít konferenční hovor",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
|
||||
"Missing roomId.": "Chybějící ID místnosti.",
|
||||
"Opens the Developer Tools dialog": "Otevře dialog nástrojů pro vývojáře",
|
||||
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s si změnil zobrazované jméno na %(displayName)s.",
|
||||
"Always show encryption icons": "Vždy zobrazovat ikony stavu šifrovaní",
|
||||
"Disable Community Filter Panel": "Zakázat panel Filtr komunity",
|
||||
"Send analytics data": "Odesílat analytická data",
|
||||
"Enable widget screenshots on supported widgets": "Povolit screenshot widgetu pro podporované widgety",
|
||||
"Show empty room list headings": "Zobrazovat nadpisy prázdných seznamů místností",
|
||||
"This event could not be displayed": "Tato událost nemohla být zobrazena",
|
||||
"Your key share request has been sent - please check your other devices for key share requests.": "Žádost o sdílení klíče byla odeslána - prosím zkontrolujte si Vaše ostatí zařízení.",
|
||||
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Žádost o sdílení klíčů je automaticky odesílaná na Vaše ostatní zařízení. Jestli jste žádost odmítly nebo zrušili dialogové okno se žádostí na ostatních zařízeních, kliknutím sem ji můžete opakovaně pro tuto relaci vyžádat.",
|
||||
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Pokud Vaše ostatní zařízení nemají klíč pro tyto zprávy, nebudete je moci dešifrovat.",
|
||||
"Key request sent.": "Žádost o klíč poslána.",
|
||||
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Znovu vyžádat šifrovací klíče</requestLink> z vašich ostatních zařízení.",
|
||||
"Encrypting": "Šifruje",
|
||||
"Encrypted, not sent": "Zašifrováno, ale neodesláno",
|
||||
"Demote yourself?": "Snížit Vaši vlastní hodnost?",
|
||||
"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.": "Tuto změnu nebudete moci vzít zpět, protože snižujete svoji vlastní hodnost, jste-li poslední privilegovaný uživatel v místnosti, bude nemožné vaši současnou hodnost získat zpět.",
|
||||
"Demote": "Degradovat",
|
||||
"Share Link to User": "Sdílet odkaz na uživatele",
|
||||
"deleted": "smazáno",
|
||||
"underlined": "podtrženo",
|
||||
"inline-code": "vnořený kód",
|
||||
"block-quote": "citace",
|
||||
"bulleted-list": "seznam s odrážkami",
|
||||
"numbered-list": "číselný seznam",
|
||||
"At this time it is not possible to reply with a file so this will be sent without being a reply.": "V současné době nejde odpovědět se souborem, proto toto bude odesláno jako by to odpověď nebyla.",
|
||||
"Send an encrypted reply…": "Odeslat šifrovanou odpověď …",
|
||||
"Send a reply (unencrypted)…": "Odeslat odpověď (nešifrovaně) …",
|
||||
"Send an encrypted message…": "Odeslat šifrovanou zprávu …",
|
||||
"Send a message (unencrypted)…": "Odeslat zprávu (nešifrovaně) …",
|
||||
"Unable to reply": "Není možné odpovědět",
|
||||
"At this time it is not possible to reply with an emote.": "V odpovědi zatím nejde vyjádřit pocit.",
|
||||
"Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) viděl %(dateTime)s",
|
||||
"Replying": "Odpovídá",
|
||||
"Share room": "Sdílet místnost",
|
||||
"You have no historical rooms": "Nemáte žádné historické místnosti",
|
||||
"System Alerts": "Systémová varování",
|
||||
"To notify everyone in the room, you must be a": "Abyste mohli upozornit všechny v místnosti, musíte být",
|
||||
"%(user)s is a %(userRole)s": "%(user)s je %(userRole)s",
|
||||
"Muted Users": "Umlčení uživatelé",
|
||||
"Internal room ID: ": "Vnitřní ID mistnosti: ",
|
||||
"Room version number: ": "Číslo verze místnosti: ",
|
||||
"There is a known vulnerability affecting this room.": "Pro tuto místnost existuje známa zranitelnost.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Tato verze místnosti je zranitelná zlomyslnou modifikací stavu místnosti.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Pro zaručení integrity místnosti klikněte sem a upgradeujte místnost na nejnovější verzi.",
|
||||
"Only room administrators will see this warning": "Jen administrátoři místnosti uvidí toto varování",
|
||||
"You don't currently have any stickerpacks enabled": "Momentálně nemáte aktívní žádné balíčky s nálepkami",
|
||||
"Add a stickerpack": "Přidat balíček s nálepkami",
|
||||
"Stickerpack": "Balíček s nálepkami",
|
||||
"Hide Stickers": "Skrýt nálepky",
|
||||
"Show Stickers": "Zobrazit nálepky",
|
||||
"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.": "V šifrovaných místnostech, jako je tato, jsou URL náhledy ve výchozím nastavení zakázané, aby bylo možné zajistit, že váš domácí server nemůže shromažďovat informace o odkazech, které v této místnosti vidíte.",
|
||||
"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.": "Když někdo ve zprávě pošle URL adresu, může být zobrazen její náhled obsahující informace jako titulek, popis a obrázek z cílové stránky.",
|
||||
"Code": "Kód",
|
||||
"The email field must not be blank.": "E-mail nemůže být prázdný.",
|
||||
"The user name field must not be blank.": "Uživatelské jméno nemůže být prázdné.",
|
||||
"The phone number field must not be blank.": "Telefonní číslo nemůže být prázdné.",
|
||||
"The password field must not be blank.": "Heslo nemůže být prázdné.",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Prosím pomozte nám vylepšovat Riot.im odesíláním <UsageDataLink>anonymních údajů o používaní</UsageDataLink>. Na tento účel použijeme cookie (přečtěte si <PolicyLink>jak cookies používáme</PolicyLink>).",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Prosím pomozte nám vylepšovat Riot.im odesíláním <UsageDataLink>anonymních údajů o používaní</UsageDataLink>. Na tento účel použijeme cookie.",
|
||||
"Yes, I want to help!": "Ano, chci pomoci!",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Please <a>contact your service administrator</a> to continue using the service.\nProsím <a>kontaktujte Vašeho administratora</a> aby jste mohli pokračovat v používání Vašeho zařízení.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Tento domovský server dosáhl svého měsíčního limitu pro aktivní uživatele.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Tento domovský server překročil některý z limitů.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Prosím <a>kontaktujte Vašeho administrátora</a> pro zvýšení tohoto limitu.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Tento domovský server dosáhl svého měsíčního limitu pro aktivní uživatele, proto se <b>někteří uživatelé nebudou moci přihlásit</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Tento domovský server překročil některý z limitů, proto se <b>někteří uživatelé nebudou moci přihlásit</b>.",
|
||||
"Warning: This widget might use cookies.": "Varování: tento widget může používat cookies.",
|
||||
"Failed to remove widget": "Nepovedlo se odstranit widget",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Při odstraňování widgetu z místnosti nastala chyba",
|
||||
"Minimize apps": "Minimalizovat aplikace",
|
||||
"Reload widget": "Obnovit widget",
|
||||
"Popout widget": "Otevřít widget v novém okně",
|
||||
"Picture": "Fotografie",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Není možné načíst událost, na kterou se odpovídalo. Buď neexistuje, nebo nemáte oprávnění ji zobrazit.",
|
||||
"<a>In reply to</a> <pill>": "<a>V odpovědi na</a> <pill>",
|
||||
"Preparing to send logs": "Příprava na odeslání záznamů",
|
||||
"Logs sent": "Záznamy odeslány",
|
||||
"Failed to send logs: ": "Nepodařilo se odeslat záznamy: ",
|
||||
"Submit debug logs": "Odeslat ladící záznamy",
|
||||
"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.": "Ladící záznamy obsahují data o používání aplikace včetně Vašeho uživatelského jména, ID nebo aliasy navštívených místností a skupin a uživatelská jména jiných uživatelů. Neobsahují zprávy.",
|
||||
"Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Bugy Riotu jsou na Githubu: <a>vytvořit bug na Githubu</a>.",
|
||||
"GitHub issue link:": "Odkaz na hlášení na GitHubu:",
|
||||
"Notes:": "Poznámky:",
|
||||
"Community IDs cannot be empty.": "ID komunity nemůže být prázdné.",
|
||||
"Failed to indicate account erasure": "Nepovedlo se potvrdit výmaz účtu",
|
||||
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Toto učiní účet permanentně nepoužitelný. Nebudete se moci přihlásit a nikdo se nebude moci se stejným uživatelskym ID znovu zaregistrovat. Účet bude odstraněn ze všech místnosti a bude vymazán ze servru identity.<b>Tato akce je nevratná.</b>",
|
||||
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Deaktivace účtu <b>automaticky nesmaže zprávy, které jste poslali.</b> Chcete-li je smazat, zaškrtněte prosím odpovídající pole níže.",
|
||||
"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.": "Viditelnost zpráv v Matrixu je podobná e-mailu. Výmaz Vašich zpráv znamené, že už nebudou sdíleny s žádným novým nebo neregistrovaným uživatelem, ale registrovaní uživatelé, kteří už přístup ke zprávám mají, budou stále mít přístup k jejich kopii.",
|
||||
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "S deaktivací účtu si přeji smazat všechny mnou odeslané zprávy (<b>Pozor:</b> způsobí, že noví uživatelé uvidí nekompletní konverzace)",
|
||||
"To continue, please enter your password:": "Pro pokračování, zadejte Vaše heslo:",
|
||||
"password": "heslo",
|
||||
"Upgrade Room Version": "Upgradeovat verzi místnosti",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Upgradování této místnosti vyžaduje uzavření současné instance místnosti a vytvoření místností nové. Pro co možná nejhladší průběh:",
|
||||
"Create a new room with the same name, description and avatar": "Vytvoříme místnost se stejným jménem, popisem a avatarem",
|
||||
"Update any local room aliases to point to the new room": "Aktualizujeme všechny lokální aliasy místnosti tak, aby ukazovaly na novou místnost",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Přerušíme konverzace ve staré verzi místnosti a pošleme uživatelům zprávu o přechodu do nové mistnosti",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Na začátek nové místnosti umístíme odkaz na starou místnost tak, aby uživatelé mohli vidět staré zprávy",
|
||||
"Log out and remove encryption keys?": "Odhlásit se a odstranit šifrovací klíče?",
|
||||
"Clear Storage and Sign Out": "Vymazat uložiště a odhlásit se",
|
||||
"Send Logs": "Odeslat záznamy",
|
||||
"Refresh": "Obnovit",
|
||||
"We encountered an error trying to restore your previous session.": "V průběhu obnovování Vaší minulé relace nastala chyba.",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Vymazání uložiště prohlížeče možna opraví Váš problem, zároveň se tím ale odhlásíte a historie Vašich šifrovaných konverzací se pro Vás může stát nečitelnou.",
|
||||
"Share Room": "Sdílet místnost",
|
||||
"Link to most recent message": "Odkaz na nejnovější zprávu",
|
||||
"Share User": "Sdílet uživatele",
|
||||
"Share Community": "Sdílet komunitu",
|
||||
"Share Room Message": "Sdílet zprávu z místnosti",
|
||||
"Link to selected message": "Odkaz na vybranou zprávu",
|
||||
"COPY": "Kopírovat",
|
||||
"Share Message": "Sdílet zprávu",
|
||||
"Collapse Reply Thread": "Sbalit vlákno odpovědi",
|
||||
"Unable to join community": "Není možné vstoupit do komunity",
|
||||
"Unable to leave community": "Není možné opustit komunitu",
|
||||
"Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Změny ve Vaší komunitě <bold1>název</bold1> a <bold2>avatar</bold2> možná nebudou viditelné pro ostatní uživatele po dobu až 30 minut.",
|
||||
"Join this community": "Vstoupit do komunity",
|
||||
"Leave this community": "Opustit komunitu",
|
||||
"Who can join this community?": "Kdo může vstoupit do této komunity?",
|
||||
"Everyone": "Všichni",
|
||||
"This room is not public. You will not be able to rejoin without an invite.": "Tato místnost není veřejná. Bez pozvánky nebudete moci znovu vstoupit.",
|
||||
"Can't leave Server Notices room": "Z místnosti \"Server Notices\" nejde odejit",
|
||||
"This room is used for important messages from the Homeserver, so you cannot leave it.": "Tato místnost je určena pro důležité zprávy od domácího servru, a proto z ní nemůžete odejít.",
|
||||
"Terms and Conditions": "Smluvní podmínky",
|
||||
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Chcete-li nadále používat domovský server %(homeserverDomain)s, měli byste si přečíst a odsouhlasit naše smluvní podmínky.",
|
||||
"Review terms and conditions": "Přečíst smluvní podmínky",
|
||||
"Did you know: you can use communities to filter your Riot.im experience!": "Věděli jste, že: práci s Riot.im si můžete zpříjemnit s použitím komunit!",
|
||||
"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.": "Pro nastavení filtru, přetáhněte obrázek komunity na pantel foltrování na leve straně obrazovky. Potom můžete kdykoliv kliknout na obrazek komunity na tomto panelu a Riot.im Vám bude zobrazovat jen místnosti a lidi z dané komunity.",
|
||||
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Zobrazit zařízení</showDevicesText>, <sendAnywayText>i tak odeslat</sendAnywayText> a nebo <cancelText>zrušit</cancelText>.",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Dokud si nepřečtete a neodsouhlasíte <consentLink>naše smluvní podmínky</consentLink>, nebudete moci posílat žádné zprávy.",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Vaše zpráva nebyla odeslána, protože tento domácí server dosáhl svého měsíčního limitu pro aktivní uživatele. Prosím <a>kontaktujte Vašeho administratora</a> pro další využívání služby.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Vaše zpráva nebyla odeslána, protože tento domácí server dosáhl limitu. Prosím <a>kontaktujte Vašeho administratora</a> pro další využívání služby.",
|
||||
"%(count)s of your messages have not been sent.|one": "Vaše zpráva nebyla odeslána.",
|
||||
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Znovu poslat všechny</resendText> nebo <cancelText>zrušit všechny</cancelText>. Můžete též vybrat jednotlivé zprávy pro znovu odeslání nebo zrušení.",
|
||||
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Znovu poslat zprávu</resendText> nebo <cancelText>zrušit zprávu</cancelText>.",
|
||||
"Clear filter": "Zrušit filtr",
|
||||
"Debug Logs Submission": "Odeslání ladících záznamů",
|
||||
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Jestli jste odeslali hlášení o chybě na GitHub, ladící záznamy nám pomohou problém najít. Ladicí záznamy obsahuji data o používání aplikate, která obsahují uživatelské jmeno, ID nebo aliasy navštívených místnosti a uživatelská jména dalších uživatelů. Neobsahují zprávy.",
|
||||
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Soukromí je pro nás důležité a proto neshromažďujeme osobní udaje ani udaje na zakladě, kterých by Vás bylo možne identifikovat.",
|
||||
"Learn more about how we use analytics.": "Dozvědět se více o tom, jak zpracováváme analytické údaje.",
|
||||
"No Audio Outputs detected": "Nebyly rozpoznány žádné zvukové výstupy",
|
||||
"Audio Output": "Zvukový výstup",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Pro pokračování využívání této služby prosím <a>kontaktujte Vašeho administrátora</a>.",
|
||||
"Try the app first": "Zkuste aplikaci",
|
||||
"Increase performance by only loading room members on first view": "Zvýšit výkon nahráváním členů místnosti jen poprvé",
|
||||
"Lazy loading members not supported": "Líné nahrávání členů není podporováno",
|
||||
"Lazy loading is not supported by your current homeserver.": "Líné nahrávání není podporováno současným domácím serverem."
|
||||
}
|
||||
|
|
|
@ -260,7 +260,7 @@
|
|||
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).",
|
||||
"%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für: Alle Raum-Mitglieder.",
|
||||
"%(senderName)s made future room history visible to anyone.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Alle.",
|
||||
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).",
|
||||
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf für Unbekannte sichtbar gemacht (%(visibility)s).",
|
||||
"Missing room_id in request": "Fehlende room_id in Anfrage",
|
||||
"Missing user_id in request": "Fehlende user_id in Anfrage",
|
||||
"(not supported by this browser)": "(wird von diesem Browser nicht unterstützt)",
|
||||
|
@ -442,7 +442,7 @@
|
|||
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Du kannst auch einen angepassten Idantitätsserver angeben aber dies wird typischerweise Interaktionen mit anderen Nutzern auf Basis der E-Mail-Adresse verhindern.",
|
||||
"Please check your email to continue registration.": "Bitte prüfe deine E-Mails, um mit der Registrierung fortzufahren.",
|
||||
"Token incorrect": "Token fehlerhaft",
|
||||
"Please enter the code it contains:": "Bitte gebe den Code ein, den sie enthält:",
|
||||
"Please enter the code it contains:": "Bitte gib den darin enthaltenen Code ein:",
|
||||
"powered by Matrix": "betrieben mit Matrix",
|
||||
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Wenn du keine E-Mail-Adresse angibst, wirst du nicht in der Lage sein, dein Passwort zurückzusetzen. Bist du sicher?",
|
||||
"You are registering with %(SelectedTeamName)s": "Du registrierst dich mit %(SelectedTeamName)s",
|
||||
|
@ -748,7 +748,7 @@
|
|||
"No rooms to show": "Keine anzeigbaren Räume",
|
||||
"Community Settings": "Community-Einstellungen",
|
||||
"Who would you like to add to this community?": "Wen möchtest du zu dieser Community hinzufügen?",
|
||||
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warnung: Jede Person die du einer Community hinzufügst, wird für alle die die Community-ID kennen öffentlich sichtbar sein",
|
||||
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warnung: Jede Person, die du einer Community hinzufügst, wird für alle, die die Community-ID kennen, öffentlich sichtbar sein",
|
||||
"Invite new community members": "Neue Community-Mitglieder einladen",
|
||||
"Invite to Community": "In die Community einladen",
|
||||
"Which rooms would you like to add to this community?": "Welche Räume möchtest du zu dieser Community hinzufügen?",
|
||||
|
@ -839,7 +839,7 @@
|
|||
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)shaben das Profilbild geändert",
|
||||
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)shat das Profilbild %(count)s-mal geändert",
|
||||
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)shat das Profilbild geändert",
|
||||
"%(names)s and %(count)s others are typing|one": "%(names)s und eine weitere Person schreiben",
|
||||
"%(names)s and %(count)s others are typing|one": "%(names)s und noch jemand schreiben",
|
||||
"Disinvite this user?": "Einladung für diesen Benutzer zurückziehen?",
|
||||
"Kick this user?": "Diesen Benutzer kicken?",
|
||||
"Unban this user?": "Verbannung für diesen Benutzer aufheben?",
|
||||
|
@ -915,7 +915,7 @@
|
|||
"Display your community flair in rooms configured to show it.": "Zeige deinen Community-Flair in den Räumen, die es erlauben.",
|
||||
"This homeserver doesn't offer any login flows which are supported by this client.": "Dieser Heimserver verfügt über keinen, von diesem Client unterstütztes Anmeldeverfahren.",
|
||||
"Call Failed": "Anruf fehlgeschlagen",
|
||||
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht verifizierte Geräte. Wenn du ohne sie zu verifizieren fortfährst, könnten Angreifer den Anruf mithören.",
|
||||
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht-verifizierte Geräte. Wenn du fortfährst ohne sie zu verifizieren, könnten Angreifer den Anruf mithören.",
|
||||
"Review Devices": "Geräte ansehen",
|
||||
"Call Anyway": "Trotzdem anrufen",
|
||||
"Answer Anyway": "Trotzdem annehmen",
|
||||
|
@ -929,9 +929,9 @@
|
|||
"Warning": "Warnung",
|
||||
"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.": "Es wurden Daten von einer älteren Version von Riot entdeckt. Dies wird zu Fehlern in der Ende-zu-Ende-Verschlüsselung der älteren Version geführt haben. Ende-zu-Ende verschlüsselte Nachrichten, die ausgetauscht wruden, während die ältere Version genutzt wurde, werden in dieser Version nicht entschlüsselbar sein. Es kann auch zu Fehlern mit Nachrichten führen, die mit dieser Version versendet werden. Wenn du Probleme feststellst, melde dich ab und wieder an. Um die Historie zu behalten, ex- und reimportiere deine Schlüssel.",
|
||||
"Send an encrypted reply…": "Verschlüsselte Antwort senden…",
|
||||
"Send a reply (unencrypted)…": "Antwort senden (unverschlüsselt)…",
|
||||
"Send a reply (unencrypted)…": "Unverschlüsselte Antwort senden…",
|
||||
"Send an encrypted message…": "Verschlüsselte Nachricht senden…",
|
||||
"Send a message (unencrypted)…": "Nachricht senden (unverschlüsselt)…",
|
||||
"Send a message (unencrypted)…": "Unverschlüsselte Nachricht senden…",
|
||||
"Replying": "Antwortet",
|
||||
"Minimize apps": "Apps minimieren",
|
||||
"%(count)s of your messages have not been sent.|one": "Deine Nachricht wurde nicht gesendet.",
|
||||
|
@ -950,7 +950,7 @@
|
|||
"Community IDs cannot be empty.": "Community-IDs können nicht leer sein.",
|
||||
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Geräte anzeigen</showDevicesText>, <sendAnywayText>trotzdem senden</sendAnywayText> oder <cancelText>abbrechen</cancelText>.",
|
||||
"Learn more about how we use analytics.": "Lerne mehr darüber, wie wir die Analysedaten nutzen.",
|
||||
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen sowie Raum, Nutzer oder Gruppen-ID enthalten, werden diese Daten entfernt bevor sie an den Server gesendet werden.",
|
||||
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum, Nutzer oder Gruppen-ID enthalten, werden diese Daten entfernt bevor sie an den Server gesendet werden.",
|
||||
"Whether or not you're logged in (we don't record your user name)": "Ob oder ob du nicht angemeldet bist (wir zeichnen deinen Benutzernamen nicht auf)",
|
||||
"Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn es der Fall ist",
|
||||
"<a>In reply to</a> <pill>": "<a>Als Antwort auf</a> <pill>",
|
||||
|
@ -1149,7 +1149,7 @@
|
|||
"Always show encryption icons": "Immer Verschlüsselungssymbole zeigen",
|
||||
"At this time it is not possible to reply with a file so this will be sent without being a reply.": "Aktuell ist es nicht möglich mit einer Datei zu antworten, sodass diese gesendet wird ohne eine Antwort zu sein.",
|
||||
"Unable to reply": "Antworten nicht möglich",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Das Ereignis auf das geantwortet wurde könnte nicht geladen werden, da es entweder nicht existiert oder du keine Berechtigung hast, dieses anzusehen.",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Das Ereignis auf das geantwortet wurde konnte nicht geladen werden. Entweder es existiert nicht oder du hast keine Berechtigung, dieses anzusehen.",
|
||||
"Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot-Fehler werden auf GitHub festgehalten: <a>Erzeuge ein GitHub-Issue</a>.",
|
||||
"Log out and remove encryption keys?": "Abmelden und alle Verschlüsselungs-Schlüssel löschen?",
|
||||
"Send Logs": "Sende Protokoll",
|
||||
|
@ -1165,8 +1165,8 @@
|
|||
"Reload widget": "Widget neu laden",
|
||||
"To notify everyone in the room, you must be a": "Notwendiges Berechtigungslevel, um jeden im Raum zu benachrichten:",
|
||||
"Muted Users": "Stummgeschaltete Benutzer",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Bitte helfe uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen (bitte beachte auch unsere <PolicyLink>Cookie-Richtlinie</PolicyLink>).",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Bitte helfe uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen.",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Bitte hilf uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen (bitte beachte auch unsere <PolicyLink>Cookie-Richtlinie</PolicyLink>).",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Bitte hilf uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen.",
|
||||
"Yes, I want to help!": "Ja, ich möchte helfen!",
|
||||
"Warning: This widget might use cookies.": "Warnung: Diese Widget mag Cookies verwenden.",
|
||||
"Failed to indicate account erasure": "Fehler beim Signalisieren der Account-Löschung",
|
||||
|
@ -1207,8 +1207,64 @@
|
|||
"A call is already in progress!": "Ein Gespräch läuft bereits!",
|
||||
"You have no historical rooms": "Du hast keine historischen Räume",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Du kannst keine Nachrichten senden bis du die <consentLink>unsere Geschläftsbedingungen</consentLink> gelesen und akzeptiert hast.",
|
||||
"Show empty room list headings": "Zeite leere Raumlist-Köpfe",
|
||||
"Show empty room list headings": "Zeige leere Raumlist-Köpfe",
|
||||
"Demote yourself?": "Selbst zurückstufen?",
|
||||
"Demote": "Zurückstufen",
|
||||
"This event could not be displayed": "Dieses Ereignis konnte nicht angezeigt werden"
|
||||
"This event could not be displayed": "Dieses Ereignis konnte nicht angezeigt werden",
|
||||
"A conference call could not be started because the intgrations server is not available": "Ein Konferenzgespräch konnte nicht gestartet werden, da der Integrations-Server nicht verfügbar ist",
|
||||
"A call is currently being placed!": "Ein Anruf wurde schon gestartet!",
|
||||
"Permission Required": "Berechtigung benötigt",
|
||||
"You do not have permission to start a conference call in this room": "Du hast keine Berechtigung um ein Konferenzgespräch in diesem Raum zu starten",
|
||||
"deleted": "gelöscht",
|
||||
"underlined": "unterstrichen",
|
||||
"bulleted-list": "Liste mit Punkten",
|
||||
"numbered-list": "Liste mit Nummern",
|
||||
"Failed to remove widget": "Widget konnte nicht entfernt werden",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Ein Fehler trat auf, während versucht wurde das Widget aus diesem Raum zu entfernen",
|
||||
"inline-code": "Quellcode in der Zeile",
|
||||
"block-quote": "Quellcode im Block",
|
||||
"This homeserver has hit its Monthly Active User limit": "Dieser Heimserver hat sein Limit für monatlich aktive Nutzer erreicht",
|
||||
"Please contact your service administrator to continue using this service.": "Bitte kontaktiere deinen Administrator um diesen Dienst weiter zu nutzen.",
|
||||
"System Alerts": "System-Benachrichtigung",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Der Server hat sein monatliches Nutzerlimit erreicht. Bitte kontaktiere deinen Administrator, um den Service weiter nutzen zu können.",
|
||||
"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.": "Deine Nachricht konnte nicht verschickt werden, weil der Homeserver sein monatliches Nutzerlimit erreicht hat. Bitte kontaktiere deine Administrator, um den Service weiter nutzen zu können.",
|
||||
"Internal room ID: ": "Interne Raum-ID: ",
|
||||
"Room version number: ": "Raum-Versionsnummer: ",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "Dieser Heimserver hat sein monatliches Limit an aktiven Benutzern erreicht. Bitte <a>kontaktiere deinen Systemadministrator</a> um mit der Nutzung dieses Services fortzufahren.",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "Dieser Heimserver hat sein monatliches Limit an aktiven Benutzern erreicht. Bitte <a>kontaktiere deinen Systemadministrator</a> um dieses Limit zu erhöhen.",
|
||||
"There is a known vulnerability affecting this room.": "Es gibt eine bekannte Schwachstelle, die diesen Raum betrifft.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Dieser Raum ist verwundbar gegenüber bösartiger Veränderung des Raum-Status.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Klicke hier um den Raum zur letzten Raum-Version aufzurüsten und sicherzustellen, dass die Raum-Integrität gewahrt bleibt.",
|
||||
"Only room administrators will see this warning": "Nur Raum-Administratoren werden diese Nachricht sehen",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Bitte <a>kontaktiere deinen Systemadministrator</a> um diesen Dienst weiter zu nutzen.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Dieser Heimserver hat sein Limit an monatlich aktiven Nutzern erreicht.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Dieser Heimserver hat einen seiner Ressourcen-Limits überschritten.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Bitte <a>kontaktiere deinen Systemadministrator</a> um dieses Limit zu erhöht zu bekommen.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Dieser Heimserver hat sein Limit an monatlich aktiven Nutzern erreicht, sodass <b>einige Nutzer sich nicht anmelden können</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Dieser Heimserver hat einen seiner Ressourcen-Limits überschritten, sodass <b>einige Benutzer nicht in der Lage sind sich anzumelden</b>.",
|
||||
"Upgrade Room Version": "Raum-Version aufrüsten",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Um diesen Raum aufzurüsten, wird der aktuelle geschlossen und ein neuer an seiner Stelle erstellt. Um den Raum-Mitgliedern die bestmögliche Erfahrung zu bieten, werden wir:",
|
||||
"Create a new room with the same name, description and avatar": "Einen neuen Raum mit demselben Namen, Beschreibung und Profilbild erstellen",
|
||||
"Update any local room aliases to point to the new room": "Alle lokalen Raum-Aliase aktualisieren, damit sie auf den neuen Raum zeigen",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Nutzern verbieten in dem Raum mit der alten Version zu schreiben und eine Nachricht senden, die den Nutzern rät in den neuen Raum zu wechseln",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Zu Beginn des neuen Raumes einen Link zum alten Raum setzen, damit Personen die alten Nachrichten sehen können",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver sein Limit an monatlich aktiven Benutzern erreicht hat. Bitte <a>kontaktiere deinen Systemadministrator</a> um diesen Dienst weiter zu nutzen.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver ein Ressourcen-Limit erreicht hat. Bitte <a>kontaktiere deinen Systemadministrator</a> um diesen Dienst weiter zu nutzen.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Bitte <a>kontaktiere deinen Systemadministrator</a> um diesen Dienst weiter zu nutzen.",
|
||||
"Increase performance by only loading room members on first view": "Verbessere Performanz, indem Raum-Mitglieder erst beim ersten Ansehen geladen werden",
|
||||
"Lazy loading members not supported": "Verzögertes Laden von Mitgliedern nicht unterstützt",
|
||||
"Lazy loading is not supported by your current homeserver.": "Verzögertes Laden wird von deinem aktuellen Heimserver.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Sorry, dein Homeserver ist zu alt, um an diesem Raum teilzunehmen.",
|
||||
"Please contact your homeserver administrator.": "Bitte setze dich mit dem Administrator deines Homeservers in Verbindung.",
|
||||
"Legal": "Rechtliches",
|
||||
"This room has been replaced and is no longer active.": "Dieser Raum wurde ersetzt und ist nicht länger aktiv.",
|
||||
"The conversation continues here.": "Die Konversation wird hier fortgesetzt.",
|
||||
"Upgrade room to version %(ver)s": "Den Raum zur Version %(ver)s aufrüsten",
|
||||
"This room is a continuation of another conversation.": "Dieser Raum ist eine Fortsetzung einer anderen Konversation.",
|
||||
"Click here to see older messages.": "Klicke hier um ältere Nachrichten zu sehen.",
|
||||
"Failed to upgrade room": "Konnte Raum nicht aufrüsten",
|
||||
"The room upgrade could not be completed": "Die Raum-Aufrüstung konnte nicht fertiggestellt werden",
|
||||
"Upgrade this room to version %(version)s": "Diesen Raum zur Version %(version)s aufrüsten",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "Erzwingt, dass die aktuell ausgehende Gruppen-Sitzung in einem verschlüsseltem Raum verworfen wird",
|
||||
"Error Discarding Session": "Sitzung konnte nicht verworfen werden"
|
||||
}
|
||||
|
|
|
@ -87,6 +87,9 @@
|
|||
"Unable to enable Notifications": "Unable to enable Notifications",
|
||||
"This email address was not found": "This email address was not found",
|
||||
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.",
|
||||
"Registration Required": "Registration Required",
|
||||
"You need to register to do this. Would you like to register now?": "You need to register to do this. Would you like to register now?",
|
||||
"Register": "Register",
|
||||
"Default": "Default",
|
||||
"Restricted": "Restricted",
|
||||
"Moderator": "Moderator",
|
||||
|
@ -145,6 +148,7 @@
|
|||
"Verified key": "Verified key",
|
||||
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.",
|
||||
"Displays action": "Displays action",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "Forces the current outbound group session in an encrypted room to be discarded",
|
||||
"Unrecognised command:": "Unrecognised command:",
|
||||
"Reason": "Reason",
|
||||
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.",
|
||||
|
@ -200,11 +204,18 @@
|
|||
"Send anyway": "Send anyway",
|
||||
"Send": "Send",
|
||||
"Unnamed Room": "Unnamed Room",
|
||||
"This homeserver has hit its Monthly Active User limit.": "This homeserver has hit its Monthly Active User limit.",
|
||||
"This homeserver has exceeded one of its resource limits.": "This homeserver has exceeded one of its resource limits.",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Please <a>contact your service administrator</a> to continue using the service.",
|
||||
"Unable to connect to Homeserver. Retrying...": "Unable to connect to Homeserver. Retrying...",
|
||||
"Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
|
||||
"Not a valid Riot keyfile": "Not a valid Riot keyfile",
|
||||
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Sorry, your homeserver is too old to participate in this room.",
|
||||
"Please contact your homeserver administrator.": "Please contact your homeserver administrator.",
|
||||
"Failed to join room": "Failed to join room",
|
||||
"Message Pinning": "Message Pinning",
|
||||
"Increase performance by only loading room members on first view": "Increase performance by only loading room members on first view",
|
||||
"Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing",
|
||||
"Use compact timeline layout": "Use compact timeline layout",
|
||||
"Hide removed messages": "Hide removed messages",
|
||||
|
@ -404,6 +415,8 @@
|
|||
"Send a reply (unencrypted)…": "Send a reply (unencrypted)…",
|
||||
"Send an encrypted message…": "Send an encrypted message…",
|
||||
"Send a message (unencrypted)…": "Send a message (unencrypted)…",
|
||||
"This room has been replaced and is no longer active.": "This room has been replaced and is no longer active.",
|
||||
"The conversation continues here.": "The conversation continues here.",
|
||||
"You do not have permission to post to this room": "You do not have permission to post to this room",
|
||||
"Turn Markdown on": "Turn Markdown on",
|
||||
"Turn Markdown off": "Turn Markdown off",
|
||||
|
@ -466,6 +479,7 @@
|
|||
"Low priority": "Low priority",
|
||||
"You have no historical rooms": "You have no historical rooms",
|
||||
"Historical": "Historical",
|
||||
"System Alerts": "System Alerts",
|
||||
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.",
|
||||
"This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:",
|
||||
"You may wish to login with a different account, or add this email to this account.": "You may wish to login with a different account, or add this email to this account.",
|
||||
|
@ -527,6 +541,7 @@
|
|||
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
|
||||
"Click here to fix": "Click here to fix",
|
||||
"To send events of type <eventType/>, you must be a": "To send events of type <eventType/>, you must be a",
|
||||
"Upgrade room to version %(ver)s": "Upgrade room to version %(ver)s",
|
||||
"Who can access this room?": "Who can access this room?",
|
||||
"Only people who have been invited": "Only people who have been invited",
|
||||
"Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests",
|
||||
|
@ -539,8 +554,13 @@
|
|||
"Members only (since they joined)": "Members only (since they joined)",
|
||||
"Permissions": "Permissions",
|
||||
"Advanced": "Advanced",
|
||||
"This room's internal ID is": "This room's internal ID is",
|
||||
"Internal room ID: ": "Internal room ID: ",
|
||||
"Room version number: ": "Room version number: ",
|
||||
"Add a topic": "Add a topic",
|
||||
"There is a known vulnerability affecting this room.": "There is a known vulnerability affecting this room.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "This room version is vulnerable to malicious modification of room state.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Click here to upgrade to the latest room version and ensure room integrity is protected.",
|
||||
"Only room administrators will see this warning": "Only room administrators will see this warning",
|
||||
"Search…": "Search…",
|
||||
"This Room": "This Room",
|
||||
"All Rooms": "All Rooms",
|
||||
|
@ -597,6 +617,8 @@
|
|||
"%(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 <img/>": "%(senderDisplayName)s changed the room avatar to <img/>",
|
||||
"This room is a continuation of another conversation.": "This room is a continuation of another conversation.",
|
||||
"Click here to see older messages.": "Click here to see older messages.",
|
||||
"Copied!": "Copied!",
|
||||
"Failed to copy": "Failed to copy",
|
||||
"Add an Integration": "Add an Integration",
|
||||
|
@ -638,7 +660,6 @@
|
|||
"Email address (optional)": "Email address (optional)",
|
||||
"You are registering with %(SelectedTeamName)s": "You are registering with %(SelectedTeamName)s",
|
||||
"Mobile phone number (optional)": "Mobile phone number (optional)",
|
||||
"Register": "Register",
|
||||
"Default server": "Default server",
|
||||
"Custom server": "Custom server",
|
||||
"Home server URL": "Home server URL",
|
||||
|
@ -677,7 +698,9 @@
|
|||
"A new version of Riot is available.": "A new version of Riot is available.",
|
||||
"To return to your account in future you need to <u>set a password</u>": "To return to your account in future you need to <u>set a password</u>",
|
||||
"Set Password": "Set Password",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Please <a>contact your service administrator</a> to get this limit increased.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.",
|
||||
"Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).",
|
||||
"Checking for an update...": "Checking for an update...",
|
||||
"No update available.": "No update available.",
|
||||
|
@ -854,6 +877,15 @@
|
|||
"Ignore request": "Ignore request",
|
||||
"Loading device info...": "Loading device info...",
|
||||
"Encryption key request": "Encryption key request",
|
||||
"Failed to upgrade room": "Failed to upgrade room",
|
||||
"The room upgrade could not be completed": "The room upgrade could not be completed",
|
||||
"Upgrade this room to version %(version)s": "Upgrade this room to version %(version)s",
|
||||
"Upgrade Room Version": "Upgrade Room Version",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:",
|
||||
"Create a new room with the same name, description and avatar": "Create a new room with the same name, description and avatar",
|
||||
"Update any local room aliases to point to the new room": "Update any local room aliases to point to the new room",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Put a link back to the old room at the start of the new room so people can see old messages",
|
||||
"Sign out": "Sign out",
|
||||
"Log out and remove encryption keys?": "Log out and remove encryption keys?",
|
||||
"Clear Storage and Sign Out": "Clear Storage and Sign Out",
|
||||
|
@ -1036,7 +1068,8 @@
|
|||
"Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",
|
||||
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.",
|
||||
"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.": "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.",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.",
|
||||
"%(count)s of your messages have not been sent.|other": "Some of your messages have not been sent.",
|
||||
"%(count)s of your messages have not been sent.|one": "Your message was not sent.",
|
||||
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.",
|
||||
|
@ -1104,7 +1137,10 @@
|
|||
"Labs": "Labs",
|
||||
"These are experimental features that may break in unexpected ways": "These are experimental features that may break in unexpected ways",
|
||||
"Use with caution": "Use with caution",
|
||||
"Lazy loading members not supported": "Lazy loading members not supported",
|
||||
"Lazy loading is not supported by your current homeserver.": "Lazy loading is not supported by your current homeserver.",
|
||||
"Deactivate my account": "Deactivate my account",
|
||||
"Legal": "Legal",
|
||||
"Clear Cache": "Clear Cache",
|
||||
"Clear Cache and Reload": "Clear Cache and Reload",
|
||||
"Updates": "Updates",
|
||||
|
@ -1154,8 +1190,7 @@
|
|||
"Send Reset Email": "Send Reset Email",
|
||||
"Create an account": "Create an account",
|
||||
"This Home Server does not support login using email address.": "This Home Server does not support login using email address.",
|
||||
"This homeserver has hit its Monthly Active User limit": "This homeserver has hit its Monthly Active User limit",
|
||||
"Please contact your service administrator to continue using this service.": "Please contact your service administrator to continue using this service.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Please <a>contact your service administrator</a> to continue using this service.",
|
||||
"Incorrect username and/or password.": "Incorrect username and/or password.",
|
||||
"Please note you are logging into the %(hs)s server, not matrix.org.": "Please note you are logging into the %(hs)s server, not matrix.org.",
|
||||
"Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
|
||||
|
@ -1169,6 +1204,7 @@
|
|||
"Failed to fetch avatar URL": "Failed to fetch avatar URL",
|
||||
"Set a display name:": "Set a display name:",
|
||||
"Upload an avatar:": "Upload an avatar:",
|
||||
"Unable to query for supported registration methods": "Unable to query for supported registration methods",
|
||||
"This server does not support authentication with a phone number.": "This server does not support authentication with a phone number.",
|
||||
"Missing password.": "Missing password.",
|
||||
"Passwords don't match.": "Passwords don't match.",
|
||||
|
@ -1211,6 +1247,13 @@
|
|||
"Import room keys": "Import room keys",
|
||||
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.",
|
||||
"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.",
|
||||
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.",
|
||||
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.",
|
||||
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.",
|
||||
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.",
|
||||
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.",
|
||||
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.",
|
||||
"%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.",
|
||||
"File to import": "File to import",
|
||||
"Import": "Import",
|
||||
"Failed to set direct chat tag": "Failed to set direct chat tag",
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1209,5 +1209,62 @@
|
|||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Ezin duzu mezurik bidali <consentLink>gure termino eta baldintzak</consentLink> irakurri eta onartu arte.",
|
||||
"Show empty room list headings": "Erakutsi gela hutsen zerrenda-goiburuak",
|
||||
"Demote yourself?": "Jaitsi zure burua mailaz?",
|
||||
"Demote": "Jaitzi mailaz"
|
||||
"Demote": "Jaitzi mailaz",
|
||||
"A conference call could not be started because the intgrations server is not available": "Ezin izan da konferentzia dei bat hasi integrazio zerbitzaria ez dagoelako eskuragarri",
|
||||
"A call is currently being placed!": "Dei bat ezartzen ari da orain!",
|
||||
"Permission Required": "Baimena beharrezkoa",
|
||||
"You do not have permission to start a conference call in this room": "Ez duzu baimenik konferentzia dei bat hasteko gela honetan",
|
||||
"This event could not be displayed": "Ezin izan da gertakari hau bistaratu",
|
||||
"deleted": "ezabatuta",
|
||||
"underlined": "azpimarratuta",
|
||||
"inline-code": "lineako kodea",
|
||||
"block-quote": "aipamen blokea",
|
||||
"bulleted-list": "buletdun zerrenda",
|
||||
"numbered-list": "zenbakidun zerrenda",
|
||||
"Failed to remove widget": "Huts egin du trepeta kentzean",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Trepeta gelatik kentzen saiatzean errore bat gertatu da",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Hasiera zerbitzari honek bere hilabeteko erabiltzaile aktiboen muga jo du. Jarri kontaktuan zerbitzuaren administratzailearekin zerbitzua erabiltzen jarraitzeko.",
|
||||
"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.": "Zure mezua ez da bidali hasiera zerbitzari honek bere hilabeteko erabiltzaile aktiboen muga jo duelako. Jarri kontaktuan zerbitzuaren administratzailearekin zerbitzua erabiltzen jarraitzeko.",
|
||||
"This homeserver has hit its Monthly Active User limit": "Hasiera zerbitzari honek bere hilabeteko erabiltzaile aktiboen muga jo du",
|
||||
"Please contact your service administrator to continue using this service.": "Jarri kontaktuan zerbitzuaren administratzailearekin zerbitzua erabiltzen jarraitzeko.",
|
||||
"System Alerts": "Sistemaren alertak",
|
||||
"Internal room ID: ": "Gelaren barne IDa: ",
|
||||
"Room version number: ": "Gelaren bertsio zenbakia: ",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "Hasiera zerbitzari honek hileko erabiltzaile aktiboen muga jo du. <a>Jarri zerbitzuaren administratzailearekin kontaktuan</a> zerbitzua erabiltzen jarraitzeko.",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "Hasiera zerbitzari honek hileko erabiltzaile aktiboen muga jo du eta ezin izango duzu saioa hasi. <a>Jarri zerbitzuaren administratzailearekin kontaktuan</a> muga hau handitu dezan.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Zure hasiera-zerbitzaria zaharregia da gela honetan parte hartzeko.",
|
||||
"Please contact your homeserver administrator.": "Jarri zure hasiera-zerbitzariaren administratzailearekin kontaktuan.",
|
||||
"Increase performance by only loading room members on first view": "Hobetu errendimendua gelako kideak lehen ikustaldian besterik ez kargatuz",
|
||||
"This room has been replaced and is no longer active.": "Gela hau ordeztu da eta ez dago aktibo jada.",
|
||||
"The conversation continues here.": "Elkarrizketak hemen darrai.",
|
||||
"Upgrade room to version %(ver)s": "Eguneratu gela %(ver)s bertsiora",
|
||||
"There is a known vulnerability affecting this room.": "Gela honi eragiten dion ahulezia ezagun bat dago.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Gela bertsio honek gelaren egoera gaiztoki aldatzea baimentzen duen ahulezia bat du.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Sakatu hemen gela azken bertsiora eguneratzeko eta gelaren osotasuna babestuta dagoela egiaztatzeko.",
|
||||
"Only room administrators will see this warning": "Gelaren administratzaileek besterik ez dute abisu hau ikusiko",
|
||||
"This room is a continuation of another conversation.": "Gela hau aurreko elkarrizketa baten jarraipena da.",
|
||||
"Click here to see older messages.": "Egin klik hemen mezu zaharrak ikusteko.",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "<a>Jarri kontaktuan zerbitzuaren administratzailearekin</a> zerbitzu hau erabiltzen jarraitzeko.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Hasiera zerbitzari honek bere hilabeteko erabiltzaile aktiboen muga gainditu du.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Hasiera zerbitzari honek bere baliabide mugetako bat gainditu du.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "<a>Jarri kontaktuan zerbitzuaren administratzailearekin</a> muga hau areagotzeko.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Hasiera zerbitzari honek hilabeteko erabiltzaile aktiboen muga jo du <b>erabiltzaile batzuk ezin izango dute saioa hasi</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Hasiera zerbitzari honek bere baliabide mugetako bat jo du <b>erabiltzaile batzuk ezin izango dute saioa hasi</b>.",
|
||||
"Failed to upgrade room": "Huts egin du gela eguneratzea",
|
||||
"The room upgrade could not be completed": "Ezin izan da gelaren eguneraketa osatu",
|
||||
"Upgrade this room to version %(version)s": "Eguneratu gela hau %(version)s bertsiora",
|
||||
"Upgrade Room Version": "Eguneratu gelaren bertsioa",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Gela hau eguneratzeak instantzian uneko gela itxi eta berri bat sortzea dakar. Erabiltzaileei ahalik eta esperientzia onena emateko hau egingo dugu:",
|
||||
"Create a new room with the same name, description and avatar": "Izen, deskripzio eta abatar bereko beste gela bat sortu",
|
||||
"Update any local room aliases to point to the new room": "Tokiko gelaren ezizen guztiak gela berrira apuntatu ditzaten eguneratu",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Erabiltzaileei gelaren bertsio zaharrean hitz egiten jarraitzea eragotzi, eta erabiltzaileei gela berrira mugitzea aholkatzeko mezu bat bidali",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Gela berriaren hasieran gela zaharrera esteka bat jarri jendeak mezu zaharrak ikus ditzan",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Zure mezua ez da bidali zure hasiera zerbitzariak hilabeteko erabiltzaile aktiboen muga jo duelako. <a>Jarri kontaktuan zerbitzuaren administratzailearekin</a> zerbitzua erabiltzen jarraitzeko.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Zure mezua ez da bidali zure hasiera zerbitzariak baliabide mugaren bat jo duelako. <a>Jarri kontaktuan zerbitzuaren administratzailearekin</a> zerbitzua erabiltzen jarraitzeko.",
|
||||
"Lazy loading members not supported": "Kideen karga alferrerako euskarririk ez",
|
||||
"Lazy loading is not supported by your current homeserver.": "Zure hasiera zerbitzariak ez du onartzen karga alferra.",
|
||||
"Legal": "Legezkoa",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "<a>Jarri kontaktuan zerbitzuaren administratzailearekin</a> zerbitzu hau erabiltzen jarraitzeko.",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "Uneko irteerako talde saioa zifratutako gela batean baztertzera behartzen du",
|
||||
"Error Discarding Session": "Errorea saioa baztertzean"
|
||||
}
|
||||
|
|
|
@ -1087,7 +1087,7 @@
|
|||
"Downloading update...": "Mise à jour en cours de téléchargement...",
|
||||
"State Key": "Clé d'état",
|
||||
"Failed to send custom event.": "Échec de l'envoi de l'événement personnalisé.",
|
||||
"What's new?": "Nouveautés ?",
|
||||
"What's new?": "Nouveautés",
|
||||
"Notify me for anything else": "Me notifier pour tout le reste",
|
||||
"View Source": "Voir la source",
|
||||
"Can't update user notification settings": "Impossible de mettre à jour les paramètres de notification de l'utilisateur",
|
||||
|
@ -1158,7 +1158,7 @@
|
|||
"Unable to reply": "Impossible de répondre",
|
||||
"At this time it is not possible to reply with an emote.": "Pour le moment il n'est pas possible de répondre avec un émoji.",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossible de charger l'événement auquel il a été répondu, soit il n'existe pas, soit vous n'avez pas l'autorisation de le voir.",
|
||||
"Collapse Reply Thread": "Dévoiler le fil de réponse",
|
||||
"Collapse Reply Thread": "Masquer le fil de réponse",
|
||||
"Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge",
|
||||
"Send analytics data": "Envoyer les données analytiques",
|
||||
"Muted Users": "Utilisateurs ignorés",
|
||||
|
@ -1222,5 +1222,52 @@
|
|||
"You do not have permission to start a conference call in this room": "Vous n'avez pas la permission de lancer un appel en téléconférence dans ce salon",
|
||||
"A call is currently being placed!": "Un appel est en cours !",
|
||||
"Failed to remove widget": "Échec de la suppression du widget",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Une erreur est survenue lors de la suppression du widget du salon"
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Une erreur est survenue lors de la suppression du widget du salon",
|
||||
"This homeserver has hit its Monthly Active User limit": "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs",
|
||||
"Please contact your service administrator to continue using this service.": "Veuillez contacter l'administrateur de votre service pour continuer à l'utiliser.",
|
||||
"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.": "Votre message n'a pas été envoyé car ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs. Veuillez contacter l'administrateur de votre service pour continuer à l'utiliser.",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs. Veuillez contacter l'administrateur de votre service pour continuer à l'utiliser.",
|
||||
"System Alerts": "Alertes système",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs. Veuillez <a>contacter l'administrateur de votre service</a> pour continuer à l'utiliser.",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs donc certains utilisateurs ne pourront pas se connecter. Veuillez <a>contacter l'administrateur de votre service</a> pour augmenter cette limite.",
|
||||
"Internal room ID: ": "Identifiant interne du salon : ",
|
||||
"Room version number: ": "Numéro de version du salon : ",
|
||||
"There is a known vulnerability affecting this room.": "Ce salon est touché par une faille de sécurité connue.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Ce salon est vulnérable à la modification malveillante de l'état du salon.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Cliquer ici pour mettre le salon à niveau vers la dernière version et s'assurer que l'intégrité du salon est protégée.",
|
||||
"Only room administrators will see this warning": "Seuls les administrateurs du salon verront cet avertissement",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Veuillez <a>contacter l'administrateur de votre service</a> pour continuer à l'utiliser.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Ce serveur d'accueil a dépassé une de ses limites de ressources.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Veuillez <a>contacter l'administrateur de votre service</a> pour augmenter cette limite.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs donc <b>certains utilisateurs ne pourront pas se connecter</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Ce serveur d'accueil a atteint une de ses limites de ressources donc <b>certains utilisateurs ne pourront pas se connecter</b>.",
|
||||
"Upgrade Room Version": "Mettre à niveau la version du salon",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "La mise à niveau de ce salon nécessite la clôture de l'instance en cours du salon et la création d'un nouveau salon à la place. Pour donner la meilleure expérience possible aux participants, nous allons :",
|
||||
"Create a new room with the same name, description and avatar": "Créer un salon avec le même nom, la même description et le même avatar",
|
||||
"Update any local room aliases to point to the new room": "Mettre à jour tous les alias du salon locaux pour qu'ils dirigent vers le nouveau salon",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Empêcher les utilisateurs de discuter dans l'ancienne version du salon et envoyer un message conseillant aux nouveaux utilisateurs d'aller dans le nouveau salon",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Fournir un lien vers l'ancien salon au début du nouveau salon pour que l'on puisse voir les vieux messages",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Votre message n'a pas été envoyé car le serveur d'accueil a atteint sa limite mensuelle d'utilisateurs. Veuillez <a>contacter l'administrateur de votre service</a> pour continuer à l'utiliser.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Votre message n'a pas été envoyé car ce serveur d'accueil a dépassé une de ses limites de ressources. Veuillez <a>contacter l'administrateur de votre service</a> pour continuer à l'utiliser.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Veuillez <a>contacter l'administrateur de votre service</a> pour continuer à l'utiliser.",
|
||||
"Increase performance by only loading room members on first view": "Améliorer les performances en ne chargeant les participants des salons qu'au premier affichage",
|
||||
"Lazy loading members not supported": "La chargement différé des participants n'est pas pris en charge",
|
||||
"Lazy loading is not supported by your current homeserver.": "Le chargement différé n'est pas pris en charge par votre serveur d'accueil actuel.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Désolé, votre serveur d'accueil est trop vieux pour participer à ce salon.",
|
||||
"Please contact your homeserver administrator.": "Veuillez contacter l'administrateur de votre serveur d'accueil.",
|
||||
"Legal": "Légal",
|
||||
"This room has been replaced and is no longer active.": "Ce salon a été remplacé et n'est plus actif.",
|
||||
"The conversation continues here.": "La discussion continue ici.",
|
||||
"Upgrade room to version %(ver)s": "Mettre à niveau le salon vers la version %(ver)s",
|
||||
"This room is a continuation of another conversation.": "Ce salon est la suite d'une autre discussion.",
|
||||
"Click here to see older messages.": "Cliquer ici pour voir les vieux messages.",
|
||||
"Failed to upgrade room": "Échec de la mise à niveau du salon",
|
||||
"The room upgrade could not be completed": "La mise à niveau du salon n'a pas pu être effectuée",
|
||||
"Upgrade this room to version %(version)s": "Mettre à niveau ce salon vers la version %(version)s",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "Force la session de groupe sortante actuelle dans un salon chiffré à être rejetée",
|
||||
"Error Discarding Session": "Erreur lors du rejet de la session",
|
||||
"Registration Required": "Enregistrement nécessaire",
|
||||
"You need to register to do this. Would you like to register now?": "Vous devez vous enregistrer pour faire cela. Voulez-vous créer un compte maintenant ?",
|
||||
"Unable to query for supported registration methods": "Impossible de demander les méthodes d'enregistrement prises en charge"
|
||||
}
|
||||
|
|
|
@ -1219,5 +1219,26 @@
|
|||
"The user name field must not be blank.": "O campo de nome de usuario non pode quedar en branco.",
|
||||
"The phone number field must not be blank.": "O número de teléfono non pode quedar en branco.",
|
||||
"The password field must not be blank.": "O campo do contrasinal non pode quedar en branco.",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Non vai poder enviar mensaxes ata que revise e acepte <consentLink>os nosos termos e condicións</consentLink>."
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Non vai poder enviar mensaxes ata que revise e acepte <consentLink>os nosos termos e condicións</consentLink>.",
|
||||
"A call is currently being placed!": "Xa se estableceu a chamada!",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Lametámolo, o seu servidor de inicio é vello de máis para participar en esta sala.",
|
||||
"Please contact your homeserver administrator.": "Por favor, contacte coa administración do seu servidor.",
|
||||
"Increase performance by only loading room members on first view": "Aumente o rendemento cargando só membros da sala na vista inicial",
|
||||
"System Alerts": "Alertas do Sistema",
|
||||
"Internal room ID: ": "ID interno da sala: ",
|
||||
"Room version number: ": "Número de versión da sala: ",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Por favor <a>contacte coa administración do servizo</a> para seguir utilizando o servizo.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Este servidor acadou o límite mensual de usuarias activas.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Este servidor excedeu un dos seus límites de recursos.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Por favor <a>contacte coa administración do servizo</a> para incrementar este límite.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Este servidor acadou o Límite Mensual de usuarias activas polo que <b>algunhas usuarias non poderán conectar</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Este servidor excedeu un dos límites de recursos polo que <b>algunhas usuarias no poderán conectar</b>.",
|
||||
"Failed to remove widget": "Fallo ao eliminar o widget",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Algo fallou mentras se intentaba eliminar o widget da sala",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> 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 <a>contacte coa administración do servizo</a> para continuar utilizando o servizo.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "A súa mensaxe non foi enviada porque o servidor superou o límite de recursos. Por favor <a>contacte coa administración do servizo</a> para continuar utilizando o servizo.",
|
||||
"Lazy loading members not supported": "A cargar preguiceira de membros non está soportada",
|
||||
"Lazy loading is not supported by your current homeserver.": "A carga preguiceira non está soportada polo servidor actual.",
|
||||
"Legal": "Legal",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Por favor <a>contacte coa administración do servizo</a> para continuar utilizando o servizo."
|
||||
}
|
||||
|
|
|
@ -71,8 +71,8 @@
|
|||
"Blacklisted": "Fekete listára téve",
|
||||
"Bulk Options": "Tömeges beállítások",
|
||||
"Call Timeout": "Hívás időtúllépés",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a saját szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>saját szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
|
||||
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a Matrix szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>Matrix szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
|
||||
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nem lehet csatlakozni a Matrix szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.",
|
||||
"Can't load user settings": "A felhasználói beállítások nem tölthetők be",
|
||||
"Change Password": "Jelszó megváltoztatása",
|
||||
"%(senderName)s changed their profile picture.": "%(senderName)s megváltoztatta a profil képét.",
|
||||
|
@ -156,7 +156,7 @@
|
|||
"Enter Code": "Kód megadása",
|
||||
"Enter passphrase": "Jelmondat megadása",
|
||||
"Error decrypting attachment": "Csatolmány visszafejtése sikertelen",
|
||||
"Error: Problem communicating with the given homeserver.": "Hiba: Probléma van az saját szerverrel való kommunikációval.",
|
||||
"Error: Problem communicating with the given homeserver.": "Hiba: Probléma van a Matrix szerverrel való kommunikációval.",
|
||||
"Event information": "Esemény információ",
|
||||
"Existing Call": "Hívás folyamatban",
|
||||
"Export": "Mentés",
|
||||
|
@ -191,14 +191,14 @@
|
|||
"For security, this session has been signed out. Please sign in again.": "A biztonság érdekében ez a kapcsolat le lesz bontva. Légy szíves jelentkezz be újra.",
|
||||
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "A biztonság érdekében a kilépéskor a ponttól pontig való (E2E) titkosításhoz szükséges kulcsok törlésre kerülnek a böngészőből. Ha a régi üzeneteket továbbra is el szeretnéd olvasni, kérlek mentsed ki a szobákhoz tartozó kulcsot.",
|
||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s",
|
||||
"Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a Saját szerveren.",
|
||||
"Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a Matrix szerveren.",
|
||||
"Guests cannot join this room even if explicitly invited.": "Vendégek akkor sem csatlakozhatnak ehhez a szobához ha külön meghívók kaptak.",
|
||||
"Hangup": "Megszakít",
|
||||
"Hide read receipts": "Olvasási visszajelzés elrejtése",
|
||||
"Hide Text Formatting Toolbar": "Szövegformázási menü elrejtése",
|
||||
"Historical": "Archív",
|
||||
"Home": "Kezdőlap",
|
||||
"Homeserver is": "Saját szerver:",
|
||||
"Homeserver is": "Matrix szerver:",
|
||||
"Identity Server is": "Azonosítási szerver:",
|
||||
"I have verified my email address": "Ellenőriztem az e-mail címemet",
|
||||
"Import": "Betöltés",
|
||||
|
@ -359,10 +359,10 @@
|
|||
"The email address linked to your account must be entered.": "A fiókodhoz kötött e-mail címet add meg.",
|
||||
"Press <StartChatButton> to start a chat with someone": "Nyomd meg a <StartChatButton> gombot ha szeretnél csevegni valakivel",
|
||||
"Privacy warning": "Adatvédelmi figyelmeztetés",
|
||||
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' fájl túllépte a Saját szerverben beállított feltöltési méret határt",
|
||||
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' fájl túllépte a Matrix szerverben beállított feltöltési méret határt",
|
||||
"The file '%(fileName)s' failed to upload": "'%(fileName)s' fájl feltöltése sikertelen",
|
||||
"The remote side failed to pick up": "A hívott fél nem vette fel",
|
||||
"This Home Server does not support login using email address.": "A Saját szerver nem támogatja a belépést e-mail címmel.",
|
||||
"This Home Server does not support login using email address.": "A Matrix szerver nem támogatja a belépést e-mail címmel.",
|
||||
"This invitation was sent to an email address which is not associated with this account:": "A meghívó olyan e-mail címre lett küldve ami nincs összekötve ezzel a fiókkal:",
|
||||
"This room has no local addresses": "Ennek a szobának nincs helyi címe",
|
||||
"This room is not recognised.": "Ez a szoba nem ismerős.",
|
||||
|
@ -461,7 +461,7 @@
|
|||
"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 logged in.": "Be kell jelentkezz.",
|
||||
"You need to enter a user name.": "Be kell írnod a felhasználói nevet.",
|
||||
"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 saját 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 szerveren.",
|
||||
"Your password has been reset": "A jelszavad visszaállítottuk",
|
||||
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Nem kapsz \"push\" értesítéseket amíg a többi eszközön vissza nem jelentkezel",
|
||||
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "A címről amire a meghívót elküldtük nem állapítható meg, hogy a fiókoddal összeköttetésben áll-e.",
|
||||
|
@ -469,7 +469,7 @@
|
|||
"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 should not yet trust it to secure data": "Még ne bízz meg a titkosításban",
|
||||
"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.",
|
||||
"Your home server does not support device management.": "A Saját szervered nem támogatja az eszközök kezelését.",
|
||||
"Your home server does not support device management.": "A Matrix szervered nem támogatja az eszközök kezelését.",
|
||||
"Sun": "Vas",
|
||||
"Mon": "Hé",
|
||||
"Tue": "K",
|
||||
|
@ -564,7 +564,7 @@
|
|||
"Verify...": "Ellenőrzés...",
|
||||
"ex. @bob:example.com": "pl.: @bob:example.com",
|
||||
"Add User": "Felhasználó hozzáadás",
|
||||
"This Home Server would like to make sure you are not a robot": "A Saját szerver meg szeretne győződni arról, hogy nem vagy robot",
|
||||
"This Home Server would like to make sure you are not a robot": "A Matrix szerver meg szeretne győződni arról, hogy nem vagy robot",
|
||||
"Sign in with CAS": "Belépés CAS-sal",
|
||||
"Please check your email to continue registration.": "Ellenőrizd az e-mailedet a regisztráció folytatásához.",
|
||||
"Token incorrect": "Helytelen token",
|
||||
|
@ -572,7 +572,7 @@
|
|||
"You are registering with %(SelectedTeamName)s": "%(SelectedTeamName)s névvel regisztrálsz",
|
||||
"Default server": "Alapértelmezett szerver",
|
||||
"Custom server": "Egyedi szerver",
|
||||
"Home server URL": "Saját szerver URL",
|
||||
"Home server URL": "Matrix szerver URL",
|
||||
"Identity server URL": "Azonosítási szerver URL",
|
||||
"What does this mean?": "Ez mit jelent?",
|
||||
"Error decrypting audio": "Hiba a hang visszafejtésénél",
|
||||
|
@ -614,12 +614,12 @@
|
|||
"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.": "Ha egy újabb Riot verziót használtál valószínűleg ez kapcsolat nem lesz kompatibilis vele. Zárd be az ablakot és térj vissza az újabb verzióhoz.",
|
||||
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Jelenleg fekete listára teszel minden ismeretlen eszközt. Ha üzenetet szeretnél küldeni ezekre az eszközökre először ellenőrizned kell őket.",
|
||||
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Azt javasoljuk, hogy menj végig ellenőrző folyamaton minden eszköznél, hogy meg megerősítsd minden eszköz a jogos tulajdonosához tartozik, de újraküldheted az üzenetet ellenőrzés nélkül, ha úgy szeretnéd.",
|
||||
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Használhatod az Otthoni szerver opciót, hogy más Matrix szerverre csatlakozz Saját szerver URL megadásával.",
|
||||
"This allows you to use this app with an existing Matrix account on a different home server.": "Ezzel használhatod ezt az alkalmazást a meglévő Matrix fiókoddal és másik Saját szerveren.",
|
||||
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Használhatod az Matrix szerver opciót, hogy más Matrix szerverre csatlakozz Matrix szerver URL megadásával.",
|
||||
"This allows you to use this app with an existing Matrix account on a different home server.": "Ezzel használhatod ezt az alkalmazást a meglévő Matrix fiókoddal és másik Matrix szerveren.",
|
||||
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Beállíthatsz egy egyedi azonosító szervert is de ez tulajdonképpen meggátolja az együttműködést e-mail címmel azonosított felhasználókkal.",
|
||||
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ha nem állítasz be e-mail címet nem fogod tudni a jelszavadat alaphelyzetbe állítani. Biztos vagy benne?",
|
||||
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Azonosítás céljából egy harmadik félhez leszel irányítva (%(integrationsUrl)s). Folytatod?",
|
||||
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Ez lesz a felhasználói neved a <span></span> saját szerveren, vagy választhatsz egy <a>másik szervert</a>.",
|
||||
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Ez lesz a felhasználói neved a <span></span> Matrix szerveren, vagy választhatsz egy <a>másik szervert</a>.",
|
||||
"Disable Peer-to-Peer for 1:1 calls": "Közvetlen kapcsolat tiltása az 1:1 hívásoknál",
|
||||
"To return to your account in future you need to set a password": "Ahhoz hogy később visszatérj a fiókodba be kell állítanod egy jelszót",
|
||||
"Skip": "Kihagy",
|
||||
|
@ -777,7 +777,7 @@
|
|||
"Long Description (HTML)": "Hosszú leírás (HTML)",
|
||||
"Community Settings": "Közösségi beállítások",
|
||||
"Community %(groupId)s not found": "%(groupId)s közösség nem található",
|
||||
"This Home server does not support communities": "Ez a saját szerver nem támogatja a közösségeket",
|
||||
"This Home server does not support communities": "Ez a Matrix szerver nem támogatja a közösségeket",
|
||||
"Error whilst fetching joined communities": "Hiba a csatlakozott közösségek betöltésénél",
|
||||
"Create a new community": "Új közösség létrehozása",
|
||||
"example": "példa",
|
||||
|
@ -913,7 +913,7 @@
|
|||
"Flair will not appear": "Jelvények nem jelennek meg",
|
||||
"Something went wrong when trying to get your communities.": "Valami nem sikerült a közösségeid elérésénél.",
|
||||
"Display your community flair in rooms configured to show it.": "Közösségi jelvényeid megjelenítése azokban a szobákban ahol ez engedélyezett.",
|
||||
"This homeserver doesn't offer any login flows which are supported by this client.": "Ez a saját szerver egyetlen bejelentkezési metódust sem támogat amit ez a kliens ismer.",
|
||||
"This homeserver doesn't offer any login flows which are supported by this client.": "Ez a Matrix szerver egyetlen bejelentkezési metódust sem támogat amit ez a kliens ismer.",
|
||||
"Addresses": "Címek",
|
||||
"collapse": "becsuk",
|
||||
"expand": "kinyit",
|
||||
|
@ -948,7 +948,7 @@
|
|||
"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",
|
||||
"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": "Az egyedi szerver URL-t",
|
||||
"Your homeserver's URL": "A Matrix szerver URL-t",
|
||||
"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.",
|
||||
|
@ -1019,7 +1019,7 @@
|
|||
"You cannot delete this image. (%(code)s)": "Nem törölheted ezt a képet. (%(code)s)",
|
||||
"Cancel Sending": "Küldés megszakítása",
|
||||
"This Room": "Ebben a szobában",
|
||||
"The Home Server may be too old to support third party networks": "Lehet, hogy a saját szerver túl régi és nem támogatja a csatlakozást más hálózatokhoz",
|
||||
"The Home Server may be too old to support third party networks": "Lehet, hogy a Matrix szerver túl régi és nem támogatja a csatlakozást más hálózatokhoz",
|
||||
"Resend": "Küldés újra",
|
||||
"Room not found": "A szoba nem található",
|
||||
"Messages containing my display name": "A profilnevemet tartalmazó üzenetek",
|
||||
|
@ -1041,7 +1041,7 @@
|
|||
"Members": "Résztvevők",
|
||||
"No update available.": "Nincs elérhető frissítés.",
|
||||
"Noisy": "Hangos",
|
||||
"Failed to get protocol list from Home Server": "Nem sikerült a protokoll listát lekérni a saját szerverről",
|
||||
"Failed to get protocol list from Home Server": "Nem sikerült a protokoll listát lekérni a Matrix szerverről",
|
||||
"Collecting app version information": "Alkalmazás verzió információk összegyűjtése",
|
||||
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Törlöd a szoba nevét (%(alias)s) és eltávolítod a listából ezt: %(name)s?",
|
||||
"This will allow you to return to your account after signing out, and sign in on other devices.": "Így kijelentkezés után is vissza tudsz lépni a fiókodba, illetve más készülékekről is be tudsz lépni.",
|
||||
|
@ -1222,5 +1222,52 @@
|
|||
"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",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "A kisalkalmazás szobából való törlése közben hiba történt"
|
||||
"An error ocurred whilst trying to remove the widget from the room": "A kisalkalmazás szobából való törlése közben hiba történt",
|
||||
"System Alerts": "Rendszer figyelmeztetések",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Ez a matrix szerver elérte a havi aktív felhasználói korlátot. Kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával ha a továbbiakban is igénybe szeretnéd venni a szolgáltatást.",
|
||||
"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.": "Az üzeneted nem lett elküldve mert a Matrix szerver elérte a havi aktív felhasználói korlátot. Kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával ha a továbbiakban is igénybe szeretnéd venni a szolgáltatást.",
|
||||
"This homeserver has hit its Monthly Active User limit": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátot",
|
||||
"Please contact your service administrator to continue using this service.": "Kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával ha a továbbiakban is igénybe szeretnéd venni a szolgáltatást.",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátot. Kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a> a szolgáltatás további használatához.",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátot, így néhány felhasználó nem fog tudni bejelentkezni. Kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>, hogy a korlátot felemeljék.",
|
||||
"Internal room ID: ": "Belső szoba azonosító: ",
|
||||
"Room version number: ": "Szoba verziószáma: ",
|
||||
"There is a known vulnerability affecting this room.": "Ez a szoba ismert sérülékenységgel rendelkezik.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "A szoba ezen verziójában a szoba állapota ártó szándékkal módosítható.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Kattints ide a szoba legújabb verziójára való frissítéshez, hogy a szoba integritása védve legyen.",
|
||||
"Only room administrators will see this warning": "Csak a szoba adminisztrátorai látják ezt a figyelmeztetést",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "A szolgáltatás további használata érdekében kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "A Matrix szerver elérte a havi aktív felhasználói korlátot.",
|
||||
"This homeserver has exceeded one of its resource limits.": "A Matrix szerver túllépte valamelyik erőforrás korlátját.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "A korlát emelése érdekében kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátját <b>néhány felhasználó nem fog tudni bejelentkezni</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Ez a Matrix szerver túllépte valamelyik erőforrás korlátját így <b>néhány felhasználó nem tud majd bejelentkezni</b>.",
|
||||
"Upgrade Room Version": "Szoba verziójának frissítése",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "A szoba frissítése miatt ezt a szobát be kell zárni és egy új szobát kell nyitni a helyében. Hogy a felhasználóknak ne legyen rossz tapasztalata ezért ezt fogjuk tenni:",
|
||||
"Create a new room with the same name, description and avatar": "Készíts egy új szobát ugyanazzal a névvel, leírással és profilképpel",
|
||||
"Update any local room aliases to point to the new room": "Állíts át minden helyi alternatív nevet erre a szobára",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "A felhasználóknak tiltsd meg, hogy a régi szobában beszélgessenek. Küldj egy üzenetet amiben megkéred a felhasználókat, hogy menjenek át az új szobába",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Tegyél egy linket az új szoba elejére ami visszamutat a régi szobára, hogy az emberek lássák a régi üzeneteket",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Az üzeneted nincs elküldve, mert ez a Matrix szerver elérte a havi aktív felhasználói korlátot. A szolgáltatás további igénybevétele végett kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Az üzeneted nem került elküldésre mert ez a Matrix szerver túllépte valamelyik erőforrás korlátját. A szolgáltatás további igénybevétele végett kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "A szolgáltatás további használatához kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
||||
"Increase performance by only loading room members on first view": "A teljesítmény növelése érdekében a szoba tagsága csak az első megtekintéskor töltődik be",
|
||||
"Lazy loading members not supported": "A tagok késleltetett betöltése nem támogatott",
|
||||
"Lazy loading is not supported by your current homeserver.": "A késleltetett betöltés nem támogatott ennél a Matrix szervernél.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Sajnáljuk, a Matrix szervered nem elég friss ahhoz, hogy részt vegyen ebben a szobában.",
|
||||
"Please contact your homeserver administrator.": "Kérlek vedd fel a kapcsolatot a Matrix szerver adminisztrátorával.",
|
||||
"Legal": "Jogi",
|
||||
"This room has been replaced and is no longer active.": "Ezt a szobát lecseréltük és nem aktív többé.",
|
||||
"The conversation continues here.": "A beszélgetés itt folytatódik.",
|
||||
"Upgrade room to version %(ver)s": "A szoba frissítése %(ver)s verzióra",
|
||||
"This room is a continuation of another conversation.": "Ebben a szobában folytatódik egy másik beszélgetés.",
|
||||
"Click here to see older messages.": "Ide kattintva megnézheted a régi üzeneteket.",
|
||||
"Failed to upgrade room": "A szoba frissítése sikertelen",
|
||||
"The room upgrade could not be completed": "A szoba frissítését nem sikerült befejezni",
|
||||
"Upgrade this room to version %(version)s": "A szoba frissítése %(version)s verzióra",
|
||||
"Error Discarding Session": "Hiba a munkamenet törlésénél",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobában",
|
||||
"Registration Required": "Regisztrációt igényel",
|
||||
"You need to register to do this. Would you like to register now?": "Hogy ezt megtedd regisztrálnod kell. Szeretnél regisztrálni?",
|
||||
"Unable to query for supported registration methods": "A támogatott regisztrációs folyamatok listáját nem sikerült lekérdezni"
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@
|
|||
"Access Token:": "Token Akses:",
|
||||
"Active call (%(roomName)s)": "Panggilan aktif (%(roomName)s)",
|
||||
"Admin": "Admin",
|
||||
"Admin Tools": "Alat admin",
|
||||
"Admin Tools": "Peralatan Admin",
|
||||
"VoIP": "VoIP",
|
||||
"Missing Media Permissions, click here to request.": "Tidak ada Izin Media, klik disini untuk meminta.",
|
||||
"No Webcams detected": "Tidak ada Webcam terdeteksi",
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
"Close": "Chiudi",
|
||||
"Create new room": "Crea una nuova stanza",
|
||||
"Custom Server Options": "Opzioni Server Personalizzate",
|
||||
"Dismiss": "Scarta",
|
||||
"Dismiss": "Chiudi",
|
||||
"Error": "Errore",
|
||||
"Favourite": "Preferito",
|
||||
"OK": "OK",
|
||||
|
@ -1111,7 +1111,7 @@
|
|||
"Messages in group chats": "Messaggi nelle chat di gruppo",
|
||||
"Yesterday": "Ieri",
|
||||
"Error encountered (%(errorDetail)s).": "Errore riscontrato (%(errorDetail)s).",
|
||||
"Login": "Entra",
|
||||
"Login": "Accedi",
|
||||
"Low Priority": "Priorità bassa",
|
||||
"What's New": "Novità",
|
||||
"Set Password": "Imposta Password",
|
||||
|
@ -1219,5 +1219,51 @@
|
|||
"The user name field must not be blank.": "Il campo nome utente non deve essere vuoto.",
|
||||
"The phone number field must not be blank.": "Il campo telefono non deve essere vuoto.",
|
||||
"The password field must not be blank.": "Il campo passwordl non deve essere vuoto.",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Non è possibile inviare alcun messaggio fino a quando non si esaminano e si accettano <consentLink> i nostri termini e condizioni </ permissionLink>."
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Non è possibile inviare alcun messaggio fino a quando non si esaminano e si accettano <consentLink> i nostri termini e condizioni </ permissionLink>.",
|
||||
"A call is currently being placed!": "Attualmente è in corso una chiamata!",
|
||||
"System Alerts": "Avvisi di sistema",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "L'homeserver ha raggiunto il suo limite di utenti attivi mensili. <a>Contatta l'amministratore del servizio</a> per continuare ad usarlo.",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "Questo homeserver ha raggiunto il suo limite di utenti attivi mensili, perciò alcuni utenti non potranno accedere. <a>Contatta l'amministratore del servizio</a> per fare aumentare questo limite.",
|
||||
"Failed to remove widget": "Rimozione del widget fallita",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Si è verificato un errore tentando di rimuovere il widget dalla stanza",
|
||||
"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.": "Il tuo messaggio non è stato inviato perchè questo homeserver ha raggiunto il suo limite di utenti attivi mensili. Contatta l'amministratore del servizio per continuare ad usarlo.",
|
||||
"This homeserver has hit its Monthly Active User limit": "Questo homeserver ha raggiunto il suo limite di utenti attivi mensili",
|
||||
"Please contact your service administrator to continue using this service.": "Contatta l'amministratore del servizio per continuare ad usarlo.",
|
||||
"Internal room ID: ": "ID interno della stanza: ",
|
||||
"Room version number: ": "Numero di versione della stanza: ",
|
||||
"There is a known vulnerability affecting this room.": "C'è una vulnerabilità nota che affligge questa stanza.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "La versione di questa stanza è vulnerabile a modifiche malevole dello stato della stanza.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Clicca qui per aggiornare all'ultima versione ed assicurare che l'integrità della stanza sia protetta.",
|
||||
"Only room administrators will see this warning": "Solo gli amministratori della stanza vedranno questo avviso",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "<a>Contatta l'amministratore del servizio</a> per continuare ad usarlo.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Questo homeserver ha raggiunto il suo limite di utenti attivi mensili.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Questo homeserver ha oltrepassato uno dei suoi limiti di risorse.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "<a>Contatta l'amministratore del servizio</a> per fare aumentare questo limite.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Questo homeserver ha raggiunto il suo limite di utenti attivi mensili, perciò <b>alcuni utenti non potranno accedere</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Questo homeserver ha oltrepassato uno dei suoi limiti di risorse, perciò <b>alcuni utenti non potranno accedere</b>.",
|
||||
"Upgrade Room Version": "Aggiorna versione stanza",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "L'aggiornamento di questa stanza richiede la chiusura dell'istanza attuale e la creazione di una nuova stanza al suo posto. Per offrire la migliore esperienza possibile ai membri della stanza, noi:",
|
||||
"Create a new room with the same name, description and avatar": "Creeremo una nuova stanza con lo stesso nome, descrizione e avatar",
|
||||
"Update any local room aliases to point to the new room": "Aggiorneremo qualsiasi alias di stanza in modo che punti a quella nuova",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Eviteremo che gli utenti parlino nella vecchia versione della stanza e posteremo un messaggio avvisando gli utenti di spostarsi in quella nuova",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Inseriremo un link alla vecchia stanza all'inizio della di quella nuova in modo che la gente possa vedere i messaggi precedenti",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Il tuo messaggio non è stato inviato perchè questo homeserver ha raggiunto il suo limite di utenti attivi mensili. <a>Contatta l'amministratore del servizio</a> per continuare ad usarlo.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Il tuo messaggio non è stato inviato perchè questo homeserver ha oltrepassato un limite di risorse. <a>Contatta l'amministratore del servizio</a> per continuare ad usarlo.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "<a>Contatta l'amministratore del servizio</a> per continuare ad usarlo.",
|
||||
"Increase performance by only loading room members on first view": "Aumenta le prestazioni caricando solo i membri della stanza alla prima occhiata",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Spiacenti, il tuo homeserver è troppo vecchio per partecipare a questa stanza.",
|
||||
"Please contact your homeserver administrator.": "Contatta l'amministratore del tuo homeserver.",
|
||||
"Lazy loading members not supported": "Il caricamento lento dei membri non è supportato",
|
||||
"Lazy loading is not supported by your current homeserver.": "Il caricamento lento non è supportato dal tuo attuale homeserver.",
|
||||
"Legal": "Informazioni legali",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "Forza l'eliminazione dell'attuale sessione di gruppo in uscita in una stanza criptata",
|
||||
"Error Discarding Session": "Errore nell'eliminazione della sessione",
|
||||
"This room has been replaced and is no longer active.": "Questa stanza è stata sostituita e non è più attiva.",
|
||||
"The conversation continues here.": "La conversazione continua qui.",
|
||||
"Upgrade room to version %(ver)s": "Aggiorna la stanza alla versione %(ver)s",
|
||||
"This room is a continuation of another conversation.": "Questa stanza è la continuazione di un'altra conversazione.",
|
||||
"Click here to see older messages.": "Clicca qui per vedere i messaggi precedenti.",
|
||||
"Failed to upgrade room": "Aggiornamento stanza fallito",
|
||||
"The room upgrade could not be completed": "Non è stato possibile completare l'aggiornamento della stanza",
|
||||
"Upgrade this room to version %(version)s": "Aggiorna questa stanza alla versione %(version)s"
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
{}
|
File diff suppressed because it is too large
Load Diff
|
@ -13,7 +13,7 @@
|
|||
"Analytics": "Statistika",
|
||||
"The information being sent to us to help make Riot.im better includes:": "Informacijoje, kuri yra siunčiama Riot.im tobulinimui yra:",
|
||||
"Fetching third party location failed": "Nepavyko gauti trečios šalies vietos",
|
||||
"A new version of Riot is available.": "Yra nauja Riot versija.",
|
||||
"A new version of Riot is available.": "Yra prieinama nauja Riot versija.",
|
||||
"I understand the risks and wish to continue": "Aš suprantu riziką ir noriu tęsti",
|
||||
"Couldn't load home page": "Nepavyksta užkrauti namų puslapio",
|
||||
"Send Account Data": "Siųsti paskyros duomenis",
|
||||
|
@ -43,10 +43,10 @@
|
|||
"All notifications are currently disabled for all targets.": "Šiuo metu visi pranešimai visiems objektams yra išjungti.",
|
||||
"Operation failed": "Operacija nepavyko",
|
||||
"delete the alias.": "ištrinti slapyvardį.",
|
||||
"To return to your account in future you need to <u>set a password</u>": "Ateityje norėdami prisijungti prie savo paskyros turite <u>susigalvoti slaptažodį</u>",
|
||||
"To return to your account in future you need to <u>set a password</u>": "Ateityje, norėdami grįžti prie savo paskyros turite <u>nusistatyti slaptažodį</u>",
|
||||
"Forget": "Pamiršti",
|
||||
"World readable": "Visiems skaitomas",
|
||||
"Mute": "Užtildyti",
|
||||
"Mute": "Nutildyti",
|
||||
"Hide panel": "Slėpti skydelį",
|
||||
"You cannot delete this image. (%(code)s)": "Jūs negalite ištrinti šio paveikslėlio. (%(code)s)",
|
||||
"Cancel Sending": "Atšaukti siuntimą",
|
||||
|
@ -64,7 +64,7 @@
|
|||
"Notifications on the following keywords follow rules which can’t be displayed here:": "Pranešimai šiems raktažodžiams yra uždrausti taisyklėmis:",
|
||||
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Naudojant <safariLink>Safari</safariLink> ir <operaLink>Opera</operaLink> taip pat gerai veikia.",
|
||||
"Please set a password!": "Prašau įrašykite slaptažodį!",
|
||||
"powered by Matrix": "palaikomas Matrix",
|
||||
"powered by Matrix": "veikia su Matrix",
|
||||
"You have successfully set a password!": "Jūs sėkmingai įrašėte slaptažodį!",
|
||||
"Favourite": "Svarbūs",
|
||||
"All Rooms": "Visi pokalbių kambariai",
|
||||
|
@ -97,7 +97,7 @@
|
|||
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot naudoja daug išplėstinių naršyklės funkcionalumų, kai kurie iš jų yra neprieinami ar eksperimentinei Jūsų naršyklėje.",
|
||||
"Event sent!": "Įvykis išsiųstas!",
|
||||
"Unnamed room": "Kambarys be pavadinimo",
|
||||
"Dismiss": "Nutraukti",
|
||||
"Dismiss": "Atmesti",
|
||||
"Explore Account Data": "Peržiūrėti paskyros duomenis",
|
||||
"Remove from Directory": "Šalinti iš katalogo",
|
||||
"Download this file": "Atsisiųsti šį failą",
|
||||
|
@ -109,7 +109,7 @@
|
|||
"Failed to set Direct Message status of room": "Nepavyko nustatyti tiesioginio pranešimo kambario būklės",
|
||||
"Monday": "Pirmadienis",
|
||||
"All messages (noisy)": "Visos žinutės (triukšmingas)",
|
||||
"Enable them now": "Įgalinti juos dabar",
|
||||
"Enable them now": "Įjungti juos dabar",
|
||||
"Enable audible notifications in web client": "Įgalinti garsinius pranešimus internetinėje aplinkoje",
|
||||
"Messages containing my user name": "Žinutės, kuriose paminėtas mano naudotojo vardas",
|
||||
"Toolbox": "Įrankinė",
|
||||
|
@ -154,7 +154,7 @@
|
|||
"Quote": "Citata",
|
||||
"Messages in group chats": "Žinutės grupės pokalbiuose",
|
||||
"Yesterday": "Vakar",
|
||||
"Error encountered (%(errorDetail)s).": "Gauta klaida (%(errorDetail)s).",
|
||||
"Error encountered (%(errorDetail)s).": "Susidurta su klaida (%(errorDetail)s).",
|
||||
"Login": "Prisijungti",
|
||||
"Low Priority": "Nesvarbūs",
|
||||
"Riot does not know how to join a room on this network": "Riot nežino kaip prisijungti prie kambario šiame tinkle",
|
||||
|
@ -181,11 +181,606 @@
|
|||
"%(count)s Members|one": "%(count)s narys",
|
||||
"Developer Tools": "Programuotojo įrankiai",
|
||||
"Unhide Preview": "Rodyti paržiūrą",
|
||||
"Custom Server Options": "Pasirinktiniai serverio nustatymai",
|
||||
"Custom Server Options": "Tinkinto serverio parametrai",
|
||||
"Event Content": "Įvykio turinys",
|
||||
"Thank you!": "Ačiū!",
|
||||
"Collapse panel": "Suskleisti skydelį",
|
||||
"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!": "Naudojant šią naršyklę aplikacija gali atrodyti ir reaguoti neteisingai. Kai kurios arba visos funkcijos gali neveikti. Jei vis tiek norite pabandyti gali tęsti, tačiau iškilusios problemos yra jūsų pačių reikalas!",
|
||||
"Checking for an update...": "Tikrinama ar yra atnaujinimų...",
|
||||
"There are advanced notifications which are not shown here": "Yra išplėstinių pranešimų, kurie nėra čia rodomi"
|
||||
"There are advanced notifications which are not shown here": "Yra išplėstinių pranešimų, kurie nėra čia rodomi",
|
||||
"e.g. %(exampleValue)s": "pvz., %(exampleValue)s",
|
||||
"e.g. <CurrentPageURL>": "pvz., <CurrentPageURL>",
|
||||
"Your device resolution": "Jūsų įrenginio raiška",
|
||||
"Call Failed": "Skambutis nepavyko",
|
||||
"Call Anyway": "Vis tiek skambinti",
|
||||
"Answer Anyway": "Vis tiek atsiliepti",
|
||||
"Call": "Skambinti",
|
||||
"Answer": "Atsiliepti",
|
||||
"Unable to capture screen": "Nepavyko nufotografuoti ekraną",
|
||||
"You are already in a call.": "Jūs jau dalyvaujate skambutyje.",
|
||||
"VoIP is unsupported": "VoIP yra nepalaikoma",
|
||||
"Could not connect to the integration server": "Nepavyko prisijungti prie integracijos serverio",
|
||||
"Permission Required": "Reikalingas leidimas",
|
||||
"The file '%(fileName)s' failed to upload": "Nepavyko įkelti failo \"%(fileName)s\"",
|
||||
"Upload Failed": "Įkėlimas nepavyko",
|
||||
"Sun": "Sek",
|
||||
"Mon": "Pir",
|
||||
"Tue": "Ant",
|
||||
"Wed": "Tre",
|
||||
"Thu": "Ket",
|
||||
"Fri": "Pen",
|
||||
"Sat": "Šeš",
|
||||
"Jan": "Sau",
|
||||
"Feb": "Vas",
|
||||
"Mar": "Kov",
|
||||
"Apr": "Bal",
|
||||
"May": "Geg",
|
||||
"Jun": "Bir",
|
||||
"Jul": "Lie",
|
||||
"Aug": "Rgp",
|
||||
"Sep": "Rgs",
|
||||
"Oct": "Spa",
|
||||
"Nov": "Lap",
|
||||
"Dec": "Gru",
|
||||
"PM": "PM",
|
||||
"AM": "AM",
|
||||
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)s %(monthName)s %(day)s",
|
||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(fullYear)s %(monthName)s %(day)s %(time)s",
|
||||
"Who would you like to add to this community?": "Ką norėtumėte pridėti į šią bendruomenę?",
|
||||
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Įspėjimas: bet kuris pridėtas asmuo bus matomas visiems, žinantiems bendruomenės ID",
|
||||
"Name or matrix ID": "Vardas ar matrix ID",
|
||||
"Invite to Community": "Pakviesti į bendruomenę",
|
||||
"Which rooms would you like to add to this community?": "Kuriuos kambarius norėtumėte pridėti į šią bendruomenę?",
|
||||
"Add rooms to the community": "Pridėti kambarius į bendruomenę",
|
||||
"Add to community": "Pridėti į bendruomenę",
|
||||
"Failed to invite the following users to %(groupId)s:": "Nepavyko pakviesti šių naudotojų į %(groupId)s:",
|
||||
"Failed to invite users to community": "Nepavyko pakviesti naudotojus į bendruomenę",
|
||||
"Failed to invite users to %(groupId)s": "Nepavyko pakviesti naudotojų į %(groupId)s",
|
||||
"Failed to add the following rooms to %(groupId)s:": "Nepavyko pridėti šiuos kambarius į %(groupId)s:",
|
||||
"Riot does not have permission to send you notifications - please check your browser settings": "Riot neturi leidimo siųsti jums pranešimus - patikrinkite savo naršyklės nustatymus",
|
||||
"Riot was not given permission to send notifications - please try again": "Riot nebuvo suteiktas leidimas siųsti pranešimus - bandykite dar kartą",
|
||||
"Unable to enable Notifications": "Nepavyko įjungti Pranešimus",
|
||||
"This email address was not found": "Šis el. pašto adresas nebuvo rastas",
|
||||
"Admin": "Administratorius",
|
||||
"Start a chat": "Pradėti pokalbį",
|
||||
"Email, name or matrix ID": "El. paštas, vardas ar matrix ID",
|
||||
"Start Chat": "Pradėti pokalbį",
|
||||
"Who would you like to add to this room?": "Ką norėtumėte pridėti į šį kambarį?",
|
||||
"Send Invites": "Siųsti pakvietimus",
|
||||
"Failed to invite user": "Nepavyko pakviesti naudotojo",
|
||||
"Failed to invite": "Nepavyko pakviesti",
|
||||
"Failed to invite the following users to the %(roomName)s room:": "Nepavyko pakviesti šių naudotojų į kambarį %(roomName)s :",
|
||||
"You need to be logged in.": "Turite būti prisijungę.",
|
||||
"Unable to create widget.": "Nepavyko sukurti valdiklio.",
|
||||
"Failed to send request.": "Nepavyko išsiųsti užklausos.",
|
||||
"This room is not recognised.": "Šis kambarys neatpažintas.",
|
||||
"You are not in this room.": "Jūs nesate šiame kambaryje.",
|
||||
"You do not have permission to do that in this room.": "Jūs neturite leidimo tai atlikti šiame kambaryje.",
|
||||
"Room %(roomId)s not visible": "Kambarys %(roomId)s nematomas",
|
||||
"/ddg is not a command": "/ddg nėra komanda",
|
||||
"Changes your display nickname": "Pakeičia jūsų rodomą slapyvardį",
|
||||
"Sets the room topic": "Nustato kambario temą",
|
||||
"Invites user with given id to current room": "Pakviečia naudotoją su nurodytu id į esamą kambarį",
|
||||
"You are now ignoring %(userId)s": "Dabar nepaisote %(userId)s",
|
||||
"Opens the Developer Tools dialog": "Atveria kūrėjo įrankių dialogą",
|
||||
"Unknown (user, device) pair:": "Nežinoma pora (naudotojas, įrenginys):",
|
||||
"Device already verified!": "Įrenginys jau patvirtintas!",
|
||||
"WARNING: Device already verified, but keys do NOT MATCH!": "ĮSPĖJIMAS: Įrenginys jau patvirtintas, tačiau raktai NESUTAMPA!",
|
||||
"Verified key": "Patvirtintas raktas",
|
||||
"Displays action": "Rodo veiksmą",
|
||||
"Unrecognised command:": "Neatpažinta komanda:",
|
||||
"Reason": "Priežastis",
|
||||
"%(targetName)s accepted an invitation.": "%(targetName)s priėmė pakvietimą.",
|
||||
"%(senderName)s invited %(targetName)s.": "%(senderName)s pakvietė naudotoją %(targetName)s.",
|
||||
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s pasikeitė savo rodomą vardą į %(displayName)s.",
|
||||
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s nusistatė savo rodomą vardą į %(displayName)s.",
|
||||
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s pašalino savo rodomą vardą (%(oldDisplayName)s).",
|
||||
"%(senderName)s removed their profile picture.": "%(senderName)s pašalino savo profilio paveikslą.",
|
||||
"%(senderName)s changed their profile picture.": "%(senderName)s pasikeitė savo profilio paveikslą.",
|
||||
"%(senderName)s set a profile picture.": "%(senderName)s nusistatė profilio paveikslą.",
|
||||
"%(targetName)s rejected the invitation.": "%(targetName)s atmetė pakvietimą.",
|
||||
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s pakeitė temą į \"%(topic)s\".",
|
||||
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s pakeitė kambario pavadinimą į %(roomName)s.",
|
||||
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s išsiuntė paveikslą.",
|
||||
"Someone": "Kažkas",
|
||||
"%(senderName)s answered the call.": "%(senderName)s atsiliepė į skambutį.",
|
||||
"(unknown failure: %(reason)s)": "(nežinoma lemtingoji klaida: %(reason)s)",
|
||||
"%(senderName)s ended the call.": "%(senderName)s užbaigė skambutį.",
|
||||
"%(displayName)s is typing": "%(displayName)s rašo",
|
||||
"%(names)s and %(count)s others are typing|other": "%(names)s ir dar kiti %(count)s rašo",
|
||||
"%(names)s and %(lastPerson)s are typing": "%(names)s ir %(lastPerson)s rašo",
|
||||
"Send anyway": "Vis tiek siųsti",
|
||||
"Unnamed Room": "Kambarys be pavadinimo",
|
||||
"Hide removed messages": "Slėpti pašalintas žinutes",
|
||||
"Hide display name changes": "Slėpti rodomo vardo pakeitimus",
|
||||
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Rodyti laiko žymas 12 valandų formatu (pvz., 2:30pm)",
|
||||
"Always show message timestamps": "Visada rodyti žinučių laiko žymas",
|
||||
"Always show encryption icons": "Visada rodyti šifravimo piktogramas",
|
||||
"Room Colour": "Kambario spalva",
|
||||
"Decline": "Atmesti",
|
||||
"Accept": "Priimti",
|
||||
"Incorrect verification code": "Neteisingas patvirtinimo kodas",
|
||||
"Submit": "Pateikti",
|
||||
"Phone": "Telefonas",
|
||||
"Add phone number": "Pridėti telefono numerį",
|
||||
"Add": "Pridėti",
|
||||
"Failed to upload profile picture!": "Nepavyko įkelti profilio paveikslą!",
|
||||
"Upload new:": "Įkelti naują:",
|
||||
"No display name": "Nėra rodomo vardo",
|
||||
"New passwords don't match": "Nauji slaptažodžiai nesutampa",
|
||||
"Passwords can't be empty": "Slaptažodžiai negali būti tušti",
|
||||
"Warning!": "Įspėjimas!",
|
||||
"Do you want to set an email address?": "Ar norite nustatyti el. pašto adresą?",
|
||||
"Current password": "Dabartinis slaptažodis",
|
||||
"Password": "Slaptažodis",
|
||||
"New Password": "Naujas slaptažodis",
|
||||
"Unable to load device list": "Nepavyko įkelti įrenginių sąrašo",
|
||||
"Delete %(count)s devices|one": "Ištrinti įrenginį",
|
||||
"Device ID": "Įrenginio ID",
|
||||
"Device Name": "Įrenginio pavadinimas",
|
||||
"Failed to set display name": "Nepavyko nustatyti rodomą vardą",
|
||||
"Disable Notifications": "Išjungti pranešimus",
|
||||
"Enable Notifications": "Įjungti pranešimus",
|
||||
"Cannot add any more widgets": "Nepavyksta pridėti daugiau valdiklių",
|
||||
"Add a widget": "Pridėti valdiklį",
|
||||
"Drop File Here": "Vilkite failą čia",
|
||||
"Drop file here to upload": "Norėdami įkelti, vilkite failą čia",
|
||||
" (unsupported)": " (nepalaikoma)",
|
||||
"%(senderName)s sent an image": "%(senderName)s išsiuntė paveikslą",
|
||||
"%(senderName)s sent a video": "%(senderName)s išsiuntė vaizdo įrašą",
|
||||
"%(senderName)s uploaded a file": "%(senderName)s įkėlė failą",
|
||||
"Options": "Parametrai",
|
||||
"Key request sent.": "Rakto užklausa išsiųsta.",
|
||||
"Unencrypted message": "Nešifruota žinutė",
|
||||
"device id: ": "įrenginio id: ",
|
||||
"Failed to mute user": "Nepavyko nutildyti naudotoją",
|
||||
"Are you sure?": "Ar tikrai?",
|
||||
"Devices": "Įrenginiai",
|
||||
"Ignore": "Nepaisyti",
|
||||
"Invite": "Pakviesti",
|
||||
"User Options": "Naudotojo parametrai",
|
||||
"Admin Tools": "Administratoriaus įrankiai",
|
||||
"bold": "pusjuodis",
|
||||
"italic": "kursyvas",
|
||||
"Attachment": "Priedas",
|
||||
"Upload Files": "Įkelti failus",
|
||||
"Are you sure you want to upload the following files?": "Ar tikrai norite įkelti šiuos failus?",
|
||||
"Encrypted room": "Šifruotas kambarys",
|
||||
"Unencrypted room": "Nešifruotas kambarys",
|
||||
"Voice call": "Balso skambutis",
|
||||
"Video call": "Vaizdo skambutis",
|
||||
"Upload file": "Įkelti failą",
|
||||
"Show Text Formatting Toolbar": "Rodyti teksto formatavimo įrankių juostą",
|
||||
"Send an encrypted reply…": "Siųsti šifruotą atsakymą…",
|
||||
"Send a reply (unencrypted)…": "Siųsti atsakymą (nešifruotą)…",
|
||||
"Send an encrypted message…": "Siųsti šifruotą žinutę…",
|
||||
"Send a message (unencrypted)…": "Siųsti žinutę (nešifruotą)…",
|
||||
"Hide Text Formatting Toolbar": "Slėpti teksto formatavimo įrankių juostą",
|
||||
"Server error": "Serverio klaida",
|
||||
"Command error": "Komandos klaida",
|
||||
"Unable to reply": "Nepavyko atsakyti",
|
||||
"Loading...": "Įkeliama...",
|
||||
"Pinned Messages": "Prisegtos žinutės",
|
||||
"Unknown": "Nežinoma",
|
||||
"Save": "Įrašyti",
|
||||
"(~%(count)s results)|other": "(~%(count)s rezultatų(-ai))",
|
||||
"(~%(count)s results)|one": "(~%(count)s rezultatas)",
|
||||
"Upload avatar": "Įkelti avatarą",
|
||||
"Remove avatar": "Šalinti avatarą",
|
||||
"Settings": "Nustatymai",
|
||||
"Show panel": "Rodyti skydelį",
|
||||
"Press <StartChatButton> to start a chat with someone": "Norėdami pradėti su kuo nors pokalbį, paspauskite <StartChatButton>",
|
||||
"Community Invites": "",
|
||||
"People": "Žmonės",
|
||||
"Reason: %(reasonText)s": "Priežastis: %(reasonText)s",
|
||||
"%(roomName)s does not exist.": "%(roomName)s nėra.",
|
||||
"%(roomName)s is not accessible at this time.": "%(roomName)s šiuo metu nėra pasiekiamas.",
|
||||
"<a>Click here</a> to join the discussion!": "<a>Spustelėkite čia</a>, norėdami prisijungti prie diskusijos!",
|
||||
"To change the topic, you must be a": "Norėdami pakeisti temą, privalote būti",
|
||||
"Enable encryption": "Įjungti šifravimą",
|
||||
"To send messages, you must be a": "Norėdami siųsti žinutes, privalote būti",
|
||||
"To invite users into the room, you must be a": "Norėdami pakviesti naudotojus į kambarį, privalote būti",
|
||||
"To configure the room, you must be a": "Norėdami konfigūruoti kambarį, privalote būti",
|
||||
"To remove other users' messages, you must be a": "Norėdami šalinti kitų naudotojų žinutes, privalote būti",
|
||||
"%(user)s is a %(userRole)s": "%(user)s yra %(userRole)s",
|
||||
"Muted Users": "Nutildyti naudotojai",
|
||||
"Click here to fix": "Spustelėkite čia, norėdami pataisyti",
|
||||
"To send events of type <eventType/>, you must be a": "Norėdami siųsti <eventType/> tipo įvykius, privalote būti",
|
||||
"Only people who have been invited": "Tik žmonės, kurie buvo pakviesti",
|
||||
"Anyone who knows the room's link, apart from guests": "Bet kas, žinantis kambario nuorodą, išskyrus svečius",
|
||||
"Anyone who knows the room's link, including guests": "Bet kas, žinantis kambario nuorodą, įskaitant svečius",
|
||||
"Anyone": "Bet kas",
|
||||
"Permissions": "Leidimai",
|
||||
"Advanced": "Išplėstiniai",
|
||||
"This room's internal ID is": "Šio kambario vidinis ID yra",
|
||||
"Add a topic": "Pridėti temą",
|
||||
"Invalid address format": "Neteisingas adreso formatas",
|
||||
"Addresses": "Adresai",
|
||||
"The main address for this room is": "Pagrindinis šio kambario adresas yra",
|
||||
"Local addresses for this room:": "Vietiniai šio kambario adresai:",
|
||||
"This room has no local addresses": "Šis kambarys neturi jokių vietinių adresų",
|
||||
"New address (e.g. #foo:%(localDomain)s)": "Naujas adresas (pvz., #betkoks:%(localDomain)s)",
|
||||
"Invalid community ID": "Neteisingas bendruomenės ID",
|
||||
"'%(groupId)s' is not a valid community ID": "\"%(groupId)s\" nėra teisingas bendruomenės ID",
|
||||
"New community ID (e.g. +foo:%(localDomain)s)": "Naujas bendruomenės ID (pvz., +betkoks:%(localDomain)s)",
|
||||
"URL Previews": "URL nuorodų peržiūros",
|
||||
"Error decrypting audio": "Klaida iššifruojant garsą",
|
||||
"Error decrypting attachment": "Klaida iššifruojant priedą",
|
||||
"Decrypt %(text)s": "Iššifruoti %(text)s",
|
||||
"Download %(text)s": "Atsisiųsti %(text)s",
|
||||
"Error decrypting image": "Klaida iššifruojant paveikslą",
|
||||
"Error decrypting video": "Klaida iššifruojant vaizdo įrašą",
|
||||
"Copied!": "Nukopijuota!",
|
||||
"Failed to copy": "Nepavyko nukopijuoti",
|
||||
"Message removed by %(userId)s": "Žinutę pašalino %(userId)s",
|
||||
"Message removed": "Žinutė pašalinta",
|
||||
"To continue, please enter your password.": "Norėdami tęsti, įveskite savo slaptažodį.",
|
||||
"Password:": "Slaptažodis:",
|
||||
"An email has been sent to %(emailAddress)s": "El. laiškas buvo išsiųstas į %(emailAddress)s",
|
||||
"Please check your email to continue registration.": "Norėdami tęsti registraciją, patikrinkite savo el. paštą.",
|
||||
"A text message has been sent to %(msisdn)s": "Tekstinė žinutė buvo išsiųsta į %(msisdn)s",
|
||||
"Please enter the code it contains:": "Įveskite joje esantį kodą:",
|
||||
"Code": "Kodas",
|
||||
"The email field must not be blank.": "El. pašto laukas negali būti tuščias.",
|
||||
"The user name field must not be blank.": "Naudotojo vardo laukas negali būti tuščias.",
|
||||
"The phone number field must not be blank.": "Telefono numerio laukas negali būti tuščias.",
|
||||
"The password field must not be blank.": "Slaptažodžio laukas negali būti tuščias.",
|
||||
"User name": "Naudotojo vardas",
|
||||
"Mobile phone number": "Mobiliojo telefono numeris",
|
||||
"Forgot your password?": "Pamiršote slaptažodį?",
|
||||
"Email address": "El. pašto adresas",
|
||||
"Email address (optional)": "El. pašto adresas (nebūtinas)",
|
||||
"Mobile phone number (optional)": "Mobiliojo telefono numeris (nebūtinas)",
|
||||
"Default server": "Numatytasis serveris",
|
||||
"Custom server": "Tinkintas serveris",
|
||||
"What does this mean?": "Ką tai reiškia?",
|
||||
"Remove from community": "Šalinti iš bendruomenės",
|
||||
"Remove this user from community?": "Šalinti šį naudotoją iš bendruomenės?",
|
||||
"Failed to remove user from community": "Nepavyko pašalinti naudotoją iš bendruomenės",
|
||||
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Ar tikrai norite pašalinti \"%(roomName)s\" iš %(groupId)s?",
|
||||
"Failed to remove room from community": "Nepavyko pašalinti kambarį iš bendruomenės",
|
||||
"Failed to remove '%(roomName)s' from %(groupId)s": "Nepavyko pašalinti \"%(roomName)s\" iš %(groupId)s",
|
||||
"Something went wrong!": "Kažkas nutiko!",
|
||||
"Visibility in Room List": "Matomumas kambarių sąraše",
|
||||
"Visible to everyone": "Matomas visiems",
|
||||
"Yes, I want to help!": "Taip, aš noriu padėti!",
|
||||
"Unknown Address": "Nežinomas adresas",
|
||||
"Warning: This widget might use cookies.": "Įspėjimas: Šis valdiklis gali naudoti slapukus.",
|
||||
"Do you want to load widget from URL:": "Ar norite įkelti valdiklį iš URL:",
|
||||
"Allow": "Leisti",
|
||||
"Delete Widget": "Ištrinti valdiklį",
|
||||
"Delete widget": "Ištrinti valdiklį",
|
||||
"Failed to remove widget": "Nepavyko pašalinti valdiklį",
|
||||
"Scroll to bottom of page": "Slinkti į puslapio apačią",
|
||||
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Rodyti įrenginius</showDevicesText>, <sendAnywayText>vis tiek siųsti</sendAnywayText> ar <cancelText>atsisakyti</cancelText>.",
|
||||
"%(count)s of your messages have not been sent.|other": "Kai kurios iš jūsų žinučių nebuvo išsiųstos.",
|
||||
"%(count)s of your messages have not been sent.|one": "Jūsų žinutė nebuvo išsiųsta.",
|
||||
"Connectivity to the server has been lost.": "Jungiamumas su šiuo serveriu buvo prarastas.",
|
||||
"Sent messages will be stored until your connection has returned.": "Išsiųstos žinutės bus saugomos tol, kol atsiras ryšys.",
|
||||
"%(count)s new messages|other": "%(count)s naujų žinučių",
|
||||
"%(count)s new messages|one": "%(count)s nauja žinutė",
|
||||
"Active call": "Aktyvus skambutis",
|
||||
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Čia daugiau nieko nėra! Ar norėtumėte <inviteText>pakviesti kitus</inviteText> ar <nowarnText>išjungti įspėjimą apie tuščią kambarį</nowarnText>?",
|
||||
"You seem to be uploading files, are you sure you want to quit?": "Atrodo, kad jūs įkelinėjate failus, ar tikrai norite išeiti?",
|
||||
"You seem to be in a call, are you sure you want to quit?": "Atrodo, kad dalyvaujate skambutyje, ar tikrai norite išeiti?",
|
||||
"Failed to upload file": "Nepavyko įkelti failo",
|
||||
"Server may be unavailable, overloaded, or the file too big": "Gali būti, kad serveris neprieinamas, perkrautas arba failas yra per didelis",
|
||||
"Search failed": "Paieška nepavyko",
|
||||
"Server may be unavailable, overloaded, or search timed out :(": "Gali būti, kad serveris neprieinamas, perkrautas arba pasibaigė paieškai skirtas laikas :(",
|
||||
"No more results": "Daugiau nėra jokių rezultatų",
|
||||
"Unknown room %(roomId)s": "Nežinomas kambarys %(roomId)s",
|
||||
"Room": "Kambarys",
|
||||
"Failed to save settings": "Nepavyko įrašyti nustatymų",
|
||||
"Failed to reject invite": "Nepavyko atmesti pakvietimo",
|
||||
"Fill screen": "Užpildyti ekraną",
|
||||
"Click to unmute video": "Spustelėkite, norėdami įjungti vaizdą",
|
||||
"Click to mute video": "Spustelėkite, norėdami išjungti vaizdą",
|
||||
"Click to unmute audio": "Spustelėkite, norėdami įjungti garsą",
|
||||
"Click to mute audio": "Spustelėkite, norėdami nutildyti garsą",
|
||||
"Clear filter": "Išvalyti filtrą",
|
||||
"Uploading %(filename)s and %(count)s others|other": "Įkeliamas %(filename)s ir dar %(count)s failai",
|
||||
"Uploading %(filename)s and %(count)s others|zero": "Įkeliamas %(filename)s",
|
||||
"Uploading %(filename)s and %(count)s others|one": "Įkeliamas %(filename)s ir dar %(count)s failas",
|
||||
"Light theme": "Šviesi tema",
|
||||
"Dark theme": "Tamsi tema",
|
||||
"Status.im theme": "Status.im tema",
|
||||
"Can't load user settings": "Nepavyksta įkelti naudotojo nustatymų",
|
||||
"Server may be unavailable or overloaded": "Gali būti, kad serveris neprieinamas arba perkrautas",
|
||||
"Success": "Pavyko",
|
||||
"Remove Contact Information?": "Šalinti kontaktinę informaciją?",
|
||||
"Remove %(threePid)s?": "Šalinti %(threePid)s?",
|
||||
"Unable to remove contact information": "Nepavyko pašalinti kontaktinę informaciją",
|
||||
"Interface Language": "Sąsajos kalba",
|
||||
"User Interface": "Naudotojo sąsaja",
|
||||
"<not supported>": "<nepalaikoma>",
|
||||
"Device ID:": "Įrenginio ID:",
|
||||
"Device key:": "Įrenginio raktas:",
|
||||
"Ignored Users": "Nepaisomi naudotojai",
|
||||
"Debug Logs Submission": "Derinimo žurnalų pateikimas",
|
||||
"These are experimental features that may break in unexpected ways": "Šios yra eksperimentinės ypatybės, kurios veikti netikėtais būdais",
|
||||
"Deactivate my account": "Pasyvinti mano paskyrą",
|
||||
"Clear Cache": "Išvalyti podėlį",
|
||||
"Clear Cache and Reload": "Išvalyti podėlį ir įkelti iš naujo",
|
||||
"Updates": "Atnaujinimai",
|
||||
"Check for update": "Tikrinti, ar yra atnaujinimų",
|
||||
"Reject all %(invitedRooms)s invites": "Atmesti visus %(invitedRooms)s pakvietimus",
|
||||
"Bulk Options": "Masiniai parametrai",
|
||||
"You may need to manually permit Riot to access your microphone/webcam": "Jums gali tekti rankiniu būdu leisti Riot prieigą prie savo mikrofono/kameros",
|
||||
"Missing Media Permissions, click here to request.": "Trūksta medijos leidimų, spustelėkite čia, norėdami užklausti.",
|
||||
"No Audio Outputs detected": "Neaptikta jokių garso išvesčių",
|
||||
"No Microphones detected": "Neaptikta jokių mikrofonų",
|
||||
"No Webcams detected": "Neaptikta jokių kamerų",
|
||||
"Default Device": "Numatytasis įrenginys",
|
||||
"Audio Output": "Garso išvestis",
|
||||
"Microphone": "Mikrofonas",
|
||||
"Camera": "Kamera",
|
||||
"VoIP": "VoIP",
|
||||
"Email": "El. paštas",
|
||||
"Add email address": "Pridėti el. pašto adresą",
|
||||
"Profile": "Profilis",
|
||||
"Account": "Paskyra",
|
||||
"To return to your account in future you need to set a password": "Norėdami ateityje sugrįžti į savo paskyrą, turite nusistatyti slaptažodį",
|
||||
"Logged in as:": "Esate prisijungę kaip:",
|
||||
"click to reveal": "spustelėkite, norėdami atskleisti",
|
||||
"matrix-react-sdk version:": "matrix-react-sdk versija:",
|
||||
"riot-web version:": "riot-web versija:",
|
||||
"olm version:": "olm versija:",
|
||||
"Failed to send email": "Nepavyko išsiųsti el. laiško",
|
||||
"The email address linked to your account must be entered.": "Privalo būti įvestas su jūsų paskyra susietas el. pašto adresas.",
|
||||
"A new password must be entered.": "Privalo būti įvestas naujas slaptažodis.",
|
||||
"New passwords must match each other.": "Nauji slaptažodžiai privalo sutapti.",
|
||||
"I have verified my email address": "Aš patvirtinau savo el. pašto adresą",
|
||||
"Your password has been reset": "Jūsų slaptažodis buvo atstatytas",
|
||||
"Return to login screen": "Grįžti į prisijungimo ekraną",
|
||||
"To reset your password, enter the email address linked to your account": "Norėdami atstatyti slaptažodį, įveskite su jūsų paskyra susietą el. pašto adresą",
|
||||
"New password": "Naujas slaptažodis",
|
||||
"Confirm your new password": "Patvirtinkite savo naują slaptažodį",
|
||||
"Send Reset Email": "Siųsti atstatymo el. laišką",
|
||||
"Create an account": "Sukurti paskyrą",
|
||||
"Incorrect username and/or password.": "Neteisingas naudotojo vardas ir/ar slaptažodis.",
|
||||
"Please note you are logging into the %(hs)s server, not matrix.org.": "Turėkite omenyje, kad jūs prisijungiate prie %(hs)s serverio, o ne matrix.org.",
|
||||
"Sign in to get started": "Norėdami pradėti, prisijunkite",
|
||||
"Failed to fetch avatar URL": "Nepavyko gauti avataro URL",
|
||||
"Missing password.": "Trūksta slaptažodžio.",
|
||||
"Passwords don't match.": "Slaptažodžiai nesutampa.",
|
||||
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Slaptažodis per trumpas (mažiausiai, %(MIN_PASSWORD_LENGTH)s).",
|
||||
"This doesn't look like a valid email address.": "Tai nepanašu į teisingą el. pašto adresą.",
|
||||
"This doesn't look like a valid phone number.": "Tai nepanašu į teisingą telefono numerį.",
|
||||
"You need to enter a user name.": "Turite įvesti naudotojo vardą.",
|
||||
"An unknown error occurred.": "Įvyko nežinoma klaida.",
|
||||
"I already have an account": "Aš jau turiu paskyrą",
|
||||
"Commands": "Komandos",
|
||||
"Results from DuckDuckGo": "Rezultatai iš DuckDuckGo",
|
||||
"Notify the whole room": "Pranešti visam kambariui",
|
||||
"Users": "Naudotojai",
|
||||
"unknown device": "nežinomas įrenginys",
|
||||
"Ed25519 fingerprint": "Ed25519 kontrolinis kodas",
|
||||
"User ID": "Naudotojo ID",
|
||||
"Curve25519 identity key": "Curve25519 tapatybės raktas",
|
||||
"none": "nėra",
|
||||
"Algorithm": "Algoritmas",
|
||||
"Decryption error": "Iššifravimo klaida",
|
||||
"Session ID": "Seanso ID",
|
||||
"End-to-end encryption information": "Ištisinio šifravimo informacija",
|
||||
"Event information": "Įvykio informacija",
|
||||
"Sender device information": "Siuntėjo įrenginio informacija",
|
||||
"Passphrases must match": "Slaptafrazės privalo sutapti",
|
||||
"Passphrase must not be empty": "Slaptafrazė negali būti tuščia",
|
||||
"Export room keys": "Eksportuoti kambario raktus",
|
||||
"Enter passphrase": "Įveskite slaptafrazę",
|
||||
"Confirm passphrase": "Patvirtinkite slaptafrazę",
|
||||
"Export": "Eksportuoti",
|
||||
"Import room keys": "Importuoti kambario raktus",
|
||||
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Eksportavimo failas bus apsaugotas slaptafraze. Norėdami iššifruoti failą, čia turėtumėte įvesti slaptafrazę.",
|
||||
"File to import": "Failas, kurį importuoti",
|
||||
"Import": "Importuoti",
|
||||
"Your User Agent": "Jūsų naudotojo agentas",
|
||||
"Review Devices": "Peržiūrėti įrenginius",
|
||||
"You do not have permission to start a conference call in this room": "Jūs neturite leidimo šiame kambaryje pradėti konferencinį pokalbį",
|
||||
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Failas \"%(fileName)s\" viršija šio namų serverio įkeliamų failų dydžio apribojimą",
|
||||
"Room name or alias": "Kambario pavadinimas ar slapyvardis",
|
||||
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Neatrodo, kad jūsų el. pašto adresas šiame namų serveryje būtų susietas su Matrix ID.",
|
||||
"Who would you like to communicate with?": "Su kuo norėtumėte susisiekti?",
|
||||
"Missing room_id in request": "Užklausoje trūksta room_id",
|
||||
"Missing user_id in request": "Užklausoje trūksta user_id",
|
||||
"Unrecognised room alias:": "Neatpažintas kambario slapyvardis:",
|
||||
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ĮSPĖJIMAS: RAKTO PATVIRTINIMAS NEPAVYKO! Pasirašymo raktas, skirtas %(userId)s ir įrenginiui %(deviceId)s yra \"%(fprint)s\", o tai nesutampa su pateiktu raktu \"%(fingerprint)s\". Tai gali reikšti, kad kažkas perima jūsų komunikavimą!",
|
||||
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Jūsų pateiktas pasirašymo raktas sutampa su pasirašymo raktus, kuris gautas iš naudotojo %(userId)s įrenginio %(deviceId)s. Įrenginys pažymėtas kaip patvirtintas.",
|
||||
"VoIP conference started.": "VoIP konferencija pradėta.",
|
||||
"VoIP conference finished.": "VoIP konferencija užbaigta.",
|
||||
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s pašalino kambario pavadinimą.",
|
||||
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s įjungė ištisinį šifravimą (%(algorithm)s algoritmas).",
|
||||
"%(widgetName)s widget modified by %(senderName)s": "%(senderName)s modifikavo %(widgetName)s valdiklį",
|
||||
"%(widgetName)s widget added by %(senderName)s": "%(senderName)s pridėjo %(widgetName)s valdiklį",
|
||||
"%(widgetName)s widget removed by %(senderName)s": "%(senderName)s pašalino %(widgetName)s valdiklį",
|
||||
"Failure to create room": "Nepavyko sukurti kambarį",
|
||||
"Server may be unavailable, overloaded, or you hit a bug.": "Gali būti, kad serveris neprieinamas, perkrautas arba susidūrėte su klaida.",
|
||||
"Use compact timeline layout": "Naudoti kompaktišką laiko juostos išdėstymą",
|
||||
"Autoplay GIFs and videos": "Automatiškai atkurti GIF ir vaizdo įrašus",
|
||||
"Never send encrypted messages to unverified devices from this device": "Niekada nesiųsti iš šio įrenginio šifruotų žinučių į nepatvirtintus įrenginius",
|
||||
"Never send encrypted messages to unverified devices in this room from this device": "Niekada nesiųsti iš šio įrenginio šifruotas žinutes į nepatvirtintus įrenginius šiame kambaryje",
|
||||
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Tekstinė žinutė išsiųsta į +%(msisdn)s. Įveskite žinutėje esantį patvirtinimo kodą",
|
||||
"Enter Code": "Įvesti kodą",
|
||||
"Your home server does not support device management.": "Jūsų namų serveris nepalaiko įrenginių tvarkymą.",
|
||||
"Delete %(count)s devices|other": "Ištrinti %(count)s įrenginius",
|
||||
"This event could not be displayed": "Nepavyko parodyti šio įvykio",
|
||||
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Jeigu jūsų kituose įrenginiuose nėra rakto šiai žinutei, tuomet jūs negalėsite jos iššifruoti.",
|
||||
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Iš naujo užklausti šifravimo raktus</requestLink> iš jūsų kitų įrenginių.",
|
||||
"Undecryptable": "Neiššifruojama",
|
||||
"Encrypted, not sent": "Šifruota, neišsiųsta",
|
||||
"Encrypted by a verified device": "Šifruota patvirtintu įrenginiu",
|
||||
"Encrypted by an unverified device": "Šifruota nepatvirtintu įrenginiu",
|
||||
"Kick": "Išmesti",
|
||||
"Kick this user?": "Išmesti šį naudotoją?",
|
||||
"Failed to kick": "Nepavyko išmesti",
|
||||
"Unban": "Atblokuoti",
|
||||
"Ban": "Užblokuoti",
|
||||
"Unban this user?": "Atblokuoti šį naudotoją?",
|
||||
"Ban this user?": "Užblokuoti šį naudotoją?",
|
||||
"Failed to ban user": "Nepavyko užblokuoti naudotoją",
|
||||
"Failed to toggle moderator status": "Nepavyko perjungti moderatoriaus būseną",
|
||||
"Invited": "Pakviestas",
|
||||
"Filter room members": "Filtruoti kambario dalyvius",
|
||||
"Server unavailable, overloaded, or something else went wrong.": "Serveris neprieinamas, perkrautas arba nutiko kažkas kito.",
|
||||
"%(duration)ss": "%(duration)s sek.",
|
||||
"%(duration)sm": "%(duration)s min.",
|
||||
"%(duration)sh": "%(duration)s val.",
|
||||
"%(duration)sd": "%(duration)s d.",
|
||||
"Seen by %(userName)s at %(dateTime)s": "%(userName)s matė ties %(dateTime)s",
|
||||
"Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) matė ties %(dateTime)s",
|
||||
"Show these rooms to non-members on the community page and room list?": "Ar rodyti šiuos kambarius ne dalyviams bendruomenės puslapyje ir kambarių sąraše?",
|
||||
"Invite new room members": "Pakviesti naujus kambario dalyvius",
|
||||
"Changes colour scheme of current room": "Pakeičia esamo kambario spalvų rinkinį",
|
||||
"Kicks user with given id": "Išmeta naudotoją su nurodytu id",
|
||||
"Bans user with given id": "Užblokuoja naudotoja su nurodytu id",
|
||||
"Unbans user with given id": "Atblokuoja naudotoją su nurodytu id",
|
||||
"%(senderName)s banned %(targetName)s.": "%(senderName)s užblokavo naudotoją %(targetName)s.",
|
||||
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s atblokavo naudotoją %(targetName)s.",
|
||||
"%(senderName)s kicked %(targetName)s.": "%(senderName)s išmetė naudotoją %(targetName)s.",
|
||||
"(not supported by this browser)": "(nėra palaikoma šios naršyklės)",
|
||||
"(no answer)": "(nėra atsakymo)",
|
||||
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s padarė kambario ateities istoriją matomą visiems kambario dalyviams nuo to laiko, kai jie buvo pakviesti.",
|
||||
"%(senderName)s made future room history visible to all room members.": "%(senderName)s padarė kambario ateities istoriją matomą visiems kambario dalyviams.",
|
||||
"%(senderName)s made future room history visible to anyone.": "%(senderName)s padarė kambario ateities istoriją matomą bet kam.",
|
||||
"%(names)s and %(count)s others are typing|one": "%(names)s ir dar vienas naudotojas rašo",
|
||||
"Your browser does not support the required cryptography extensions": "Jūsų naršyklė nepalaiko reikalingų kriptografijos plėtinių",
|
||||
"Not a valid Riot keyfile": "Negaliojantis Riot rakto failas",
|
||||
"Authentication check failed: incorrect password?": "Tapatybės nustatymo patikrinimas patyrė nesėkmę: neteisingas slaptažodis?",
|
||||
"Send analytics data": "Siųsti analitinius duomenis",
|
||||
"Incoming voice call from %(name)s": "Gaunamasis balso skambutis nuo %(name)s",
|
||||
"Incoming video call from %(name)s": "Gaunamasis vaizdo skambutis nuo %(name)s",
|
||||
"Incoming call from %(name)s": "Gaunamasis skambutis nuo %(name)s",
|
||||
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Šiuo metu slaptažodžio pakeitimas atstatys bet kokius ištisinio šifravimo raktus visuose įrenginiuose ir tokiu būdu pavers šifruotą pokalbių istoriją neperskaitoma, nebent, iš pradžių, savo kambario raktus eksportuosite, o po to, juos importuosite iš naujo. Ateityje tai bus patobulinta.",
|
||||
"Change Password": "Keisti slaptažodį",
|
||||
"Authentication": "Tapatybės nustatymas",
|
||||
"The maximum permitted number of widgets have already been added to this room.": "Į šį kambarį jau yra pridėtas didžiausias leidžiamas valdiklių skaičius.",
|
||||
"Your key share request has been sent - please check your other devices for key share requests.": "Jūsų rakto bendrinimo užklausa išsiųsta - patikrinkite kitus savo įrenginius, ar juose nėra rakto bendrinimo užklausų.",
|
||||
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Rakto bendrinimo užklausos yra išsiunčiamos į jūsų kitus įrenginius automatiškai. Jeigu savo kitame įrenginyje atmetėte ar nepaisėte rakto užklausos, spustelėkite čia, norėdami dar kartą užklausti raktų šiam seansui.",
|
||||
"Please select the destination room for this message": "Pasirinkite šiai žinutei paskirties kambarį",
|
||||
"No devices with registered encryption keys": "Nėra jokių įrenginių su registruotais šifravimo raktais",
|
||||
"Make Moderator": "Padaryti moderatoriumi",
|
||||
"Level:": "Lygis:",
|
||||
"Hangup": "Padėti ragelį",
|
||||
"No pinned messages.": "Nėra jokių prisegtų žinučių.",
|
||||
"Online for %(duration)s": "Prisijungęs %(duration)s",
|
||||
"Idle for %(duration)s": "Neveiklus %(duration)s",
|
||||
"Offline for %(duration)s": "Atsijungęs %(duration)s",
|
||||
"Idle": "Neveiklus",
|
||||
"Offline": "Atsijungęs",
|
||||
"Failed to set avatar.": "Nepavyko nustatyti avataro.",
|
||||
"Forget room": "Pamiršti kambarį",
|
||||
"Share room": "Bendrinti kambarį",
|
||||
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Šiame kambaryje yra nepatvirtintų įrenginių: jeigu tęsite jų nepatvirtinę, tuomet kas nors galės slapta klausytis jūsų skambučio.",
|
||||
"Usage": "Naudojimas",
|
||||
"Searches DuckDuckGo for results": "Atlieka rezultatų paiešką sistemoje DuckDuckGo",
|
||||
"To use it, just wait for autocomplete results to load and tab through them.": "Norėdami tai naudoti, tiesiog, palaukite, kol bus įkelti automatiškai užbaigti rezultatai, o tuomet, pereikite per juos naudodami Tab klavišą.",
|
||||
"%(targetName)s left the room.": "%(targetName)s išėjo iš kambario.",
|
||||
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s pakeitė prisegtas kambario žinutes.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Atleiskite, jūsų namų serveris yra per senas dalyvauti šiame kambaryje.",
|
||||
"Please contact your homeserver administrator.": "Prašome susisiekti su savo namų serverio administratoriumi.",
|
||||
"Enable inline URL previews by default": "Įjungti tiesiogines URL nuorodų peržiūras pagal numatymą",
|
||||
"Enable URL previews for this room (only affects you)": "Įjungti URL nuorodų peržiūras šiame kambaryje (įtakoja tik jus)",
|
||||
"Enable URL previews by default for participants in this room": "Įjungti URL nuorodų peržiūras pagal numatymą dalyviams šiame kambaryje",
|
||||
"Confirm password": "Pakartokite slaptažodį",
|
||||
"Demote yourself?": "Pažeminti save?",
|
||||
"Demote": "Pažeminti",
|
||||
"Share Link to User": "Bendrinti nuorodą su naudotoju",
|
||||
"Direct chats": "Tiesioginiai pokalbiai",
|
||||
"The conversation continues here.": "Pokalbis tęsiasi čia.",
|
||||
"Jump to message": "Pereiti prie žinutės",
|
||||
"Drop here to demote": "Vilkite čia, norėdami pažeminti",
|
||||
"Favourites": "Mėgstami",
|
||||
"This invitation was sent to an email address which is not associated with this account:": "Šis pakvietimas buvo išsiųstas į el. pašto adresą, kuris nėra susietas su šia paskyra:",
|
||||
"You may wish to login with a different account, or add this email to this account.": "Jūs galite pageidauti prisijungti, naudojant kitą paskyrą, arba pridėti šį el. paštą į šią paskyrą.",
|
||||
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s išmetė jus iš %(roomName)s.",
|
||||
"You have been kicked from this room by %(userName)s.": "%(userName)s išmetė jus iš šio kambario.",
|
||||
"You have been banned from %(roomName)s by %(userName)s.": "%(userName)s užblokavo jus kambaryje %(roomName)s.",
|
||||
"You have been banned from this room by %(userName)s.": "%(userName)s užblokavo jus šiame kambaryje.",
|
||||
"To change the room's name, you must be a": "Norėdami pakeisti kambario pavadinimą, privalote būti",
|
||||
"To change the room's main address, you must be a": "Norėdami pakeisti pagrindinį kambario adresą, privalote būti",
|
||||
"To change the room's history visibility, you must be a": "Norėdami pakeisti kambario istorijos matomumą, privalote būti",
|
||||
"To change the permissions in the room, you must be a": "Norėdami pakeisti leidimus kambaryje, privalote būti",
|
||||
"To modify widgets in the room, you must be a": "Norėdami modifikuoti valdiklius šiame kambaryje, privalote būti",
|
||||
"The visibility of existing history will be unchanged": "Esamos istorijos matomumas išliks nepakeistas",
|
||||
"End-to-end encryption is in beta and may not be reliable": "Ištisinis šifravimas yra beta versijoje ir gali būti nepatikimas",
|
||||
"You should not yet trust it to secure data": "Kol kas neturėtumėte pasitikėti, kad jis apsaugos jūsų duomenis",
|
||||
"Encryption is enabled in this room": "Šifravimas šiame kambaryje yra įjungtas",
|
||||
"Encryption is not enabled in this room": "Šifravimas šiame kambaryje nėra įjungtas",
|
||||
"To kick users, you must be a": "Norėdami išmesti naudotojus, privalote būti",
|
||||
"To ban users, you must be a": "Norėdami užblokuoti naudotojus, privalote būti",
|
||||
"Banned users": "Užblokuoti naudotojai",
|
||||
"This room is not accessible by remote Matrix servers": "Šis kambarys nėra pasiekiamas nuotoliniams Matrix serveriams",
|
||||
"Who can read history?": "Kas gali skaityti istoriją?",
|
||||
"Room version number: ": "Kambario versijos numeris: ",
|
||||
"There is a known vulnerability affecting this room.": "Yra žinomas pažeidžiamumas, kuris paveikia šį kambarį.",
|
||||
"Only room administrators will see this warning": "Šį įspėjimą matys tik kambario administratoriai",
|
||||
"Remote addresses for this room:": "Nuotoliniai šio kambario adresai:",
|
||||
"You have <a>enabled</a> URL previews by default.": "Jūs esate <a>įjungę</a> URL nuorodų peržiūras pagal numatymą.",
|
||||
"You have <a>disabled</a> URL previews by default.": "Jūs esate <a>išjungę</a> URL nuorodų peržiūras pagal numatymą.",
|
||||
"URL previews are enabled by default for participants in this room.": "URL nuorodų peržiūros yra įjungtos pagal numatymą šio kambario dalyviams.",
|
||||
"URL previews are disabled by default for participants in this room.": "URL nuorodų peržiūros yra išjungtos pagal numatymą šio kambario dalyviams.",
|
||||
"Invalid file%(extra)s": "Neteisingas failas %(extra)s",
|
||||
"This room is a continuation of another conversation.": "Šis kambarys yra kito pokalbio pratęsimas.",
|
||||
"Click here to see older messages.": "Spustelėkite čia, norėdami matyti senesnes žinutes.",
|
||||
"This Home Server would like to make sure you are not a robot": "Šis namų serveris norėtų įsitikinti, kad nesate robotas",
|
||||
"Token incorrect": "Neteisingas prieigos raktas",
|
||||
"Sign in with": "Prisijungti naudojant",
|
||||
"Sign in": "Prisijungti",
|
||||
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Jeigu nenurodysite savo el. pašto adreso, negalėsite atstatyti savo slaptažodį. Ar esate tikri?",
|
||||
"Home server URL": "Namų serverio URL",
|
||||
"Identity server URL": "Tapatybės serverio URL",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Norėdami tęsti naudotis paslauga, <a>susisiekite su savo paslaugos administratoriumi</a>.",
|
||||
"Reload widget": "Įkelti valdiklį iš naujo",
|
||||
"Picture": "Paveikslas",
|
||||
"Create new room": "Sukurti naują kambarį",
|
||||
"No results": "Jokių rezultatų",
|
||||
"Delete": "Ištrinti",
|
||||
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
|
||||
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s pasikeitė savo vardą",
|
||||
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s pasikeitė savo avatarą",
|
||||
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s pasikeitė savo avatarą",
|
||||
"collapse": "suskleisti",
|
||||
"expand": "išskleisti",
|
||||
"Room directory": "Kambarių katalogas",
|
||||
"Start chat": "Pradėti pokalbį",
|
||||
"ex. @bob:example.com": "pvz., @jonas:example.com",
|
||||
"Add User": "Pridėti naudotoją",
|
||||
"Matrix ID": "Matrix ID",
|
||||
"email address": "el. pašto adresas",
|
||||
"You have entered an invalid address.": "Įvedėte neteisingą adresą.",
|
||||
"Try using one of the following valid address types: %(validTypesList)s.": "Pabandykite naudoti vieną iš šių teisingų adreso tipų: %(validTypesList)s.",
|
||||
"Logs sent": "Žurnalai išsiųsti",
|
||||
"Failed to send logs: ": "Nepavyko išsiųsti žurnalų: ",
|
||||
"Submit debug logs": "Pateikti derinimo žurnalus",
|
||||
"Start new chat": "Pradėti naują pokalbį",
|
||||
"Click on the button below to start chatting!": "Norėdami pradėti bendravimą, paspauskite ant žemiau esančio mygtuko!",
|
||||
"Create Community": "Sukurti bendruomenę",
|
||||
"Community Name": "Bendruomenės pavadinimas",
|
||||
"Example": "Pavyzdys",
|
||||
"Community ID": "Bendruomenės ID",
|
||||
"example": "pavyzdys",
|
||||
"Create": "Sukurti",
|
||||
"Create Room": "Sukurti kambarį",
|
||||
"Room name (optional)": "Kambario pavadinimas (nebūtina)",
|
||||
"Advanced options": "Išplėstiniai parametrai",
|
||||
"This setting cannot be changed later!": "Šio nustatymo vėliau nebeįmanoma bus pakeisti!",
|
||||
"Unknown error": "Nežinoma klaida",
|
||||
"Incorrect password": "Neteisingas slaptažodis",
|
||||
"To continue, please enter your password:": "Norėdami tęsti, įveskite savo slaptažodį:",
|
||||
"password": "slaptažodis",
|
||||
"Device name": "Įrenginio pavadinimas",
|
||||
"Device key": "Įrenginio raktas",
|
||||
"An error has occurred.": "Įvyko klaida.",
|
||||
"Ignore request": "Nepaisyti užklausos",
|
||||
"Loading device info...": "Įkeliama įrenginio informacija...",
|
||||
"Failed to upgrade room": "Nepavyko atnaujinti kambarį",
|
||||
"The room upgrade could not be completed": "Nepavyko užbaigti kambario naujinimo",
|
||||
"Sign out": "Atsijungti",
|
||||
"Log out and remove encryption keys?": "Atsijungti ir pašalinti šifravimo raktus?",
|
||||
"Send Logs": "Siųsti žurnalus",
|
||||
"Refresh": "Įkelti iš naujo",
|
||||
"Unable to restore session": "Nepavyko atkurti seanso",
|
||||
"Invalid Email Address": "Neteisingas el. pašto adresas"
|
||||
}
|
||||
|
|
|
@ -112,5 +112,6 @@
|
|||
"Quote": "Sitat",
|
||||
"Collapse panel": "Skjul panel",
|
||||
"Saturday": "Lørdag",
|
||||
"There are advanced notifications which are not shown here": "Det er avanserte varsler som ikke vises her"
|
||||
"There are advanced notifications which are not shown here": "Det er avanserte varsler som ikke vises her",
|
||||
"Dismiss": "Avvis"
|
||||
}
|
||||
|
|
|
@ -1180,5 +1180,51 @@
|
|||
"This room is used for important messages from the Homeserver, so you cannot leave it.": "Deze ruimte wordt gebruikt voor belangrijke berichten van de thuisserver, dus je kan het niet verlaten.",
|
||||
"Terms and Conditions": "Voorwaarden",
|
||||
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Om de %(homeserverDomain)s thuisserver te blijven gebruiken zal je de voorwaarden moeten lezen en ermee akkoord moeten gaan.",
|
||||
"Review terms and conditions": "Voorwaarden lezen"
|
||||
"Review terms and conditions": "Voorwaarden lezen",
|
||||
"A conference call could not be started because the intgrations server is not available": "Een groepsgesprek kon niet worden gestart omdat de integratieserver niet beschikbaar is",
|
||||
"Call in Progress": "Lopend gesprek",
|
||||
"A call is currently being placed!": "Een gesprek wordt gestart!",
|
||||
"A call is already in progress!": "Er loopt al een gesprek!",
|
||||
"Permission Required": "Toestemming benodigd",
|
||||
"You do not have permission to start a conference call in this room": "Je hebt niet de toestemming om in deze ruimte een groepsgesprek te starten",
|
||||
"Show empty room list headings": "Lege koppen in ruimtelijst weergeven",
|
||||
"This event could not be displayed": "Deze gebeurtenis kon niet worden weergegeven",
|
||||
"Encrypting": "Versleutelen",
|
||||
"Encrypted, not sent": "Versleuteld, niet verstuurd",
|
||||
"Demote yourself?": "Jezelf degraderen?",
|
||||
"Demote": "Degraderen",
|
||||
"Share Link to User": "Link met gebruiker delen",
|
||||
"deleted": "verwijderd",
|
||||
"underlined": "onderstreept",
|
||||
"inline-code": "code in de regel",
|
||||
"block-quote": "citaat",
|
||||
"bulleted-list": "lijst met opsommingstekens",
|
||||
"numbered-list": "genummerde lijst",
|
||||
"Share room": "Ruimte delen",
|
||||
"System Alerts": "Systeemmeldingen",
|
||||
"You have no historical rooms": "Je hebt geen historische ruimtes",
|
||||
"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.": "In versleutelde ruimtes, zoals deze, zijn URL-voorvertoningen standaard uitgeschakeld om ervoor te zorgen dat jouw thuisserver (waar de voorvertoningen worden gemaakt) geen informatie kan verzamelen over de links die je in deze ruimte ziet.",
|
||||
"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.": "Als iemand een URL in zijn of haar bericht zet, kan er een URL-voorvertoning weergegeven worden om meer informatie over de link te geven, zoals de titel, omschrijving en een afbeelding van de website.",
|
||||
"The email field must not be blank.": "Het e-mailveld mag niet leeg zijn.",
|
||||
"The user name field must not be blank.": "Het gebruikersnaamveld mag niet leeg zijn.",
|
||||
"The phone number field must not be blank.": "Het telefoonnummerveld mag niet leeg zijn.",
|
||||
"The password field must not be blank.": "Het wachtwoordveld mag niet leeg zijn.",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Deze thuisserver heeft zijn maandelijkse gebruikerslimiet bereikt. Neem contact op met de beheerder van je thuisserver om de dienst weer te kunnen gebruiken.",
|
||||
"Failed to remove widget": "Widget kon niet worden verwijderd",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Er is een fout opgetreden tijdens het verwijderen van de widget uit deze ruimte",
|
||||
"Share Room": "Ruimte delen",
|
||||
"Link to most recent message": "Link naar meest recente bericht",
|
||||
"Share User": "Gebruiker delen",
|
||||
"Share Community": "Gemeenschap delen",
|
||||
"Share Room Message": "Bericht uit ruimte delen",
|
||||
"Link to selected message": "Link naar geselecteerde bericht",
|
||||
"COPY": "KOPIËREN",
|
||||
"Share Message": "Bericht delen",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Je kunt geen berichten sturen totdat je <consentLink>onze algemene voorwaarden</consentLink> hebt gelezen en geaccepteerd.",
|
||||
"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.": "Je bericht is niet verstuurd omdat deze thuisserver zijn maandelijkse gebruikerslimiet heeft bereikt. Neem contact op met de beheerder van je thuisserver om de dienst te kunnen blijven gebruiken.",
|
||||
"No Audio Outputs detected": "Geen geluidsuitgangen gedetecteerd",
|
||||
"Audio Output": "Geluidsuitgang",
|
||||
"This homeserver has hit its Monthly Active User limit": "Deze thuisserver heeft zijn maandelijkse gebruikerslimiet bereikt",
|
||||
"Please contact your service administrator to continue using this service.": "Neem contact op met de beheerder van je thuisserver om de dienst te kunnen blijven gebruiken.",
|
||||
"Try the app first": "De app eerst proberen"
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -151,7 +151,7 @@
|
|||
"Changes to who can read history will only apply to future messages in this room": "Zmiany w dostępie do historii będą dotyczyć tylko przyszłych wiadomości w tym pokoju",
|
||||
"Changes your display nickname": "Zmień swój pseudonim",
|
||||
"Changes colour scheme of current room": "Zmień schemat kolorystyczny bieżącego pokoju",
|
||||
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmiana hasła zresetuje klucze szyfrowania końcówka-do-końcówki na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.",
|
||||
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmiana hasła zresetuje klucze szyfrowania end-to-end na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.",
|
||||
"Claimed Ed25519 fingerprint key": "Zażądano odcisk klucza Ed25519",
|
||||
"Clear Cache and Reload": "Wyczyść pamięć podręczną i przeładuj",
|
||||
"Clear Cache": "Wyczyść pamięć podręczną",
|
||||
|
@ -215,8 +215,8 @@
|
|||
"Encryption is enabled in this room": "Szyfrowanie jest włączone w tym pokoju",
|
||||
"Encryption is not enabled in this room": "Szyfrowanie nie jest włączone w tym pokoju",
|
||||
"%(senderName)s ended the call.": "%(senderName)s zakończył połączenie.",
|
||||
"End-to-end encryption information": "Informacje o szyfrowaniu końcówka-do-końcówki",
|
||||
"End-to-end encryption is in beta and may not be reliable": "Szyfrowanie końcówka-do-końcówki jest w fazie beta i może nie być dopracowane",
|
||||
"End-to-end encryption information": "Informacje o szyfrowaniu end-to-end",
|
||||
"End-to-end encryption is in beta and may not be reliable": "Szyfrowanie end-to-end jest w fazie beta i może nie być dopracowane",
|
||||
"Enter Code": "Wpisz kod",
|
||||
"Enter passphrase": "Wpisz frazę",
|
||||
"Error decrypting attachment": "Błąd odszyfrowywania załącznika",
|
||||
|
@ -253,7 +253,7 @@
|
|||
"Forget room": "Zapomnij pokój",
|
||||
"Forgot your password?": "Zapomniałeś hasła?",
|
||||
"For security, this session has been signed out. Please sign in again.": "Ze względów bezpieczeństwa ta sesja została wylogowana. Zaloguj się jeszcze raz.",
|
||||
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Ze względów bezpieczeństwa, wylogowanie skasuje z tej przeglądarki wszystkie klucze szyfrowania końcówka-do-końcówki. Jeśli chcesz móc odszyfrować swoje historie konwersacji z przyszłych sesji Riot-a, proszę wyeksportuj swoje klucze pokojów do bezpiecznego miejsca.",
|
||||
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Ze względów bezpieczeństwa, wylogowanie skasuje z tej przeglądarki wszystkie klucze szyfrowania end-to-end. Jeśli chcesz móc odszyfrować swoje historie konwersacji z przyszłych sesji Riot-a, proszę wyeksportuj swoje klucze pokojów do bezpiecznego miejsca.",
|
||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s",
|
||||
"Guest access is disabled on this Home Server.": "Dostęp dla gości jest wyłączony na tym serwerze.",
|
||||
"Deops user with given id": "Usuwa prawa administratora użytkownikowi o danym ID",
|
||||
|
@ -380,7 +380,7 @@
|
|||
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ukryj wiadomości o dołączeniu/opuszczeniu (nie obejmuje zaproszeń/wyrzuceń/banów)",
|
||||
"Hide read receipts": "Ukryj potwierdzenia odczytu",
|
||||
"Historical": "Historyczne",
|
||||
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetowanie hasła zresetuje klucze szyfrowania końcówka-do-końcówki na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.",
|
||||
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetowanie hasła zresetuje klucze szyfrowania end-to-end na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.",
|
||||
"Riot was not given permission to send notifications - please try again": "Riot nie otrzymał uprawnień do wysyłania powiadomień - proszę spróbuj ponownie",
|
||||
"riot-web version:": "wersja riot-web:",
|
||||
"Room %(roomId)s not visible": "Pokój %(roomId)s nie jest widoczny",
|
||||
|
@ -1132,5 +1132,19 @@
|
|||
"The email field must not be blank.": "Pole email nie może być puste.",
|
||||
"The user name field must not be blank.": "Pole nazwy użytkownika nie może być puste.",
|
||||
"The phone number field must not be blank.": "Pole numeru telefonu nie może być puste.",
|
||||
"The password field must not be blank.": "Pole hasła nie może być puste."
|
||||
"The password field must not be blank.": "Pole hasła nie może być puste.",
|
||||
"Call Failed": "Nieudane połączenie",
|
||||
"You have no historical rooms": "Nie masz żadnych historycznych pokoi",
|
||||
"Flair": "Wyróżnik społeczności",
|
||||
"Showing flair for these communities:": "Wyświetlanie wyróżników dla tych społeczności:",
|
||||
"This room is not showing flair for any communities": "Ten pokój nie wyświetla wyróżników dla żadnych społeczności",
|
||||
"Flair will appear if enabled in room settings": "Wyróżnik pojawi się, jeśli został włączony w ustawieniach pokoju",
|
||||
"Flair will not appear": "Wyróżnik nie wyświetli się",
|
||||
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sdołączył",
|
||||
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Wyślij ponownie wiadomość</resendText> lub <cancelText>anuluj wiadomość</cancelText>.",
|
||||
"was invited %(count)s times|other": "został zaproszony %(count)s razy",
|
||||
"was invited %(count)s times|one": "został zaproszony",
|
||||
"was banned %(count)s times|one": "został zablokowany",
|
||||
"was kicked %(count)s times|one": "został wyrzucony",
|
||||
"Whether or not you're using the Richtext mode of the Rich Text Editor": ""
|
||||
}
|
||||
|
|
|
@ -861,7 +861,7 @@
|
|||
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Сообщение отправлено на %(emailAddress)s. После перехода по ссылке в отправленном вам письме, щелкните ниже.",
|
||||
"Room Notification": "Уведомления комнаты",
|
||||
"Drop here to tag direct chat": "Перетащите сюда, чтобы пометить как личный чат",
|
||||
"Drop here to restore": "Перетащиет сюда, чтобы вернуть",
|
||||
"Drop here to restore": "Перетащите сюда, чтобы вернуть",
|
||||
"Drop here to demote": "Перетащите сюда, чтобы понизить",
|
||||
"Community Invites": "Приглашения в сообщества",
|
||||
"Notify the whole room": "Уведомить всю комнату",
|
||||
|
@ -1155,7 +1155,7 @@
|
|||
"We encountered an error trying to restore your previous session.": "Произошла ошибка при попытке восстановить предыдущий сеанс.",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очистка хранилища вашего браузера может устранить проблему, но при этом ваша сессия будет завершена и зашифрованная история чата станет нечитаемой.",
|
||||
"Unable to reply": "Не удается ответить",
|
||||
"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.": "Не удается загрузить событие, на которое был дан ответ. Либо оно не существует, либо у вас нет разрешения на его просмотр.",
|
||||
"Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах",
|
||||
"Collapse Reply Thread": "Ответить с цитированием",
|
||||
"Send analytics data": "Отправить данные аналитики",
|
||||
|
@ -1209,8 +1209,30 @@
|
|||
"Demote yourself?": "Понизить самого себя?",
|
||||
"This event could not be displayed": "Это событие отобразить невозможно",
|
||||
"deleted": "удален",
|
||||
"underlined": "подчеркнут",
|
||||
"underlined": "подчеркнутый",
|
||||
"A conference call could not be started because the intgrations server is not available": "Запуск конференции невозможен из-за недоступности сервера интеграции",
|
||||
"Permission Required": "Требуется разрешение",
|
||||
"You do not have permission to start a conference call in this room": "У вас нет разрешения на запуск конференции в этой комнате"
|
||||
"You do not have permission to start a conference call in this room": "У вас нет разрешения на запуск конференции в этой комнате",
|
||||
"A call is currently being placed!": "Есть активный вызов!",
|
||||
"Failed to remove widget": "Не удалось удалить виджет",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Произошла ошибка при удалении виджета из комнаты",
|
||||
"System Alerts": "Системные оповещения",
|
||||
"Please contact your service administrator to continue using this service.": "Для продолжения использования этого сервиса обратитесь к администратору.",
|
||||
"Room version number: ": "Номер версии комнаты: ",
|
||||
"Internal room ID: ": "Внутренний ID комнаты: ",
|
||||
"There is a known vulnerability affecting this room.": "В этой комнате есть известная уязвимость.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Эта версия комнаты уязвима для злонамеренной модификации состояния.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Нажмите здесь, чтобы перейти к последней версии комнаты и обеспечить ее целостность.",
|
||||
"Only room administrators will see this warning": "Только администраторы комнат увидят это предупреждение",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Пожалуйста, <a>обратитесь к вашему администратору</a>, чтобы продолжить использование сервиса.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Пожалуйста, <a>обратитесь к вашему администратору</a>, чтобы увеличить этот лимит.",
|
||||
"Upgrade Room Version": "Обновление версии комнаты",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Обновление этой комнаты требует закрытия текущей комнаты и создания новой. Чтобы предоставить участникам комнаты наилучший опыт, мы:",
|
||||
"Create a new room with the same name, description and avatar": "Создадим новую комнату с тем же именем, описанием и аватаром",
|
||||
"Update any local room aliases to point to the new room": "Обновим локальные псевдонимы комнат",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Остановим общение пользователей в старой версии комнаты и опубликуем сообщение, в котором пользователям рекомендуется перейти в новую комнату",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Разместим ссылку на старую комнату, чтобы люди могли видеть старые сообщения",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Пожалуйста, <a>обратитесь к вашему администратору</a>, чтобы продолжить использовать этот сервис.",
|
||||
"Increase performance by only loading room members on first view": "Увеличьте производительность, загрузив только список участников комнаты",
|
||||
"Lazy loading members not supported": "Задержка загрузки элементов не поддерживается"
|
||||
}
|
||||
|
|
|
@ -1222,5 +1222,40 @@
|
|||
"numbered-list": "Číselný zoznam",
|
||||
"Failed to remove widget": "Nepodarilo sa odstrániť widget",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Pri odstraňovaní widgetu z miestnosti sa vyskytla chyba",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Nemôžete posielať žiadne správy, kým si neprečítate a neodsúhlasíte <consentLink>naše zmluvné podmienky</consentLink>."
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Nemôžete posielať žiadne správy, kým si neprečítate a neodsúhlasíte <consentLink>naše zmluvné podmienky</consentLink>.",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Prepáčte, nie je možné prijímať a odosielať do tejto miestnosti, pretože váš domovský server je zastaralý.",
|
||||
"Please contact your homeserver administrator.": "Prosím, kontaktujte správcu domovského servera.",
|
||||
"Increase performance by only loading room members on first view": "Zvýšiť výkon načítaním zoznamu členov pri prvom zobrazení",
|
||||
"System Alerts": "Systémové upozornenia",
|
||||
"Internal room ID: ": "Interné ID miestnosti: ",
|
||||
"Room version number: ": "Číslo verzie miestnosti: ",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "Prosím, <a>kontaktujte správcu služieb</a> aby ste službu mohli naďalej používať.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Bol dosiahnutý mesačný limit počtu aktívnych používateľov tohoto domovského servera.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Bol prekročený limit využitia prostriedkov pre tento domovský server.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "Prosím, <a>kontaktujte správcu služieb</a> a pokúste sa tento limit navýšiť.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Bol dosiahnutý mesačný limit počtu aktívnych používateľov a <b>niektorí používatelia sa nebudú môcť prihlásiť</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Bol prekročený limit využitia prostriedkov pre tento domovský server a <b>niektorí používatelia sa nebudú môcť prihlásiť</b>.",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Vaša správa nebola odoslaná, pretože bol dosiahnutý mesačný limit počtu aktívnych používateľov tohoto domovského servera. Prosím, <a>kontaktujte správcu služieb</a> aby ste službu mohli naďalej používať.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Vaša správa nebola odoslaná, pretože bol prekročený limit prostriedkov tohoto domovského servera. Prosím, <a>kontaktujte správcu služieb</a> aby ste službu mohli naďalej používať.",
|
||||
"Lazy loading members not supported": "Načítanie zoznamu členov pri prvom zobrazení nie je podporované",
|
||||
"Lazy loading is not supported by your current homeserver.": "Oneskorené načítanie nepodporuje váš domovský server.",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "Prosím, <a>kontaktujte správcu služieb</a> aby ste mohli službu ďalej používať.",
|
||||
"This room has been replaced and is no longer active.": "Táto miestnosť bola nahradená a nie je viac aktívna.",
|
||||
"The conversation continues here.": "Konverzácia pokračuje tu.",
|
||||
"Upgrade room to version %(ver)s": "Aktualizácia miestnosti na verziu %(ver)s",
|
||||
"There is a known vulnerability affecting this room.": "Existuje známa zraniteľnosť, ktorú je možné zneužiť v tejto miestnosti.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Táto verzia miestnosti je zraniteľná proti zlomyseľným zmenám jej stavu.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Kliknutím sem aktualizujete miestnosť na najnovšiu verziu a uistíte sa, že jej integrita je bezpečne zachovaná.",
|
||||
"Only room administrators will see this warning": "Toto upozornenie sa zobrazuje len správcom miestnosti",
|
||||
"This room is a continuation of another conversation.": "Táto miestnosť je pokračovaním staršej konverzácii.",
|
||||
"Click here to see older messages.": "Kliknutím sem zobrazíte staršie správy.",
|
||||
"Failed to upgrade room": "Nepodarilo sa aktualizovať miestnosť",
|
||||
"The room upgrade could not be completed": "Nie je možné dokončiť aktualizáciu miestnosti na jej najnovšiu verziu",
|
||||
"Upgrade this room to version %(version)s": "Aktualizácia tejto miestnosti na verziu %(version)s",
|
||||
"Upgrade Room Version": "Aktualizovať verziu miestnosti",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Aktualizácia verzii tejto miestnosti si vyžaduje jej uzatvorenie a vytvorenie novej miestnosti na jej pôvodnom mieste. Aby bol prechod pre členov miestnosti čo najplynulejší, nasledovné kroky sa vykonajú automaticky:",
|
||||
"Create a new room with the same name, description and avatar": "Vznikne nová miestnosť s rovnakým názvom, témou a obrázkom",
|
||||
"Update any local room aliases to point to the new room": "Všetky lokálne aliasy pôvodnej miestnosti sa aktualizujú tak, aby ukazovali na novú miestnosť",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "V pôvodnej miestnosti bude zverejnené odporúčanie prejsť do novej miestnosti a posielanie do pôvodnej miestnosti bude zakázané pre všetkých používateľov",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "História novej miestnosti sa začne odkazom do pôvodnej miestnosti, aby si členovia vedeli zobraziť staršie správy"
|
||||
}
|
||||
|
|
|
@ -1196,5 +1196,18 @@
|
|||
"COPY": "КОПИРАЈ",
|
||||
"Share Message": "Подели поруку",
|
||||
"No Audio Outputs detected": "Нема уочених излаза звука",
|
||||
"Audio Output": "Излаз звука"
|
||||
"Audio Output": "Излаз звука",
|
||||
"A conference call could not be started because the intgrations server is not available": "Конференцијски позив не може почети зато што интеграцијски сервер није доступан",
|
||||
"Call in Progress": "Позив је у току",
|
||||
"A call is currently being placed!": "Успостављамо позив!",
|
||||
"A call is already in progress!": "Позив је у току!",
|
||||
"Permission Required": "Неопходна је дозвола",
|
||||
"You do not have permission to start a conference call in this room": "Немате дозволу да започињете конференцијски позив у овој соби",
|
||||
"Show empty room list headings": "Прикажи листу наслова празних соба",
|
||||
"This event could not be displayed": "Овај догађај не може бити приказан",
|
||||
"Demote yourself?": "Снизите чин себи?",
|
||||
"Demote": "Снизите чин",
|
||||
"deleted": "обрисано",
|
||||
"underlined": "подвучено",
|
||||
"You have no historical rooms": "Ваша историја соба је празна"
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
"Clear Cache and Reload": "Töm cache och ladda om",
|
||||
"Clear Cache": "Töm cache",
|
||||
"Click here to fix": "Klicka här för att fixa",
|
||||
"Click to mute audio": "Klicka för att dämpa ljud",
|
||||
"Click to mute audio": "Klicka för att tysta ljud",
|
||||
"Click to mute video": "Klicka för att stänga av video",
|
||||
"click to reveal": "klicka för att avslöja",
|
||||
"Click to unmute video": "Klicka för att sätta på video",
|
||||
|
@ -128,7 +128,7 @@
|
|||
"Failed to kick": "Det gick inte att kicka",
|
||||
"Failed to leave room": "Det gick inte att lämna rummet",
|
||||
"Failed to load timeline position": "Det gick inte att hämta positionen på tidslinjen",
|
||||
"Failed to mute user": "Det gick inte att dämpa användaren",
|
||||
"Failed to mute user": "Det gick inte att tysta användaren",
|
||||
"Failed to reject invite": "Det gick inte att avböja inbjudan",
|
||||
"Failed to reject invitation": "Det gick inte att avböja inbjudan",
|
||||
"Failed to save settings": "Det gick inte att spara inställningarna",
|
||||
|
@ -239,7 +239,7 @@
|
|||
"Mobile phone number": "Telefonnummer",
|
||||
"Mobile phone number (optional)": "Telefonnummer (valfri)",
|
||||
"Moderator": "Moderator",
|
||||
"Mute": "Dämpa",
|
||||
"Mute": "Tysta",
|
||||
"%(serverName)s Matrix ID": "%(serverName)s Matrix-ID",
|
||||
"Name": "Namn",
|
||||
"Never send encrypted messages to unverified devices from this device": "Skicka aldrig krypterade meddelanden till overifierade enheter från den här enheten",
|
||||
|
@ -1003,8 +1003,8 @@
|
|||
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sbytte namn",
|
||||
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sändrade sin avatar %(count)s gånger",
|
||||
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sändrade sin avatar",
|
||||
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)ssändrade sin avatar %(count)s gånger",
|
||||
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)ssändrade sin avatar",
|
||||
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sändrade sin avatar %(count)s gånger",
|
||||
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sändrade sin avatar",
|
||||
"%(items)s and %(count)s others|other": "%(items)s och %(count)s andra",
|
||||
"%(items)s and %(count)s others|one": "%(items)s och en annan",
|
||||
"collapse": "fäll ihop",
|
||||
|
@ -1196,5 +1196,71 @@
|
|||
"Share Message": "Dela meddelande",
|
||||
"No Audio Outputs detected": "Inga ljudutgångar hittades",
|
||||
"Audio Output": "Ljudutgång",
|
||||
"Try the app first": "Testa appen först"
|
||||
"Try the app first": "Testa appen först",
|
||||
"A conference call could not be started because the intgrations server is not available": "Konferenssamtal kunde inte startas för integrationsservern är otillgänglig",
|
||||
"Call in Progress": "Samtal pågår",
|
||||
"A call is currently being placed!": "Ett samtal håller på att upprättas!",
|
||||
"A call is already in progress!": "Ett samtal pågår redan!",
|
||||
"Permission Required": "Behörighet krävs",
|
||||
"You do not have permission to start a conference call in this room": "Du har inte behörighet att starta ett konferenssamtal i detta rum",
|
||||
"This event could not be displayed": "Den här händelsen kunde inte visas",
|
||||
"deleted": "borttagen",
|
||||
"underlined": "understruken",
|
||||
"inline-code": "kod",
|
||||
"block-quote": "citat",
|
||||
"bulleted-list": "punktlista",
|
||||
"numbered-list": "nummerlista",
|
||||
"You have no historical rooms": "Du har inga historiska rum",
|
||||
"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 krypterade rum, som detta, är URL-förhandsvisning inaktiverad som standard för att säkerställa att din hemserver (där förhandsvisningar genereras) inte kan samla information om länkar du ser i rummet.",
|
||||
"The email field must not be blank.": "Email-fältet får inte vara tomt.",
|
||||
"The user name field must not be blank.": "Användarnamns-fältet får inte vara tomt.",
|
||||
"The phone number field must not be blank.": "Telefonnummer-fältet får inte vara tomt.",
|
||||
"The password field must not be blank.": "Lösenords-fältet får inte vara tomt.",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "Hemservern har nått sin månatliga gräns för användaraktivitet. Kontakta din serviceadministratör för att fortsätta använda servicen.",
|
||||
"Failed to remove widget": "Det gick inte att ta bort widget",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "Ett fel uppstod vid borttagning av widget från rummet",
|
||||
"Demote yourself?": "Sänk egen behörighetsnivå?",
|
||||
"Demote": "Degradera",
|
||||
"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.": "När någon postar en URL i sitt meddelande, kan URL-förhandsvisning ge mer information om länken, såsom titel, beskrivning, och en bild från webbplatsen.",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Du kan inte skicka några meddelanden innan du granskar och godkänner <consentLink>våra villkor</consentLink>.",
|
||||
"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.": "Ditt meddelande skickades inte för hemservern har nått sin månatliga gräns för användaraktivitet. Kontakta din serviceadministratör för att fortsätta använda servicen.",
|
||||
"This homeserver has hit its Monthly Active User limit": "Hemservern har nått sin månatliga gräns för användaraktivitet",
|
||||
"Please contact your service administrator to continue using this service.": "Kontakta din serviceadministratör för att fortsätta använda servicen.",
|
||||
"Show empty room list headings": "Visa tomma rumsrubriker",
|
||||
"System Alerts": "Systemvarningar",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "Tyvärr, din hemserver är för gammal för att delta i detta rum.",
|
||||
"Please contact your homeserver administrator.": "Vänligen kontakta din hemserver-administratör.",
|
||||
"Increase performance by only loading room members on first view": "Öka prestanda genom att bara ladda rumsdeltagare vid första visning",
|
||||
"Internal room ID: ": "Internt rums-ID: ",
|
||||
"Room version number: ": "Rumsversionsnummer: ",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "<a>Kontakta din serviceadministratör</a> för att fortsätta använda tjänsten.",
|
||||
"This homeserver has hit its Monthly Active User limit.": "Hemservern har nått sin månatliga gräns för användaraktivitet.",
|
||||
"This homeserver has exceeded one of its resource limits.": "Hemservern har överskridit en av sina resursgränser.",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "<a>Kontakta din serviceadministratör</a> för att få denna gräns ökad.",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Hemservern har nått sin månatliga gräns för användaraktivitet så <b>vissa användare kommer inte kunna logga in</b>.",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Hemservern har överskridit en av sina resursgränser så <b>vissa användare kommer inte kunna logga in</b>.",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Ditt meddelande skickades inte för hemservern har nått sin månatliga gräns för användaraktivitet. <a>Kontakta din serviceadministratör</a> för att fortsätta använda servicen.",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Ditt meddelande skickades inte för hemservern har överskridit en av sina resursgränser. <a>Kontakta din serviceadministratör</a> för att fortsätta använda servicen.",
|
||||
"Lazy loading members not supported": "Behovsladdning av medlemmar stöds inte",
|
||||
"Lazy loading is not supported by your current homeserver.": "Behovsladdning stöds inte av din nuvarande hemserver.",
|
||||
"Legal": "Juridiskt",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "<a>Kontakta din serviceadministratör</a> för att fortsätta använda servicen.",
|
||||
"This room has been replaced and is no longer active.": "Detta rum har ersatts och är inte längre aktivt.",
|
||||
"The conversation continues here.": "Konversationen fortsätter här.",
|
||||
"Upgrade room to version %(ver)s": "Uppgradera rummet till version %(ver)s",
|
||||
"There is a known vulnerability affecting this room.": "Det finns en känd sårbarhet som påverkar detta rum.",
|
||||
"This room version is vulnerable to malicious modification of room state.": "Denna rumsversion är sårbar för skadlig modifiering av rumstillstånd.",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "Klicka här för att uppgradera till senaste rumsversionen och se till att rumsintegriteten är skyddad.",
|
||||
"Only room administrators will see this warning": "Endast rumsadministratörer kommer att se denna varning",
|
||||
"This room is a continuation of another conversation.": "Detta rum är en fortsättning på en annan konversation.",
|
||||
"Click here to see older messages.": "Klicka här för att se äldre meddelanden.",
|
||||
"Failed to upgrade room": "Det gick inte att uppgradera rum",
|
||||
"The room upgrade could not be completed": "Rumsuppgraderingen kunde inte slutföras",
|
||||
"Upgrade this room to version %(version)s": "Uppgradera detta rum till version %(version)s",
|
||||
"Upgrade Room Version": "Uppgradera rumsversion",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "Uppgradering av detta rum kräver att nuvarande rumsinstans stängs och ersätts av ett nytt rum. För att ge rumsmedlemmarna bästa möjliga upplevelse, kommer vi att:",
|
||||
"Create a new room with the same name, description and avatar": "Skapa ett nytt rum med samma namn, beskrivning och avatar",
|
||||
"Update any local room aliases to point to the new room": "Uppdatera lokala rumsalias att peka på det nya rummet",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Hindra användare från att prata i den gamla rumsversionen och posta ett meddelande som rekommenderar användare att flytta till det nya rummet",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Sätta en länk tillbaka till det gamla rummet i början av det nya rummet så att folk kan se gamla meddelanden"
|
||||
}
|
||||
|
|
|
@ -574,11 +574,11 @@
|
|||
"Add User": "Kullanıcı Ekle",
|
||||
"This Home Server would like to make sure you are not a robot": "Bu Ana Sunucu robot olmadığınızdan emin olmak istiyor",
|
||||
"Sign in with CAS": "CAS ile oturum açın",
|
||||
"Custom Server Options": "Özel Sunucu Seçenekleri",
|
||||
"Custom Server Options": "Özelleştirilebilir Sunucu Seçenekleri",
|
||||
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Özel Sunucu Seçeneklerini diğer Matrix sunucularına giriş yapmak için farklı bir Ana Sunucu URL'si belirleyerek kullanabilirsiniz.",
|
||||
"This allows you to use this app with an existing Matrix account on a different home server.": "Bu, sizin bu uygulamayı varolan Matrix hesabınızla farklı Ana Sunucularda kullanmanıza izin verir.",
|
||||
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Ayrıca özel bir kimlik sunucusu da ayarlayabilirsiniz ancak bu e-posta adresine dayalı olarak kullanıcılarla olan etkileşimi engeller.",
|
||||
"Dismiss": "Uzaklaştır",
|
||||
"Dismiss": "Kapat",
|
||||
"Please check your email to continue registration.": "Kayıt işlemine devam etmek için lütfen e-postanızı kontrol edin.",
|
||||
"Token incorrect": "Belirteç(Token) hatalı",
|
||||
"Please enter the code it contains:": "Lütfen içerdiği kodu girin:",
|
||||
|
@ -751,5 +751,10 @@
|
|||
"View Source": "Kaynağı Görüntüle",
|
||||
"Collapse panel": "Katlanır panel",
|
||||
"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!": "Geçerli tarayıcınız ile birlikte , uygulamanın görünüş ve kullanım hissi tamamen hatalı olabilir ve bazı ya da tüm özellikler çalışmayabilir. Yine de denemek isterseniz devam edebilirsiniz ancak karşılaşabileceğiniz sorunlar karşısında kendi başınasınız !",
|
||||
"There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var"
|
||||
"There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var",
|
||||
"The platform you're on": "Bulunduğun platform",
|
||||
"The version of Riot.im": "Riot.im'in sürümü",
|
||||
"Whether or not you're logged in (we don't record your user name)": "Ne olursa olsun giriş yaptın (kullanıcı adınızı kaydetmeyiz)",
|
||||
"Your language of choice": "Seçtiginiz diliniz",
|
||||
"Which officially provided instance you are using, if any": ""
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@
|
|||
"Start Chat": "开始聊天",
|
||||
"Submit": "提交",
|
||||
"Success": "成功",
|
||||
"The default role for new room members is": "此聊天室新成员的默认角色是",
|
||||
"The default role for new room members is": "新成员默认是",
|
||||
"The main address for this room is": "此聊天室的主要地址是",
|
||||
"This email address is already in use": "此邮箱地址已被使用",
|
||||
"This email address was not found": "未找到此邮箱地址",
|
||||
|
@ -137,7 +137,7 @@
|
|||
"%(senderName)s answered the call.": "%(senderName)s 接了通话。.",
|
||||
"An error has occurred.": "一个错误出现了。",
|
||||
"Attachment": "附件",
|
||||
"Autoplay GIFs and videos": "自动播放GIF和视频",
|
||||
"Autoplay GIFs and videos": "自动播放 GIF 与视频",
|
||||
"%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s.",
|
||||
"Ban": "封禁",
|
||||
"Banned users": "被封禁的用户",
|
||||
|
@ -286,7 +286,7 @@
|
|||
"Add": "添加",
|
||||
"Allow": "允许",
|
||||
"Claimed Ed25519 fingerprint key": "声称的 Ed25519 指纹密钥",
|
||||
"Could not connect to the integration server": "无法连接集成服务器",
|
||||
"Could not connect to the integration server": "无法连接关联的服务器",
|
||||
"Curve25519 identity key": "Curve25519 认证密钥",
|
||||
"Edit": "编辑",
|
||||
"Joins room with given alias": "以指定的别名加入聊天室",
|
||||
|
@ -381,14 +381,14 @@
|
|||
"Example": "例子",
|
||||
"Create": "创建",
|
||||
"Failed to upload image": "上传图像失败",
|
||||
"Add a widget": "添加一个小部件",
|
||||
"Add a widget": "添加一个小挂件",
|
||||
"Accept": "接受",
|
||||
"Access Token:": "访问令牌:",
|
||||
"Cannot add any more widgets": "无法添加更多小组件",
|
||||
"Delete widget": "删除小组件",
|
||||
"Cannot add any more widgets": "无法添加更多小挂件",
|
||||
"Delete widget": "删除小挂件",
|
||||
"Define the power level of a user": "定义一个用户的特权级",
|
||||
"Drop here to tag %(section)s": "拖拽到这里标记 %(section)s",
|
||||
"Enable automatic language detection for syntax highlighting": "启用自动语言检测用于语法高亮",
|
||||
"Enable automatic language detection for syntax highlighting": "为语法高亮启用自动检测编程语言",
|
||||
"Failed to change power level": "修改特权级别失败",
|
||||
"Kick": "移除",
|
||||
"Kicks user with given id": "按照 ID 移除特定的用户",
|
||||
|
@ -399,7 +399,7 @@
|
|||
"Power level must be positive integer.": "权限级别必须是正整数。",
|
||||
"Reason: %(reasonText)s": "理由: %(reasonText)s",
|
||||
"Revoke Moderator": "撤销主持人",
|
||||
"Revoke widget access": "撤销小部件的访问",
|
||||
"Revoke widget access": "撤回小挂件的访问权",
|
||||
"Remote addresses for this room:": "此聊天室的远程地址:",
|
||||
"Remove Contact Information?": "移除联系人信息?",
|
||||
"Remove %(threePid)s?": "移除 %(threePid)s?",
|
||||
|
@ -419,7 +419,7 @@
|
|||
"This room's internal ID is": "此聊天室的内部 ID 为",
|
||||
"Turn Markdown off": "禁用 Markdown",
|
||||
"Turn Markdown on": "启用 Markdown",
|
||||
"Unable to create widget.": "无法创建小部件。",
|
||||
"Unable to create widget.": "无法创建小挂件。",
|
||||
"Unban": "解除封禁",
|
||||
"Unable to capture screen": "无法录制屏幕",
|
||||
"Unable to enable Notifications": "无法启用通知",
|
||||
|
@ -446,7 +446,7 @@
|
|||
"Unblacklist": "移出黑名单",
|
||||
"Not a valid Riot keyfile": "不是一个有效的 Riot 密钥文件",
|
||||
"%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀请。",
|
||||
"Do you want to load widget from URL:": "你想从此 URL 加载小组件吗:",
|
||||
"Do you want to load widget from URL:": "你是否要从此 URL 中加载小挂件:",
|
||||
"Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/退出消息(邀请/踢出/封禁不受影响)",
|
||||
"Integrations Error": "集成错误",
|
||||
"Publish this room to the public in %(domain)s's room directory?": "是否将此聊天室发布至 %(domain)s 的聊天室目录中?",
|
||||
|
@ -480,7 +480,7 @@
|
|||
"Refer a friend to Riot:": "介绍朋友加入Riot:",
|
||||
"%(roomName)s is not accessible at this time.": "%(roomName)s 此时无法访问。",
|
||||
"Start authentication": "开始认证",
|
||||
"The maximum permitted number of widgets have already been added to this room.": "此聊天室可拥有的小部件数量已达到上限。",
|
||||
"The maximum permitted number of widgets have already been added to this room.": "此聊天室可拥有的小挂件数量已达到上限。",
|
||||
"The phone number entered looks invalid": "输入的手机号码看起来无效",
|
||||
"The remote side failed to pick up": "对方未能接听",
|
||||
"This Home Server does not support login using email address.": "HS不支持使用邮箱地址登陆。",
|
||||
|
@ -619,9 +619,9 @@
|
|||
"Your unverified device '%(displayName)s' is requesting encryption keys.": "你的未经验证的设备 '%(displayName)s' 正在请求加密密钥。",
|
||||
"Encryption key request": "加密密钥请求",
|
||||
"Autocomplete Delay (ms):": "自动补全延迟(毫秒):",
|
||||
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 添加",
|
||||
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 移除",
|
||||
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 修改",
|
||||
"%(widgetName)s widget added by %(senderName)s": "%(senderName)s 添加了 %(widgetName)s 小挂件",
|
||||
"%(widgetName)s widget removed by %(senderName)s": "%(senderName)s 移除了 %(widgetName)s 小挂件",
|
||||
"%(widgetName)s widget modified by %(senderName)s": "%(senderName)s 修改了 %(widgetName)s 小挂件",
|
||||
"Unpin Message": "取消置顶消息",
|
||||
"Add rooms to this community": "添加聊天室到此社区",
|
||||
"Call Failed": "呼叫失败",
|
||||
|
@ -680,7 +680,7 @@
|
|||
"A text message has been sent to %(msisdn)s": "一封短信已发送到 %(msisdn)s",
|
||||
"Username on %(hs)s": "在 %(hs)s 上的用户名",
|
||||
"Visible to everyone": "对所有人可见",
|
||||
"Delete Widget": "删除小组件",
|
||||
"Delete Widget": "删除小挂件",
|
||||
"were invited %(count)s times|other": "被邀请 %(count)s 次",
|
||||
"were invited %(count)s times|one": "被邀请",
|
||||
"was invited %(count)s times|other": "被邀请 %(count)s 次",
|
||||
|
@ -755,14 +755,14 @@
|
|||
"Community Invites": "社区邀请",
|
||||
"You are trying to access a room.": "你正在尝试访问一个聊天室。",
|
||||
"To change the topic, you must be a": "要修改主题,你必须是",
|
||||
"To modify widgets in the room, you must be a": "要修改聊天室中的小组件,你必须是",
|
||||
"To modify widgets in the room, you must be a": "要修改聊天室中的小挂件,你必须是",
|
||||
"Banned by %(displayName)s": "被 %(displayName)s 封禁",
|
||||
"To send messages, you must be a": "要发送消息,你必须是",
|
||||
"To invite users into the room, you must be a": "要邀请用户到聊天室,你必须是",
|
||||
"To configure the room, you must be a": "要配置聊天室,你必须是",
|
||||
"To kick users, you must be a": "要踢出用户,你必须是",
|
||||
"To ban users, you must be a": "要封禁用户,你必须是",
|
||||
"To remove other users' messages, you must be a": "要删除其他用户的消息,你必须是",
|
||||
"To send messages, you must be a": "若要发送消息,您至少要是",
|
||||
"To invite users into the room, you must be a": "若要邀请用户至本聊天室,您至少要是",
|
||||
"To configure the room, you must be a": "若要修改聊天室设置,您至少要是",
|
||||
"To kick users, you must be a": "若要移除用户,您至少要是",
|
||||
"To ban users, you must be a": "若要封禁用户,您至少要是",
|
||||
"To remove other users' messages, you must be a": "若要删除其他用户的消息,您至少要是",
|
||||
"%(user)s is a %(userRole)s": "%(user)s 是一个 %(userRole)s",
|
||||
"To link to a room it must have <a>an address</a>.": "要链接一个聊天室,它必须有一个<a>地址</a>。",
|
||||
"To send events of type <eventType/>, you must be a": "要发送类型为 <eventType/> 的事件,你必须是",
|
||||
|
@ -774,7 +774,7 @@
|
|||
"Community Name": "社区名",
|
||||
"Community ID": "社区 ID",
|
||||
"example": "例子",
|
||||
"This setting cannot be changed later!": "此设置在未来将无法修改!",
|
||||
"This setting cannot be changed later!": "未来此设置将无法修改!",
|
||||
"Add a Room": "添加一个聊天室",
|
||||
"Add a User": "添加一个用户",
|
||||
"Unable to accept invite": "无法接受邀请",
|
||||
|
@ -826,7 +826,7 @@
|
|||
"Drop here to tag direct chat": "拖动到这里以加入私聊",
|
||||
"Drop here to restore": "拖动到这里以还原",
|
||||
"Drop here to demote": "拖动到这里以加入低优先级",
|
||||
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "无法确定此邀请发送给的邮件地址是否和与您的帐户相关的邮件地址相匹配。",
|
||||
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "无法确定此邀请发送给的邮件地址是否与您帐户所关联的邮件地址相匹配。",
|
||||
"You have been kicked from this room by %(userName)s.": "您已被 %(userName)s 从此聊天室中移除。",
|
||||
"'%(groupId)s' is not a valid community ID": "“%(groupId)s” 不是有效的社区 ID",
|
||||
"Flair": "Flair",
|
||||
|
@ -917,8 +917,8 @@
|
|||
"Featured Users:": "核心用户:",
|
||||
"Join this community": "加入此社区",
|
||||
"%(inviter)s has invited you to join this community": "%(inviter)s 邀请您加入此社区",
|
||||
"Failed to add the following users to the summary of %(groupId)s:": "",
|
||||
"Failed to remove a user from the summary of %(groupId)s": "",
|
||||
"Failed to add the following users to the summary of %(groupId)s:": "将下列用户添加到 %(groupId)s 的简介中时失败",
|
||||
"Failed to remove a user from the summary of %(groupId)s": "从 %(groupId)s 的简介中移除用户时失败",
|
||||
"You are an administrator of this community": "你是此社区的管理员",
|
||||
"You are a member of this community": "你是此社区的成员",
|
||||
"Who can join this community?": "谁可以加入此社区?",
|
||||
|
@ -960,7 +960,7 @@
|
|||
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "現在 <resendText>重新发送消息</resendText> 或 <cancelText>取消发送</cancelText> 。你也可以单独选择消息以重新发送或取消。",
|
||||
"Visibility in Room List": "是否在聊天室目录中可见",
|
||||
"Something went wrong when trying to get your communities.": "获取你加入的社区时发生错误。",
|
||||
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小部件时将为聊天室中的所有成员删除。您确定要删除此小部件吗?",
|
||||
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小挂件时将为聊天室中的所有成员删除。您确定要删除此小挂件吗?",
|
||||
"Fetching third party location failed": "获取第三方位置失败",
|
||||
"A new version of Riot is available.": "Riot 有更新可用。",
|
||||
"Couldn't load home page": "不能加载首页",
|
||||
|
@ -974,7 +974,7 @@
|
|||
"You are not receiving desktop notifications": "您将不会收到桌面通知",
|
||||
"Friday": "星期五",
|
||||
"Update": "更新",
|
||||
"What's New": "新鲜事",
|
||||
"What's New": "更新内容",
|
||||
"Add an email address above to configure email notifications": "请在上方输入邮箱地址以接收邮件通知",
|
||||
"Expand panel": "展开面板",
|
||||
"On": "打开",
|
||||
|
@ -1065,7 +1065,7 @@
|
|||
"Downloading update...": "正在下载更新…",
|
||||
"State Key": "状态密钥",
|
||||
"Failed to send custom event.": "自定义事件发送失败。",
|
||||
"What's new?": "有什么新闻?",
|
||||
"What's new?": "更新了什么?",
|
||||
"Notify me for anything else": "通知所有消息",
|
||||
"When I'm invited to a room": "当我被邀请进入聊天室",
|
||||
"Can't update user notification settings": "不能更新用户通知设置",
|
||||
|
@ -1130,7 +1130,7 @@
|
|||
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "目前机器人检查(CAPTCHA)在桌面端不可用——请使用 <a>浏览器</a>",
|
||||
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "无法更新聊天室 %(roomName)s 在社区 “%(groupId)s” 中的可见性。",
|
||||
"Minimize apps": "最小化小部件",
|
||||
"Popout widget": "在弹出式窗口中打开小部件",
|
||||
"Popout widget": "在弹出式窗口中打开小挂件",
|
||||
"Picture": "图片",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "无法加载被回复的事件,它可能不存在,也可能是您没有权限查看它。",
|
||||
"And %(count)s more...|other": "和 %(count)s 个其他…",
|
||||
|
@ -1141,9 +1141,90 @@
|
|||
"A call is already in progress!": "您已在通话中!",
|
||||
"Jitsi Conference Calling": "Jitsi 电话会议",
|
||||
"Send analytics data": "发送统计数据",
|
||||
"Enable widget screenshots on supported widgets": "对支持的小部件启用小部件截图",
|
||||
"Enable widget screenshots on supported widgets": "对支持的小挂件启用小挂件截图",
|
||||
"Encrypting": "正在加密",
|
||||
"Encrypted, not sent": "已加密,未发送",
|
||||
"Demote yourself?": "是否降低您自己的权限?",
|
||||
"Demote": "降权"
|
||||
"Demote": "降权",
|
||||
"A conference call could not be started because the intgrations server is not available": "关联的会议服务器不可用,无法发起电话会议",
|
||||
"A call is currently being placed!": "已发起一次通话!",
|
||||
"Permission Required": "需要权限",
|
||||
"You do not have permission to start a conference call in this room": "您没有在此聊天室发起通话会议的权限",
|
||||
"Show empty room list headings": "为空的聊天室列表显示 heading",
|
||||
"This event could not be displayed": "无法显示此事件",
|
||||
"Share Link to User": "分享链接给其他用户",
|
||||
"deleted": "删除线",
|
||||
"underlined": "下划线",
|
||||
"inline-code": "代码",
|
||||
"block-quote": "引用",
|
||||
"bulleted-list": "无序列表",
|
||||
"numbered-list": "有序列表",
|
||||
"Share room": "分享聊天室",
|
||||
"You have no historical rooms": "没有历史聊天室",
|
||||
"System Alerts": "系统警告",
|
||||
"To notify everyone in the room, you must be a": "若要通知所有聊天室成员,您至少要是",
|
||||
"Muted Users": "被禁言的用户",
|
||||
"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.": "在启用加密的聊天室中,比如此聊天室,链接预览被默认禁用以确保主服务器(访问链接、生成预览的地方)无法获知聊天室中的链接及其信息。",
|
||||
"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.": "当有人发送一条带有链接的消息后,可显示链接的预览,链接预览可包含此链接的网页标题、描述以及图片。",
|
||||
"The email field must not be blank.": "必须输入电子邮箱。",
|
||||
"The user name field must not be blank.": "必须输入用户名。",
|
||||
"The phone number field must not be blank.": "必须输入手机号码。",
|
||||
"The password field must not be blank.": "必须输入密码。",
|
||||
"Display your community flair in rooms configured to show it.": "在启用“显示 Flair”的聊天室中显示本社区的 Flair。",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "请发送 <UsageDataLink>匿名使用数据</UsageDataLink> 以帮助我们改进 Riot.im。这将用到 Cookie(请看看我们的 <PolicyLink>Cookie 隐私政策</PolicyLink>)。",
|
||||
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "请发送 <UsageDataLink>匿名使用数据</UsageDataLink> 以帮助我们改进 Riot.im。这将用到 Cookie。",
|
||||
"Yes, I want to help!": "好啊,我要帮助你们!",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "此主服务器已达到其每月活跃用户数量限制。若要继续使用此服务,请 <a>联系您的服务提供者</a> 。",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "此主服务器已达到其每月活跃用户数量限制,所以,一些用户将无法登录。若要提高此数量限制,请 <a>联系您的服务提供者</a> 。",
|
||||
"Warning: This widget might use cookies.": "警告:此小挂件可能会使用 cookies。",
|
||||
"Failed to remove widget": "移除小挂件失败",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "尝试从聊天室中移除小部件时发生了一个错误",
|
||||
"Reload widget": "刷新小挂件",
|
||||
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "您确定要移除(删除)此事件吗?注意,如果删除了聊天室名称或话题的变化,就会撤销此更改。",
|
||||
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "这将使您的账户永远不再可用。您将不能登录,或使用相同的用户 ID 重新注册。您的账户将退出所有已加入的聊天室,身份服务器上的账户信息也会被删除。<b>此操作是不可逆的。</b>",
|
||||
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "停用您的账户<b>不会默认忘记您发送的消息</b>。如果您希望我们忘记您发送的消息,请勾选下面的选择框。",
|
||||
"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.": "Matrix 中的信息可见性类似于电子邮件。我们忘记您的消息意味着您发送的消息将不会被发至新注册或未注册的用户,但是已收到您的消息的注册用户依旧可以看到他们的副本。",
|
||||
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "请在我停用账户的同时忘记我发送的所有消息(<b>警告</b>:这将导致未来的用户看到残缺的对话)",
|
||||
"To continue, please enter your password:": "请输入您的密码以继续:",
|
||||
"password": "密码",
|
||||
"Log out and remove encryption keys?": "是否退出登录并清除加密密钥?",
|
||||
"Clear Storage and Sign Out": "清除数据并退出登录",
|
||||
"Send Logs": "发送日志",
|
||||
"Refresh": "刷新",
|
||||
"Unable to join community": "无法加入社区",
|
||||
"The user '%(displayName)s' could not be removed from the summary.": "无法将用户“%(displayName)s”从简介中移除。",
|
||||
"Who would you like to add to this summary?": "您想将谁添加到简介中?",
|
||||
"Add users to the community summary": "添加用户至社区简介",
|
||||
"Collapse Reply Thread": "收起回复",
|
||||
"Share Message": "分享消息",
|
||||
"COPY": "复制",
|
||||
"Share Room Message": "分享聊天室消息",
|
||||
"Share Community": "分享社区",
|
||||
"Share User": "分享用户",
|
||||
"Share Room": "分享聊天室",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "清除本页储存在您浏览器上的数据或许能修复此问题,但也会导致您退出登录并无法读取任何已加密的聊天记录。",
|
||||
"We encountered an error trying to restore your previous session.": "我们在尝试恢复您先前的会话时遇到了错误。",
|
||||
"Link to most recent message": "最新消息的链接",
|
||||
"Link to selected message": "选中消息的链接",
|
||||
"Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "至多半个小时内,其他用户可能看不到您社区的 <bold1>名称</bold1> 与 <bold2>头像</bold2> 的变化。",
|
||||
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "这些聊天室对社区成员可见。社区成员可通过点击来加入它们。",
|
||||
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "您的社区还没有详细介绍,一个展示给社区成员的 HTML 页面。<br>点击这里即可打开设置添加详细介绍!",
|
||||
"Failed to load %(groupId)s": "%(groupId)s 加载失败",
|
||||
"This room is not public. You will not be able to rejoin without an invite.": "此聊天室不是公开的。没有邀请的话,您将无法重新加入。",
|
||||
"Can't leave Server Notices room": "无法退出服务器公告聊天室",
|
||||
"This room is used for important messages from the Homeserver, so you cannot leave it.": "此聊天室是用于发布来自主服务器的重要讯息的,所以您不能退出它。",
|
||||
"Terms and Conditions": "条款与要求",
|
||||
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "若要继续使用主服务器 %(homeserverDomain)s,您必须浏览并同意我们的条款与要求。",
|
||||
"Review terms and conditions": "浏览条款与要求",
|
||||
"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.": "若要设置社区过滤器,请将社区头像拖到屏幕最左侧的社区过滤器面板上。单击社区过滤器面板中的社区头像即可过滤出与该社区相关联的房间和人员。",
|
||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "在您查看并同意 <consentLink>我们的条款与要求</consentLink> 之前,您不能发送任何消息。",
|
||||
"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.": "您的消息未被发出,因为此主服务器已达到其每月活跃用户数量上限。请联系您的服务提供者以继续使用此服务。",
|
||||
"Clear filter": "清除过滤器",
|
||||
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "尝试加载此聊天室时间轴上的某处,但您没有查看相关消息的权限。",
|
||||
"No Audio Outputs detected": "未检测到可用的音频输出方式",
|
||||
"Audio Output": "音频输出",
|
||||
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "已向 %(emailAddress)s 发送了一封电子邮件。点开邮件中的链接后,请点击下面。",
|
||||
"This homeserver has hit its Monthly Active User limit": "此主服务器已达到其每月活跃用户数量上限",
|
||||
"Please contact your service administrator to continue using this service.": "请联系您的服务提供者以继续使用此服务。",
|
||||
"Try the app first": "先试试 Riot.im 应用吧"
|
||||
}
|
||||
|
|
|
@ -1222,5 +1222,53 @@
|
|||
"numbered-list": "編號清單",
|
||||
"A call is currently being placed!": "目前正在撥打電話!",
|
||||
"Failed to remove widget": "移除小工具失敗",
|
||||
"An error ocurred whilst trying to remove the widget from the room": "嘗試從聊天室移除小工具時發生錯誤"
|
||||
"An error ocurred whilst trying to remove the widget from the room": "嘗試從聊天室移除小工具時發生錯誤",
|
||||
"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.": "您的訊息因為這個家伺服器到達了它的每月活躍使用者限制而沒有傳送出去。請聯絡您的服務管理員以繼續使用服務。",
|
||||
"This homeserver has hit its Monthly Active User limit": "此家伺服器達到了其每月活躍使用者限制",
|
||||
"Please contact your service administrator to continue using this service.": "請聯絡您的服務管理員以繼續使用此服務。",
|
||||
"This homeserver has hit its Monthly Active User limit. Please contact your service administrator to continue using the service.": "您的訊息因為這個家伺服器到達了它的每月活躍使用者限制而沒有傳送出去。請聯絡您的服務管理員以繼續使用服務。",
|
||||
"System Alerts": "系統警告",
|
||||
"Internal room ID: ": "內部聊天室 ID: ",
|
||||
"Room version number: ": "聊天室版本號: ",
|
||||
"This homeserver has hit its Monthly Active User limit. Please <a>contact your service administrator</a> to continue using the service.": "這個家伺服器已經達到了其每月活躍使用者限制。請<a>聯絡您的服務管理員</a>以繼續使用服務。",
|
||||
"This homeserver has hit its Monthly Active User limit so some users will not be able to log in. Please <a>contact your service administrator</a> to get this limit increased.": "此家伺服器已達到其每月活躍使用者限制,所以其部份使用者將會無法登入。請<a>聯絡您的服務管理員</a>以讓此限制增加。",
|
||||
"There is a known vulnerability affecting this room.": "有一個已知的安全性漏洞影響此聊天室。",
|
||||
"This room version is vulnerable to malicious modification of room state.": "此聊天室版本易受惡意修改聊天室狀態的影響。",
|
||||
"Click here to upgrade to the latest room version and ensure room integrity is protected.": "點選這裡以升級到最新的聊天室版本並確保聊天室的完整性已被保護。",
|
||||
"Only room administrators will see this warning": "僅聊天室管理員會看到此警告",
|
||||
"Please <a>contact your service administrator</a> to continue using the service.": "請<a>聯絡您的服務管理員</a>以繼續使用服務。",
|
||||
"This homeserver has hit its Monthly Active User limit.": "這個家伺服器已經到達其每月活躍使用者限制。",
|
||||
"This homeserver has exceeded one of its resource limits.": "此家伺服器已經超過其中一項資源限制。",
|
||||
"Please <a>contact your service administrator</a> to get this limit increased.": "請<a>聯絡您的服務管理員</a>以讓此限制增加。",
|
||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "此家伺服器已經達到其每月活躍使用者限制所以<b>某些使用者將會無法登入</b>。",
|
||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "此家伺服器已超過其中一項資源限制所以<b>某些使用者可能會無法登入</b>。",
|
||||
"Upgrade Room Version": "更新聊天室版本",
|
||||
"Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "更新此聊天室需要關閉目前的聊天室實體並建立一個新的聊天室。為了給予聊天室成員最佳的體驗,我們將會:",
|
||||
"Create a new room with the same name, description and avatar": "使用同樣的名稱、描述與大頭貼建立新聊天室",
|
||||
"Update any local room aliases to point to the new room": "更新任何本地聊天室別名以指向新的聊天室",
|
||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "讓使用者在舊版聊天室停止發言,並張貼訊息建議使用者移動到新的聊天室",
|
||||
"Put a link back to the old room at the start of the new room so people can see old messages": "在新聊天室的開始處放置連回舊聊天室的連結,這樣夥伴們就可以看到舊的訊息",
|
||||
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "您的訊息未被傳送,因為其家伺服器已經達到了其每月活躍使用者限制。請<a>聯絡您的服務管理員</a>以繼續使用服務。",
|
||||
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "您的訊息未傳送,因為其家伺服器已超過一項資源限制。請<a>聯絡您的服務管理員</a>以繼序使用服務。",
|
||||
"Please <a>contact your service administrator</a> to continue using this service.": "請<a>聯絡您的服務管理員</a>以繼續使用此服務。",
|
||||
"Increase performance by only loading room members on first view": "透過僅在第一次檢視時載入聊天室成員來增加效能",
|
||||
"Lazy loading members not supported": "不支援延遲載入成員",
|
||||
"Lazy loading is not supported by your current homeserver.": "您目前的家伺服器不支援延遲載入。",
|
||||
"Sorry, your homeserver is too old to participate in this room.": "抱歉,您的家伺服器太舊了,所以無法參與此聊天室。",
|
||||
"Please contact your homeserver administrator.": "請聯絡您的家伺服器的管理員。",
|
||||
"Legal": "法律",
|
||||
"This room has been replaced and is no longer active.": "此已被取代的聊天室已不再活躍。",
|
||||
"The conversation continues here.": "對話在此繼續。",
|
||||
"Upgrade room to version %(ver)s": "將聊天室升級為版本 %(ver)s",
|
||||
"This room is a continuation of another conversation.": "此聊天室是另一個對話的延續。",
|
||||
"Click here to see older messages.": "點選這裡以檢視較舊的訊息。",
|
||||
"Failed to upgrade room": "升級聊天室失敗",
|
||||
"The room upgrade could not be completed": "聊天室升級可能不完整",
|
||||
"Upgrade this room to version %(version)s": "升級此聊天室到版本 %(version)s",
|
||||
"Forces the current outbound group session in an encrypted room to be discarded": "強制目前在已加密的聊天室中的外發群組工作階段丟棄",
|
||||
"Error Discarding Session": "丟棄工作階段錯誤",
|
||||
"Registration Required": "需要註冊",
|
||||
"You need to register to do this. Would you like to register now?": "您必須註冊以繼續。您想要現在註冊嗎?",
|
||||
"Unable to query for supported registration methods": "無法查詢支援的註冊方式",
|
||||
"Unable to connect to Homeserver. Retrying...": "無法連線到家伺服器。正在重試……"
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ import {
|
|||
NotificationBodyEnabledController,
|
||||
NotificationsEnabledController,
|
||||
} from "./controllers/NotificationControllers";
|
||||
|
||||
import LazyLoadingController from "./controllers/LazyLoadingController";
|
||||
|
||||
// These are just a bunch of helper arrays to avoid copy/pasting a bunch of times
|
||||
const LEVELS_ROOM_SETTINGS = ['device', 'room-device', 'room-account', 'account', 'config'];
|
||||
|
@ -83,6 +83,13 @@ export const SETTINGS = {
|
|||
supportedLevels: LEVELS_FEATURE,
|
||||
default: false,
|
||||
},
|
||||
"feature_lazyloading": {
|
||||
isFeature: true,
|
||||
displayName: _td("Increase performance by only loading room members on first view"),
|
||||
supportedLevels: LEVELS_FEATURE,
|
||||
controller: new LazyLoadingController(),
|
||||
default: false,
|
||||
},
|
||||
"MessageComposerInput.dontSuggestEmoji": {
|
||||
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
|
||||
displayName: _td('Disable Emoji suggestions while typing'),
|
||||
|
|
|
@ -248,7 +248,7 @@ export default class SettingsStore {
|
|||
if (actualValue !== undefined && actualValue !== null) return actualValue;
|
||||
return calculatedValue;
|
||||
}
|
||||
|
||||
/* eslint-disable valid-jsdoc */ //https://github.com/eslint/eslint/issues/7307
|
||||
/**
|
||||
* Sets the value for a setting. The room ID is optional if the setting is not being
|
||||
* set for a particular room, otherwise it should be supplied. The value may be null
|
||||
|
@ -260,7 +260,8 @@ export default class SettingsStore {
|
|||
* @param {*} value The new value of the setting, may be null.
|
||||
* @return {Promise} Resolves when the setting has been changed.
|
||||
*/
|
||||
static setValue(settingName, roomId, level, value) {
|
||||
/* eslint-enable valid-jsdoc */
|
||||
static async setValue(settingName, roomId, level, value) {
|
||||
// Verify that the setting is actually a setting
|
||||
if (!SETTINGS[settingName]) {
|
||||
throw new Error("Setting '" + settingName + "' does not appear to be a setting.");
|
||||
|
@ -275,11 +276,12 @@ export default class SettingsStore {
|
|||
throw new Error("User cannot set " + settingName + " at " + level + " in " + roomId);
|
||||
}
|
||||
|
||||
return handler.setValue(settingName, roomId, value).then(() => {
|
||||
const controller = SETTINGS[settingName].controller;
|
||||
if (!controller) return;
|
||||
await handler.setValue(settingName, roomId, value);
|
||||
|
||||
const controller = SETTINGS[settingName].controller;
|
||||
if (controller) {
|
||||
controller.onChange(level, roomId, value);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
Copyright 2018 New Vector
|
||||
|
||||
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 SettingController from "./SettingController";
|
||||
import MatrixClientPeg from "../../MatrixClientPeg";
|
||||
import PlatformPeg from "../../PlatformPeg";
|
||||
|
||||
export default class LazyLoadingController extends SettingController {
|
||||
async onChange(level, roomId, newValue) {
|
||||
if (!PlatformPeg.get()) return;
|
||||
|
||||
MatrixClientPeg.get().stopClient();
|
||||
await MatrixClientPeg.get().store.deleteAllData();
|
||||
PlatformPeg.get().reload();
|
||||
}
|
||||
}
|
|
@ -17,7 +17,6 @@ limitations under the License.
|
|||
import EventEmitter from 'events';
|
||||
|
||||
import MatrixClientPeg from '../MatrixClientPeg';
|
||||
import sdk from '../index';
|
||||
|
||||
/**
|
||||
* Stores information about the widgets active in the app right now:
|
||||
|
@ -75,8 +74,6 @@ class ActiveWidgetStore extends EventEmitter {
|
|||
destroyPersistentWidget() {
|
||||
const toDeleteId = this._persistentWidgetId;
|
||||
|
||||
const PersistedElement = sdk.getComponent("elements.PersistedElement");
|
||||
PersistedElement.destroyElement('widget_' + toDeleteId);
|
||||
this.setWidgetPersistence(toDeleteId, false);
|
||||
this.delWidgetMessaging(toDeleteId);
|
||||
this.delWidgetCapabilities(toDeleteId);
|
||||
|
|
|
@ -45,6 +45,7 @@ class RoomListStore extends Store {
|
|||
// Initialise state
|
||||
this._state = {
|
||||
lists: {
|
||||
"m.server_notice": [],
|
||||
"im.vector.fake.invite": [],
|
||||
"m.favourite": [],
|
||||
"im.vector.fake.recent": [],
|
||||
|
@ -119,8 +120,7 @@ class RoomListStore extends Store {
|
|||
this._generateRoomLists();
|
||||
}
|
||||
break;
|
||||
case 'MatrixActions.RoomMember.membership': {
|
||||
if (!this._matrixClient || payload.member.userId !== this._matrixClient.credentials.userId) break;
|
||||
case 'MatrixActions.Room.myMembership': {
|
||||
this._generateRoomLists();
|
||||
}
|
||||
break;
|
||||
|
@ -158,6 +158,7 @@ class RoomListStore extends Store {
|
|||
|
||||
_generateRoomLists(optimisticRequest) {
|
||||
const lists = {
|
||||
"m.server_notice": [],
|
||||
"im.vector.fake.invite": [],
|
||||
"m.favourite": [],
|
||||
"im.vector.fake.recent": [],
|
||||
|
@ -173,13 +174,13 @@ class RoomListStore extends Store {
|
|||
if (!this._matrixClient) return;
|
||||
|
||||
this._matrixClient.getRooms().forEach((room, index) => {
|
||||
const me = room.getMember(this._matrixClient.credentials.userId);
|
||||
if (!me) return;
|
||||
const myUserId = this._matrixClient.getUserId();
|
||||
const membership = room.getMyMembership();
|
||||
const me = room.getMember(myUserId);
|
||||
|
||||
if (me.membership == "invite") {
|
||||
if (membership == "invite") {
|
||||
lists["im.vector.fake.invite"].push(room);
|
||||
} else if (me.membership == "join" || me.membership === "ban" ||
|
||||
(me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) {
|
||||
} else if (membership == "join" || membership === "ban" || (me && me.isKicked())) {
|
||||
// Used to split rooms via tags
|
||||
let tagNames = Object.keys(room.tags);
|
||||
|
||||
|
@ -194,6 +195,11 @@ class RoomListStore extends Store {
|
|||
}
|
||||
}
|
||||
|
||||
// ignore any m. tag names we don't know about
|
||||
tagNames = tagNames.filter((t) => {
|
||||
return !t.startsWith('m.') || lists[t] !== undefined;
|
||||
});
|
||||
|
||||
if (tagNames.length) {
|
||||
for (let i = 0; i < tagNames.length; i++) {
|
||||
const tagName = tagNames[i];
|
||||
|
@ -206,10 +212,8 @@ class RoomListStore extends Store {
|
|||
} else {
|
||||
lists["im.vector.fake.recent"].push(room);
|
||||
}
|
||||
} else if (me.membership === "leave") {
|
||||
} else if (membership === "leave") {
|
||||
lists["im.vector.fake.archived"].push(room);
|
||||
} else {
|
||||
console.error("unrecognised membership: " + me.membership + " - this should never happen");
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -277,8 +281,8 @@ class RoomListStore extends Store {
|
|||
if (optimisticRequest && roomB === optimisticRequest.room) metaB = optimisticRequest.metaData;
|
||||
|
||||
// Make sure the room tag has an order element, if not set it to be the bottom
|
||||
const a = metaA.order;
|
||||
const b = metaB.order;
|
||||
const a = metaA ? metaA.order : undefined;
|
||||
const b = metaB ? metaB.order : undefined;
|
||||
|
||||
// Order undefined room tag orders to the bottom
|
||||
if (a === undefined && b !== undefined) {
|
||||
|
|
|
@ -223,7 +223,13 @@ class RoomViewStore extends Store {
|
|||
action: 'join_room_error',
|
||||
err: err,
|
||||
});
|
||||
const msg = err.message ? err.message : JSON.stringify(err);
|
||||
let msg = err.message ? err.message : JSON.stringify(err);
|
||||
if (err.errcode === 'M_INCOMPATIBLE_ROOM_VERSION') {
|
||||
msg = <div>
|
||||
{_t("Sorry, your homeserver is too old to participate in this room.")}<br />
|
||||
{_t("Please contact your homeserver administrator.")}
|
||||
</div>;
|
||||
}
|
||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||
Modal.createTrackedDialog('Failed to join room', '', ErrorDialog, {
|
||||
title: _t("Failed to join room"),
|
||||
|
|
|
@ -15,6 +15,7 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import MatrixClientPeg from '../MatrixClientPeg';
|
||||
import _uniq from 'lodash/uniq';
|
||||
|
||||
/**
|
||||
* Class that takes a Matrix Client and flips the m.direct map
|
||||
|
@ -27,6 +28,8 @@ export default class DMRoomMap {
|
|||
constructor(matrixClient) {
|
||||
this.matrixClient = matrixClient;
|
||||
this.roomToUser = null;
|
||||
// see _onAccountData
|
||||
this._hasSentOutPatchDirectAccountDataPatch = false;
|
||||
|
||||
// XXX: Force-bind the event handler method because it
|
||||
// doesn't call it with our object as the 'this'
|
||||
|
@ -34,11 +37,8 @@ export default class DMRoomMap {
|
|||
this._onAccountData = this._onAccountData.bind(this);
|
||||
|
||||
const mDirectEvent = matrixClient.getAccountData('m.direct');
|
||||
if (!mDirectEvent) {
|
||||
this.userToRooms = {};
|
||||
} else {
|
||||
this.userToRooms = mDirectEvent.getContent();
|
||||
}
|
||||
this.mDirectEvent = mDirectEvent ? mDirectEvent.getContent() : {};
|
||||
this.userToRooms = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -70,15 +70,56 @@ export default class DMRoomMap {
|
|||
|
||||
_onAccountData(ev) {
|
||||
if (ev.getType() == 'm.direct') {
|
||||
this.userToRooms = this.matrixClient.getAccountData('m.direct').getContent();
|
||||
this._populateRoomToUser();
|
||||
this.mDirectEvent = this.matrixClient.getAccountData('m.direct').getContent() || {};
|
||||
this.userToRooms = null;
|
||||
this.roomToUser = null;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* some client bug somewhere is causing some DMs to be marked
|
||||
* with ourself, not the other user. Fix it by guessing the other user and
|
||||
* modifying userToRooms
|
||||
*/
|
||||
_patchUpSelfDMs(userToRooms) {
|
||||
const myUserId = this.matrixClient.getUserId();
|
||||
const selfRoomIds = userToRooms[myUserId];
|
||||
if (selfRoomIds) {
|
||||
// any self-chats that should not be self-chats?
|
||||
const guessedUserIdsThatChanged = selfRoomIds.map((roomId) => {
|
||||
const room = this.matrixClient.getRoom(roomId);
|
||||
if (room) {
|
||||
const userId = room.guessDMUserId();
|
||||
if (userId && userId !== myUserId) {
|
||||
return {userId, roomId};
|
||||
}
|
||||
}
|
||||
}).filter((ids) => !!ids); //filter out
|
||||
// these are actually all legit self-chats
|
||||
// bail out
|
||||
if (!guessedUserIdsThatChanged.length) {
|
||||
return false;
|
||||
}
|
||||
userToRooms[myUserId] = selfRoomIds.filter((roomId) => {
|
||||
return !guessedUserIdsThatChanged
|
||||
.some((ids) => ids.roomId === roomId);
|
||||
});
|
||||
guessedUserIdsThatChanged.forEach(({userId, roomId}) => {
|
||||
let roomIds = userToRooms[userId];
|
||||
if (!roomIds) {
|
||||
userToRooms[userId] = [roomId];
|
||||
} else {
|
||||
roomIds.push(roomId);
|
||||
userToRooms[userId] = _uniq(roomIds);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
getDMRoomsForUserId(userId) {
|
||||
// Here, we return the empty list if there are no rooms,
|
||||
// since the number of conversations you have with this user is zero.
|
||||
return this.userToRooms[userId] || [];
|
||||
return this._getUserToRooms()[userId] || [];
|
||||
}
|
||||
|
||||
getUserIdForRoomId(roomId) {
|
||||
|
@ -97,22 +138,37 @@ export default class DMRoomMap {
|
|||
// no entry? if the room is an invite, look for the is_direct hint.
|
||||
const room = this.matrixClient.getRoom(roomId);
|
||||
if (room) {
|
||||
const me = room.getMember(this.matrixClient.credentials.userId);
|
||||
if (me.membership == 'invite') {
|
||||
// The 'direct' hihnt is there, so declare that this is a DM room for
|
||||
// whoever invited us.
|
||||
if (me.events.member.getContent().is_direct) {
|
||||
return me.events.member.getSender();
|
||||
}
|
||||
}
|
||||
return room.getDMInviter();
|
||||
}
|
||||
}
|
||||
return this.roomToUser[roomId];
|
||||
}
|
||||
|
||||
_getUserToRooms() {
|
||||
if (!this.userToRooms) {
|
||||
const userToRooms = this.mDirectEvent;
|
||||
const myUserId = this.matrixClient.getUserId();
|
||||
const selfDMs = userToRooms[myUserId];
|
||||
if (selfDMs && selfDMs.length) {
|
||||
const neededPatching = this._patchUpSelfDMs(userToRooms);
|
||||
// to avoid multiple devices fighting to correct
|
||||
// the account data, only try to send the corrected
|
||||
// version once.
|
||||
console.warn(`Invalid m.direct account data detected ` +
|
||||
`(self-chats that shouldn't be), patching it up.`);
|
||||
if (neededPatching && !this._hasSentOutPatchDirectAccountDataPatch) {
|
||||
this._hasSentOutPatchDirectAccountDataPatch = true;
|
||||
this.matrixClient.setAccountData('m.direct', userToRooms);
|
||||
}
|
||||
}
|
||||
this.userToRooms = userToRooms;
|
||||
}
|
||||
return this.userToRooms;
|
||||
}
|
||||
|
||||
_populateRoomToUser() {
|
||||
this.roomToUser = {};
|
||||
for (const user of Object.keys(this.userToRooms)) {
|
||||
for (const user of Object.keys(this._getUserToRooms())) {
|
||||
for (const roomId of this.userToRooms[user]) {
|
||||
this.roomToUser[roomId] = user;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
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 { _t, _td } from '../languageHandler';
|
||||
|
||||
/**
|
||||
* Produce a translated error message for a
|
||||
* M_RESOURCE_LIMIT_EXCEEDED error
|
||||
*
|
||||
* @param {string} limitType The limit_type from the error
|
||||
* @param {string} adminContact The admin_contact from the error
|
||||
* @param {Object} strings Translateable string for different
|
||||
* limit_type. Must include at least the empty string key
|
||||
* which is the default. Strings may include an 'a' tag
|
||||
* for the admin contact link.
|
||||
* @param {Object} extraTranslations Extra translation substitution functions
|
||||
* for any tags in the strings apart from 'a'
|
||||
* @returns {*} Translated string or react component
|
||||
*/
|
||||
export function messageForResourceLimitError(limitType, adminContact, strings, extraTranslations) {
|
||||
let errString = strings[limitType];
|
||||
if (errString === undefined) errString = strings[''];
|
||||
|
||||
const linkSub = sub => {
|
||||
if (adminContact) {
|
||||
return <a href={adminContact} target="_blank" rel="noopener">{sub}</a>;
|
||||
} else {
|
||||
return sub;
|
||||
}
|
||||
};
|
||||
|
||||
if (errString.includes('<a>')) {
|
||||
return _t(errString, {}, Object.assign({ 'a': linkSub }, extraTranslations));
|
||||
} else {
|
||||
return _t(errString, {}, extraTranslations);
|
||||
}
|
||||
}
|
||||
|
||||
export function messageForSyncError(err) {
|
||||
if (err.errcode === 'M_RESOURCE_LIMIT_EXCEEDED') {
|
||||
const limitError = messageForResourceLimitError(
|
||||
err.data.limit_type,
|
||||
err.data.admin_contact,
|
||||
{
|
||||
'monthly_active_user': _td("This homeserver has hit its Monthly Active User limit."),
|
||||
'': _td("This homeserver has exceeded one of its resource limits."),
|
||||
},
|
||||
);
|
||||
const adminContact = messageForResourceLimitError(
|
||||
err.data.limit_type,
|
||||
err.data.admin_contact,
|
||||
{
|
||||
'': _td("Please <a>contact your service administrator</a> to continue using the service."),
|
||||
},
|
||||
);
|
||||
return <div>
|
||||
<div>{limitError}</div>
|
||||
<div>{adminContact}</div>
|
||||
</div>;
|
||||
} else {
|
||||
return <div>
|
||||
{_t("Unable to connect to Homeserver. Retrying...")}
|
||||
</div>;
|
||||
}
|
||||
}
|
|
@ -77,8 +77,7 @@ export default class WidgetUtils {
|
|||
return false;
|
||||
}
|
||||
|
||||
const member = room.getMember(me);
|
||||
if (!member || member.membership !== "join") {
|
||||
if (room.getMyMembership() !== "join") {
|
||||
console.warn(`User ${me} is not in room ${roomId}`);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,11 @@ function doInputEmail(inputEmail, onTeamSelected) {
|
|||
<RegistrationForm
|
||||
teamsConfig={TEAM_CONFIG}
|
||||
onTeamSelected={onTeamSelected}
|
||||
flows={[
|
||||
{
|
||||
stages: ['m.login.dummy'],
|
||||
},
|
||||
]}
|
||||
/>,
|
||||
);
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue